summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Andreas Krennmair <ak@synflood.at> 2006-11-18 18:29:54 +0000
committerGravatar Andreas Krennmair <ak@synflood.at> 2006-11-18 18:29:54 +0000
commit4176358cf896b213503f613baae56218bb405db8 (patch)
treea587bf1c8bfd430f258033b1c59d5562576b6337
parent44a7a0515f13465175e8cb58603561ab9a085ab5 (diff)
downloadnewsboat-4176358cf896b213503f613baae56218bb405db8.tar.gz
newsboat-4176358cf896b213503f613baae56218bb405db8.tar.zst
newsboat-4176358cf896b213503f613baae56218bb405db8.zip
Andreas Krennmair:
implemented OPML import.
-rw-r--r--include/configreader.h3
-rw-r--r--src/cache.cpp16
-rw-r--r--src/configreader.cpp12
-rw-r--r--src/controller.cpp54
-rw-r--r--src/view.cpp6
5 files changed, 77 insertions, 14 deletions
diff --git a/include/configreader.h b/include/configreader.h
index 8462472e..6abad858 100644
--- a/include/configreader.h
+++ b/include/configreader.h
@@ -11,7 +11,8 @@ namespace noos {
configreader(const std::string& file = "");
~configreader();
void load_config(const std::string& file);
- const std::vector<std::string>& get_urls();
+ void write_config();
+ std::vector<std::string>& get_urls();
void reload();
private:
std::vector<std::string> urls;
diff --git a/src/cache.cpp b/src/cache.cpp
index af1086eb..67138ac0 100644
--- a/src/cache.cpp
+++ b/src/cache.cpp
@@ -21,14 +21,14 @@ struct cb_handler {
static int count_callback(void * handler, int argc, char ** argv, char ** azColName) {
cb_handler * cbh = (cb_handler *)handler;
- std::cerr << "inside count_callback" << std::endl;
+ // std::cerr << "inside count_callback" << std::endl;
if (argc>0) {
std::istringstream is(argv[0]);
int x;
is >> x;
cbh->set_count(x);
}
- std::cerr << "count_callback: count = " << cbh->count() << std::endl;
+ // std::cerr << "count_callback: count = " << cbh->count() << std::endl;
return 0;
}
@@ -39,7 +39,7 @@ static int rssfeed_callback(void * myfeed, int argc, char ** argv, char ** azCol
assert(argv[1] != NULL);
feed->title() = argv[0];
feed->link() = argv[1];
- std::cerr << "callback: feed->title = " << feed->title() << std::endl;
+ // std::cerr << "callback: feed->title = " << feed->title() << std::endl;
return 0;
}
@@ -146,7 +146,7 @@ void cache::externalize_rssfeed(rss_feed& feed) {
}
rc = sqlite3_exec(db,update,NULL,NULL,NULL);
assert(rc == SQLITE_OK);
- std::cerr << "item update query:" << update << " |" << std::endl;
+ // std::cerr << "item update query:" << update << " |" << std::endl;
free(update);
} else {
char * insert = sqlite3_mprintf("INSERT INTO rss_item (guid,title,author,url,feedurl,pubDate,content,unread) "
@@ -156,7 +156,7 @@ void cache::externalize_rssfeed(rss_feed& feed) {
rc = sqlite3_exec(db,insert,NULL,NULL,NULL);
assert(rc == SQLITE_OK);
free(insert);
- std::cerr << "item insert" << std::endl;
+ // std::cerr << "item insert" << std::endl;
}
}
}
@@ -166,7 +166,7 @@ void cache::internalize_rssfeed(rss_feed& feed) {
cb_handler count_cbh;
int rc = sqlite3_exec(db,query,count_callback,&count_cbh,NULL);
assert(rc == SQLITE_OK);
- std::cerr << "internalize: query = " << query << std::endl;
+ // std::cerr << "internalize: query = " << query << std::endl;
free(query);
if (count_cbh.count() == 0)
@@ -175,7 +175,7 @@ void cache::internalize_rssfeed(rss_feed& feed) {
query = sqlite3_mprintf("SELECT title, url FROM rss_feed WHERE rssurl = '%q';",feed.rssurl().c_str());
rc = sqlite3_exec(db,query,rssfeed_callback,&feed,NULL);
assert(rc == SQLITE_OK);
- std::cerr << "internalize: query = " << query << std::endl;
+ // std::cerr << "internalize: query = " << query << std::endl;
free(query);
if (feed.items().size() > 0) {
@@ -207,7 +207,7 @@ void cache::cleanup_cache(std::vector<rss_feed>& feeds) {
std::string cleanup_rss_feeds_statement = std::string("DELETE FROM rss_feed WHERE rssurl NOT IN ") + list + ";";
std::string cleanup_rss_items_statement = std::string("DELETE FROM rss_item WHERE feedurl NOT IN ") + list + ";";
- std::cerr << "statements: " << cleanup_rss_feeds_statement << " " << cleanup_rss_items_statement << std::endl;
+ // std::cerr << "statements: " << cleanup_rss_feeds_statement << " " << cleanup_rss_items_statement << std::endl;
rc = sqlite3_exec(db,cleanup_rss_feeds_statement.c_str(),NULL,NULL,NULL);
assert(rc == SQLITE_OK);
diff --git a/src/configreader.cpp b/src/configreader.cpp
index 5a5d5317..83065a3c 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -10,7 +10,7 @@ configreader::configreader(const std::string& file) : filename(file) {
configreader::~configreader() { }
-const std::vector<std::string>& configreader::get_urls() {
+std::vector<std::string>& configreader::get_urls() {
return urls;
}
@@ -31,3 +31,13 @@ void configreader::load_config(const std::string& file) {
filename = file;
reload();
}
+
+void configreader::write_config() {
+ std::fstream f;
+ f.open(filename.c_str(),std::fstream::out);
+ if (f.is_open()) {
+ for (std::vector<std::string>::iterator it=urls.begin(); it != urls.end(); ++it) {
+ f << *it << std::endl;
+ }
+ }
+}
diff --git a/src/controller.cpp b/src/controller.cpp
index a861e86b..56b8b22d 100644
--- a/src/controller.cpp
+++ b/src/controller.cpp
@@ -4,6 +4,8 @@
#include <cstdlib>
#include <iostream>
+#include <nxml.h>
+
using namespace noos;
controller::controller() : v(0), rsscache(0) {
@@ -113,7 +115,57 @@ void controller::usage(char * argv0) {
}
void controller::import_opml(char * filename) {
- std::cout << "Error: unimplemented!" << std::endl;
+ nxml_t *data;
+ nxml_data_t * root, * body, * outline;
+ nxml_error_t ret;
+
+ ret = nxml_new (&data);
+ if (ret != NXML_OK) {
+ puts (nxml_strerror (ret)); // TODO
+ return;
+ }
+
+ ret = nxml_parse_file (data, filename);
+ if (ret != NXML_OK) {
+ puts (nxml_strerror (ret)); // TODO
+ return;
+ }
+
+ nxml_root_element (data, &root);
+
+ if (root) {
+ body = nxmle_find_element(data, root, "body", NULL);
+
+ if (body) {
+ outline = nxmle_find_element(data, body, "outline", NULL);
+
+ while (outline) { // TODO: check if this is correct
+ char * url = nxmle_find_attribute(outline, "xmlUrl", NULL);
+ char * type = nxmle_find_attribute(outline, "type", NULL);
+
+ if (outline->type == NXML_TYPE_ELEMENT && strcmp(outline->value,"outline")==0 && strcmp(type,"rss")==0 && url) {
+
+ bool found = false;
+
+ for (std::vector<std::string>::iterator it = cfg.get_urls().begin(); it != cfg.get_urls().end(); ++it) {
+ if (*it == url) {
+ found = true;
+ }
+ }
+
+ if (!found) {
+ cfg.get_urls().push_back(std::string(url));
+ }
+
+ }
+
+ outline = outline->next;
+ }
+ cfg.write_config();
+ }
+ }
+ nxml_free(data);
+ std::cout << "Import of " << filename << " finished." << std::endl;
}
void controller::export_opml() {
diff --git a/src/view.cpp b/src/view.cpp
index 9e073474..2f803957 100644
--- a/src/view.cpp
+++ b/src/view.cpp
@@ -186,7 +186,7 @@ void view::run_itemlist(rss_feed& feed) {
void view::jump_to_next_unread_item(std::vector<rss_item>& items) {
const char * itemposname = stfl_get(itemlist_form, "itemposname");
- std::cerr << "jump_to_next_unread_item" << std::endl;
+ // std::cerr << "jump_to_next_unread_item" << std::endl;
if (itemposname) {
std::istringstream posname(itemposname);
@@ -197,7 +197,7 @@ void view::jump_to_next_unread_item(std::vector<rss_item>& items) {
std::ostringstream posname;
posname << i;
stfl_set(itemlist_form,"itempos",posname.str().c_str());
- std::cerr << "setting itemposname to " << posname.str().c_str() << std::endl;
+ // std::cerr << "setting itemposname to " << posname.str().c_str() << std::endl;
return;
}
}
@@ -206,7 +206,7 @@ void view::jump_to_next_unread_item(std::vector<rss_item>& items) {
std::ostringstream posname;
posname << i;
stfl_set(itemlist_form,"itempos",posname.str().c_str());
- std::cerr << "setting itemposname to " << posname.str().c_str() << std::endl;
+ // std::cerr << "setting itemposname to " << posname.str().c_str() << std::endl;
return;
}
}