]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-status-presets.c
don't pass a GError when first trying to start gnome-contacts
[empathy.git] / libempathy / empathy-status-presets.c
index e7b8804ad6bc60168a006dd343febe8f6b209796..aacee83d82fa112e0af8daa05bcd2dc86fd76062 100644 (file)
  *
  * 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.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA  02110-1301  USA
  *
  * Author: Martyn Russell <martyn@imendio.com>
  */
 
 #include "config.h"
+#include "empathy-status-presets.h"
 
-#include <sys/types.h>
 #include <sys/stat.h>
-#include <string.h>
-
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-#include <telepathy-glib/util.h>
+#include <tp-account-widgets/tpaw-utils.h>
 
 #include "empathy-utils.h"
-#include "empathy-status-presets.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
 #include "empathy-debug.h"
 
 #define STATUS_PRESETS_XML_FILENAME "status-presets.xml"
-#define STATUS_PRESETS_DTD_FILENAME "empathy-status-presets.dtd"
+#define STATUS_PRESETS_DTD_RESOURCENAME "/org/gnome/Empathy/empathy-status-presets.dtd"
 #define STATUS_PRESETS_MAX_EACH     15
 
 typedef struct {
        gchar      *status;
-       McPresence  state;
+       TpConnectionPresenceType  state;
 } StatusPreset;
 
