/* This file is part of Cinaest.
*
* Copyright (C) 2009 Philipp Zabel
*
* Cinaest 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 3 of the License, or
* (at your option) any later version.
*
* Cinaest 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 Cinaest. If not, see .
*/
using Hildon;
public class CinaestProgram : Hildon.Program {
internal SourceListWindow window;
internal WindowStack secondary_stack;
public static List plugins;
public static MovieSource reference;
public static Orientation orientation;
construct {
Environment.set_application_name ("Cinæst");
window = new SourceListWindow ();
window.destroy.connect (Gtk.main_quit);
reference = null;
orientation = new Orientation ();
orientation.changed.connect (on_orientation_changed);
add_window (window);
secondary_stack = new WindowStack ();
}
private void on_orientation_changed () {
if (orientation.portrait) {
Hildon.gtk_window_set_portrait_flags (window, PortraitFlags.REQUEST);
} else {
Hildon.gtk_window_set_portrait_flags (window, PortraitFlags.SUPPORT);
}
}
public void register_plugins (Osso.Context context) {
string plugin_path = Config.PKGLIBDIR;
try {
var directory = File.new_for_path (plugin_path);
var enumerator = directory.enumerate_children (FILE_ATTRIBUTE_STANDARD_NAME, 0, null);
FileInfo file_info;
while ((file_info = enumerator.next_file (null)) != null) {
string name = file_info.get_name ();
if (name.has_suffix (".so")) {
Plugin plugin;
string path = Path.build_filename (plugin_path, name, null);
var registrar = new PluginRegistrar (path);
registrar.load ();
plugin = registrar.new_object ();
plugins.append (plugin);
plugin.hello (window, context);
}
}
} catch (Error e) {
stderr.printf ("Error: %s\n", e.message);
}
}
static int osso_callback (string iface, string method, GLib.Array arguments, void* data, out Osso.Rpc rpc) {
var app = (CinaestProgram) data;
if (method == "OpenMovie") {
if (arguments.length < 1) {
rpc.type = DBus.RawType.STRING;
((OssoFix.Rpc) rpc).s = "OpenMovie missing movie parameter";
return Osso.Status.ERROR;
}
// Vala doesn't support GLib.Array, so we have to cast:
Osso.Rpc* arg = *(Osso.Rpc**) arguments;
if (arg[0].type != DBus.RawType.STRING) {
rpc.type = DBus.RawType.STRING;
((OssoFix.Rpc) rpc).s = "OpenMovie first parameter must be string";
return Osso.Status.ERROR;
}
string title = arg[0].s;
int year = 0;
if (arguments.length >= 2) {
if (arg[1].type != DBus.RawType.INT32) {
rpc.type = DBus.RawType.STRING;
((OssoFix.Rpc) rpc).s = "OpenMovie second parameter must be int";
return Osso.Status.ERROR;
}
year = arg[1].i;
}
if (reference == null) {
rpc.type = DBus.RawType.STRING;
((OssoFix.Rpc) rpc).s = "No reference source installed";
return Osso.Status.ERROR;
}
print ("OpenMovie (\"%s\"", title);
if (year > 0)
print (", %d", year);
print (")\n");
var list_window = new MovieListWindow (reference, title, year);
var widget = app.secondary_stack.pop_1 ();
while (widget != null) {
widget.destroy ();
widget = app.secondary_stack.pop_1 ();
}
app.secondary_stack.push_1 (list_window);
}
rpc.type = DBus.RawType.INVALID;
return Osso.Status.OK;
}
public void run () {
foreach (Plugin plugin in plugins) {
window.add_sources (plugin.get_sources ());
foreach (MovieSource source in plugin.get_sources ()) {
if (reference == null && SourceFlags.REFERENCE in source.get_flags ())
reference = source;
}
}
Gtk.main ();
}
static int main (string[] args) {
Gtk.init (ref args);
Intl.setlocale (LocaleCategory.ALL, "");
Intl.bindtextdomain (Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
Intl.textdomain (Config.GETTEXT_PACKAGE);
var osso_context = new Osso.Context ("org.maemo.cinaest", Config.VERSION, true, null);
if (osso_context == null) {
return Osso.Status.ERROR;
}
CinaestProgram app = new CinaestProgram ();
app.register_plugins (osso_context);
osso_context.set_rpc_default_callback (osso_callback, app);
app.run ();
return 0;
}
}