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.

304 lines
8.2 KiB

  1. // HotfixOCX.h : Declaration of the CHotfixOCX
  2. #ifndef __HOTFIXOCX_H_
  3. #define __HOTFIXOCX_H_
  4. #include <atlctl.h>
  5. #include "resource.h" // main symbols
  6. #include <windowsx.h>
  7. #include <windows.h>
  8. #include "CListViews.h"
  9. /////////////////////////////////////////////////////////////////////////////
  10. // CHotfixOCX
  11. class ATL_NO_VTABLE CHotfixOCX :
  12. public CComObjectRootEx<CComSingleThreadModel>,
  13. public CStockPropImpl<CHotfixOCX, IHotfixOCX, &IID_IHotfixOCX, &LIBID_HOTFIXMANAGERLib>,
  14. public CComControl<CHotfixOCX>,
  15. public IPersistStreamInitImpl<CHotfixOCX>,
  16. public IOleControlImpl<CHotfixOCX>,
  17. public IOleObjectImpl<CHotfixOCX>,
  18. public IOleInPlaceActiveObjectImpl<CHotfixOCX>,
  19. public IViewObjectExImpl<CHotfixOCX>,
  20. public IOleInPlaceObjectWindowlessImpl<CHotfixOCX>,
  21. public ISupportErrorInfo,
  22. public IConnectionPointContainerImpl<CHotfixOCX>,
  23. public IPersistStorageImpl<CHotfixOCX>,
  24. public ISpecifyPropertyPagesImpl<CHotfixOCX>,
  25. public IQuickActivateImpl<CHotfixOCX>,
  26. public IDataObjectImpl<CHotfixOCX>,
  27. public IProvideClassInfo2Impl<&CLSID_HotfixOCX, &DIID__IHotfixOCXEvents, &LIBID_HOTFIXMANAGERLib>,
  28. public IPropertyNotifySinkCP<CHotfixOCX>,
  29. public CComCoClass<CHotfixOCX, &CLSID_HotfixOCX>
  30. {
  31. public:
  32. CHotfixOCX()
  33. {
  34. m_bWindowOnly = TRUE;
  35. _tcscpy(ComputerName,_T("\0"));
  36. }
  37. DECLARE_REGISTRY_RESOURCEID(IDR_HOTFIXOCX)
  38. DECLARE_PROTECT_FINAL_CONSTRUCT()
  39. BEGIN_COM_MAP(CHotfixOCX)
  40. COM_INTERFACE_ENTRY(IHotfixOCX)
  41. COM_INTERFACE_ENTRY(IDispatch)
  42. COM_INTERFACE_ENTRY(IViewObjectEx)
  43. COM_INTERFACE_ENTRY(IViewObject2)
  44. COM_INTERFACE_ENTRY(IViewObject)
  45. COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
  46. COM_INTERFACE_ENTRY(IOleInPlaceObject)
  47. COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
  48. COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
  49. COM_INTERFACE_ENTRY(IOleControl)
  50. COM_INTERFACE_ENTRY(IOleObject)
  51. COM_INTERFACE_ENTRY(IPersistStreamInit)
  52. COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
  53. COM_INTERFACE_ENTRY(ISupportErrorInfo)
  54. COM_INTERFACE_ENTRY(IConnectionPointContainer)
  55. COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
  56. COM_INTERFACE_ENTRY(IQuickActivate)
  57. COM_INTERFACE_ENTRY(IPersistStorage)
  58. COM_INTERFACE_ENTRY(IDataObject)
  59. COM_INTERFACE_ENTRY(IProvideClassInfo)
  60. COM_INTERFACE_ENTRY(IProvideClassInfo2)
  61. END_COM_MAP()
  62. BEGIN_PROP_MAP(CHotfixOCX)
  63. PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
  64. PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
  65. PROP_ENTRY("Font", DISPID_FONT, CLSID_StockFontPage)
  66. // Example entries
  67. // PROP_ENTRY("Property Description", dispid, clsid)
  68. // PROP_PAGE(CLSID_StockColorPage)
  69. END_PROP_MAP()
  70. BEGIN_CONNECTION_POINT_MAP(CHotfixOCX)
  71. CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
  72. END_CONNECTION_POINT_MAP()
  73. BEGIN_MSG_MAP(CHotfixOCX)
  74. MESSAGE_HANDLER(WM_CREATE, OnCreate)
  75. MESSAGE_HANDLER(WM_SIZE, OnSize)
  76. MESSAGE_HANDLER(WM_NOTIFY,OnNotify)
  77. MESSAGE_HANDLER(WM_COMMAND,OnCommand)
  78. MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
  79. CHAIN_MSG_MAP(CComControl<CHotfixOCX>)
  80. DEFAULT_REFLECTION_HANDLER()
  81. END_MSG_MAP()
  82. // Handler prototypes:
  83. // LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  84. // LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
  85. // LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
  86. // ISupportsErrorInfo
  87. STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
  88. {
  89. static const IID* arr[] =
  90. {
  91. &IID_IHotfixOCX,
  92. };
  93. for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
  94. {
  95. // if (InlineIsEqualGUID(*arr[i], riid))
  96. return S_OK;
  97. }
  98. return S_FALSE;
  99. }
  100. // IViewObjectEx
  101. DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
  102. // IHotfixOCX
  103. public:
  104. STDMETHOD(get_CurrentState)(/*[out, retval]*/ long *pVal);
  105. STDMETHOD(get_HaveHotfix)(/*[out, retval]*/ BOOL*pVal);
  106. STDMETHOD(get_Remoted)(/*[out, retval]*/ BOOL *pVal);
  107. STDMETHOD(get_ViewState)(/*[out, retval]*/ long *pVal);
  108. STDMETHOD(get_ProductName)(/*[out, retval]*/ BSTR *pVal);
  109. STDMETHOD(put_ProductName)(/*[in]*/ BSTR newVal);
  110. STDMETHOD(get_ComputerName)(/*[out, retval]*/ BSTR *pVal);
  111. STDMETHOD(put_ComputerName)(/*[in]*/ BSTR newVal);
  112. STDMETHOD(get_Command)(/*[out, retval]*/ long *pVal);
  113. STDMETHOD(put_Command)(/*[in]*/ long newVal);
  114. ShowWebPage(_TCHAR *HotFix);
  115. BOOL CreateButton( HINSTANCE hInst, HWND hWnd,RECT* rc);
  116. BOOL ResizeButtons(RECT *rc);
  117. HRESULT OnDraw(ATL_DRAWINFO& di)
  118. {
  119. RECT& rc = *(RECT*)di.prcBounds;
  120. Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
  121. HBRUSH hBrush = GetSysColorBrush (COLOR_BTNFACE );
  122. FillRect (di.hdcDraw, &rc, hBrush);
  123. SelectObject(di.hdcDraw, hBrush);
  124. DeleteObject (hBrush);
  125. return S_OK;
  126. }
  127. CComPtr<IFontDisp> m_pFont;
  128. CListViews ListViews;
  129. HWND WebButton;
  130. HWND UninstButton;
  131. HWND RptButton;
  132. _TCHAR ComputerName[256];
  133. BOOL m_bInitComplete;
  134. LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  135. {
  136. _TCHAR TempName[255];
  137. DWORD dwLength = 255;
  138. m_bInitComplete = FALSE;
  139. // TODO : Add Code for message handler. Call DefWindowProc if necessary.
  140. RECT rc;
  141. GetClientRect(&rc);
  142. CreateButton(_Module.GetModuleInstance(),m_hWnd,&rc);
  143. ::EnableWindow( WebButton,FALSE);
  144. ::EnableWindow(UninstButton,FALSE);
  145. ListViews.Initialize(m_hWnd, _Module.GetModuleInstance(),ComputerName,
  146. WebButton, UninstButton, RptButton);
  147. ListViews.ShowLists(&rc);
  148. GetComputerName(TempName, &dwLength);
  149. // MessageBox(TempName, ComputerName,MB_OK);
  150. m_bInitComplete = TRUE;
  151. return 0;
  152. }
  153. LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  154. {
  155. RECT rc;
  156. rc.top = 0;
  157. rc.left = 0;
  158. rc.right = LOWORD(lParam);
  159. rc.bottom = HIWORD(lParam);
  160. // TODO : Add Code for message handler. Call DefWindowProc if necessary.
  161. ListViews.Resize(&rc);
  162. ResizeButtons(&rc);
  163. return 0;
  164. }
  165. LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  166. {
  167. return ListViews.OnNotify( uMsg, wParam, lParam, bHandled,m_hWnd);
  168. }
  169. LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  170. {
  171. switch (HIWORD (wParam))
  172. {
  173. case BN_CLICKED:
  174. if ( WebButton == (HWND)lParam)
  175. {
  176. ShowWebPage(ListViews.GetCurrentHotfix());
  177. return 0;
  178. }
  179. else if (UninstButton == (HWND)lParam)
  180. {
  181. ListViews.Uninstall();
  182. }
  183. else if (RptButton == (HWND)lParam)
  184. {
  185. ListViews.PrintReport();
  186. }
  187. break;
  188. }
  189. switch (LOWORD (wParam))
  190. {
  191. case IDM_VIEW_WEB:
  192. ShowWebPage(ListViews.GetCurrentHotfix());
  193. break;
  194. case IDM_UNINSTALL:
  195. ListViews.Uninstall();
  196. break;
  197. case IDM_EXPORT_LIST:
  198. ListViews.SaveToCSV();
  199. break;
  200. case IDM_VIEW_FILE:
  201. ListViews.SetViewMode(VIEW_BY_FILE);
  202. break;
  203. case IDM_VIEW_HOTFIX:
  204. ListViews.SetViewMode(VIEW_BY_HOTFIX);
  205. break;
  206. case ID_CONTEXTMENU_PRINT:
  207. ListViews.PrintReport();
  208. break;
  209. }
  210. bHandled = FALSE;
  211. return 0;
  212. }
  213. LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  214. {
  215. // TODO : Add Code for message handler. Call DefWindowProc if necessary.
  216. HMENU hMenuLoad,
  217. hMenu;
  218. DWORD dwCurrentState =0;
  219. hMenuLoad = LoadMenu(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDR_MENU1));
  220. hMenu = GetSubMenu(hMenuLoad, 0);
  221. dwCurrentState = ListViews.GetState ();
  222. if (!(dwCurrentState&UNINSTALL_OK) )
  223. ::EnableMenuItem(hMenu,IDM_UNINSTALL,MF_BYCOMMAND | MF_GRAYED);
  224. if (!(dwCurrentState&HOTFIX_SELECTED))
  225. {
  226. ::EnableMenuItem(hMenu,IDM_VIEW_WEB,MF_BYCOMMAND | MF_GRAYED);
  227. }
  228. if ( ! (dwCurrentState & DATA_TO_SAVE))
  229. {
  230. ::EnableMenuItem(hMenu,IDM_EXPORT_LIST,MF_BYCOMMAND | MF_GRAYED);
  231. }
  232. if (! (dwCurrentState & OK_TO_PRINT))
  233. ::EnableMenuItem(hMenu,ID_CONTEXTMENU_PRINT,MF_BYCOMMAND | MF_GRAYED);
  234. if ( dwCurrentState & STATE_VIEW_FILE)
  235. {
  236. ::CheckMenuItem(hMenu, IDM_VIEW_FILE, MF_BYCOMMAND|MF_CHECKED);
  237. ::CheckMenuItem(hMenu, IDM_VIEW_HOTFIX, MF_BYCOMMAND|MF_UNCHECKED);
  238. }
  239. else
  240. {
  241. ::CheckMenuItem(hMenu, IDM_VIEW_HOTFIX, MF_BYCOMMAND|MF_CHECKED);
  242. ::CheckMenuItem(hMenu, IDM_VIEW_FILE, MF_BYCOMMAND|MF_UNCHECKED);
  243. }
  244. TrackPopupMenu( hMenu,
  245. TPM_LEFTALIGN | TPM_RIGHTBUTTON,
  246. GET_X_LPARAM(lParam),
  247. GET_Y_LPARAM(lParam),
  248. 0,
  249. m_hWnd,
  250. NULL);
  251. DestroyMenu(hMenuLoad);
  252. return 0;
  253. }
  254. };
  255. #endif //__HOTFIXOCX_H_