예제 #1
0
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;
}
예제 #2
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;
}
예제 #3
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;
}
예제 #4
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;
}
예제 #5
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;
}
예제 #6
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;
	}
}
예제 #7
0
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;
	}
}
예제 #8
0
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("");
	}
}
예제 #9
0
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;
}