From f26ee4056b4d804a5a841d3d0f1fb959fdaa9bea Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Wed, 18 Apr 2007 12:21:49 +0000 Subject: Assure dragged images have the right file extension. --- (limited to 'browser') diff --git a/browser/GeckoDocumentObject.cpp b/browser/GeckoDocumentObject.cpp index fe4a824..26eb13d 100644 --- a/browser/GeckoDocumentObject.cpp +++ b/browser/GeckoDocumentObject.cpp @@ -116,32 +116,47 @@ FilenameFromContentDisposition(nsCString contentDisposition, nsCString &fileName return NS_OK; } -char * -GeckoDocumentObject::GetImageName() +static nsresult +GetImageProperties(char *imgURIStr, nsIProperties **properties) { - if(!IsImage()) { - return NULL; - } - nsresult rv; - char *imgURIStr = GetImageURI(); nsCOMPtr imageURI; rv = NewURI(imgURIStr, getter_AddRefs(imageURI)); - NS_ENSURE_SUCCESS(rv, NULL); + if(NS_FAILED(rv)) return rv; nsCOMPtr mgr; - NS_GetServiceManager (getter_AddRefs (mgr)); - NS_ENSURE_TRUE(mgr, NULL); + NS_GetServiceManager(getter_AddRefs(mgr)); + NS_ENSURE_TRUE(mgr, NS_ERROR_FAILURE); nsCOMPtr imgCache; rv = mgr->GetServiceByContractID("@mozilla.org/image/cache;1", - NS_GET_IID (imgICache), + NS_GET_IID(imgICache), getter_AddRefs(imgCache)); - NS_ENSURE_SUCCESS(rv, NULL); + if(NS_FAILED(rv)) return rv; + + imgCache->FindEntryProperties(imageURI, properties); + NS_ENSURE_TRUE(mgr, NS_ERROR_FAILURE); + return NS_OK; +} + +char * +GeckoDocumentObject::GetImageName() +{ + if(!IsImage()) { + return NULL; + } + + if(mImageName.Length()) { + return g_strdup(mImageName.get()); + } + + nsresult rv; + char *imgURIStr = GetImageURI(); nsCOMPtr imgProperties; - imgCache->FindEntryProperties(imageURI, getter_AddRefs(imgProperties)); + rv = GetImageProperties(imgURIStr, getter_AddRefs(imgProperties)); + NS_ENSURE_SUCCESS(rv, NULL); if (imgProperties) { nsCOMPtr dispositionCString; imgProperties->Get("content-disposition", @@ -155,6 +170,10 @@ GeckoDocumentObject::GetImageName() } if (!mImageName.Length()) { + nsCOMPtr imageURI; + rv = NewURI(imgURIStr, getter_AddRefs(imageURI)); + NS_ENSURE_SUCCESS(rv, NULL); + nsCOMPtr url(do_QueryInterface(imageURI)); if (url) { url->GetFileName(mImageName); @@ -165,6 +184,36 @@ GeckoDocumentObject::GetImageName() } char * +GeckoDocumentObject::GetImageMimeType() +{ + if(!IsImage()) { + return NULL; + } + + if(mImageMimeType.Length()) { + return g_strdup(mImageMimeType.get()); + } + + nsresult rv; + char *imgURIStr = GetImageURI(); + + nsCOMPtr imgProperties; + rv = GetImageProperties(imgURIStr, getter_AddRefs(imgProperties)); + NS_ENSURE_SUCCESS(rv, NULL); + if (imgProperties) { + nsCOMPtr typeCString; + imgProperties->Get("type", + NS_GET_IID(nsISupportsCString), + getter_AddRefs(typeCString)); + if (typeCString) { + typeCString->GetData(mImageMimeType); + } + } + + return mImageMimeType.Length() ? g_strdup(mImageMimeType.get()) : NULL; +} + +char * GeckoDocumentObject::GetImageURI() { if(!IsImage()) { diff --git a/browser/GeckoDocumentObject.h b/browser/GeckoDocumentObject.h index 05328e5..5f4069f 100644 --- a/browser/GeckoDocumentObject.h +++ b/browser/GeckoDocumentObject.h @@ -15,6 +15,7 @@ public: bool IsImage(); char *GetImageURI(); char *GetImageName(); + char *GetImageMimeType(); bool SaveImage(const char *filename); private: SugarBrowser *mBrowser; @@ -22,6 +23,7 @@ private: nsCOMPtr mImage; nsCString mImageURI; nsCString mImageName; + nsCString mImageMimeType; protected: /* additional members */ }; diff --git a/browser/GeckoDragDropHooks.cpp b/browser/GeckoDragDropHooks.cpp index d8b0a84..6439f42 100644 --- a/browser/GeckoDragDropHooks.cpp +++ b/browser/GeckoDragDropHooks.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include "GeckoDragDropHooks.h" #include "GeckoDocumentObject.h" @@ -66,6 +67,9 @@ UriListDataProvider::GetFlavorData(nsITransferable *aTransferable, nsresult rv = NS_ERROR_NOT_IMPLEMENTED; char *image_name; + char *mime_type; + char *file_ext; + nsCString mime_ext; timeval timestamp; *aData = nsnull; @@ -83,7 +87,31 @@ UriListDataProvider::GetFlavorData(nsITransferable *aTransferable, mFilePath.AppendInt(timestamp.tv_usec); image_name = mDocumentObject->GetImageName(); - mFilePath.Append(image_name); + file_ext = strrchr(image_name, '.'); + mime_type = mDocumentObject->GetImageMimeType(); + + nsCOMPtr mimeService(do_GetService("@mozilla.org/mime;1", + &rv)); + NS_ENSURE_SUCCESS(rv, rv); + rv = mimeService->GetPrimaryExtension(nsCString(mime_type), + EmptyCString(), + mime_ext); + NS_ENSURE_SUCCESS(rv, rv); + + if(!file_ext) { + mFilePath.Append(image_name); + mFilePath.Append("."); + mFilePath.Append(mime_ext); + } else if(strcmp(file_ext, mime_ext.get())) { + image_name[strlen(file_ext)] = 0; + mFilePath.Append(image_name); + mFilePath.Append("."); + mFilePath.Append(mime_ext); + } else { + mFilePath.Append(image_name); + } + + g_free(mime_type); g_free(image_name); if(!mDocumentObject->SaveImage(mFilePath.get())) { -- cgit v0.9.1