diff options
Diffstat (limited to 'Source/WebKit/gtk/webkit/webkitwebresource.cpp')
-rw-r--r-- | Source/WebKit/gtk/webkit/webkitwebresource.cpp | 400 |
1 files changed, 400 insertions, 0 deletions
diff --git a/Source/WebKit/gtk/webkit/webkitwebresource.cpp b/Source/WebKit/gtk/webkit/webkitwebresource.cpp new file mode 100644 index 0000000..b7f4036 --- /dev/null +++ b/Source/WebKit/gtk/webkit/webkitwebresource.cpp @@ -0,0 +1,400 @@ +/* + * Copyright (C) 2009 Jan Michael C. Alonzo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include "webkitwebresource.h" + +#include "ArchiveResource.h" +#include "KURL.h" +#include "PlatformString.h" +#include "SharedBuffer.h" +#include "webkitenumtypes.h" +#include "webkitglobalsprivate.h" +#include "webkitmarshal.h" +#include "webkitwebresourceprivate.h" +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <wtf/Assertions.h> +#include <wtf/text/CString.h> + +/** + * SECTION:webkitwebresource + * @short_description: Represents a downloaded URI. + * @see_also: #WebKitWebDataSource + * + * A web resource encapsulates the data of the download as well as the URI, + * MIME type and frame name of the resource. + */ + +using namespace WebCore; + +enum { + PROP_0, + + PROP_URI, + PROP_MIME_TYPE, + PROP_ENCODING, + PROP_FRAME_NAME +}; + +G_DEFINE_TYPE(WebKitWebResource, webkit_web_resource, G_TYPE_OBJECT); + +static void webkit_web_resource_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec); +static void webkit_web_resource_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec); + +static void webkit_web_resource_cleanup(WebKitWebResource* webResource) +{ + WebKitWebResourcePrivate* priv = webResource->priv; + + g_free(priv->uri); + priv->uri = NULL; + + g_free(priv->mimeType); + priv->mimeType = NULL; + + g_free(priv->textEncoding); + priv->textEncoding = NULL; + + g_free(priv->frameName); + priv->frameName = NULL; + + if (priv->data) + g_string_free(priv->data, TRUE); + priv->data = NULL; +} + +static void webkit_web_resource_dispose(GObject* object) +{ + WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object); + WebKitWebResourcePrivate* priv = webResource->priv; + + if (priv->resource) { + priv->resource->deref(); + priv->resource = 0; + } + + G_OBJECT_CLASS(webkit_web_resource_parent_class)->dispose(object); +} + +static void webkit_web_resource_finalize(GObject* object) +{ + WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object); + + webkit_web_resource_cleanup(webResource); + + G_OBJECT_CLASS(webkit_web_resource_parent_class)->finalize(object); +} + +static void webkit_web_resource_class_init(WebKitWebResourceClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->dispose = webkit_web_resource_dispose; + gobject_class->finalize = webkit_web_resource_finalize; + gobject_class->get_property = webkit_web_resource_get_property; + gobject_class->set_property = webkit_web_resource_set_property; + + /** + * WebKitWebResource:uri: + * + * The URI of the web resource + * + * Since: 1.1.14 + */ + g_object_class_install_property(gobject_class, + PROP_URI, + g_param_spec_string( + "uri", + _("URI"), + _("The uri of the resource"), + NULL, + (GParamFlags)(WEBKIT_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY))); + /** + * WebKitWebResource:mime-type: + * + * The MIME type of the web resource. + * + * Since: 1.1.14 + */ + g_object_class_install_property(gobject_class, + PROP_MIME_TYPE, + g_param_spec_string( + "mime-type", + _("MIME Type"), + _("The MIME type of the resource"), + NULL, + WEBKIT_PARAM_READABLE)); + /** + * WebKitWebResource:encoding: + * + * The encoding name to which the web resource was encoded in. + * + * Since: 1.1.14 + */ + g_object_class_install_property(gobject_class, + PROP_ENCODING, + g_param_spec_string( + "encoding", + _("Encoding"), + _("The text encoding name of the resource"), + NULL, + WEBKIT_PARAM_READABLE)); + + /** + * WebKitWebResource:frame-name: + * + * The frame name for the web resource. + * + * Since: 1.1.14 + */ + g_object_class_install_property(gobject_class, + PROP_FRAME_NAME, + g_param_spec_string( + "frame-name", + _("Frame Name"), + _("The frame name of the resource"), + NULL, + WEBKIT_PARAM_READABLE)); + + g_type_class_add_private(gobject_class, sizeof(WebKitWebResourcePrivate)); +} + +static void webkit_web_resource_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) +{ + WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object); + + switch (prop_id) { + case PROP_URI: + g_value_set_string(value, webkit_web_resource_get_uri(webResource)); + break; + case PROP_MIME_TYPE: + g_value_set_string(value, webkit_web_resource_get_mime_type(webResource)); + break; + case PROP_ENCODING: + g_value_set_string(value, webkit_web_resource_get_encoding(webResource)); + break; + case PROP_FRAME_NAME: + g_value_set_string(value, webkit_web_resource_get_frame_name(webResource)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void webkit_web_resource_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) +{ + WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(object); + + switch (prop_id) { + case PROP_URI: + g_free(webResource->priv->uri); + webResource->priv->uri = g_value_dup_string(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void webkit_web_resource_init(WebKitWebResource* webResource) +{ + webResource->priv = G_TYPE_INSTANCE_GET_PRIVATE(webResource, WEBKIT_TYPE_WEB_RESOURCE, WebKitWebResourcePrivate); +} + +// internal use only +WebKitWebResource* webkit_web_resource_new_with_core_resource(PassRefPtr<ArchiveResource> resource) +{ + WebKitWebResource* webResource = WEBKIT_WEB_RESOURCE(g_object_new(WEBKIT_TYPE_WEB_RESOURCE, NULL)); + WebKitWebResourcePrivate* priv = webResource->priv; + priv->resource = resource.releaseRef(); + + return webResource; +} + +void webkit_web_resource_init_with_core_resource(WebKitWebResource* webResource, PassRefPtr<ArchiveResource> resource) +{ + ASSERT(resource); + + WebKitWebResourcePrivate* priv = webResource->priv; + + if (priv->resource) + priv->resource->deref(); + + priv->resource = resource.releaseRef(); +} + +/** + * webkit_web_resource_new: + * @data: the data to initialize the #WebKitWebResource + * @size: the length of @data + * @uri: the uri of the #WebKitWebResource + * @mime_type: the MIME type of the #WebKitWebResource + * @encoding: the text encoding name of the #WebKitWebResource + * @frame_name: the frame name of the #WebKitWebResource + * + * Returns a new #WebKitWebResource. The @encoding can be %NULL. The + * @frame_name argument can be used if the resource represents contents of an + * entire HTML frame, otherwise pass %NULL. + * + * Return value: a new #WebKitWebResource + * + * Since: 1.1.14 + */ +WebKitWebResource* webkit_web_resource_new(const gchar* data, + gssize size, + const gchar* uri, + const gchar* mimeType, + const gchar* encoding, + const gchar* frameName) +{ + g_return_val_if_fail(data, NULL); + g_return_val_if_fail(uri, NULL); + g_return_val_if_fail(mimeType, NULL); + + if (size < 0) + size = strlen(data); + + RefPtr<SharedBuffer> buffer = SharedBuffer::create(data, size); + WebKitWebResource* webResource = webkit_web_resource_new_with_core_resource(ArchiveResource::create(buffer, KURL(KURL(), String::fromUTF8(uri)), String::fromUTF8(mimeType), String::fromUTF8(encoding), String::fromUTF8(frameName))); + + return webResource; +} + +/** + * webkit_web_resource_get_data: + * @web_resource: a #WebKitWebResource + * + * Returns the data of the @webResource. + * + * Return value: (transfer none): a #GString containing the character + * data of the @webResource. The string is owned by WebKit and should + * not be freed or destroyed. + * + * Since: 1.1.14 + */ +GString* webkit_web_resource_get_data(WebKitWebResource* webResource) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL); + + WebKitWebResourcePrivate* priv = webResource->priv; + + if (!priv->resource) + return NULL; + + if (!priv->data) + priv->data = g_string_new_len(priv->resource->data()->data(), priv->resource->data()->size()); + + return priv->data; +} + +/** + * webkit_web_resource_get_uri: + * @web_resource: a #WebKitWebResource + * + * Return value: the URI of the resource + * + * Since: 1.1.14 + */ +G_CONST_RETURN gchar* webkit_web_resource_get_uri(WebKitWebResource* webResource) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL); + + WebKitWebResourcePrivate* priv = webResource->priv; + + + // We may have an URI without having a resource assigned to us (e.g., if the + // FrameLoaderClient only had a ResourceRequest when we got created + if (priv->uri) + return priv->uri; + + if (!priv->resource) + return NULL; + + priv->uri = g_strdup(priv->resource->url().string().utf8().data()); + + return priv->uri; +} + +/** + * webkit_web_resource_get_mime_type: + * @web_resource: a #WebKitWebResource + * + * Return value: the MIME type of the resource + * + * Since: 1.1.14 + */ +G_CONST_RETURN gchar* webkit_web_resource_get_mime_type(WebKitWebResource* webResource) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL); + + WebKitWebResourcePrivate* priv = webResource->priv; + if (!priv->resource) + return NULL; + + if (!priv->mimeType) + priv->mimeType = g_strdup(priv->resource->mimeType().utf8().data()); + + return priv->mimeType; +} + +/** + * webkit_web_resource_get_encoding: + * @web_resource: a #WebKitWebResource + * + * Return value: the encoding name of the resource + * + * Since: 1.1.14 + */ +G_CONST_RETURN gchar* webkit_web_resource_get_encoding(WebKitWebResource* webResource) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL); + + WebKitWebResourcePrivate* priv = webResource->priv; + if (!priv->resource) + return NULL; + + if (!priv->textEncoding) + priv->textEncoding = g_strdup(priv->resource->textEncoding().utf8().data()); + + return priv->textEncoding; +} + +/** + * webkit_web_resource_get_frame_name: + * @web_resource: a #WebKitWebResource + * + * Return value: the frame name of the resource. + * + * Since: 1.1.14 + */ +G_CONST_RETURN gchar* webkit_web_resource_get_frame_name(WebKitWebResource* webResource) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(webResource), NULL); + + WebKitWebResourcePrivate* priv = webResource->priv; + if (!priv->resource) + return NULL; + + if (!priv->frameName) + priv->frameName = g_strdup(priv->resource->frameName().utf8().data()); + + return priv->frameName; +} + |