static inline gchar * get_string_property (NPP instance, NPObject *obj, const char *name) { NPVariant result = { NPVariantType_Void }; NPString result_str; gchar *result_copy; result_copy = NULL; if (!funcs.getproperty (instance, obj, funcs.getstringidentifier (name), &result)) goto out; if (!NPVARIANT_IS_STRING (result)) goto out; result_str = NPVARIANT_TO_STRING (result); result_copy = g_strndup (result_str.UTF8Characters, result_str.UTF8Length); out: funcs.releasevariantvalue (&result); return result_copy; }
bool NPN_GetProperty(NPP id, NPObject* obj, NPIdentifier identifier, NPVariant *variant) { char msg[1024]; sprintf(msg, "NPN_GetProperty"); logger->logMessage(msg); bool rv = NPNFuncs.getproperty(id, obj, identifier, variant); sprintf(msg, "--Return: %x", rv); logger->logMessage(msg); return rv; }
SEXP R_NPAPI_GetProperty(SEXP plug, SEXP Robj, SEXP Rname, SEXP RconvRet) { NPP inst = (NPP) R_ExternalPtrAddr(GET_SLOT( plug , Rf_install( "ref" ) ) ); NPNetscapeFuncs *funcs = (NPNetscapeFuncs *) R_ExternalPtrAddr(GET_SLOT( GET_SLOT(plug, Rf_install("funcs")), Rf_install("ref"))); NPVariant *obj = (NPVariant *) R_ExternalPtrAddr(GET_SLOT( Robj , Rf_install( "ref" ) ) ); if(!NPVARIANT_IS_OBJECT(*obj)) { //What should we return in this case? Rf_error("Robj is not an NPVariant containing an NPObject."); return R_NilValue; } convert_t convRet = (convert_t) INTEGER(RconvRet)[0]; NPVariant *ret = (NPVariant *) funcs->memalloc(sizeof(NPVariant)); const char *ccname = CHAR(STRING_ELT(Rname, 0)); bool success = funcs->getproperty(inst, obj->value.objectValue, funcs->getstringidentifier(ccname), ret); if(!success) { Rf_error("Invoke failed."); return R_NilValue; } SEXP ans; PROTECT(ans = R_NilValue); //ConvertNPToR returns a bool which indicates whether it is safe to release the converted object. bool canfree = ConvertNPToR(ret, inst, funcs, convRet, &ans); if(canfree) funcs->releasevariantvalue(ret); UNPROTECT(1); return ans ; }
bool NPN_GetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName, NPVariant *result) { return NPNFuncs.getproperty(npp, obj, propertyName, result); }
NPError NPP_New(NPMIMEType mimetype, NPP instance, uint16_t mode, int16_t argc, char **argn, char **argv, NPSavedData *saved) { /* instance initialization function */ NPError ret = NPERR_NO_ERROR; PluginData *data; GError *error = NULL; /* first, check if the location is what we expect */ NPObject *window; NPVariant document; NPVariant location; NPVariant href; g_debug ("plugin created"); funcs.getvalue (instance, NPNVWindowNPObject, &window); funcs.getproperty (instance, window, funcs.getstringidentifier ("document"), &document); g_assert (NPVARIANT_IS_OBJECT (document)); funcs.getproperty (instance, NPVARIANT_TO_OBJECT (document), funcs.getstringidentifier ("location"), &location); g_assert (NPVARIANT_IS_OBJECT (location)); funcs.getproperty (instance, NPVARIANT_TO_OBJECT (location), funcs.getstringidentifier ("href"), &href); g_assert (NPVARIANT_IS_STRING (href)); if (strncmp (NPVARIANT_TO_STRING (href).UTF8Characters, ORIGIN, sizeof (ORIGIN)-1)) { g_debug ("origin does not match, is %s", NPVARIANT_TO_STRING (href).UTF8Characters); if (!ALLOW_FOREIGN_ORIGIN) { ret = NPERR_GENERIC_ERROR; goto out; } } data = g_slice_new (PluginData); instance->pdata = data; data->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, NULL, /* interface info */ "org.gnome.Shell", "/org/gnome/Shell", "org.gnome.Shell", NULL, /* GCancellable */ &error); if (!data->proxy) { /* ignore error if the shell is not running, otherwise warn */ if (error->domain != G_DBUS_ERROR || error->code != G_DBUS_ERROR_NAME_HAS_NO_OWNER) { g_warning ("Failed to set up Shell proxy: %s", error->message); g_error_clear (&error); } ret = NPERR_GENERIC_ERROR; } g_debug ("plugin created successfully"); out: funcs.releaseobject (window); funcs.releasevariantvalue (&document); funcs.releasevariantvalue (&location); funcs.releasevariantvalue (&href); return ret; }
static gboolean check_origin_and_protocol (NPP instance) { gboolean ret = FALSE; NPError error; NPObject *window = NULL; NPVariant document = { NPVariantType_Void }; NPVariant location = { NPVariantType_Void }; gchar *hostname = NULL; gchar *protocol = NULL; error = funcs.getvalue (instance, NPNVWindowNPObject, &window); if (error != NPERR_NO_ERROR) goto out; if (!funcs.getproperty (instance, window, funcs.getstringidentifier ("document"), &document)) goto out; if (!NPVARIANT_IS_OBJECT (document)) goto out; if (!funcs.getproperty (instance, NPVARIANT_TO_OBJECT (document), funcs.getstringidentifier ("location"), &location)) goto out; if (!NPVARIANT_IS_OBJECT (location)) goto out; hostname = get_string_property (instance, NPVARIANT_TO_OBJECT (location), "hostname"); if (g_strcmp0 (hostname, ORIGIN)) { g_debug ("origin does not match, is %s", hostname); goto out; } protocol = get_string_property (instance, NPVARIANT_TO_OBJECT (location), "protocol"); if (g_strcmp0 (protocol, "https:") != 0) { g_debug ("protocol does not match, is %s", protocol); goto out; } ret = TRUE; out: g_free (protocol); g_free (hostname); funcs.releasevariantvalue (&location); funcs.releasevariantvalue (&document); if (window != NULL) funcs.releaseobject (window); return ret; }
static void cloud_spy_log (const gchar * log_domain, GLogLevelFlags log_level, const gchar * message, gpointer user_data) { NPNetscapeFuncs * browser = cloud_spy_nsfuncs; NPP instance = static_cast<NPP> (user_data); NPObject * window = NULL, * console = NULL; NPVariant variant, result; NPError error; (void) log_domain; (void) log_level; error = browser->getvalue (instance, NPNVWindowNPObject, &window); if (error != NPERR_NO_ERROR) goto beach; VOID_TO_NPVARIANT (variant); if (!browser->getproperty (instance, window, browser->getstringidentifier ("console"), &variant)) goto beach; console = NPVARIANT_TO_OBJECT (variant); STRINGZ_TO_NPVARIANT (message, variant); VOID_TO_NPVARIANT (result); if (!browser->invoke (instance, console, browser->getstringidentifier ("log"), &variant, 1, &result)) goto beach; browser->releasevariantvalue (&result); beach: if (console != NULL) browser->releaseobject (console); if (window != NULL) browser->releaseobject (window); }