コード例 #1
0
void convertToVariant(NPP npp, Object* value, NPVariant* variant, bool result)
{
    if (!value)
    {
        NULL_TO_NPVARIANT(*variant);
        return;
    }
    if (ProxyObject* proxy = dynamic_cast<ProxyObject*>(value))
    {
        if (result)
        {
            NPN_RetainObject(proxy->getNPObject());
        }
        OBJECT_TO_NPVARIANT(proxy->getNPObject(), *variant);
        return;
    }
    if (PluginInstance* instance = static_cast<PluginInstance*>(npp->pdata))
    {
        StubControl* stubControl = instance->getStubControl();
        if (stubControl)
        {
            NPObject* object = stubControl->createStub(value);
            if (object)
            {
                if (result)
                {
                    NPN_RetainObject(object);
                }
                OBJECT_TO_NPVARIANT(object, *variant);
                return;
            }
        }
    }
    NULL_TO_NPVARIANT(*variant);
}
コード例 #2
0
ファイル: xplayerNPObject.cpp プロジェクト: linuxmint/xplayer
bool
xplayerNPObject::StringVariant (NPVariant* _result,
                              const char* value,
                              int32_t len)
{
  if (!value) {
    NULL_TO_NPVARIANT (*_result);
  } else {
    char *dup;

    if (len < 0) {
      len = strlen (value);
      dup = (char*) NPN_MemDup (value, len + 1);
    } else {
      dup = (char*) NPN_MemDup (value, len);
    }

    if (dup) {
      STRINGN_TO_NPVARIANT (dup, len, *_result);
    } else {
      NULL_TO_NPVARIANT (*_result);
    }
  }

  return true;
}
コード例 #3
0
static bool
plugin_object_get_property (NPObject     *npobj,
                            NPIdentifier  name,
                            NPVariant    *result)
{
  PluginObject *obj;

  if (!plugin_object_has_property (npobj, name))
    return FALSE;

  obj = (PluginObject*) npobj;
  if (name == api_version_id)
    return plugin_get_api_version (obj, result);
  else if (name == shell_version_id)
    return plugin_get_shell_version (obj, result);
  else if (name == onextension_changed_id)
    {
      if (obj->listener)
        OBJECT_TO_NPVARIANT (obj->listener, *result);
      else
        NULL_TO_NPVARIANT (*result);
    }
  else if (name == onrestart_id)
    {
      if (obj->restart_listener)
        OBJECT_TO_NPVARIANT (obj->restart_listener, *result);
      else
        NULL_TO_NPVARIANT (*result);
    }

  return TRUE;
}
コード例 #4
0
void convertV8ObjectToNPVariant(v8::Local<v8::Value> object, NPObject* owner, NPVariant* result)
{
    VOID_TO_NPVARIANT(*result);

    // It is really the caller's responsibility to deal with the empty handle case because there could be different actions to
    // take in different contexts.
    ASSERT(!object.IsEmpty());

    if (object.IsEmpty())
        return;

    if (object->IsInt32())
        INT32_TO_NPVARIANT(object->NumberValue(), *result);
    else if (object->IsNumber())
        DOUBLE_TO_NPVARIANT(object->NumberValue(), *result);
    else if (object->IsBoolean())
        BOOLEAN_TO_NPVARIANT(object->BooleanValue(), *result);
    else if (object->IsNull())
        NULL_TO_NPVARIANT(*result);
    else if (object->IsUndefined())
        VOID_TO_NPVARIANT(*result);
    else if (object->IsString()) {
        v8::String::Utf8Value utf8(object);
        char* utf8_chars = strdup(*utf8);
        STRINGN_TO_NPVARIANT(utf8_chars, utf8.length(), *result);
    } else if (object->IsObject()) {
        WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext());
        NPObject* npobject = npCreateV8ScriptObject(0, v8::Handle<v8::Object>::Cast(object), window);
        if (npobject)
            _NPN_RegisterObject(npobject, owner);
        OBJECT_TO_NPVARIANT(npobject, *result);
    }
}
コード例 #5
0
void handleCallback(PluginObject* object, const char *url, NPReason reason, void *notifyData)
{
    //assert(object);
    
    NPVariant args[2];
    
    NPObject *windowScriptObject;
    browser->getvalue(object->npp, NPNVWindowNPObject, &windowScriptObject);
    
    NPIdentifier callbackIdentifier = notifyData;

    INT32_TO_NPVARIANT(reason, args[0]);

    char *strHdr = NULL;
    if (object->firstUrl && object->firstHeaders && object->lastUrl && object->lastHeaders) {
        // Format expected by JavaScript validator: four fields separated by \n\n:
        // First URL; first header block; last URL; last header block.
        // Note that header blocks already end with \n due to how NPStream::headers works.
        int len = strlen(object->firstUrl) + 2
            + strlen(object->firstHeaders) + 1
            + strlen(object->lastUrl) + 2
            + strlen(object->lastHeaders) + 1;
        strHdr = (char*)malloc(len + 1);
        snprintf(strHdr, len + 1, "%s\n\n%s\n%s\n\n%s\n",
                 object->firstUrl, object->firstHeaders, object->lastUrl, object->lastHeaders);
        STRINGN_TO_NPVARIANT(strHdr, len, args[1]);
    } else
        NULL_TO_NPVARIANT(args[1]);

    NPVariant browserResult;
    browser->invoke(object->npp, windowScriptObject, callbackIdentifier, args, 2, &browserResult);
    browser->releasevariantvalue(&browserResult);

    free(strHdr);
}
コード例 #6
0
static void
retrieve_highres_icon (WebappMonitor *monitor, const gchar *desktop_file)
{
  GKeyFile *key_file;
  gchar *s;
  GError *error = NULL;

  /* Get URL to get icon for */
  key_file = g_key_file_new ();
  if (!g_key_file_load_from_data (key_file, desktop_file, strlen (desktop_file), 0, &error)) {
    g_warning ("Could not parse desktop file: %s", error->message);
    g_error_free (error);

    goto out;
  }

  if (get_icon_size (key_file) >= 64)
    goto out;

  s =  g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL);
  if (s != NULL) {
    gint n_args, i;
    gchar **args, *url = NULL;

    g_debug ("Parsing command line %s", s);

    if (!g_shell_parse_argv (s, &n_args, &args, &error)) {
      g_debug ("Failed parsing command line %s", s);
      goto out;
    }

    for (i = 0; i < n_args && args[i] != NULL; i++) {
      g_debug ("Processing argument %s", args[i]);
      if (g_str_has_prefix (args[i], "--app=")) {
	url = g_strdup (args[i] + 6);
	g_debug ("Found URL %s", url);
	break;
      }
    }

    if (url != NULL) {
      NPVariant url_varg, result;

      STRINGZ_TO_NPVARIANT(url, url_varg);
      NULL_TO_NPVARIANT(result);

      if (!NPN_InvokeDefault (monitor->instance, monitor->icon_loader_callback, &url_varg, 1, &result))
      	g_debug ("Failed calling JS callback");

      g_free (url);
      NPN_ReleaseVariantValue (&result);
    }

    g_strfreev (args);
    g_free (s);
  }

 out:
  g_key_file_free (key_file);
}
コード例 #7
0
void convertV8ObjectToNPVariant(v8::Local<v8::Value> object, NPObject* owner, NPVariant* result)
{
    VOID_TO_NPVARIANT(*result);

    // It is really the caller's responsibility to deal with the empty handle case because there could be different actions to
    // take in different contexts.
    ASSERT(!object.IsEmpty());

    if (object.IsEmpty())
        return;

    if (object->IsNumber())
        DOUBLE_TO_NPVARIANT(object->NumberValue(), *result);
    else if (object->IsBoolean())
        BOOLEAN_TO_NPVARIANT(object->BooleanValue(), *result);
    else if (object->IsNull())
        NULL_TO_NPVARIANT(*result);
    else if (object->IsUndefined())
        VOID_TO_NPVARIANT(*result);
    else if (object->IsString()) {
        v8::Handle<v8::String> str = object->ToString();
        int length = str->Utf8Length() + 1;
        char* utf8Chars = reinterpret_cast<char*>(malloc(length));
        str->WriteUtf8(utf8Chars, length, 0, v8::String::HINT_MANY_WRITES_EXPECTED);
        STRINGN_TO_NPVARIANT(utf8Chars, length-1, *result);
    } else if (object->IsObject()) {
        DOMWindow* window = V8Proxy::retrieveWindow(V8Proxy::currentContext());
        NPObject* npobject = npCreateV8ScriptObject(0, v8::Handle<v8::Object>::Cast(object), window);
        if (npobject)
            _NPN_RegisterObject(npobject, owner);
        OBJECT_TO_NPVARIANT(npobject, *result);
    }
}
コード例 #8
0
void convertToVariant(NPP npp, const Any& any, NPVariant* variant, bool result)
{
    switch (any.getType())
    {
    case Any::Empty:
        NULL_TO_NPVARIANT(*variant);
        break;
    case Any::Bool:
        BOOLEAN_TO_NPVARIANT(any.toBoolean(), *variant);
        break;
    case Any::Int32:
    case Any::Uint32:
        INT32_TO_NPVARIANT(static_cast<int32_t>(any), *variant);
        break;
    case Any::Int64:
    case Any::Uint64:
    case Any::Float32:
    case Any::Float64:
        DOUBLE_TO_NPVARIANT(static_cast<double>(any), *variant);
        break;
    case Any::Dynamic:
        if (any.isString())
        {
            std::string value = any.toString();
            if (value.length() == 0)
            {
                STRINGN_TO_NPVARIANT(0, 0, *variant);
            }
            else if (!result)
            {
                STRINGN_TO_NPVARIANT(value.c_str(), static_cast<uint32_t>(value.length()), *variant);
            }
            else {
                void* buffer = NPN_MemAlloc(value.length());
                if (!buffer)
                {
                    STRINGN_TO_NPVARIANT(0, 0, *variant);
                }
                else
                {
                    memmove(buffer, value.c_str(), value.length());
                    STRINGN_TO_NPVARIANT(static_cast<NPUTF8*>(buffer), static_cast<uint32_t>(value.length()), *variant);
                }
            }
        }
        else
        {
            assert(any.isObject());
            convertToVariant(npp, any.toObject(), variant, result);
        }
        break;
    default:
        VOID_TO_NPVARIANT(*variant);
        break;
    }
}
コード例 #9
0
ファイル: mrb_js.cpp プロジェクト: guofei/JsMruby
static mrb_value mrb_js_obj_method_missing(mrb_state *mrb, mrb_value self)
{
    NPP npp = MRB_UD_NPP(mrb);

    mrb_value name_sym, *args;
    int len;
    mrb_get_args(mrb, "o*", &name_sym, &args, &len);
    if (mrb_type(name_sym) != MRB_TT_SYMBOL){
        return mrb_nil_value();
    }

    bool success = true;
    NPVariant empty;
    NULL_TO_NPVARIANT(empty);
    std::vector< NPVariant > var_args(len, empty);
    for (int i=0; i<len; i++){
        if (!convert_mrb_to_js(mrb, args[i], npp, &var_args[i])){
            success = false;
            break;
        }
    }

    mrb_value ret = mrb_nil_value();
    if (success){
        int name_len;
        const char *name_char = mrb_sym2name_len(mrb, SYM2ID(name_sym), &name_len);
        std::string name(name_char, name_len);
        NPIdentifier name_id = NPN_GetStringIdentifier(name.c_str());

        NPObject *obj = (NPObject *)DATA_PTR(self);
        if (NPN_HasMethod(npp, obj, name_id)){
            NPVariant result;
            NPN_Invoke(npp, obj, name_id, &var_args[0], len, &result);
            convert_js_to_mrb(npp, result, mrb, &ret);
        }else if (NPN_HasProperty(npp, obj, name_id)){
            NPVariant result;
            NPN_GetProperty(npp, obj, name_id, &result);
            convert_js_to_mrb(npp, result, mrb, &ret);
        }else if (name.size() > 1 && name[name.size() - 1] == '=' && var_args.size() == 1){
            name.resize(name.size() - 1);
            name_id = NPN_GetStringIdentifier(name.c_str());
            if (NPN_HasProperty(npp, obj, name_id)){
                NPN_SetProperty(npp, obj, name_id, &var_args[0]);
            }
        }
    }

    for (int i=0; i<len; i++){
        NPN_ReleaseVariantValue(&var_args[i]);
    }

    return ret;
}
コード例 #10
0
NPVariant NPRemoteObjectMap::npVariantDataToNPVariant(const NPVariantData& npVariantData, Plugin* plugin)
{
    NPVariant npVariant;

    switch (npVariantData.type()) {
    case NPVariantData::Void:
        VOID_TO_NPVARIANT(npVariant);
        break;
    case NPVariantData::Null:
        NULL_TO_NPVARIANT(npVariant);
        break;
    case NPVariantData::Bool:
        BOOLEAN_TO_NPVARIANT(npVariantData.boolValue(), npVariant);
        break;
    case NPVariantData::Int32:
        INT32_TO_NPVARIANT(npVariantData.int32Value(), npVariant);
        break;
    case NPVariantData::Double:
        DOUBLE_TO_NPVARIANT(npVariantData.doubleValue(), npVariant);
        break;
    case NPVariantData::String: {
        NPString npString = createNPString(npVariantData.stringValue());
        STRINGN_TO_NPVARIANT(npString.UTF8Characters, npString.UTF8Length, npVariant);
        break;
    }
    case NPVariantData::LocalNPObjectID: {
        uint64_t npObjectID = npVariantData.localNPObjectIDValue();
        ASSERT(npObjectID);

        NPObjectMessageReceiver* npObjectMessageReceiver = m_registeredNPObjects.get(npObjectID);
        if (!npObjectMessageReceiver) {
            ASSERT_NOT_REACHED();
            VOID_TO_NPVARIANT(npVariant);
            break;
        }

        NPObject* npObject = npObjectMessageReceiver->npObject();
        ASSERT(npObject);

        retainNPObject(npObject);
        OBJECT_TO_NPVARIANT(npObject, npVariant);
        break;
    }
    case NPVariantData::RemoteNPObjectID: {
        NPObject* npObjectProxy = createNPObjectProxy(npVariantData.remoteNPObjectIDValue(), plugin);
        OBJECT_TO_NPVARIANT(npObjectProxy, npVariant);
        break;
    }
    }

    return npVariant;
}
コード例 #11
0
ファイル: xplayerNPObject.cpp プロジェクト: linuxmint/xplayer
bool
xplayerNPObject::ObjectVariant (NPVariant* _result,
                              NPObject* object)
{
  if (object) {
    NPN_RetainObject (object);
    OBJECT_TO_NPVARIANT (object, *_result);
  } else {
    NULL_TO_NPVARIANT (*_result);
  }

  return true;
}
コード例 #12
0
// Variant value must be released with NPReleaseVariantValue()
void convertValueToNPVariant(ExecState *exec, JSValue *value, NPVariant *result)
{
    JSLock lock;
    
    JSType type = value->type();
    
    VOID_TO_NPVARIANT(*result);

    if (type == StringType) {
        UString ustring = value->toString(exec);
        CString cstring = ustring.UTF8String();
        NPString string = { (const NPUTF8 *)cstring.c_str(), static_cast<uint32_t>(cstring.size()) };
        NPN_InitializeVariantWithStringCopy(result, &string);
    } else if (type == NumberType) {
        DOUBLE_TO_NPVARIANT(value->toNumber(exec), *result);
    } else if (type == BooleanType) {
        BOOLEAN_TO_NPVARIANT(value->toBoolean(exec), *result);
    } else if (type == UnspecifiedType) {
        VOID_TO_NPVARIANT(*result);
    } else if (type == NullType) {
        NULL_TO_NPVARIANT(*result);
    } else if (type == ObjectType) {
        JSObject* object = static_cast<JSObject*>(value);
        if (object->classInfo() == &RuntimeObjectImp::info) {
            RuntimeObjectImp* imp = static_cast<RuntimeObjectImp *>(value);
            CInstance* instance = static_cast<CInstance*>(imp->getInternalInstance());
            if (instance) {
                NPObject* obj = instance->getObject();
                _NPN_RetainObject(obj);
                OBJECT_TO_NPVARIANT(obj, *result);
            }
        } else {
            Interpreter* originInterpreter = exec->dynamicInterpreter();
            RootObject* originRootObject = findRootObject(originInterpreter);

            Interpreter* interpreter = 0;
            if (originInterpreter->isGlobalObject(value)) {
                interpreter = originInterpreter->interpreterForGlobalObject(value);
            }

            if (!interpreter)
                interpreter = originInterpreter;

            RootObject* rootObject = findRootObject(interpreter);
            if (rootObject) {
                NPObject* npObject = _NPN_CreateScriptObject(0, object, originRootObject, rootObject);
                OBJECT_TO_NPVARIANT(npObject, *result);
            }
        }
    }
}
コード例 #13
0
ファイル: api.c プロジェクト: wosigh/terminal
void scrollTop(NPP instance, NPObject *scroller)
	{
#if 1
	scrollTo(instance, scroller, 0, false);
#else
	//scroller.mojo.revealTop(0)
	//	TODO:	test again with NULL_TO_NPVARIANT(args) and/or VOID_TO_NPVARIANT(args)
	//		as when OBJECT_TO_NPVARIANT(0, args) was used it crashed
	NPVariant args;
	NULL_TO_NPVARIANT(args);
	//debug(DBG_MAIN, "scrollTop()");
	NPVariant var;
	scrollCommon(instance, scroller, "revealTop", args, 1, &var);
#endif
	}
