69879b63ae4fb3da90263808c133a39ed2b770f8glimmer/*
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * This is where the implementation of the DBus based application API lives.
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * All the methods in here are designed to be called remotly via DBus.
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * document-interface.cpp has all of the actual manipulation methods.
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * This interface is just for creating new document interfaces.
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer *
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * Documentation for these methods is in application-interface.xml
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * which is the "gold standard" as to how the interface should work.
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer *
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * Authors:
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * Soren Berg <Glimmer07@gmail.com>
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer *
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * Copyright (C) 2009 Soren Berg
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer *
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer * Released under GNU GPL, read the file 'COPYING' for more information
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer */
69879b63ae4fb3da90263808c133a39ed2b770f8glimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmer#include "application-interface.h"
c596be6d145df956e779f427dde5aabc8559dd6cglimmer#include <string.h>
c596be6d145df956e779f427dde5aabc8559dd6cglimmer#include "dbus-init.h"
f2614fa5142149207082d04e9b039c4520fa0856Eric Greveson#include "file.h"
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson#include "inkscape.h"
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmerG_DEFINE_TYPE(ApplicationInterface, application_interface, G_TYPE_OBJECT)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmerstatic void
c596be6d145df956e779f427dde5aabc8559dd6cglimmerapplication_interface_finalize (GObject *object)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer G_OBJECT_CLASS (application_interface_parent_class)->finalize (object);
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmerstatic void
c596be6d145df956e779f427dde5aabc8559dd6cglimmerapplication_interface_class_init (ApplicationInterfaceClass *klass)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer GObjectClass *object_class;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer object_class = G_OBJECT_CLASS (klass);
c596be6d145df956e779f427dde5aabc8559dd6cglimmer object_class->finalize = application_interface_finalize;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmerstatic void
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_init (ApplicationInterface *app_interface)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith dbus_g_error_domain_register (INKSCAPE_ERROR,
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith NULL,
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith INKSCAPE_TYPE_ERROR);
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonstatic bool
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonensure_desktop_valid(GError **error)
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson{
b10327c3fcaaac8dc616b6236d0dd1b59588fcc4Liam P. White if (!INKSCAPE.use_gui()) {
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson g_set_error(error, INKSCAPE_ERROR, INKSCAPE_ERROR_OTHER, "Application interface action requires a GUI");
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson return false;
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson }
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson return true;
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson}
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonstatic bool
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonensure_desktop_not_present(GError **error)
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson{
b10327c3fcaaac8dc616b6236d0dd1b59588fcc4Liam P. White if (INKSCAPE.use_gui()) {
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson g_set_error(error, INKSCAPE_ERROR, INKSCAPE_ERROR_OTHER, "Application interface action requires non-GUI (command line) mode");
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson return false;
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson }
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson return true;
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmerApplicationInterface *
c596be6d145df956e779f427dde5aabc8559dd6cglimmerapplication_interface_new (void)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return (ApplicationInterface*)g_object_new (TYPE_APPLICATION_INTERFACE, NULL);
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith/*
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith * Error stuff...
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith *
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith * To add a new error type, edit here and in the .h InkscapeError enum.
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith */
40a3d45f2bcf7de02729811b4059e07abda134eaJohn SmithGQuark
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smithinkscape_error_quark (void)
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith{
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith static GQuark quark = 0;
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith if (!quark)
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith quark = g_quark_from_static_string ("inkscape_error");
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith return quark;
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith}
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
40a3d45f2bcf7de02729811b4059e07abda134eaJohn SmithGType inkscape_error_get_type(void)
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith{
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith static GType etype = 0;
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith if (etype == 0) {
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith static const GEnumValue values[] =
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith {
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith ENUM_ENTRY(INKSCAPE_ERROR_SELECTION, "Incompatible_Selection"),
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith ENUM_ENTRY(INKSCAPE_ERROR_OBJECT, "Incompatible_Object"),
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith ENUM_ENTRY(INKSCAPE_ERROR_VERB, "Failed_Verb"),
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith ENUM_ENTRY(INKSCAPE_ERROR_OTHER, "Generic_Error"),
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith { 0, 0, 0 }
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith };
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith etype = g_enum_register_static("InkscapeError", values);
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith }
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith return etype;
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith}
40a3d45f2bcf7de02729811b4059e07abda134eaJohn Smith
c596be6d145df956e779f427dde5aabc8559dd6cglimmer/****************************************************************************
c596be6d145df956e779f427dde5aabc8559dd6cglimmer DESKTOP FUNCTIONS
c596be6d145df956e779f427dde5aabc8559dd6cglimmer****************************************************************************/
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmergchar*
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_desktop_new (ApplicationInterface *app_interface,
c596be6d145df956e779f427dde5aabc8559dd6cglimmer GError **error)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson g_return_val_if_fail(ensure_desktop_valid(error), NULL);
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson return (gchar*)Inkscape::Extension::Dbus::init_desktop();
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmergchar**
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_get_desktop_list (ApplicationInterface *app_interface)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return NULL;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmergchar*
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_get_active_desktop (ApplicationInterface *app_interface,
c596be6d145df956e779f427dde5aabc8559dd6cglimmer GError **error)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return NULL;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmergboolean
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_set_active_desktop (ApplicationInterface *app_interface,
c596be6d145df956e779f427dde5aabc8559dd6cglimmer gchar* document_name,
c596be6d145df956e779f427dde5aabc8559dd6cglimmer GError **error)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return TRUE;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmergboolean
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_desktop_close_all (ApplicationInterface *app_interface,
c596be6d145df956e779f427dde5aabc8559dd6cglimmer GError **error)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return TRUE;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmergboolean
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_exit (ApplicationInterface *app_interface, GError **error)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
f2614fa5142149207082d04e9b039c4520fa0856Eric Greveson sp_file_exit();
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return TRUE;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmer/****************************************************************************
c596be6d145df956e779f427dde5aabc8559dd6cglimmer DOCUMENT FUNCTIONS
c596be6d145df956e779f427dde5aabc8559dd6cglimmer****************************************************************************/
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesongchar* application_interface_document_new (ApplicationInterface *app_interface,
c596be6d145df956e779f427dde5aabc8559dd6cglimmer GError **error)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson g_return_val_if_fail(ensure_desktop_not_present(error), NULL);
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Greveson return (gchar*)Inkscape::Extension::Dbus::init_document();
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
f2614fa5142149207082d04e9b039c4520fa0856Eric Grevesongchar*
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_get_active_document(ApplicationInterface *app_interface,
f2614fa5142149207082d04e9b039c4520fa0856Eric Greveson GError **error)
f2614fa5142149207082d04e9b039c4520fa0856Eric Greveson{
9090603e08f72da58468db0e5b91f43ede35af26Eric Greveson gchar *result = (gchar*)Inkscape::Extension::Dbus::init_active_document();
9090603e08f72da58468db0e5b91f43ede35af26Eric Greveson if (!result) {
9090603e08f72da58468db0e5b91f43ede35af26Eric Greveson g_set_error(error, INKSCAPE_ERROR, INKSCAPE_ERROR_OTHER, "No active document");
9090603e08f72da58468db0e5b91f43ede35af26Eric Greveson }
9090603e08f72da58468db0e5b91f43ede35af26Eric Greveson return result;
f2614fa5142149207082d04e9b039c4520fa0856Eric Greveson}
f2614fa5142149207082d04e9b039c4520fa0856Eric Greveson
c596be6d145df956e779f427dde5aabc8559dd6cglimmergchar**
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_get_document_list (ApplicationInterface *app_interface)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return NULL;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmergboolean
44a3b5d410b95b87a0c29ff7a0c9378e32c4fd38Eric Grevesonapplication_interface_document_close_all (ApplicationInterface *app_interface,
c596be6d145df956e779f427dde5aabc8559dd6cglimmer GError **error)
c596be6d145df956e779f427dde5aabc8559dd6cglimmer{
c596be6d145df956e779f427dde5aabc8559dd6cglimmer return TRUE;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer}
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
c596be6d145df956e779f427dde5aabc8559dd6cglimmer/* INTERESTING FUNCTIONS
c596be6d145df956e779f427dde5aabc8559dd6cglimmer SPDesktop *desktop = SP_ACTIVE_DESKTOP;
c596be6d145df956e779f427dde5aabc8559dd6cglimmer g_assert(desktop != NULL);
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
9ba77856a8823f85b53c0a861d220cd0347f2754Liam P. White SPDocument *doc = desktop->getDocument();
c596be6d145df956e779f427dde5aabc8559dd6cglimmer g_assert(doc != NULL);
c596be6d145df956e779f427dde5aabc8559dd6cglimmer
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz Inkscape::XML::Node *repr = doc->getReprRoot();
c596be6d145df956e779f427dde5aabc8559dd6cglimmer g_assert(repr != NULL);
c596be6d145df956e779f427dde5aabc8559dd6cglimmer*/
c596be6d145df956e779f427dde5aabc8559dd6cglimmer