void Messages::save(Buffer &buffer) { int offset = writeHeader(buffer); offset = writeMessages(buffer, offset); int headerStart = offset; writeDirectory(buffer); buffer.putInteger(headerStart); }
bool NetDemo::stopRecording() { if (!isRecording()) { return false; } state = NetDemo::st_stopped; // write any remaining messages that have been captured writeMessages(); // write the end-of-demo marker byte marker = svc_netdemostop; writeChunk(&marker, sizeof(marker), NetDemo::msg_packet); // write the number of the last gametic in the recording header.ending_gametic = gametic; // tack the snapshot index onto the end of the recording fflush(demofp); header.snapshot_index_offset = ftell(demofp); header.snapshot_index_size = snapshot_index.size(); if (!writeSnapshotIndex()) { error("Unable to write netdemo snapshot index."); return false; } // tack the map index on to the end of the snapshot index fflush(demofp); header.map_index_offset = ftell(demofp); header.map_index_size = map_index.size(); if (!writeMapIndex()) { error("Unable to write netdemo map index."); return false; } // rewrite the header since snapshot_index_offset and // snapshot_index_size are now known if (!writeHeader()) { error("Unable to write updated netdemo header."); return false; } fclose(demofp); demofp = NULL; Printf(PRINT_HIGH, "Demo recording has stopped.\n"); reset(); return true; }
int KMFolderIndex::writeIndex( bool createEmptyIndex ) { QString tempName; QString indexName; mode_t old_umask; indexName = indexLocation(); tempName = indexName + ".temp"; { int result = unlink( QFile::encodeName( tempName ) ); if ( ! ( result == 0 || (result == -1 && errno == ENOENT ) ) ) return errno; } // We touch the folder, otherwise the index is regenerated, if KMail is // running, while the clock switches from daylight savings time to normal time utime( QFile::encodeName( QDir::toNativeSeparators(location()) ), 0 ); old_umask = umask( 077 ); FILE *tmpIndexStream = KDE_fopen( QFile::encodeName( tempName ), "w" ); //kDebug( KMKernel::storageDebug() ) << "KDE_fopen(tempName=" << tempName << ", \"w\") == tmpIndexStream == " << tmpIndexStream; umask( old_umask ); if ( !tmpIndexStream ) { return errno; } fprintf(tmpIndexStream, "# KMail-Index V%d\n", INDEX_VERSION); // Header quint32 byteOrder = 0x12345678; quint32 sizeOfLong = sizeof(long); quint32 header_length = sizeof(byteOrder)+sizeof(sizeOfLong); char pad_char = '\0'; fwrite(&pad_char, sizeof(pad_char), 1, tmpIndexStream); fwrite(&header_length, sizeof(header_length), 1, tmpIndexStream); // Write header fwrite(&byteOrder, sizeof(byteOrder), 1, tmpIndexStream); fwrite(&sizeOfLong, sizeof(sizeOfLong), 1, tmpIndexStream); off_t nho = KDE_ftell(tmpIndexStream); int fError = 0; if ( !createEmptyIndex ) { fError = writeMessages( 0/*all*/, false /* !flush */, tmpIndexStream ); /* moved to writeMessages() KMMsgBase* msgBase; int len; const uchar *buffer = 0; for (unsigned int i=0; i<mMsgList.high(); i++) { if (!(msgBase = mMsgList.at(i))) continue; buffer = msgBase->asIndexString(len); fwrite(&len,sizeof(len), 1, tmpIndexStream); off_t tmp = KDE_ftell(tmpIndexStream); msgBase->setIndexOffset(tmp); msgBase->setIndexLength(len); if(fwrite(buffer, len, 1, tmpIndexStream) != 1) kDebug() << "Whoa!"; }*/ } fError |= ferror( tmpIndexStream ); if( fError != 0 ) { fclose( tmpIndexStream ); //kDebug( KMKernel::storageDebug() ) << "fclose(tmpIndexStream = " << tmpIndexStream << ")"; return fError; } if( ( fflush( tmpIndexStream ) != 0 ) || ( fsync( fileno( tmpIndexStream ) ) != 0 ) ) { int errNo = errno; fclose( tmpIndexStream ); kWarning() << "fflush() or fsync() failed; fclose(tmpIndexStream = " << tmpIndexStream << ")"; return errNo; } //kDebug( KMKernel::storageDebug() ) << "fclose(tmpIndexStream = " << tmpIndexStream << ")"; if( fclose( tmpIndexStream ) != 0 ) { kWarning() << "fclose() failed"; return errno; } #ifdef Q_WS_WIN if (mIndexStream) { // close before renaming // neither this fixes windows port: // if ( !updateIndexStreamPtr() ) // return 1; bool ok = fclose( mIndexStream ) == 0; //kDebug( KMKernel::storageDebug() ) << "fclose(mIndexStream = " << mIndexStream << ")"; mIndexStream = 0; if ( !ok ) { kWarning() << "fclose() failed"; return errno; } } #endif if ( KDE_rename(QFile::encodeName(tempName), QFile::encodeName(indexName)) != 0 ) return errno; mHeaderOffset = nho; #ifndef Q_WS_WIN if (mIndexStream) { fclose(mIndexStream); //kDebug( KMKernel::storageDebug() ) << "fclose(mIndexStream = " << mIndexStream << ")"; } #endif if ( createEmptyIndex ) return 0; mIndexStream = KDE_fopen(QFile::encodeName(indexName), "r+"); // index file //kDebug( KMKernel::storageDebug() ) << "KDE_fopen(indexName=" << indexName << ", \"r+\") == mIndexStream == " << mIndexStream; assert( mIndexStream ); #ifndef Q_WS_WIN fcntl(fileno(mIndexStream), F_SETFD, FD_CLOEXEC); #endif if ( !updateIndexStreamPtr() ) return 1; if ( 0 != writeFolderIdsFile() ) return 1; setDirty( false ); return 0; }
bool NetDemo::startRecording(const std::string &filename) { this->filename = filename; if (isPlaying() || isPaused()) { error("Cannot record a netdemo while not connected to a server."); return false; } // Already recording so just ignore the command if (isRecording()) return true; if (demofp != NULL) // file is already open for some reason { fclose(demofp); demofp = NULL; } demofp = fopen(filename.c_str(), "wb"); if (!demofp) { error("Unable to create netdemo file " + filename + "."); return false; } memset(&header, 0, sizeof(header)); // Note: The header is not finalized at this point. Write it anyway to // reserve space in the output file for it and overwrite it later. if (!writeHeader()) { error("Unable to write netdemo header."); return false; } state = NetDemo::st_recording; header.starting_gametic = gametic; Printf(PRINT_HIGH, "Recording netdemo %s.\n", filename.c_str()); if (connected) { // write a simulation of the connection sequence since the server // has already sent it to the client and it wasn't captured static buf_t tempbuf(MAX_UDP_PACKET); // Fake the launcher query response SZ_Clear(&tempbuf); writeLauncherSequence(&tempbuf); capture(&tempbuf); writeMessages(); // Fake the server's side of the connection sequence SZ_Clear(&tempbuf); writeConnectionSequence(&tempbuf); capture(&tempbuf); writeMessages(); // Record any additional messages (usually a full update if auto-recording)) capture(&net_message); writeMessages(); SZ_Clear(&tempbuf); MSG_WriteMarker(&tempbuf, svc_netdemoloadsnap); capture(&tempbuf); writeMessages(); } return true; }
int KMFolderIndex::writeMessages( KMMsgBase* msg, bool flush ) { return writeMessages( msg, flush, mIndexStream ); }