# 機能設計書 247-LoadIniSettingsFromMemory

## 概要

本ドキュメントは、Dear ImGuiライブラリにおけるLoadIniSettingsFromMemory関数の機能設計について記述する。この関数はメモリ上のINIデータからImGuiの設定を読み込むためのユーティリティ関数である。

### 本機能の処理概要

LoadIniSettingsFromMemory関数は、メモリバッファに格納されたINI形式の設定データを解析し、ImGuiの状態（ウィンドウ位置、サイズ、折りたたみ状態など）を復元する機能を提供する。カスタムデータソース（ネットワーク、データベース、暗号化ファイルなど）からの設定読み込みに使用できる。

**業務上の目的・背景**：アプリケーションによっては、設定データを独自の方式で管理したい場合がある。例えば、ユーザープロファイルの一部として設定を保存したり、クラウドストレージと同期したり、暗号化して保存したりする場合である。この関数は、任意のデータソースから読み込んだINIデータをImGuiに適用するための手段を提供する。

**機能の利用シーン**：カスタムストレージからの設定読み込み、ネットワーク経由で受信した設定の適用、暗号化された設定ファイルの復号後の読み込み、メモリ内で生成された設定の適用、テスト用の設定注入などに使用される。

**主要な処理内容**：
1. 入力データのコピーを作成（書き込み可能なバッファ）
2. 設定ハンドラのReadInitFnコールバックを呼び出し
3. INIデータを行ごとにパース
4. セクションヘッダとキー=値ペアを解析
5. 設定ハンドラのReadLineFnコールバックで各行を処理
6. 設定ハンドラのApplyAllFnコールバックで設定を適用

**関連システム・外部連携**：内部的にImGuiSettingsHandler機構を使用し、ウィンドウ設定やカスタム設定の読み込みを行う。

**権限による制御**：本機能に権限による制御は存在しない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | 全ウィンドウ | 主機能 | ウィンドウ位置・サイズの復元 |

## 機能種別

読取処理 / メモリ入力 / 設定復元 / パース処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ini_data | const char* | Yes | INI形式のデータ | NULLでないこと |
| ini_size | size_t | No (デフォルト: 0) | データサイズ（0の場合はstrlen使用） | - |

### 入力データソース

- メモリバッファ（呼び出し元が管理）
- 非NULL終端データの場合はini_sizeの指定が必要

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | void | 戻り値なし |

### 出力先

- ImGuiContext内の設定データ
- g.SettingsIniData - INIデータのコピー
- g.SettingsWindows等 - 各種設定構造体

## 処理フロー

### 処理シーケンス

```
1. サイズ確定
   └─ ini_size == 0の場合はstrlenで計算
2. バッファコピー作成
   └─ g.SettingsIniData.Buf.resize(ini_size + 1)
   └─ memcpy + NULL終端
3. 設定ハンドラの初期化
   └─ 各ハンドラのReadInitFn呼び出し
4. INIデータのパース
   └─ 行ごとにループ処理
   └─ [Section]ヘッダの検出とハンドラ選択
   └─ key=value行の処理
5. 設定の適用
   └─ 各ハンドラのApplyAllFn呼び出し
```

### フローチャート

