"""
	SleekXMPP: The Sleek XMPP Library
	XEP-0199 (Ping) support
	Copyright (C) 2007  Kevin Smith
	This file is part of SleekXMPP.

	SleekXMPP is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	SleekXMPP is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with SleekXMPP; if not, write to the Free Software
	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
"""
from xml.etree import cElementTree as ET
from . import base
import time
import logging

class xep_0199(base.base_plugin):
	"""XEP-0199 XMPP Ping"""

	def plugin_init(self):
		self.description = "XMPP Ping"
		self.xep = "0199"
		self.xmpp.add_handler("<iq type='get' xmlns='%s'><ping xmlns='http://www.xmpp.org/extensions/xep-0199.html#ns'/></iq>" % self.xmpp.default_ns, self.handler_ping)
		self.running = False
		#if self.config.get('keepalive', True):
			#self.xmpp.add_event_handler('session_start', self.handler_pingserver, threaded=True)
	
	def post_init(self):
		self.xmpp['xep_0030'].add_feature('http://www.xmpp.org/extensions/xep-0199.html#ns')
	
	def handler_pingserver(self, xml):
		if not self.running:
			time.sleep(self.config.get('frequency', 300))
			while self.sendPing(self.xmpp.server, self.config.get('timeout', 30)) is not False:
				time.sleep(self.config.get('frequency', 300))
			logging.debug("Did not recieve ping back in time.  Requesting Reconnect.")
			self.xmpp.disconnect(reconnect=True)
	
	def handler_ping(self, xml):
		iq = self.xmpp.makeIqResult(xml.get('id', 'unknown'))
		iq.attrib['to'] = xml.get('from', self.xmpp.server)
		self.xmpp.send(iq)

	def sendPing(self, jid, timeout = 30):
		""" sendPing(jid, timeout)
		Sends a ping to the specified jid, returning the time (in seconds)
		to receive a reply, or None if no reply is received in timeout seconds.
		"""
		id = self.xmpp.getNewId()
		iq = self.xmpp.makeIq(id)
		iq.attrib['type'] = 'get'
		iq.attrib['to'] = jid
		ping = ET.Element('{http://www.xmpp.org/extensions/xep-0199.html#ns}ping')
		iq.append(ping)
		startTime = time.clock()
		pingresult = self.xmpp.send(iq, self.xmpp.makeIq(id), timeout)
		endTime = time.clock()
		if pingresult == False:
			#self.xmpp.disconnect(reconnect=True)
			return False
		return endTime - startTime