From 563b9c782d0cfbcebd7686cd2fce202d874ec9df Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 25 Nov 2010 13:20:37 +0300 Subject: [PATCH] remove xml from getAllCounters rpc call, use pure JSON --- feedlist.js | 8 ++--- modules/backend-rpc.php | 20 +++++------ tt-rss.js | 78 ++++++++++++++++++++++++++++++++++------- viewfeed.js | 4 --- 4 files changed, 78 insertions(+), 32 deletions(-) diff --git a/feedlist.js b/feedlist.js index e47567a8..b475b9c5 100644 --- a/feedlist.js +++ b/feedlist.js @@ -232,7 +232,7 @@ function request_counters_real() { parameters: query, onComplete: function(transport) { try { - handle_rpc_reply(transport); + handle_rpc_json(transport); } catch (e) { exception_error("viewfeed/getcounters", e); } @@ -286,13 +286,11 @@ function displayNewContentPrompt(id) { } } -function parse_counters(reply, scheduled_call) { +function parse_counters(elems, scheduled_call) { try { var feeds_found = 0; - var elems = JSON.parse(reply.firstChild.nodeValue); - for (var l = 0; l < elems.length; l++) { var id = elems[l].id @@ -302,7 +300,7 @@ function parse_counters(reply, scheduled_call) { var has_img = elems[l].has_img; var updated = elems[l].updated; var title = elems[l].title; - + if (id == "global-unread") { global_unread = ctr; updateTitle(); diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php index e9357120..93d8f074 100644 --- a/modules/backend-rpc.php +++ b/modules/backend-rpc.php @@ -282,29 +282,27 @@ if ($subop == "updateAllFeeds" || $subop == "getAllCounters") { + header("Content-Type: text/plain"); + $last_article_id = (int) $_REQUEST["last_article_id"]; - print ""; + $reply = array(); - if ($seq) - print "$seq"; + if ($seq) $reply['seq'] = $seq; if ($last_article_id != getLastArticleId($link)) { - print ""; + $reply['counters'] = getGlobalCounters($link); } - print_runtime_info($link); + $reply['runtime-info'] = make_runtime_info($link); - print ""; + print json_encode($reply); return; } @@ -983,7 +981,7 @@ } if ($subop == "getTweetInfo") { - header("Content-Type: text/html"); + header("Content-Type: text/plain"); $id = db_escape_string($_REQUEST['id']); $result = db_query($link, "SELECT title, link diff --git a/tt-rss.js b/tt-rss.js index ccb24eca..6d799437 100644 --- a/tt-rss.js +++ b/tt-rss.js @@ -207,7 +207,7 @@ function timeout() { new Ajax.Request("backend.php", { parameters: query_str, onComplete: function(transport) { - handle_rpc_reply(transport, !_force_scheduled_update); + handle_rpc_json(transport, !_force_scheduled_update); _force_scheduled_update = false; } }); @@ -472,21 +472,14 @@ function toggleDispRead() { } } -function parse_runtime_info(elem) { - - if (!elem || !elem.firstChild) { - console.warn("parse_runtime_info: invalid node passed"); - return; - } - - var data = JSON.parse(elem.firstChild.nodeValue); +function parse_runtime_info(data) { //console.log("parsing runtime info..."); for (k in data) { var v = data[k]; - // console.log("RI: " + k + " => " + v); +// console.log("RI: " + k + " => " + v); if (k == "new_version_available") { var icon = $("newVersionIcon"); @@ -1044,12 +1037,12 @@ function handle_rpc_reply(transport, scheduled_call) { var counters = transport.responseXML.getElementsByTagName("counters")[0]; if (counters) - parse_counters(counters, scheduled_call); + parse_counters(JSON.parse(counters.firstChild.nodeValue), scheduled_call); var runtime_info = transport.responseXML.getElementsByTagName("runtime-info")[0]; if (runtime_info) - parse_runtime_info(runtime_info); + parse_runtime_info(JSON.parse(runtime_info.firstChild.nodeValue)); hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); @@ -1125,3 +1118,64 @@ function newVersionDlg() { exception_error("newVersionDlg", e); } } + +function handle_rpc_json(transport, scheduled_call) { + try { + var reply = JSON.parse(transport.responseText); + + if (reply) { + + var error = reply['error']; + + if (error) { + var code = error['code']; + var msg = error['msg']; + if (code != 0) { + fatalError(code, msg); + return false; + } + } + + var seq = reply['seq']; + + if (seq) { + if (get_seq() != seq) { + console.log("[handle_rpc_json] sequence mismatch: " + seq + + " (want: " + get_seq() + ")"); + return true; + } + } + + var message = reply['message']; + + if (message) { + if (message == "UPDATE_COUNTERS") { + console.log("need to refresh counters..."); + setInitParam("last_article_id", -1); + _force_scheduled_update = true; + } + } + + var counters = reply['counters']; + + if (counters) + parse_counters(counters, scheduled_call); + + var runtime_info = reply['runtime-info'];; + + if (runtime_info) + parse_runtime_info(runtime_info); + + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + + } else { + notify_error("Error communicating with server."); + } + + } catch (e) { + exception_error("handle_rpc_json", e, transport); + } + + return true; +} + diff --git a/viewfeed.js b/viewfeed.js index 4344398e..8d0ab28a 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -172,10 +172,6 @@ function headlines_callback2(transport, feed_cur_page) { else request_counters(); - if (runtime_info) { - parse_runtime_info(runtime_info[0]); - } - } else { console.warn("headlines_callback: returned no XML object"); dijit.byId("headlines-frame").attr('content', "
" + -- 2.39.5