Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

441 lines
10 KiB

  1. /******************************************************************************
  2. Copyright (c) 1999-2001 Microsoft Corporation
  3. Module Name:
  4. HtmlUtil2.cpp
  5. Abstract:
  6. This file contains the implementation of various functions and classes
  7. designed to help the handling of HTML elements.
  8. Revision History:
  9. Davide Massarenti (Dmassare) 18/03/2001
  10. created
  11. ******************************************************************************/
  12. #include "stdafx.h"
  13. #include <MPC_html2.h>
  14. ////////////////////////////////////////////////////////////////////////////////
  15. HRESULT MPC::HTML::OpenStream( /*[in ]*/ LPCWSTR szBaseURL ,
  16. /*[in ]*/ LPCWSTR szRelativeURL ,
  17. /*[out]*/ CComPtr<IStream>& stream )
  18. {
  19. __MPC_FUNC_ENTRY( COMMONID, "MPC::HTML::OpenStream" );
  20. HRESULT hr;
  21. WCHAR rgBuf[MAX_PATH];
  22. DWORD dwSize = MAXSTRLEN(rgBuf);
  23. __MPC_PARAMCHECK_BEGIN(hr)
  24. __MPC_PARAMCHECK_STRING_NOT_EMPTY(szBaseURL);
  25. __MPC_PARAMCHECK_STRING_NOT_EMPTY(szRelativeURL);
  26. __MPC_PARAMCHECK_END();
  27. __MPC_EXIT_IF_CALL_RETURNS_FALSE(hr, ::InternetCombineUrlW( szBaseURL, szRelativeURL, rgBuf, &dwSize, ICU_NO_ENCODE ));
  28. __MPC_EXIT_IF_METHOD_FAILS(hr, ::URLOpenBlockingStreamW( NULL, rgBuf, &stream, 0, NULL ));
  29. hr = S_OK;
  30. __MPC_FUNC_CLEANUP;
  31. __MPC_FUNC_EXIT(hr);
  32. }
  33. HRESULT MPC::HTML::DownloadBitmap( /*[in ]*/ LPCWSTR szBaseURL ,
  34. /*[in ]*/ LPCWSTR szRelativeURL ,
  35. /*[in ]*/ COLORREF crMask ,
  36. /*[out]*/ HBITMAP& hbm )
  37. {
  38. __MPC_FUNC_ENTRY( COMMONID, "MPC::HTML::DownloadBitmap" );
  39. HRESULT hr;
  40. MPC::wstring strTmp;
  41. CComPtr<IStream> streamIn;
  42. CComPtr<MPC::FileStream> streamOut;
  43. if(hbm)
  44. {
  45. ::DeleteObject( hbm ); hbm = NULL;
  46. }
  47. //
  48. // Open stream for image.
  49. //
  50. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::HTML::OpenStream( szBaseURL, szRelativeURL, streamIn ));
  51. //
  52. // Create a stream for temporary file.
  53. //
  54. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &streamOut ));
  55. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetTemporaryFileName( strTmp ));
  56. __MPC_EXIT_IF_METHOD_FAILS(hr, streamOut->InitForWrite ( strTmp.c_str() ));
  57. //
  58. // Dump image to file.
  59. //
  60. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::BaseStream::TransferData( streamIn, streamOut ));
  61. streamOut.Release();
  62. //
  63. // Load bitmap from file and merge it with existing list.
  64. //
  65. __MPC_EXIT_IF_ALLOC_FAILS(hr, hbm, (HBITMAP)::LoadImageW( NULL, strTmp.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION ));
  66. hr = S_OK;
  67. __MPC_FUNC_CLEANUP;
  68. (void)MPC::RemoveTemporaryFile( strTmp );
  69. __MPC_FUNC_EXIT(hr);
  70. }
  71. ////////////////////////////////////////////////////////////////////////////////
  72. ////////////////////////////////////////////////////////////////////////////////
  73. ////////////////////////////////////////////////////////////////////////////////
  74. STDMETHODIMP CPCHTextHelpers::QuoteEscape( /*[in ]*/ BSTR bstrText ,
  75. /*[in,optional]*/ VARIANT vQuote ,
  76. /*[out, retval]*/ BSTR *pVal )
  77. {
  78. __HCP_FUNC_ENTRY( "CPCHTextHelpers::QuoteEscape" );
  79. HRESULT hr;
  80. __MPC_PARAMCHECK_BEGIN(hr)
  81. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  82. __MPC_PARAMCHECK_END();
  83. if(STRINGISPRESENT(bstrText))
  84. {
  85. MPC::wstring str;
  86. WCHAR chQuote = '"';
  87. CComVariant v( vQuote );
  88. if(v.vt != VT_EMPTY && SUCCEEDED(v.ChangeType( VT_BSTR )) && v.bstrVal)
  89. {
  90. chQuote = v.bstrVal[0];
  91. }
  92. MPC::HTML::QuoteEscape( str, bstrText, chQuote );
  93. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( str.c_str(), pVal ));
  94. }
  95. hr = S_OK;
  96. __HCP_FUNC_CLEANUP;
  97. __HCP_FUNC_EXIT(hr);
  98. }
  99. STDMETHODIMP CPCHTextHelpers::URLUnescape( /*[in ]*/ BSTR bstrText ,
  100. /*[in,optional]*/ VARIANT vAsQueryString ,
  101. /*[out, retval]*/ BSTR *pVal )
  102. {
  103. __HCP_FUNC_ENTRY( "CPCHTextHelpers::URLUnescape" );
  104. HRESULT hr;
  105. __MPC_PARAMCHECK_BEGIN(hr)
  106. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  107. __MPC_PARAMCHECK_END();
  108. if(STRINGISPRESENT(bstrText))
  109. {
  110. MPC::wstring str;
  111. bool fAsQueryString = false;
  112. CComVariant v( vAsQueryString );
  113. if(v.vt != VT_EMPTY && SUCCEEDED(v.ChangeType( VT_BOOL )))
  114. {
  115. fAsQueryString = (v.boolVal == VARIANT_TRUE);
  116. }
  117. MPC::HTML::UrlUnescape( str, bstrText, fAsQueryString );
  118. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( str.c_str(), pVal ));
  119. }
  120. hr = S_OK;
  121. __HCP_FUNC_CLEANUP;
  122. __HCP_FUNC_EXIT(hr);
  123. }
  124. STDMETHODIMP CPCHTextHelpers::URLEscape( /*[in ]*/ BSTR bstrText ,
  125. /*[in,optional]*/ VARIANT vAsQueryString ,
  126. /*[out, retval]*/ BSTR *pVal )
  127. {
  128. __HCP_FUNC_ENTRY( "CPCHTextHelpers::URLEscape" );
  129. HRESULT hr;
  130. __MPC_PARAMCHECK_BEGIN(hr)
  131. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  132. __MPC_PARAMCHECK_END();
  133. if(STRINGISPRESENT(bstrText))
  134. {
  135. MPC::wstring str;
  136. bool fAsQueryString = false;
  137. CComVariant v( vAsQueryString );
  138. if(v.vt != VT_EMPTY && SUCCEEDED(v.ChangeType( VT_BOOL )))
  139. {
  140. fAsQueryString = (v.boolVal == VARIANT_TRUE);
  141. }
  142. MPC::HTML::UrlEscape( str, bstrText, fAsQueryString );
  143. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( str.c_str(), pVal ));
  144. }
  145. hr = S_OK;
  146. __HCP_FUNC_CLEANUP;
  147. __HCP_FUNC_EXIT(hr);
  148. }
  149. STDMETHODIMP CPCHTextHelpers::HTMLEscape( /*[in ]*/ BSTR bstrText ,
  150. /*[out, retval]*/ BSTR *pVal )
  151. {
  152. __HCP_FUNC_ENTRY( "CPCHTextHelpers::HTMLEscape" );
  153. HRESULT hr;
  154. __MPC_PARAMCHECK_BEGIN(hr)
  155. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  156. __MPC_PARAMCHECK_END();
  157. if(STRINGISPRESENT(bstrText))
  158. {
  159. MPC::wstring str;
  160. MPC::HTML::HTMLEscape( str, bstrText );
  161. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( str.c_str(), pVal ));
  162. }
  163. hr = S_OK;
  164. __HCP_FUNC_CLEANUP;
  165. __HCP_FUNC_EXIT(hr);
  166. }
  167. STDMETHODIMP CPCHTextHelpers::ParseURL( /*[in ]*/ BSTR bstrURL ,
  168. /*[out, retval]*/ IPCHParsedURL* *pVal )
  169. {
  170. __HCP_FUNC_ENTRY( "CPCHTextHelpers::ParseURL" );
  171. HRESULT hr;
  172. CComPtr<CPCHParsedURL> pu;
  173. __MPC_PARAMCHECK_BEGIN(hr)
  174. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrURL);
  175. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  176. __MPC_PARAMCHECK_END();
  177. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pu ));
  178. __MPC_EXIT_IF_METHOD_FAILS(hr, pu->Initialize( bstrURL ));
  179. *pVal = pu.Detach();
  180. hr = S_OK;
  181. __HCP_FUNC_CLEANUP;
  182. __HCP_FUNC_EXIT(hr);
  183. }
  184. STDMETHODIMP CPCHTextHelpers::GetLCIDDisplayString( /*[in]*/ long lLCID ,
  185. /*[out, retval]*/ BSTR *pVal )
  186. {
  187. __HCP_FUNC_ENTRY( "CPCHTextHelpers::GetLCIDDisplayString" );
  188. HRESULT hr;
  189. WCHAR rgTmp[256];
  190. __MPC_PARAMCHECK_BEGIN(hr)
  191. __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
  192. __MPC_PARAMCHECK_END();
  193. if(::GetLocaleInfoW( lLCID, LOCALE_SLANGUAGE, rgTmp, MAXSTRLEN(rgTmp) ) == 0) rgTmp[0] = 0;
  194. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( rgTmp, pVal ));
  195. hr = S_OK;
  196. __HCP_FUNC_CLEANUP;
  197. __HCP_FUNC_EXIT(hr);
  198. }
  199. ////////////////////////////////////////
  200. HRESULT CPCHParsedURL::Initialize( /*[in]*/ LPCWSTR szURL )
  201. {
  202. MPC::HTML::ParseHREF( szURL, m_strBaseURL, m_mapQuery );
  203. return S_OK;
  204. }
  205. STDMETHODIMP CPCHParsedURL::get_BasePart( /*[out, retval]*/ BSTR *pVal )
  206. {
  207. return MPC::GetBSTR( m_strBaseURL.c_str(), pVal );
  208. }
  209. STDMETHODIMP CPCHParsedURL::put_BasePart( /*[in]*/ BSTR newVal )
  210. {
  211. m_strBaseURL = SAFEBSTR(newVal);
  212. return S_OK;
  213. }
  214. STDMETHODIMP CPCHParsedURL::get_QueryParameters( /*[out, retval]*/ VARIANT *pVal )
  215. {
  216. __HCP_FUNC_ENTRY( "CPCHParsedURL::get_QueryParameters" );
  217. HRESULT hr;
  218. MPC::WStringList lst;
  219. MPC::WStringLookupIter it;
  220. __MPC_PARAMCHECK_BEGIN(hr)
  221. __MPC_PARAMCHECK_NOTNULL(pVal);
  222. __MPC_PARAMCHECK_END();
  223. for(it = m_mapQuery.begin(); it != m_mapQuery.end(); it++)
  224. {
  225. lst.push_back( it->first.c_str() );
  226. }
  227. ::VariantClear( pVal );
  228. __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::ConvertListToSafeArray( lst, *pVal, VT_VARIANT ));
  229. hr = S_OK;
  230. __HCP_FUNC_CLEANUP;
  231. __HCP_FUNC_EXIT(hr);
  232. }
  233. ////////////////////
  234. STDMETHODIMP CPCHParsedURL::GetQueryParameter( /*[in ]*/ BSTR bstrName ,
  235. /*[out, retval]*/ VARIANT* pvValue )
  236. {
  237. __HCP_FUNC_ENTRY( "CPCHParsedURL::GetQueryParameter" );
  238. HRESULT hr;
  239. MPC::WStringLookupIter it;
  240. __MPC_PARAMCHECK_BEGIN(hr)
  241. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrName);
  242. __MPC_PARAMCHECK_NOTNULL(pvValue);
  243. __MPC_PARAMCHECK_END();
  244. ::VariantClear( pvValue );
  245. it = m_mapQuery.find( bstrName );
  246. if(it != m_mapQuery.end())
  247. {
  248. pvValue->vt = VT_BSTR;
  249. pvValue->bstrVal = ::SysAllocString( it->second.c_str() );
  250. }
  251. hr = S_OK;
  252. __HCP_FUNC_CLEANUP;
  253. __HCP_FUNC_EXIT(hr);
  254. }
  255. STDMETHODIMP CPCHParsedURL::SetQueryParameter( /*[in]*/ BSTR bstrName ,
  256. /*[in]*/ BSTR bstrValue )
  257. {
  258. __HCP_FUNC_ENTRY( "CPCHParsedURL::SetQueryParameter" );
  259. HRESULT hr;
  260. __MPC_PARAMCHECK_BEGIN(hr)
  261. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrName);
  262. __MPC_PARAMCHECK_END();
  263. m_mapQuery[bstrName] = SAFEBSTR(bstrValue);
  264. hr = S_OK;
  265. __HCP_FUNC_CLEANUP;
  266. __HCP_FUNC_EXIT(hr);
  267. }
  268. STDMETHODIMP CPCHParsedURL::DeleteQueryParameter( /*[in]*/ BSTR bstrName )
  269. {
  270. __HCP_FUNC_ENTRY( "CPCHParsedURL::DeleteQueryParameter" );
  271. HRESULT hr;
  272. MPC::WStringLookupIter it;
  273. __MPC_PARAMCHECK_BEGIN(hr)
  274. __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrName);
  275. __MPC_PARAMCHECK_END();
  276. it = m_mapQuery.find( bstrName );
  277. if(it != m_mapQuery.end())
  278. {
  279. m_mapQuery.erase( it );
  280. }
  281. hr = S_OK;
  282. __HCP_FUNC_CLEANUP;
  283. __HCP_FUNC_EXIT(hr);
  284. }
  285. STDMETHODIMP CPCHParsedURL::BuildFullURL( /*[out, retval]*/ BSTR *pVal )
  286. {
  287. MPC::wstring strURL;
  288. MPC::HTML::BuildHREF( strURL, m_strBaseURL.c_str(), m_mapQuery );
  289. return MPC::GetBSTR( strURL.c_str(), pVal );
  290. }