changeset 2743:1fa9620220e3

merge commit
author tmolitor <thilo@eightysoft.de>
date Thu, 17 Aug 2017 21:34:56 +0200 (2017-08-17)
parents 57d4680b86a4 (current diff) 2e30bb3a10d5 (diff)
children f70c02c14161
files
diffstat 2 files changed, 34 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/mod_csi_battery_saver/README.markdown	Thu Aug 17 14:49:52 2017 +0200
+++ b/mod_csi_battery_saver/README.markdown	Thu Aug 17 21:34:56 2017 +0200
@@ -4,23 +4,25 @@
 - 'Stage-Alpha'
 ---
 
+Please use this module instead of [mod_csi_pump] if you want timestamping,
+properly handled carbon copies, support for handling encrypted messages and
+correctly handled smacks events.
+
 Stanzas are queued in a buffer until either an "important" stanza is
 encountered or the buffer becomes full. Then all queued stanzas are sent
 at the same time. This way, nothing is lost or reordered while still
 allowing for power usage savings by not requiring mobile clients to
 bring up their radio for unimportant stanzas.
 
-`IQ` stanzas, smacks "stanzas" and `message` stanzas containing a body are
-considered important. Groupchat messages must set a subject or have
-the user's username or nickname in their messages to count as "important".
-`Presence` stanzas are not "important".
+`IQ` stanzas, and `message` stanzas containing a body or being encypted
+and all nonzas are considered important. Groupchat messages must set a
+subject or have the user's username or nickname in their messages to count
+as "important". `Presence` stanzas are always not "important".
 
 All buffered stanzas that allow timestamping are properly stamped to
 reflect their original send time, see [XEP-0203].
 
 Use with other CSI plugins such as [mod_throttle_presence],
 [mod_filter_chatstates] or [mod_csi_pump] is *not* supported.
-Please use this module instead of [mod_csi_pump] if you want timestamping
-and properly handled carbon copies.
 
 The internal stanza buffer of this module is hardcoded to 100 stanzas.
--- a/mod_csi_battery_saver/mod_csi_battery_saver.lua	Thu Aug 17 14:49:52 2017 +0200
+++ b/mod_csi_battery_saver/mod_csi_battery_saver.lua	Thu Aug 17 21:34:56 2017 +0200
@@ -9,7 +9,7 @@
 local jid = require "util.jid";
 local new_queue = require "util.queue".new;
 local datetime = require "util.datetime";
-local clone = require "util.stanza".clone;
+local st = require "util.stanza";
 
 local xmlns_delay = "urn:xmpp:delay";
 
@@ -57,7 +57,7 @@
 	end
 	local push = q.push;
 	function q:push(item)
-		local ok = push(self, clone(item));
+		local ok = push(self, item);
 		if not ok then
 			q:flush();
 			output(item, self);
@@ -95,7 +95,7 @@
 
 local function is_important(stanza, session)
 	local st_name = stanza and stanza.name or nil;
-	if not st_name then return false; end
+	if not st_name then return true; end	-- nonzas are always important
 	if st_name == "presence" then
 		-- TODO check for MUC status codes?
 		return false;
@@ -148,6 +148,7 @@
 module:hook("csi-client-inactive", function (event)
 	local session = event.origin;
 	if session.pump then
+		session.log("debug", "mod_csi_battery_saver(%s): Client is inactive, buffering unimportant stanzas", id);
 		session.pump:pause();
 	else
 		session.log("debug", "mod_csi_battery_saver(%s): Client is inactive the first time, initializing module for this session", id);
@@ -156,19 +157,21 @@
 		session.pump = pump;
 		session._pump_orig_send = session.send;
 		function session.send(stanza)
-			session.log("debug", "mod_csi_battery_saver(%s): Got stanza: <%s>", id, tostring(stanza.name));
+			session.log("debug", "mod_csi_battery_saver(%s): Got stanza: <%s>", id, tostring(stanza.name or stanza));
 			local important = is_important(stanza, session);
+			-- clone stanzas before adding delay stamp and putting them into the queue
+			if st.is_stanza(stanza) then stanza = st.clone(stanza); end
 			-- add delay stamp to unimportant (buffered) stanzas that can/need be stamped
 			if not important and is_stamp_needed(stanza, session) then stanza = add_stamp(stanza, session); end
+			-- add stanza to outgoing queue and flush the buffer if needed
 			pump:push(stanza);
 			if important then
-				session.log("debug", "mod_csi_battery_saver(%s): Encountered important stanza, flushing buffer: <%s>", id, tostring(stanza.name));
+				session.log("debug", "mod_csi_battery_saver(%s): Encountered important stanza, flushing buffer: <%s>", id, tostring(stanza.name or stanza));
 				pump:flush();
 			end
 			return true;
 		end
 	end
-	session.log("debug", "mod_csi_battery_saver(%s): Client is inactive, buffering unimportant stanzas", id);
 end);
 
 module:hook("csi-client-active", function (event)
@@ -179,17 +182,28 @@
 	end
 end);
 
+-- clean up this session
+local function remove_pump(session)
+	if session.pump then
+		session.log("debug", "mod_csi_battery_saver(%s): Flushing buffer and restoring to original session.send()", id);
+		session.pump:flush();
+		session.send = session._pump_orig_send;
+		session.pump = nil;
+		session._pump_orig_send = nil;
+	end
+end
+
+-- clean up this session on hibernation start
+module:hook("smacks-hibernation-start", function (event)
+	remove_pump(event.origin);
+end);
+
 function module.unload()
 	module:log("info", "%s: Unloading module, flushing all buffers", id);
 	local host_sessions = prosody.hosts[module.host].sessions;
 	for _, user in pairs(host_sessions) do
 		for _, session in pairs(user.sessions) do
-			if session.pump then
-				session.pump:flush();
-				session.send = session._pump_orig_send;
-				session.pump = nil;
-				session._pump_orig_send = nil;
-			end
+			remove_pump(session);
 		end
 	end
 end