Camel: Allow SSL certificate resave and use detailed errors from SSL stream
[platform/upstream/evolution-data-server.git] / addressbook / libedata-book / e-book-backend-db-cache.c
index 28c2caf..7c52cc4 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
-
+#include <stdlib.h>
 #include <string.h>
+
+#include <libedataserver/e-data-server-util.h>
 #include "e-book-backend-db-cache.h"
 #include "e-book-backend.h"
 #include "e-book-backend-sexp.h"
 
 void
-string_to_dbt(const gchar *str, DBT *dbt)
+string_to_dbt (const gchar *str,
+               DBT *dbt)
 {
-       memset(dbt, 0, sizeof(dbt));
-       dbt->data = (gpointer)str;
-       dbt->size = strlen(str) + 1;
+       memset (dbt, 0, sizeof (DBT));
+       dbt->data = (gpointer) str;
+       dbt->size = strlen (str) + 1;
        dbt->flags = DB_DBT_USERMEM;
 }
 
 static gchar *
 get_filename_from_uri (const gchar *uri)
 {
+       const gchar *user_cache_dir;
        gchar *mangled_uri, *filename;
-       gint i;
-
-       /* mangle the URI to not contain invalid characters */
-       mangled_uri = g_strdup (uri);
-       for (i = 0; i < strlen (mangled_uri); i++) {
-               switch (mangled_uri[i]) {
-               case ':' :
-               case '/' :
-                       mangled_uri[i] = '_';
-               }
-       }
 
-       /* generate the file name */
-       filename = g_build_filename (g_get_home_dir (), ".evolution/cache/addressbook",
-                                    mangled_uri, "cache.db", NULL);
+       user_cache_dir = e_get_user_cache_dir ();
+
+       /* Mangle the URI to not contain invalid characters. */
+       mangled_uri = g_strdelimit (g_strdup (uri), ":/", '_');
+
+       filename = g_build_filename (
+               user_cache_dir, "addressbook",
+               mangled_uri, "cache.db", NULL);
 
-       /* free memory */
        g_free (mangled_uri);
 
        return filename;
@@ -72,7 +67,8 @@ get_filename_from_uri (const gchar *uri)
  **/
 
 void
-e_book_backend_db_cache_set_filename(DB *db, const gchar *filename)
+e_book_backend_db_cache_set_filename (DB *db,
+                                      const gchar *filename)
 {
        DBT uid_dbt, vcard_dbt;
        gint db_error;
@@ -95,14 +91,14 @@ e_book_backend_db_cache_set_filename(DB *db, const gchar *filename)
  **/
 
 gchar *
-e_book_backend_db_cache_get_filename(DB *db)
+e_book_backend_db_cache_get_filename (DB *db)
 {
        DBT  uid_dbt, vcard_dbt;
        gint db_error;
        gchar *filename;
 
        string_to_dbt ("filename", &uid_dbt);
-       memset (&vcard_dbt, 0 , sizeof(vcard_dbt));
+       memset (&vcard_dbt, 0 , sizeof (vcard_dbt));
        vcard_dbt.flags = DB_DBT_MALLOC;
 
        db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt, 0);
@@ -129,7 +125,8 @@ e_book_backend_db_cache_get_filename(DB *db)
  * Returns: A cached #EContact, or %NULL if @uid is not cached.
  **/
 EContact *
-e_book_backend_db_cache_get_contact (DB *db, const gchar *uid)
+e_book_backend_db_cache_get_contact (DB *db,
+                                     const gchar *uid)
 {
        DBT     uid_dbt, vcard_dbt;
        gint    db_error;
@@ -138,7 +135,7 @@ e_book_backend_db_cache_get_contact (DB *db, const gchar *uid)
        g_return_val_if_fail (uid != NULL, NULL);
 
        string_to_dbt (uid, &uid_dbt);
-       memset (&vcard_dbt, 0 , sizeof(vcard_dbt));
+       memset (&vcard_dbt, 0 , sizeof (vcard_dbt));
        vcard_dbt.flags = DB_DBT_MALLOC;
 
        db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt,0);
@@ -147,7 +144,7 @@ e_book_backend_db_cache_get_contact (DB *db, const gchar *uid)
                return NULL;
        }
 
-       contact = e_contact_new_from_vcard ((const gchar *)vcard_dbt.data);
+       contact = e_contact_new_from_vcard_with_uid ((const gchar *) vcard_dbt.data, uid);
        g_free (vcard_dbt.data);
        return contact;
 }
