# -*- coding: cp1252 -*-
import httplib, urllib
import xml.parsers.expat

import time

class ContactsParser :
    """Clase para realizar el parseo del XML recibido al solicitar la lista de contactos"""

    Contactos = {}
    bNickName = 0
    bName = 0
    bUserID = 0

    name = ""
    userId = ""

    # Funciones de manejo de XML para identificar la lista de contactos
    def start_elementContact(self,name,attrs):
        """Se llama automáticamente al abrirse un elemento XML
            Entrada: name=nombre del elemento
                     attrs: atributos del elemento"""
        
        if name == 'NickName' :
            self.bNickName = 1
            self.bUserID = 0
            self.bName = 0
        elif self.bNickName and name == 'Name' :
            self.bUserID = 0
            self.bName = 1
        elif self.bNickName and name == 'UserID' :
            self.bUserID = 1
            self.bName = 0

    def end_elementContact(self,name):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: name=nombre del elemento"""
        
        if name == 'NickName' :
            self.Contactos[self.userId]=self.name
            self.bNickName = 0
            self.bUserID = 0
            self.bName = 0
            
    def char_dataContact(self,data):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: data=cadena con los datos del elemento"""
        
        if self.bName == 1 :
            self.name = str(data)
        elif self.bUserID == 1 :
            self.userId = str(data)

    def GetListaContactos(self, respuesta) :
        """Devuelve la lista de contactos sin tener en cuenta su estado
            Entrada: respuesta=cadena de texto con el texto recibido del servidor
            Retorna: lista de contactos"""
        
        p = xml.parsers.expat.ParserCreate()

        # Función Callback que se llama al abrirse un elemento XML
        p.StartElementHandler = self.start_elementContact
        # Función Callback que se llama al cerrarse un elemento XML
        p.EndElementHandler = self.end_elementContact
        # Función Callback que se llama con los datos de cada elemento
        p.CharacterDataHandler = self.char_dataContact

        p.Parse(respuesta)

        return self.Contactos

class PresenceParser :
    """Clase para realizar el parseo del XML recibido al recibir una actualización de presencia de los contactos"""

    Presentes = {}
    bPresence = 0
    bUserID = 0
    bUserAvailability = 0
    bValue = 0
    bAlias = 0
    bAliasValue = 0

    userId = ''
    nickName = ''
    value = ''

    # Funciones de manejo de XML para identificar la lista de contactos presentes
    def start_elementPresence(self,name,attrs):
        """Se llama automáticamente al abrirse un elemento XML
            Entrada: name=nombre del elemento
                     attrs: atributos del elemento"""

        if name == 'Presence' :
            self.bPresence = 1
            self.bUserID = 0
            self.bUserAvailability = 0
            self.bValue = 0
            self.bAlias = 0
            self.bAliasValue = 0
        elif self.bPresence == 1 and name == 'OnlineStatus' :
            self.bUserID = 0
            self.bUserAvailability = 1
            self.bValue = 0
            self.bAlias = 0
            self.bAliasValue = 0
        elif self.bPresence == 1 and name == 'Alias' :
            self.bUserID = 0
            self.bUserAvailability = 0
            self.bValue = 0
            self.bAlias = 1
            self.bAliasValue = 0
        elif self.bPresence == 1 and name == 'UserID' :
            self.bUserID = 1
            self.bUserAvailability = 0
            self.bValue = 0
            self.bAlias = 0
            self.bAliasValue = 0
        elif self.bUserAvailability == 1 and name == 'PresenceValue' :
            self.bValue = 1
            self.bAliasValue = 0
        elif self.bAlias == 1 and name == 'PresenceValue' :
            self.bValue = 0
            self.bAliasValue = 1

    def end_elementPresence(self,name):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: name=nombre del elemento"""

        if name == 'Presence' :
            self.Presentes[self.userId]=[self.value,self.nickName]
            self.bPresence = 0
            self.bUserID = 0
            self.bUserAvailability = 0
            self.bValue = 0
            self.bAlias = 0
            self.bAliasValue = 0
        elif name == 'OnlineStatus' :
            self.bUserAvailability = 0
            self.bValue = 0
        elif name == 'Alias' :
            self.bAlias = 0
            self.bAliasValue = 0
        elif name == 'UserID' :
            self.bUserID = 0
        elif name == 'PresenceValue' :
            self.bValue = 0
            self.bAliasValue = 0
            
    def char_dataPresence(self,data):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: data=cadena con los datos del elemento"""

        if self.bUserID == 1 :
            self.userId = str(data)
        elif self.bValue == 1 :
            self.value = str(data)
        elif self.bAliasValue == 1 :
            self.nickName = str(data)

    def GetListaPresentes(self, respuesta) :
        """Devuelve la lista de contactos con el estado de presencia de cada uno de ellos
            Entrada: respuesta=cadena de texto con el texto recibido del servidor
            Retorna: lista de contactos"""

        p = xml.parsers.expat.ParserCreate()

        # Función Callback que se llama al abrirse un elemento XML
        p.StartElementHandler = self.start_elementPresence
        # Función Callback que se llama al cerrarse un elemento XML
        p.EndElementHandler = self.end_elementPresence
        # Función Callback que se llama con los datos de cada elemento
        p.CharacterDataHandler = self.char_dataPresence

        p.Parse(respuesta)

        return self.Presentes

