예제 #1
0
void Messages::save(Buffer &buffer)
{
    int offset = writeHeader(buffer);
    offset = writeMessages(buffer, offset);
    int headerStart = offset;
    writeDirectory(buffer);
    buffer.putInteger(headerStart);
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
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;
}
예제 #5
0
int KMFolderIndex::writeMessages( KMMsgBase* msg, bool flush )
{
  return writeMessages( msg, flush, mIndexStream );
}