windows-nt/Source/XPSP1/NT/shell/shell32/unicpp/dsubscri.cpp
2020-09-26 16:20:57 +08:00

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