class MessageParser :
    """Clase para realizar el parseo del XML recibido al recibir un mensaje"""

    bNewMessage = 0
    bSender = 0
    bUserID = 0
    bContentData = 0

    userId = ''
    message = ''

    # Funciones de manejo de XML para identificar los mensajes recibidos
    def start_elementMessage(self,name,attrs):
        """Se llama automáticamente al abrirse un elemento XML
            Entrada: name=nombre del elemento
                     attrs: atributos del elemento"""

        if name == 'NewMessage' :
            self.bNewMessage = 1
            self.bSender = 0
            self.bUserID = 0
            self.bContentData = 0
        elif self.bNewMessage == 1 and name == 'Sender' :
            self.bSender = 1
            self.bUserID = 0
            self.bContentData = 0
        elif self.bNewMessage == 1 and name == 'ContentData' :
            self.bSender = 0
            self.bUserID = 0
            self.bContentData = 1
        elif self.bSender == 1 and name == 'UserID' :
            self.bUserID = 1

    def end_elementMessage(self,name):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: name=nombre del elemento"""

        if name == 'NewMessage' :
            self.bNewMessage = 0
            self.bSender = 0
            self.bUserID = 0
            self.bContentData = 0
        elif name == 'Sender' :
            self.bSender = 0
            self.bUserID = 0
        elif name == 'UserID' :
            self.bSender = 0
            self.bUserID = 0
        elif name == 'ContentData' :
            self.bContentData = 0
            
    def char_dataMessage(self,data):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: data=cadena con los datos del elemento"""

        if self.bUserID == 1 :
            self.userId = str(data)
        elif self.bContentData == 1 :
            self.message = self.message + str(data)

    def GetMensaje(self, respuesta) :
        """Devuelve el texto del mensaje recibido
            Entrada: respuesta=cadena de texto con el texto recibido del servidor
            Retorna: identificador del remitente | texto del mensaje"""

        p = xml.parsers.expat.ParserCreate()

        # Función Callback que se llama al abrirse un elemento XML
        p.StartElementHandler = self.start_elementMessage
        # Función Callback que se llama al cerrarse un elemento XML
        p.EndElementHandler = self.end_elementMessage
        # Función Callback que se llama con los datos de cada elemento
        p.CharacterDataHandler = self.char_dataMessage

        p.Parse(respuesta)

        return self.userId+'|'+self.message

