| 129 | } |
| 130 | |
| 131 | void CGhostRecorder::FlushChunk() |
| 132 | { |
| 133 | dbg_assert((bool)m_File, "File not open"); |
| 134 | |
| 135 | int Size = m_pBufferPos - m_aBuffer; |
| 136 | if(Size == 0 || m_BufferNumItems == 0) |
| 137 | { |
| 138 | return; |
| 139 | } |
| 140 | dbg_assert(Size % sizeof(uint32_t) == 0, "Chunk size invalid"); |
| 141 | |
| 142 | Size = CVariableInt::Compress(m_aBuffer, Size, m_aBufferTemp, sizeof(m_aBufferTemp)); |
| 143 | if(Size < 0) |
| 144 | { |
| 145 | log_info_color(LOG_COLOR_GHOST, "ghost_recorder", "Failed to write chunk to '%s': error during intpack compression", m_aFilename); |
| 146 | m_LastItem.Reset(); |
| 147 | ResetBuffer(); |
| 148 | return; |
| 149 | } |
| 150 | |
| 151 | Size = CNetBase::Compress(m_aBufferTemp, Size, m_aBuffer, sizeof(m_aBuffer)); |
| 152 | if(Size < 0) |
| 153 | { |
| 154 | log_info_color(LOG_COLOR_GHOST, "ghost_recorder", "Failed to write chunk to '%s': error during network compression", m_aFilename); |
| 155 | m_LastItem.Reset(); |
| 156 | ResetBuffer(); |
| 157 | return; |
| 158 | } |
| 159 | |
| 160 | unsigned char aChunkHeader[4]; |
| 161 | aChunkHeader[0] = m_LastItem.m_Type & 0xff; |
| 162 | aChunkHeader[1] = m_BufferNumItems & 0xff; |
| 163 | aChunkHeader[2] = (Size >> 8) & 0xff; |
| 164 | aChunkHeader[3] = Size & 0xff; |
| 165 | |
| 166 | io_write(m_File, aChunkHeader, sizeof(aChunkHeader)); |
| 167 | io_write(m_File, m_aBuffer, Size); |
| 168 | |
| 169 | m_LastItem.Reset(); |
| 170 | ResetBuffer(); |
| 171 | } |
| 172 | |
| 173 | void CGhostRecorder::Stop(int Ticks, int Time) |
| 174 | { |