Beispiel #1
0
        /// <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);
        }