//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: urlmarsh.cxx // // Contents: CUrlMarshal methods implementations // to support custom marshaling // // Classes: // // Functions: // // History: 1-19-96 JohannP (Johann Posch) Created // //---------------------------------------------------------------------------- #include #include "urlmk.hxx" PerfDbgTag(tagCUrlMarsh, "Urlmon", "Log CUrlMon Marshalling", DEB_URLMON); //+--------------------------------------------------------------------------- // // Method: CUrlMon::CanMarshalIID // // Synopsis: Checks whether this object supports marshalling this IID. // // Arguments: [riid] -- // // Returns: // // History: 1-19-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- inline BOOL CUrlMon::CanMarshalIID(REFIID riid) { DEBUG_ENTER((DBG_MONIKER, Bool, "CUrlMon::CanMarshalIID", "this=%#x, %#x", this, &riid )); // keep this in sync with the QueryInterface BOOL fRet = (BOOL) (riid == IID_IMoniker); DEBUG_LEAVE(fRet); return fRet; } //+--------------------------------------------------------------------------- // // Method: CUrlMon::ValidateMarshalParams // // Synopsis: Validates the standard set parameters that are passed into most // of the IMarshal methods // // Arguments: [riid] -- // [pvInterface] -- // [dwDestContext] -- // [pvDestContext] -- // [mshlflags] -- // // Returns: // // History: 1-19-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- HRESULT CUrlMon::ValidateMarshalParams(REFIID riid,void *pvInterface, DWORD dwDestContext,void *pvDestContext,DWORD mshlflags) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::ValidateMarshalParams", "this=%#x, %#x, %#x, %#x, %#x, %#x", this, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags )); PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::ValidateMarshalParams"); HRESULT hr = NOERROR; if (CanMarshalIID(riid)) { UrlMkAssert((dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_LOCAL || dwDestContext == MSHCTX_NOSHAREDMEM)); UrlMkAssert((mshlflags == MSHLFLAGS_NORMAL || mshlflags == MSHLFLAGS_TABLESTRONG)); if ( (dwDestContext != MSHCTX_INPROC && dwDestContext != MSHCTX_LOCAL && dwDestContext != MSHCTX_NOSHAREDMEM) || (mshlflags != MSHLFLAGS_NORMAL && mshlflags != MSHLFLAGS_TABLESTRONG)) { hr = E_INVALIDARG; } } else { hr = E_NOINTERFACE; } PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::ValidateMarshalParams (hr:%lx)", hr); DEBUG_LEAVE(hr); return hr; } //+--------------------------------------------------------------------------- // // IMarshal methods // //+--------------------------------------------------------------------------- // // Method: CUrlMon::GetUnmarshalClass // // Synopsis: // // Arguments: [riid] -- // [pvInterface] -- // [dwDestContext] -- // [pvDestContext] -- // [mshlflags] -- // [pCid] -- // // Returns: // // History: 1-19-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CUrlMon::GetUnmarshalClass(REFIID riid,void *pvInterface, DWORD dwDestContext,void *pvDestContext,DWORD mshlflags,CLSID *pCid) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::IMarshal::GetUnmarshalClass", "this=%#x, %#x, %#x, %#x, %#x, %#x, %#x", this, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags, pCid )); HRESULT hr; PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::GetUnmarshalClass"); hr = ValidateMarshalParams(riid, pvInterface, dwDestContext,pvDestContext, mshlflags); if (hr == NOERROR) { *pCid = (CLSID) CLSID_StdURLMoniker; } PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::GetUnmarshalClass (hr:%lx)", hr); DEBUG_LEAVE(hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CUrlMon::GetMarshalSizeMax // // Synopsis: // // Arguments: [void] -- // [pvInterface] -- // [dwDestContext] -- // [pvDestContext] -- // [mshlflags] -- // [pSize] -- // // Returns: // // History: 1-19-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CUrlMon::GetMarshalSizeMax(REFIID riid,void *pvInterface, DWORD dwDestContext,void *pvDestContext,DWORD mshlflags,DWORD *pSize) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::IMarshal::GetMarshalSizeMax", "this=%#x, %#x, %#x, %#x, %#x, %#x, %#x", this, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags, pSize )); HRESULT hr; PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::GetMarshalSizeMax"); if (pSize == NULL) { hr = E_INVALIDARG; } else { hr = ValidateMarshalParams(riid, pvInterface, dwDestContext,pvDestContext, mshlflags); if (hr == NOERROR) { // size of url + extra info *pSize = (wcslen(_pwzUrl) + 1) * sizeof(WCHAR) + sizeof(ULONG); // Note: add state info } } PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::GetMarshalSizeMax (hr:%lx)", hr); DEBUG_LEAVE(hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CUrlMon::MarshalInterface // // Synopsis: // // Arguments: [REFIID] -- // [riid] -- // [DWORD] -- // [void] -- // [DWORD] -- // [mshlflags] -- // // Returns: // // History: 1-19-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CUrlMon::MarshalInterface(IStream *pistm,REFIID riid, void *pvInterface,DWORD dwDestContext, void *pvDestContext,DWORD mshlflags) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::IMarshal::MarshalInterface", "this=%#x, %#x, %#x, %#x, %#x, %#x, %#x", this, pistm, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags )); HRESULT hr; PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::MarshalInterface"); hr = ValidateMarshalParams(riid, pvInterface, dwDestContext,pvDestContext, mshlflags); if (hr == NOERROR) { hr = Save(pistm, FALSE); } PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::MarshalInterface (hr:%lx)", hr); DEBUG_LEAVE(hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CUrlMon::UnmarshalInterface // // Synopsis: Unmarshals an Urlmon interface out of a stream // // Arguments: [REFIID] -- // [void] -- // [ppvObj] -- // // Returns: // // History: 1-19-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CUrlMon::UnmarshalInterface(IStream *pistm,REFIID riid,void ** ppvObj) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::IMarshal::UnmarshalInterface", "this=%#x, %#x, %#x, %#x", this, pistm, &riid, ppvObj )); HRESULT hr = NOERROR; PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::UnmarshalInterface"); if (ppvObj == NULL) { hr = E_INVALIDARG; } else if (! CanMarshalIID(riid)) { *ppvObj = NULL; hr = E_NOINTERFACE; } else { *ppvObj = NULL; hr = Load(pistm); // call QI to get the requested interface if (hr == NOERROR) { hr = QueryInterface(riid, ppvObj); } } PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::UnmarshalInterface (hr:%lx)", hr); DEBUG_LEAVE(hr); return hr; } STDMETHODIMP CUrlMon::ReleaseMarshalData(IStream *pStm) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::IMarshal::ReleaseMarshalData", "this=%#x, %#x", this, pStm )); PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::ReleaseMarshalData"); PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::ReleaseMarshalData (hr:%lx)", NOERROR); DEBUG_LEAVE(NOERROR); return NOERROR; } STDMETHODIMP CUrlMon::DisconnectObject(DWORD dwReserved) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::IMarshal::DisconnectObject", "this=%#x, %#x", this, dwReserved )); PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::DisconnectObject"); PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::DisconnectObject (hr:%lx)", NOERROR); DEBUG_LEAVE(NOERROR); return NOERROR; } //+--------------------------------------------------------------------------- // // Method: CUrlMon::GetComparisonData // // Synopsis: // // Arguments: [pbData] -- // [cbMax] -- // [pcbData] -- // // Returns: // // History: 1-22-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CUrlMon::GetComparisonData(byte *pbData, ULONG cbMax, ULONG *pcbData) { DEBUG_ENTER((DBG_MONIKER, Hresult, "CUrlMon::IROTData::GetComparisonData", "this=%#x, %#x, %#x, %#x", this, pbData, cbMax, pcbData )); PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::GetComparisonData"); HRESULT hr = NOERROR; if (pbData == NULL || pcbData == NULL) { hr = E_INVALIDARG; } else { UrlMkAssert((_pwzUrl != NULL)); *pcbData = (wcslen(_pwzUrl) + 1) * sizeof(WCHAR); if (*pcbData > cbMax) { hr = E_FAIL; } else { wcscpy((WCHAR*)pbData,_pwzUrl); } } PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::GetComparisonData (hr:%lx)", hr); DEBUG_LEAVE(NOERROR); return NOERROR; }