Exemple #1
0
STDMETHODIMP CIMacroScriptImp :: GetScriptInfo (LPCSTR pcName, 
												DWORD *pdwInfo) 
{
	ASSERT(pcName);

CMacro *pM = NULL;		
CEnumMacroScripts *pEn = NULL;

HRESULT hr = m_pMacroScripts -> GetEnum (&pEn);
	if (FAILED(hr)) return hr; 		
		
// pMakro -> AddRef(), wenn aufindbar !!!
	hr = pEn -> FindByName (pcName, &pM);
	pEn -> Release();
	
	if (FAILED(hr) || S_FALSE == GetScode(hr)) 	return hr;

LPSTREAM pIStream = NULL;
	
	if(m_pIStream) {
		m_pIStream -> Release(); m_pIStream = NULL;
	}

CString str = pcName;
								// ADDREF()
	hr = OpenOrCreateStream(str, &m_pIStream);
	if(FAILED(hr)) {
		pM -> Release(); return hr;
	}

ebFILEHEADER Head;
	hr = pM -> GetIPersistStream() -> LoadHeader (m_pIStream, &Head);
	pM -> Release();			// kein Header
	if (FAILED(hr)) return hr; 

// Header, aber kein Code
	*pdwInfo = GetScriptInfo (&Head);

return hr;
} 
Exemple #2
0
STDMETHODIMP CIMacroScriptImp :: GetScript (LPCSTR pcName, LPSTR *ppcMacroText,
											ebHCODE *phCode)
{                        
	ASSERT(pcName);

CString	strMacroName = pcName;
CMacro *pM = NULL;		
CEnumMacroScripts *pEn = NULL;
		
// immer Stream öffnen und aufheben bis neues Script geoeffnet wird
	if (m_pIStream) 
		m_pIStream -> Release(); m_pIStream = NULL;
	
HRESULT hr = OpenOrCreateStream(strMacroName, &m_pIStream);
	if (FAILED(hr)) return hr; 
		
	hr = m_pMacroScripts -> GetEnum (&pEn);
	if (FAILED(hr)) return hr; 		

// pMakro -> AddRef(), wenn aufindbar !!!
	hr = pEn -> FindByName (strMacroName, &pM);
	pEn -> Release();
	if (FAILED(hr)) { 
		if (pM) pM -> Release(); return hr;
	}

	*ppcMacroText = NULL;

	if (S_FALSE == GetScode(hr)) {

// pMakro -> AddRef(), kein passendes Objekt gefunden, Schaffen des Objektes 
		
		pM = CMacro :: Create (NULL);
		if (NULL == pM) {
			if (m_pIStream) m_pIStream; m_pIStream = NULL; return ResultFromScode(E_FAIL);
		}

		pM -> GetIMacros() -> SetName(strMacroName);
// neues Macro für späteres Commit() kennzeichnen
		pM -> GetIMacros() -> SetNew(true);

// Script in Liste füllen, pMakro->AddRef(),   
		hr = m_pMacroScripts -> AddScript (strMacroName, pM);
		pM -> Release();
		if (FAILED(hr)) {
			if (m_pIStream) m_pIStream; m_pIStream = NULL; return hr;
		}

		return ResultFromScode (S_FALSE);
	
	} else {

// Makro schon vorhanden und geöffnet bei pPersistStorage -> Load()			
// liest eigentliche Daten aus PersistStream-Objekt
		hr = GetData (ppcMacroText, phCode, pM);
// von FindByName() 
		pM -> Release();

// ppcMacroText, phCode draussen freigeben
		if (FAILED(hr)) {
			if (m_pIStream) m_pIStream; m_pIStream = NULL; return hr;
		}
	}                           
	
return ResultFromScode (S_OK);
}
Exemple #3
0
FARINTERNAL Ut10NativeStmToContentsStm
	(LPSTORAGE pstg, REFCLSID rclsid, BOOL fDeleteSrcStm)
{

	CLIPFORMAT	cfOld;
	CLIPFORMAT	cfNew;	
	LPOLESTR	lpszUserType = NULL;
	HRESULT		error;
	LPSTREAM	pstmSrc = NULL;
	LPSTREAM	pstmDst = NULL;

	
	if (error = ReadFmtUserTypeStg(pstg, &cfOld, &lpszUserType))
		return error;

	if (rclsid == CLSID_StaticDib)
		cfNew = CF_DIB;
	else if (rclsid == CLSID_StaticMetafile)
		cfNew = CF_METAFILEPICT;
	else {
		AssertSz(FALSE, "Internal Error: this routine shouldn't have been called for this class");
		return ResultFromScode(E_FAIL);
	}
	
	if (cfOld == g_cfPBrush) {
		if (cfNew != CF_DIB) {
			error = ResultFromScode(DV_E_CLIPFORMAT);			
			goto errRtn;
		}
	} else if (cfOld == g_cfMSDraw) {
		if (cfNew != CF_METAFILEPICT) {
			error = ResultFromScode(DV_E_CLIPFORMAT);			
			goto errRtn;
		}
	} else {
		// Converted to static object from some class other than PBrush or
		// MSDraw. The data must be in a proper format in the CONTENTS
		// stream.
		return NOERROR;
	}
	
	if (error = pstg->OpenStream(OLE10_NATIVE_STREAM, NULL,
						(STGM_READ|STGM_SHARE_EXCLUSIVE),
						0, &pstmSrc))
		goto errRtn;
	
	if (error = OpenOrCreateStream(pstg, OLE_CONTENTS_STREAM, &pstmDst))
		goto errRtn;
	
	DWORD dwSize;
	if (error = pstmSrc->Read(&dwSize, sizeof(DWORD), NULL))
		goto errRtn;
			
	if (cfOld == g_cfMSDraw) {
		WORD mfp[3]; // mm, xExt, yExt
	
		if (error = pstmSrc->Read(mfp, sizeof(mfp), NULL))
			goto errRtn;
		
		dwSize -= sizeof(mfp);
		
		error = UtMFStmToPlaceableMFStm(pstmSrc, dwSize,
					(LONG) mfp[1], (LONG) mfp[2], pstmDst);
		
	} else {
		// The PBrush native data format is DIB File format. So all we got to
		// do is CopyTo.
		
		ULARGE_INTEGER ularge_int;
		ULISet32(ularge_int, dwSize);
		if ((error = pstmSrc->CopyTo(pstmDst, ularge_int, NULL,
				NULL)) == NOERROR)
			StSetSize(pstmDst, 0, TRUE);		
	}
	
errRtn:
	if (pstmDst)
		pstmDst->Release();
			
	if (pstmSrc)
		pstmSrc->Release();
	
	if (error == NOERROR) {
 		error = WriteFmtUserTypeStg(pstg, cfNew, lpszUserType);

		if (fDeleteSrcStm)				
			pstg->DestroyElement(OLE10_NATIVE_STREAM);

	} else {
		pstg->DestroyElement(OLE_CONTENTS_STREAM);	
	}	
	
	if (lpszUserType)
		PubMemFree(lpszUserType);
	
	return error;
}
Exemple #4
0
FARINTERNAL UtContentsStmTo10NativeStm
	(LPSTORAGE pstg, REFCLSID rclsid, BOOL fDeleteSrcStm, UINT FAR* puiStatus)
{
	CLIPFORMAT	cf;
	LPOLESTR	lpszUserType = NULL;
	HRESULT		error;
	LPSTREAM	pstmSrc = NULL;
	LPSTREAM	pstmDst = NULL;
			
	*puiStatus = NULL;
	
	if (error = ReadFmtUserTypeStg(pstg, &cf, &lpszUserType))
		return error;
		
	
	if (! ((cf == CF_DIB  && rclsid == CLSID_PBrush)
			|| (cf == CF_METAFILEPICT && rclsid == CLSID_MSDraw))) {
		error = ResultFromScode(DV_E_CLIPFORMAT);
		goto errRtn;
	}
			
	if (error = pstg->OpenStream(OLE_CONTENTS_STREAM, NULL,
						(STGM_READ|STGM_SHARE_EXCLUSIVE),
						0, &pstmSrc)) {
		*puiStatus |= CONVERT_NOSOURCE;	

		// check whether OLE10_NATIVE_STREAM exists
		if (pstg->OpenStream(OLE10_NATIVE_STREAM, NULL,
				(STGM_READ|STGM_SHARE_EXCLUSIVE), 0, &pstmDst))
			*puiStatus |= CONVERT_NODESTINATION;
		else {
			pstmDst->Release();
			pstmDst = NULL;
		}
		
		goto errRtn;
	}
	
	if (error = OpenOrCreateStream(pstg, OLE10_NATIVE_STREAM, &pstmDst)) {
		*puiStatus |= CONVERT_NODESTINATION;						
		goto errRtn;
	}
	
	if (cf == CF_METAFILEPICT)
		error = UtPlaceableMFStmToMSDrawNativeStm(pstmSrc, pstmDst);
	else
		error = UtDIBFileStmToPBrushNativeStm(pstmSrc, pstmDst);
	
errRtn:
	if (pstmDst)
		pstmDst->Release();
			
	if (pstmSrc)
		pstmSrc->Release();
	
	if (error == NOERROR) {
		LPOLESTR lpszProgId = NULL;
		ProgIDFromCLSID(rclsid, &lpszProgId);
		
		error = WriteFmtUserTypeStg(pstg,
						RegisterClipboardFormat(lpszProgId),
						lpszUserType);

		if (lpszProgId)
			delete lpszProgId;
	}
	
	if (error == NOERROR) {
		if (fDeleteSrcStm)				
			pstg->DestroyElement(OLE_CONTENTS_STREAM);
	} else {
		pstg->DestroyElement(OLE10_NATIVE_STREAM);	
	}	
	
	if (lpszUserType)
		delete lpszUserType;
	
	return error;
}