//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: agent.CXX // // Contents: // // Classes: // // Functions: // // History: 11-21-1996 JohannP (Johann Posch) Created // //---------------------------------------------------------------------------- #include 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; }