/// <summary> /// 指定IDのチャンクデータを書き出し、ブロックを開始する。 /// </summary> /// <param name="id">チャンクID</param> /// <returns>何もなければ1を返す</returns> public int BlockStart(ulong id) { int cFlg; //===================================== // 最終ステートフラグのチェック //===================================== if (m_lastState == LAST_WRITE) { //--------------------------- // 前回が書き込みモードなら //--------------------------- ChunkOffset ckWrite = new ChunkOffset(); // チャンクフラグを書く this.SizeUpdate(1); cFlg = CHANK_FLG_NEST; m_RAFile.WriteByte(cFlg); // ブロックチャンクを書き込む this.SizeUpdate(ckWrite.chank.GetStructSize()); ckWrite.chank.id = Chunk.ID; ckWrite.chank.num = 0; ckWrite.chank.size = 0; ckWrite.offset = m_RAFile.Tell(); m_vChankBlockStack.Add(ckWrite); ckWrite.chank.Write(m_RAFile); } else if (m_lastState == LAST_BLOCK_START || m_lastState == LAST_END) { throw new FormatException("Write()以外呼ばないでください。"); } // ブロック内のチャンク数カウント+1 ++m_vChankBlockStack[m_vChankBlockStack.Count - 1].chank.num; // IDが変わった m_currentID = id; // ChunkOffset ckOffset = new ChunkOffset(); ckOffset.chank.id = id; ckOffset.chank.num = 0; ckOffset.chank.size = 0; // 指定IDのチャックデータを書き込む ckOffset.offset = m_RAFile.Tell(); ckOffset.chank.Write(m_RAFile); // サイズの加算 this.SizeUpdate(ckOffset.chank.GetStructSize()); // 新たにスタックにプッシュする // 層を+1する m_vChankStack.Add(ckOffset); ++m_currentDepth; // フラグ m_lastState = LAST_BLOCK_START; return(1); }