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;
}
Example #2
0
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;
}