class EtherpadIO(object):
    def __init__(self, pad, cb,
                       host='localhost', path='p/', port='9001', secure=False,
                       verbose = False,
                       transports=['xhr-polling', 'websocket'],
                       **kwarg):
        log.debug('EtherpadIO(%s://%s:%s/%s%s")' % ('https' if secure else 'http', host,
                                                  port, path, pad))
        res = requests.get("%s://%s:%s/%s%s" % ('https' if secure else 'http',
                                                  host, port, path, pad))

        cookie = res.headers['set-cookie']
        self.cookie = dict([(cookie[:cookie.find("=")], cookie[cookie.find("=")+1:])])

        self.pad = pad
        self.cb = cb
        self.host = host
        self.path = path
        self.port = port
        self.secure = secure
        self.kwarg = kwarg
        self.transports = transports
        self.__init()

    def __init(self):
        self.epad = SocketIO(self.host, self.port,
                        EtherpadService,
                        secure=self.secure,
                        transports=self.transports,
                        cookies=self.cookie,
                        padid=self.pad,
                        cb=self.cb, **self.kwarg)

    def wait(self):
        reconnect = True
        while reconnect:
            reconnect = self.epad.wait()
            del self.epad
            if reconnect:
                self.__init()

    def has_ended(self):
        return self.epad.has_ended()

    def stop(self):
        self.epad.disconnect()

    def pause(self):
        self.epad.pause()

    def patch_text(self, old, new):
        cs = pack(old.diff(new))
        if cs:
            self.epad.namespace.send_user_changes(old.get_revision(), old.get_apool(), cs)