```mermaid
flowchart TD
    A[LoadIniSettingsFromMemory呼び出し] --> B{ini_size == 0?}
    B -->|Yes| C[strlen で計算]
    B -->|No| D[指定サイズを使用]
    C --> E[バッファにコピー]
    D --> E
    E --> F[ReadInitFn呼び出し - 各ハンドラ]
    F --> G[行ごとにパース開始]
    G --> H{Section ヘッダ?}
    H -->|Yes| I[ハンドラ選択 + ReadOpenFn]
    H -->|No| J{key=value 行?}
    I --> K[次の行へ]
    J -->|Yes| L[ReadLineFn呼び出し]
    J -->|No| K
    L --> K
    K --> M{最終行?}
    M -->|No| G
    M -->|Yes| N[ApplyAllFn呼び出し - 各ハンドラ]
    N --> O[g.SettingsLoaded = true]
    O --> P[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-247-1 | 呼び出しタイミング | CreateContext()後、最初のNewFrame()前に呼び出す | 手動読み込み時 |
| BR-247-2 | データコピー | 入力データはコピーされるため、呼び出し後に解放可能 | 常時 |
| BR-247-3 | マージ動作 | ウィンドウ設定はマージ/上書きが可能 | 複数回呼び出し時 |
| BR-247-4 | Zero-tolerance | エラーがあっても無視して続行（エラー報告なし） | パースエラー時 |

### 計算ロジック

INIパース処理：
- 行頭の`[`でセクション開始を検出
- セクション名から対応するSettingsHandlerを検索
- `=`を含む行をkey=valueとして解析
- 各行をSettingsHandler.ReadLineFnに渡す

## データベース操作仕様

### 操作別データベース影響一覧

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | アサーション違反 | g.Initialized == false | CreateContext()を先に呼び出す |
| - | パースエラー | 不正なINI形式 | 無視して処理続行 |

### リトライ仕様

リトライ処理は不要。

## トランザクション仕様

本機能はトランザクション処理を行わない。

## パフォーマンス要件

- 処理時間: O(n) - データサイズに比例
- メモリ使用: データサイズと同等のバッファを確保
- 呼び出し頻度: 通常はアプリケーション起動時に1回

## セキュリティ考慮事項

- 信頼できないソースからのデータには注意が必要
- バッファオーバーフロー対策済み（サイズ指定で制御）
- 悪意のあるデータによる異常動作のリスクは低い

## 備考

- ini_size=0を指定すると非NULL終端文字列でも動作するが、サイズ指定が推奨される
- 関数内でデータをコピーするため、元のバッファは呼び出し後に解放可能
- LoadIniSettingsFromDiskは内部でこの関数を呼び出す

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

INI設定ハンドラの仕組みを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_internal.h | `imgui_internal.h` | ImGuiSettingsHandler構造体 - 設定ハンドラの定義 |
| 1-2 | imgui_internal.h | `imgui_internal.h` | ImGuiContext::SettingsHandlers - ハンドラ配列 |
| 1-3 | imgui_internal.h | `imgui_internal.h` | ImGuiContext::SettingsIniData - INIデータのコピー格納 |

**読解のコツ**: ImGuiSettingsHandlerは読み込み/書き込みのコールバック関数を持つ。TypeName（例："Window"）でINIセクションと対応付けられる。

#### Step 2: エントリーポイントを理解する

関数の実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.cpp | `imgui.cpp` | LoadIniSettingsFromMemory関数の実装（15401-15468行目） |

**主要処理フロー**:
1. **15403-15404行目**: コンテキスト取得とアサーション
2. **15410-15411行目**: ini_size==0の場合strlenで計算
3. **15412-15416行目**: バッファにデータをコピー
4. **15418-15422行目**: 各ハンドラのReadInitFn呼び出し
5. **15424-15466行目**: INIデータのパースループ
6. **15428-15432行目**: 改行スキップと行終端検出
7. **15436-15455行目**: セクションヘッダ処理
8. **15459-15463行目**: key=value行の処理

#### Step 3: 設定ハンドラの登録を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | SettingsHandlerWindow_* 関数群 - ウィンドウ設定ハンドラ |
| 3-2 | imgui.cpp | `imgui.cpp` | Initialize()内でのハンドラ登録 |

### プログラム呼び出し階層図

```
LoadIniSettingsFromMemory(ini_data, ini_size)
    │
    ├─ g.SettingsIniData.Buf.resize() - バッファ確保
    │
    ├─ memcpy() - データコピー
    │
    ├─ foreach (SettingsHandler)
    │      └─ ReadInitFn() - 初期化コールバック
    │
    ├─ INI パースループ
    │      ├─ [Section] 検出
    │      │      ├─ FindSettingsHandler()
    │      │      └─ ReadOpenFn() - セクション開始コールバック
    │      │
    │      └─ key=value 行
    │             └─ ReadLineFn() - 行処理コールバック
    │
    └─ foreach (SettingsHandler)
           └─ ApplyAllFn() - 適用コールバック
```

### データフロー図

```
[入力]                      [処理]                         [出力]

メモリバッファ              LoadIniSettingsFromMemory()    ImGuiContext
(ini_data)                       │                            │
    │                            │                            │
    └── INI形式データ ─────────▶ │                            │
                                 │ バッファコピー             │
                                 │         │                  │
                                 │         ▼                  │
                                 │ INIパース処理              │
                                 │    │                       │
                                 │    ├─ [Window]セクション   │
                                 │    └─ カスタムセクション   │
                                 │         │                  │
                                 └─────────┴─────────────────▶ SettingsWindows更新
                                                               ウィンドウ状態復元
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | 関数宣言 |
| imgui.cpp | `imgui.cpp` | ソース | LoadIniSettingsFromMemory実装 |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | ImGuiSettingsHandler定義 |