@@ -163,7 +160,7 @@ e_book_backend_db_cache_get_contact (DB *db, const gchar *uid)
  **/
 gboolean
 e_book_backend_db_cache_add_contact (DB *db,
-                                    EContact *contact)
+                                     EContact *contact)
 {
        DBT     uid_dbt, vcard_dbt;
        gint    db_error;
@@ -174,13 +171,13 @@ e_book_backend_db_cache_add_contact (DB *db,
        if (!uid) {
                printf ("no uid\n");
                printf("name:%s, email:%s\n",
-                       (gchar *)e_contact_get (contact, E_CONTACT_GIVEN_NAME),
-                       (gchar *)e_contact_get (contact, E_CONTACT_EMAIL_1));
+                       (gchar *) e_contact_get (contact, E_CONTACT_GIVEN_NAME),
+                       (gchar *) e_contact_get (contact, E_CONTACT_EMAIL_1));
                return FALSE;
        }
        string_to_dbt (uid, &uid_dbt);
 
-       vcard_str = e_vcard_to_string (E_VCARD(contact), EVC_FORMAT_VCARD_30);
+       vcard_str = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
        string_to_dbt (vcard_str, &vcard_dbt);
 
        /* db_error = db->del (db, NULL, &uid_dbt, 0); */
@@ -207,7 +204,7 @@ e_book_backend_db_cache_add_contact (DB *db,
  **/
 gboolean
 e_book_backend_db_cache_remove_contact (DB *db,
-                                       const gchar *uid)
+                                        const gchar *uid)
 
 {
        DBT     uid_dbt;
@@ -237,7 +234,8 @@ e_book_backend_db_cache_remove_contact (DB *db,
  * Returns: %TRUE if the cache contains the contact, %FALSE otherwise.
  **/
 gboolean
-e_book_backend_db_cache_check_contact (DB *db, const gchar *uid)
+e_book_backend_db_cache_check_contact (DB *db,
+                                       const gchar *uid)
 {
        DBT     uid_dbt, vcard_dbt;
        gint    db_error;
@@ -245,7 +243,7 @@ e_book_backend_db_cache_check_contact (DB *db, const gchar *uid)
        g_return_val_if_fail (uid != NULL, FALSE);
 
        string_to_dbt (uid, &uid_dbt);
-       memset (&vcard_dbt, 0 , sizeof(vcard_dbt));
+       memset (&vcard_dbt, 0 , sizeof (vcard_dbt));
        vcard_dbt.flags = DB_DBT_MALLOC;
 
        db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt,0);
@@ -269,7 +267,8 @@ e_book_backend_db_cache_check_contact (DB *db, const gchar *uid)
  * Returns: A #GList of pointers to #EContact.
  **/
 GList *
-e_book_backend_db_cache_get_contacts (DB *db, const gchar *query)
+e_book_backend_db_cache_get_contacts (DB *db,
+                                      const gchar *query)
 {
        DBC     *dbc;
        DBT     uid_dbt, vcard_dbt;
@@ -292,15 +291,15 @@ e_book_backend_db_cache_get_contacts (DB *db, const gchar *query)
                return NULL;
        }
 
-       memset(&vcard_dbt, 0 , sizeof(vcard_dbt));
-       memset(&uid_dbt, 0, sizeof(uid_dbt));
-       db_error = dbc->c_get(dbc, &uid_dbt, &vcard_dbt, DB_FIRST);
+       memset (&vcard_dbt, 0 , sizeof (vcard_dbt));
+       memset (&uid_dbt, 0, sizeof (uid_dbt));
+       db_error = dbc->c_get (dbc, &uid_dbt, &vcard_dbt, DB_FIRST);
 
        while (db_error == 0) {
                if (vcard_dbt.data && !strncmp (vcard_dbt.data, "BEGIN:VCARD", 11)) {
                        contact = e_contact_new_from_vcard (vcard_dbt.data);
 
-                       if (e_book_backend_sexp_match_contact(sexp, contact))
+                       if (!sexp || e_book_backend_sexp_match_contact (sexp, contact))
                                list = g_list_prepend (list, contact);
                        else
                                g_object_unref (contact);
@@ -320,7 +319,7 @@ e_book_backend_db_cache_get_contacts (DB *db, const gchar *query)
 
 /**
  * e_book_backend_db_cache_search:
- * @backend: an #EBookBackend
+ * @db: DB handle
  * @query: an s-expression
  *
  * Returns an array of pointers to unique contact ID strings for contacts
@@ -330,7 +329,8 @@ e_book_backend_db_cache_get_contacts (DB *db, const gchar *query)
  * Returns: A #GPtrArray of pointers to contact ID strings.
  **/
 GPtrArray *
-e_book_backend_db_cache_search (DB *db, const gchar *query)
+e_book_backend_db_cache_search (DB *db,
+                                const gchar *query)
 {
        GList *matching_contacts, *temp;
        GPtrArray *ptr_array;
@@ -373,7 +373,7 @@ e_book_backend_db_cache_exists (const gchar *uri)
 
 /**
  * e_book_backend_db_cache_set_populated:
- * @backend: an #EBookBackend
+ * @db: DB handle
  *
  * Flags @cache as being populated - that is, it is up-to-date on the
  * contents of the book it's caching.
@@ -408,7 +408,7 @@ e_book_backend_db_cache_is_populated (DB *db)
        gint    db_error;
 
        string_to_dbt ("populated", &uid_dbt);
-       memset(&vcard_dbt, 0, sizeof(vcard_dbt));
+       memset (&vcard_dbt, 0, sizeof (vcard_dbt));
        vcard_dbt.flags = DB_DBT_MALLOC;
 
        db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt, 0);
@@ -416,7 +416,7 @@ e_book_backend_db_cache_is_populated (DB *db)
                return FALSE;
        }
        else {
-               free(vcard_dbt.data);
+               free (vcard_dbt.data);
                return TRUE;
        }
 }
@@ -427,7 +427,8 @@ e_book_backend_db_cache_is_populated (DB *db)
  * Since: 2.26
  **/
 void
-e_book_backend_db_cache_set_time(DB *db, const gchar *t)
+e_book_backend_db_cache_set_time (DB *db,
+                                  const gchar *t)
 {
        DBT uid_dbt, vcard_dbt;
        gint db_error;
@@ -454,7 +455,7 @@ e_book_backend_db_cache_get_time (DB *db)
        gchar *t = NULL;
 
        string_to_dbt ("last_update_time", &uid_dbt);
-       memset (&vcard_dbt, 0, sizeof(vcard_dbt));
+       memset (&vcard_dbt, 0, sizeof (vcard_dbt));
        vcard_dbt.flags = DB_DBT_MALLOC;
 
        db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt, 0);