nsresult nsPluginFile::GetPluginInfo(nsPluginInfo& info) { info.fVersion = nsnull; // Passing NULL for a file path will prevent a call to NP_Initialize. nsCOMPtr<nsIPlugin> plugin; nsresult rv = nsNPAPIPlugin::CreatePlugin(NULL, pLibrary, getter_AddRefs(plugin)); if (NS_FAILED(rv)) return rv; if (plugin) { const char* (*npGetPluginVersion)() = (const char* (*)()) PR_FindFunctionSymbol(pLibrary, "NP_GetPluginVersion"); if (npGetPluginVersion) info.fVersion = PL_strdup(npGetPluginVersion()); const char *mimedescr = NULL; plugin->GetMIMEDescription(&mimedescr); #ifdef NS_DEBUG printf("GetMIMEDescription() returned \"%s\"\n", mimedescr); #endif if (NS_FAILED(rv = ParsePluginMimeDescription(mimedescr, info))) return rv; nsCAutoString path; if (NS_FAILED(rv = mPlugin->GetNativePath(path))) return rv; info.fFullPath = PL_strdup(path.get()); nsCAutoString fileName; if (NS_FAILED(rv = mPlugin->GetNativeLeafName(fileName))) return rv; info.fFileName = PL_strdup(fileName.get()); const char *name = NULL; plugin->GetValue(nsPluginVariable_NameString, &name); if (name) info.fName = PL_strdup(name); else info.fName = PL_strdup(fileName.get()); const char *description = NULL; plugin->GetValue(nsPluginVariable_DescriptionString, &description); if (!description) description = ""; info.fDescription = PL_strdup(description); } return NS_OK; }
nsresult nsPluginFile::GetPluginInfo(nsPluginInfo& info, PRLibrary **outLibrary) { *outLibrary = nullptr; info.fVersion = nullptr; // Sadly we have to load the library for this to work. nsresult rv = LoadPlugin(outLibrary); if (NS_FAILED(rv)) return rv; const char* (*npGetPluginVersion)() = (const char* (*)()) PR_FindFunctionSymbol(pLibrary, "NP_GetPluginVersion"); if (npGetPluginVersion) { info.fVersion = PL_strdup(npGetPluginVersion()); } const char* (*npGetMIMEDescription)() = (const char* (*)()) PR_FindFunctionSymbol(pLibrary, "NP_GetMIMEDescription"); if (!npGetMIMEDescription) { return NS_ERROR_FAILURE; } const char* mimedescr = npGetMIMEDescription(); if (!mimedescr) { return NS_ERROR_FAILURE; } rv = ParsePluginMimeDescription(mimedescr, info); if (NS_FAILED(rv)) { return rv; } nsAutoCString path; if (NS_FAILED(rv = mPlugin->GetNativePath(path))) return rv; info.fFullPath = PL_strdup(path.get()); nsAutoCString fileName; if (NS_FAILED(rv = mPlugin->GetNativeLeafName(fileName))) return rv; info.fFileName = PL_strdup(fileName.get()); NP_GetValueFunc npGetValue = (NP_GetValueFunc)PR_FindFunctionSymbol(pLibrary, "NP_GetValue"); if (!npGetValue) { return NS_ERROR_FAILURE; } const char *name = NULL; npGetValue(NULL, NPPVpluginNameString, &name); if (name) { info.fName = PL_strdup(name); } else { info.fName = PL_strdup(fileName.get()); } const char *description = NULL; npGetValue(NULL, NPPVpluginDescriptionString, &description); if (description) { info.fDescription = PL_strdup(description); } else { info.fDescription = PL_strdup(""); } return NS_OK; }