#include "stdafx.h" #include #include "mplugin.h" #include "npupp.h" class ScriptablePluginObject : public NPObject { public: ScriptablePluginObject(NPP npp) { m_MPlugin = NULL; m_Npp = npp; } CMPlugin *m_MPlugin; NPP m_Npp; }; static NPObject *SPO_Allocate(NPP npp,NPClass *aClass) { return new ScriptablePluginObject(npp); } static void SPO_Deallocate(NPObject *obj) { delete (ScriptablePluginObject *)obj; } static void SPO_Invalidate(NPObject *obj) { } static bool SPO_HasMethod(NPObject *obj, NPIdentifier name) { return ((yourclass*)((ScriptablePluginObject*)obj)->m_Plugin->m_Wnd)->Mozilla_HasMethod( name ); } static bool SPO_Invoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { return ((yourclass*)((ScriptablePluginObject*)obj)->m_Plugin->m_Wnd)->Mozilla_Invoke( name,args,argCount,result ); } static bool SPO_SetProperty(NPObject *obj, NPIdentifier name, const NPVariant *value) { return ((yourclass*)((ScriptablePluginObject*)obj)->m_Plugin->m_Wnd)->Mozilla_SetProperty( name,value ); } static bool SPO_HasProperty(NPObject * obj, NPIdentifier name) { return ((yourclass*)((ScriptablePluginObject*)obj)->m_Plugin->m_Wnd)->Mozilla_HasProperty( name ); } static bool SPO_RemoveProperty(NPObject *obj, NPIdentifier name ) { return ((yourclass*)((ScriptablePluginObject*)obj)->m_Plugin->m_Wnd)->Mozilla_RemoveProperty( name ); } static bool SPO_GetProperty(NPObject *obj, NPIdentifier name, NPVariant *result) { return ((yourclass*)((ScriptablePluginObject*)obj)->m_Plugin->m_Wnd)->Mozilla_GetProperty( name,result ); } static bool SPO_InvokeDefault( NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { return FALSE; } NPClass sSPO_Class = { NP_CLASS_STRUCT_VERSION, SPO_Allocate, SPO_Deallocate, SPO_Invalidate, SPO_HasMethod, SPO_Invoke, SPO_InvokeDefault, SPO_HasProperty, SPO_GetProperty, SPO_SetProperty, SPO_RemoveProperty }; static NPIdentifier sFoo_id; static NPIdentifier sBar_id; static NPIdentifier sDocument_id; static NPIdentifier sBody_id; static NPIdentifier sCreateElement_id; static NPIdentifier sCreateTextNode_id; static NPIdentifier sAppendChild_id; static NPObject *sWindowObj; CMPlugin::CMPlugin(NPP pNPInstance) : m_pNPInstance(pNPInstance), m_pNPStream(NULL), m_bInitialized(FALSE), m_pScriptableObject(NULL), m_lpOldProc(NULL) { m_Wnd = NULL; } CMPlugin::~CMPlugin() { if (m_pScriptableObject) NPN_ReleaseObject(m_pScriptableObject); } #ifdef XP_WIN static LRESULT CALLBACK PluginWinProc(HWND, UINT, WPARAM, LPARAM); #endif NPBool CMPlugin::InitPlugin(NPWindow* pNPWindow) { yourclass *bec = new yourclass; m_Wnd = bec; //TODO add parameters you saved from page to your plugin CWnd *wnd = CWnd::FromHandle( (HWND)pNPWindow->window ); bec->Create( _T("winclass"), _T("yourapp"), WS_CHILD | WS_VISIBLE, rect,wnd , 9001); //TODO m_hWnd = (HWND)pNPWindow->window; // subclass window so we can intercept window messages and // do our drawing to it m_lpOldProc = SubclassWindow(m_hWnd, (WNDPROC)PluginWinProc ); // associate window with our CMPlugin object so we can access // it in the window procedure SetWindowLong(m_hWnd, GWL_USERDATA, (LONG)this); m_bInitialized = TRUE; return TRUE; } void CMPlugin::ClosePlugin() { #ifdef XP_WIN //subclass it back SubclassWindow(m_hWnd, m_lpOldProc); m_hWnd = NULL; #endif if( m_Wnd ) { delete m_Wnd; } m_bInitialized = FALSE; } int16 CMPlugin::handleEvent(void* event) { return 0; } NPObject * CMPlugin::GetScriptableObject() { if (!m_pScriptableObject) { m_pScriptableObject = NPN_CreateObject(m_pNPInstance, &sSPO_Class); ((ScriptablePluginObject*)m_pScriptableObject)->m_Plugin = this; } if (m_pScriptableObject) { NPN_RetainObject(m_pScriptableObject); } return m_pScriptableObject; } #ifdef XP_WIN static LRESULT CALLBACK PluginWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if( msg == WM_SIZE ) { //prcoess browser resize message CMPlugin * p = (CMPlugin *)GetWindowLong(hWnd, GWL_USERDATA); if( p ) {//resize plugin } return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); } #endif