|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: resprot.cxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 11-07-1996 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
#include <eapp.h>
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::Start
//
// Synopsis:
//
// Arguments: [pwzUrl] --
// [pTrans] --
// [pOIBindInfo] --
// [grfSTI] --
// [dwReserved] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COhServNameSp::Start(LPCWSTR pwzUrl, IOInetProtocolSink *pProt, IOInetBindInfo *pOIBindInfo, DWORD grfSTI, DWORD dwReserved) { EProtDebugOut((DEB_PLUGPROT, "%p _IN COhServNameSp::Start\n", this)); HRESULT hr = NOERROR; WCHAR wzURL[MAX_URL_SIZE];
EProtAssert((!_pProtSink && pOIBindInfo && pProt)); EProtAssert((_pwzUrl == NULL));
hr = CBaseProtocol::Start(pwzUrl,pProt, pOIBindInfo, grfSTI, dwReserved);
if ( (grfSTI & PI_PARSE_URL) ) { hr = ParseAndStart(FALSE); } else if (hr == NOERROR) { // asked to go async as soon as possible
// use the switch mechanism which will \ // call back later on ::Continue
if (grfSTI & PI_FORCE_ASYNC) { hr = E_PENDING; PROTOCOLDATA protdata; protdata.grfFlags = PI_FORCE_ASYNC; protdata.dwState = RES_STATE_BIND; protdata.pData = 0; protdata.cbData = 0;
_pProtSink->Switch(&protdata); } else { hr = ParseAndStart(TRUE); } }
EProtDebugOut((DEB_PLUGPROT, "%p OUT COhServNameSp::Start (hr:%lx)\n",this, hr)); return hr; }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::Continue
//
// Synopsis:
//
// Arguments: [pStateInfoIn] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COhServNameSp::Continue(PROTOCOLDATA *pStateInfoIn) { EProtDebugOut((DEB_PLUGPROT, "%p _IN COhServNameSp::Continue\n", this)); HRESULT hr = E_FAIL;
EProtAssert((!pStateInfoIn->pData && pStateInfoIn->cbData && (pStateInfoIn->dwState == RES_STATE_BIND)));
if (pStateInfoIn->dwState == RES_STATE_BIND) { hr = ParseAndStart(); }
EProtDebugOut((DEB_PLUGPROT, "%p OUT COhServNameSp::Continue (hr:%lx)\n",this, hr)); return hr; }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::Read
//
// Synopsis:
//
// Arguments: [ULONG] --
// [ULONG] --
// [pcbRead] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COhServNameSp::Read(void *pv,ULONG cb,ULONG *pcbRead) { EProtDebugOut((DEB_PLUGPROT, "%p _IN COhServNameSp::Read (cb:%ld)\n", this,cb)); HRESULT hr = NOERROR;
if (_pProt) { hr = _pProt->Read(pv, cb, pcbRead); } else { hr = S_FALSE; }
EProtDebugOut((DEB_PLUGPROT, "%p OUT COhServNameSp::Read (pcbRead:%ld, hr:%lx)\n",this,*pcbRead, hr)); return hr; }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::Seek
//
// Synopsis:
//
// Arguments: [DWORD] --
// [ULARGE_INTEGER] --
// [plibNewPosition] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes: WORK: not done
//
//----------------------------------------------------------------------------
STDMETHODIMP COhServNameSp::Seek(LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition) { EProtDebugOut((DEB_PLUGPROT, "%p _IN COhServNameSp::Seek\n", this)); HRESULT hr = NOERROR;
if (_pProt) { hr = _pProt->Seek(dlibMove, dwOrigin, plibNewPosition); } else { hr = S_FALSE; }
EProtDebugOut((DEB_PLUGPROT, "%p OUT COhServNameSp::Seek (hr:%lx)\n",this, hr)); return hr; }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::LockRequest
//
// Synopsis:
//
// Arguments: [dwOptions] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COhServNameSp::LockRequest(DWORD dwOptions) { EProtDebugOut((DEB_PLUGPROT, "%p _IN COhServNameSp::LockRequest\n", this));
HRESULT hr = NOERROR;
if (_pProt) { hr = _pProt->LockRequest(dwOptions); }
EProtDebugOut((DEB_PLUGPROT, "%p OUT COhServNameSp::LockRequest (hr:%lx)\n",this, hr)); return hr; }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::UnlockRequest
//
// Synopsis:
//
// Arguments: (none)
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COhServNameSp::UnlockRequest() { EProtDebugOut((DEB_PLUGPROT, "%p _IN COhServNameSp::UnlockRequest\n", this)); HRESULT hr = NOERROR;
if (_pProt) { hr = _pProt->UnlockRequest(); }
EProtDebugOut((DEB_PLUGPROT, "%p OUT COhServNameSp::UnlockRequest (hr:%lx)\n",this, hr)); return hr; }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::COhServNameSp
//
// Synopsis:
//
// Arguments: (none)
//
// Returns:
//
// History: 1-27-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
COhServNameSp::COhServNameSp(REFCLSID rclsid, IUnknown *pUnkOuter, IUnknown **ppUnkInner) : CBaseProtocol(rclsid, pUnkOuter, ppUnkInner) { EProtDebugOut((DEB_PLUGPROT, "%p _IN/OUT COhServNameSp::COhServNameSp \n", this)); }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::~COhServNameSp
//
// Synopsis:
//
// Arguments: (none)
//
// Returns:
//
// History: 11-09-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
COhServNameSp::~COhServNameSp() {
EProtDebugOut((DEB_PLUGPROT, "%p _IN/OUT COhServNameSp::~COhServNameSp \n", this)); }
//+---------------------------------------------------------------------------
//
// Method: COhServNameSp::ParseAndStart
//
// Synopsis:
//
// Arguments: (none)
//
// Returns:
//
// History: 11-09-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COhServNameSp::ParseAndStart(BOOL fBind) { EProtDebugOut((DEB_PLUGPROT, "%p _IN COhServNameSp::ParseAndStart\n", this));
HRESULT hr = INET_E_USE_DEFAULT_PROTOCOLHANDLER;
WCHAR wzUrl[MAX_URL_SIZE];
LPWSTR pwzOhservHttp = L"http://ohserv"; LPWSTR pwzOhservFile = L"file://\\\\ohserv\\http"; LPWSTR pwzOhservRoot = L"\\\\ohserv\\http"; ULONG cServerLen = wcslen(pwzOhservHttp);
do { if ( wcsnicmp(_wzFullURL, pwzOhservHttp, cServerLen) ) { // not http://ohserv - return default error
break; }
// find the file name and path
LPWSTR pwzRest = _wzFullURL + cServerLen;
EProtAssert((pwzRest));
wcscpy(wzUrl, pwzOhservRoot); wcscat(wzUrl, pwzRest);
DWORD dwAttr = 0; { char szUrl[MAX_URL_SIZE]; W2A(wzUrl, szUrl, MAX_URL_SIZE);
dwAttr = GetFileAttributes(szUrl); }
if ( (dwAttr == 0xffffffff) || (dwAttr & FILE_ATTRIBUTE_DIRECTORY) ) { break; }
wcscpy(wzUrl, pwzOhservFile); wcscat(wzUrl, pwzRest);
// create an APP file
{ IClassFactory *pCF = 0; hr = CoCreateInstance(CLSID_FileProtocol, NULL, CLSCTX_INPROC_SERVER,IID_IClassFactory, (void**)&pCF); if (hr == NOERROR) { IUnknown *pUnk = 0; //IOInetProtocol *pProt = 0;
EProtAssert((pCF));
hr = pCF->CreateInstance((IOInetProtocol *)this, IID_IUnknown, (void **)&_pUnkInner);
if (hr == NOERROR) { EProtAssert((_pUnkInner)); hr = (_pUnkInner)->QueryInterface(IID_IOInetProtocol, (void **) &_pProt); }
// create an instance without aggregation
if (hr == CLASS_E_NOAGGREGATION) { hr = pCF->CreateInstance(NULL, IID_IOInetProtocol, (void **) &_pProt); }
pCF->Release();
{ hr = _pProt->Start(wzUrl, _pProtSink, _pOIBindInfo, _grfSTI, 0); }
if (hr != NOERROR) { hr = INET_E_USE_DEFAULT_PROTOCOLHANDLER; }
} }
break;
} while (1);
if (hr == MK_E_SYNTAX) { _pProtSink->ReportResult(hr, 0, 0); }
EProtDebugOut((DEB_PLUGPROT, "%p OUT COhServNameSp::ParseAndStart (hr:%lx)\n", this,hr)); return hr; }
|