Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #ifndef ___xmlhttprequest_h___
00023 #define ___xmlhttprequest_h___
00024 
00025 #include <xercesc/dom/DOMDocument.hpp>
00026 #include "IXMLDOMNodeImpl.h"
00027 
00028 #include "resource.h"       
00029 
00030 class ATL_NO_VTABLE CXMLHttpRequest : 
00031         public CComObjectRootEx<CComSingleThreadModel>,
00032         public CComCoClass<CXMLHttpRequest, &CLSID_XMLHTTPRequest>,
00033         public IObjectSafetyImpl<CXMLHttpRequest, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
00034         public IDispatchImpl<IXMLHttpRequest, &IID_IXMLHttpRequest, &LIBID_Xerces, XERCES_VERSION_MAJOR, INVK_CAT2_RAW_NUMERIC(XERCES_VERSION_MINOR,XERCES_VERSION_REVISION)>,
00035         public IObjectWithSiteImpl<CXMLHttpRequest>,
00036         public ISupportErrorInfo,
00037         public CWindowImpl<CXMLHttpRequest, CWindow, CWinTraits<0,0> >
00038 {
00039 public:
00040         CXMLHttpRequest();
00041 
00042         HRESULT FinalConstruct();
00043         void    FinalRelease();
00044 
00045         
00046         static HRESULT WINAPI UpdateRegistry(BOOL bRegister);
00047 
00048 DECLARE_NOT_AGGREGATABLE(CXMLHttpRequest)
00049 
00050 DECLARE_PROTECT_FINAL_CONSTRUCT()
00051 
00052 BEGIN_COM_MAP(CXMLHttpRequest)
00053         COM_INTERFACE_ENTRY(IXMLHttpRequest)
00054         COM_INTERFACE_ENTRY(IDispatch)
00055         COM_INTERFACE_ENTRY(IObjectSafety)
00056         COM_INTERFACE_ENTRY(IObjectWithSite)
00057         COM_INTERFACE_ENTRY(ISupportErrorInfo)
00058 END_COM_MAP()
00059 
00060         DECLARE_WND_CLASS(_T("XMLHttpRequestMonitor")) 
00061 
00062 BEGIN_MSG_MAP(CMonitorWnd)
00063         MESSAGE_HANDLER(MSG_READY_STATE_CHANGE, OnReadyStateChange)
00064 END_MSG_MAP()
00065 
00066         LRESULT OnReadyStateChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
00067 
00068 
00069         
00070         STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
00071 
00072         
00073         STDMETHOD(open)( BSTR bstrMethod,  BSTR bstrUrl,  VARIANT varAsync,  VARIANT bstrUser,  VARIANT bstrPassword);
00074         STDMETHOD(setRequestHeader)( BSTR bstrHeader,  BSTR bstrValue);
00075         STDMETHOD(getResponseHeader)( BSTR bstrHeader,  BSTR * pbstrValue);
00076         STDMETHOD(getAllResponseHeaders)( BSTR * pbstrHeaders);
00077         STDMETHOD(send)( VARIANT varBody);
00078         STDMETHOD(abort)();
00079         STDMETHOD(get_status)( long * plStatus);
00080         STDMETHOD(get_statusText)( BSTR * pbstrStatus);
00081         STDMETHOD(get_responseXML)( IDispatch ** ppBody);
00082         STDMETHOD(get_responseText)( BSTR * pbstrBody);
00083         STDMETHOD(get_responseBody)( VARIANT * pvarBody);
00084         STDMETHOD(get_responseStream)( VARIANT * pvarBody);
00085         STDMETHOD(get_readyState)( long * plState);
00086         STDMETHOD(put_onreadystatechange)( IDispatch * pReadyStateSink);
00087 
00088 private:
00089 
00090         LPDISPATCH        m_pOnReadyStateChange;
00091         bool              m_bAbort;     
00092         HANDLE            m_hThread;            
00093         long              m_lReadyState;
00094         bool              m_bAsync;     
00095         _bstr_t           m_Method;
00096         _bstr_t           m_HostName;   
00097         INTERNET_PORT m_Port;
00098         _bstr_t           m_URLPath;
00099         _bstr_t           m_User;
00100         _bstr_t           m_Password;
00101         DWORD             m_dwStatus;
00102         _bstr_t           m_StatusText; 
00103         _bstr_t           m_ResponseHeaders;
00104         CSimpleMap<_bstr_t, _bstr_t>  m_RequestHeaderMap;
00105         HWND              m_HwndParent;         
00106  
00107         PBYTE             m_pBody;
00108         long              m_lBodyLength;
00109         PBYTE             m_pResponseBody;
00110         long              m_lResponseBodyLength;
00111         _bstr_t       m_Error;  
00112         bool          m_bSuccess;
00113 
00114         HWND GetParentWindow();
00115 
00116         static _bstr_t GetErrorMsg(DWORD rc);
00117         static void CALLBACK InternetStatusCallback(HINTERNET hInternet,
00118                                                                                                 DWORD_PTR dwContext,
00119                                                                                                 DWORD dwInternetStatus,
00120                                                                                                 LPVOID lpvStatusInformation,
00121                                                                                                 DWORD dwStatusInformationLength);
00122         static UINT APIENTRY SendThread(void *pParm);
00123         static HRESULT InitializeVarFromByte(VARIANT &varOut, const PBYTE pByte, long lSize);
00124 };
00125 
00126 typedef CComObject<CXMLHttpRequest> CXMLHttpRequestObj;
00127 
00128 #endif // ___xmlhttprequest_h___