from XMLRPCClient import XMLRPCClient, XMLRPCClientError
from Acquisition import Implicit
from AccessControl.Role import RoleManager
from OFS.SimpleItem import SimpleItem
from OFS.ObjectManager import ObjectManager
from OFS.PropertyManager import PropertyManager
from AccessControl import ClassSecurityInfo
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
import Globals


class ZXMLRPCClient(SimpleItem):
  """
    Zope XML-RPC Client
  """

  meta_type = 'Z XML-RPC Client'

  security = ClassSecurityInfo()

  security.declareProtected('View management screens', 'manage_browseMethods', 'manage_editForm')
  manage_browseMethods = PageTemplateFile('www/browse.zpt', globals(), __name__='manage_browseMethods')

  manage_editForm = PageTemplateFile('www/editClient.zpt', globals(), __name__='manage_editForm')

  manage=manage_main=manage_editForm

  manage_options = ({'label': 'Edit',
                     'action': 'manage_main'},
                    {'label':'Browse Methods',
                     'action':'manage_browseMethods',
                     'help': ('ZXMLRPCClient', 'browse-help.stx')},
                   ) + RoleManager.manage_options


  def __init__(self, id, title, address, port=8765, user=None, password=None, uri=None):
    self.id = id
    self.title = title
    self.address = address
    self.port = port
    self.user = user
    self.password = password
    self.uri = uri
    self.instance = XMLRPCClient(self.address, self.port, self.user, self.password, self.uri)

  security.declareProtected('Use XML-RPC Client', 'browse')
  def browse(self):
    try:
      return self.instance.browse()
    except XMLRPCClientError, e:
      return {'error': e}
    except:
      return None

  security.declareProtected('Use XML-RPC Client', 'callMethod')
  def callMethod(self, methodname, *args):
    return self.instance.callMethod(methodname, *args)

  def manage_edit(self, title, address, port=8765, user=None, password=None, uri=None, REQUEST=None):
    """ Change attributes of the object """

    self.title = title
    self.address = address
    self.port = port
    self.user = user
    self.password = password
    self.uri = uri
    self.instance.update(self.address, self.port, self.user, self.password, self.uri)

    if REQUEST:
      message="Changes Saved."
      return self.manage_main(self,REQUEST,manage_tabs_message=message)

Globals.InitializeClass(ZXMLRPCClient)

############################################################

manage_addZXMLRPCClientForm = PageTemplateFile(
  'www/addClient.zpt', globals(),
  __name__='manage_addZXMLRPCClientForm')

def manage_addZXMLRPCClient(self, id, title, address, port=8765, user=None, password=None, uri=None, REQUEST=None):
  """ Add XMLRPC Client to Zope """

  self._setObject(id, ZXMLRPCClient(id, title, address, port, user, password, uri))

  if REQUEST is not None:
    REQUEST.RESPONSE.redirect('manage_main', lock=1)
