Windows2003-3790/inetcore/urlmon/eapp/nspohsrv.cxx
2020-09-30 16:53:55 +02:00

406 lines
10 KiB
C++

//+---------------------------------------------------------------------------
//
// 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;
}