<?php
class SMS20
{
    var $sessionID;
    var $bSessionID;
    var $miAlias;

    // 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
    function Login($log, $passw)
    {
    	print "Login<br>\r\n";
        $this->sessionID = "";
        $this->bSessionID = 0;
        $this->miAlias = "";
    
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        // Iniciamos login con HTTP
        $url = "http://impw.movistar.es/tmelogin/tmelogin.jsp";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        $postdata = "TM_ACTION=AUTHENTICATE&TM_LOGIN=$log&TM_PASSWORD=$passw&SessionCookie=ColibriaIMPS_367918656&ClientID=WV:InstantMessenger-1.0.2309.16485@COLIBRIA.PC-CLIENT";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/x-www-form-urlencoded");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);
        $result = curl_exec ($ch);
	curl_close($ch);
	
        list($header, $string) = explode("\r\n\r\n", $result, 2);
        $string=str_replace("xmlns=","a=",$string);

	$xml = simplexml_load_string($string);
	
	$sessions = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/Login-Response/SessionID');
	while(list( , $node) = each($sessions)) {
	    $this->sessionID = $node;
	}

	print "SessionID = ".$this->sessionID."<br />\r\n";
	return $this->sessionID;
    }

    // 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
    function Conectar($log, $nickname, $session)
    {
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        $url = "http://sms20.movistar.es/";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/vnd.wv.csp.xml",
    		        "Expect: 100-continue");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);

        // Iniciamos acceso a sms20.movistar.es
        // Enviamos <ClientCapability-Request>
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <Service-Request>
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <UpdatePresence-Request> para avisar de que estamos conectados con un messenger
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <GetList-Request>
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <GetPresence-Request>
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);
        
        list($header1, $header2, $string) = explode("\r\n\r\n", $result, 3);
        $string=str_replace("xmlns=","a=",$string);
	$xml = simplexml_load_string($string);
	$presences = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/GetPresence-Response/Presence');
        while(list( , $presence) = each($presences)) {
            if($presence->UserID == "wv:$log@movistar.es") {
	        $this->miAlias = $presence->PresenceSubList->Alias->PresenceValue;
	    }
	}
	print "NickName = ".$this->miAlias."<br />\r\n";

        // Enviamos <ListManage-Request>
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        list($header1, $header2, $string) = explode("\r\n\r\n", $result, 3);
        $string=str_replace("xmlns=","a=",$string);
	$xml = simplexml_load_string($string);
	$contacts = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/ListManage-Response/NickList/NickName');
        $lista = array();
        while(list( , $contact) = each($contacts)) {
            $lista["$contact->UserID"] = $contact->Name;
	}

        // Enviamos <CreateList-Request>
        $listadenicks = "";
        if($lista) {
        	$listadenicks.="<NickList>";
                while(list($keys,$values) = each($lista)) {
                    $listadenicks.="<NickName><Name>$values</Name><UserID>$keys</UserID></NickName>";
		}
        	$listadenicks.="</NickList>";
        }
        print $listadenicks."<br>\r\n";
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <SubscribePresence-Request>
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <UpdatePresence-Request> para enviar nuestro nick
        // Sólo la primera vez y cuando queramos cambiar de nick
        if ($nickname != '') {
            $postdata = "<?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>9</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>";
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
            $result = curl_exec ($ch);

            $this->miAlias = $nickname;
        }

        curl_close($ch);

        return $lista;
    }

    // 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
    function Polling($session)
    {
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        $url = "http://sms20.movistar.es/";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/vnd.wv.csp.xml",
    		        "Expect: 100-continue");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);

        // Enviamos <Polling-Request>
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        curl_close($ch);
        
        list($header1, $header2, $string) = explode("\r\n\r\n", $result, 3);
        $string=str_replace("xmlns=","a=",$string);
        return $string;
    }

    // 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)
    function AnadirContacto($session, $log, $contact, $transId)
    {
        $lista = array();

        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        $url = "http://sms20.movistar.es/";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/vnd.wv.csp.xml",
    		        "Expect: 100-continue");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);

        // Enviamos <Search-Request> (en teoría para obtener el userId)
        $postdata = "<?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>$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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <GetPresence-Request> para obtener el estado del contacto inmediatamente
        //	(sin esto habría que esperar a que el contacto cambie de estado)
        $transId1 = $transId+1;
        $postdata = "<?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>$transId1</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        list($header1, $header2, $string) = explode("\r\n\r\n", $result, 3);
        $string=str_replace("xmlns=","a=",$string);
	$xml = simplexml_load_string($string);
	$presences = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/GetPresence-Response/Presence');
        while(list( , $presence) = each($presences)) {
            if($presence->UserID != "wv:$log@movistar.es") {
            	$par = array($presence->PresenceSubList->Alias->PresenceValue, $presence->PresenceSubList->UserAvailability->PresenceValue);
                $lista["$presence->UserID"] = $par;
	    }
	}

        $nickname=$lista["wv:".$contact."@movistar.es"][0];
        print $nickname."<br>\r\n";

        // Enviamos <ListManage-Request>
        $transId2 = $transId+2;
        $postdata = "<?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>$transId2</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <ListManage-Request> esta vez para la PrivateList
        $transId3 = $transId+3;
        $postdata = "<?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>$transId3</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        curl_close($ch);

        return $lista;
    }

    // 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
    function AutorizaContacto($session, $transId, $usuario, $transaccion)
    {
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        $url = "http://sms20.movistar.es/";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/vnd.wv.csp.xml",
    		        "Expect: 100-continue");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);

        // Enviamos <GetPresence-Request>
        $postdata = "<?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>$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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <Status> para hacer el ack de la petición
        $postdata = "<?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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <PresenceAuth-User>
        $transId1 = $transId+1;
        $postdata = "<?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>$transId1</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        curl_close($ch);
    }

    // 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"""
    function BorrarContacto($session, $transId, $log, $contacto)
    {
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        $url = "http://sms20.movistar.es/";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/vnd.wv.csp.xml",
    		        "Expect: 100-continue");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);
        
        // Enviamos <ListManage-Request> para eliminar contacto de la lista de suscripciones
        $postdata = "<?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>$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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <ListManage-Request> para eliminar contacto de la lista privada
        $transId1 = $transId+1;
        $postdata = "<?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>$transId1</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <UnsubscribePresence-Request>
        $transId2 = $transId+2;
        $postdata = "<?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>$transId2</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <DeleteAttributeList-Request>
        $transId3 = $transId+3;
        $postdata = "<?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>$transId3</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        // Enviamos <CancelAuth-Request>
        $transId4 = $transId+4;
        $postdata = "<?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>$transId4</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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        curl_close($ch);
    }

    // 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
    function EnviaMensaje($session,$transId,$log,$destinatario,$mensaje)
    {
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        $url = "http://sms20.movistar.es/";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/vnd.wv.csp.xml",
    		        "Expect: 100-continue");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);

        // Enviamos <SendMessage-Request>
        $postdata = "<?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>$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>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        curl_close($ch);
    }

    // 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
    function Desconectar($session,$transId)
    {
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);

        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

        $url = "http://sms20.movistar.es/";
        $res= curl_setopt ($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // cabeceras HTTP
        $header = array("Content-Type: application/vnd.wv.csp.xml",
    		        "Expect: 100-continue");
        curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);
        
        // Enviamos <Logout-Request>
        $postdata = "<?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>$transId</TransactionID></TransactionDescriptor><TransactionContent xmlns=\"http://www.openmobilealliance.org/DTD/WV-TRC1.2\"><Logout-Request /></TransactionContent></Transaction></Session></WV-CSP-Message>";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec ($ch);

        curl_close($ch);
    }
    
    function PeticionAutorizacion($xml)
    {
    	$datos = array();
    	
        // Para responder a la petición de autorización para detectar presencia
        $userIds = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/PresenceAuth-Request/UserID');
        $usuario = $userIds[0];
        $datos[0] = $usuario;

        $transactionIds = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionDescriptor/TransactionID');
        $transaccion = $transactionIds[0];

        $datos[1] = $transaccion;
        
        return $datos;
    }
    
    function ListaContactos($xml, $lista)
    {
	$presences = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/PresenceNotification-Request/Presence');
        while(list( , $presence) = each($presences)) {
            $par = array();
            if ($lista["$presence->UserID"] == 0)
                $lista["$presence->UserID"] = $par;
            if ($presence->PresenceSubList->Alias->PresenceValue != "")
                $lista["$presence->UserID"][0] = $presence->PresenceSubList->Alias->PresenceValue;
            if ($presence->PresenceSubList->UserAvailability->PresenceValue != "")
                $lista["$presence->UserID"][1] = $presence->PresenceSubList->UserAvailability->PresenceValue;
	}
	
	return $lista;
    }
    
    function MensajeRecibido($xml)
    {
    	$datos = array();

	$NewMessage = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/NewMessage/ContentData');
	$remitente = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/NewMessage/MessageInfo/Sender/User/UserID');
	list( $ini1, $ini2, $message) = split( '[<>]', $NewMessage[0] );
	$mensaje = utf8_decode($message);
	
	$datos[0] = $remitente[0];
	$datos[1] = $mensaje;
	
	return $datos;
    }
}

    set_time_limit(600);

    $login = "6xxxxxxxx";
    $passw = "xxxxxx";

    $contact = "6xxxxxxxx"; // número de teléfono para añadir contacto

    $sms20 = new SMS20();
    $session = $sms20->Login($login, $passw);
    $sms20->Conectar($login, "", $session);

    $transId = 15;

    $listaContactos = array();
    $listaContactos = $sms20->AnadirContacto($session, $login, $contact, $transId);
    $transId = $transId + 3;

    $mensaje = "";
    $lista = array();

    // Hacemos el sondeo hasta recibir el mensaje " adios"
    $cuenta = 0;
    while ($mensaje != " adios") {
        $respuesta=$sms20->Polling($session);

        $xml = simplexml_load_string($respuesta);
        if($xml) {
	    $PresenceAuthRequest = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/PresenceAuth-Request');
	    if($PresenceAuthRequest) {
    		$datos = $sms20->PeticionAutorizacion($xml);

                $usuario = $datos[0];
                $transaccion = $datos[1];
                if (($usuario != '') && ($transaccion != '')){
                    print "<br>\r\n<br>\r\nAutorizando...<br>\r\n";
                    // ToDo: Presentar la opción de autorizar o no al usuario
                    $sms20->AutorizaContacto($session, $transId, $usuario, $transaccion);
                    $transId = $transId + 2;
                }
            }

            $PresenceNotificationRequest = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/PresenceNotification-Request');
            if($PresenceNotificationRequest) {
            	$lista = $sms20->ListaContactos($xml, $lista);
                print_r($lista);
	    }

	    $NewMessage = $xml->xpath('/WV-CSP-Message/Session/Transaction/TransactionContent/NewMessage/ContentData');
	    if ($NewMessage) {
	    	$datos = $sms20->MensajeRecibido($xml);
	    	$remitente = $datos[0];
		$mensaje = utf8_decode($datos[1]);
		
	    	print $remitente." -> ".$mensaje."<br>\r\n";

	    	$message = utf8_encode($mensaje." a ti también");
	    	$sms20->EnviaMensaje($session,$transId,$login,$remitente[0],$message);
	    	$transId = $transId +1;
	    }
        }
	sleep(3);
    }

    $sms20->BorrarContacto($session, $transId, $log, $contact);
    $transId = $transId + 5;

    $sms20->Desconectar($session,$transId);
?>

