# -*- coding: utf-8 -*- # # Copyright 2010 Maurizio Porrato # See LICENSE.txt for copyright info from zope.interface import implements from twisted.internet.defer import Deferred, succeed from frn.manager import IManager from twisted.python import log from frn.protocol.manager import FRNManagerClient, FRNManagerClientFactory class CustomManagerClientFactory(FRNManagerClientFactory): def __init__(self, user, onConnect, onDisconnect): self.user = user self.onConnect = onConnect self.onDisconnect = onDisconnect self.authResult = False self.client = None self.managerReady = Deferred() self.client = None def clientConnectionFailed(self, connector, reason): self.authResult = False self.client = None self.managerReady = Deferred() self.onDisconnect(self.protocol) FRNManagerClientFactory.clientConnectionFailed( self, connector, reason) self.managerConnection.addCallback(self.connectionReady) def clientConnectionLost(self, connector, reason): self.authResult = False self.client = None self.managerReady = Deferred() self.onDisconnect(self.protocol) FRNManagerClientFactory.clientConnectionLost( self, connector, reason) self.managerConnection.addCallback(self.connectionReady) def connectionReady(self, client): def authDone(res): log.msg("Auth: %s" % str(res)) if res['al'] == '0': self.authResult = res self.onConnect(client) self.managerReady.callback(res) else: client.transport.loseConnection() return res self.client = client self.client.sendServerLogin(self.user).addCallback(authDone) class RemoteManager(object): implements(IManager) def __init__(self, reactor, server='frn.no-ip.info', port=10025): self.reactor = reactor self.server = server self.port = port self.factory = None def onManagerConnect(self, protocol): pass def onManagerDisconnect(self, protocol): pass def doConnect(self): self.reactor.connectTCP(self.server, self.port, self.factory) self.factory.managerConnection.addCallback(self.factory.connectionReady) return self.factory.managerReady def serverLogin(self, user): self.factory = CustomManagerClientFactory( user, self.onManagerConnect, self.onManagerDisconnect) return self.doConnect() def serverLogout(self, user): if self.factory.client is not None: return self.factory.client.sendServerLogout(user) def clientLogin(self, user): return self.factory.client.sendClientLogin(user) def clientLogout(self, user): return self.factory.client.sendClientLogout(user) def getClientList(self): return self.factory.client.getClientList() def registerUser(self, user): return self.factory.client.registerUser(user) # vim: set et ai sw=4 ts=4 sts=4: