subscriptionPtr subscription_import (xmlNodePtr xml, gboolean trusted) { subscriptionPtr subscription; xmlChar *source, *homepage, *filter, *intervalStr, *tmp; subscription = subscription_new (NULL, NULL, NULL); source = xmlGetProp (xml, BAD_CAST "xmlUrl"); if (!source) source = xmlGetProp (xml, BAD_CAST "xmlurl"); /* e.g. for AmphetaDesk */ if (source) { if (!trusted && source[0] == '|') { /* FIXME: Display warning dialog asking if the command is safe? */ tmp = g_strdup_printf ("unsafe command: %s", source); xmlFree (source); source = tmp; } subscription_set_source (subscription, source); xmlFree (source); homepage = xmlGetProp (xml, BAD_CAST "htmlUrl"); if (homepage && xmlStrcmp (homepage, "")) subscription_set_homepage (subscription, homepage); xmlFree (homepage); if ((filter = xmlGetProp (xml, BAD_CAST "filtercmd"))) { if (!trusted) { /* FIXME: Display warning dialog asking if the command is safe? */ tmp = g_strdup_printf ("unsafe command: %s", filter); xmlFree (filter); filter = tmp; } subscription_set_filter (subscription, filter); xmlFree (filter); } intervalStr = xmlGetProp (xml, BAD_CAST "updateInterval"); subscription_set_update_interval (subscription, common_parse_long (intervalStr, -1)); xmlFree (intervalStr); /* no proxy flag */ tmp = xmlGetProp (xml, BAD_CAST "dontUseProxy"); if (tmp && !xmlStrcmp (tmp, BAD_CAST "true")) subscription->updateOptions->dontUseProxy = TRUE; xmlFree (tmp); /* authentication options */ subscription->updateOptions->username = xmlGetProp (xml, BAD_CAST "username"); subscription->updateOptions->password = xmlGetProp (xml, BAD_CAST "password"); } return subscription; }
subscriptionPtr subscription_new (const gchar *source, const gchar *filter, updateOptionsPtr options) { subscriptionPtr subscription; subscription = g_new0 (struct subscription, 1); subscription->type = feed_get_subscription_type (); subscription->updateOptions = options; if (!subscription->updateOptions) subscription->updateOptions = g_new0 (struct updateOptions, 1); subscription->updateState = g_new0 (struct updateState, 1); subscription->updateInterval = -1; subscription->defaultInterval = -1; if (source) { gboolean feedPrefix = FALSE; gchar *uri = g_strdup (source); g_strstrip (uri); /* strip confusing whitespaces */ /* strip feed protocol prefix variant 1 */ if (uri == strstr (uri, FEED_PROTOCOL_PREFIX)) { gchar *tmp = uri; uri = g_strdup (uri + strlen (FEED_PROTOCOL_PREFIX)); g_free (tmp); feedPrefix = TRUE; } /* strip feed protocol prefix variant 2 */ if (uri == strstr (uri, FEED_PROTOCOL_PREFIX2)) { gchar *tmp = uri; uri = g_strdup (uri + strlen (FEED_PROTOCOL_PREFIX2)); g_free (tmp); feedPrefix = TRUE; } /* ensure protocol prefix (but only for feed:[//] URIs to avoid breaking local file and command line subscriptions) */ if (feedPrefix && !strstr (uri, "://")) { gchar *tmp = uri; uri = g_strdup_printf ("http://%s", uri); g_free (tmp); } subscription_set_source (subscription, uri); g_free (uri); } if (filter) subscription_set_filter (subscription, filter); return subscription; }
static void on_propdialog_response (GtkDialog *dialog, gint response_id, gpointer user_data) { SubscriptionPropDialog *spd = (SubscriptionPropDialog *)user_data; if(response_id == GTK_RESPONSE_OK) { gchar *newSource; const gchar *newFilter; gboolean needsUpdate = FALSE; subscriptionPtr subscription = spd->priv->subscription; nodePtr node = spd->priv->subscription->node; feedPtr feed = (feedPtr)node->data; if (SUBSCRIPTION_TYPE(subscription) == feed_get_subscription_type ()) { /* "General" */ node_set_title(node, gtk_entry_get_text(GTK_ENTRY(spd->priv->feedNameEntry))); /* Source */ newSource = ui_subscription_dialog_decode_source(spd->priv); /* Filter handling */ newFilter = gtk_entry_get_text(GTK_ENTRY(liferea_dialog_lookup(spd->priv->dialog, "filterEntry"))); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(liferea_dialog_lookup(spd->priv->dialog, "filterCheckbox"))) && strcmp(newFilter,"")) { /* Maybe this should be a test to see if the file exists? */ if(subscription_get_filter(subscription) == NULL || strcmp(newFilter, subscription_get_filter(subscription))) { subscription_set_filter(subscription, newFilter); needsUpdate = TRUE; } } else { if(subscription_get_filter(subscription)) { subscription_set_filter(subscription, NULL); needsUpdate = TRUE; } } /* if URL has changed... */ if(strcmp(newSource, subscription_get_source(subscription))) { subscription_set_source(subscription, newSource); needsUpdate = TRUE; } g_free(newSource); /* Update interval handling */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "updateIntervalNever")))) subscription_set_update_interval (subscription, -2); else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "updateIntervalDefault")))) subscription_set_update_interval (subscription, -1); else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "updateIntervalSpecific")))) { gint intervalUnit = gtk_combo_box_get_active (GTK_COMBO_BOX (spd->priv->refreshIntervalUnit)); gint updateInterval = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spd->priv->refreshInterval)); if (intervalUnit == 1) updateInterval *= 60; /* hours */ if (intervalUnit == 2) updateInterval *= 1440; /* days */ subscription_set_update_interval (subscription, updateInterval); db_subscription_update (subscription); } } /* "Archive" handling */ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(liferea_dialog_lookup(GTK_WIDGET(dialog), "feedCacheDefault")))) feed->cacheLimit = CACHE_DEFAULT; else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(liferea_dialog_lookup(GTK_WIDGET(dialog), "feedCacheDisable")))) feed->cacheLimit = CACHE_DISABLE; else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(liferea_dialog_lookup(GTK_WIDGET(dialog), "feedCacheUnlimited")))) feed->cacheLimit = CACHE_UNLIMITED; else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(liferea_dialog_lookup(GTK_WIDGET(dialog), "feedCacheLimited")))) feed->cacheLimit = gtk_spin_button_get_value(GTK_SPIN_BUTTON(liferea_dialog_lookup(GTK_WIDGET(dialog), "cacheItemLimit"))); if (SUBSCRIPTION_TYPE(subscription) == feed_get_subscription_type ()) { /* "Download" Options */ subscription->updateOptions->dontUseProxy = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(liferea_dialog_lookup(GTK_WIDGET(dialog), "dontUseProxyCheck"))); } /* "Advanced" options */ feed->encAutoDownload = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "enclosureDownloadCheck"))); node->loadItemLink = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "loadItemLinkCheck"))); feed->ignoreComments = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "ignoreCommentFeeds"))); feed->enforcePopup = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "enforcePopupCheck"))); feed->preventPopup = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "preventPopupCheck"))); feed->markAsRead = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (GTK_WIDGET (dialog), "markAsReadCheck"))); if (feed->enforcePopup && feed->preventPopup) feed->enforcePopup = FALSE; ui_node_update (node->id); feedlist_schedule_save (); db_subscription_update (subscription); if (needsUpdate) subscription_update (subscription, FEED_REQ_PRIORITY_HIGH); } g_object_unref(spd); }