OMStoredObject* OMGSF_SSStoredObjectFactory::createFile (const wchar_t* fileName, const OMByteOrder byteOrder, const OMUniqueObjectIdentification& signature) { TRACE("OMGSF_SSStoredObjectFactory::createFile"); PRECONDITION("Valid file name", validWideString(fileName)); // choose sector size based on signature from factory ULONG sectorSize=0; if( OMSignature_Aaf512Binary == signature ) sectorSize=512; else if( OMSignature_Aaf4KBinary == signature ) sectorSize=4096; PRECONDITION("Valid Signature", sectorSize!=0 ); SSCHAR omFileName[FILENAME_MAX]; #ifndef OM_UNICODE_APIS convertWideStringToString(omFileName, fileName, FILENAME_MAX); #else copyWideString (omFileName, fileName, FILENAME_MAX); #endif IStorage* storage = 0; HRESULT status = OMGSFIStorage::StgCreateStorageEx( omFileName, OMFile::writeOnlyMode, (void **)&storage, sectorSize); checkStatus(status); ASSERT("StgCreateStorageEx() succeeded", SUCCEEDED(status)); return OMSSStoredObject::create(storage, byteOrder); }
OMStoredObject* OMGSF_SSStoredObjectFactory::openFile (const wchar_t* fileName, const OMFile::OMAccessMode mode) { TRACE("OMGSF_SSStoredObjectFactory::openFile"); PRECONDITION("Valid file name", validWideString(fileName)); PRECONDITION("Valid mode", (mode == OMFile::modifyMode) || (mode == OMFile::readOnlyMode)); if (mode == OMFile::modifyMode) { ASSERT("Unimplemented GSF open in Read Modify mode not reached", false); return 0; } SSCHAR omFileName[FILENAME_MAX]; #ifndef OM_UNICODE_APIS convertWideStringToString(omFileName, fileName, FILENAME_MAX); #else copyWideString (omFileName, fileName, FILENAME_MAX); #endif IStorage* storage = 0; HRESULT status = OMGSFIStorage::StgOpenStorageEx( omFileName, OMFile::readOnlyMode, (void **)&storage); checkStatus(status); ASSERT("StgOpenStorageEx() succeeded", SUCCEEDED(status)); return OMSSStoredObject::open(storage, mode); }
HRESULT STDMETHODCALLTYPE OMGSFIStorage::StgCreateStorageEx( const TCHAR FAR* in_filename, OMFile::OMAccessMode in_accessMode, void **out_storage, ULONG in_sectorSize) { TRACE("OMGSFIStorage::StgCreateStorageEx"); PRECONDITION("Valid access mode", in_accessMode == OMFile::writeOnlyMode); GsfStorage *storage = 0; *out_storage = 0; char storageName[FILENAME_MAX]; #ifndef OM_UNICODE_APIS strncpy (storageName, in_filename, sizeof(storageName) -1); storageName[sizeof(storageName) -1] = '\0'; #else convertWideStringToString (storageName, in_filename, FILENAME_MAX); #endif int status = GSTG_OK; GError *err; GsfOutput *output = GSF_OUTPUT (gsf_output_stdio_new (storageName, &err)); if (output != NULL) { storage = GSF_OUTFILE (gsf_outfile_msole_new_full ( output, in_sectorSize, // sector size - 512 or 4096 bytes 64)); // mini-sector size always 64 bytes g_object_unref (G_OBJECT (output)); } else status = GSTG_ERROR; if (status == GSTG_OK) { OMGSFIStorage *newStorage = new OMGSFIStorage (storage, GSF_WRITE, storageName); *out_storage = newStorage; } return makeStatus(status); }
HRESULT STDMETHODCALLTYPE OMGSFIStorage::StgOpenStorageEx( const TCHAR FAR* in_filename, OMFile::OMAccessMode in_accessMode, void **out_storage) { TRACE("OMGSFIStorage::StgOpenStorageEx"); PRECONDITION("Valid access mode", in_accessMode == OMFile::readOnlyMode); GsfStorage *storage = 0; *out_storage = 0; char storageName[FILENAME_MAX]; #ifndef OM_UNICODE_APIS strncpy (storageName, in_filename, sizeof(storageName) -1); storageName[sizeof(storageName) -1] = '\0'; #else convertWideStringToString (storageName, in_filename, FILENAME_MAX); #endif GError *err; int status = GSTG_OK; GsfInput *input = GSF_INPUT (gsf_input_stdio_new (storageName, &err)); if (input != NULL) { input = gsf_input_uncompress (input); storage = GSF_INFILE (gsf_infile_msole_new (input, &err)); g_object_unref (G_OBJECT (input)); } else status = GSTG_ERROR; if (status == GSTG_OK) { OMGSFIStorage *newStorage = new OMGSFIStorage (storage, GSF_READ, storageName); *out_storage = newStorage; } return makeStatus(status); }