⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swfdec_gtk_loader.c

📁 Swfdec is a decoder/renderer for Macromedia Flash animations. The decoding and rendering engine is
💻 C
字号:
/* Swfdec * Copyright (C) 2006 Benjamin Otte <otte@gnome.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 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 * Lesser General Public License for more details. *  * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor,  * Boston, MA  02110-1301  USA */#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef HAVE_HTTP#include <libsoup/soup.h>#include <errno.h>#endif#include <stdlib.h>#include <string.h>#include "swfdec_gtk_loader.h"/*** GTK-DOC ***//** * SECTION:SwfdecGtkLoader * @title: SwfdecGtkLoader * @short_description: advanced loader able to load network ressources * @see_also: #SwfdecLoader * * #SwfdecGtkLoader is a #SwfdecLoader that is intended as an easy way to be  * access ressources that are not stored in files, such as HTTP. It can  * however be compiled with varying support for different protocols, so don't * rely on support for a particular protocol being available. If you need this, * code your own SwfdecLoader subclass. *//** * SwfdecGtkLoader: * * This is the object used to represent a loader. Since it may use varying  * backends, it is completely private. */struct _SwfdecGtkLoader{  SwfdecLoader		loader;#ifdef HAVE_HTTP  SoupMessage *		message;	/* the message we're sending */  gboolean		opened;		/* set after first bytes of data have arrived */#endif};struct _SwfdecGtkLoaderClass {  SwfdecLoaderClass	loader_class;#ifdef HAVE_HTTP  SoupSession *		session;	/* the session used by the loader */#endif};/*** SwfdecGtkLoader ***/G_DEFINE_TYPE (SwfdecGtkLoader, swfdec_gtk_loader, SWFDEC_TYPE_FILE_LOADER)#ifdef HAVE_HTTPstatic voidswfdec_gtk_loader_ensure_open (SwfdecGtkLoader *gtk){  char *real_uri;  if (gtk->opened)    return;  real_uri = soup_uri_to_string (soup_message_get_uri (gtk->message), FALSE);  swfdec_loader_open (SWFDEC_LOADER (gtk), real_uri);  gtk->opened = TRUE;  g_free (real_uri);}static voidswfdec_gtk_loader_push (SoupMessage *msg, gpointer loader){  SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader);  SwfdecBuffer *buffer;  swfdec_gtk_loader_ensure_open (gtk);  buffer = swfdec_buffer_new_and_alloc (msg->response.length);  memcpy (buffer->data, msg->response.body, msg->response.length);  swfdec_loader_push (loader, buffer);}static voidswfdec_gtk_loader_headers (SoupMessage *msg, gpointer loader){  const char *s = soup_message_get_header (msg->response_headers, "Content-Length");  unsigned long l;  char *end;  if (s == NULL)    return;  errno = 0;  l = strtoul (s, &end, 10);  if (errno == 0 && *end == 0)    swfdec_loader_set_size (loader, l);}static voidswfdec_gtk_loader_finished (SoupMessage *msg, gpointer loader){  if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {    swfdec_gtk_loader_ensure_open (loader);    swfdec_loader_eof (loader);  } else {    char *s = g_strdup_printf ("%u %s", msg->status_code, msg->reason_phrase);    swfdec_loader_error (loader, s);    g_free (s);  }}static voidswfdec_gtk_loader_dispose (GObject *object){  SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (object);  if (gtk->message) {    g_signal_handlers_disconnect_by_func (gtk->message, swfdec_gtk_loader_push, gtk);    g_signal_handlers_disconnect_by_func (gtk->message, swfdec_gtk_loader_headers, gtk);    g_signal_handlers_disconnect_by_func (gtk->message, swfdec_gtk_loader_finished, gtk);    g_object_unref (gtk->message);    gtk->message = NULL;  }  G_OBJECT_CLASS (swfdec_gtk_loader_parent_class)->dispose (object);}#endifstatic voidswfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecLoader *parent,    SwfdecLoaderRequest request, const char *data, gsize data_len){#ifdef HAVE_HTTP  const SwfdecURL *url = swfdec_loader_get_url (loader);  if (g_ascii_strcasecmp (swfdec_url_get_protocol (url), "http") != 0 &&      g_ascii_strcasecmp (swfdec_url_get_protocol (url), "https") != 0) {#endif    SWFDEC_LOADER_CLASS (swfdec_gtk_loader_parent_class)->load (loader, parent, request, data, data_len);#ifdef HAVE_HTTP  } else {    SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader);    SwfdecGtkLoaderClass *klass = SWFDEC_GTK_LOADER_GET_CLASS (gtk);    gtk->message = soup_message_new (request == SWFDEC_LOADER_REQUEST_POST ? "POST" : "GET",	swfdec_url_get_url (url));    soup_message_set_flags (gtk->message, SOUP_MESSAGE_OVERWRITE_CHUNKS);    g_signal_connect (gtk->message, "got-chunk", G_CALLBACK (swfdec_gtk_loader_push), gtk);    g_signal_connect (gtk->message, "got-headers", G_CALLBACK (swfdec_gtk_loader_headers), gtk);    g_signal_connect (gtk->message, "finished", G_CALLBACK (swfdec_gtk_loader_finished), gtk);    if (data)      soup_message_set_request (gtk->message, "appliation/x-www-urlencoded",	  SOUP_BUFFER_USER_OWNED, (char *) data, data_len);    g_object_ref (gtk->message);    soup_session_queue_message (klass->session, gtk->message, NULL, NULL);  }#endif}#ifdef HAVE_HTTPstatic voidswfdec_gtk_loader_close (SwfdecLoader *loader){  SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader);  if (gtk->message) {    SwfdecGtkLoaderClass *klass = SWFDEC_GTK_LOADER_GET_CLASS (gtk);    soup_session_cancel_message (klass->session, gtk->message);    g_object_unref (gtk->message);    gtk->message = NULL;  }}#endifstatic voidswfdec_gtk_loader_class_init (SwfdecGtkLoaderClass *klass){#ifdef HAVE_HTTP  GObjectClass *object_class = G_OBJECT_CLASS (klass);  SwfdecLoaderClass *loader_class = SWFDEC_LOADER_CLASS (klass);  object_class->dispose = swfdec_gtk_loader_dispose;  loader_class->load = swfdec_gtk_loader_load;  loader_class->close = swfdec_gtk_loader_close;    g_thread_init (NULL);  klass->session = soup_session_async_new ();#endif}static voidswfdec_gtk_loader_init (SwfdecGtkLoader *gtk_loader){}/** * swfdec_gtk_loader_new: * @uri: The location of the file to open * * Creates a new loader for the given URI. The uri must be a valid UTF-8-encoded * URL.  * * Returns: a new #SwfdecGtkLoader **/SwfdecLoader *swfdec_gtk_loader_new (const char *uri){  SwfdecLoader *loader;  SwfdecURL *url;  g_return_val_if_fail (uri != NULL, NULL);  url = swfdec_url_new (uri);  loader = g_object_new (SWFDEC_TYPE_GTK_LOADER, "url", url, NULL);  swfdec_url_free (url);  swfdec_gtk_loader_load (loader, NULL, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0);  return loader;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -