// Protocol.h -- Declaration for CProtocol object #ifndef __PROTOCOL_H__ #define __PROTOCOL_H__ class CIOITnetProtocol : public CITUnknown { public: // Destructor: ~CIOITnetProtocol(); // Creation: static HRESULT Create(IUnknown *punkOuter, REFIID riid, PPVOID ppv); private: // Constructor: CIOITnetProtocol(IUnknown *pUnkOuter); class CImpIOITnetProtocol : public IOITnetProtocol, public IOITnetProtocolInfo { public: // Constructor and Destructor: CImpIOITnetProtocol(CIOITnetProtocol *pBackObj, IUnknown *punkOuter); ~CImpIOITnetProtocol(void); // Initialing routine: HRESULT Init(); // IOITnetProtocolRoot interfaces: HRESULT STDMETHODCALLTYPE Start( /* [in] */ LPCWSTR szUrl, /* [in] */ IOInetProtocolSink __RPC_FAR *pOIProtSink, /* [in] */ IOInetBindInfo __RPC_FAR *pOIBindInfo, /* [in] */ DWORD grfSTI, /* [in] */ DWORD dwReserved); HRESULT STDMETHODCALLTYPE Continue( /* [in] */ PROTOCOLDATA __RPC_FAR *pProtocolData); HRESULT STDMETHODCALLTYPE Abort( /* [in] */ HRESULT hrReason, /* [in] */ DWORD dwOptions); HRESULT STDMETHODCALLTYPE Terminate( /* [in] */ DWORD dwOptions); HRESULT STDMETHODCALLTYPE Suspend( void); HRESULT STDMETHODCALLTYPE Resume( void); // IOITnetProtocol interfaces: HRESULT STDMETHODCALLTYPE Read( /* [length_is][size_is][out] */ void __RPC_FAR *pv, /* [in] */ ULONG cb, /* [out] */ ULONG __RPC_FAR *pcbRead); HRESULT STDMETHODCALLTYPE Seek( /* [in] */ LARGE_INTEGER dlibMove, /* [in] */ DWORD dwOrigin, /* [out] */ ULARGE_INTEGER __RPC_FAR *plibNewPosition); HRESULT STDMETHODCALLTYPE LockRequest( /* [in] */ DWORD dwOptions); HRESULT STDMETHODCALLTYPE UnlockRequest( void); // IOITnetProtocolInfo interfaces: HRESULT STDMETHODCALLTYPE ParseUrl( /* [in] */ LPCWSTR pwzUrl, /* [in] */ PARSEACTION ParseAction, /* [in] */ DWORD dwParseFlags, /* [out] */ LPWSTR pwzResult, /* [in] */ DWORD cchResult, /* [out] */ DWORD __RPC_FAR *pcchResult, /* [in] */ DWORD dwReserved); HRESULT STDMETHODCALLTYPE CombineUrl( /* [in] */ LPCWSTR pwzBaseUrl, /* [in] */ LPCWSTR pwzRelativeUrl, /* [in] */ DWORD dwCombineFlags, /* [out] */ LPWSTR pwzResult, /* [in] */ DWORD cchResult, /* [out] */ DWORD __RPC_FAR *pcchResult, /* [in] */ DWORD dwReserved); HRESULT STDMETHODCALLTYPE CompareUrl( /* [in] */ LPCWSTR pwzUrl1, /* [in] */ LPCWSTR pwzUrl2, /* [in] */ DWORD dwCompareFlags); HRESULT STDMETHODCALLTYPE QueryInfo( /* [in] */ LPCWSTR pwzUrl, /* [in] */ QUERYOPTION OueryOption, /* [in] */ DWORD dwQueryFlags, /* [size_is][out][in] */ LPVOID pBuffer, /* [in] */ DWORD cbBuffer, /* [out][in] */ DWORD __RPC_FAR *pcbBuf, /* [in] */ DWORD dwReserved); private: // Wrapprers for IOINetProtocolSink: HRESULT STDMETHODCALLTYPE Switch(PROTOCOLDATA __RPC_FAR *pProtocolData); HRESULT STDMETHODCALLTYPE ReportProgress(ULONG ulStatusCode, LPCWSTR szStatusText); HRESULT STDMETHODCALLTYPE ReportData(DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax); HRESULT STDMETHODCALLTYPE ReportResult(HRESULT hrResult, DWORD dwError, LPCWSTR szResult); // Wrappers for IOINetBindInfo: HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD __RPC_FAR *grfBINDF, BINDINFO __RPC_FAR *pbindinfo ); HRESULT STDMETHODCALLTYPE GetBindString(ULONG ulStringType, LPOLESTR __RPC_FAR *ppwzStr, ULONG cEl, ULONG __RPC_FAR *pcElFetched ); enum { ITS_BIND_DATA = 0, CB_SAMPLE = 256}; HRESULT STDMETHODCALLTYPE ParseAndBind(BOOL fBind); WCHAR *m_pwcsURL; IOInetProtocolSink *m_pOIProtSink; IOInetBindInfo *m_pOIBindInfo; IStream *m_pStream; DWORD m_grfSTI; DWORD m_grfBINDF; BINDINFO m_BindInfo; char *m_pcsDisplayName; char m_szTempPath[MAX_PATH]; }; CImpIOITnetProtocol m_ImpIOITnetProtocol; IUnknown *m_apIUnknown[3]; }; extern GUID aIID_CIOITnetProtocol[]; extern UINT cInterfaces_CIOITnetProtocol; inline CIOITnetProtocol::CIOITnetProtocol(IUnknown *pUnkOuter) : m_ImpIOITnetProtocol(this, pUnkOuter), CITUnknown(aIID_CIOITnetProtocol, cInterfaces_CIOITnetProtocol, m_apIUnknown ) { RonM_ASSERT(cInterfaces_CIOITnetProtocol == 3); m_apIUnknown[0] = (IUnknown *) (IOITnetProtocolRoot *) &m_ImpIOITnetProtocol; m_apIUnknown[1] = (IUnknown *) (IOITnetProtocol *) &m_ImpIOITnetProtocol; m_apIUnknown[2] = (IUnknown *) (IOITnetProtocolInfo *) &m_ImpIOITnetProtocol; } inline CIOITnetProtocol::~CIOITnetProtocol(void) { } #ifndef PROFILING // When we're not profiling the code we want these wrappers to be // vanish a separate functions. When we're makeing profile runs we want // to see how much time is consumed by these callbacks. inline HRESULT STDMETHODCALLTYPE CIOITnetProtocol::CImpIOITnetProtocol::Switch (PROTOCOLDATA __RPC_FAR *pProtocolData) { return m_pOIProtSink->Switch(pProtocolData); } inline HRESULT STDMETHODCALLTYPE CIOITnetProtocol::CImpIOITnetProtocol::ReportProgress (ULONG ulStatusCode, LPCWSTR szStatusText) { return m_pOIProtSink->ReportProgress(ulStatusCode, szStatusText); } inline HRESULT STDMETHODCALLTYPE CIOITnetProtocol::CImpIOITnetProtocol::ReportData (DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax) { return m_pOIProtSink->ReportData(grfBSCF, ulProgress, ulProgressMax); } inline HRESULT STDMETHODCALLTYPE CIOITnetProtocol::CImpIOITnetProtocol::ReportResult (HRESULT hrResult, DWORD dwError, LPCWSTR szResult) { return m_pOIProtSink->ReportResult(hrResult, dwError, szResult); } inline HRESULT STDMETHODCALLTYPE CIOITnetProtocol::CImpIOITnetProtocol::GetBindInfo (DWORD __RPC_FAR *grfBINDF, BINDINFO __RPC_FAR *pbindinfo) { return m_pOIBindInfo->GetBindInfo(grfBINDF, pbindinfo); } inline HRESULT STDMETHODCALLTYPE CIOITnetProtocol::CImpIOITnetProtocol::GetBindString (ULONG ulStringType, LPOLESTR __RPC_FAR *ppwzStr, ULONG cEl, ULONG __RPC_FAR *pcElFetched ) { return m_pOIBindInfo->GetBindString(ulStringType, ppwzStr, cEl, pcElFetched); } #endif // PROFILING void STDMETHODCALLTYPE MapSurrogateCharacters(PWCHAR pwcsBuffer); HRESULT STDMETHODCALLTYPE DisectUrl (PWCHAR pwcsUrlBuffer, PWCHAR *ppwcProtocolName, PWCHAR *ppwcExternalPath, PWCHAR *ppwcInternalPath ); HRESULT STDMETHODCALLTYPE AssembleUrl (PWCHAR pwcsResult, DWORD cwcBuffer, DWORD *pcwcRequired, PWCHAR pwcsProtocolName, PWCHAR pwcsExternalPath, PWCHAR pwcsInternalPath ); HRESULT STDMETHODCALLTYPE CopyStreamToFile(const WCHAR *pwcsFilePath, IStream *pStreamSrc); HRESULT STDMETHODCALLTYPE StreamToIEFile (IStream *pStreamSrc, PWCHAR pwcsDisplayName, PCHAR &pcsDisplayName, PCHAR pcsFileName, PWCHAR pwcsFileName, PCHAR pcsTempFile, IMoniker *pmk, BOOL fNoWriteCache, BOOL fNoReadCache ); #endif // __PROTOCOL_H__