class AuthRequestParser :
    """Clase para realizar el parseo del XML recibido cuando un contacto solicita autorización para conocer nuestro estado de presencia"""

    bPresence = 0
    bUserID = 0
    bTransactionID = 0

    userId = ""
    transactionId = ""

    # Funciones de manejo de XML para reconocer cuando un usuario solicita autorización para reconocer nuestra presencia
    def start_elementContact(self,name,attrs):
        """Se llama automáticamente al abrirse un elemento XML
            Entrada: name=nombre del elemento
                     attrs: atributos del elemento"""

        if name == 'PresenceAuth-Request' :
            self.bTransactionID = 0
            self.bPresence = 1
            self.bUserID = 0
        elif self.bPresence and name == 'UserID' :
            self.bUserID = 1
        elif name == 'TransactionID' :
            self.bTransactionID = 1
            self.bPresence = 0
            self.bUserID = 0

    def end_elementContact(self,name):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: name=nombre del elemento"""

        if name == 'PresenceAuth-Request' :
            self.bPresence = 0
            self.bUserID = 0
        elif name == 'UserID' :
            self.bUserID = 0
        elif name == 'TransactionID' :
            self.bTransactionID = 0
            
    def char_dataContact(self,data):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: data=cadena con los datos del elemento"""

        if self.bUserID == 1 :
            self.userId = str(data)
        if self.bTransactionID == 1 :
            self.transactionId = str(data)

    def GetUsuario(self, respuesta) :
        """Devuelve el identificador del usuario que solicita conocer nuestro estado de presencia
            Entrada: respuesta=cadena de texto con el texto recibido del servidor
            Retorna: identificador del contacto | identificador de transacción"""
        
        p = xml.parsers.expat.ParserCreate()

        # Función Callback que se llama al abrirse un elemento XML
        p.StartElementHandler = self.start_elementContact
        # Función Callback que se llama al cerrarse un elemento XML
        p.EndElementHandler = self.end_elementContact
        # Función Callback que se llama con los datos de cada elemento
        p.CharacterDataHandler = self.char_dataContact

        p.Parse(respuesta)

        return self.userId+'|'+self.transactionId

