sdidde.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #pragma data_seg("_DATA")
  36. #include "hxtypes.h"
  37. #include <windows.h>
  38. #include <ddeml.h>
  39. #include "sdidde.h"
  40. #include "hxwinver.h"
  41. #include "hxassert.h" // needed for HX_TRACE and HX_ASSERT stuff...
  42. #include "hxheap.h"
  43. #ifdef _DEBUG
  44. #undef HX_THIS_FILE
  45. static const char HX_THIS_FILE[] = __FILE__;
  46. #endif
  47. // These SPI_ flags are defined MSDEV 6.0 only when WINVER >= 0x0500
  48. // see windows.h for details on when WINVER is set to >= 0x0500
  49. #ifndef SPI_GETFOREGROUNDLOCKTIMEOUT
  50. #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000
  51. #endif /* SPI_GETFOREGROUNDLOCKTIMEOUT */
  52. #ifndef SPI_SETFOREGROUNDLOCKTIMEOUT
  53. #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001
  54. #endif /* SPI_SETFOREGROUNDLOCKTIMEOUT */
  55. DWORD     g_dwIdInst = 0; // DDE Instance information
  56. DWORD     g_dwNumInstances = 0;
  57. HSZ     g_hszWWWService = NULL;
  58. typedef struct 
  59. {
  60.     const char* szDDEName;
  61.     const char* szFileName;
  62. } DDE_Browsers;
  63. DDE_Browsers g_BrowsersSupportingDDE[] = 
  64. {
  65.     { "IEXPLORE", "iexplore.exe" },
  66.     { "NETSCAPE", "netscape.exe" },
  67.     { "OPERA",    "opera.exe"  },
  68.     { "MOSAIC",   "mosaic.exe"  }  
  69. };
  70. HDDEDATA HXEXPORT DdeCallback
  71. (
  72.     UINT uType, // transaction type
  73.     UINT uFmt, // clipboard data format
  74.     HCONV hconv, // handle of the conversation
  75.     HSZ hsz1, // handle of a string
  76.     HSZ hsz2, // handle of a string
  77.     HDDEDATA hdata, // handle of a global memory object
  78.     DWORD dwData1, // transaction-specific data
  79.     DWORD dwData2  // transaction-specific data
  80. )
  81. {
  82.     return 0;
  83. }
  84. void DDEInit(IHXPreferences* pPreferences)
  85. {
  86.     return;
  87. }
  88. BOOL DDEStartup()
  89. {
  90.     HX_TRACE("DDEStartup()rn");
  91.     HX_ASSERT(g_dwNumInstances == 0 || g_dwIdInst);
  92.     if (g_dwIdInst > 0)
  93.     {
  94. goto exit;
  95.     }
  96.     if (DMLERR_NO_ERROR != DdeInitialize(&g_dwIdInst, DdeCallback, CBF_SKIP_ALLNOTIFICATIONS, 0))
  97.     {
  98. return FALSE;
  99.     }
  100. exit:
  101.     g_dwNumInstances++;    
  102.     return TRUE;
  103. }
  104. void DDEShutdown()
  105. {
  106.     HX_TRACE("DDEShutdown()rn");
  107.     HX_ASSERT(g_dwNumInstances > 0 && g_dwIdInst);
  108.     if (g_dwNumInstances > 0)
  109.     {
  110. g_dwNumInstances--;
  111.     }
  112.     if (g_dwNumInstances == 0 && g_dwIdInst)
  113.     {
  114. if (g_hszWWWService)
  115. {
  116.     DdeFreeStringHandle(g_dwIdInst, g_hszWWWService);
  117.     g_hszWWWService = NULL;
  118. }
  119. DdeUninitialize(g_dwIdInst);
  120. g_dwIdInst = NULL;
  121.     }
  122. }
  123. BOOL BrowserOpenURL(const char* pszUrl, const char* pszTarget, const char* pszDefBrowser) 
  124. {
  125.     HX_TRACE("BrowserOpenURL()rn");
  126.     BOOL result = TRUE;
  127.     DWORD dwResult = 0;
  128.     HDDEDATA hOpenRetVal = NULL;
  129.     HSZ hszOpenTopic = NULL;
  130.     HSZ hszOpenItem = NULL;
  131.     HCONV hOpenConv = NULL;
  132.     HDDEDATA hActivateRetVal = NULL;
  133.     HSZ hszActivateTopic = NULL;
  134.     HSZ hszActivateItem = NULL;
  135.     HCONV hActivateConv = NULL;
  136.     UINT16 i = 0;
  137.     UINT16 nNumberOfBrowsers = 0;
  138.     char* pMessage = NULL;
  139.     DWORD dwWindowID = 0xFFFFFFFF;     // -1 = last active window
  140.     DWORD dwLockTimeout = 0;
  141.     BOOL bForceBroswserToForeground = FALSE;
  142.     HXVERSIONINFO versionInfo;
  143.     if (!pszUrl)
  144.     {
  145. result = FALSE;
  146. goto cleanup;
  147.     }
  148.     pMessage = new char[strlen(pszUrl)+48];
  149.     if (!pMessage)
  150.     {
  151. result = FALSE;
  152. goto cleanup;
  153.     }
  154.     ZeroInit(&versionInfo);
  155.     HXGetWinVer(&versionInfo);
  156.     bForceBroswserToForeground = ((versionInfo.dwPlatformId == HX_PLATFORM_WIN98) || (versionInfo.dwPlatformId == HX_PLATFORM_WINNT && versionInfo.wMajorVersion > 4));
  157.     
  158.     DDEStartup();
  159.     // establish browser
  160.     if (NULL == g_hszWWWService)
  161.     {
  162. hszOpenTopic = DdeCreateStringHandle(g_dwIdInst, "WWW_OpenURL", CP_WINANSI);
  163. if (hszOpenTopic)
  164. {
  165.     nNumberOfBrowsers = sizeof(g_BrowsersSupportingDDE)/sizeof(DDE_Browsers);
  166.     // Look for a browser that supports DDE???
  167.     while (i < nNumberOfBrowsers)
  168.     {
  169. g_hszWWWService = DdeCreateStringHandle(g_dwIdInst,
  170.         g_BrowsersSupportingDDE[i].szDDEName,
  171. CP_WINANSI);
  172. hOpenConv = DdeConnect(g_dwIdInst, g_hszWWWService, hszOpenTopic, NULL);
  173. if (hOpenConv)
  174. {
  175.     break;
  176. }
  177. if(g_hszWWWService)
  178. {
  179.     DdeFreeStringHandle(g_dwIdInst, g_hszWWWService);
  180.     g_hszWWWService = NULL;  
  181. }
  182. i++;
  183.     }
  184. }
  185. if (NULL == g_hszWWWService)
  186. {
  187.     result = FALSE;
  188.     goto cleanup;
  189. }
  190.     }
  191.     else
  192.     {
  193. hszOpenTopic = DdeCreateStringHandle(g_dwIdInst,"WWW_OpenURL", CP_WINANSI);
  194. hOpenConv = DdeConnect(g_dwIdInst, g_hszWWWService, hszOpenTopic, NULL);
  195.     }
  196.     if (!hOpenConv)
  197.     {
  198. HX_TRACE("Conversation failed to start...rn");
  199. DdeFreeStringHandle(g_dwIdInst, g_hszWWWService);
  200. g_hszWWWService = NULL;
  201. result = FALSE;
  202. goto cleanup;
  203.     }
  204.     wsprintf(pMessage,""%s",,%lu,0,,,,", pszUrl, dwWindowID); 
  205.     hszOpenItem = DdeCreateStringHandle(g_dwIdInst, pMessage, CP_WINANSI);
  206.     HX_TRACE("Conversation started, sending URL command...rn");
  207.     // Request
  208.     hOpenRetVal = DdeClientTransaction(NULL, 0, hOpenConv, hszOpenItem, CF_TEXT, XTYP_REQUEST, 60000, NULL);
  209.     if (DDE_FNOTPROCESSED != hOpenRetVal)
  210.     {
  211. DdeGetData(hOpenRetVal, (LPBYTE)&dwResult, sizeof(dwResult), 0);
  212. if (!dwResult)
  213. {
  214.     result = FALSE;
  215.     goto cleanup;
  216. }
  217.     }
  218.     // force the browser to the foreground then do it here.  This does not actually put the browser
  219.     // in the foreground instead it enables the browser's call to SetForegroundWindow to bring the window to the
  220.     // front instead of flashing it on the taskbar
  221.     if (bForceBroswserToForeground)
  222.     {
  223. // These are new flags that work on Win98 and WinNT5 ONLY.  First get the current foreground lock timeout and save
  224. // it off and then set it to 0.
  225. ::SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,&dwLockTimeout,0);
  226. ::SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,0);
  227.     }
  228.     // activate the browser
  229.     wsprintf(pMessage, "%lu,0", dwWindowID); 
  230.     hszActivateItem = DdeCreateStringHandle(g_dwIdInst, pMessage, CP_WINANSI);
  231.     hszActivateTopic = DdeCreateStringHandle(g_dwIdInst,"WWW_Activate", CP_WINANSI);
  232.     // Connect to server
  233.     if (hszActivateTopic && hszActivateItem)
  234.     {
  235. hActivateConv = DdeConnect(g_dwIdInst, g_hszWWWService, hszActivateTopic, NULL);
  236. if (hActivateConv)
  237. {
  238.     hActivateRetVal = DdeClientTransaction(NULL, 0, hActivateConv, hszActivateItem, CF_TEXT, XTYP_REQUEST, 10000, NULL);
  239. }
  240.     }
  241.     if (bForceBroswserToForeground)
  242.     {
  243. // Restore the old foreground lock timeout
  244. ::SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,(PVOID)dwLockTimeout,0);
  245.     }
  246. cleanup:
  247.     if (hOpenRetVal)
  248. DdeFreeDataHandle(hOpenRetVal);
  249.     if (hActivateRetVal)
  250. DdeFreeDataHandle(hActivateRetVal);
  251.     if (hszOpenTopic)
  252. DdeFreeStringHandle(g_dwIdInst, hszOpenTopic);    
  253.     if (hszActivateTopic)
  254. DdeFreeStringHandle(g_dwIdInst, hszActivateTopic);    
  255.     if (hszOpenItem)    
  256. DdeFreeStringHandle(g_dwIdInst, hszOpenItem);
  257.     if (hszActivateItem)    
  258. DdeFreeStringHandle(g_dwIdInst, hszActivateItem);
  259.     if (hOpenConv)
  260. DdeDisconnect(hOpenConv);
  261.     if (hActivateConv)
  262. DdeDisconnect(hActivateConv);
  263.     HX_VECTOR_DELETE(pMessage);
  264.     
  265.     DDEShutdown();
  266.     return result;
  267. }