|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: oinet.hxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 11-07-1996 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
#ifndef _OINET_HXX_
#define _OINET_HXX_
enum LOC { LOC_NONE = 1 ,LOC_NAMESPACE ,LOC_INTERNAL ,LOC_EXTERNAL };
//+---------------------------------------------------------------------------
//
// Class: CProtNode ()
//
// Purpose:
//
// Interface: Add --
// Remove
// FindFirst --
// FindNext --
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CNodeData;
class CNodeData { public: ATOM _atom; IClassFactory *_pCFProt; CLSID _clsidProt; CNodeData *_pNextNode;
CNodeData(ATOM atom, IClassFactory *pCF, CLSID clsid) : _clsidProt(clsid) { _atom = atom; _pCFProt = pCF; if (_pCFProt) { _pCFProt->AddRef(); } }
~CNodeData() { if (_pCFProt) { _pCFProt->Release(); } }
private: CNodeData() : _clsidProt(CLSID_NULL) { TransAssert((FALSE)); }
};
// Simple class to hold per protocol information.
// Currently we only keep the name of the protocol here.
class CProtocolData { public: CProtocolData(): _pszProtocol(NULL), _pNext(NULL) {} ~CProtocolData( ) { if(_pszProtocol) delete [] _pszProtocol; }
BOOL Init(LPCWSTR pszProt, CProtocolData *pNext) { int len = lstrlenW(pszProt) + 1; TransAssert(_pszProtocol == NULL && _pNext == NULL); _pszProtocol = new WCHAR[len]; if (_pszProtocol) { StrCpyNW(_pszProtocol, pszProt, len); _pNext = pNext; return TRUE; } else { return FALSE; } }
// Access methods.
LPCWSTR GetProtocol( ) const { return _pszProtocol; } CProtocolData * GetNext( ) const { return _pNext; }
public: LPWSTR _pszProtocol; CProtocolData * _pNext; };
//+---------------------------------------------------------------------------
//
// Class: CProtMgr ()
//
// Purpose:
//
// Interface: QueryInterface --
// AddRef --
// Release --
// Register --
// UnRegister --
// Add --
// Remove --
// FindFirst --
// FindNext --
// _cElements --
// _CRefs --
// _cElements --
// _MapAtom --
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CProtMgr { public: STDMETHODIMP Register(IClassFactory *pCF, REFCLSID rclsid, LPCWSTR pszProtocol, ULONG cPatterns = 0, const LPCWSTR *ppwzPatterns = 0, DWORD dwReserved = 0); STDMETHODIMP Unregister(IClassFactory *pCF, LPCWSTR pszProtocol);
// called by the protocol broker
virtual STDMETHODIMP FindFirstCF(LPCWSTR pszProt, IClassFactory **ppUnk, CLSID *pclsid ); virtual STDMETHODIMP FindNextCF(LPCWSTR pszProt, IClassFactory **ppUnk, CLSID *pclsid); virtual STDMETHODIMP LookupClsIDFromReg(LPCWSTR pwzUrl, CLSID *ppclsid, DWORD *pcClsIds = 0, DWORD *pdwFlags = 0, DWORD dwOpt = 0); private:
public: CProtMgr() : _cElements(-1), _CRefs(1) { _pPosNode = 0; _pNextNode = 0; }
~CProtMgr() { TransAssert(((_cElements == -1 ) || (_cElements == 0))); }
protected: CRefCount _CRefs; // the total refcount of this object
CRefCount _cElements; // elements in list
CMutexSem _mxs; // single access to protocol manager
CNodeData *_pNextNode; // head of list
CNodeData *_pPosNode; // next position for looking when call on FindNext
};
class CProtMgrNameSpace : public CProtMgr { public: virtual STDMETHODIMP FindFirstCF(LPCWSTR pszProt, IClassFactory **ppUnk, CLSID *pclsid); virtual STDMETHODIMP FindNextCF(LPCWSTR pszProt, IClassFactory **ppUnk, CLSID *pclsid); virtual STDMETHODIMP LookupClsIDFromReg(LPCWSTR pwzUrl, CLSID *ppclsid, DWORD *pcClsIds = 0, DWORD *pdwFlags = 0, DWORD dwOpt = 0);
public: CProtMgrNameSpace() : _pProtList(NULL) { _cElements = 0; }
~CProtMgrNameSpace() { CProtocolData *pDelProtData = _pProtList; while (pDelProtData != NULL) { CProtocolData *pNext = pDelProtData->GetNext(); delete pDelProtData; pDelProtData = pNext; } }
private: CProtocolData * _pProtList;
// Should we look up the registry for this prot. This function assumes caller will lookup the
// registry if it returns TRUE.
STDMETHODIMP ShouldLookupRegistry(LPCWSTR pwszProt); };
class CProtMgrMimeHandler : public CProtMgr { public: virtual STDMETHODIMP LookupClsIDFromReg(LPCWSTR pwzUrl, CLSID *ppclsid, DWORD *pcClsIds = 0, DWORD *pdwFlags = 0, DWORD dwOpt = 0);
public: CProtMgrMimeHandler() { }
~CProtMgrMimeHandler() { } private: };
//+---------------------------------------------------------------------------
//
// Class: COInetSession ()
//
// Purpose:
//
// Interface: QueryInterface --
// AddRef --
// Release --
// RegisterNameSpace --
// UnregisterNameSpace --
// RegisterMimeFilter --
// UnregisterMimeFilter --
// CreateBinding --
// SetSessionOption --
// GetSessionOption --
// CreateFirstProtocol --
// CreateNextProtocol --
// CreateHandler --
// FindOInetProtocolClsID --
// Create --
// _dwProtMax --
// FindFirstCF --
// FindNextCF --
// FindInternalCF --
// dwId --
// pCF --
// ProtMap --
// _CRefs --
// _CProtMgr --
// _CProtMgrNameSpace --
// _CProtMgrMimeFilter --
// _dwProtMax --
// INTERNAL_PROTOCOL_MAX --
//
// History: 11-20-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
class COInetSession : public IOInetSession, public IOInetProtocolInfo { public: // IUnknown methods
STDMETHODIMP QueryInterface(REFIID iid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP RegisterNameSpace( IClassFactory *pCF, REFCLSID rclsid, LPCWSTR pwzProtocol, ULONG cPatterns, const LPCWSTR *ppwzPatterns, DWORD dwReserved );
STDMETHODIMP UnregisterNameSpace( IClassFactory *pCF, LPCWSTR pszProtocol );
STDMETHODIMP RegisterMimeFilter( IClassFactory *pCF, REFCLSID rclsid, LPCWSTR pwzType );
STDMETHODIMP UnregisterMimeFilter( IClassFactory *pCF, LPCWSTR pwzType );
STDMETHODIMP CreateBinding( LPBC pBC, LPCWSTR szUrl, IUnknown *pUnkOuter, IUnknown **ppUnk, IOInetProtocol **ppOInetProt, DWORD dwOption );
STDMETHODIMP SetSessionOption( DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD dwReserved );
STDMETHODIMP GetSessionOption( DWORD dwOption, LPVOID pBuffer, DWORD *pdwBufferLength, DWORD dwReserved );
// *** IOInetProtocolInfo
STDMETHODIMP ParseUrl( LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved );
STDMETHODIMP CombineUrl( LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved );
STDMETHODIMP CompareUrl( LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwFlags );
STDMETHODIMP QueryInfo( LPCWSTR pwzUrl, QUERYOPTION OueryOption, DWORD dwQueryFlags, LPVOID pBuffer, DWORD cbBuffer, DWORD *pcbBuf, DWORD dwReserved );
// COInetSession methods used by the protocol broker to get protocols
STDMETHODIMP CreateFirstProtocol(LPCWSTR pwzUrl, IUnknown *pUnkOuter, IUnknown **ppUnk, IOInetProtocol **ppProt, CLSID *pclsid, DWORD* pdwLocation, DWORD dwOpt = 0); STDMETHODIMP CreateNextProtocol(LPCWSTR pwzUrl, IUnknown *pUnkOuter, IUnknown **ppUnk, IOInetProtocol **ppProt, CLSID *pclsid, DWORD* pdwLocation); STDMETHODIMP CreateHandler(LPCWSTR pwzUrl, IUnknown *pUnkOuter, IUnknown **ppUnk, IOInetProtocol **ppProt, CLSID *pclsid);
STDMETHODIMP FindOInetProtocolClsID(LPCWSTR pwzUrl, CLSID *pclsid);
static HRESULT Create(DWORD dwMode, COInetSession **ppCOInetSession);
COInetSession() : _CProtMgrNameSpace(), _CProtMgr(), _CProtMgrMimeFilter() { _dwProtMax = INTERNAL_PROTOCOL_MAX;
for(DWORD i = 0; i < _dwProtMax; i++) { _ProtMap[i].pCF = 0; } } ~COInetSession() { for(DWORD i = 0; i < _dwProtMax; i++) { if (_ProtMap[i].pCF != 0) { _ProtMap[i].pCF->Release(); } } }
private: // private methods
STDMETHODIMP FindFirstCF(LPCWSTR pszProt, IClassFactory **ppUnk, CLSID *pclsid, DWORD* pdwLocation, DWORD dwOpt = 0); STDMETHODIMP FindNextCF(LPCWSTR pszProt, IClassFactory **ppUnk, CLSID *pclsid, DWORD* pdwLocation); STDMETHODIMP FindInternalCF(LPCWSTR pszProt, IClassFactory **ppUnk, CLSID *pclsid, DWORD* pdwLocation); STDMETHODIMP CreateProtocolInfo(LPCWSTR pwzUrl, IOInetProtocolInfo **ppProtInfo); STDMETHODIMP CreateSecurityMgr(LPCWSTR pwzUrl, IInternetSecurityManager **ppSecMgr);
typedef struct _tagProtMap { DWORD dwId; IClassFactory *pCF;
} ProtMap; VOID UpdateTransLevelHandlerCount(BOOL bAttach);
private: CRefCount _CRefs; // the total refcount of this object
CProtMgr _CProtMgr; CProtMgrNameSpace _CProtMgrNameSpace; CProtMgrMimeHandler _CProtMgrMimeFilter; DWORD _dwProtMax; ProtMap _ProtMap[INTERNAL_PROTOCOL_MAX]; }; HRESULT GetCOInetSession(DWORD dwMode, COInetSession **ppOInetSession, DWORD dwReserved); HRESULT OInetGetSession(DWORD dwMode, IOInetSession **ppOInetSession, DWORD dwReserved);
DWORD IsKnownProtocol(LPCWSTR wzProtocol); BOOL IsOInetProtocol(LPBC pBndCtx, LPCWSTR wzProtocol);
DWORD IsKnownOInetProtocolClass(CLSID *pclsid); CLSID *GetKnownOInetProtocolClsID(DWORD dwProtoId); HRESULT CreateKnownProtocolInstance(DWORD dwProtId, REFCLSID rclsid, IUnknown *pUnkOuter, REFIID riid, IUnknown **ppUnk);
HRESULT GetProtMgr(CProtMgr **ppCProtMgr); HRESULT GetTransactionObjects(LPBC pBndCtx, LPCWSTR wzUrl, IUnknown *pUnkOuter, IUnknown **ppUnk, IOInetProtocol **ppProt, DWORD dwOption, CTransData **pCTransData);
#endif // _OINET_HXX_
|