nsresult nsSafariProfileMigrator::SetDownloadHandlers(void* aTransform, nsIPrefBranch* aBranch) { PrefTransform* xform = (PrefTransform*)aTransform; if (!xform->boolValue) { // If we're not set to auto-open safe downloads, we need to clear out the // mime types list which contains default handlers. nsCOMPtr<nsIProperties> fileLocator(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID)); nsCOMPtr<nsILocalFile> mimeRegistryFile; fileLocator->Get(NS_APP_USER_MIMETYPES_50_FILE, NS_GET_IID(nsILocalFile), getter_AddRefs(mimeRegistryFile)); nsCOMPtr<nsIIOService> ioService(do_GetService("@mozilla.org/network/io-service;1")); nsCOMPtr<nsIProtocolHandler> ph; ioService->GetProtocolHandler("file", getter_AddRefs(ph)); nsCOMPtr<nsIFileProtocolHandler> fph(do_QueryInterface(ph)); nsCOMPtr<nsIRDFService> rdfService(do_GetService("@mozilla.org/rdf/rdf-service;1")); nsCOMPtr<nsIRDFDataSource> mimeTypes; nsCAutoString dsURL; fph->GetURLSpecFromFile(mimeRegistryFile, dsURL); rdfService->GetDataSourceBlocking(dsURL.get(), getter_AddRefs(mimeTypes)); nsCOMPtr<nsIRDFResource> overridesListResource; rdfService->GetResource(NS_LITERAL_CSTRING("urn:mimetypes:root"), getter_AddRefs(overridesListResource)); nsCOMPtr<nsIRDFContainer> overridesList(do_CreateInstance("@mozilla.org/rdf/container;1")); overridesList->Init(mimeTypes, overridesListResource); nsCOMPtr<nsIRDFResource> handlerPropArc, externalApplicationArc; rdfService->GetResource(NC_URI(handlerProp), getter_AddRefs(handlerPropArc)); rdfService->GetResource(NC_URI(externalApplication), getter_AddRefs(externalApplicationArc)); PRInt32 count; overridesList->GetCount(&count); for (PRInt32 i = count; i >= 1; --i) { nsCOMPtr<nsIRDFNode> currOverrideNode; overridesList->RemoveElementAt(i, false, getter_AddRefs(currOverrideNode)); nsCOMPtr<nsIRDFResource> currOverride(do_QueryInterface(currOverrideNode)); nsCOMPtr<nsIRDFNode> handlerPropNode; mimeTypes->GetTarget(currOverride, handlerPropArc, true, getter_AddRefs(handlerPropNode)); nsCOMPtr<nsIRDFResource> handlerPropResource(do_QueryInterface(handlerPropNode)); if (handlerPropResource) { nsCOMPtr<nsIRDFNode> externalApplicationNode; mimeTypes->GetTarget(handlerPropResource, externalApplicationArc, true, getter_AddRefs(externalApplicationNode)); nsCOMPtr<nsIRDFResource> externalApplicationResource(do_QueryInterface(externalApplicationNode)); // Strip the resources down so that the datasource is completely flushed. if (externalApplicationResource) CleanResource(mimeTypes, externalApplicationResource); CleanResource(mimeTypes, handlerPropResource); } CleanResource(mimeTypes, currOverride); } nsCOMPtr<nsIRDFRemoteDataSource> rds(do_QueryInterface(mimeTypes)); if (rds) rds->Flush(); } return NS_OK; }
int ExtractResource(int resource,wchar_t *wzTempFile) { FILE *f=NULL; wzTempFile[0]=0; int iReturnCode = RETURN_OK; // Create a temporary file. if(RETURN_OK != (iReturnCode=GetTempFileName(wzTempFile, MAX_PATH))) { iReturnCode = RETURN_ERR_INTERNAL; goto cleaning; } //Extract the resource in the temp file HRSRC hResource; if (NULL == (hResource= FindResource(NULL, MAKEINTRESOURCE(resource), TEXT("ISS")))) { LOG(L" --> ERROR - ExtractResource failed in FindResource (LastError=%d)\n", GetLastError()); iReturnCode = RETURN_ERR_INTERNAL; goto cleaning; } //Load the resource HGLOBAL hResourceLoaded; if (NULL == (hResourceLoaded = LoadResource(NULL, hResource))) { LOG(L" --> ERROR - ExtractResource failed in LoadResource (LastError=%d)\n", GetLastError()); iReturnCode = RETURN_ERR_INTERNAL; goto cleaning; } //Get the resource size DWORD dwFileSize = SizeofResource(NULL, hResource); //Access the byte data LPBYTE lpBuffer; if (NULL == (lpBuffer = (LPBYTE) LockResource(hResourceLoaded))) { LOG(L" --> ERROR - ExtractResource failed in LockResource (LastError=%d)\n", GetLastError()); iReturnCode = RETURN_ERR_INTERNAL; goto cleaning; } //Write to the file errno_t err=_wfopen_s(&f,wzTempFile,L"wb"); if(f==NULL || err!=0) { LOG(L" --> ERROR - ExtractResource failed while opening temp file for write (err=%d)\n", err); iReturnCode = RETURN_ERR_INTERNAL; goto cleaning; } if(dwFileSize != fwrite(lpBuffer,1,dwFileSize,f)) { LOG(L" --> ERROR - ExtractResource failed while writing into temp file\n"); iReturnCode = RETURN_ERR_INTERNAL; goto cleaning; } fclose(f); f=NULL; return iReturnCode; cleaning: if(f) fclose(f); if(wzTempFile[0]!=0) CleanResource(wzTempFile); return iReturnCode; }