Search code examples
pluginssafarinpapifirebreath

npapi plugin_invoke function return string value garbage characters


npapi code:

bool plugin_invoke(NPObject *obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result) {
NPUTF8 *name = browser->utf8fromidentifier(methodName);
if(strcmp(name, plugin_method_name_getAddress) == 0){
    NPString password;
    if(argCount > 0) {
        password = NPVARIANT_TO_STRING(args[0]);
    }
    const char * StringVariable = password.UTF8Characters;
    char* npOutString = (char *)malloc(strlen(StringVariable+1));
    if (!npOutString)
        return false;
    strcpy(npOutString, StringVariable);
    STRINGZ_TO_NPVARIANT(npOutString, *result);
    browser->memfree(name);
    return true;
}
return false;

}

html code:

function run() {
    var plugin = document.getElementById("pluginId");
    var passwordBeforEncryption =  document.getElementById("passwordFeild");
    if(plugin){
        var value = plugin.getAddress("hello, just test it");
            alert(value);
    }else{
        alert("plugin is null");
    }

}

The right result should be: "hello, just test it", but sometimes return"hello, just test itÿÿÿÿ". It only sometimes not all time!

Please help.


Solution

  • The error is not in your html,you shuld see NPString structure.

    typedef struct _NPString {
        const NPUTF8 *UTF8Characters;
        uint32_t UTF8Length;
    } NPString;
    

    The member UTF8Length indicate the length of your string,so you should do as below:

    const char * StringVariable = password.UTF8Characters;
    char* npOutString  = (char*)browser->memalloc(password.UTF8Length+1);
    if (!npOutString) {
        return false;
    }
    memcpy(npOutString  , password.UTF8Characters, password.UTF8Length);
    npOutString[password.UTF8Length] = 0;