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; }
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); }
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; }
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; }