diff options
-rw-r--r-- | include/configreader.h | 3 | ||||
-rw-r--r-- | src/cache.cpp | 16 | ||||
-rw-r--r-- | src/configreader.cpp | 12 | ||||
-rw-r--r-- | src/controller.cpp | 54 | ||||
-rw-r--r-- | src/view.cpp | 6 |
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; } } |