/* * Copyright (C) 2010 Collabora Ltd. * * 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, see . * * Authors: * Philip Withnall */ using GLib; using Gee; using Xml; using Folks; /* * Command line application to import meta-contact information from various * places into libfolks' key file backend. * * Used as follows: * folks-import [--source=pidgin] [--source-filename=~/.purple/blist.xml] */ public class Folks.ImportTool : Object { private static string source; private static string source_filename; private static const OptionEntry[] options = { { "source", 's', 0, OptionArg.STRING, ref ImportTool.source, N_("Source backend name (default: 'pidgin')"), "name" }, { "source-filename", 0, 0, OptionArg.FILENAME, ref ImportTool.source_filename, N_("Source filename (default: specific to source backend)"), null }, { null } }; public static int main (string[] args) { Intl.bindtextdomain (BuildConf.GETTEXT_PACKAGE, BuildConf.LOCALE_DIR); Intl.textdomain (BuildConf.GETTEXT_PACKAGE); OptionContext context = new OptionContext ( _("— import meta-contact information to libfolks")); context.add_main_entries (ImportTool.options, "folks"); try { context.parse (ref args); } catch (OptionError e) { /* Translators: the parameter is an error message. */ stderr.printf (_("Couldn't parse command line options: %s\n"), e.message); return 1; } /* We only support importing from Pidgin at the moment */ if (source == null || source.strip () == "") source = "pidgin"; /* FIXME: We need to create this, even though we don't use it, to prevent * debug message spew, as its constructor initialises the log handling. * bgo#629096 */ IndividualAggregator aggregator = new IndividualAggregator (); aggregator = null; /* Create a main loop and start importing */ MainLoop main_loop = new MainLoop (); bool success = false; ImportTool.import.begin ((o, r) => { success = ImportTool.import.end (r); main_loop.quit (); }); main_loop.run (); return success ? 0 : 1; } private static async bool import () { BackendStore backend_store = BackendStore.dup (); try { yield backend_store.load_backends (); } catch (GLib.Error e1) { /* Translators: the parameter is an error message. */ stderr.printf (_("Couldn't load the backends: %s\n"), e1.message); return false; } /* Get the key-file backend */ Backend kf_backend = backend_store.get_backend_by_name ("key-file"); if (kf_backend == null) { stderr.printf (_("Couldn't load the 'key-file' backend.\n")); return false; } try { yield kf_backend.prepare (); } catch (GLib.Error e2) { /* Translators: the parameter is an error message. */ stderr.printf (_("Couldn't prepare the 'key-file' backend: %s\n"), e2.message); return false; } /* Get its only PersonaStore */ PersonaStore destination_store; GLib.List stores = kf_backend.persona_stores.get_values (); if (stores == null) { stderr.printf ( _("Couldn't load the 'key-file' backend's persona store.\n")); return false; } try { destination_store = stores.data; yield destination_store.prepare (); } catch (GLib.Error e3) { /* Translators: the parameter is an error message. */ stderr.printf ( _("Couldn't prepare the 'key-file' backend's persona store: %s\n"), e3.message); return false; } if (source == "pidgin") { Importer importer = new Importers.Pidgin (); try { /* Import! */ yield importer.import (destination_store, ImportTool.source_filename); } catch (ImportError e) { /* Translators: the parameter is an error message. */ stderr.printf (_("Error importing personas: %s\n"), e.message); return false; } /* Wait for the PersonaStore to finish writing its changes to disk */ yield destination_store.flush (); return true; } else { stderr.printf ( _("Unrecognised source backend name '%s'. 'pidgin' is currently the only supported source backend.\n"), source); return false; } } } public errordomain Folks.ImportError { MALFORMED_INPUT, } public abstract class Folks.Importer : Object { public abstract async uint import (PersonaStore destination_store, string? source_filename) throws ImportError; }