cdfsubs.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 4k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include <stdio.h>
  4. #include <memory.h>
  5. #include <subsmgr.h>
  6. #include <mstask.h>
  7. #include <wininet.h>
  8. #include "cdfsubs.hpp"
  9. // CDFAutoSubscribe
  10. //
  11. // Create the cache entry and subscribe to the channel.
  12. //
  13. // BUGBUG: Right now, if you create the cache entry for the CDF, subscribing
  14. // to the channel doesn't work properly. Updating the channel will fail.
  15. //
  16. BOOL WINAPI CDFAutoSubscribe(HWND hwnd, LPSTR szFriendlyName, LPSTR szCDFUrl,
  17.                              LPSTR szCDFFilePath, BOOL bSilent)
  18. {
  19.     BOOL                   bRet = FALSE;
  20.     if (CreateCDFCacheEntry(szCDFUrl, szCDFFilePath)) {
  21.         if (SubscribeChannel(hwnd, szFriendlyName, szCDFUrl, bSilent)) {
  22.             bRet = TRUE;
  23.         }
  24.     }
  25.     return bRet;
  26. }
  27. //
  28. // CreateCDFCacheEntry
  29. //
  30. BOOL CreateCDFCacheEntry(LPSTR szCDFUrl, LPSTR szLocalFileName)
  31. {
  32.     BOOL                           bRet;
  33.     FILETIME                       ftExpireTime;
  34.     FILETIME                       ftLastMod;
  35.     TCHAR                          achFileName[MAX_PATH];
  36.     bRet = FALSE;
  37.     GetSystemTimeAsFileTime(&ftLastMod);
  38.     ftExpireTime.dwLowDateTime = (DWORD)0;
  39.     ftExpireTime.dwHighDateTime = (DWORD)0;
  40.     if (CreateUrlCacheEntry(szCDFUrl, 0, NULL, achFileName, 0)) {
  41.         CopyFile(szLocalFileName, achFileName, FALSE);
  42.         if (CommitUrlCacheEntry(szCDFUrl, achFileName, ftExpireTime,
  43.                                 ftLastMod, 0, NULL, 0, NULL, 0)) {
  44.             bRet = TRUE;
  45.         }
  46.     }
  47.     return bRet;
  48. }
  49. //
  50. // SubscribeChannel
  51. //
  52. BOOL SubscribeChannel(HWND hwnd, LPSTR szName, LPSTR szURL, BOOL bSilent)
  53. {
  54.     ISubscriptionMgr              *pISubscriptionMgr = NULL;
  55.     DWORD                          dwFlags = 0;
  56.     BOOL                           bRet = FALSE;
  57.     HRESULT                        hr = S_OK;
  58.     SUBSCRIPTIONTYPE               subsType = SUBSTYPE_CHANNEL;
  59.     SUBSCRIPTIONINFO               subsInfo;
  60.     LPWSTR                         wzName = NULL;
  61.     LPWSTR                         wzURL = NULL;
  62.     if (FAILED(Ansi2Unicode(szName, &wzName))) {
  63.         goto Exit;
  64.     }
  65.     if (FAILED(Ansi2Unicode(szURL, &wzURL))) {
  66.         goto Exit;
  67.     }
  68.     hr = CoCreateInstance(CLSID_SubscriptionMgr, NULL, CLSCTX_INPROC_SERVER,
  69.                           IID_ISubscriptionMgr, (void **)&pISubscriptionMgr);
  70.     if (FAILED(hr)) {
  71.         goto Exit;
  72.     }
  73.                           
  74.     ZeroMemory(&subsInfo, sizeof(SUBSCRIPTIONINFO));
  75.     subsInfo.cbSize = sizeof(SUBSCRIPTIONINFO);
  76.     subsInfo.fUpdateFlags = SUBSINFO_CHANNELFLAGS | SUBSINFO_TASKFLAGS | SUBSINFO_GLEAM;
  77.     subsInfo.bGleam = TRUE;
  78.     subsInfo.fChannelFlags |= CHANNEL_AGENT_PRECACHE_ALL |
  79.                               CHANNEL_AGENT_DYNAMIC_SCHEDULE;
  80.     subsInfo.fTaskFlags = TASK_FLAG_START_ONLY_IF_IDLE | 
  81.                           TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET;
  82.     
  83.     dwFlags = CREATESUBS_ADDTOFAVORITES | CREATESUBS_SOFTWAREUPDATE;
  84.     if (bSilent) {
  85.         dwFlags |= CREATESUBS_NOUI;
  86.     }
  87.     hr = pISubscriptionMgr->CreateSubscription(hwnd, wzURL, wzName,
  88.                                                dwFlags, subsType, &subsInfo);
  89.     if (hr == S_OK) {
  90.         bRet = TRUE;
  91.     }
  92.     pISubscriptionMgr->Release();
  93. Exit:
  94.     if (wzName) {
  95.         delete wzName;
  96.     }
  97.     if (wzURL) {
  98.         delete wzURL;
  99.     }
  100.     return bRet;
  101. }
  102. // Ansi2Unicode: Convert ANSI strings to Unicode
  103. // Ripped from urlmondownloadhelpers.cxx
  104. HRESULT Ansi2Unicode(const char * src, wchar_t **dest)
  105. {
  106.     if ((src == NULL) || (dest == NULL))
  107.         return E_INVALIDARG;
  108.     // find out required buffer size and allocate it
  109.     int len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, -1, NULL, 0);
  110.     *dest = new WCHAR [len*sizeof(WCHAR)];
  111.     if (!*dest)
  112.         return E_OUTOFMEMORY;
  113.     // Do the actual conversion.
  114.     if ((MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, -1, *dest, 
  115.                                                     len*sizeof(wchar_t))) != 0)
  116.         return S_OK; 
  117.     else
  118.         return E_FAIL;
  119. }