// message to create a Standard Archive from a stream DWORD CArchiveFactory::OnCreateArchive(DWORD size, void *param) { CArchive *newArchive; CREATEARCHIVE *ca; CREATESTREAM cs; StdString csMessage; DWORD retVal; VERIFY_MESSAGE_SIZE(size, sizeof(CREATEARCHIVE)); ca = (CREATEARCHIVE *)param; cs.streamData = ca->streamData; cs.streamSize = ca->streamSize; cs.mode = ca->mode; csMessage = _T("CreateStream_"); csMessage += ca->streamType->GetString(); // try and create the stream DWORD msgHash_csMessage = CHashString(csMessage).GetUniqueID(); retVal = m_ToolBox->SendMessage(msgHash_csMessage, sizeof(CREATESTREAM), &cs); if (retVal != MSG_HANDLED) { return retVal; } try { newArchive = new CArchive(); } catch(...) { delete cs.openStream; return MSG_ERROR; } // initialize it with the stream newArchive->Init(cs.openStream); // check if we are creating a read and write stream if( (cs.mode & (STREAM_MODE_READ | STREAM_MODE_WRITE)) == (STREAM_MODE_READ | STREAM_MODE_WRITE)) { // set to a write archive only if the ARCHIVE_MODE_WRITE flag is set if((cs.mode & ARCHIVE_MODE_WRITE)==ARCHIVE_MODE_WRITE ) { newArchive->SetIsWriting( true ); } } ca->archive = newArchive; return MSG_HANDLED_STOP; }