static void change_folder (CamelStore *store, const gchar *name, guint32 flags, gint count) { CamelFolderInfo *fi; const gchar *tmp; fi = camel_folder_info_new (); fi->full_name = g_strdup (name); tmp = strrchr (name, '/'); if (tmp == NULL) tmp = name; else tmp++; fi->display_name = g_strdup (tmp); fi->unread = count; fi->flags = CAMEL_FOLDER_VIRTUAL; if (!(flags & CHANGE_DELETE)) fi->flags |= CAMEL_FOLDER_NOCHILDREN; if (flags & CHANGE_NOSELECT) fi->flags |= CAMEL_FOLDER_NOSELECT; if (flags & CHANGE_DELETE) camel_store_folder_deleted (store, fi); else camel_store_folder_created (store, fi); camel_folder_info_free (fi); }
CamelFolderInfo * camel_ews_utils_build_folder_info (CamelEwsStore *store, const gchar *fid) { CamelEwsStoreSummary *ews_summary = store->summary; CamelFolderInfo *fi; gchar *folder_name; fi = camel_folder_info_new (); fi->full_name = camel_ews_store_summary_get_folder_full_name ( ews_summary, fid, NULL); if (!fi->full_name) { camel_folder_info_free (fi); g_warn_if_reached (); return NULL; } folder_name = camel_ews_store_summary_get_folder_name (ews_summary, fid, NULL); fi->display_name = e_ews_folder_utils_unescape_name (folder_name); fi->flags = camel_ews_store_summary_get_folder_flags (ews_summary, fid, NULL); fi->unread = camel_ews_store_summary_get_folder_unread (ews_summary, fid, NULL); fi->total = camel_ews_store_summary_get_folder_total (ews_summary, fid, NULL); g_free (folder_name); if (!(fi->flags & CAMEL_FOLDER_TYPE_MASK)) { switch (camel_ews_store_summary_get_folder_type (ews_summary, fid, NULL)) { case E_EWS_FOLDER_TYPE_CALENDAR: fi->flags |= CAMEL_FOLDER_TYPE_EVENTS; break; case E_EWS_FOLDER_TYPE_CONTACTS: fi->flags |= CAMEL_FOLDER_TYPE_CONTACTS; break; case E_EWS_FOLDER_TYPE_TASKS: fi->flags |= CAMEL_FOLDER_TYPE_TASKS; break; case E_EWS_FOLDER_TYPE_MEMOS: fi->flags |= CAMEL_FOLDER_TYPE_MEMOS; break; default: break; } } return fi; }
/*Build/populate CamelFolderInfo structure based on the imap_build_folder_info function*/ static CamelFolderInfo * groupwise_build_folder_info (CamelGroupwiseStore *gw_store, const gchar *parent_name, const gchar *folder_name) { CamelURL *url; const gchar *name; CamelFolderInfo *fi; CamelGroupwiseStorePrivate *priv = gw_store->priv; fi = camel_folder_info_new (); fi->unread = -1; fi->total = -1; if (parent_name) { if (strlen (parent_name) > 0) fi->full_name = g_strconcat(parent_name, "/", folder_name, NULL); else fi->full_name = g_strdup (folder_name); } else fi->full_name = g_strdup (folder_name); url = camel_url_new (priv->base_url,NULL); g_free (url->path); url->path = g_strdup_printf("/%s", fi->full_name); fi->uri = camel_url_to_string (url,CAMEL_URL_HIDE_ALL); camel_url_free (url); name = strrchr (fi->full_name,'/'); if (name == NULL) name = fi->full_name; else name++; if (!strcmp (folder_name, "Sent Items")) fi->flags |= CAMEL_FOLDER_TYPE_SENT; else if (!strcmp (folder_name, "Mailbox")) fi->flags |= CAMEL_FOLDER_TYPE_INBOX; else if (!strcmp (folder_name, "Trash")) fi->flags |= CAMEL_FOLDER_TYPE_TRASH; else if (!strcmp (folder_name, "Junk Mail")) fi->flags |= CAMEL_FOLDER_TYPE_JUNK; if (groupwise_is_system_folder (folder_name)) fi->flags |= CAMEL_FOLDER_SYSTEM; fi->name = g_strdup (name); return fi; }
static CamelFolderInfo * vee_store_create_unmatched_fi (void) { CamelFolderInfo *info; info = camel_folder_info_new (); info->full_name = g_strdup (CAMEL_UNMATCHED_NAME); info->display_name = g_strdup (PRETTY_UNMATCHED_FOLDER_NAME); info->unread = -1; info->flags = CAMEL_FOLDER_NOCHILDREN | CAMEL_FOLDER_NOINFERIORS | CAMEL_FOLDER_SYSTEM | CAMEL_FOLDER_VIRTUAL; return info; }
static CamelFolderInfo * ex_create_folder_info (CamelStore *store, char *name, char *uri, int unread_count, int flags) { CamelFolderInfo *info; const char *path; path = strstr (uri, "://"); if (!path) return NULL; path = strchr (path + 3, '/'); if (!path) return NULL; info = camel_folder_info_new (); info->name = name; info->uri = uri; info->full_name = g_strdup (path + 1); info->unread = unread_count; return info; }
static CamelFolderInfo * vee_store_get_folder_info_sync (CamelStore *store, const gchar *top, CamelStoreGetFolderInfoFlags flags, GCancellable *cancellable, GError **error) { CamelFolderInfo *info, *res = NULL, *tail; GPtrArray *folders; GHashTable *infos_hash; gint i; d (printf ("Get folder info '%s'\n", top ? top:"<null>")); infos_hash = g_hash_table_new (g_str_hash, g_str_equal); folders = camel_object_bag_list (store->folders); qsort (folders->pdata, folders->len, sizeof (folders->pdata[0]), vee_folder_cmp); for (i = 0; i < folders->len; i++) { CamelVeeFolder *folder = folders->pdata[i]; const gchar *full_name; const gchar *display_name; gint add = FALSE; gchar *pname, *tmp; CamelFolderInfo *pinfo; full_name = camel_folder_get_full_name (CAMEL_FOLDER (folder)); display_name = camel_folder_get_display_name (CAMEL_FOLDER (folder)); /* check we have to include this one */ if (top) { gint namelen = strlen (full_name); gint toplen = strlen (top); add = ((namelen == toplen && strcmp (full_name, top) == 0) || ((namelen > toplen) && strncmp (full_name, top, toplen) == 0 && full_name[toplen] == '/' && ((flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) || strchr (full_name + toplen + 1, '/') == NULL))); } else { add = (flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) || strchr (full_name, '/') == NULL; } if (add) { gint32 unread; unread = camel_folder_get_unread_message_count ( CAMEL_FOLDER (folder)); info = camel_folder_info_new (); info->full_name = g_strdup (full_name); info->display_name = g_strdup (display_name); info->unread = unread; info->flags = CAMEL_FOLDER_NOCHILDREN | CAMEL_FOLDER_VIRTUAL; g_hash_table_insert (infos_hash, info->full_name, info); if (res == NULL) res = info; } else { info = NULL; } /* check for parent, if present, update flags and if adding, update parent linkage */ pname = g_strdup (full_name); d (printf ("looking up parent of '%s'\n", pname)); tmp = strrchr (pname, '/'); if (tmp) { *tmp = 0; pinfo = g_hash_table_lookup (infos_hash, pname); } else pinfo = NULL; if (pinfo) { pinfo->flags = (pinfo->flags & ~(CAMEL_FOLDER_CHILDREN | CAMEL_FOLDER_NOCHILDREN)) | CAMEL_FOLDER_CHILDREN; d (printf ("updating parent flags for children '%s' %08x\n", pinfo->full_name, pinfo->flags)); tail = pinfo->child; if (tail == NULL) pinfo->child = info; } else if (info != res) { tail = res; } else { tail = NULL; } if (info && tail) { while (tail->next) tail = tail->next; tail->next = info; info->parent = pinfo; } g_free (pname); g_object_unref (folder); } g_ptr_array_free (folders, TRUE); g_hash_table_destroy (infos_hash); /* and add UNMATCHED, if scanning from top/etc and it's enabled */ if (camel_vee_store_get_unmatched_enabled (CAMEL_VEE_STORE (store)) && (top == NULL || top[0] == 0 || strncmp (top, CAMEL_UNMATCHED_NAME, strlen (CAMEL_UNMATCHED_NAME)) == 0)) { info = vee_store_create_unmatched_fi (); if (res == NULL) res = info; else { tail = res; while (tail->next) tail = tail->next; tail->next = info; } } return res; }
static CamelFolderInfo * scan_dir (CamelStore *store, GHashTable *visited, CamelFolderInfo *parent, const gchar *root, const gchar *name, guint32 flags, GError **error) { CamelFolderInfo *folders, *tail, *fi; GHashTable *folder_hash; const gchar *dent; GDir *dir; tail = folders = NULL; if (!(dir = g_dir_open (root, 0, NULL))) return NULL; folder_hash = g_hash_table_new (g_str_hash, g_str_equal); /* FIXME: it would be better if we queue'd up the recursive * scans till the end so that we can limit the number of * directory descriptors open at any given time... */ while ((dent = g_dir_read_name (dir))) { gchar *short_name, *full_name, *path, *ext; struct stat st; if (dent[0] == '.') continue; if (ignore_file (dent, FALSE)) continue; path = g_strdup_printf ("%s/%s", root, dent); if (g_stat (path, &st) == -1) { g_free (path); continue; } #ifndef G_OS_WIN32 if (S_ISDIR (st.st_mode)) { struct _inode in = { st.st_dev, st.st_ino }; if (g_hash_table_lookup (visited, &in)) { g_free (path); continue; } } #endif short_name = g_strdup (dent); if ((ext = strrchr (short_name, '.')) && !strcmp (ext, ".sbd")) *ext = '\0'; if (name != NULL) full_name = g_strdup_printf ("%s/%s", name, short_name); else full_name = g_strdup (short_name); if ((fi = g_hash_table_lookup (folder_hash, short_name)) != NULL) { g_free (short_name); g_free (full_name); if (S_ISDIR (st.st_mode)) { fi->flags = (fi->flags & ~CAMEL_FOLDER_NOCHILDREN) | CAMEL_FOLDER_CHILDREN; } else { fi->flags &= ~CAMEL_FOLDER_NOSELECT; } } else { fi = camel_folder_info_new (); fi->parent = parent; fi->full_name = full_name; fi->display_name = short_name; fi->unread = -1; fi->total = -1; if (S_ISDIR (st.st_mode)) fi->flags = CAMEL_FOLDER_NOSELECT; else fi->flags = CAMEL_FOLDER_NOCHILDREN; if (tail == NULL) folders = fi; else tail->next = fi; tail = fi; g_hash_table_insert (folder_hash, fi->display_name, fi); } if (!S_ISDIR (st.st_mode)) { fill_fi (store, fi, flags); } else if ((flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE)) { struct _inode in = { st.st_dev, st.st_ino }; if (g_hash_table_lookup (visited, &in) == NULL) { #ifndef G_OS_WIN32 struct _inode *inew = g_new (struct _inode, 1); *inew = in; g_hash_table_insert (visited, inew, inew); #endif if ((fi->child = scan_dir (store, visited, fi, path, fi->full_name, flags, error))) fi->flags |= CAMEL_FOLDER_CHILDREN; else fi->flags = (fi->flags & ~CAMEL_FOLDER_CHILDREN) | CAMEL_FOLDER_NOCHILDREN; } } g_free (path); } g_dir_close (dir); g_hash_table_destroy (folder_hash); return folders; }