Leaked source code of windows server 2003
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.

322 lines
9.8 KiB

  1. #include "headers.h"
  2. #pragma MARK_DATA(__FILE__)
  3. #pragma MARK_CODE(__FILE__)
  4. #pragma MARK_CONST(__FILE__)
  5. #include "iextag.h"
  6. #include "peerfact.h"
  7. #include "ccaps.h"
  8. #include "homepg.h"
  9. #include "persist.hxx"
  10. #include "download.h"
  11. #ifndef __X_HTMLAREA_HXX_
  12. #define __X_HTMLAREA_HXX_
  13. #include "htmlarea.hxx"
  14. #endif
  15. #ifndef __X_SELECT_HXX_
  16. #define __X_SELECT_HXX_
  17. #include "select.hxx"
  18. #endif
  19. #ifndef __X_SELITEM_HXX_
  20. #define __X_SELITEM_HXX_
  21. #include "selitem.hxx"
  22. #endif
  23. #ifndef __X_COMBOBOX_HXX_
  24. #define __X_COMBOBOX_HXX_
  25. #include "combobox.hxx"
  26. #endif
  27. #ifndef __X_CHECKBOX_HXX_
  28. #define __X_CHECKBOX_HXX_
  29. #include "checkbox.hxx"
  30. #endif
  31. #ifndef __X_RADIO_HXX_
  32. #define __X_RADIO_HXX_
  33. #include "radio.hxx"
  34. #endif
  35. #ifndef __X_USERDATA_HXX_
  36. #define __X_USERDATA_HXX_
  37. #include "userdata.hxx"
  38. #endif
  39. #ifndef __X_RECTPEER_HXX_
  40. #define __X_RECTPEER_HXX_
  41. #include "rectpeer.hxx"
  42. #endif
  43. #ifndef __X_DEVICERECT_HXX_
  44. #define __X_DEVICERECT_HXX_
  45. #include "devicerect.hxx"
  46. #endif
  47. #ifndef __X_TMPPRINT_HXX_
  48. #define __X_TMPPRINT_HXX_
  49. #include "tmpprint.hxx"
  50. #endif
  51. #ifndef __X_HEADFOOT_HXX_
  52. #define __X_HEADFOOT_HXX_
  53. #include "headfoot.hxx"
  54. #endif
  55. #ifndef __X_SCROLLBAR_HXX_
  56. #define __X_SCROLLBAR_HXX_
  57. #include "scrllbar.hxx"
  58. #endif
  59. #ifndef __X_SPINBTTN_HXX_
  60. #define __X_SPINBTTN_HXX_
  61. #include "spinbttn.hxx"
  62. #endif
  63. #ifndef __X_SLIDEBAR_HXX_
  64. #define __X_SLIDEBAR_HXX_
  65. #include "slidebar.hxx"
  66. #endif
  67. #ifndef UNIX // UNIX doesn't support this.
  68. #include "httpwfh.h"
  69. #include "ancrclk.h"
  70. #endif
  71. //+-----------------------------------------------------------
  72. //
  73. // Member: CPeerFactory constructor
  74. //
  75. //------------------------------------------------------------
  76. CPeerFactory::CPeerFactory()
  77. {
  78. }
  79. //+-----------------------------------------------------------
  80. //
  81. // Member: CPeerFactory destructor
  82. //
  83. //------------------------------------------------------------
  84. CPeerFactory::~CPeerFactory()
  85. {
  86. }
  87. //+-----------------------------------------------------------
  88. //
  89. // Member: behavior desc map macros
  90. //
  91. //------------------------------------------------------------
  92. typedef HRESULT FN_CREATEINSTANCE (IElementBehavior ** ppBehavior);
  93. struct BEHAVIOR_DESC
  94. {
  95. LPCTSTR pchName;
  96. LPCTSTR pchTagName;
  97. LPCTSTR pchBaseTagName;
  98. FN_CREATEINSTANCE * pfnCreateInstance;
  99. };
  100. #define DECLARE_BEHAVIOR(className) \
  101. HRESULT className##_CreateInstance(IElementBehavior ** ppBehavior) \
  102. { \
  103. HRESULT hr; \
  104. CComObject<className> * pInstance; \
  105. \
  106. hr = CComObject<className>::CreateInstance(&pInstance); \
  107. if (hr) \
  108. goto Cleanup; \
  109. \
  110. hr = pInstance->QueryInterface( \
  111. IID_IElementBehavior, (void**) ppBehavior); \
  112. \
  113. Cleanup: \
  114. return hr; \
  115. } \
  116. #define BEGIN_BEHAVIORS_MAP(x) static BEHAVIOR_DESC x[] = {
  117. #define END_BEHAVIORS_MAP() { NULL, NULL, NULL, NULL }};
  118. #define BEHAVIOR_ENTRY(className, name, tagName, baseTagName) { name, tagName, baseTagName, className##_CreateInstance},
  119. //+-----------------------------------------------------------
  120. //
  121. // Behaviors map
  122. //
  123. // To add a new entry: execute steps 1 and 2
  124. //
  125. //------------------------------------------------------------
  126. //
  127. // STEP 1.
  128. //
  129. DECLARE_BEHAVIOR(CHtmlArea)
  130. DECLARE_BEHAVIOR(CCombobox)
  131. DECLARE_BEHAVIOR(CIESelectElement)
  132. DECLARE_BEHAVIOR(CIEOptionElement)
  133. DECLARE_BEHAVIOR(CCheckBox)
  134. DECLARE_BEHAVIOR(CRadioButton)
  135. DECLARE_BEHAVIOR(CLayoutRect)
  136. DECLARE_BEHAVIOR(CDeviceRect)
  137. DECLARE_BEHAVIOR(CTemplatePrinter)
  138. DECLARE_BEHAVIOR(CHeaderFooter)
  139. DECLARE_BEHAVIOR(CScrollBar)
  140. DECLARE_BEHAVIOR(CSpinButton)
  141. DECLARE_BEHAVIOR(CSliderBar)
  142. DECLARE_BEHAVIOR(CClientCaps)
  143. DECLARE_BEHAVIOR(CHomePage)
  144. DECLARE_BEHAVIOR(CPersistUserData)
  145. DECLARE_BEHAVIOR(CPersistHistory)
  146. DECLARE_BEHAVIOR(CPersistShortcut)
  147. DECLARE_BEHAVIOR(CPersistSnapshot)
  148. DECLARE_BEHAVIOR(CDownloadBehavior)
  149. DECLARE_BEHAVIOR(Cwfolders)
  150. DECLARE_BEHAVIOR(CAnchorClick)
  151. //
  152. // STEP 2.
  153. //
  154. BEGIN_BEHAVIORS_MAP(_BehaviorDescMap)
  155. // className behaviorName tagName baseTagName
  156. #if DBG==1
  157. BEHAVIOR_ENTRY(CCheckBox, _T("checkBox"), _T("CHECKBOX"), NULL ) // keep first in the list as it is a perf benchmark (alexz)
  158. BEHAVIOR_ENTRY(CRadioButton, _T("radioButton"), _T("RADIOBUTTON"), NULL )
  159. BEHAVIOR_ENTRY(CHtmlArea, _T("htmlArea"), _T("HTMLAREA"), NULL )
  160. BEHAVIOR_ENTRY(CCombobox, _T("comboBox"), _T("COMBOBOX"), NULL )
  161. BEHAVIOR_ENTRY(CIESelectElement, _T("select"), _T("SELECT"), NULL )
  162. BEHAVIOR_ENTRY(CIEOptionElement, _T("option"), _T("OPTION"), NULL )
  163. BEHAVIOR_ENTRY(CScrollBar, _T("scrollBar"), _T("SCROLLBAR"), NULL )
  164. BEHAVIOR_ENTRY(CSpinButton, _T("spinButton"), _T("SPINBUTTON"), NULL )
  165. BEHAVIOR_ENTRY(CSliderBar, _T("sliderBar"), _T("SLIDERBAR"), NULL )
  166. #endif
  167. BEHAVIOR_ENTRY(CLayoutRect, _T("layoutRect"), _T("LAYOUTRECT"), NULL )
  168. BEHAVIOR_ENTRY(CDeviceRect, _T("deviceRect"), _T("DEVICERECT"), NULL )
  169. BEHAVIOR_ENTRY(CTemplatePrinter, _T("templatePrinter"), _T("TEMPLATEPRINTER"), NULL )
  170. BEHAVIOR_ENTRY(CHeaderFooter, _T("headerFooter"), _T("HEADERFOOTER"), NULL )
  171. BEHAVIOR_ENTRY(CClientCaps, _T("clientCaps"), NULL, NULL )
  172. BEHAVIOR_ENTRY(CHomePage, _T("homePage"), NULL, NULL )
  173. BEHAVIOR_ENTRY(CPersistUserData, _T("userData"), NULL, NULL )
  174. BEHAVIOR_ENTRY(CPersistHistory, _T("saveHistory"), NULL, NULL )
  175. BEHAVIOR_ENTRY(CPersistShortcut, _T("saveFavorite"), NULL, NULL )
  176. BEHAVIOR_ENTRY(CPersistSnapshot, _T("saveSnapshot"), NULL, NULL )
  177. BEHAVIOR_ENTRY(CDownloadBehavior, _T("download"), NULL, NULL )
  178. #ifndef UNIX // UNIX doesn't support these
  179. BEHAVIOR_ENTRY(Cwfolders, _T("httpFolder"), NULL, NULL )
  180. BEHAVIOR_ENTRY(CAnchorClick, _T("anchorClick"), NULL, NULL )
  181. #endif
  182. END_BEHAVIORS_MAP()
  183. //+-----------------------------------------------------------
  184. //
  185. // Member: CPeerFactory::FindBehavior
  186. //
  187. //------------------------------------------------------------
  188. STDMETHODIMP
  189. CPeerFactory::FindBehavior(
  190. BSTR bstrName,
  191. BSTR bstrUrl,
  192. IElementBehaviorSite * pSite,
  193. IElementBehavior ** ppBehavior)
  194. {
  195. HRESULT hr = E_FAIL;
  196. IHTMLElement * pElement = NULL;
  197. BSTR bstrTagName = NULL;
  198. IClassFactory * pFactory = NULL;
  199. BEHAVIOR_DESC * pDesc;
  200. if (!ppBehavior)
  201. {
  202. hr = E_INVALIDARG;
  203. goto Cleanup;
  204. }
  205. //
  206. // ensure name
  207. //
  208. if (!bstrName)
  209. {
  210. hr = pSite->GetElement(&pElement);
  211. if (hr)
  212. goto Cleanup;
  213. hr = pElement->get_tagName(&bstrTagName);
  214. if (hr)
  215. goto Cleanup;
  216. bstrName = bstrTagName;
  217. }
  218. //
  219. // lookup
  220. //
  221. Assert (bstrName);
  222. *ppBehavior = NULL;
  223. for (pDesc = _BehaviorDescMap; pDesc->pchName; pDesc++)
  224. {
  225. if (0 == StrCmpICW(bstrName, pDesc->pchName))
  226. {
  227. hr = pDesc->pfnCreateInstance(ppBehavior);
  228. break; // done
  229. }
  230. }
  231. Cleanup:
  232. ReleaseInterface (pElement);
  233. ReleaseInterface (pFactory);
  234. if (bstrTagName)
  235. SysFreeString (bstrTagName);
  236. return hr;
  237. }
  238. //+-----------------------------------------------------------
  239. //
  240. // Member: CPeerFactory::Create, per IElementNamespaceFactory
  241. //
  242. //------------------------------------------------------------
  243. HRESULT
  244. CPeerFactory::Create(IElementNamespace * pNamespace)
  245. {
  246. HRESULT hr = S_OK;
  247. BEHAVIOR_DESC * pDesc;
  248. BSTR bstrTagName;
  249. for (pDesc = _BehaviorDescMap; pDesc->pchName; pDesc++)
  250. {
  251. if (pDesc->pchTagName)
  252. {
  253. // CONSIDER (alexz) it could be optimized so to avoid these 2 SysAllocString-s
  254. Assert( !pDesc->pchBaseTagName && "Base tag has been moved to a private debug-only testing interface. Talk to JHarding" );
  255. bstrTagName = SysAllocString(pDesc->pchTagName);
  256. hr = pNamespace->AddTag(bstrTagName, 0);
  257. SysFreeString(bstrTagName);
  258. if (hr)
  259. goto Cleanup;
  260. }
  261. }
  262. Cleanup:
  263. return hr;
  264. }