-static StatusPreset *status_preset_new          (McPresence    state,
+static StatusPreset *status_preset_new          (TpConnectionPresenceType    state,
                                                 const gchar  *status);
 static void     status_preset_free              (StatusPreset *status);
 static void     status_presets_file_parse       (const gchar  *filename);
-const gchar *   status_presets_get_state_as_str (McPresence    state);
+const gchar *   status_presets_get_state_as_str (TpConnectionPresenceType    state);
 static gboolean status_presets_file_save        (void);
-static void     status_presets_set_default      (McPresence    state,
+static void     status_presets_set_default      (TpConnectionPresenceType    state,
                                                 const gchar  *status);
 
 static GList        *presets = NULL;
 static StatusPreset *default_preset = NULL;
 
 static StatusPreset *
-status_preset_new (McPresence   state,
+status_preset_new (TpConnectionPresenceType   state,
                   const gchar *status)
 {
        StatusPreset *preset;
@@ -102,9 +93,9 @@ status_presets_file_parse (const gchar *filename)
                return;
        }
 
-       if (!empathy_xml_validate (doc, STATUS_PRESETS_DTD_FILENAME)) {
+       if (!tpaw_xml_validate_from_resource (doc, STATUS_PRESETS_DTD_RESOURCENAME)) {
                g_warning ("Failed to validate file:'%s'", filename);
-               xmlFreeDoc(doc);
+               xmlFreeDoc (doc);
                xmlFreeParserCtxt (ctxt);
                return;
        }
@@ -116,7 +107,7 @@ status_presets_file_parse (const gchar *filename)
        while (node) {
                if (strcmp ((gchar *) node->name, "status") == 0 ||
                    strcmp ((gchar *) node->name, "default") == 0) {
-                       McPresence    state;
+                       TpConnectionPresenceType    state;
                        gchar        *status;
                        gchar        *state_str;
                        StatusPreset *preset;
@@ -127,20 +118,21 @@ status_presets_file_parse (const gchar *filename)
                        }
 
                        status = (gchar *) xmlNodeGetContent (node);
-                       state_str = (gchar *) xmlGetProp (node, "presence");
+                       state_str = (gchar *) xmlGetProp (node, (const xmlChar *) "presence");
 
                        if (state_str) {
                                state = empathy_presence_from_str (state_str);
-
-                               if (is_default) {
-                                       DEBUG ("Default status preset state is:"
-                                               " '%s', status:'%s'", state_str,
-                                               status);
-
-                                       status_presets_set_default (state, status);
-                               } else {
-                                       preset = status_preset_new (state, status);
-                                       presets = g_list_append (presets, preset);
+                               if (empathy_status_presets_is_valid (state)) {
+                                       if (is_default) {
+                                               DEBUG ("Default status preset state is:"
+                                                       " '%s', status:'%s'", state_str,
+                                                       status);
+
+                                               status_presets_set_default (state, status);
+                                       } else {
+                                               preset = status_preset_new (state, status);
+                                               presets = g_list_append (presets, preset);
+                                       }
                                }
                        }
 
@@ -153,7 +145,7 @@ status_presets_file_parse (const gchar *filename)
 
        /* Use the default if not set */
        if (!default_preset) {
-               status_presets_set_default (MC_PRESENCE_OFFLINE, NULL);
+               status_presets_set_default (TP_CONNECTION_PRESENCE_TYPE_OFFLINE, NULL);
        }
 
        DEBUG ("Parsed %d status presets", g_list_length (presets));
@@ -175,7 +167,7 @@ empathy_status_presets_get_all (void)
                presets = NULL;
        }
 
-       dir = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, NULL);
+       dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
        g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
        file_with_path = g_build_filename (dir, STATUS_PRESETS_XML_FILENAME, NULL);
        g_free (dir);
@@ -195,31 +187,31 @@ status_presets_file_save (void)
        GList      *l;
        gchar      *dir;
        gchar      *file;
-       gint        count[LAST_MC_PRESENCE];
+       gint        count[TP_NUM_CONNECTION_PRESENCE_TYPES];
        gint        i;
 
-       for (i = 0; i < LAST_MC_PRESENCE; i++) {
+       for (i = 0; i < TP_NUM_CONNECTION_PRESENCE_TYPES; i++) {
                count[i] = 0;
        }
 
-       dir = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, NULL);
+       dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
        g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
        file = g_build_filename (dir, STATUS_PRESETS_XML_FILENAME, NULL);
        g_free (dir);
 
-       doc = xmlNewDoc ("1.0");
-       root = xmlNewNode (NULL, "presets");
+       doc = xmlNewDoc ((const xmlChar *) "1.0");
+       root = xmlNewNode (NULL, (const xmlChar *) "presets");
        xmlDocSetRootElement (doc, root);
 
        if (default_preset) {
                xmlNodePtr  subnode;
                xmlChar    *state;
 
-               state = (gchar*) empathy_presence_to_str (default_preset->state);
+               state = (xmlChar *) empathy_presence_to_str (default_preset->state);
 
-               subnode = xmlNewTextChild (root, NULL, "default",
-                                          default_preset->status);
-               xmlNewProp (subnode, "presence", state);
+               subnode = xmlNewTextChild (root, NULL, (const xmlChar *) "default",
+                                         (const xmlChar *) default_preset->status);
+               xmlNewProp (subnode, (const xmlChar *) "presence", state);
        }
 
        for (l = presets; l; l = l->next) {
@@ -228,7 +220,7 @@ status_presets_file_save (void)
                xmlChar      *state;
 
                sp = l->data;
-               state = (gchar*) empathy_presence_to_str (sp->state);
+               state = (xmlChar *) empathy_presence_to_str (sp->state);
 
                count[sp->state]++;
                if (count[sp->state] > STATUS_PRESETS_MAX_EACH) {
@@ -236,8 +228,8 @@ status_presets_file_save (void)
                }
 
                subnode = xmlNewTextChild (root, NULL,
-                                          "status", sp->status);
-               xmlNewProp (subnode, "presence", state);
+                                          (const xmlChar *) "status", (const xmlChar *) sp->status);
+               xmlNewProp (subnode, (const xmlChar *) "presence", state);
        }
 
        /* Make sure the XML is indented properly */
@@ -253,7 +245,7 @@ status_presets_file_save (void)
 }
 
 GList *
-empathy_status_presets_get (McPresence state,
+empathy_status_presets_get (TpConnectionPresenceType state,
                           gint       max_number)
 {
        GList *list = NULL;
@@ -282,7 +274,7 @@ empathy_status_presets_get (McPresence state,
 }
 
 void
-empathy_status_presets_set_last (McPresence   state,
+empathy_status_presets_set_last (TpConnectionPresenceType   state,
                                const gchar *status)
 {
        GList        *l;
@@ -323,7 +315,7 @@ empathy_status_presets_set_last (McPresence   state,
 }
 
 void
-empathy_status_presets_remove (McPresence   state,
+empathy_status_presets_remove (TpConnectionPresenceType   state,
                               const gchar *status)
 {
        StatusPreset *preset;
@@ -350,16 +342,16 @@ empathy_status_presets_reset (void)
 
        presets = NULL;
 
-       status_presets_set_default (MC_PRESENCE_AVAILABLE, NULL);
+       status_presets_set_default (TP_CONNECTION_PRESENCE_TYPE_AVAILABLE, NULL);
 
        status_presets_file_save ();
 }
 
-McPresence
+TpConnectionPresenceType
 empathy_status_presets_get_default_state (void)
 {
        if (!default_preset) {
-               return MC_PRESENCE_OFFLINE;
+               return TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
        }
 
        return default_preset->state;
@@ -377,7 +369,7 @@ empathy_status_presets_get_default_status (void)
 }
 
 static void
-status_presets_set_default (McPresence   state,
+status_presets_set_default (TpConnectionPresenceType   state,
                            const gchar *status)
 {
        if (default_preset) {
@@ -388,7 +380,7 @@ status_presets_set_default (McPresence   state,
 }
 
 void
-empathy_status_presets_set_default (McPresence   state,
+empathy_status_presets_set_default (TpConnectionPresenceType   state,
                                   const gchar *status)
 {
        status_presets_set_default (state, status);
@@ -405,3 +397,33 @@ empathy_status_presets_clear_default (void)
 
        status_presets_file_save ();
 }
+
+/**
+ * empathy_status_presets_is_valid:
+ * @state: a #TpConnectionPresenceType
+ *
+ * Check if a presence type can be used as a preset.
+ *
+ * Returns: %TRUE if the presence type can be used as a preset.
+ */
+gboolean
+empathy_status_presets_is_valid (TpConnectionPresenceType state)
+{
+       switch (state) {
+               case TP_CONNECTION_PRESENCE_TYPE_UNSET:
+               case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
+               case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN:
+               case TP_CONNECTION_PRESENCE_TYPE_ERROR:
+                       return FALSE;
+
+               case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE:
+               case TP_CONNECTION_PRESENCE_TYPE_AWAY:
+               case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY:
+               case TP_CONNECTION_PRESENCE_TYPE_HIDDEN:
+               case TP_CONNECTION_PRESENCE_TYPE_BUSY:
+                       return TRUE;
+
+               default:
+                       return FALSE;
+       }
+}