190 lines
4.9 KiB
C++
190 lines
4.9 KiB
C++
|
#include "stdafx.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
// This function checks if a given URL already has a subscription.
|
||
|
// Returns TRUE: if it aleady has a subscription
|
||
|
// FALSE: Otherwise.
|
||
|
//
|
||
|
BOOL CheckForExistingSubscription(LPCTSTR lpcszURL)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
ISubscriptionMgr *psm;
|
||
|
BOOL fRet = FALSE; //Assume failure.
|
||
|
|
||
|
//Create the subscription Manager.
|
||
|
hr = CoCreateInstance(CLSID_SubscriptionMgr, NULL,
|
||
|
CLSCTX_INPROC_SERVER,
|
||
|
IID_ISubscriptionMgr,
|
||
|
(void**)&psm);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
BSTR bstrURL = SysAllocStringT(lpcszURL);
|
||
|
if (bstrURL)
|
||
|
{
|
||
|
psm->IsSubscribed(bstrURL, &fRet);
|
||
|
SysFreeString(bstrURL);
|
||
|
}
|
||
|
|
||
|
psm->Release();
|
||
|
}
|
||
|
|
||
|
return(fRet);
|
||
|
}
|
||
|
|
||
|
BOOL DeleteFromSubscriptionList(LPCTSTR pszURL)
|
||
|
{
|
||
|
BOOL fRet = FALSE;
|
||
|
HRESULT hr;
|
||
|
ISubscriptionMgr *psm;
|
||
|
|
||
|
hr = CoCreateInstance(CLSID_SubscriptionMgr, NULL,
|
||
|
CLSCTX_INPROC_SERVER,
|
||
|
IID_ISubscriptionMgr,
|
||
|
(void**)&psm);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
BSTR bstrURL = SysAllocStringT(pszURL); // Call TSTR version
|
||
|
if (bstrURL)
|
||
|
{
|
||
|
// Looks like all code paths going through this has already
|
||
|
// put up some UI.
|
||
|
if (SUCCEEDED(psm->DeleteSubscription(bstrURL, NULL)))
|
||
|
{
|
||
|
fRet = TRUE;
|
||
|
}
|
||
|
|
||
|
SysFreeString(bstrURL);
|
||
|
}
|
||
|
|
||
|
psm->Release();
|
||
|
}
|
||
|
|
||
|
return(fRet);
|
||
|
}
|
||
|
|
||
|
BOOL UpdateSubscription(LPCTSTR pszURL)
|
||
|
{
|
||
|
BOOL fRet = FALSE;
|
||
|
HRESULT hr;
|
||
|
ISubscriptionMgr *psm;
|
||
|
|
||
|
hr = CoCreateInstance(CLSID_SubscriptionMgr, NULL,
|
||
|
CLSCTX_INPROC_SERVER,
|
||
|
IID_ISubscriptionMgr,
|
||
|
(void**)&psm);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
BSTR bstrURL = SysAllocStringT(pszURL); // Call TSTR version
|
||
|
if (bstrURL)
|
||
|
{
|
||
|
if (SUCCEEDED(psm->UpdateSubscription(bstrURL)))
|
||
|
{
|
||
|
fRet = TRUE;
|
||
|
}
|
||
|
|
||
|
SysFreeString(bstrURL);
|
||
|
}
|
||
|
|
||
|
psm->Release();
|
||
|
}
|
||
|
|
||
|
return(fRet);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
// This function enumerates the URLs of all the desktop components and then
|
||
|
// calls webcheck to see if they are subcribed to and if so asks webcheck to
|
||
|
// deliver those subscriptions right now.
|
||
|
//
|
||
|
//
|
||
|
|
||
|
BOOL UpdateAllDesktopSubscriptions(IADesktopP2 *padp2)
|
||
|
{
|
||
|
IActiveDesktop *pActiveDesktop;
|
||
|
ISubscriptionMgr *psm;
|
||
|
int iCount; //Count of components.
|
||
|
HRESULT hres;
|
||
|
BOOL fRet = TRUE; //Assume success!
|
||
|
|
||
|
if(padp2 == NULL) //Are we provided a pointer already?
|
||
|
{
|
||
|
if(FAILED(hres = CActiveDesktop_InternalCreateInstance((LPUNKNOWN *)&pActiveDesktop, IID_IActiveDesktop)))
|
||
|
{
|
||
|
TraceMsg(TF_WARNING, "Could not instantiate CActiveDesktop COM object");
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(FAILED(hres = (padp2->QueryInterface(IID_PPV_ARG(IActiveDesktop, &pActiveDesktop)))))
|
||
|
{
|
||
|
TraceMsg(TF_WARNING, "Could not get IActiveDesktop * from IADesktopP2 *");
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pActiveDesktop->GetDesktopItemCount(&iCount, 0);
|
||
|
|
||
|
if(iCount <= 0)
|
||
|
{
|
||
|
TraceMsg(DM_TRACE, "No desktop components to update!");
|
||
|
return TRUE; //No components to enumerate!
|
||
|
}
|
||
|
|
||
|
//Create the subscription Manager.
|
||
|
hres = CoCreateInstance(CLSID_SubscriptionMgr, NULL,
|
||
|
CLSCTX_INPROC_SERVER,
|
||
|
IID_ISubscriptionMgr,
|
||
|
(void**)&psm);
|
||
|
|
||
|
if(SUCCEEDED(hres))
|
||
|
{
|
||
|
int iIndex;
|
||
|
BSTR bstrURL;
|
||
|
|
||
|
//Enumerate the desktop components one by one.
|
||
|
for(iIndex = 0; iIndex < iCount; iIndex++)
|
||
|
{
|
||
|
COMPONENT Comp; //We are using the public structure here.
|
||
|
|
||
|
Comp.dwSize = sizeof(COMPONENT);
|
||
|
if(SUCCEEDED(pActiveDesktop->GetDesktopItem(iIndex, &Comp, 0)) &&
|
||
|
Comp.fChecked) //Is this component enabled?
|
||
|
{
|
||
|
BOOL fSubscribed;
|
||
|
|
||
|
fSubscribed = FALSE; //Assume that it is NOT subscribed!
|
||
|
|
||
|
bstrURL = SysAllocString(Comp.wszSubscribedURL);
|
||
|
if(!bstrURL)
|
||
|
{
|
||
|
fRet = FALSE;
|
||
|
break; //Out of memory!
|
||
|
}
|
||
|
|
||
|
psm->IsSubscribed(bstrURL, &fSubscribed);
|
||
|
|
||
|
if(fSubscribed)
|
||
|
psm->UpdateSubscription(bstrURL);
|
||
|
|
||
|
SysFreeString(bstrURL);
|
||
|
}
|
||
|
else
|
||
|
TraceMsg(TF_WARNING, "Component# %d either failed or not enabled!", iIndex);
|
||
|
}
|
||
|
psm->Release();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TraceMsg(TF_WARNING, "Could not create CLSID_SubscriptionMgr");
|
||
|
}
|
||
|
|
||
|
pActiveDesktop->Release();
|
||
|
|
||
|
return fRet;
|
||
|
}
|