X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=viewfeed.js;h=acce5310d8f714965e4deb26328229fc2dfb7d15;hb=91743a49ff54862ac5b14e6d026849705c8651df;hp=a638cbe711be28a08b6b17729402d2534762c493;hpb=37843d704231e6b43a712af4a12127ae90851310;p=tt-rss.git diff --git a/viewfeed.js b/viewfeed.js index a638cbe7..acce5310 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -2,13 +2,6 @@ var active_post_id = false; var last_article_view = false; var active_real_feed_id = false; -var _tag_active_post_id = false; -var _tag_active_feed_id = false; -var _tag_active_cdm = false; - -// FIXME: kludge, to restore scrollTop after tag editor terminates -var _tag_cdm_scroll = false; - // FIXME: kludges, needs proper implementation var _reload_feedlist_after_view = false; @@ -22,21 +15,6 @@ var post_under_pointer = false; var last_requested_article = false; -function catchup_callback() { - if (xmlhttp_rpc.readyState == 4) { - try { - debug("catchup_callback"); - notify(""); - all_counters_callback2(xmlhttp_rpc); - if (_catchup_callback_func) { - setTimeout(_catchup_callback_func, 10); - } - } catch (e) { - exception_error("catchup_callback", e); - } - } -} - function catchup_callback2(transport, callback) { try { debug("catchup_callback2 " + transport + ", " + callback); @@ -46,7 +24,7 @@ function catchup_callback2(transport, callback) { setTimeout(callback, 10); } } catch (e) { - exception_error("catchup_callback2", e); + exception_error("catchup_callback2", e, transport); } } @@ -74,6 +52,8 @@ function headlines_callback2(transport, feed_cur_page) { debug("headlines_callback2 [page=" + feed_cur_page + "]"); + if (!transport_error_check(transport)) return; + clean_feed_selections(); var is_cat = false; @@ -233,15 +213,6 @@ function headlines_callback2(transport, feed_cur_page) { debug("not in CDM mode or watchdog disabled"); } - if (_tag_cdm_scroll) { - try { - document.getElementById("headlinesInnerContainer").scrollTop = _tag_cdm_scroll; - _tag_cdm_scroll = false; - debug("resetting headlinesInner scrollTop"); - - } catch (e) { } - } - _feed_cur_page = feed_cur_page; _infscroll_request_sent = 0; @@ -250,7 +221,7 @@ function headlines_callback2(transport, feed_cur_page) { remove_splash(); } catch (e) { - exception_error("headlines_callback2", e); + exception_error("headlines_callback2", e, transport); } } @@ -306,7 +277,7 @@ function showArticleInHeadlines(id) { view_mode = document.forms['main_toolbar_form'].view_mode; view_mode = view_mode[view_mode.selectedIndex].value; } catch (e) { - exception_error("showArticleInHeadlines/viewmode", e, true); + // } if (upd_img_pic && upd_img_pic.src.match("updated.png")) { @@ -343,6 +314,8 @@ function article_callback2(transport, id, feed_id) { if (transport.responseXML) { + if (!transport_error_check(transport)) return; + debug("looking for articles to cache..."); var articles = transport.responseXML.getElementsByTagName("article"); @@ -370,6 +343,10 @@ function article_callback2(transport, id, feed_id) { showArticleInHeadlines(id); + if (db) { + db.execute("UPDATE articles SET unread = 0 WHERE id = ?", [id]); + } + var reply = transport.responseXML.firstChild.firstChild; } else { @@ -389,20 +366,22 @@ function article_callback2(transport, id, feed_id) { setTimeout('updateFeedList(false, false)', 50); _reload_feedlist_after_view = false; } else { - var counters = transport.responseXML.getElementsByTagName("counters")[0]; + if (transport.responseXML) { + var counters = transport.responseXML.getElementsByTagName("counters")[0]; - if (counters) { - debug("parsing piggybacked counters: " + counters); - parse_counters(counters, false); - } else { - debug("counters container not found in reply, requesting..."); - request_counters(); + if (counters) { + debug("parsing piggybacked counters: " + counters); + parse_counters(counters, false); + } else { + debug("counters container not found in reply, requesting..."); + request_counters(); + } } } notify(""); } catch (e) { - exception_error("article_callback2", e); + exception_error("article_callback2", e, transport); } } @@ -410,7 +389,9 @@ function view(id, feed_id, skip_history) { try { debug("loading article: " + id + "/" + feed_id); - + + if (offline_mode) return view_offline(id, feed_id); + var cached_article = cache_find(id); debug("cache check result: " + (cached_article != false)); @@ -551,6 +532,9 @@ function toggleMark(id, client_only, no_effects) { } var mark_img = document.getElementById("FMPIC-" + id); + + if (!mark_img) return; + var vfeedu = document.getElementById("FEEDU--1"); var crow = document.getElementById("RROW-" + id); @@ -559,6 +543,10 @@ function toggleMark(id, client_only, no_effects) { mark_img.alt = __("Unstar article"); query = query + "&mark=1"; + if (db) { + db.execute("UPDATE articles SET marked = 1 WHERE id = ?", [id]); + } + } else { //mark_img.src = "images/mark_unset.png"; mark_img.alt = __("Please wait..."); @@ -570,8 +558,15 @@ function toggleMark(id, client_only, no_effects) { mark_img.src = mark_img.src.replace("mark_set", "mark_unset"); mark_img.alt = __("Star article"); } + + if (db) { + db.execute("UPDATE articles SET marked = 0 WHERE id = ?", [id]); + } + } + update_local_feedlist_counters(); + if (!client_only) { debug(query); @@ -602,6 +597,9 @@ function togglePub(id, client_only, no_effects) { } var mark_img = document.getElementById("FPPIC-" + id); + + if (!mark_img) return; + var vfeedu = document.getElementById("FEEDU--2"); var crow = document.getElementById("RROW-" + id); @@ -813,6 +811,12 @@ function toggleUnread(id, cmode, effect) { } else { row.className = nc + "Unread"; } + + if (db) { + db.execute("UPDATE articles SET unread = not unread "+ + "WHERE id = ?", [id]); + } + } else if (cmode == 0) { row.className = nc; @@ -821,10 +825,24 @@ function toggleUnread(id, cmode, effect) { afterFinish: toggleUnread_afh, queue: { position:'end', scope: 'TMRQ-' + id, limit: 1 } } ); } + + if (db) { + db.execute("UPDATE articles SET unread = 0 "+ + "WHERE id = ?", [id]); + } + } else if (cmode == 1) { row.className = nc + "Unread"; + + if (db) { + db.execute("UPDATE articles SET unread = 1 "+ + "WHERE id = ?", [id]); + } + } + update_local_feedlist_counters(); + // Disable unmarking as selected for the time being (16.05.08) -fox if (is_selected) row.className = row.className + "Selected"; @@ -842,7 +860,6 @@ function toggleUnread(id, cmode, effect) { } - } catch (e) { exception_error("toggleUnread", e); } @@ -1228,15 +1245,6 @@ function catchupSelection() { } function editArticleTags(id, feed_id, cdm_enabled) { - _tag_active_post_id = id; - _tag_active_feed_id = feed_id; - _tag_active_cdm = cdm_enabled; - - cache_invalidate(id); - - try { - _tag_cdm_scroll = document.getElementById("headlinesInnerContainer").scrollTop; - } catch (e) { } displayDlg('editArticleTags', id); } @@ -1252,18 +1260,24 @@ function tag_saved_callback(transport) { _reload_feedlist_after_view = true; } - if (!_tag_active_cdm) { - if (active_post_id == _tag_active_post_id) { - debug("reloading current article"); - view(_tag_active_post_id, _tag_active_feed_id); + + if (transport.responseXML) { + var tags_str = transport.responseXML.getElementsByTagName("tags-str")[0]; + + if (tags_str) { + var id = tags_str.getAttribute("id"); + + if (id) { + var tags = document.getElementById("ATSTR-" + id); + if (tags) { + tags.innerHTML = tags_str.firstChild.nodeValue; + } + } } - } else { - debug("reloading current feed"); - viewCurrentFeed(); } } catch (e) { - exception_error("catchup_callback", e); + exception_error("tag_saved_callback", e); } } @@ -1490,65 +1504,150 @@ function cdmWatchdog() { function cache_inject(id, article, param) { - if (!cache_check_param(id, param)) { - debug("cache_article: miss: " + id + " [p=" + param + "]"); - - var cache_obj = new Array(); - - cache_obj["id"] = id; - cache_obj["data"] = article; - cache_obj["param"] = param; + try { + if (!cache_check_param(id, param)) { + debug("cache_article: miss: " + id + " [p=" + param + "]"); + + + if (db) { - article_cache.push(cache_obj); + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); - } else { - debug("cache_article: hit: " + id + " [p=" + param + "]"); + db.execute("INSERT INTO cache (id, article, param, added) VALUES (?, ?, ?, ?)", + [id, article, param, ts]); + } else { + + var cache_obj = new Array(); + + cache_obj["id"] = id; + cache_obj["data"] = article; + cache_obj["param"] = param; + + article_cache.push(cache_obj); + } + + } else { + debug("cache_article: hit: " + id + " [p=" + param + "]"); + } + } catch (e) { + exception_error("cache_inject", e); } } function cache_find(id) { - for (var i = 0; i < article_cache.length; i++) { - if (article_cache[i]["id"] == id) { - return article_cache[i]["data"]; + + if (db) { + var rs = db.execute("SELECT article FROM cache WHERE id = ?", [id]); + var a = false; + + if (rs.isValidRow()) { + var a = rs.field(0); + } + + rs.close(); + + return a; + + } else { + for (var i = 0; i < article_cache.length; i++) { + if (article_cache[i]["id"] == id) { + return article_cache[i]["data"]; + } } } return false; } function cache_find_param(id, param) { - for (var i = 0; i < article_cache.length; i++) { - if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) { - return article_cache[i]["data"]; + + if (db) { + var rs = db.execute("SELECT article FROM cache WHERE id = ? AND param = ?", + [id, param]); + var a = false; + + if (rs.isValidRow()) { + a = rs.field(0); + } + + rs.close(); + + return a; + + } else { + for (var i = 0; i < article_cache.length; i++) { + if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) { + return article_cache[i]["data"]; + } } } return false; } function cache_check(id) { - for (var i = 0; i < article_cache.length; i++) { - if (article_cache[i]["id"] == id) { - return true; + + if (db) { + var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ?", + [id]); + var a = false; + + if (rs.isValidRow()) { + a = rs.field(0) != "0"; + } + + rs.close(); + + return a; + + } else { + for (var i = 0; i < article_cache.length; i++) { + if (article_cache[i]["id"] == id) { + return true; + } } } return false; } function cache_check_param(id, param) { - for (var i = 0; i < article_cache.length; i++) { -// debug("cache_check_param " + article_cache[i]["id"] + ":" + -// article_cache[i]["param"] + " vs " + id + ":" + param); + if (db) { + var rs = db.execute("SELECT COUNT(*) AS c FROM cache WHERE id = ? AND param = ?", + [id, param]); + var a = false; - if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) { - return true; + if (rs.isValidRow()) { + a = rs.field(0) != "0"; + } + + rs.close(); + + return a; + + } else { + for (var i = 0; i < article_cache.length; i++) { + if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) { + return true; + } } } return false; } function cache_expire() { - while (article_cache.length > 25) { - article_cache.shift(); + if (db) { + var date = new Date(); + var ts = Math.round(date.getTime() / 1000); + + db.execute("DELETE FROM cache WHERE added < ? - 1800 AND id LIKE 'FEEDLIST'", [ts]); + db.execute("DELETE FROM cache WHERE added < ? - 600 AND (id LIKE 'F:%' OR id LIKE 'C:%')", [ts]); + db.execute("DELETE FROM cache WHERE added < ? - 86400", [ts]); + + + } else { + while (article_cache.length > 25) { + article_cache.shift(); + } } } @@ -1557,18 +1656,25 @@ function cache_empty() { } function cache_invalidate(id) { - var i = 0 - try { - while (i < article_cache.length) { - if (article_cache[i]["id"] == id) { - debug("cache_invalidate: removed id " + id); - article_cache.splice(i, 1); - return true; + if (db) { + rs = db.execute("DELETE FROM cache WHERE id = ?", [id]); + return rs.rowsAffected != 0; + } else { + + var i = 0 + + while (i < article_cache.length) { + if (article_cache[i]["id"] == id) { + debug("cache_invalidate: removed id " + id); + article_cache.splice(i, 1); + return true; + } + i++; } - i++; } + debug("cache_invalidate: id not found: " + id); return false; } catch (e) { @@ -1588,9 +1694,9 @@ function cdmClicked(id) { var id = elem.id.replace("RROW-", ""); active_post_id = id; - cdmSelectArticles("none"); +// cdmSelectArticles("none"); toggleUnread(id, 0, true); - toggleSelected(id); +// toggleSelected(id); } } catch (e) { @@ -1705,10 +1811,7 @@ function catchupRelativeToArticle(below) { try { - if (!xmlhttp_ready(xmlhttp_rpc)) { - printLockingError(); - } - + if (!getActiveArticleId()) { alert(__("No article is selected.")); return;