aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-pilot-map.c
diff options
context:
space:
mode:
Diffstat (limited to 'e-util/e-pilot-map.c')
-rw-r--r--e-util/e-pilot-map.c108
1 files changed, 67 insertions, 41 deletions
diff --git a/e-util/e-pilot-map.c b/e-util/e-pilot-map.c
index 48f2b7193d..92daa01637 100644
--- a/e-util/e-pilot-map.c
+++ b/e-util/e-pilot-map.c
@@ -33,14 +33,65 @@ typedef struct
{
char *uid;
gboolean archived;
+ gboolean touched;
} EPilotMapPidNode;
typedef struct
{
guint32 pid;
gboolean archived;
+ gboolean touched;
} EPilotMapUidNode;
+typedef struct
+{
+ gboolean touched_only;
+ xmlNodePtr root;
+} EPilotMapWriteData;
+
+static void
+real_e_pilot_map_insert (EPilotMap *map, guint32 pid, const char *uid, gboolean archived, gboolean touch)
+{
+ char *new_uid;
+ guint32 *new_pid;
+ EPilotMapPidNode *pnode;
+ EPilotMapUidNode *unode;
+ gpointer key, value;
+
+ g_return_if_fail (map != NULL);
+ g_return_if_fail (uid != NULL);
+
+ new_pid = g_new (guint32, 1);
+ *new_pid = pid;
+
+ new_uid = g_strdup (uid);
+
+ pnode = g_new0 (EPilotMapPidNode, 1);
+ pnode->uid = new_uid;
+ pnode->archived = archived;
+ if (touch)
+ pnode->touched = TRUE;
+
+ unode = g_new0 (EPilotMapUidNode, 1);
+ unode->pid = pid;
+ unode->archived = archived;
+ if (touch)
+ unode->touched = TRUE;
+
+ if (g_hash_table_lookup_extended (map->pid_map, new_pid, &key, &value)) {
+ g_hash_table_remove (map->pid_map, new_pid);
+ g_free (key);
+ g_free (value);
+ }
+ if (g_hash_table_lookup_extended (map->uid_map, new_uid, &key, &value)) {
+ g_hash_table_remove (map->uid_map, new_uid);
+ g_free (key);
+ g_free (value);
+ }
+
+ g_hash_table_insert (map->pid_map, new_pid, pnode);
+ g_hash_table_insert (map->uid_map, new_uid, unode);
+}
static void
map_set_node_timet (xmlNodePtr node, const char *name, time_t t)
@@ -94,26 +145,30 @@ map_sax_start_element (void *data, const xmlChar *name,
g_assert (uid != NULL);
g_assert (pid != 0 || archived);
- e_pilot_map_insert (map, pid, uid, archived);
+ real_e_pilot_map_insert (map, pid, uid, archived, FALSE);
}
}
static void
map_write_foreach (gpointer key, gpointer value, gpointer data)
{
- xmlNodePtr root = data;
- xmlNodePtr mnode;
+ EPilotMapWriteData *wd = data;
+ xmlNodePtr root = wd->root;
char *uid = key;
EPilotMapUidNode *unode = value;
- char *pidstr;
+ xmlNodePtr mnode;
+ if (wd->touched_only && !unode->touched)
+ return;
+
mnode = xmlNewChild (root, NULL, "map", NULL);
-
xmlSetProp (mnode, "uid", uid);
if (unode->archived) {
xmlSetProp (mnode, "archived", "1");
} else {
+ char *pidstr;
+
pidstr = g_strdup_printf ("%d", unode->pid);
xmlSetProp (mnode, "pilot_id", pidstr);
g_free (pidstr);
@@ -155,41 +210,7 @@ e_pilot_map_uid_is_archived (EPilotMap *map, const char *uid)
void
e_pilot_map_insert (EPilotMap *map, guint32 pid, const char *uid, gboolean archived)
{
- char *new_uid;
- guint32 *new_pid;
- EPilotMapPidNode *pnode;
- EPilotMapUidNode *unode;
- gpointer key, value;
-
- g_return_if_fail (map != NULL);
- g_return_if_fail (uid != NULL);
-
- new_pid = g_new (guint32, 1);
- *new_pid = pid;
-
- new_uid = g_strdup (uid);
-
- pnode = g_new0 (EPilotMapPidNode, 1);
- pnode->uid = new_uid;
- pnode->archived = archived;
-
- unode = g_new0 (EPilotMapUidNode, 1);
- unode->pid = pid;
- unode->archived = archived;
-
- if (g_hash_table_lookup_extended (map->pid_map, new_pid, &key, &value)) {
- g_hash_table_remove (map->pid_map, new_pid);
- g_free (key);
- g_free (value);
- }
- if (g_hash_table_lookup_extended (map->uid_map, new_uid, &key, &value)) {
- g_hash_table_remove (map->uid_map, new_uid);
- g_free (key);
- g_free (value);
- }
-
- g_hash_table_insert (map->pid_map, new_pid, pnode);
- g_hash_table_insert (map->uid_map, new_uid, unode);
+ real_e_pilot_map_insert (map, pid, uid, archived, TRUE);
}
void
@@ -291,6 +312,8 @@ e_pilot_map_read (const char *filename, EPilotMap **map)
return -1;
}
}
+
+ new_map->write_touched_only = FALSE;
*map = new_map;
@@ -300,6 +323,7 @@ e_pilot_map_read (const char *filename, EPilotMap **map)
int
e_pilot_map_write (const char *filename, EPilotMap *map)
{
+ EPilotMapWriteData wd;
xmlDocPtr doc;
int ret;
@@ -315,7 +339,9 @@ e_pilot_map_write (const char *filename, EPilotMap *map)
map->since = time (NULL);
map_set_node_timet (doc->root, "timestamp", map->since);
- g_hash_table_foreach (map->uid_map, map_write_foreach, doc->root);
+ wd.touched_only = map->write_touched_only;
+ wd.root = doc->root;
+ g_hash_table_foreach (map->uid_map, map_write_foreach, &wd);
/* Write the file */
xmlSetDocCompressMode (doc, 0);