Add document metadata property. Expose the filename.
This commit is contained in:
parent
d6a9f16ca8
commit
30ee6768a2
@ -9,6 +9,14 @@
|
||||
(release-func "sugar_browser_event_free")
|
||||
)
|
||||
|
||||
(define-boxed SugarBrowserMetadata
|
||||
(in-module "Sugar")
|
||||
(c-name "SugarBrowserMetadata")
|
||||
(gtype-id "SUGAR_TYPE_BROWSER_METADATA")
|
||||
(copy-func "sugar_browser_metadata_copy")
|
||||
(release-func "sugar_browser_metadata_free")
|
||||
)
|
||||
|
||||
(define-object AddressEntry
|
||||
(in-module "Sugar")
|
||||
(parent "GtkEntry")
|
||||
|
@ -179,6 +179,26 @@ _wrap_sugar_cairo_surface_from_gdk_pixbuf(PyGObject *self, PyObject *args, PyObj
|
||||
return PycairoSurface_FromSurface(surface, NULL);
|
||||
}
|
||||
%%
|
||||
override-slot SugarBrowserMetadata.tp_getattr
|
||||
static PyObject *
|
||||
_wrap_sugar_browser_metadata_tp_getattr(PyObject *self, char *attr)
|
||||
{
|
||||
SugarBrowserMetadata *metadata = pyg_boxed_get(self, SugarBrowserMetadata);
|
||||
|
||||
if (!strcmp(attr, "__members__"))
|
||||
return Py_BuildValue("[s]", "filename");
|
||||
else if (!strcmp(attr, "filename")) {
|
||||
if (metadata->filename) {
|
||||
return PyString_FromString(metadata->filename);
|
||||
} else {
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
%%
|
||||
override-slot SugarBrowserEvent.tp_getattr
|
||||
static PyObject *
|
||||
_wrap_sugar_browser_event_tp_getattr(PyObject *self, char *attr)
|
||||
|
@ -4,6 +4,7 @@ libsugarprivate_la_CPPFLAGS = \
|
||||
$(GECKO_CFLAGS) \
|
||||
$(NSPR_CFLAGS) \
|
||||
-I$(MOZILLA_INCLUDE_DIR)/dom \
|
||||
-I$(MOZILLA_INCLUDE_DIR)/docshell \
|
||||
-I$(MOZILLA_INCLUDE_DIR)/exthandler \
|
||||
-I$(MOZILLA_INCLUDE_DIR)/gtkembedmoz \
|
||||
-I$(MOZILLA_INCLUDE_DIR)/imglib2 \
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <nsIWebBrowserFocus.h>
|
||||
#include <nsIWebBrowserPersist.h>
|
||||
#include <nsIDOMWindow.h>
|
||||
#include <nsIDOMWindowUtils.h>
|
||||
#include <nsIDOMDocument.h>
|
||||
#include <nsIDOMMouseEvent.h>
|
||||
#include <nsIGenericFactory.h>
|
||||
@ -46,7 +47,9 @@
|
||||
#include <nsComponentManagerUtils.h>
|
||||
#include <imgICache.h>
|
||||
#include <nsIProperties.h>
|
||||
#include <nsIWebNavigation.h>
|
||||
#include <nsISupportsPrimitives.h>
|
||||
#include <nsIInterfaceRequestorUtils.h>
|
||||
#include <nsIMIMEHeaderParam.h>
|
||||
|
||||
enum {
|
||||
@ -56,7 +59,8 @@ enum {
|
||||
PROP_ADDRESS,
|
||||
PROP_CAN_GO_BACK,
|
||||
PROP_CAN_GO_FORWARD,
|
||||
PROP_LOADING
|
||||
PROP_LOADING,
|
||||
PROP_DOCUMENT_METADATA
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -169,6 +173,140 @@ sugar_browser_shutdown(void)
|
||||
|
||||
G_DEFINE_TYPE(SugarBrowser, sugar_browser, GTK_TYPE_MOZ_EMBED)
|
||||
|
||||
static nsresult
|
||||
NewURI(const char *uri, nsIURI **result)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIServiceManager> mgr;
|
||||
NS_GetServiceManager (getter_AddRefs (mgr));
|
||||
NS_ENSURE_TRUE(mgr, FALSE);
|
||||
|
||||
nsCOMPtr<nsIIOService> ioService;
|
||||
rv = mgr->GetServiceByContractID ("@mozilla.org/network/io-service;1",
|
||||
NS_GET_IID (nsIIOService),
|
||||
getter_AddRefs(ioService));
|
||||
NS_ENSURE_SUCCESS(rv, FALSE);
|
||||
|
||||
nsCString cSpec(uri);
|
||||
return ioService->NewURI (cSpec, nsnull, nsnull, result);
|
||||
}
|
||||
|
||||
static nsresult
|
||||
FilenameFromContentDisposition(nsCString contentDisposition, nsCString &fileName)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCString fallbackCharset;
|
||||
|
||||
nsCOMPtr<nsIMIMEHeaderParam> mimehdrpar =
|
||||
do_GetService("@mozilla.org/network/mime-hdrparam;1");
|
||||
NS_ENSURE_TRUE(mimehdrpar, NS_ERROR_FAILURE);
|
||||
|
||||
nsString aFileName;
|
||||
rv = mimehdrpar->GetParameter (contentDisposition, "filename",
|
||||
fallbackCharset, PR_TRUE, nsnull,
|
||||
aFileName);
|
||||
|
||||
if (NS_FAILED(rv) || !fileName.Length()) {
|
||||
rv = mimehdrpar->GetParameter (contentDisposition, "name",
|
||||
fallbackCharset, PR_TRUE, nsnull,
|
||||
aFileName);
|
||||
}
|
||||
|
||||
if (NS_SUCCEEDED(rv) && fileName.Length()) {
|
||||
NS_UTF16ToCString (aFileName, NS_CSTRING_ENCODING_UTF8, fileName);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static nsresult
|
||||
ImageNameFromCache(nsIURI *imgURI, nsCString &imgName)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIServiceManager> mgr;
|
||||
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),
|
||||
getter_AddRefs(imgCache));
|
||||
NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsIProperties> imgProperties;
|
||||
imgCache->FindEntryProperties(imgURI, getter_AddRefs(imgProperties));
|
||||
if (imgProperties) {
|
||||
nsCOMPtr<nsISupportsCString> dispositionCString;
|
||||
imgProperties->Get("content-disposition",
|
||||
NS_GET_IID(nsISupportsCString),
|
||||
getter_AddRefs(dispositionCString));
|
||||
if (dispositionCString) {
|
||||
nsCString contentDisposition;
|
||||
dispositionCString->GetData(contentDisposition);
|
||||
FilenameFromContentDisposition(contentDisposition, imgName);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static SugarBrowserMetadata *
|
||||
sugar_browser_get_document_metadata(SugarBrowser *browser)
|
||||
{
|
||||
SugarBrowserMetadata *metadata = sugar_browser_metadata_new();
|
||||
|
||||
#ifdef HAVE_NS_WEB_BROWSER
|
||||
nsCOMPtr<nsIWebBrowser> webBrowser;
|
||||
gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(browser),
|
||||
getter_AddRefs(webBrowser));
|
||||
NS_ENSURE_TRUE(webBrowser, metadata);
|
||||
|
||||
nsCOMPtr<nsIDOMWindow> DOMWindow;
|
||||
webBrowser->GetContentDOMWindow(getter_AddRefs(DOMWindow));
|
||||
NS_ENSURE_TRUE(DOMWindow, metadata);
|
||||
|
||||
nsCOMPtr<nsIDOMWindowUtils> DOMWindowUtils(do_GetInterface(DOMWindow));
|
||||
NS_ENSURE_TRUE(DOMWindowUtils, metadata);
|
||||
|
||||
const PRUnichar contentDispositionLiteral[] =
|
||||
{'c', 'o', 'n', 't', 'e', 'n', 't', '-', 'd', 'i', 's', 'p',
|
||||
'o', 's', 'i', 't', 'i', 'o', 'n', '\0'};
|
||||
|
||||
nsString contentDisposition;
|
||||
DOMWindowUtils->GetDocumentMetadata(nsString(contentDispositionLiteral),
|
||||
contentDisposition);
|
||||
|
||||
nsCString cContentDisposition;
|
||||
NS_UTF16ToCString (contentDisposition, NS_CSTRING_ENCODING_UTF8,
|
||||
cContentDisposition);
|
||||
|
||||
nsCString fileName;
|
||||
FilenameFromContentDisposition(cContentDisposition, fileName);
|
||||
|
||||
if (!fileName.Length()) {
|
||||
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(webBrowser));
|
||||
if (webNav) {
|
||||
nsCOMPtr<nsIURI> docURI;
|
||||
webNav->GetCurrentURI (getter_AddRefs(docURI));
|
||||
|
||||
nsCOMPtr<nsIURL> url(do_QueryInterface(docURI));
|
||||
if (url) {
|
||||
url->GetFileName(fileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fileName.Length()) {
|
||||
metadata->filename = g_strdup(fileName.get());
|
||||
}
|
||||
#endif
|
||||
|
||||
return metadata;
|
||||
}
|
||||
|
||||
static void
|
||||
sugar_browser_get_property(GObject *object,
|
||||
guint prop_id,
|
||||
@ -196,6 +334,11 @@ sugar_browser_get_property(GObject *object,
|
||||
case PROP_LOADING:
|
||||
g_value_set_boolean(value, browser->loading);
|
||||
break;
|
||||
case PROP_DOCUMENT_METADATA:
|
||||
SugarBrowserMetadata *metadata;
|
||||
metadata = sugar_browser_get_document_metadata(browser);
|
||||
g_value_set_boxed(value, metadata);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -261,6 +404,14 @@ sugar_browser_class_init(SugarBrowserClass *browser_class)
|
||||
"Loading",
|
||||
FALSE,
|
||||
G_PARAM_READABLE));
|
||||
|
||||
g_object_class_install_property(gobject_class, PROP_DOCUMENT_METADATA,
|
||||
g_param_spec_boxed("document-metadata",
|
||||
"Document Metadata",
|
||||
"Document metadata",
|
||||
SUGAR_TYPE_BROWSER_METADATA,
|
||||
G_PARAM_READABLE));
|
||||
|
||||
}
|
||||
|
||||
SugarBrowser *
|
||||
@ -380,76 +531,6 @@ location_cb(GtkMozEmbed *embed)
|
||||
update_navigation_properties(browser);
|
||||
}
|
||||
|
||||
static nsresult
|
||||
NewURI(const char *uri, nsIURI **result)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIServiceManager> mgr;
|
||||
NS_GetServiceManager (getter_AddRefs (mgr));
|
||||
NS_ENSURE_TRUE(mgr, FALSE);
|
||||
|
||||
nsCOMPtr<nsIIOService> ioService;
|
||||
rv = mgr->GetServiceByContractID ("@mozilla.org/network/io-service;1",
|
||||
NS_GET_IID (nsIIOService),
|
||||
getter_AddRefs(ioService));
|
||||
NS_ENSURE_SUCCESS(rv, FALSE);
|
||||
|
||||
nsCString cSpec(uri);
|
||||
return ioService->NewURI (cSpec, nsnull, nsnull, result);
|
||||
}
|
||||
|
||||
static nsresult
|
||||
ImageNameFromCache(nsIURI *imgURI, nsCString &imgName)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIServiceManager> mgr;
|
||||
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),
|
||||
getter_AddRefs(imgCache));
|
||||
NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsIProperties> imgProperties;
|
||||
imgCache->FindEntryProperties(imgURI, getter_AddRefs(imgProperties));
|
||||
if (imgProperties) {
|
||||
nsCOMPtr<nsISupportsCString> dispositionCString;
|
||||
imgProperties->Get("content-disposition",
|
||||
NS_GET_IID(nsISupportsCString),
|
||||
getter_AddRefs(dispositionCString));
|
||||
if (dispositionCString) {
|
||||
nsCString fallbackCharset;
|
||||
|
||||
nsCString contentDisposition;
|
||||
dispositionCString->GetData(contentDisposition);
|
||||
|
||||
nsCOMPtr<nsIMIMEHeaderParam> mimehdrpar =
|
||||
do_GetService("@mozilla.org/network/mime-hdrparam;1");
|
||||
NS_ENSURE_TRUE(mimehdrpar, NS_ERROR_FAILURE);
|
||||
|
||||
nsString fileName;
|
||||
rv = mimehdrpar->GetParameter (contentDisposition, "filename",
|
||||
fallbackCharset, PR_TRUE, nsnull,
|
||||
fileName);
|
||||
|
||||
if (NS_FAILED(rv) || !fileName.Length()) {
|
||||
rv = mimehdrpar->GetParameter (contentDisposition, "name",
|
||||
fallbackCharset, PR_TRUE, nsnull,
|
||||
fileName);
|
||||
}
|
||||
|
||||
if (NS_SUCCEEDED(rv) && fileName.Length()) {
|
||||
nsCString cFileName;
|
||||
NS_UTF16ToCString (fileName, NS_CSTRING_ENCODING_UTF8, imgName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
get_image_name(const char *uri)
|
||||
{
|
||||
@ -731,3 +812,52 @@ sugar_browser_event_free(SugarBrowserEvent *event)
|
||||
|
||||
g_free(event);
|
||||
}
|
||||
|
||||
GType
|
||||
sugar_browser_metadata_get_type(void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
if (G_UNLIKELY(type == 0)) {
|
||||
type = g_boxed_type_register_static("SugarBrowserMetadata",
|
||||
(GBoxedCopyFunc)sugar_browser_metadata_copy,
|
||||
(GBoxedFreeFunc)sugar_browser_metadata_free);
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
SugarBrowserMetadata *
|
||||
sugar_browser_metadata_new(void)
|
||||
{
|
||||
SugarBrowserMetadata *metadata;
|
||||
|
||||
metadata = g_new0(SugarBrowserMetadata, 1);
|
||||
|
||||
return metadata;
|
||||
}
|
||||
|
||||
SugarBrowserMetadata *
|
||||
sugar_browser_metadata_copy(SugarBrowserMetadata *metadata)
|
||||
{
|
||||
SugarBrowserMetadata *copy;
|
||||
|
||||
g_return_val_if_fail(metadata != NULL, NULL);
|
||||
|
||||
copy = g_new0(SugarBrowserMetadata, 1);
|
||||
copy->filename = g_strdup(metadata->filename);
|
||||
|
||||
return copy;
|
||||
}
|
||||
|
||||
void
|
||||
sugar_browser_metadata_free(SugarBrowserMetadata *metadata)
|
||||
{
|
||||
g_return_if_fail(metadata != NULL);
|
||||
|
||||
if (metadata->filename) {
|
||||
g_free(metadata->filename);
|
||||
}
|
||||
|
||||
g_free(metadata);
|
||||
}
|
||||
|
@ -24,9 +24,10 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _SugarBrowser SugarBrowser;
|
||||
typedef struct _SugarBrowserClass SugarBrowserClass;
|
||||
typedef struct _SugarBrowserEvent SugarBrowserEvent;
|
||||
typedef struct _SugarBrowser SugarBrowser;
|
||||
typedef struct _SugarBrowserClass SugarBrowserClass;
|
||||
typedef struct _SugarBrowserEvent SugarBrowserEvent;
|
||||
typedef struct _SugarBrowserMetadata SugarBrowserMetadata;
|
||||
|
||||
#define SUGAR_TYPE_BROWSER (sugar_browser_get_type())
|
||||
#define SUGAR_BROWSER(object) (G_TYPE_CHECK_INSTANCE_CAST((object), SUGAR_TYPE_BROWSER, SugarBrowser))
|
||||
@ -86,6 +87,17 @@ SugarBrowserEvent *sugar_browser_event_new (void);
|
||||
SugarBrowserEvent *sugar_browser_event_copy (SugarBrowserEvent *event);
|
||||
void sugar_browser_event_free (SugarBrowserEvent *event);
|
||||
|
||||
#define SUGAR_TYPE_BROWSER_METADATA (sugar_browser_metadata_get_type())
|
||||
|
||||
struct _SugarBrowserMetadata {
|
||||
char *filename;
|
||||
};
|
||||
|
||||
GType sugar_browser_metadata_get_type (void);
|
||||
SugarBrowserMetadata *sugar_browser_metadata_new (void);
|
||||
SugarBrowserMetadata *sugar_browser_metadata_copy (SugarBrowserMetadata *event);
|
||||
void sugar_browser_metadata_free (SugarBrowserMetadata *event);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user