gboolean rssyl_subscribe(FolderItem *parent, const gchar *url, gboolean verbose) { gchar *myurl = NULL, *tmpname = NULL, *tmpname2 = NULL; RFetchCtx *ctx; FolderItem *new_item; RFolderItem *ritem; gint i = 1; RSubCtx *sctx; gboolean edit_properties = FALSE; gchar *official_title = NULL; g_return_val_if_fail(parent != NULL, FALSE); g_return_val_if_fail(url != NULL, FALSE); log_print(LOG_PROTOCOL, RSSYL_LOG_SUBSCRIBING, url); myurl = my_normalize_url(url); /* Fetch the feed. */ ctx = rssyl_prep_fetchctx_from_url(myurl); g_free(myurl); g_return_val_if_fail(ctx != NULL, FALSE); rssyl_fetch_feed(ctx, verbose); debug_print("RSSyl: fetch success == %s\n", ctx->success ? "TRUE" : "FALSE"); if (!ctx->success) { /* User notification was already handled inside rssyl_fetch_feed(), * let's just return quietly. */ feed_free(ctx->feed); g_free(ctx->error); g_free(ctx); return FALSE; } if (verbose) { sctx = g_new0(RSubCtx, 1); sctx->feed = ctx->feed; sctx->edit_properties = FALSE; debug_print("RSSyl: Calling subscribe dialog routine...\n"); rssyl_subscribe_dialog(sctx); if (sctx->feed == NULL) { debug_print("RSSyl: User cancelled subscribe.\n"); g_free(sctx); return FALSE; } edit_properties = sctx->edit_properties; if (sctx->official_title != NULL) { debug_print("RSSyl: custom official title\n"); official_title = g_strdup(sctx->official_title); } if (sctx->edit_properties) debug_print("RSSyl: User wants to edit properties of the new feed.\n"); else debug_print("RSSyl: User does not want to edit properties of the new feed.\n"); g_free(sctx->official_title); g_free(sctx); } /* OK, feed is succesfully fetched and correct, let's add it to CM. */ /* Create a folder for it. */ tmpname = rssyl_format_string(ctx->feed->title, TRUE, TRUE); tmpname2 = g_strdup(tmpname); #ifdef G_OS_WIN32 /* Windows does not allow its filenames to start or end with a dot, * or to end with a space. */ if (tmpname2[0] == '.') tmpname2[0] = '_'; if (tmpname2[strlen(tmpname2) - 1] == '.') tmpname2[strlen(tmpname2) - 1] = '_'; if (tmpname2[strlen(tmpname2) - 1] == ' ') tmpname2[strlen(tmpname2) - 1] = '_'; #endif while (folder_find_child_item_by_name(parent, tmpname2) != 0 && i < 20) { debug_print("RSSyl: Folder '%s' already exists, trying another name\n", tmpname2); g_free(tmpname2); tmpname2 = g_strdup_printf("%s__%d", tmpname, ++i); } /* TODO: handle cases where i reaches 20 */ folder_item_update_freeze(); new_item = folder_create_folder(parent, tmpname2); g_free(tmpname); g_free(tmpname2); if (!new_item) { if (verbose) alertpanel_error(_("Couldn't create folder for new feed '%s'."), myurl); feed_free(ctx->feed); g_free(ctx->error); g_free(ctx); g_free(myurl); return FALSE; } debug_print("RSSyl: Adding '%s'\n", ctx->feed->url); ritem = (RFolderItem *)new_item; ritem->url = g_strdup(ctx->feed->url); if (official_title != NULL) { debug_print("RSSyl: storing official feed title '%s'\n", official_title); ritem->official_title = official_title; } if (feed_n_items(ctx->feed) > 0) feed_foreach_item(ctx->feed, rssyl_subscribe_foreach_func, (gpointer)ritem); folder_item_scan(new_item); folder_write_list(); if (edit_properties) rssyl_gtk_prop(ritem); folder_item_update_thaw(); return TRUE; }
void rssyl_update_comments(RFolderItem *ritem) { FolderItem *item = &ritem->item; FeedItem *fi = NULL; RFetchCtx *ctx = NULL; GDir *dp; const gchar *d; GError *error = NULL; gint num; gchar *path, *msg, *fname; MainWindow *mainwin = mainwindow_get_mainwindow(); g_return_if_fail(ritem != NULL); if( ritem->fetch_comments == FALSE ) return; path = folder_item_get_path(item); g_return_if_fail(path != NULL); debug_print("RSSyl: starting to parse comments, path is '%s'\n", path); if( (dp = g_dir_open(path, 0, &error)) == NULL ) { debug_print("g_dir_open on \"%s\" failed with error %d (%s)\n", path, error->code, error->message); g_error_free(error); g_free(path); return; } ritem->fetching_comments = TRUE; while( (d = g_dir_read_name(dp)) != NULL ) { if (claws_is_exiting()) { g_dir_close(dp); g_free(path); debug_print("RSSyl: bailing out, app is exiting\n"); return; } if( (num = to_number(d)) > 0) { fname = g_strdup_printf("%s%c%s", path, G_DIR_SEPARATOR, d); if (!g_file_test(fname, G_FILE_TEST_IS_REGULAR)) continue; debug_print("RSSyl: starting to parse '%s'\n", d); if( (fi = rssyl_parse_folder_item_file(fname)) != NULL ) { if( feed_item_get_comments_url(fi) && feed_item_get_id(fi) && (ritem->fetch_comments_max_age == -1 || time(NULL) - feed_item_get_date_modified(fi) <= ritem->fetch_comments_max_age*86400)) { msg = g_strdup_printf(_("Updating comments for '%s'..."), feed_item_get_title(fi)); debug_print("RSSyl: updating comments for '%s' (%s)\n", feed_item_get_title(fi), feed_item_get_comments_url(fi)); STATUSBAR_PUSH(mainwin, msg); ctx = rssyl_prep_fetchctx_from_url(feed_item_get_comments_url(fi)); g_return_if_fail(ctx != NULL); feed_set_ssl_verify_peer(ctx->feed, ritem->ssl_verify_peer); rssyl_fetch_feed(ctx, FALSE); if( ctx->success && feed_n_items(ctx->feed) > 0 ) { g_free(ctx->feed->title); ctx->feed->title = g_strdup(ritem->official_title); feed_foreach_item(ctx->feed, rssyl_update_reference_func, feed_item_get_id(fi)); if( !rssyl_parse_feed(ritem, ctx->feed) ) { debug_print("RSSyl: Error processing comments feed\n"); log_error(LOG_PROTOCOL, RSSYL_LOG_ERROR_PROC, ctx->feed->url); } } } STATUSBAR_POP(mainwin); feed_item_free(fi); } g_free(fname); } } g_dir_close(dp); g_free(path); ritem->fetching_comments = FALSE; debug_print("RSSyl: rssyl_update_comments() is done\n"); }