Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/browser
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-04-18 12:21:49 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-04-18 12:21:49 (GMT)
commitf26ee4056b4d804a5a841d3d0f1fb959fdaa9bea (patch)
tree1499bdd91d63d66c78a8c9cc7764e642850aa74a /browser
parent0bade58c23e53ec87385d88e5cb5b0b8add32d6d (diff)
Assure dragged images have the right file extension.
Diffstat (limited to 'browser')
-rw-r--r--browser/GeckoDocumentObject.cpp75
-rw-r--r--browser/GeckoDocumentObject.h2
-rw-r--r--browser/GeckoDragDropHooks.cpp30
3 files changed, 93 insertions, 14 deletions
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<nsIURI> imageURI;
rv = NewURI(imgURIStr, getter_AddRefs(imageURI));
- NS_ENSURE_SUCCESS(rv, NULL);
+ if(NS_FAILED(rv)) return rv;
nsCOMPtr<nsIServiceManager> mgr;
- NS_GetServiceManager (getter_AddRefs (mgr));
- NS_ENSURE_TRUE(mgr, NULL);
+ NS_GetServiceManager(getter_AddRefs(mgr));
+ NS_ENSURE_TRUE(mgr, NS_ERROR_FAILURE);
nsCOMPtr<imgICache> 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<nsIProperties> imgProperties;
- imgCache->FindEntryProperties(imageURI, getter_AddRefs(imgProperties));
+ rv = GetImageProperties(imgURIStr, getter_AddRefs(imgProperties));
+ NS_ENSURE_SUCCESS(rv, NULL);
if (imgProperties) {
nsCOMPtr<nsISupportsCString> dispositionCString;
imgProperties->Get("content-disposition",
@@ -155,6 +170,10 @@ GeckoDocumentObject::GetImageName()
}
if (!mImageName.Length()) {
+ nsCOMPtr<nsIURI> imageURI;
+ rv = NewURI(imgURIStr, getter_AddRefs(imageURI));
+ NS_ENSURE_SUCCESS(rv, NULL);
+
nsCOMPtr<nsIURL> 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<nsIProperties> imgProperties;
+ rv = GetImageProperties(imgURIStr, getter_AddRefs(imgProperties));
+ NS_ENSURE_SUCCESS(rv, NULL);
+ if (imgProperties) {
+ nsCOMPtr<nsISupportsCString> 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<nsIDOMHTMLImageElement> 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 <nsServiceManagerUtils.h>
#include <nsIInterfaceRequestorUtils.h>
#include <nsIDOMMouseEvent.h>
+#include <nsIMIMEService.h>
#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<nsIMIMEService> 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())) {