/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * 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
 * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * $URL$
 * $Id$
 *
 */

#include <hildon-widgets/hildon-app.h>
#include <gtk/gtk.h>
#include <libosso.h>
#include "base/internal_version.h"

#define OSSO_APP_NAME    "scummvm"
#define OSSO_APP_VERSION SCUMMVM_VERSION
#define OSSO_APP_SERVICE "org.scummvm."OSSO_APP_NAME
#define OSSO_APP_OBJECT  "/org/scummvm/"OSSO_APP_NAME
#define OSSO_APP_IFACE   "org.scummvm."OSSO_APP_NAME

// Application UI data struct
typedef struct _AppData AppData;
struct _AppData {
    HildonApp *app;
    HildonAppView *appview;
    osso_context_t *osso_context;
};

// Callback for exit D-BUS event
void exit_event_handler(gboolean die_now, gpointer data) {
    AppData *appdata;
    appdata = (AppData *)data;
    g_print("exit_event_handler called\n");
    /* Do whatever application needs to do before exiting */
    gtk_infoprint(GTK_WINDOW(appdata->app), "Exiting...");
}

// Callback for normal D-BUS messages
gint dbus_req_handler(const gchar *interface, const gchar *method,
                      GArray *arguments, gpointer data,
                      osso_rpc_t *retval) {
    AppData *appdata;
    appdata = (AppData *)data;
    osso_system_note_infoprint(appdata->osso_context, method, retval);
    return OSSO_OK;
}


// Main application
int main(int argc, char *argv[]) {
    // Create needed variables
    HildonApp *app;
    HildonAppView *appview;
    osso_context_t *osso_context;
    osso_return_t result;
    GtkWidget *main_vbox;
    GtkWidget *label;

    // Initialize the GTK.
    gtk_init(&argc, &argv);

    // Initialize maemo application
    osso_context = osso_initialize(OSSO_APP_NAME, OSSO_APP_VERSION, TRUE, NULL);

    // Check that initialization was ok
    if (osso_context == NULL) {
        return OSSO_ERROR;
    }

    // Create the hildon application and setup the title
    app = HILDON_APP(hildon_app_new());
    hildon_app_set_title(app, "ScummVM");
    hildon_app_set_two_part_title(app, TRUE);

    // Create HildonAppView and set it to HildonApp
    appview = HILDON_APPVIEW(hildon_appview_new("AppView Title"));
    hildon_app_set_appview(app, appview);

    // Create AppData
    AppData *appdata;
    appdata = g_new0(AppData, 1);
    appdata->app = app;
    appdata->appview = appview;
    appdata->osso_context = osso_context;

    // Add vbox to appview
    main_vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(appview), main_vbox);

    // Add button to vbox
    label = gtk_label_new("Waiting for DBUS message...");
    gtk_box_pack_start(GTK_BOX(main_vbox), label, FALSE, TRUE, 0);

    // Add handler for hello D-BUS messages
    result = osso_rpc_set_cb_f(appdata->osso_context,
                               OSSO_APP_SERVICE,
                               OSSO_APP_OBJECT,
                               OSSO_APP_IFACE,
                               dbus_req_handler, appdata);
    if (result != OSSO_OK) {
        g_print("Error setting D-BUS callback (%d)\n", result);
        return OSSO_ERROR;
    }

    // Add handler for Exit D-BUS messages
    result = osso_application_set_exit_cb(appdata->osso_context,
                                          exit_event_handler,
                                          (gpointer) appdata);
    if (result != OSSO_OK) {
        g_print("Error setting exit callback (%d)\n", result);
        return OSSO_ERROR;
    }

    // Begin the main application
    gtk_widget_show_all(GTK_WIDGET(app));
    gtk_main();

    // Deinitialize OSSO
    osso_deinitialize(osso_context);

    return 0;
}