// Obtains all of the information currently available for this plugin. nsresult nsPluginFile::GetPluginInfo( nsPluginInfo &info) { nsresult rv = NS_ERROR_FAILURE; HMODULE hPlug = 0; // Need a HMODULE to query resource statements char failure[ CCHMAXPATH] = ""; APIRET ret; nsCAutoString path; if (NS_FAILED(rv = mPlugin->GetNativePath(path))) return rv; nsCAutoString fileName; if (NS_FAILED(rv = mPlugin->GetNativeLeafName(fileName))) return rv; ret = DosLoadModule( failure, CCHMAXPATH, path.get(), &hPlug); info.fVersion = nsnull; while( ret == NO_ERROR) { info.fName = LoadRCDATAString( hPlug, NS_INFO_ProductName); info.fVersion = LoadRCDATAVersion( hPlug, NS_INFO_ProductVersion); // get description (doesn't matter if it's missing)... info.fDescription = LoadRCDATAString( hPlug, NS_INFO_FileDescription); char * mimeType = LoadRCDATAString( hPlug, NS_INFO_MIMEType); if( nsnull == mimeType) break; char * mimeDescription = LoadRCDATAString( hPlug, NS_INFO_FileOpenName); if( nsnull == mimeDescription) break; char * extensions = LoadRCDATAString( hPlug, NS_INFO_FileExtents); if( nsnull == extensions) break; info.fVariantCount = CalculateVariantCount(mimeType); info.fMimeTypeArray = MakeStringArray(info.fVariantCount, mimeType); if( info.fMimeTypeArray == nsnull) break; info.fMimeDescriptionArray = MakeStringArray(info.fVariantCount, mimeDescription); if( nsnull == info.fMimeDescriptionArray) break; info.fExtensionArray = MakeStringArray(info.fVariantCount, extensions); if( nsnull == info.fExtensionArray) break; info.fFullPath = PL_strdup(path.get()); info.fFileName = PL_strdup(fileName.get()); rv = NS_OK; break; } if( 0 != hPlug) DosFreeModule( hPlug); return rv; }
/** * Obtains all of the information currently available for this plugin. */ nsresult nsPluginFile::GetPluginInfo(nsPluginInfo& info, PRLibrary **outLibrary) { *outLibrary = nsnull; nsresult rv = NS_OK; DWORD zerome, versionsize; void* verbuf = nsnull; if (!mPlugin) return NS_ERROR_NULL_POINTER; nsAutoString fullPath; if (NS_FAILED(rv = mPlugin->GetPath(fullPath))) return rv; if (!CanLoadPlugin(fullPath.get())) return NS_ERROR_FAILURE; nsAutoString fileName; if (NS_FAILED(rv = mPlugin->GetLeafName(fileName))) return rv; LPCWSTR lpFilepath = fullPath.get(); versionsize = ::GetFileVersionInfoSizeW(lpFilepath, &zerome); if (versionsize > 0) verbuf = PR_Malloc(versionsize); if (!verbuf) return NS_ERROR_OUT_OF_MEMORY; if (::GetFileVersionInfoW(lpFilepath, NULL, versionsize, verbuf)) { // TODO: get appropriately-localized info from plugin file UINT lang = 1033; // language = English UINT cp = 1252; // codepage = Western info.fName = GetKeyValue(verbuf, L"ProductName", lang, cp); info.fDescription = GetKeyValue(verbuf, L"FileDescription", lang, cp); char *mimeType = GetKeyValue(verbuf, L"MIMEType", lang, cp); char *mimeDescription = GetKeyValue(verbuf, L"FileOpenName", lang, cp); char *extensions = GetKeyValue(verbuf, L"FileExtents", lang, cp); info.fVariantCount = CalculateVariantCount(mimeType); info.fMimeTypeArray = MakeStringArray(info.fVariantCount, mimeType); info.fMimeDescriptionArray = MakeStringArray(info.fVariantCount, mimeDescription); info.fExtensionArray = MakeStringArray(info.fVariantCount, extensions); info.fFullPath = PL_strdup(NS_ConvertUTF16toUTF8(fullPath).get()); info.fFileName = PL_strdup(NS_ConvertUTF16toUTF8(fileName).get()); info.fVersion = GetVersion(verbuf); PL_strfree(mimeType); PL_strfree(mimeDescription); PL_strfree(extensions); } else { rv = NS_ERROR_FAILURE; } PR_Free(verbuf); return rv; }