hxhypnv.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:16k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxhypnv.cpp,v 1.8.20.2 2004/07/09 02:05:46 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include <stdio.h>
  50. #include "hxtypes.h"
  51. #include "hxresult.h"
  52. #include "hxcom.h"
  53. #include "hxprefs.h"
  54. #include "hxhyper.h"
  55. #include "hxtick.h"
  56. #include "hxstrutl.h"
  57. #include "ihxpckts.h"
  58. #include "hxhypnv.h"
  59. #include "hxurlwrp.h"
  60. #include "hxurl.h"
  61. #if defined (_WIN16)
  62. #include <stdlib.h>
  63. #include <windows.h>
  64. #include <shellapi.h>
  65. #endif
  66. #if (defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)
  67. #include <ddeml.h>
  68. #include "platform/win/sdidde.h"
  69. BOOL CALLBACK FindAOLWindowProc(HWND hwnd, LPARAM lParam);
  70. #endif /*(defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)*/
  71. #include "dbcs.h" // needed for DBCS-relative string-processing functions
  72. #if defined(_UNIX) && !defined(_VXWORKS) && !defined(_MAC_UNIX)
  73. #include "unix_hurl.h"
  74. #endif
  75. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  76. #include "platform/mac/hurl.h"
  77. #endif
  78. #include "hxheap.h"
  79. #ifdef _DEBUG
  80. #undef HX_THIS_FILE
  81. static const char HX_THIS_FILE[] = __FILE__;
  82. #endif
  83. // amount of time to wait before trying to launch a browser with the same URL as
  84. // the previous launch. Used in GoToURL to prevent the case where double-clicking
  85. // calls GoToURL() twice, with the 2nd call launching a browser to the same URL while
  86. // the first is still launching
  87. #define MILLISEC_BETWEEN_BROWSER_LAUNCH 2000
  88. #define _MAX_AOL_HURL_URL_SIZE 124
  89. /****************************************************************************
  90.  *
  91.  *  Interface:
  92.  *
  93.  * HXHyperNavigate
  94.  *
  95.  *  Purpose:
  96.  *
  97.  * TBD
  98.  *
  99.  *  IID_IHXHyperNavigate:
  100.  *
  101.  * {00000900-61DF-11d0-9CEE-080017035B43}
  102.  *
  103.  */
  104. HXHyperNavigate::HXHyperNavigate() :
  105.       m_lRefCount(0)
  106.     , m_pPreferences(0)
  107.     , m_bInitialized(FALSE)
  108.     , m_pLastURL(NULL)
  109.     , m_nLastLaunchTime(0)
  110.     , m_bKeepTargetBehind(FALSE)
  111. {
  112. #if (defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)
  113.     DDEStartup();
  114. #endif /*(defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)*/
  115. }
  116. HXHyperNavigate::~HXHyperNavigate()
  117. {
  118. #if (defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)
  119.     DDEShutdown();
  120. #endif /*(defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)*/
  121.     HX_RELEASE(m_pPreferences);
  122.     HX_VECTOR_DELETE(m_pLastURL);
  123. }
  124. /////////////////////////////////////////////////////////////////////////
  125. // Method:
  126. // IUnknown::QueryInterface
  127. // Purpose:
  128. // Implement this to export the interfaces supported by your
  129. // object.
  130. //
  131. STDMETHODIMP HXHyperNavigate::QueryInterface(REFIID riid, void** ppvObj)
  132. {
  133.     QInterfaceList qiList[] =
  134.         {
  135.             { GET_IIDHANDLE(IID_IHXHyperNavigate), (IHXHyperNavigate*)this },
  136.             { GET_IIDHANDLE(IID_IHXHyperNavigate2), (IHXHyperNavigate2*)this },
  137.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXHyperNavigate*)this },
  138.         };
  139.     
  140.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  141. }
  142. /////////////////////////////////////////////////////////////////////////
  143. // Method:
  144. // IUnknown::AddRef
  145. // Purpose:
  146. // Everyone usually implements this the same... feel free to use
  147. // this implementation.
  148. //
  149. STDMETHODIMP_(ULONG32) HXHyperNavigate::AddRef()
  150. {
  151.     return InterlockedIncrement(&m_lRefCount);
  152. }
  153. /////////////////////////////////////////////////////////////////////////
  154. // Method:
  155. // IUnknown::Release
  156. // Purpose:
  157. // Everyone usually implements this the same... feel free to use
  158. // this implementation.
  159. //
  160. STDMETHODIMP_(ULONG32) HXHyperNavigate::Release()
  161. {
  162.     if (InterlockedDecrement(&m_lRefCount) > 0)
  163.     {
  164. return m_lRefCount;
  165.     }
  166.     
  167.     delete this;
  168.     return 0;
  169. }
  170. STDMETHODIMP HXHyperNavigate::Init(IUnknown* pContext)
  171. {
  172.     if (!pContext)
  173.     {
  174. return HXR_UNEXPECTED;
  175.     }
  176.     IHXPreferences* pPreferences = 0;
  177.     if (pContext->QueryInterface(IID_IHXPreferences, (void**) &pPreferences) != HXR_OK)
  178.     {
  179. return HXR_UNEXPECTED;
  180.     }
  181.     if (m_pPreferences)
  182.     {
  183. m_pPreferences->Release();
  184. m_pPreferences = 0;
  185.     }
  186.     m_pPreferences = pPreferences;
  187. #if (defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)
  188.     DDEInit(m_pPreferences);
  189. #endif /*(defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)*/
  190. #if defined(_UNIX) && !defined(_VXWORKS) && !defined(_MAC_UNIX)
  191.     StartHurlListener();
  192. #endif /* _UNIX */
  193.     m_bInitialized = TRUE;
  194.     return HXR_OK;
  195. }
  196. /*
  197.  * IHXHyperNavigate methods
  198.  */
  199. /************************************************************************
  200.  * Method:
  201.  *     IHXHyperNavigate::GoToURL
  202.  * Purpose:
  203.  *     Performs a simple Go To URL operation.
  204.  */
  205. STDMETHODIMP HXHyperNavigate::GoToURL( const char* pURL,
  206. const char* pTarget)
  207. {    
  208.     if (!m_bInitialized)
  209.     {
  210. return HXR_NOT_INITIALIZED;
  211.     }
  212.     if ((pURL == NULL) ||
  213. (pTarget && (stricmp(pTarget, "_player") == 0)) ||
  214. (strnicmp(pURL, URL_COMMAND, sizeof(URL_COMMAND) - 1) == 0))
  215.     {
  216. return HXR_NOTIMPL;
  217.     }
  218.     UINT32 nCurrentTime = HX_GET_TICKCOUNT();
  219.     // if user recently launched browser with same URL, then don't launch browser again..
  220.     // Prevents case of double-clicking causing 2 browser launches, when second
  221.     // click happens before first browser is up.
  222.     if  ( m_pLastURL!=NULL && strcmp(pURL,m_pLastURL)==0 &&
  223.        CALCULATE_ELAPSED_TICKS(m_nLastLaunchTime,nCurrentTime)<MILLISEC_BETWEEN_BROWSER_LAUNCH)
  224. return HXR_OK;
  225.     CHXString encodedURL;
  226.     if (strncasecmp(pURL, "http:", 5) == 0)
  227.     {
  228. CHXURL::encodeURL(pURL, encodedURL);
  229. pURL = (const char*) encodedURL;
  230.     }
  231.     // note when we last attempted a browser launch (no puns please)
  232.     m_nLastLaunchTime = nCurrentTime;
  233.     HX_VECTOR_DELETE(m_pLastURL);
  234.     // save the URL we are going to launch..
  235.     m_pLastURL = new char[strlen(pURL)+1];
  236.     strcpy(m_pLastURL,pURL); /* Flawfinder: ignore */
  237.     CHXURL url(pURL);
  238.     pURL = url.GetURL();   // will do compression of ../../, if so required
  239. #ifndef _MACINTOSH
  240.     // GR 7/13/01 -  We don't need to wrap on the Mac since the URL length
  241.     // limition for hurling doesn't apply, and we don't want to wrap since 
  242.     // local file URLs under Mac OS X do not begin file:///Hard Drive/...
  243.     
  244.     CHXString strHtmlFile;
  245.     if (strlen(pURL) > _MAX_AOL_HURL_URL_SIZE)
  246.     {
  247. if (SUCCEEDED(CHXUrlWrapper::Wrap(pURL, &strHtmlFile )))
  248. {
  249. #ifdef _MACINTOSH
  250.     strHtmlFile = "file:///" + strHtmlFile;
  251. #else
  252.     strHtmlFile = "file://" + strHtmlFile;
  253. #endif     
  254.     pURL = (const char*)strHtmlFile;
  255. }
  256.     }
  257. #endif // !_MACINTOSH
  258.     
  259. #if (defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)
  260.     CHXString strPreferredBrowser;
  261.     if(m_pPreferences)
  262.     {
  263. IHXBuffer* pPreferredBrowser = NULL;
  264. if(m_pPreferences->ReadPref("PreferredBrowser", pPreferredBrowser) == HXR_OK)
  265.     strPreferredBrowser = (const char*)pPreferredBrowser->GetBuffer();
  266. HX_RELEASE(pPreferredBrowser);
  267.     }
  268.     if(!strPreferredBrowser.IsEmpty())
  269.     {
  270. if (BrowserOpenURL(pURL, pTarget, strPreferredBrowser))
  271. {
  272.     return HXR_OK;
  273. }
  274. else if (LaunchBrowserWithURL(pURL, strPreferredBrowser))
  275. {
  276.     return HXR_OK;
  277. }
  278.     }
  279.     if (BrowserOpenURL(pURL, pTarget))
  280.     {
  281. return HXR_OK;
  282.     }
  283.     else if (LaunchBrowserWithURL(pURL))
  284.     {
  285.         return HXR_OK;
  286.     }
  287. #endif /*(defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)*/
  288. #if defined (_MACINTOSH) || defined(_MAC_UNIX)
  289.     BOOL bBringToFront = TRUE;
  290.     
  291.     if (GetKeepTargetBehind())
  292.     {
  293.      bBringToFront = FALSE;
  294.     }
  295.     
  296.     if(LaunchMacBrowserWithURLOrdered(pURL, m_pPreferences, bBringToFront)) //in pnmisc/mac/hurl.cpp
  297.     {
  298. return HXR_OK;
  299.     }
  300. #endif /*defined (_MACINTOSH)*/
  301.     
  302. #if defined(_UNIX) && !defined(_VXWORKS) && !defined(_MAC_UNIX)
  303.     SendHurlRequest(pURL);
  304.     return HXR_OK;
  305. #endif
  306.     return HXR_FAILED;
  307. }
  308. #if (defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)
  309. BOOL GetAOLBrowserCmdLine(char* lpLaunchCmd)
  310. {
  311.     if(GetProfileString("WAOL", "AppPath", "", lpLaunchCmd, _MAX_PATH) > 0)
  312.     {
  313. if(lpLaunchCmd[strlen(lpLaunchCmd) - 1] != '\')
  314. {
  315.     SafeStrCat(lpLaunchCmd, "\", _MAX_PATH);
  316. }
  317. SafeStrCat(lpLaunchCmd, "waol.exe -u%1", _MAX_PATH);
  318. return TRUE;
  319.     }
  320.     return FALSE;
  321. }
  322. // This function is called by LaunchBrowserWithURL below.  I removed
  323. // this chunk of code from that function, so that this function could
  324. // also be called rpmisc (via rpclsvc) to get the browser to send 
  325. // to techsupport via rphurlerror in error messages.
  326. BOOL GetBrowserFromRegistry(char* lpLaunchCmd)  // lpLaunchCmd should point to a buffer of _MAX_PATH+1 size
  327. {
  328.     BOOL bBrowserFound = FALSE;
  329.     BOOL bFoundAOLBrowser = FALSE;
  330.     // Can't use FindWindow because it waits if a window is doing activity inside of its WndProc and if the window is waiting
  331.     // on some event deadlock occurs.  Enumerate windows instead.
  332.     ::EnumWindows(FindAOLWindowProc,(LPARAM)&bFoundAOLBrowser);
  333.     if(bFoundAOLBrowser)
  334.     {
  335. bBrowserFound = GetAOLBrowserCmdLine(lpLaunchCmd);
  336.     }
  337.     if(!bBrowserFound)
  338.     {
  339. char* lpSubKey = new char[_MAX_PATH+1];
  340. HKEY hkProtocol;
  341. LONG lBuffLen;
  342. BOOL bTypeNameFound = FALSE;
  343. SafeStrCpy(lpSubKey, ".HTM", _MAX_PATH+1);
  344. if (RegOpenKey(HKEY_CLASSES_ROOT, lpSubKey, &hkProtocol) == ERROR_SUCCESS)
  345. {
  346.     lBuffLen = _MAX_PATH;
  347.     if (RegQueryValue(hkProtocol, NULL, lpLaunchCmd, &lBuffLen) == ERROR_SUCCESS)
  348.     {
  349. bTypeNameFound = TRUE;
  350.     }
  351.     RegCloseKey(hkProtocol);
  352. }
  353. if (!bTypeNameFound)
  354. {
  355.     SafeStrCpy(lpSubKey, ".HTML", _MAX_PATH+1);
  356.     if (RegOpenKey(HKEY_CLASSES_ROOT, lpSubKey, &hkProtocol) == ERROR_SUCCESS)
  357.     {
  358. lBuffLen = _MAX_PATH;
  359. if (RegQueryValue(hkProtocol, NULL, lpLaunchCmd, &lBuffLen) == ERROR_SUCCESS)
  360. {
  361.     bTypeNameFound = TRUE;
  362. }
  363. RegCloseKey(hkProtocol);
  364.     }
  365. }
  366. // Ok, we figured out the "name" of HTML documents, this will help us find the
  367. // application that thinks it will launch them...
  368. if (bTypeNameFound)
  369. {
  370.     SafeStrCpy(lpSubKey,lpLaunchCmd, _MAX_PATH+1);
  371.     if (RegOpenKey(HKEY_CLASSES_ROOT, lpSubKey, &hkProtocol) == ERROR_SUCCESS)
  372.     {
  373. lBuffLen = _MAX_PATH;
  374. if (RegQueryValue(hkProtocol, "shell\open\command", lpLaunchCmd, &lBuffLen) == ERROR_SUCCESS)
  375. {
  376.     bBrowserFound = TRUE;
  377. }
  378. RegCloseKey(hkProtocol);
  379.     }
  380. }
  381.     }
  382.     if(!bBrowserFound)
  383.     {
  384. bBrowserFound = GetAOLBrowserCmdLine(lpLaunchCmd);
  385.     }
  386.     return bBrowserFound;
  387. }
  388. BOOL CALLBACK FindAOLWindowProc(HWND hwnd, LPARAM lParam)
  389. {
  390.     char pWindowText[32] = ""; /* Flawfinder: ignore */
  391.     DWORD dwResult = 0;
  392.     ::SendMessageTimeout(hwnd, WM_GETTEXT, (WPARAM)sizeof(pWindowText), (LPARAM)pWindowText, SMTO_BLOCK, 500, &dwResult);
  393.     
  394.     if (!strcmp("America  Online", pWindowText))
  395.     {
  396. BOOL* pBool = (BOOL*)lParam;
  397. *pBool = TRUE;
  398. return FALSE;
  399.     }
  400.     return TRUE;
  401. }
  402. #endif /*(defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)*/
  403. BOOL HXHyperNavigate::LaunchBrowserWithURL(const char* pURL, const char* pDefBrowser)
  404. {
  405. #if (defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)
  406.     BOOL bHandled = FALSE;
  407.     char* lpLaunchCmd = new char[_MAX_PATH+1];
  408.     char* lpActualLaunch = new char[_MAX_PATH+1];
  409.     BOOL bBrowserFound = FALSE;
  410.     if(pDefBrowser)
  411.     {
  412. char* pName = strrchr(pDefBrowser, '\');
  413. if(pName)
  414. {
  415.     pName++;
  416.     if(!stricmp(pName, "waol.exe"))
  417.     {
  418. SafeSprintf(lpLaunchCmd,_MAX_PATH+1,"%s -u%%1", pDefBrowser);
  419.     }
  420.     else
  421.     {
  422. SafeSprintf(lpLaunchCmd,_MAX_PATH+1,"%s %%1", pDefBrowser);
  423.     }
  424.     bBrowserFound = TRUE;
  425. }
  426.     }
  427.     if(!bBrowserFound)
  428. bBrowserFound = GetBrowserFromRegistry(lpLaunchCmd);
  429.     // Ok, we got a browser "launch" entry...
  430.     if (bBrowserFound)
  431.     {
  432. // Now we want to find out if it's a reasonable format...
  433. char* pParam = (char*)HXFindString(lpLaunchCmd, "%1");
  434. if (pParam)
  435. {
  436.     if ( (strlen(lpLaunchCmd)+strlen(pURL)) >= _MAX_PATH)
  437.     {
  438. bHandled = FALSE;
  439.     }
  440.     else
  441.     {
  442.      // Replace %1 with %s to use format!
  443.      pParam++;
  444.      *pParam = 's';
  445.     
  446.      SafeSprintf(lpActualLaunch,_MAX_PATH+1,lpLaunchCmd,pURL);
  447.     
  448.      if(WinExec(lpActualLaunch,
  449.     #ifdef _WIN32
  450.     SW_SHOWDEFAULT
  451.     #else
  452.     SW_SHOWNORMAL
  453.     #endif
  454.      ) > 31)
  455.      {
  456.     bHandled = TRUE;
  457.      }
  458.      // If we failed, we should try without the URL....
  459.      else
  460.      {
  461.     SafeSprintf(lpActualLaunch,_MAX_PATH+1,lpLaunchCmd,"");
  462.     
  463.     if(WinExec(lpActualLaunch,
  464.      #ifdef _WIN32
  465.      SW_SHOWDEFAULT
  466.      #else
  467.      SW_SHOWNORMAL
  468.      #endif
  469.      ) > 31)
  470.     {
  471.      if (BrowserOpenURL(pURL, NULL, pDefBrowser))
  472.      {
  473.     bHandled = TRUE;
  474.      }
  475.     }
  476.      } // end if Launch with URL failed.
  477.     } // launchCmd+Url too long
  478. }
  479. // If we didn't find a paramter, try to launch the browser
  480. // then do DDE to it...
  481. else
  482. {
  483.     if(WinExec(lpLaunchCmd,
  484. #ifdef _WIN32
  485. SW_SHOWDEFAULT
  486. #else
  487. SW_SHOWNORMAL
  488. #endif
  489. ) > 31)
  490.     {
  491. if (BrowserOpenURL(pURL, NULL, pDefBrowser))
  492. {
  493.     bHandled = TRUE;
  494. }
  495.     }
  496. } // end if we found a parameter...
  497.     }
  498.     if (lpLaunchCmd)
  499.     {
  500. delete [] lpLaunchCmd;
  501. lpLaunchCmd = 0;
  502.     }
  503.     if (lpActualLaunch)
  504.     {
  505. delete [] lpActualLaunch;
  506. lpActualLaunch = 0;
  507.     }
  508.     return bHandled;
  509. #else
  510.     return FALSE;
  511. #endif /*(defined (_WINDOWS) || defined (_WIN32)) && !defined(_WINCE)*/
  512. }
  513. /************************************************************************
  514.  * Method:
  515.  *     IHXHyperNavigate2::Execute
  516.  * Purpose:
  517.  *     
  518.  * Parameters:
  519.  *      pURL:     URL (absolute or relative)
  520.  *     pTargetInstance:
  521.  *     pTargetApplication: 
  522.  *     pTargetRegion:
  523.  *     pParams:
  524.  */
  525. STDMETHODIMP 
  526. HXHyperNavigate::Execute(const char* pURL,
  527.   const char* pTargetInstance,
  528.   const char* pTargetApplication,
  529.   const char* pTargetRegion,
  530.   IHXValues* pParams)
  531. {
  532.     return GoToURL(pURL, pTargetInstance);
  533. }