CString CPlugin::GetNavigateParam(const NPUTF8* name) const { CString strParam; NPVariant vParam; VOID_TO_NPVARIANT(vParam); try { NPObject* pContainer = GetContainer(); if (!NPN_Invoke(m_pNPInstance, pContainer, GetIdentifier(name), NULL, 0, &vParam)) { throw(CString(_T("Cannot invoke window.Container.getXXX()"))); } if (!NPVARIANT_IS_STRING(vParam)) { throw(CString(_T("Invalid return value."))); } strParam = NPStringToCString(vParam.value.stringValue); } catch (const CString& strMessage) { UNUSED(strMessage); TRACE(_T("[CPlugin::GetNavigateHeaders Exception] %s\n"), strMessage); } if (!NPVARIANT_IS_VOID(vParam)) NPN_ReleaseVariantValue(&vParam); return strParam; }
CString NPIdentifierToCString(NPIdentifier npid) { NPUTF8* putf8IdName = NPN_UTF8FromIdentifier(npid); NPString npstrIdName = { putf8IdName, (uint32_t)strlen(putf8IdName) }; CString idName = NPStringToCString(npstrIdName); NPN_MemFree(putf8IdName); return idName; }
CString CPlugin::GetNavigateParam(const NPUTF8* name) const { CString strParam; NPObject* pWindow = NULL; NPVariant vCOBAContainer; VOID_TO_NPVARIANT(vCOBAContainer); NPVariant vParam; VOID_TO_NPVARIANT(vParam); try { if ((NPN_GetValue( m_pNPInstance, NPNVWindowNPObject, &pWindow) != NPERR_NO_ERROR ) || !pWindow ) { throw(CString(_T("Cannot get window"))); } if ((!NPN_GetProperty( m_pNPInstance, pWindow, NPN_GetStringIdentifier ("COBAContainer"), &vCOBAContainer)) || !NPVARIANT_IS_OBJECT (vCOBAContainer)) { throw(CString(_T("Cannot get window.COBAContainer"))); } if (!NPN_Invoke(m_pNPInstance, NPVARIANT_TO_OBJECT(vCOBAContainer), NPN_GetStringIdentifier(name), NULL, 0, &vParam)) { throw(CString(_T("Cannot execute window.COBAContainer.getXXX()"))); } if (!NPVARIANT_IS_STRING(vParam)) { throw(CString(_T("Invalid return value."))); } strParam = NPStringToCString(vParam.value.stringValue); } catch (CString strMessage) { TRACE(_T("[CPlugin::GetNavigateHeaders Exception] %s"), strMessage); } if (!NPVARIANT_IS_VOID(vParam)) NPN_ReleaseVariantValue(&vParam); if (!NPVARIANT_IS_VOID(vCOBAContainer)) NPN_ReleaseVariantValue(&vCOBAContainer); if (pWindow != NULL) NPN_ReleaseObject(pWindow); return strParam; }
unordered_map<wstring, wstring> NPObjectToUnorderedMap(NPP npp, NPObject* npobj) { unordered_map<wstring, wstring> result; NPIdentifier* pIdentifiers = NULL; uint32_t nIdentifiers = 0; if (NPN_Enumerate(npp, npobj, &pIdentifiers, &nIdentifiers)) { for (uint32_t i = 0; i < nIdentifiers; i++) { NPIdentifier npid = pIdentifiers[i]; CString idName = NPIdentifierToCString(npid); NPVariant npvValue; if (NPN_GetProperty(npp, npobj, npid, &npvValue)) { if (NPVARIANT_IS_STRING(npvValue)) { result[idName.GetString()] = NPStringToCString(NPVARIANT_TO_STRING(npvValue)).GetString(); } NPN_ReleaseVariantValue(&npvValue); } } NPN_MemFree(pIdentifiers); } return result; }
bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { if (m_pMainWindow == NULL) return false; // void Navigate({string} URL, {string} post, {string} headers) if (name == m_NavigateID) { TRACE ("Navigate called!\n"); if (argCount < 3) return false; NPVariant vURL = args[0]; if (vURL.type != NPVariantType_String) return false; CString URL = NPStringToCString(vURL.value.stringValue); NPVariant vHeaders = args[1]; if (vHeaders.type != NPVariantType_String) return false; CString headers = NPStringToCString(vHeaders.value.stringValue); NPVariant vPost = args[2]; if (vPost.type != NPVariantType_String) return false; CString post = NPStringToCString(vPost.value.stringValue); m_pMainWindow->Navigate(URL, post, headers); VOID_TO_NPVARIANT(*result); return true; } // void Refresh() else if (name == m_RefreshID) { TRACE ("Refresh called!\n"); m_pMainWindow->Refresh(); return true; } // void Stop() else if (name == m_StopID) { TRACE ("Stop called!\n"); m_pMainWindow->Stop(); return true; } // void Back() else if (name == m_BackID) { TRACE ("Back called!\n"); m_pMainWindow->Back(); return true; } // void Forward() else if (name == m_ForwardID) { TRACE ("Forward called!\n"); m_pMainWindow->Forward(); return true; } // void Focus() else if (name == m_FocusID) { TRACE ("Focus called!\n"); m_pMainWindow->Focus(); return true; } // void Copy() else if (name == m_CopyID) { TRACE ("Copy called!\n"); m_pMainWindow->Copy(); return true; } // void Cut() else if (name == m_CutID) { TRACE ("Cut called!\n"); m_pMainWindow->Cut(); return true; } // void Paste() else if (name == m_PasteID) { TRACE ("Paste called!\n"); m_pMainWindow->Paste(); return true; } // void SelectAll() else if (name == m_SelectAllID) { TRACE ("SelectAll called!\n"); m_pMainWindow->SelectAll(); return true; } // void Find() else if (name == m_FindID) { TRACE ("Find called!\n"); m_pMainWindow->Find(); return true; } // void HandOverFocus() else if (name == m_HandOverFocusID) { TRACE ("HandOverFocus called!\n"); m_pMainWindow->HandOverFocus(); return true; } // void Zoom({number} level) else if (name == m_ZoomID) { TRACE ("Zoom called!\n"); if (argCount < 1) return false; double level = 1; if (NPVARIANT_IS_DOUBLE(args[0])) level = NPVARIANT_TO_DOUBLE(args[0]); else if ( NPVARIANT_IS_INT32(args[0]) ) level = NPVARIANT_TO_INT32(args[0]); m_pMainWindow->Zoom(level); return true; } // void DisplaySecurityInfo() else if (name == m_DisplaySecurityInfoID) { TRACE ("DisplaySecurityInfo called!\n"); m_pMainWindow->DisplaySecurityInfo(); return true; } // void SaveAs() else if (name == m_SaveAsID) { TRACE ("SaveAs called!\n"); m_pMainWindow->SaveAs(); return true; } // void Print() else if (name == m_PrintID) { TRACE ("Print called!\n"); m_pMainWindow->Print(); return true; } // void PrintPreview() else if (name == m_PrintPreviewID) { TRACE ("PrintPreview called!\n"); m_pMainWindow->PrintPreview(); return true; } // void PrintSetup() else if (name == m_PrintSetupID) { TRACE ("PrintSetup called!\n"); m_pMainWindow->PrintSetup(); return true; } return false; }
CString NPStringCharactersToCString(const NPUTF8* npstrchars) { NPString npstr = { npstrchars, (uint32_t)strlen(npstrchars) }; return NPStringToCString(npstr); }