class SMS20 :

    sessionID = ""
    bSessionID = 0
    
    def Login(self, log, passw) :
        """Realiza el login a la web de movistar
            Entrada: login=cadena con el numero de telefono,
                      passw=cadena con el password de acceso a la web
            Retorna: Identificador de sesión necesario para todas las operaciones posteriores"""

        ## Iniciamos login con HTTPS
        params = urllib.urlencode ({'TM_ACTION':'AUTHENTICATE', 'TM_LOGIN':log, 'TM_PASSWORD':passw, 'SessionCookie':'ColibriaIMPS_367918656', 'ClientID':'WV:InstantMessenger-1.0.2309.16485@COLIBRIA.PC-CLIENT'})
        headers = {"Content-type":"application/x-www-form-urlencoded"}
        conn=httplib.HTTPConnection("impw.movistar.es")
        conn.request ("POST", "/tmelogin/tmelogin.jsp",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        ## dejamos todo como estaba.
        conn.close()

        session = self.BuscarSessionID(respuesta)
        return session


    # Funciones de manejo de XML para identificar la sesión
    def start_elementSession(self,name, attrs):
        """Se llama automáticamente al abrirse un elemento XML
            Entrada: name=nombre del elemento
                     attrs: atributos del elemento"""

        if name == 'SessionID' :
            self.bSessionID = 1
            
    def end_elementSession(self,name):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: name=nombre del elemento"""

        if name == 'SessionID' :
            self.bSessionID = 0
            
    def char_dataSession(self,data):
        """Se llama automáticamente al cerrarse un elemento XML
            Entrada: data=cadena con los datos del elemento"""

        if self.bSessionID == 1 :
            self.sessionID = data

    def BuscarSessionID(self, texto) :
        p = xml.parsers.expat.ParserCreate()

        # Función Callback que se llama al abrirse un elemento XML
        p.StartElementHandler = self.start_elementSession
        # Función Callback que se llama al cerrarse un elemento XML
        p.EndElementHandler = self.end_elementSession
        # Función Callback que se llama con los datos de cada elemento
        p.CharacterDataHandler = self.char_dataSession

        p.Parse(texto)

        return self.sessionID

    def Conectar(self, log, nickname, session) :
        """Realiza la conexión al servicio SMS2.0
            Entrada: log=cadena con el numero de telefono,
                      nickname=cadena con el nickname que queramos utilizar (sólo es necesario la primera vez)
                      session=cadena con el identificador de sesión
            Retorna: La lista de contactos asociados al número de teléfono"""

        ## Iniciamos acceso a sms20.movistar.es
        # Enviamos <ClientCapability-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>1</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><ClientCapability-Request><ClientID><URL>WV:InstantMessenger-1.0.2309.16485@COLIBRIA.PC-CLIENT</URL></ClientID><CapabilityList><ClientType>COMPUTER</ClientType><InitialDeliveryMethod>P</InitialDeliveryMethod><AcceptedContentType>text/plain</AcceptedContentType><AcceptedContentType>text/html</AcceptedContentType><AcceptedContentType>image/png</AcceptedContentType><AcceptedContentType>image/jpeg</AcceptedContentType><AcceptedContentType>image/gif</AcceptedContentType><AcceptedContentType>audio/x-wav</AcceptedContentType><AcceptedContentType>image/jpg</AcceptedContentType><AcceptedTransferEncoding>BASE64</AcceptedTransferEncoding><AcceptedContentLength>256000</AcceptedContentLength><MultiTrans>1</MultiTrans><ParserSize>300000</ParserSize><SupportedCIRMethod>STCP</SupportedCIRMethod><ColibriaExtensions>T</ColibriaExtensions></CapabilityList></ClientCapability-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <Service-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>2</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><Service-Request><ClientID><URL>WV:InstantMessenger-1.0.2309.16485@COLIBRIA.PC-CLIENT</URL></ClientID><Functions><WVCSPFeat><FundamentalFeat /><PresenceFeat /><IMFeat /><GroupFeat /></WVCSPFeat></Functions><AllFunctionsRequest>T</AllFunctionsRequest></Service-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <UpdatePresence-Request> para avisar de que estamos conectados con un messenger
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>3</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><UpdatePresence-Request><PresenceSubList xmlns="http://www.openmobilealliance.org/DTD/WV-PA1.2"><OnlineStatus><Qualifier>T</Qualifier></OnlineStatus><ClientInfo><Qualifier>T</Qualifier><ClientType>COMPUTER</ClientType><ClientTypeDetail xmlns="http://imps.colibria.com/PA-ext-1.2">PC</ClientTypeDetail><ClientProducer>Colibria As</ClientProducer><Model>TELEFONICA Messenger</Model><ClientVersion>1.0.2309.16485</ClientVersion></ClientInfo><CommCap><Qualifier>T</Qualifier><CommC><Cap>IM</Cap><Status>OPEN</Status></CommC></CommCap><UserAvailability><Qualifier>T</Qualifier><PresenceValue>AVAILABLE</PresenceValue></UserAvailability></PresenceSubList></UpdatePresence-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <GetList-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>4</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><GetList-Request /></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <GetPresence-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>5</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><GetPresence-Request><User><UserID>wv:"""+log+"""@movistar.es</UserID></User></GetPresence-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <ListManage-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>6</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><ListManage-Request><ContactList>wv:"""+log+"""/~pep1.0_privatelist@movistar.es</ContactList><ReceiveList>T</ReceiveList></ListManage-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        cp=ContactsParser()
        lista=cp.GetListaContactos(respuesta)

        # Enviamos <CreateList-Request>
        listadenicks = ''
        if lista != {} :
            listadenicks = '<NickList>'
            for k,v in lista.iteritems() :
                listadenicks = listadenicks + '<NickName><Name>%s</Name><UserID>%s</UserID></NickName>' % (v, k)
            listadenicks = listadenicks + '</NickList>'
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>7</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><CreateList-Request><ContactList>wv:"""+log+"""/~PEP1.0_subscriptions@movistar.es</ContactList>"""+listadenicks+"""</CreateList-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <SubscribePresence-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>8</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><SubscribePresence-Request><ContactList>wv:"""+log+"""/~PEP1.0_subscriptions@movistar.es</ContactList><PresenceSubList xmlns="http://www.openmobilealliance.org/DTD/WV-PA1.2"><OnlineStatus /><ClientInfo /><FreeTextLocation /><CommCap /><UserAvailability /><StatusText /><StatusMood /><Alias /><StatusContent /><ContactInfo /></PresenceSubList><AutoSubscribe>T</AutoSubscribe></SubscribePresence-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <UpdatePresence-Request> para enviar nuestro nick
        # Sólo la primera vez y cuando queramos cambiar de nick
        if nickname != '' :
            params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>8</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><UpdatePresence-Request><PresenceSubList xmlns="http://www.openmobilealliance.org/DTD/WV-PA1.2"><Alias><Qualifier>T</Qualifier><PresenceValue>"""+nickname+"""</PresenceValue></Alias></PresenceSubList></UpdatePresence-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
            headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
            conn=httplib.HTTPConnection("sms20.movistar.es")
            conn.request ("POST", "/",params, headers)
            resp=conn.getresponse()
            respuesta=resp.read()

        conn.close()

        return lista

    def Polling(self,session) :
        """Realiza el sondeo en busca de notificaciones de mensajes, contactos que se conecten, etc...
            Entrada: session=cadena con el identificador de sesión
            Retorna: El texto de la respuesta para buscar los distintos tipos de respuesta"""

        # Enviamos <Polling-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID /></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><Polling-Request /></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        conn.close()
        
        return respuesta

    def AnadirContacto(self, session, log, contact, transId) :
        """Añade un contacto a la lista del usuario
            Entrada: session=cadena con el identificador de sesión
                     log=cadena con el numero de telefono,
                     contact=cadena con el número de teléfono del contacto que queremos añadir
                     transId=identificador de transacción (debe gestionarse la secuencia numérica desde la aplicación)
            Retorna: La lista de contactos presentes (sólo con el estado del número añadido)"""

        lista = {}

        # Enviamos <Search-Request> (en teoría para obtener el userId)
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><Search-Request><SearchPairList><SearchElement>USER_MOBILE_NUMBER</SearchElement><SearchString>"""+contact+"""</SearchString></SearchPairList><SearchLimit>50</SearchLimit></Search-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <GetPresence-Request> para obtener el estado del contacto inmediatamente
        #   (sin esto habría que esperar a que el contacto cambie de estado)
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+1)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><GetPresence-Request><User><UserID>wv:"""+contact+"""@movistar.es</UserID></User><PresenceSubList xmlns="http://www.openmobilealliance.org/DTD/WV-PA1.2"><OnlineStatus /><ClientInfo /><GeoLocation /><FreeTextLocation /><CommCap /><UserAvailability /><StatusText /><StatusMood /><Alias /><StatusContent /><ContactInfo /></PresenceSubList></GetPresence-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        cp=PresenceParser()
        lista=cp.GetListaPresentes(respuesta)
        print lista

        nickname=lista['wv:'+contact+'@movistar.es'][1]

        # Enviamos <ListManage-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+2)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><ListManage-Request><ContactList>wv:"""+log+"""/~PEP1.0_subscriptions@movistar.es</ContactList><AddNickList><NickName><Name>"""+nickname+"""</Name><UserID>wv:"""+contact+"""@movistar.es</UserID></NickName></AddNickList><ReceiveList>T</ReceiveList></ListManage-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <ListManage-Request> esta vez para la PrivateList
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+2)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><ListManage-Request><ContactList>wv:"""+log+"""/~PEP1.0_privatelist@movistar.es</ContactList><AddNickList><NickName><Name>"""+nickname+"""</Name><UserID>wv:"""+contact+"""@movistar.es</UserID></NickName></AddNickList><ReceiveList>T</ReceiveList></ListManage-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        conn.close()

        return lista

    def AutorizaContacto(self, session, transId, usuario, transaccion) :
        """Autoriza a un contacto a conocer nuestro estado de presencia
            Entrada: session=cadena con el identificador de sesión
                     transId=identificador de transacción (debe gestionarse la secuencia numérica desde la aplicación)
                     usuario=identificador de usuario al que autorizamos (wv:6xxxxxxxx@movistar.es)
                     transaccion=identificador de transacción recibido en la petición de la autorización
            Retorna: sin retorno"""
        
        # Enviamos <GetPresence-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><GetPresence-Request><User><UserID>"""+usuario+"""</UserID></User><PresenceSubList xmlns="http://www.openmobilealliance.org/DTD/WV-PA1.2"><OnlineStatus /><ClientInfo /><GeoLocation /><FreeTextLocation /><CommCap /><UserAvailability /><StatusText /><StatusMood /><Alias /><StatusContent /><ContactInfo /></PresenceSubList></GetPresence-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <Status> para hacer el ack de la petición
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Response</TransactionMode><TransactionID>"""+transaccion+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><Status><Result><Code>200</Code></Result></Status></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <PresenceAuth-User>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+1)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><PresenceAuth-User><UserID>"""+usuario+"""</UserID><Acceptance>T</Acceptance></PresenceAuth-User></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

    def BorrarContacto(self, session, transId, log, contacto) :
        """Autoriza a un contacto a conocer nuestro estado de presencia
            Entrada: session=cadena con el identificador de sesión
                     transId=identificador de transacción (debe gestionarse la secuencia numérica desde la aplicación)
                     log=cadena con el numero de telefono del usuario
                     contacto=identificador de contacto a borrar (wv:6xxxxxxxx@movistar.es)
            Retorna: sin retorno"""

        # Enviamos <ListManage-Request> para eliminar contacto de la lista de suscripciones
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><ListManage-Request><ContactList>wv:"""+log+"""/~PEP1.0_subscriptions@movistar.es</ContactList><RemoveNickList><UserID>"""+contacto+"""</UserID></RemoveNickList><ReceiveList>T</ReceiveList></ListManage-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <ListManage-Request> para eliminar contacto de la lista privada
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+1)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><ListManage-Request><ContactList>wv:"""+log+"""/~PEP1.0_privatelist@movistar.es</ContactList><RemoveNickList><UserID>"""+contacto+"""</UserID></RemoveNickList><ReceiveList>T</ReceiveList></ListManage-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <UnsubscribePresence-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+2)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><UnsubscribePresence-Request><User><UserID>"""+contacto+"""</UserID></User></UnsubscribePresence-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <DeleteAttributeList-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+3)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><DeleteAttributeList-Request><UserID>"""+contacto+"""</UserID><DefaultList>F</DefaultList></DeleteAttributeList-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

        # Enviamos <CancelAuth-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId+4)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><CancelAuth-Request><UserID>"""+contacto+"""</UserID></CancelAuth-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

    def EnviaMensaje(self,session,transId,log,destinatario,mensaje) :
        """Envía un mensaje al número identificado por destinatario
            Entrada: session=cadena con el identificador de sesión
                     transId=identificador de transacción (debe gestionarse la secuencia numérica desde la aplicación)
                     log=cadena con el numero de telefono del usuario
                     destinatario=cadena con el identificador del destinatario del mensaje (wv:6xxxxxxxx@movistar.es)
                     mensaje=texto del mensaje que queremos enviar
            Retorna: sin retorno"""

        # Enviamos <SendMessage-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><SendMessage-Request><DeliveryReport>F</DeliveryReport><MessageInfo><ContentType>text/html</ContentType><ContentSize>148</ContentSize><Recipient><User><UserID>"""+destinatario+"""</UserID></User></Recipient><Sender><User><UserID>"""+log+"""@movistar.es</UserID></User></Sender></MessageInfo><ContentData>&lt;span style="color:#000000;font-family:'Microsoft Sans Serif';font-style:normal;font-weight:normal;font-size:12px;"&gt;"""+mensaje+"""&lt;/span&gt;</ContentData></SendMessage-Request></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()

    def Desconectar(self,session,transId) :
        """Envía un mensaje al número identificado por destinatario
            Entrada: session=cadena con el identificador de sesión
                     transId=identificador de transacción (debe gestionarse la secuencia numérica desde la aplicación)
            Retorna: sin retorno"""

        # Enviamos <SendMessage-Request>
        params = """<?xml version="1.0" encoding="utf-8"?><WV-CSP-Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"><Session><SessionDescriptor><SessionType>Inband</SessionType><SessionID>"""+session+"""</SessionID></SessionDescriptor><Transaction><TransactionDescriptor><TransactionMode>Request</TransactionMode><TransactionID>"""+str(transId)+"""</TransactionID></TransactionDescriptor><TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"><Logout-Request /></TransactionContent></Transaction></Session></WV-CSP-Message>"""
        headers = {'Content-type':'application/vnd.wv.csp.xml', 'Expect':'100-continue'}
        conn=httplib.HTTPConnection("sms20.movistar.es")
        conn.request ("POST", "/",params, headers)
        resp=conn.getresponse()
        respuesta=resp.read()
