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")
|
(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
|
(define-object AddressEntry
|
||||||
(in-module "Sugar")
|
(in-module "Sugar")
|
||||||
(parent "GtkEntry")
|
(parent "GtkEntry")
|
||||||
|
@ -179,6 +179,26 @@ _wrap_sugar_cairo_surface_from_gdk_pixbuf(PyGObject *self, PyObject *args, PyObj
|
|||||||
return PycairoSurface_FromSurface(surface, NULL);
|
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
|
override-slot SugarBrowserEvent.tp_getattr
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_wrap_sugar_browser_event_tp_getattr(PyObject *self, char *attr)
|
_wrap_sugar_browser_event_tp_getattr(PyObject *self, char *attr)
|
||||||
|
@ -4,6 +4,7 @@ libsugarprivate_la_CPPFLAGS = \
|
|||||||
$(GECKO_CFLAGS) \
|
$(GECKO_CFLAGS) \
|
||||||
$(NSPR_CFLAGS) \
|
$(NSPR_CFLAGS) \
|
||||||
-I$(MOZILLA_INCLUDE_DIR)/dom \
|
-I$(MOZILLA_INCLUDE_DIR)/dom \
|
||||||
|
-I$(MOZILLA_INCLUDE_DIR)/docshell \
|
||||||
-I$(MOZILLA_INCLUDE_DIR)/exthandler \
|
-I$(MOZILLA_INCLUDE_DIR)/exthandler \
|
||||||
-I$(MOZILLA_INCLUDE_DIR)/gtkembedmoz \
|
-I$(MOZILLA_INCLUDE_DIR)/gtkembedmoz \
|
||||||
-I$(MOZILLA_INCLUDE_DIR)/imglib2 \
|
-I$(MOZILLA_INCLUDE_DIR)/imglib2 \
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <nsIWebBrowserFocus.h>
|
#include <nsIWebBrowserFocus.h>
|
||||||
#include <nsIWebBrowserPersist.h>
|
#include <nsIWebBrowserPersist.h>
|
||||||
#include <nsIDOMWindow.h>
|
#include <nsIDOMWindow.h>
|
||||||
|
#include <nsIDOMWindowUtils.h>
|
||||||
#include <nsIDOMDocument.h>
|
#include <nsIDOMDocument.h>
|
||||||
#include <nsIDOMMouseEvent.h>
|
#include <nsIDOMMouseEvent.h>
|
||||||
#include <nsIGenericFactory.h>
|
#include <nsIGenericFactory.h>
|
||||||
@ -46,7 +47,9 @@
|
|||||||
#include <nsComponentManagerUtils.h>
|
#include <nsComponentManagerUtils.h>
|
||||||
#include <imgICache.h>
|
#include <imgICache.h>
|
||||||
#include <nsIProperties.h>
|
#include <nsIProperties.h>
|
||||||
|
#include <nsIWebNavigation.h>
|
||||||
#include <nsISupportsPrimitives.h>
|
#include <nsISupportsPrimitives.h>
|
||||||
|
#include <nsIInterfaceRequestorUtils.h>
|
||||||
#include <nsIMIMEHeaderParam.h>
|
#include <nsIMIMEHeaderParam.h>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -56,7 +59,8 @@ enum {
|
|||||||
PROP_ADDRESS,
|
PROP_ADDRESS,
|
||||||
PROP_CAN_GO_BACK,
|
PROP_CAN_GO_BACK,
|
||||||
PROP_CAN_GO_FORWARD,
|
PROP_CAN_GO_FORWARD,
|
||||||
PROP_LOADING
|
PROP_LOADING,
|
||||||
|
PROP_DOCUMENT_METADATA
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -169,6 +173,140 @@ sugar_browser_shutdown(void)
|
|||||||
|
|
||||||
G_DEFINE_TYPE(SugarBrowser, sugar_browser, GTK_TYPE_MOZ_EMBED)
|
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
|
static void
|
||||||
sugar_browser_get_property(GObject *object,
|
sugar_browser_get_property(GObject *object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@ -196,6 +334,11 @@ sugar_browser_get_property(GObject *object,
|
|||||||
case PROP_LOADING:
|
case PROP_LOADING:
|
||||||
g_value_set_boolean(value, browser->loading);
|
g_value_set_boolean(value, browser->loading);
|
||||||
break;
|
break;
|
||||||
|
case PROP_DOCUMENT_METADATA:
|
||||||
|
SugarBrowserMetadata *metadata;
|
||||||
|
metadata = sugar_browser_get_document_metadata(browser);
|
||||||
|
g_value_set_boxed(value, metadata);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -261,6 +404,14 @@ sugar_browser_class_init(SugarBrowserClass *browser_class)
|
|||||||
"Loading",
|
"Loading",
|
||||||
FALSE,
|
FALSE,
|
||||||
G_PARAM_READABLE));
|
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 *
|
SugarBrowser *
|
||||||
@ -380,76 +531,6 @@ location_cb(GtkMozEmbed *embed)
|
|||||||
update_navigation_properties(browser);
|
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 *
|
static char *
|
||||||
get_image_name(const char *uri)
|
get_image_name(const char *uri)
|
||||||
{
|
{
|
||||||
@ -731,3 +812,52 @@ sugar_browser_event_free(SugarBrowserEvent *event)
|
|||||||
|
|
||||||
g_free(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
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef struct _SugarBrowser SugarBrowser;
|
typedef struct _SugarBrowser SugarBrowser;
|
||||||
typedef struct _SugarBrowserClass SugarBrowserClass;
|
typedef struct _SugarBrowserClass SugarBrowserClass;
|
||||||
typedef struct _SugarBrowserEvent SugarBrowserEvent;
|
typedef struct _SugarBrowserEvent SugarBrowserEvent;
|
||||||
|
typedef struct _SugarBrowserMetadata SugarBrowserMetadata;
|
||||||
|
|
||||||
#define SUGAR_TYPE_BROWSER (sugar_browser_get_type())
|
#define SUGAR_TYPE_BROWSER (sugar_browser_get_type())
|
||||||
#define SUGAR_BROWSER(object) (G_TYPE_CHECK_INSTANCE_CAST((object), SUGAR_TYPE_BROWSER, SugarBrowser))
|
#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);
|
SugarBrowserEvent *sugar_browser_event_copy (SugarBrowserEvent *event);
|
||||||
void sugar_browser_event_free (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
|
G_END_DECLS
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user