// SetVariable( Name, Value ) // // Sends something like this: // <invoke name="SetVariable" returntype="xml"> // <arguments> // <string>var1</string> // <string>value1</string> // </arguments> // </invoke> // // Receives: // nothing bool SetVariableCallback (NPObject *npobj, NPIdentifier /* name */, const NPVariant *args, uint32_t argCount, NPVariant *result) { log_debug(__PRETTY_FUNCTION__); GnashPluginScriptObject *gpso = (GnashPluginScriptObject *)npobj; std::string varname; if (argCount == 2) { varname = NPStringToString(NPVARIANT_TO_STRING(args[0])); const NPVariant& value = args[1]; // log_debug("Setting Variable \"%s\"", varname); gpso->SetVariable(varname, value); BOOLEAN_TO_NPVARIANT(true, *result); return true; } BOOLEAN_TO_NPVARIANT(false, *result); return false; }
// 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; }
void printNPVariant(const NPVariant *value) { if (NPVARIANT_IS_DOUBLE(*value)) { double num = NPVARIANT_TO_DOUBLE(*value); log_debug("is double, value %g", num); } else if (NPVARIANT_IS_STRING(*value)) { std::string str = NPStringToString(NPVARIANT_TO_STRING(*value)); log_debug("is string, value %s", str); } else if (NPVARIANT_IS_BOOLEAN(*value)) { bool flag = NPVARIANT_TO_BOOLEAN(*value); log_debug("is boolean, value %d", flag); } else if (NPVARIANT_IS_INT32(*value)) { int num = NPVARIANT_TO_INT32(*value); log_debug("is int, value %d", num); } else if (NPVARIANT_IS_NULL(*value)) { log_debug("value is null"); } else if (NPVARIANT_IS_VOID(*value)) { log_debug("value is void"); } else if (NPVARIANT_IS_OBJECT(*value)) { log_debug("value is object"); } }
// 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; }