int PolylineTest::readCompundFile() { assert(StgIsStorageFile(kFileName) == S_OK); ComPtr<IStorage> pStorage; ComPtr<IStream> pStream; auto hr = StgOpenStorageEx(kFileName, STGM_READ | STGM_SHARE_EXCLUSIVE | STGM_DIRECT, STGFMT_STORAGE, 0, NULL, 0, IID_IStorage, (void**)&pStorage); if (FAILED(hr)) return hr; hr = pStorage->OpenStream(kStreamName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &pStream); if (FAILED(hr)) return hr; ULARGE_INTEGER ui; ui.QuadPart = 10; pStream->SetSize(ui); int keke[6]; ULONG cb; hr = pStream->Read(keke, sizeof(int) * _countof(keke), &cb); if (FAILED(hr)) return hr; for (int i = 0; i < _countof(kData); i++) { assert(keke[i] == kData[i]); } return 0; }
int BookServerTest::readFileMoniker() { ComPtr<IStorage> pStorage; ComPtr<IStream> pStream; auto hr = StgOpenStorageEx(kMonikerFileName, STGM_READ | STGM_SHARE_EXCLUSIVE | STGM_DIRECT, STGFMT_STORAGE, 0, NULL, 0, IID_IStorage, (void**)&pStorage); if (FAILED(hr)) return hr; hr = pStorage->OpenStream(kStreamName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &pStream); if (FAILED(hr)) return hr; ComPtr<IMoniker> moniker; OleLoadFromStream(pStream, IID_IMoniker, (void**)&moniker); IBindCtx* pbc; CreateBindCtx(0, &pbc); ComPtr<IBook> book; hr = moniker->BindToObject(pbc, NULL, IID_IBook, (void**)&book); if (FAILED(hr)) { return -1; } ComBSTR name; book->get_name(&name); assert(name == kBookName); return 0; }
int PolylineTest::readFileMoniker() { ComPtr<IStorage> pStorage; ComPtr<IStream> pStream; auto hr = StgOpenStorageEx(kMonikerFileName, STGM_READ | STGM_SHARE_EXCLUSIVE | STGM_DIRECT, STGFMT_STORAGE, 0, NULL, 0, IID_IStorage, (void**)&pStorage); if (FAILED(hr)) return hr; hr = pStorage->OpenStream(kStreamName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &pStream); if (FAILED(hr)) return hr; ComPtr<IMoniker> moniker; OleLoadFromStream(pStream, IID_IMoniker, (void**)&moniker); IBindCtx* pbc; CreateBindCtx(0, &pbc); ComPtr<IPolyline> polyline; hr = moniker->BindToObject(pbc, NULL, IID_IPolyline, (void**)&polyline); if (FAILED(hr)) { return -1; } ComPtr<IPolyline> polyline2; hr = moniker->BindToObject(pbc, NULL, IID_IPolyline, (void**)&polyline2); if (FAILED(hr)) { return -1; } outputPoints(polyline); outputPoints(polyline2); polyline->put_Color(RGB(0xff, 0x00, 0x00)); COLORREF value; polyline->get_Color(&value); assert(value == RGB(0xff, 0x00, 0x00)); return 0; }
int OpenStore(wchar_t* filename, BOOL writeable, IStorage** out) { int res; assert(filename != NULL); assert(out != NULL); (int)fprintf(stderr, "Opening store %S\n", filename); res = StgOpenStorageEx( filename, STGM_SHARE_DENY_NONE | STGM_TRANSACTED | (writeable? STGM_READWRITE : STGM_READ), STGFMT_STORAGE, 0, NULL, NULL, &IID_IStorage, out); return (res == S_OK)? 1 : 0; }
int BookServerTest::readItemMoniker() { ComPtr<IStorage> pStorage; ComPtr<IStream> pStream; auto hr = StgOpenStorageEx(kMonikerFileName, STGM_READ | STGM_SHARE_EXCLUSIVE | STGM_DIRECT, STGFMT_STORAGE, 0, NULL, 0, IID_IStorage, (void**)&pStorage); if (FAILED(hr)) return hr; hr = pStorage->OpenStream(kStreamName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &pStream); if (FAILED(hr)) return hr; IBindCtx* pbc; CreateBindCtx(0, &pbc); ComPtr<IMoniker> bkMoniker; OleLoadFromStream(pStream, IID_IMoniker, (void**)&bkMoniker); { ComPtr<IBook> book; ComPtr<IBook> book2; auto hr = bkMoniker->BindToObject(pbc, NULL, IID_IBook, (void**)&book); assert(book); //hr = bkMoniker->BindToObject(pbc, NULL, IID_IBook, (void**)&book2); //assert(book2); } { ComPtr<IMoniker> chMoniker; CreateItemMoniker(L"!", L"chapter0", &chMoniker); ComPtr<IChapter> chObj; hr = chMoniker->BindToObject(pbc, bkMoniker, IID_IChapter, (void**)&chObj); if (FAILED(hr)) return hr; ComBSTR chName; chObj->get_name(&chName); assert(chName == L"概述"); } { ComPtr<ISection> secObj; ComPtr<IMoniker> chMoniker; ComPtr<IMoniker> secMoniker; CreateItemMoniker(L"!", L"chapter0", &chMoniker); CreateItemMoniker(L"!", L"section0", &secMoniker); ComPtr<IMoniker> composeMoniker; chMoniker->ComposeWith(secMoniker, FALSE, &composeMoniker); hr = composeMoniker->BindToObject(pbc, bkMoniker, IID_ISection, (void**)&secObj); if (FAILED(hr)) return hr; ComBSTR name; secObj->get_name(&name); } //ComPtr<IMoniker> secMoniker; //CreateItemMoniker(L"!", L"section0", &secMoniker); //ComPtr<ISection> secObj; //hr = secMoniker->BindToObject(pbc, bkMoniker, IID_ISection, (void**)&secObj); //if (FAILED(hr)) // return hr; //ComBSTR secName; //secObj->get_name(&secName); //assert(secName == L"how to read this book"); //chObj = NULL; //ComPtr<IMoniker> composeMoniker; //hr = bkMoniker->ComposeWith(chMoniker, FALSE, &composeMoniker); //if (FAILED(hr)) // return hr; //composeMoniker->BindToObject(pbc, NULL, IID_IChapter, (void**)&chObj); //chObj->get_name(&chName); //assert(chName == L"概述"); //CreateGenericComposite(bkMoniker, chMoniker, &composeMoniker); return 0; }
bool CustomPropertyStorage::SetProperty(const CStdString& sName, const CStdString& sValue ) { if( sName.IsEmpty() || sValue.IsEmpty() ) { CStdString sError; sError.Format(_T("Invalid arguments passed to SetProperty , Property name is %s , Value is %s") , sName.c_str() , sValue.c_str()); LOG_WS_ERROR(sError.c_str()); return false; } try { USES_CONVERSION; HRESULT hr = S_OK; IPropertySetStoragePtr pPropSetStg = NULL; IPropertyStoragePtr pPropStg = NULL; hr = StgOpenStorageEx( T2W((LPTSTR)m_sFileName.c_str()), STGM_SHARE_EXCLUSIVE | STGM_READWRITE | STGFMT_STORAGE , STGFMT_DOCFILE , 0, NULL, NULL, IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg) ); if( FAILED(hr) || (pPropSetStg == NULL) ) { LOG_WS_ERROR(_T("Failed StgCreateStorageEx")); return false; } hr = pPropSetStg->Create( FMTID_UserDefinedProperties, NULL, PROPSETFLAG_DEFAULT, STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE , &pPropStg ); if( FAILED(hr) || (pPropStg == NULL)) { LOG_WS_ERROR(_T("Failed IPropertySetStorage::Create")); return false; } PROPSPEC propspec; ZeroMemory(&propspec, sizeof(PROPSPEC)); propspec.ulKind = PRSPEC_LPWSTR; propspec.lpwstr = T2OLE((LPTSTR)sName.c_str()); PROPVARIANT propvarWrite; PropVariantInit(&propvarWrite); propvarWrite.vt = VT_LPWSTR; propvarWrite.pwszVal = T2W((LPTSTR)sValue.c_str()); hr = pPropStg->WriteMultiple( 1, &propspec, &propvarWrite, PID_FIRST_USABLE ); if( FAILED(hr) ) { LOG_WS_ERROR(_T("Failed IPropertyStorage::WriteMultiple")); return false; } PROPID propidDictionary = PID_DICTIONARY; WCHAR *pwszFriendlyName = L"Workshare Custom Document Property"; hr = pPropStg->WritePropertyNames( 1, &propidDictionary, &pwszFriendlyName ); if( FAILED(hr) ) { LOG_WS_ERROR(_T("Failed to write propertynames")); return false; } return SUCCEEDED(pPropStg->Commit(STGC_DEFAULT)); } catch(...) { CStdString sError; sError.Format(_T("Unexpected error while trying to SetCustomProperty for %s .") , sName.c_str() ); LOG_WS_ERROR(sError); return false; } }
bool CustomPropertyStorage::CopyTo( const CStdString& sDestinationFile ) const { try { USES_CONVERSION; HRESULT hr = S_OK; IPropertySetStoragePtr pPropSetStg = NULL; IPropertyStoragePtr pPropStg = NULL; hr = StgOpenStorageEx( CStdStringW(m_sFileName.c_str()), STGM_READ|STGM_SHARE_DENY_WRITE, STGFMT_ANY, 0, NULL, NULL, IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg) ); if( FAILED(hr) || (pPropSetStg == NULL)) { LOG_WS_ERROR(_T("Failed StgOpenStorageEx")); return false; } hr = pPropSetStg->Open(FMTID_UserDefinedProperties, STGM_READ|STGM_SHARE_EXCLUSIVE, &pPropStg ); if( FAILED(hr) || (pPropStg == NULL)) { LOG_WS_ERROR(_T("Failed StgOpenStorageEx")); return false; } IEnumSTATPROPSTGPtr pEnumProp; hr = pPropStg->Enum( &pEnumProp ); if( FAILED( hr ) ) { LOG_WS_ERROR(_T("Failed pPropSetStg->Enum")); return false; } // Enumerate properties. CustomPropertyStorage copyToStorage( sDestinationFile ); STATPROPSTG sps; ULONG fetched; PROPSPEC propSpec[1]; PROPVARIANT propVar[1]; while(pEnumProp->Next(1, &sps, &fetched) == S_OK) { // Build a PROPSPEC for this property. ZeroMemory(&propSpec[0], sizeof(PROPSPEC)); propSpec[0].ulKind = PRSPEC_PROPID; propSpec[0].propid = sps.propid; // Read this property. hr = pPropStg->ReadMultiple(1, &propSpec[0], &propVar[0]); if(!FAILED(hr)) { if( sps.vt = VT_LPWSTR ) { copyToStorage.SetProperty( sps.lpwstrName, propVar[0].pwszVal ); } } } return true; } catch(...) { LOG_WS_ERROR(_T("Error") ); return false; } }
CStdString CustomPropertyStorage::GetProperty( const CStdString& sName ) const { if(sName.IsEmpty()) { LOG_WS_ERROR(_T("Property name passed as argument was empty.")); return _T(""); } try { HRESULT hr = S_OK; IPropertySetStoragePtr pPropSetStg = NULL; IPropertyStoragePtr pPropStg = NULL; hr = StgOpenStorageEx( CStdStringW(m_sFileName.c_str()), STGM_READ | STGM_SHARE_EXCLUSIVE, STGFMT_ANY, 0, NULL, NULL, IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg) ); if( FAILED(hr) || (pPropSetStg == NULL) ) { LOG_WS_ERROR(_T("Failed StgOpenStorageEx")); return _T(""); } hr = pPropSetStg->Open(FMTID_UserDefinedProperties, STGM_READ|STGM_SHARE_EXCLUSIVE,&pPropStg ); if( FAILED(hr) || (pPropStg == NULL)) { LOG_WS_ERROR(_T("Failed IPropertySetStorage::Open")); return _T(""); } USES_CONVERSION; PROPVARIANT propvarRead; PropVariantInit(&propvarRead); PROPSPEC propspec; ZeroMemory(&propspec, sizeof(PROPSPEC)); propspec.ulKind = PRSPEC_LPWSTR; propspec.lpwstr = T2OLE((LPTSTR)sName.c_str()); hr = pPropStg->ReadMultiple( 1, &propspec, &propvarRead ); if( FAILED(hr) ) { LOG_WS_ERROR(_T("Failed IPropertyStorage::ReadMultiple")); return _T(""); } CStdString sValue = ComConvertUtils::PropVariantToString(propvarRead); return sValue; } catch(...) { CStdString sError; sError.Format(_T("Unexpected error while trying to GetCustomProperty for %s .") , sName.c_str()); LOG_WS_ERROR(sError); return _T(""); } }
bool CustomPropertyStorage::DoesPropertyExist(const CStdString sName) const { if(sName.IsEmpty()) { LOG_WS_ERROR(_T("we have been passed an empty custom document property.")); return false; } try { USES_CONVERSION; HRESULT hr = S_OK; IPropertySetStoragePtr pPropSetStg = NULL; IPropertyStoragePtr pPropStg = NULL; hr = StgOpenStorageEx( CStdStringW(m_sFileName.c_str()), STGM_READ|STGM_SHARE_DENY_WRITE, STGFMT_ANY, 0, NULL, NULL, IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg) ); if( FAILED(hr) || (pPropSetStg == NULL)) { LOG_WS_ERROR(_T("Failed StgOpenStorageEx")); return false; } hr = pPropSetStg->Open(FMTID_UserDefinedProperties, STGM_READ|STGM_SHARE_EXCLUSIVE, &pPropStg ); if( FAILED(hr) || (pPropStg == NULL)) { LOG_WS_ERROR(_T("Failed StgOpenStorageEx")); return false; } PROPVARIANT propvar; PropVariantInit(&propvar); PROPSPEC propspec; ZeroMemory(&propspec, sizeof(PROPSPEC)); PropVariantInit( &propvar ); propspec.ulKind = PRSPEC_LPWSTR; propspec.lpwstr = T2W((LPTSTR)sName.c_str()); hr = pPropStg->ReadMultiple( 1, &propspec, &propvar ); if( FAILED(hr) ) { LOG_WS_ERROR(_T("Failed to ReadMultiple.")); return false; } CStdString sValue = ComConvertUtils::PropVariantToString(propvar); if(sValue.IsEmpty()) return false; return true; } catch(...) { CStdString sError; sError.Format(_T("Unexpected error while determining %s property exists ") , sName.c_str() ); LOG_WS_ERROR(sError); return false; } return false; }