refactoring: using xml params part IV (default values)

- File Transfert/IP is now set by default to the ip externally visible
This commit is contained in:
Goffi 2009-11-08 00:11:00 +01:00
commit b772500c91
2 changed files with 40 additions and 8 deletions

View file

@ -59,8 +59,9 @@ from logging import debug, info, error
from twisted.internet import protocol, reactor
from twisted.protocols.basic import FileSender
from twisted.words.xish import domish
from twisted.web.client import getPage
import struct
from binascii import hexlify
import urllib
import hashlib, pdb
from zope.interface import implements
@ -454,12 +455,12 @@ class XEP_0065(XMPPHandler):
params = """
<params>
<category name="File Transfert">
<param name="IP" value="192.168.0.10" type="string" />
<param name="IP" value='0.0.0.0' default_cb='yes' type="string" />
<param name="Port" value="28915" type="string" />
</category>
</params>
"""
def __init__(self, host):
info("Plugin XEP_0065 initialization")
self.host = host
@ -467,11 +468,16 @@ class XEP_0065(XMPPHandler):
self.server_factory = Socks5ServerFactory()
self.server_factory.protocol.host = self.host #needed for progress CB
self.client_factory = Socks5ClientFactory()
host.memory.import_params(self, XEP_0065.params)
host.memory.importParams(self, XEP_0065.params)
host.memory.setDefault("IP", "File Transfert", self.getExternalIP)
port = int(self.host.memory.getParamV("Port", "File Transfert"))
info("Launching Socks5 Stream server on port %d", port)
reactor.listenTCP(port, self.server_factory)
def getExternalIP(self):
"""Return IP visible from outside, by asking to a website"""
return getPage("http://www.goffi.org/sat_tools/get_ip.php")
def connectionInitialized(self):
self.xmlstream.addObserver(BS_REQUEST, self.getFile)

View file

@ -27,6 +27,7 @@ import pickle
from xml.dom import minidom
from logging import debug, info, error
import pdb
from twisted.internet import defer
const_SAVEFILE_PARAM=os.path.expanduser("~/.sat_param.save")
const_SAVEFILE_HISTORY=os.path.expanduser("~/.sat_history.save")
@ -70,11 +71,10 @@ class Param():
#the node is new
return None
def import_params(self, parent, xml):
def importParams(self, parent, xml):
"""import xml in parameters, do nothing if the param already exist
@param parent: parent class (usefull for callbacks)
@param xml: parameters in xml form"""
src_dom = minidom.parseString(xml)
def import_node(tgt_parent, src_parent):
@ -90,6 +90,29 @@ class Param():
import_node(self.dom.documentElement, src_dom.documentElement)
def __default_ok(self, value, name, category):
self.setParam(name, value, category)
def __default_ko(self, failure, name, category):
error ("Can't determine default value for [%s/%s]: %s" % (category, name, str(failure.value)))
def setDefault(self, name, category, callback, errback=None):
"""Set default value of parameter
'default_cb' attibute of parameter must be set to 'yes'
@param name: name of the parameter
@param category: category of the parameter
@param callback: must return a string with the value (use deferred if needed)
@param errback: must manage the error with args failure, name, category
"""
node = self.__getParamNode(name, category)
if not node:
error("Requested param [%s] in category [%s] doesn't exist !" , name, category)
return
if node.getAttribute('default_cb') == 'yes':
del node.attributes['default_cb']
d = defer.maybeDeferred(callback)
d.addCallback(self.__default_ok, name, category)
d.addErrback(errback or self.__default_ko, name, category)
def getParamV(self, name, category):
"""Helper method to get the value in the good type
@ -251,5 +274,8 @@ class Memory:
def setParam(self, name, value, category):
return self.params.setParam(name, value, category)
def import_params(self, parent, xml):
return self.params.import_params(parent, xml)
def importParams(self, parent, xml):
return self.params.importParams(parent, xml)
def setDefault(self, name, category, callback, errback=None):
return self.params.setDefault(name, category, callback, errback)