JD2022-TU1/main/extern/Camcam/Inc/browser.h

231 lines
No EOL
5.4 KiB
C++

#ifndef BROWSER_H
#define BROWSER_H
#include <string>
#include <map>
#include <list>
class WebEventHandler;
class BrowserObserver;
/**
* Internal browser widget
*/
class CWebBrowser
{
public:
CWebBrowser() : _DoNotSaveUrl(false), _ForceHidden(false), _IsActive(true), _IWeb(NULL), _WidgetWnd(NULL), _ParentWnd(NULL), _HDLL(NULL), _ConnectionPoint(NULL), _Cookie(0),
_WebEventHandler(NULL), _X(0), _Y(0), _W(512), _H(384), _Initialized(false) {}
~CWebBrowser() { release(); }
/// Initialize
bool init(HWND hParentWnd, DWORD windowStyle);
/// Is the object initialized?
bool initialized() const { return _Initialized; }
/// De-initialize
void release();
/// Put this in the default case of the WndProc of your parent window
void processWindowsMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, void* userParam = NULL);
/// Open web page
bool navigate(char *url);
/// Open last page visited if it existed
bool navigateBack();
// Write some code in the page
//void setHTMLContent(const char *html, bool append=true);
bool getHtmlContent(std::string * html);
/// Toggle visibility
void setVisible(bool visible);
/// Get visibility status
bool isVisible() const;
/// If true, setVisible(bool) will not work, use it after setVisible
void setVisibilityForced(bool visible) { _ForceHidden = visible; }
/// Move/resize
void setPosAndSize(int x, int y, int w, int h);
// Set on top of other windows (if initialized)
//bool setOnTop();
/// get cookies for currently domain with syntax : "name1=value1; name2=value2"
void grabAllCookies();
/// get specific value cookie for currently domain
std::string getCookieValue(const std::string& name);
bool getAllCookies(std::string * cookies);
/// Attach a new observer
void attachObserver(BrowserObserver* obs);
/// Remove an observer
void detachObserver(BrowserObserver* obs);
/// return if URL is equal to _LastUrlVisited
bool checkLastURLVisited(char * url);
/// return if we have lauch this browser for the first time
bool isFirstLoading() const;
/// return if the browser can receive Event
bool isActive() const { return _IsActive; }
void setActive(bool active) { _IsActive = active; }
std::string GetUrl ();
/// erase the last url visited
void clearHistory();
/// get memory usage
#ifndef USER_MODE
unsigned int getMemoryUsage() const;
#endif
bool hasFocus() const;
/// callback when the windows event "WM_DESTROY" is called
void killed();
HWND GetOwnWindow() const;
HWND GetActiveXWindow() const;
HWND GetIEWindow() const;
IWebBrowser2 *GetIWeb() const;
protected:
/// Notify his observers
void notifyObserver(UINT message, WPARAM wParam, void* userParam);
private:
IWebBrowser2 *_IWeb; // MS Web Browser interface
HWND _WidgetWnd; // Container window
HWND _ParentWnd; // Parent window
HINSTANCE _HDLL; // ATL.DLL
IConnectionPoint *_ConnectionPoint; // event handler connection point
DWORD _Cookie; // cookie for connection point
WebEventHandler *_WebEventHandler;
int _X, _Y, _W, _H;
bool _Initialized;
bool _IsActive;
bool _ForceHidden;
bool _DoNotSaveUrl;
std::string _LastUrlVisited;
std::string _CurrentUrl;
typedef std::map<std::string, std::string> CookiesList;
CookiesList _CookiesList;
typedef std::list<std::pair<bool, BrowserObserver*> > ObserverList; // <isAlive, Observer>
ObserverList _ObserverList;
};
#include <exdispid.h>
// Adapted from http://www.cppfrance.com/codes/NAVIGATEUR-WEB-API_29247.aspx
#define BEFORENAVIGATE2 WM_USER
#define DOWNLOADBEGIN WM_USER+1
#define DOWNLOADCOMPLETE WM_USER+2
#define NAVIGATECOMPLETE2 WM_USER+3
#define DOCUMENTCOMPLETE WM_USER+4
#define COMMANDSTATECHANGE WM_USER+5
#define NEWWINDOW3 WM_USER+6
#define DOCUMENTERROR WM_USER+7
/*
*
*/
class WebEventHandler : public IDispatch
{
private:
long _Ref;
BSTR _URL;
public:
struct NewWindowParam
{
BSTR URL;
VARIANT_BOOL * CancelFlagPtr;
} ;
struct DocumentError
{
BSTR URL;
int StatusCode;
} ;
HWND _HWnd;
CWebBrowser *_Browser;
WebEventHandler(HWND hWnd, CWebBrowser *browser) : _HWnd(hWnd), _Browser(browser), _URL(NULL)
{}
~WebEventHandler()
{
//SysFreeString(_URL);
}
void GetUrl (std::string *url);
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject)
{
if (iid==IID_IUnknown || iid==IID_IDispatch || iid==DIID_DWebBrowserEvents2)
{
*ppvObject=this;
AddRef();
return S_OK;
}
else
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef()
{
return InterlockedIncrement(&_Ref);
}
ULONG STDMETHODCALLTYPE Release()
{
int tmp = InterlockedDecrement(&_Ref);
if (tmp==0) delete this;
return tmp;
}
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* parResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr);
};
class BrowserObserver
{
public:
BrowserObserver () {}
virtual void updateEvent(CWebBrowser* webbrowser, UINT message, WPARAM wParam, void* userParam) = 0;
private:
};
#endif // BROWSER_H