/*
 *  Copyright (C) 2000, 2001, 2002 Marco Pesenti Gritti
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "ephy-marshal.h"
#include "ephy-embed.h"

#include "mozilla-embed.h"
#include "mozilla-embed-shell.h"

enum
{
	NEW_WINDOW,
	LINK_MESSAGE,
	FAVICON,
	JS_STATUS,
	LOCATION,
	TITLE,
	PROGRESS,
	NET_STATE,
	VISIBILITY,
	DESTROY_BRSR,
	OPEN_URI,
	SIZE_TO,
	DOM_MOUSE_CLICK,
	DOM_MOUSE_DOWN,
	SECURITY_CHANGE,
	ZOOM_CHANGE,
	LAST_SIGNAL
};

static void
ephy_embed_base_init (gpointer base_class);

struct EphyEmbedPrivate
{
	gpointer dummy;
};

static guint ephy_embed_signals[LAST_SIGNAL] = { 0 };

GType
ephy_embed_get_type (void)
{
        static GType ephy_embed_type = 0;

        if (ephy_embed_type == 0)
        {
                static const GTypeInfo our_info =
                {
                        sizeof (EphyEmbedClass),
                        ephy_embed_base_init,
                        NULL,
                };

                ephy_embed_type = g_type_register_static (G_TYPE_INTERFACE,
							  "EphyEmbed",
							  &our_info,
							  (GTypeFlags)0);
        }

        return ephy_embed_type;
}

static void
ephy_embed_base_init (gpointer g_class)
{
	static gboolean initialized = FALSE;

	if (! initialized)
	{
	ephy_embed_signals[NEW_WINDOW] =
                g_signal_new ("ge_new_window",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, new_window),
                              NULL, NULL,
                              ephy_marshal_VOID__POINTER_INT,
			      G_TYPE_NONE,
                              2,
                              G_TYPE_POINTER,
			      G_TYPE_INT);
	ephy_embed_signals[LINK_MESSAGE] =
                g_signal_new ("ge_link_message",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, link_message),
                              NULL, NULL,
                              ephy_marshal_VOID__STRING,
                              G_TYPE_NONE,
                              1,
			      G_TYPE_STRING);
	ephy_embed_signals[FAVICON] =
                g_signal_new ("ge_favicon",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, favicon),
                              NULL, NULL,
                              ephy_marshal_VOID__STRING,
                              G_TYPE_NONE,
                              1,
			      G_TYPE_STRING);
	ephy_embed_signals[JS_STATUS] =
                g_signal_new ("ge_js_status",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, js_status),
                              NULL, NULL,
                              ephy_marshal_VOID__STRING,
			      G_TYPE_NONE,
                              1,
			      G_TYPE_STRING);
	ephy_embed_signals[LOCATION] =
                g_signal_new ("ge_location",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, location),
                              NULL, NULL,
                              g_cclosure_marshal_VOID__VOID,
                              G_TYPE_NONE,
                              0);
	ephy_embed_signals[TITLE] =
                g_signal_new ("ge_title",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, title),
                              NULL, NULL,
                              g_cclosure_marshal_VOID__VOID,
                              G_TYPE_NONE,
                              0);
	ephy_embed_signals[PROGRESS] =
                g_signal_new ("ge_progress",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, progress),
                              NULL, NULL,
                              ephy_marshal_VOID__STRING_INT_INT,
                              G_TYPE_NONE,
                              3,
			      G_TYPE_STRING,
			      G_TYPE_INT,
			      G_TYPE_INT);
	ephy_embed_signals[NET_STATE] =
                g_signal_new ("ge_net_state",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, net_state),
                              NULL, NULL,
                              ephy_marshal_VOID__STRING_INT,
                              G_TYPE_NONE,
                              2,
			      G_TYPE_STRING,
			      G_TYPE_INT);
	ephy_embed_signals[VISIBILITY] =
                g_signal_new ("ge_visibility",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, visibility),
                              NULL, NULL,
                              g_cclosure_marshal_VOID__BOOLEAN,
                              G_TYPE_NONE,
                              1,
			      G_TYPE_BOOLEAN);
	ephy_embed_signals[DESTROY_BRSR] =
                g_signal_new ("ge_destroy_brsr",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (EphyEmbedClass, destroy_brsr),
                              NULL, NULL,
                              g_cclosure_marshal_VOID__VOID,
                              G_TYPE_NONE,
                              0);
	ephy_embed_signals[OPEN_URI] =
                g_signal_new ("ge_open_uri",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_LAST,
                              G_STRUCT_OFFSET (EphyEmbedClass, open_uri),
                              NULL, NULL,
                              ephy_marshal_INT__STRING,
                              G_TYPE_INT,
                              1,
			      G_TYPE_STRING);
	ephy_embed_signals[SIZE_TO] =
                g_signal_new ("ge_size_to",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_LAST,
                              G_STRUCT_OFFSET (EphyEmbedClass, size_to),
                              NULL, NULL,
                              ephy_marshal_VOID__INT_INT,
                              G_TYPE_NONE,
                              2,
			      G_TYPE_INT,
			      G_TYPE_INT);
	ephy_embed_signals[DOM_MOUSE_DOWN] =
                g_signal_new ("ge_dom_mouse_down",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_LAST,
                              G_STRUCT_OFFSET (EphyEmbedClass, dom_mouse_down),
                              NULL, NULL,
                              ephy_marshal_INT__OBJECT,
                              G_TYPE_INT,
                              1,
			      G_TYPE_POINTER);
	ephy_embed_signals[DOM_MOUSE_CLICK] =
                g_signal_new ("ge_dom_mouse_click",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_LAST,
                              G_STRUCT_OFFSET (EphyEmbedClass, dom_mouse_click),
                              NULL, NULL,
                              ephy_marshal_INT__OBJECT,
                              G_TYPE_INT,
                              1,
			      G_TYPE_POINTER);
	ephy_embed_signals[SECURITY_CHANGE] =
                g_signal_new ("ge_security_change",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_LAST,
                              G_STRUCT_OFFSET (EphyEmbedClass, security_change),
                              NULL, NULL,
                              g_cclosure_marshal_VOID__INT,
                              G_TYPE_NONE,
                              1,
			      G_TYPE_INT);
	ephy_embed_signals[ZOOM_CHANGE] =
                g_signal_new ("ge_zoom_change",
                              EPHY_EMBED_TYPE,
                              G_SIGNAL_RUN_LAST,
                              G_STRUCT_OFFSET (EphyEmbedClass, zoom_change),
                              NULL, NULL,
                              g_cclosure_marshal_VOID__INT,
                              G_TYPE_NONE,
                              1,
			      G_TYPE_INT);
	}
}

EphyEmbed *
ephy_embed_new (GObject *shell)
{
	if (IS_MOZILLA_EMBED_SHELL (shell))
	{
		return EPHY_EMBED (g_object_new
			(MOZILLA_EMBED_TYPE, NULL));
	}

	g_assert_not_reached ();

	return NULL;
}

void
ephy_embed_get_capabilities (EphyEmbed *embed,
                               EmbedCapabilities *caps)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        klass->get_capabilities (embed, caps);
}

gresult
ephy_embed_load_url (EphyEmbed *embed,
                     const char *url)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->load_url (embed, url);
}

gresult
ephy_embed_stop_load (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->stop_load (embed);
}

gresult
ephy_embed_can_go_back (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->can_go_back (embed);
}

gresult
ephy_embed_can_go_forward (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->can_go_forward (embed);
}

gresult
ephy_embed_can_go_up (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->can_go_up (embed);
}

gresult
ephy_embed_get_go_up_list (EphyEmbed *embed, GSList **l)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->get_go_up_list (embed, l);
}

gresult
ephy_embed_go_back (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->go_back (embed);
}

gresult
ephy_embed_go_forward (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->go_forward (embed);
}

gresult
ephy_embed_go_up (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->go_up (embed);
}

gresult
ephy_embed_render_data (EphyEmbed *embed,
                        const char *data,
                        guint32 len,
                        const char *base_uri,
                        const char *mime_type)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->render_data (embed, data, len, base_uri, mime_type);
}

gresult
ephy_embed_open_stream (EphyEmbed *embed,
                        const char *base_uri,
                        const char *mime_type)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->open_stream (embed, base_uri, mime_type);
}

gresult
ephy_embed_append_data (EphyEmbed *embed,
                        const char *data,
                        guint32 len)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->append_data (embed, data, len);
}

gresult
ephy_embed_close_stream (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->close_stream (embed);
}

gresult
ephy_embed_get_title (EphyEmbed *embed,
                      char **title)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->get_title (embed, title);
}

gresult
ephy_embed_get_location (EphyEmbed *embed,
                         gboolean toplevel,
                         gboolean requested,
                         char **location)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->get_location (embed, toplevel, requested, location);
}

gresult
ephy_embed_reload (EphyEmbed *embed,
                   EmbedReloadFlags flags)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->reload (embed, flags);
}

gresult
ephy_embed_copy_page (EphyEmbed *dest,
		      EphyEmbed *source,
		      EmbedDisplayType display_type)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (dest);
	return klass->copy_page (dest, source, display_type);
}

gresult
ephy_embed_grab_focus (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->grab_focus (embed);
}

gresult
ephy_embed_get_link_tags (EphyEmbed *embed,
                            const char *link_type,
                            GList **tags)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->get_link_tags (embed, link_type, tags);
}

gresult
ephy_embed_zoom_set (EphyEmbed *embed,
                     int zoom,
                     gboolean reflow)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->zoom_set (embed, zoom, reflow);
}

gresult
ephy_embed_zoom_get (EphyEmbed *embed,
                     int *zoom)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->zoom_get (embed, zoom);
}

gresult
ephy_embed_selection_can_cut (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->selection_can_cut (embed);
}

gresult
ephy_embed_selection_can_copy (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->selection_can_copy (embed);
}

gresult
ephy_embed_can_paste (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->can_paste (embed);
}

gresult
ephy_embed_select_all (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->select_all (embed);
}

gresult
ephy_embed_selection_cut (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->selection_cut (embed);
}

gresult
ephy_embed_selection_copy (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->selection_copy (embed);
}

gresult
ephy_embed_paste (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->paste (embed);
}

gresult
ephy_embed_shistory_count  (EphyEmbed *embed,
                            int *count)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->shistory_count (embed, count);
}

gresult
ephy_embed_shistory_get_nth (EphyEmbed *embed,
                             int nth,
                             gboolean is_relative,
                             char **url,
                             char **title)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->shistory_get_nth (embed, nth, is_relative, url, title);
}

gresult
ephy_embed_shistory_get_pos (EphyEmbed *embed,
                             int *pos)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->shistory_get_pos (embed, pos);
}

gresult
ephy_embed_shistory_go_nth (EphyEmbed *embed,
                            int nth)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->shistory_go_nth (embed, nth);
}

gboolean
ephy_embed_shistory_copy (EphyEmbed *source,
                          EphyEmbed *dest)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (source);
        return klass->shistory_copy (source, dest);
}

gresult
ephy_embed_scroll (EphyEmbed *embed,
                   EmbedScrollDirection direction)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->scroll (embed, direction);
}

gresult
ephy_embed_fine_scroll (EphyEmbed *embed,
			int horiz, int vert)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->fine_scroll (embed, horiz, vert);
}

gresult
ephy_embed_get_security_level (EphyEmbed *embed,
                               EmbedSecurityLevel *level,
                               char **description)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->get_security_level (embed, level, description);
}

gresult
ephy_embed_find (EphyEmbed *embed,
                 EmbedFindInfo *info)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->find (embed, info);
}

gresult
ephy_embed_set_charset (EphyEmbed *embed,
                          const char *charset)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->set_charset (embed, charset);
}

gresult
ephy_embed_print (EphyEmbed *embed,
                  EmbedPrintInfo *info)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->print (embed, info);
}

gresult
ephy_embed_print_preview_close (EphyEmbed *embed)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
        return klass->print_preview_close (embed);
}

gresult
ephy_embed_print_preview_num_pages (EphyEmbed *embed, gint *retNum)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
	return klass->print_preview_num_pages (embed, retNum);
}

gresult
ephy_embed_print_preview_navigate (EphyEmbed *embed,
				   EmbedPrintPreviewNavType navType,
				   gint pageNum)
{
	EphyEmbedClass *klass = EPHY_EMBED_GET_CLASS (embed);
	return klass->print_preview_navigate (embed, navType, pageNum);
}