コード例 #14
0
static bool do_exec(const NPVariant cmd, NPVariant *result)
{
	bool ret = false;
	const char *cmd_str;
	char *out_str;
	FILE *fp = NULL;
	char buf[1024 * 1024];

	/* set default return value */
	NULL_TO_NPVARIANT(*result);
		
	/* init algor */
	if (!NPVARIANT_IS_STRING(cmd)) {
		fprintf(stderr, "%s (%s %d): invalid argument type\n", prog, __FILE__, __LINE__);
		goto end;
	}	
	if (!(cmd_str = NPVARIANT_TO_STRING(cmd).UTF8Characters)) {
		fprintf(stderr, "%s (%s %d): invalid argument value\n", prog, __FILE__, __LINE__);
		goto end;
	}
	if (strlen(cmd_str) <= 0) {
		fprintf(stderr, "%s (%s %d): invalid argument value\n", prog, __FILE__, __LINE__);
		goto end;
	}

	if (!(fp = popen(cmd_str, "r"))) {
		fprintf(stderr, "%s (%s %d): execute `%s' failed\n", prog, __FILE__, __LINE__, cmd_str);
		goto end;
	}

	buf[0] = 0;
	fread(buf, 1, sizeof(buf), fp);
	
	if (!(out_str = strdup(buf))) {
		fprintf(stderr, "%s (%s %d): inner error\n", prog, __FILE__, __LINE__);
		goto end;
	}

	/* set output */
	STRINGZ_TO_NPVARIANT(out_str, *result);

	ret = true;

end:	
	if (fp) pclose(fp);
	return ret;		
}
コード例 #15
0
static bool
plugin_object_get_property (NPObject     *npobj,
			    NPIdentifier  name,
			    NPVariant    *result)
{
  PluginObject *obj;

  g_return_val_if_fail (plugin_object_has_property (npobj, name), FALSE);

  obj = (PluginObject*) npobj;
  if (obj->listener)
    OBJECT_TO_NPVARIANT (obj->listener, *result);
  else
    NULL_TO_NPVARIANT (*result);

  return TRUE;
}
コード例 #16
0
// Variant value must be released with NPReleaseVariantValue()
void convertValueToNPVariant(ExecState* exec, JSValue value, NPVariant* result)
{
    JSLock lock(SilenceAssertionsOnly);

    VOID_TO_NPVARIANT(*result);

    if (value.isString()) {
        UString ustring = value.toString(exec);
        CString cstring = ustring.utf8();
        NPString string = { (const NPUTF8*)cstring.data(), static_cast<uint32_t>(cstring.length()) };
        NPN_InitializeVariantWithStringCopy(result, &string);
    } else if (value.isNumber()) {
        DOUBLE_TO_NPVARIANT(value.toNumber(exec), *result);
    } else if (value.isBoolean()) {
        BOOLEAN_TO_NPVARIANT(value.toBoolean(exec), *result);
    } else if (value.isNull()) {
        NULL_TO_NPVARIANT(*result);
    } else if (value.isObject()) {
        JSObject* object = asObject(value);
        if (object->classInfo() == &CRuntimeObject::s_info) {
            CRuntimeObject* runtimeObject = static_cast<CRuntimeObject*>(object);
            CInstance* instance = runtimeObject->getInternalCInstance();
            if (instance) {
                NPObject* obj = instance->getObject();
                _NPN_RetainObject(obj);
                OBJECT_TO_NPVARIANT(obj, *result);
            }
        } else {
#ifdef ANDROID
            RootObject* rootObject = findRootObject(exec->dynamicGlobalObject());
            if (!rootObject)
                rootObject = findRootObject(exec->lexicalGlobalObject());
#else
            JSGlobalObject* globalObject = exec->dynamicGlobalObject();

            RootObject* rootObject = findRootObject(globalObject);
#endif
            if (rootObject) {
                NPObject* npObject = _NPN_CreateScriptObject(0, object, rootObject);
                OBJECT_TO_NPVARIANT(npObject, *result);
            }
        }
    }
}
コード例 #17
0
ファイル: nporuntime.cpp プロジェクト: FranEstSol/vc-axnp-vlc
RuntimeNPObject::InvokeResult
RuntimeNPObject::invokeResultString(const char *psz, NPVariant &result)
{
    if( !psz )
        NULL_TO_NPVARIANT(result);
    else
    {
        size_t len = strlen(psz);
        NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);
        if( !retval )
            return INVOKERESULT_OUT_OF_MEMORY;
        else
        {
            memcpy(retval, psz, len);
            STRINGN_TO_NPVARIANT(retval, len, result);
        }
    }
    return INVOKERESULT_NO_ERROR;
}
コード例 #18
0
void ConvertV8ObjectToNPVariant(v8::Local<v8::Value> object, NPObject *owner,
                                NPVariant* result) {
  VOID_TO_NPVARIANT(*result);

  // It is really the caller's responsibility to deal with the empty handle
  // case because there could be different actions to take in different
  // contexts.
  ASSERT(!object.IsEmpty());

  if (object.IsEmpty()) return;

  if (object->IsNumber()) {
    DOUBLE_TO_NPVARIANT(object->NumberValue(), *result);

  } else if (object->IsBoolean()) {
    BOOLEAN_TO_NPVARIANT(object->BooleanValue(), *result);

  } else if (object->IsNull()) {
    NULL_TO_NPVARIANT(*result);

  } else if (object->IsUndefined()) {
    VOID_TO_NPVARIANT(*result);

  } else if (object->IsString()) {
    v8::Handle<v8::String> str = object->ToString();
    uint16_t *buf = new uint16_t[str->Length()+1];
    str->Write(buf);
    std::string utf8 = WideToUTF8(reinterpret_cast<wchar_t*>(buf));
    char* utf8_chars = strdup(utf8.c_str());
    STRINGN_TO_NPVARIANT(utf8_chars, utf8.length(), *result);
    delete[] buf;

  } else if (object->IsObject()) {
    WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow();
    NPObject* npobject = NPN_CreateScriptObject(
        0, v8::Handle<v8::Object>::Cast(object), window);
    if (npobject) {
      _NPN_RegisterObject(npobject, owner);
    }
    OBJECT_TO_NPVARIANT(npobject, *result);
  }
}
コード例 #19
0
void NPRuntimeObjectMap::convertJSValueToNPVariant(ExecState* exec, JSValue value, NPVariant& variant)
{
    JSLockHolder lock(exec);

    VOID_TO_NPVARIANT(variant);
    
    if (value.isNull()) {
        NULL_TO_NPVARIANT(variant);
        return;
    }

    if (value.isUndefined()) {
        VOID_TO_NPVARIANT(variant);
        return;
    }

    if (value.isBoolean()) {
        BOOLEAN_TO_NPVARIANT(value.toBoolean(exec), variant);
        return;
    }

    if (value.isNumber()) {
        DOUBLE_TO_NPVARIANT(value.toNumber(exec), variant);
        return;
    }

    if (value.isString()) {
        NPString npString = createNPString(value.toString(exec)->value(exec).utf8());
        STRINGN_TO_NPVARIANT(npString.UTF8Characters, npString.UTF8Length, variant);
        return;
    }

    if (value.isObject()) {
        NPObject* npObject = getOrCreateNPObject(exec->vm(), asObject(value));
        OBJECT_TO_NPVARIANT(npObject, variant);
        return;
    }

    ASSERT_NOT_REACHED();
}
コード例 #20
0
// GetVariable sends a message to the player that looks like this:
// "Command Name\n", ie... "GetVariable var1\n". Then it waits
// for the response with the type and value.
GnashNPVariant
GnashPluginScriptObject::GetVariable(const std::string &name)
{
    std::vector<std::string> iargs;
    std::string str = plugin::ExternalInterface::makeString(name);
    iargs.push_back(str);
    str = plugin::ExternalInterface::makeInvoke("GetVariable", iargs);

    log_debug("Trying to get a value for %s.", name);
    
    size_t ret = writePlayer(str);
    if (ret != str.size()) {
        // If all the browser wants is the version, we don't need to
        // ask the standalone player for this value. YouTube at
        // least depends on this for some pages which want this to
        // be greater than 8.0.0. This appears to potentially be
        // Google's way of trying to revent downloaders, as this requires
        // plugin support.
        NPVariant value;
        if (name == "$version") {
            STRINGN_TO_NPVARIANT("LNX 10,0,r999", 13, value);
        } else {
            log_error("Couldn't send GetVariable request, network problems.");
            NULL_TO_NPVARIANT(value);
        }
        return value;
    }

    // Have the read function allocate the memory
    std::string data = readPlayer();
    if (data.empty()) {
        return GnashNPVariant();
    }

    GnashNPVariant parsed = plugin::ExternalInterface::parseXML(this, data);

    printNPVariant(&parsed.get());
    
    return parsed;
}
コード例 #21
0
ファイル: callbacks.cpp プロジェクト: sunarto/gnash
// GetVariable( Name )
//
// Sends something like this:
// <invoke name="GetVariable" returntype="xml">
//      <arguments>
//              <string>var1</string>
//      </arguments>
// </invoke>
//
// Receives something like this:
//      <number>123</number>
bool
GetVariableCallback (NPObject *npobj, NPIdentifier /* name */,
                     const NPVariant *args,
                     uint32_t argCount, NPVariant *result)
{
    log_debug(__PRETTY_FUNCTION__);

    GnashPluginScriptObject *gpso = (GnashPluginScriptObject *)npobj;
    std::string varname;
    // This method only takes one argument
    if (argCount == 1) {
        varname = NPStringToString(NPVARIANT_TO_STRING(args[0]));

        GnashNPVariant value = gpso->GetVariable(varname);
        value.copy(*result);

        return true;
    }

    NULL_TO_NPVARIANT(*result);
    return false;
}
コード例 #22
0
ファイル: ewk_js.cpp プロジェクト: dog-god/iptv
static Eina_Bool ewk_js_variant_to_npvariant(const Ewk_JS_Variant* data, NPVariant* result)
{
    EINA_SAFETY_ON_NULL_RETURN_VAL(data, false);
    EINA_SAFETY_ON_NULL_RETURN_VAL(result, false);
    const char* string_value;

    switch (data->type) {
    case EWK_JS_VARIANT_VOID:
        VOID_TO_NPVARIANT(*result);
        break;
    case EWK_JS_VARIANT_NULL:
        NULL_TO_NPVARIANT(*result);
        break;
    case EWK_JS_VARIANT_INT32:
        INT32_TO_NPVARIANT(data->value.i, *result);
        break;
    case EWK_JS_VARIANT_DOUBLE:
        DOUBLE_TO_NPVARIANT(data->value.d, *result);
        break;
    case EWK_JS_VARIANT_STRING:
        string_value = eina_stringshare_add(data->value.s);
        if (string_value)
            STRINGZ_TO_NPVARIANT(string_value, *result);
        else
            return false;
        break;
    case EWK_JS_VARIANT_BOOL:
        BOOLEAN_TO_NPVARIANT(data->value.b, *result);
        break;
    case EWK_JS_VARIANT_OBJECT:
        OBJECT_TO_NPVARIANT(reinterpret_cast<NPObject*>(data->value.o), *result);
        break;
    default:
        return false;
    }

    return true;
}
コード例 #23
0
// Variant value must be released with NPReleaseVariantValue()
void convertValueToNPVariant(ExecState* exec, JSValuePtr value, NPVariant* result)
{
    JSLock lock(false);

    VOID_TO_NPVARIANT(*result);

    if (value.isString()) {
        UString ustring = value.toString(exec);
        CString cstring = ustring.UTF8String();
        NPString string = { (const NPUTF8*)cstring.c_str(), static_cast<uint32_t>(cstring.size()) };
        NPN_InitializeVariantWithStringCopy(result, &string);
    } else if (value.isNumber()) {
        DOUBLE_TO_NPVARIANT(value.toNumber(exec), *result);
    } else if (value.isBoolean()) {
        BOOLEAN_TO_NPVARIANT(value.toBoolean(exec), *result);
    } else if (value.isNull()) {
        NULL_TO_NPVARIANT(*result);
    } else if (value.isObject()) {
        JSObject* object = asObject(value);
        if (object->classInfo() == &RuntimeObjectImp::s_info) {
            RuntimeObjectImp* imp = static_cast<RuntimeObjectImp*>(object);
            CInstance* instance = static_cast<CInstance*>(imp->getInternalInstance());
            if (instance) {
                NPObject* obj = instance->getObject();
                _NPN_RetainObject(obj);
                OBJECT_TO_NPVARIANT(obj, *result);
            }
        } else {
            JSGlobalObject* globalObject = exec->dynamicGlobalObject();

            RootObject* rootObject = findRootObject(globalObject);
            if (rootObject) {
                NPObject* npObject = _NPN_CreateScriptObject(0, object, rootObject);
                OBJECT_TO_NPVARIANT(npObject, *result);
            }
        }
    }
}
コード例 #24
0
void testNPRuntime(NPP npp)
{
    NPObject* windowScriptObject;
    browser->getvalue(npp, NPNVWindowNPObject, &windowScriptObject);

    // Invoke
    NPIdentifier testNPInvoke = browser->getstringidentifier("testNPInvoke");
    NPVariant args[7];
    
    VOID_TO_NPVARIANT(args[0]);
    NULL_TO_NPVARIANT(args[1]);
    BOOLEAN_TO_NPVARIANT(true, args[2]);
    INT32_TO_NPVARIANT(242, args[3]);
    DOUBLE_TO_NPVARIANT(242.242, args[4]);
    STRINGZ_TO_NPVARIANT("Hello, World", args[5]);
    OBJECT_TO_NPVARIANT(windowScriptObject, args[6]);
    
    NPVariant result;
    if (browser->invoke(npp, windowScriptObject, testNPInvoke, args, 7, &result))
        browser->releasevariantvalue(&result);
    
    browser->releaseobject(windowScriptObject);
}
コード例 #25
0
ファイル: mrb_js.cpp プロジェクト: guofei/JsMruby
bool convert_mrb_to_js(mrb_state *mrb, mrb_value value, NPP npp, NPVariant *result)
{
    switch(mrb_type(value)){
      case MRB_TT_FALSE:
        if (mrb_nil_p(value)){
            NULL_TO_NPVARIANT(*result);
        }else{
            BOOLEAN_TO_NPVARIANT(false, *result);
        }
        return true;
      case MRB_TT_TRUE:
        BOOLEAN_TO_NPVARIANT(true, *result);
        return true;
      case MRB_TT_FIXNUM:
        INT32_TO_NPVARIANT(mrb_fixnum(value), *result);
        return true;
      case MRB_TT_FLOAT:
        DOUBLE_TO_NPVARIANT(mrb_float(value), *result);
        return true;
      case MRB_TT_ARRAY:
        return convert_mrb_to_js_array(mrb, value, npp, result);
      case MRB_TT_HASH:
        return convert_mrb_to_js_hash(mrb, value, npp, result);
      case MRB_TT_STRING:
        return convert_mrb_to_js_string(mrb, value, npp, result);
      case MRB_TT_DATA:
        return convert_mrb_to_js_data(mrb, value, npp, result);
      case MRB_TT_PROC:
        OBJECT_TO_NPVARIANT(MrbProcObject::Create(npp, mrb, value), *result);
        return true;
      default:
        OBJECT_TO_NPVARIANT(MrbJsObject::Create(npp, mrb, value), *result);
        return true;
    }
    return false;
}
コード例 #26
0
ファイル: Statement.cpp プロジェクト: openlink/WebDB_ODBC
NPError 
StatementObject::GetVariant(int index, NPVariant *value)
{
  if (!m_hstmt) {
    NPN_SetException(this, "Statement isn't initialized");
    return NPERR_GENERIC_ERROR;
  }

  if (index < 0 || index >= m_columnCount) {
    NPN_SetException(this, "Column index is out of range");
    return NPERR_GENERIC_ERROR;
  }

  SQLLEN cbInd;
  int type;
  NPError rc;

  GetColumnType(index, &type);
  index++;


  NULL_TO_NPVARIANT(*value);

  switch (type) {
    case VALUE_TYPE_BIT:
      {
        bool v_bool;
        rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_BIT, &v_bool, 0, &cbInd));
        if (rc != NPERR_NO_ERROR)
          return rc;
        if (cbInd != SQL_NULL_DATA) 
          BOOLEAN_TO_NPVARIANT(v_bool, *value);
        break;
      }
    case VALUE_TYPE_TINYINT:
    case VALUE_TYPE_SMALLINT:
    case VALUE_TYPE_BIGINT:
    case VALUE_TYPE_INTEGER:
      {
        SQLINTEGER v_int32;
        rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_LONG, &v_int32, 0, &cbInd));
        if (rc != NPERR_NO_ERROR)
          return rc;
        if (cbInd != SQL_NULL_DATA)
          INT32_TO_NPVARIANT(v_int32, *value);
        break;
      }

    case VALUE_TYPE_FLOAT:
    case VALUE_TYPE_REAL:
    case VALUE_TYPE_DOUBLE:
      {
        double v_double;
        rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_DOUBLE, &v_double, 0, &cbInd));
        if (rc != NPERR_NO_ERROR)
          return rc;
        if (cbInd != SQL_NULL_DATA)
          DOUBLE_TO_NPVARIANT(v_double, *value);
        break;
      }

/**
    case VALUE_TYPE_BINARY:
    case VALUE_TYPE_VARBINARY:
    case VALUE_TYPE_LONGVARBINARY:
      {
        const char hexString[] = "0123456789ABCDEF";
        SQLLEN len;
        SQLWCHAR buf[32];
        unsigned char *pin;
        char *pout;

        rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_BINARY, buf, 0, &len));
        if (rc != NPERR_NO_ERROR)
          return rc;

        if (len == SQL_NO_TOTAL) 
          {
            const SQLLEN dwUnit = 8192;
            unsigned char *pBuff;
            unsigned char *pData = NULL;
            SQLLEN dwAvialable;
            SQLLEN bufSize = dwUnit;
            char *data = NULL;

            pData = (unsigned char *)NPN_MemAlloc(bufSize);
            if (!pData) {
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }

            len = 0;
            pBuff = pData;
            while(1) {
              SQLRETURN ret;
              pBuff = pData + len;
              ret = SQLGetData(m_hstmt, index, SQL_C_BINARY, pBuff, dwUnit, &dwAvialable);
              if (ret == SQL_NO_DATA_FOUND)
                break;
              if ((rc = CheckStmtRC(ret)) != NPERR_NO_ERROR)
                return rc;
              if (dwAvialable < dwUnit) {
                len += dwAvialable;
                break;
              }
              len += dwUnit;
              bufSize += dwUnit;
              unsigned char* tmp = (unsigned char*)NPN_MemAlloc(bufSize);
              if (!pBuff) {
                NPN_SetException(this, "Memory allocation error");
                return NPERR_GENERIC_ERROR;
              }
              memcpy(pBuff, pData, len);
              NPN_MemFree(pData);
              pData = pBuff;
              pBuff = pData + len;
            }

            data = (char*)NPN_MemAlloc(len*2+1);
            if (!data) {
              NPN_MemFree(pData);
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }
            pout = data;
            pin = pData;
            while(len--) {
              unsigned char binVal = *pin++;
              *pout++ = hexString[(binVal >> 4) & 0xf];
              *pout++ = hexString[binVal & 0xf];
            }
            *pout = 0;
            NPN_MemFree(pData);
            STRING_TO_NPVARIANT(data, *value);

          }
          else if (len != SQL_NULL_DATA) 
          {
            unsigned char *pData;
            SQLLEN bufSize = len + 1;
            char *data = NULL;

            pData = (unsigned char *)NPN_MemAlloc(bufSize);
            if (!pData) {
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }

            rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_BINARY, pData, bufSize, &len));
            if (rc != NPERR_NO_ERROR)
              return rc;

            data = (char*)NPN_MemAlloc(len*2+1);
            if (!data) {
              NPN_MemFree(pData);
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }
            pout = data;
            pin = pData;
            while(len--) {
              unsigned char binVal = *pin++;
              *pout++ = hexString[(binVal >> 4) & 0xf];
              *pout++ = hexString[binVal & 0xf];
            }
            *pout = 0;
            NPN_MemFree(pData);
            STRING_TO_NPVARIANT(data, *value);
          }

        break;
      }
**/

    case VALUE_TYPE_BINARY:
    case VALUE_TYPE_VARBINARY:
    case VALUE_TYPE_LONGVARBINARY:

    case VALUE_TYPE_GUID:

    case VALUE_TYPE_CHAR:
    case VALUE_TYPE_VARCHAR:
    case VALUE_TYPE_LONGVARCHAR:
    case VALUE_TYPE_WCHAR:
    case VALUE_TYPE_WVARCHAR:
    case VALUE_TYPE_WLONGVARCHAR:

    case VALUE_TYPE_UNKNOWN:

    case VALUE_TYPE_NUMERIC:
    case VALUE_TYPE_DECIMAL:

    case VALUE_TYPE_DATE:
    case VALUE_TYPE_TIME:
    case VALUE_TYPE_TIMESTAMP:
    default:
      {
        SQLLEN len;
        SQLLEN dtype;
        SQLWCHAR buf[32];

        rc = CheckStmtRC(SQLColAttributesW (m_hstmt, index, SQL_COLUMN_TYPE, NULL, 0, NULL, &dtype));
        if (rc != NPERR_NO_ERROR)
          return rc;

        if (dtype == SQL_LONGVARBINARY || dtype == SQL_VARBINARY || dtype == SQL_BINARY ||
            dtype == SQL_LONGVARCHAR || dtype == SQL_VARCHAR || dtype == SQL_CHAR ||
            dtype == SQL_WLONGVARCHAR || dtype == SQL_WVARCHAR || dtype == SQL_WCHAR)
        {
          rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_WCHAR, buf, 0, &len));
          if (rc != NPERR_NO_ERROR)
            return rc;

          if (len == SQL_NO_TOTAL) 
          {
            const SQLLEN dwUnit = 4096*sizeof(SQLWCHAR)+sizeof(SQLWCHAR);
            unsigned char *pBuff = NULL;
            unsigned char *pData = NULL;
            SQLLEN dwAvialable;
            SQLLEN bufSize = dwUnit;
            char *data = NULL;
            SQLRETURN ret;

            pData = (unsigned char *)NPN_MemAlloc(bufSize);
            if (!pData) {
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }

            len = 0;
            while(1) {
              pBuff = pData + len;
              ret = SQLGetData(m_hstmt, index, SQL_C_WCHAR, pBuff, dwUnit, &dwAvialable);
              if (ret == SQL_NO_DATA_FOUND)
                break;
              if ((rc = CheckStmtRC(ret)) != NPERR_NO_ERROR)
                return rc;
              if (dwAvialable < dwUnit) {
                len += dwAvialable;
                break;
              }
              len += dwUnit - sizeof(SQLWCHAR);
              bufSize += dwUnit - sizeof(SQLWCHAR);
              unsigned char* tmp = (unsigned char*)NPN_MemAlloc(bufSize);
              if (!tmp) {
                NPN_SetException(this, "Memory allocation error");
                return NPERR_GENERIC_ERROR;
              }
              memcpy(tmp, pData, len);
              NPN_MemFree(pData);
              pData = tmp;
            }

            data = strdup_WtoU8((SQLWCHAR *)pData);
            if (!data) {
              NPN_MemFree(pData);
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }
            NPN_MemFree(pData);
            STRING_TO_NPVARIANT(data, *value);

          }
          else if (len != SQL_NULL_DATA) 
          {
            unsigned char *pData;
            SQLLEN bufSize = len + sizeof(SQLWCHAR);
            char *data = NULL;

            pData = (unsigned char *)NPN_MemAlloc(bufSize);
            if (!pData) {
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }

            rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_WCHAR, pData, bufSize, &len));
            if (rc != NPERR_NO_ERROR)
              return rc;

            data = strdup_WtoU8((SQLWCHAR *)pData);
            if (!data) {
              NPN_MemFree(pData);
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }
            NPN_MemFree(pData);
            STRING_TO_NPVARIANT(data, *value);
          }
        } else {
          rc = CheckStmtRC(SQLGetData(m_hstmt, index, SQL_C_WCHAR, buf, sizeof(buf), &len));
          if (rc != NPERR_NO_ERROR)
            return rc;
          if (len != SQL_NULL_DATA) {
            const char *data = strdup_WtoU8(buf);
            if (!data) {
              NPN_SetException(this, "Memory allocation error");
              return NPERR_GENERIC_ERROR;
            }
            STRING_TO_NPVARIANT(data, *value);
          }
        }  
        break;
      }
    }

  return NPERR_NO_ERROR;
}
コード例 #27
0
static bool
NPChewingInvoke(NPObject *npobj, NPIdentifier name,
                const NPVariant *args, uint32_t argCount,
                NPVariant *result)
{
  uint8_t symbol = -1;
  for (int i = 0; i < METHOD_LENGTH; ++i) {
    if (sSymbolIdentifierMap[i].id == name) {
      symbol = sSymbolIdentifierMap[i].symbol;
      break;
    }
  }

  bool rv = false;
  NPChewingObject* obj = (NPChewingObject*)npobj;
  if (!obj->ctx) {
    return false;
  }
  switch (symbol) {
    case HANDLE_DEFAULT:
    {
      if (argCount != 1) {
        break;
      }
      if (!NPVARIANT_IS_INT32(args[0])) {
        break;
      }
      int32_t key = NPVARIANT_TO_INT32(args[0]);
      int32_t r = chewing.chewing_handle_Default(obj->ctx, key);
      INT32_TO_NPVARIANT(r, *result);
      rv = true;
      break;
    }
    case HANDLE_ENTER:
    {
      if (argCount != 0) {
        break;
      }
      int32_t r = chewing.chewing_handle_Enter(obj->ctx);
      INT32_TO_NPVARIANT(r, *result);
      rv = true;
      break;
    }
    case BUFFER_STRING:
    {
      if (argCount != 0) {
        break;
      }
      if (!chewing.chewing_buffer_Check(obj->ctx)) {
        NULL_TO_NPVARIANT(*result);
        rv = true;
        break;
      }
      char* str = chewing.chewing_buffer_String(obj->ctx);
      char* r = (char*)npn_malloc(strlen(str)+1);
      strcpy(r, str);
      chewing.chewing_free(str);
      STRINGZ_TO_NPVARIANT(r, *result);
      rv = true;
      break;
    }
    case COMMIT_STRING:
    {
      if (argCount != 0) {
        break;
      }
      if (!chewing.chewing_commit_Check(obj->ctx)) {
        NULL_TO_NPVARIANT(*result);
        rv = true;
        break;
      }
      char* str = chewing.chewing_commit_String(obj->ctx);
      char* r = (char*)npn_malloc(strlen(str)+1);
      strcpy(r, str);
      chewing.chewing_free(str);
      STRINGZ_TO_NPVARIANT(r, *result);
      rv = true;
      break;
    }
    case ZHUYIN_STRING:
    {
      if (argCount != 0) {
        break;
      }
      if (!chewing.chewing_zuin_Check(obj->ctx)) {
        NULL_TO_NPVARIANT(*result);
        rv = true;
        break;
      }
      int count = 0;
      char* str = chewing.chewing_zuin_String(obj->ctx, &count);
      char* r = (char*)npn_malloc(strlen(str)+1);
      strcpy(r, str);
      chewing.chewing_free(str);
      STRINGZ_TO_NPVARIANT(r, *result);
      rv = true;
      break;
    }
    case CANDIDATES_LIST:
    {
      if (argCount != 0) {
        break;
      }
      // open candidates list
      chewing.chewing_handle_Down(obj->ctx);

      // create a array object
      NPObject* window = NULL;
      npn_getValue(obj->npp, NPNVWindowNPObject, &window);
      NPObject* array = NULL;
      NPVariant arrayVar;
      npn_invoke(obj->npp,
                 window,
                 npn_getStringIdentifier("Array"),
                 NULL,
                 0,
                 &arrayVar);
      array = NPVARIANT_TO_OBJECT(arrayVar);
      npn_releaseObject(window);

      // Push all candidates to array
      NPIdentifier push = npn_getStringIdentifier("push");
      chewing.chewing_cand_Enumerate(obj->ctx);
      bool hasCandidates = false;
      while (chewing.chewing_cand_hasNext(obj->ctx)) {
        hasCandidates = true;
        char* str = chewing.chewing_cand_String(obj->ctx);
        char* r = (char*)npn_malloc(strlen(str)+1);
        strcpy(r, str);
        chewing.chewing_free(str);
        NPVariant item;
        NPVariant unused;
        STRINGZ_TO_NPVARIANT(r, item);
        npn_invoke(obj->npp, array, push, &item, 1, &unused);
        npn_releaseVariantValue(&unused);
      }
      OBJECT_TO_NPVARIANT(array, *result);
      rv = true;

      if (hasCandidates)
        chewing.chewing_handle_Esc(obj->ctx);
      break;
    }
    case SELECT_CANDIDATE:
    {
      if (argCount != 1) {
        break;
      }
      if (!NPVARIANT_IS_INT32(args[0])) {
        break;
      }
      int32_t n = NPVARIANT_TO_INT32(args[0]);
      chewing.chewing_handle_Down(obj->ctx);
      chewing.chewing_cand_Select(obj->ctx, n);
      NULL_TO_NPVARIANT(*result);
      rv = true;
      break;
    }
    default:
      break;
  }

  return rv;
}
コード例 #28
0
ファイル: xplayerNPObject.cpp プロジェクト: linuxmint/xplayer
bool
xplayerNPObject::NullVariant (NPVariant* _result)
{
  NULL_TO_NPVARIANT (*_result);
  return true;
}
コード例 #29
0
ファイル: callbacks.cpp プロジェクト: sunarto/gnash
// Sends something like this:
// <invoke name="TestASMethod" returntype="xml">
//      <arguments>
//              <number>123</number>
//      </arguments>
// </invoke>
//
//    Receives:
// 	An XML response of one of the standard types like Number or String.
bool
remoteCallback (NPObject *npobj, NPIdentifier name, const NPVariant *args,
                uint32_t argCount, NPVariant *result)
{
    // log_debug(__PRETTY_FUNCTION__);

    GnashPluginScriptObject *gpso = (GnashPluginScriptObject *)npobj;

    std::string method;

#if 1
    if (NPN_IdentifierIsString(name)) {
        log_debug("Invoking remote Method \"%s\"...",
                  NPN_UTF8FromIdentifier(name));
        method = NPN_UTF8FromIdentifier(name);
    } else {
        log_debug("Invoking remote Method: \"%d\"...",
                  NPN_IntFromIdentifier(name));
    }
#endif

    // Build the argument array
    std::vector<std::string> fnargs;
    for (uint32_t i=0; i<argCount; ++i) {
        std::string xml = plugin::ExternalInterface::convertNPVariant(&args[i]);
        fnargs.push_back(xml);

    }

    std::string str = plugin::ExternalInterface::makeInvoke(method, fnargs);

    // Write the message to the Control FD.
    size_t ret = gpso->writePlayer(str);
    // Unless we wrote the same amount of data as the message contained,
    // something went wrong.
    if (ret != str.size()) {
        log_error("Couldn't invoke %s, network problems.", method);
        return false;
    }

    // Have the read function allocate the memory
    std::string data = gpso->readPlayer();
    if (data.empty()) {
        log_error("Couldn't read a response for invoke, network problems.");
        NULL_TO_NPVARIANT(*result);
        return false;
    }

    std::string answer;
    GnashNPVariant parsed = plugin::ExternalInterface::parseXML(data);
    if (!NPVARIANT_IS_NULL(parsed.get())) {
        answer = NPStringToString(NPVARIANT_TO_STRING(parsed.get()));
    }
    if (answer == "Error") {
        NULL_TO_NPVARIANT(*result);
    } else if (answer == "SecurityError") {
        NULL_TO_NPVARIANT(*result);
    } else {
        parsed.copy(*result);
    }

    // printNPVariant(&parsed.get());

    // Returning false makes Javascript stop executing the script.
    return true;
}