Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

820 lines
20 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: agent.CXX
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 11-21-1996 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
#include <agent.h>
COInetAdvisor *g_pCOInetAdvisor = 0;
//+---------------------------------------------------------------------------
//
// Function: GetOInetAdvisor
//
// Synopsis:
//
// Arguments: [dwMode] --
// [ppOInetAdvisor] --
// [dwReserved] --
//
// Returns:
//
// History: 11-07-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
HRESULT GetOInetAdvisor(DWORD dwMode, IOInetAdvisor **ppOInetAdvisor, DWORD dwReserved)
{
HRESULT hr = NOERROR;
TransDebugOut((DEB_SESSION, "API _IN GetOInetAdvisor\n"));
TransAssert(( (ppOInetAdvisor != NULL) && (dwMode == 0) && (dwReserved == 0) && "Invalid argument"));
if (ppOInetAdvisor && !dwMode && !dwReserved)
{
/*
if (g_pCOInetAdvisor == 0)
{
g_pCOInetAdvisor = new COInetAdvisor();
}
if (g_pCOInetAdvisor)
{
g_pCOInetAdvisor->AddRef();
*ppOInetAdvisor = g_pCOInetAdvisor;
}
else
{
hr = E_OUTOFMEMORY;
}
*/
}
else
{
hr = E_INVALIDARG;
}
TransDebugOut((DEB_SESSION, "API OUT GetOInetAdvisor (hr:%lx) \n", hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetItem::QueryInterface
//
// Synopsis:
//
// Arguments: [riid] --
// [ppvObj] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetItem::QueryInterface(REFIID riid, void **ppvObj)
{
VDATEPTROUT(ppvObj, void *);
VDATETHIS(this);
HRESULT hr = NOERROR;
TransDebugOut((DEB_SESSION, "%p _IN COInetItem::QueryInterface\n", this));
*ppvObj = NULL;
if ((riid == IID_IUnknown) || (riid == IID_IOInetAdvisor) )
{
*ppvObj = this;
AddRef();
}
else
{
hr = E_NOINTERFACE;
}
TransDebugOut((DEB_SESSION, "%p OUT COInetItem::QueryInterface (hr:%lx\n", this,hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: COInetItem::AddRef
//
// Synopsis:
//
// Arguments: [ULONG] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) COInetItem::AddRef(void)
{
TransDebugOut((DEB_SESSION, "%p _IN COInetItem::AddRef\n", this));
LONG lRet = ++_CRefs;
TransDebugOut((DEB_SESSION, "%p OUT COInetItem::AddRef (cRefs:%ld)\n", this,lRet));
return lRet;
}
//+---------------------------------------------------------------------------
//
// Function: COInetItem::Release
//
// Synopsis:
//
// Arguments: [ULONG] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) COInetItem::Release(void)
{
TransDebugOut((DEB_SESSION, "%p _IN COInetItem::Release\n", this));
LONG lRet = --_CRefs;
if (_CRefs == 0)
{
//delete this;
}
TransDebugOut((DEB_SESSION, "%p OUT COInetItem::Release (cRefs:%ld)\n",this,lRet));
return lRet;
}
//+---------------------------------------------------------------------------
//
// Method: COInetItem::GetURL
//
// Synopsis:
//
// Arguments: [ppwzUrl] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetItem::GetURL(LPOLESTR *ppwzUrl)
{
TransDebugOut((DEB_PROT, "%p _IN COInetItem::GetURL\n", this));
HRESULT hr = E_FAIL;
TransDebugOut((DEB_PROT, "%p OUT COInetItem::GetURL (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetItem::GetInfo
//
// Synopsis:
//
// Arguments: [dwOptions] --
// [ppwzItemMime] --
// [pclsidItem] --
// [ppwzProtocol] --
// [pclsidProtocol] --
// [pdwOut] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetItem::GetInfo(
DWORD dwOptions,
LPOLESTR *ppwzItemMime,
LPCLSID *pclsidItem,
LPOLESTR *ppwzProtocol,
LPCLSID *pclsidProtocol,
DWORD *pdwOut
)
{
TransDebugOut((DEB_PROT, "%p _IN COInetItem::GetInfo\n", this));
HRESULT hr = E_FAIL;
TransDebugOut((DEB_PROT, "%p OUT COInetItem::GetInfo (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetItem::GetItemData
//
// Synopsis:
//
// Arguments: [ITEMDATA] --
// [pitemdata] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetItem::GetItemData(DWORD *grfITEMF,ITEMDATA * pitemdata)
{
TransDebugOut((DEB_PROT, "%p _IN COInetItem::GetItemData\n", this));
HRESULT hr = E_FAIL;
TransDebugOut((DEB_PROT, "%p OUT COInetItem::GetItemData (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetItemSink::QueryInterface
//
// Synopsis:
//
// Arguments: [riid] --
// [ppvObj] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetItemSink::QueryInterface(REFIID riid, void **ppvObj)
{
VDATEPTROUT(ppvObj, void *);
VDATETHIS(this);
HRESULT hr = NOERROR;
TransDebugOut((DEB_SESSION, "%p _IN COInetItemSink::QueryInterface\n", this));
*ppvObj = NULL;
if ((riid == IID_IUnknown) || (riid == IID_IOInetAdvisor) )
{
*ppvObj = this;
AddRef();
}
else
{
hr = E_NOINTERFACE;
}
TransDebugOut((DEB_SESSION, "%p OUT COInetItemSink::QueryInterface (hr:%lx\n", this,hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: COInetItemSink::AddRef
//
// Synopsis:
//
// Arguments: [ULONG] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) COInetItemSink::AddRef(void)
{
TransDebugOut((DEB_SESSION, "%p _IN COInetItemSink::AddRef\n", this));
LONG lRet = ++_CRefs;
TransDebugOut((DEB_SESSION, "%p OUT COInetItemSink::AddRef (cRefs:%ld)\n", this,lRet));
return lRet;
}
//+---------------------------------------------------------------------------
//
// Function: COInetItemSink::Release
//
// Synopsis:
//
// Arguments: [ULONG] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) COInetItemSink::Release(void)
{
TransDebugOut((DEB_SESSION, "%p _IN COInetItemSink::Release\n", this));
LONG lRet = --_CRefs;
if (_CRefs == 0)
{
//delete this;
}
TransDebugOut((DEB_SESSION, "%p OUT COInetItemSink::Release (cRefs:%ld)\n",this,lRet));
return lRet;
}
STDMETHODIMP COInetItemSink::OnItem(
ITEMTYPE itemtype,
IOInetItem *pWChkItem,
DWORD dwReserved
)
{
TransDebugOut((DEB_PROT, "%p _IN COInetItemSink::OnItem\n", this));
HRESULT hr = E_FAIL;
TransDebugOut((DEB_PROT, "%p OUT COInetItemSink::OnItem (hr:%lx)\n",this, hr));
return hr;
}
////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// Method: COInetAdvisor::QueryInterface
//
// Synopsis:
//
// Arguments: [riid] --
// [ppvObj] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetAdvisor::QueryInterface(REFIID riid, void **ppvObj)
{
VDATEPTROUT(ppvObj, void *);
VDATETHIS(this);
HRESULT hr = NOERROR;
TransDebugOut((DEB_SESSION, "%p _IN COInetAdvisor::QueryInterface\n", this));
*ppvObj = NULL;
if ((riid == IID_IUnknown) || (riid == IID_IOInetAdvisor) )
{
*ppvObj = this;
AddRef();
}
else
{
hr = E_NOINTERFACE;
}
TransDebugOut((DEB_SESSION, "%p OUT COInetAdvisor::QueryInterface (hr:%lx\n", this,hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: COInetAdvisor::AddRef
//
// Synopsis:
//
// Arguments: [ULONG] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) COInetAdvisor::AddRef(void)
{
TransDebugOut((DEB_SESSION, "%p _IN COInetAdvisor::AddRef\n", this));
LONG lRet = ++_CRefs;
TransDebugOut((DEB_SESSION, "%p OUT COInetAdvisor::AddRef (cRefs:%ld)\n", this,lRet));
return lRet;
}
//+---------------------------------------------------------------------------
//
// Function: COInetAdvisor::Release
//
// Synopsis:
//
// Arguments: [ULONG] --
//
// Returns:
//
// History: 11-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) COInetAdvisor::Release(void)
{
TransDebugOut((DEB_SESSION, "%p _IN COInetAdvisor::Release\n", this));
LONG lRet = --_CRefs;
if (_CRefs == 0)
{
// this is global
//delete this;
}
TransDebugOut((DEB_SESSION, "%p OUT COInetAdvisor::Release (cRefs:%ld)\n",this,lRet));
return lRet;
}
//+---------------------------------------------------------------------------
//
// Method: COInetAdvisor::StartListen
//
// Synopsis:
//
// Arguments: [szProtocol] --
// [pWChkItemSink] --
// [grfFilterMode] --
// [pclsidProtocol] --
// [dwReserved] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetAdvisor::StartListen(
const LPCWSTR szProtocol,
IOInetItemFilter *pWChkItemFilter,
DWORD grfFilterMode,
CLSID *pclsidProtocol,
DWORD dwReserved
)
{
TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::StartListen\n", this));
HRESULT hr = E_FAIL;
TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::StartListen (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetAdvisor::StopListen
//
// Synopsis: will release the sink passed in at StartListen
//
// Arguments: [pclsidProtocol] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetAdvisor::StopListen(CLSID *pclsidProtocol)
{
TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::StopListen\n", this));
HRESULT hr = E_FAIL;
TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::StopListen (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetAdvisor::Advise
//
// Synopsis:
//
// Arguments: [pWChkItemSink] --
// [grfMode] --
// [cMimes] --
// [ppwzItemMimes] --
// [dwReserved] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetAdvisor::Advise(IOInetItemSink *pWChkItemSink, DWORD grfMode, ULONG cMimes, const LPCWSTR *ppwzItemMimes, DWORD dwReserved)
{
TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::Advise\n", this));
HRESULT hr = NOERROR;
for (ULONG i = 0; i < cMimes; i++)
{
LPCWSTR pwzStr = *(ppwzItemMimes+i);
_AdvSinks.AddVal(pWChkItemSink, pwzStr);
}
TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::Advise (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetAdvisor::Unadvise
//
// Synopsis:
//
// Arguments: [pWChkItemSink] --
// [cMimes] --
// [ppwzItemMimes] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetAdvisor::Unadvise(IOInetItemSink *pWChkItemSink, ULONG cMimes, const LPCWSTR *ppwzItemMimes)
{
TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::Unadvise\n", this));
HRESULT hr = NOERROR;
for (ULONG i = 0; i < cMimes; i++)
{
LPCWSTR pwzStr = *(ppwzItemMimes+i);
_AdvSinks.RemoveVal(pWChkItemSink, pwzStr);
}
TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::Unadvise (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: COInetAdvisor::SendAdvise
//
// Synopsis:
//
// Arguments: [itemtype] --
// [pWChkItem] --
// [grfMode] --
// [pwzItemMimes] --
// [dwReserved] --
//
// Returns:
//
// History: 12-02-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP COInetAdvisor::SendAdvise(
ITEMTYPE itemtype,
IOInetItem * pWChkItem,
DWORD grfMode,
LPCWSTR pwzItemMimes,
DWORD dwReserved
)
{
TransDebugOut((DEB_PROT, "%p _IN COInetAdvisor::SendAdvise\n", this));
HRESULT hr;
HRESULT hr1 = E_FAIL;
IOInetItemSink *pWChkItemSink = 0;
hr = _AdvSinks.FindFirst(pwzItemMimes, (IUnknown **)&pWChkItemSink);
if (hr == NOERROR)
{
do
{
hr1 = pWChkItemSink->OnItem(itemtype, pWChkItem, 0);
pWChkItemSink->Release();
pWChkItemSink = 0;
hr = _AdvSinks.FindNext(pwzItemMimes, (IUnknown **)&pWChkItemSink);
} while (hr == NOERROR);
}
TransDebugOut((DEB_PROT, "%p OUT COInetAdvisor::SendAdvise (hr:%lx)\n",this, hr1));
return hr1;
}
//+---------------------------------------------------------------------------
//
// Method: CMapStrToXVal::AddVal
//
// Synopsis:
//
// Arguments: [LPCWSTR] --
// [ULONG] --
// [cNames] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CMapStrToXVal::AddVal(IUnknown *pUnk, LPCWSTR pwzName)
{
TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::AddVal\n", this));
HRESULT hr = NOERROR;
TransAssert((pUnk && pwzName));
CLock lck(_mxs);
CXUnknown cunk = pUnk;
if (pUnk && pwzName)
{
CProtNode *pNode;
CKey ckey = pwzName;
if (_Map.Lookup(ckey, (CObject *&)pNode) )
{
pNode->Add(pUnk);
}
else
{
pNode = new CProtNode(pUnk);
if (pNode)
{
_Map.SetAt(ckey, pNode);
_cElements++;
}
else
{
hr = E_OUTOFMEMORY;
}
}
}
else
{
hr = E_INVALIDARG;
}
TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::AddVal (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: CMapStrToXVal::RemoveVal
//
// Synopsis:
//
// Arguments: [pUnk] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CMapStrToXVal::RemoveVal(IUnknown *pUnk,LPCWSTR pwzName)
{
TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::RemoveVal\n", this));
HRESULT hr = NOERROR;
CLock lck(_mxs);
if (pUnk && pwzName)
{
CProtNode *pNode;
CKey ckey = pwzName;
if (_Map.Lookup(ckey, (CObject *&)pNode) )
{
pNode->Remove(pUnk);
}
}
else
{
hr = E_INVALIDARG;
}
TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::RemoveVal (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: CMapStrToXVal::FindFirst
//
// Synopsis:
//
// Arguments: [pwzName] --
// [ppUnk] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CMapStrToXVal::FindFirst(LPCWSTR pwzName, IUnknown **ppUnk)
{
TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::FindFirst\n", this));
HRESULT hr = E_FAIL;
CLock lck(_mxs);
TransAssert(( pwzName && ppUnk));
if (_cElements)
{
CProtNode *pNode;
CKey ckey = pwzName;
if ( (_Map.Lookup(ckey, (CObject *&)pNode) )
&& (pNode->FindFirst(*ppUnk)) )
{
hr = NOERROR;
}
}
TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::FindFirst (hr:%lx)\n",this, hr));
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: CMapStrToXVal::FindNext
//
// Synopsis:
//
// Arguments: [pwzName] --
// [ppUnk] --
//
// Returns:
//
// History: 10-29-1996 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CMapStrToXVal::FindNext(LPCWSTR pwzName, IUnknown **ppUnk)
{
TransDebugOut((DEB_PROT, "%p _IN CMapStrToXVal::FindNext\n", this));
HRESULT hr = E_FAIL;
CLock lck(_mxs);
TransAssert(( pwzName && ppUnk));
if (_cElements)
{
CProtNode *pNode;
CKey ckey = pwzName;
if ( (_Map.Lookup(ckey, (CObject *&)pNode) )
&& (pNode->FindNext(*ppUnk)) )
{
hr = NOERROR;
}
}
TransDebugOut((DEB_PROT, "%p OUT CMapStrToXVal::FindNext (hr:%lx)\n",this, hr));
return hr;
}