diff -r 000000000000 -r a3b6e531f0d2 iro/anbieter/sipgate.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/anbieter/sipgate.py Thu Oct 22 10:00:01 2009 +0200 @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +#Copyright (C) 2009 Sandro Knauß + +#This program is free software; you can redistribute it and/or modify it under the terms +#of the GNU General Public License as published by the Free Software Foundation; +#either version 3 of the License, or any later version. +#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#See the GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, see . + + +from anbieter import anbieter +from telnumber import telnumber, NotATelNumber +import ConfigParser +import xmlrpclib +import base64 + +class NoValidStatusCode(Exception): + pass + +class sipgate(anbieter): + """ + s. auch http://www.tuxad.com/sipgate.html + und http://lists.sipgate.net/pipermail/sipgate-developers/2007-September/000016.html + """ + section="sipgate" + url="https://%s:%s@samurai.sipgate.net/RPC2" + def __init__(self,user="",password=""): + self.user=user + self.password=password + + def read_basic_config(self,filename): + """Read basic options from the config file""" + cp = ConfigParser.ConfigParser() + cp.read([filename]) + self.user=cp.get(self.section, 'user') + self.password=cp.get(self.section, 'password') + + def sendSMS(self,sms,recipients): + """send SMS with $sms to $recipients""" + args={ + "TOS" : "text", + "Content" : sms.content + } + self.__send(args,recipients) + + def sendFAX(self,fax,recipients): + """send the PDF file $fax to $recipients""" + pdf=open(fax.attachments[0],"rb") + args={ + "TOS" : "fax", + "Content" : base64.encodestring(pdf.read()) + } + pdf.close() + self.__send(args,recipients) + + def __connect(self): + """connect to sipgate XMLRPC Server""" + self.samurai=xmlrpclib.Server(self.url%(self.user,self.password)).samurai + args_identify = { + "ClientName" : "anbieter.py", + "ClientVersion" : "V1.0", + "ClientVendor" : "Sandro Knauss" + } + + self.__send_method(self.samurai.ClientIdentify, args_identify) + + def __send_method(self, func, args=None): + """execute $func and test weather if the func ran successfully or not""" + if args==None: + xmlrpc_result = func() + else: + xmlrpc_result = func(args) + if xmlrpc_result['StatusCode'] != 200: + raise NoValidStatusCode("There was an error during identification to the server! %d %s"% (xmlrpc_result['StatusCode'], xmlrpc_result['StatusString'])) + + return xmlrpc_result + + def __send(self,args,recipients): + """main sending method - sending the args to $recipients""" + sended=[] + self.__connect() + for recipient in recipients: + try: + tel = telnumber(recipient) + + if tel in sended: #only send message once per recipient + continue + sended.append(tel) + + args["RemoteUri"]="sip:%s%s@sipgate.net"%(tel.land,tel.number) + xmlrpc_result = self.__send_method(self.samurai.SessionInitiate, args) + self.updateStatus(arranged=recipient) + except NotATelNumber,NoValidStatusCode : + self.updateStatus(failed=recipient) + + self.__disconnect() + + def updateStatus(self, arranged=None, failed=None): + """is a function that is called, if a new SMS/FAX was send + -arranged is non None, if SMS/FAX was sended successfully + -failed is non None, if SMS/FAX sending failed + the content will be the recipent""" + pass + + def BalanceGet(self): + """get the balance of sipgate""" + self.__connect() + ret = self.__send_method(self.samurai.BalanceGet ) + self.__disconnect() + return ret['CurrentBalance'] + + def getNewMessages(self): + """get new messages from inbox""" + self.__connect() + tmp = self.__send_method(self.samurai.UmSummaryGet) + self.__disconnect() + tmp=tmp['UmSummary'] + ret={} + for entry in tmp: + ret[entry['TOS']]={'read':entry["Read"],'unread':entry["Unread"]} + return ret + + def getRecommendedInterval(self,methods): + """how often you can call one $methods""" + self.__connect() + args = {"MethodList" : methods } + tmp = self.__send_method(self.samurai.RecommendedIntervalGet, args) + self. __disconnect() + ret={} + for entry in tmp['IntervalList']: + ret[entry['MethodName']]=entry['RecommendedInterval'] + return ret + + def __disconnect(self): + """disconnect xmlrpc client""" + self.xmlrpc=None