##---------------------------------------------------------------------------------------------
## Cuerpo principal

sms20 = SMS20()

log='6xxxxxxxx' # MSISDN
passw='xxxxxx' # password de acceso a SMS2.0

contact='6xxxxxxxx' # número de teléfono para añadir contacto

session = sms20.Login(log,passw)
sms20.Conectar(log,'',session)

transId = 15

listaContactos = {}
listaContactos = sms20.AnadirContacto(session, log, contact, transId)
transId = transId + 3

mensaje = ''
# Hacemos el sondeo hasta recibir el mensaje " adios"
while mensaje != ' adios' :

    respuesta=sms20.Polling(session)

    pp=PresenceParser()
    lista=pp.GetListaPresentes(respuesta)
    if lista != {} :
        for n in lista :
            if lista[n][0] == 'T' :
                print lista[n][1] + '(' + n+ ') está CONECTADO'
            else : 
                print lista[n][1] + '(' + n+ ') NO está conectado'
            

    mp=MessageParser()
    texto=mp.GetMensaje(respuesta)
    partes = texto.split('|')
    if len(partes) >0 :
        Remitente = partes[0]
        if len(partes) > 1 :
            mensajeFormato = partes[1]
            partesFormato = mensajeFormato.split('<')
            if len(partesFormato) > 1 :
                colaFormato = partesFormato[1]
                partesCola = colaFormato.split('>')
                if len(partesCola) > 1 :
                    textoMensaje = partesCola[1]
                    print Remitente + ': ' + '"' + textoMensaje + '"'
                    mensaje = textoMensaje
                    # Respondemos con el mismo mensaje, añadiendo " a ti tambien"
                    sms20.EnviaMensaje(session,transId,log,Remitente,textoMensaje + ' a ti tambien')
                    transId = transId + 1

    # Para responder a la petición de autorización para detectar presencia
    arp=AuthRequestParser()
    usuarioYtransaccion=arp.GetUsuario(respuesta)
    usuarioYtransaccionList=usuarioYtransaccion.split('|')
    usuario=usuarioYtransaccionList[0]
    transaccion=usuarioYtransaccionList[1]
    if usuario != '' :
        # ToDo: Presentar la opción de autorizar o no al usuario
        AutorizaContacto(session, transId, usuario, transaccion)
        transId = transId + 2

    time.sleep(3)

sms20.BorrarContacto(session, transId, log, contact)
transId = transId + 5

sms20.Desconectar(session,transId)

