#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# hylaPEx, an hylafax client written in python
#
# www.unipex.it/hylapex/
#
# License:
# GNU General Public License (GPL)
# For more info see LICENSE.txt and LICENSE-GPL.txt
#
# Copyright (C) 2004-2006 Unipex s.r.l., All Rights Reserved.
# Via Vittorio Veneto 83/A
# 33050 Gonars (UD) - Italy
# phone 0039 0432 931511 - fax 0039 0432 931378
# www.unipex.it - michele.petrazzo@unipex.it
# Twisted Imports
from twisted.protocols.ftp import FTPClientBasic,FTPClient,FTPCommand
class My_FTPClientBasic(FTPClientBasic):
def queueLogin(self, username, password, userDeferredAfter=None):
# Prepare the USER command
deferreds = []
userDeferred = self.queueStringCommand('USER ' + username, public=0)
deferreds.append(userDeferred)
# Prepare the PASS command (if a password is given)
if password is not None:
passwordCmd = FTPCommand('PASS ' + password, public=0)
self.queueCommand(passwordCmd)
deferreds.append(passwordCmd.deferred)
# Avoid sending PASS if the response to USER is 230.
# (ref: http://cr.yp.to/ftp/user.html#user)
def cancelPasswordIfNotNeeded(response):
if response[0].startswith('230'):
# No password needed!
self.actionQueue.remove(passwordCmd)
if userDeferredAfter:
userDeferred.addCallback(userDeferredAfter)
return response
userDeferred.addCallback(cancelPasswordIfNotNeeded)
if userDeferredAfter:
passwordCmd.deferred.addCallback(userDeferredAfter)
elif userDeferredAfter:
userDeferred.addCallback(userDeferredAfter)
# Error handling.
for deferred in deferreds:
# If something goes wrong, call fail
deferred.addErrback(self.fail)
# But also swallow the error, so we don't cause spurious errors
deferred.addErrback(lambda x: None)
class My_FTPClient(My_FTPClientBasic, FTPClient):
def __init__(self, username='anonymous',
password='twisted@twistedmatrix.com',
passive=1,
userDeferred=None):
self.__userDeferred = userDeferred
My_FTPClientBasic.__init__(self)
FTPClient.__init__(self, username, password, passive)
def queueLogin(self, username, password):
"""Login: send the username, send the password, and
set retrieval mode to binary
"""
My_FTPClientBasic.queueLogin(self, username, password, self.__userDeferred)
d = self.queueStringCommand('TYPE I', public=0)
d.addErrback(self.fail)
d.addErrback(lambda x: None)
def storeFileT(self):
""" Change the STOR to STOT command, so hylafax create an unique
and temporany name for the file
"""
pasvCmd = FTPCommand('FORM TIFF')
self.queueCommand(pasvCmd)
cmds = ['STOT']
return self.sendToConnection(cmds)
class FClient(My_FTPClient):
def __init__(self, *args, **kw):
self.__failCallBack = kw.pop("fail", None)
My_FTPClient.__init__(self, *args, **kw)
def fail(self, *args, **kw):
My_FTPClient.fail(self, *args, **kw)
if callable(self.__failCallBack):
self.__failCallBack(*args, **kw)
def queueStringCommand(self, cmd, *args, **kw):
return My_FTPClient.queueStringCommand(self, str(cmd), *args, **kw )
|