import asyncore, socket
import logging
import sys

class IOChannel(asyncore.dispatcher):
	def __init__(self, host, port, callback, closeCallback):
		asyncore.dispatcher.__init__(self)

		self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
		self.connect((host, port))
		self.logger = logging.getLogger(self.__class__.__name__)

		self.callback = callback
		self.closeCallback = closeCallback
		self.buffer = ""

	def sendData(self, data):
		self.buffer += data

	def handle_connect(self):
		pass

	def handle_close(self):
		self.close()

	def handle_read(self):
		data = self.recv(65536)
		self.callback(data)

	def handle_write(self):
		sent = self.send(self.buffer)
		self.buffer = self.buffer[sent:]

	def handle_close(self):
		self.logger.info('Connection to backend closed, terminating.')
		self.close()
		self.closeCallback()

	def writable(self):
		return (len(self.buffer) > 0)

	def readable(self):
		return True