Posts Tagged ‘c++’

Leyendo XML con c#

Lunes, octubre 25th, 2010

Siguiendo con la aplicación de prueba que estoy pensando en hacer de la que os hablé el otro día

Hoy vamos a ver cómo sacar el token que nos servirá para autentificarnos contra Toodledo y obtener nuestras tareas de su servidor. Para ello tenemos que parsear la respuesta XML y buscar el elemento <token> para leer su contenido. Hay varias maneras de hacer esto, y parece que la más adecuada para esta aplicación es utilizar Linq to XML (que nos abstrae del XML en sí, y nos da acceso fácil al contenido), pero al menos una vez en la vida hay que parsear una cadena de texto a mano, así que en esta entrada utilizaré un objeto XmlTextReader para leer secuencialmente el XML hasta encontrar la información que buscamos (supuestamente ésta es la manera más rápida de parsear un archivo XML, así que no está de más conocerla por si en algún momento Linq es demasiado pesado cuando tengamos miles de tareas en nuestro Toodledo).

Hay que tener en cuenta que nos encontraremos una linea de información de la versión del xml, que no vamos a utilizar por ahora. Y a partir de ahí, ir leyendo hasta que encontremos un elemento que tenga el nombre esperado (token en este caso). Llegados a este punto, sacamos el contenido y salimos del bucle.

Fácil, ¿no?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private string getXmlValue(string _xml,string _element)
{
string result="";
XmlTextReader textReader = new XmlTextReader(new System.IO.StringReader(_xml));
textReader.WhitespaceHandling = WhitespaceHandling.None;
while (textReader.Read())
{
if(textReader.NodeType == XmlNodeType.Element && textReader.Name == _element)
{
result = textReader.ReadElementContentAsString();
break;
}
else

{
// Avoid parsing the xml definition, as it does not have closing element
 if (textReader.NodeType != XmlNodeType.XmlDeclaration)
{
if (!textReader.ReadToFollowing(_element)) break;
}
}
}
return result;
}

[Método visto (entre otros lugares) aquí.]

De este modo, pasando nuestra nueva función la cadena que nos devolvió Toodledo, ya tendríamos el token que utilizaremos para generar la clave de autenticación para acceder a nuestras tareas.

1
2
3
string respuesta = "<?xml version='1.0' encoding='UTF-8'?>\n<token>bar</token>"

string token=getXmlValue(respuesta,"token");

Y ya tendríamos token= “bar” :D

Nota aclaratoria: Esta serie de artículos no pretenden ser un manual sobre cómo escribir una aplicación real. Son sólo una prueba de concepto, una serie de notas y trozos de código ineficientes, posiblemente incorrectos, sin comprobación de errores y potencialmente peligrosos para la integridad de vuestra tostadora. Usar con precaución. No me hago responsable de lo que ocurra si tratáis si quiera de compilar este código.

Si realmente queréis hacer una aplicación de este tipo, un buen punto de partida sería utilizar la API sharpgtd de Doug Reichard (que probablemente sea lo que yo haga pronto :)

Peticiones http desde windows mobile con c#

Jueves, octubre 21st, 2010

Estoy considerando empezar a utilizar algún servicio de gestión de tareas en la nube, para probar de una vez por todas el método GTD. Mis mejores candidatos son Remember The Milk y Toodledo, pero ya que ninguno ofrece una manera adecuada (por un motivo u otro) de sincronizar las tareas con un dispositivo con Windows Mobile, estoy considerando hacerme yo mismo el programa que lo haga, que tampoco parece muy complicado…

Probaré con Toodledo para empezar, ya que su API me ha parecido más amigable.

El primer paso será poder enviar peticiones y recibir las respuestas del servidor, que tanto en RTM como en Toodledo son XML. Os dejo un pequeño pseudo-código que hace justo eso:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.IO;
using System.Net;
using System.Text;

string res="";
string userID = "foo";
string req = "http://api.toodledo.com/api.php?method=getToken;userid=" + userID;

// Create the request
WebRequest request = WebRequest.Create(req);
// If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials;
// Get the response.
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
// Display the status.
textBox1.Text=response.StatusDescription;
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream ();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader (dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd ();
// Display the content.
res=responseFromServer;
// Cleanup the streams and the response.
reader.Close ();
dataStream.Close ();
response.Close ();

return res;

En este ejemplo enviamos a Toodledo la petición del token de identificación asociado a nuestro usuario “foo”, y si todo ha ido bien tendremos en la variable “res” la respuesta del servidor, que será algo así:

1
<?xml version="1.0" encoding="UTF-8"?><token>bar</token>

Otro día intentaré interpretar el XML y sacar el valor que nos interesa: “bar”.

Encontrado aquí

Sí, lo sé, soy un insensato :D

Ocultando contactos SIM con un temporizador

Domingo, noviembre 29th, 2009

Windows Mobile 6.1 tiende a mostrar en la agenda tanto los contactos de la agenda del teléfono como los almacenados en la tarjeta SIM. Y digo tiende porque a menudo nos encontramos que los muestra aún habiendo configurado el sistema para que los oculte.

Mientras que los contactos de la agenda del teléfono pueden almacenar varios números de teléfono, direcciones de correo electrónico y web, direcciones postales y demás datos interesantes, los contactos de la SIM sólo pueden almacenar nombre y número de teléfono, lo que los hace mucho menos útiles. Siempre tenemos la opción de borrarlos de la tarjeta SIM, pero si nuestro terminal sufre un percance o se queda sin batería en un momento importante, podría ser útil tener algunos contactos importantes en la SIM.

Así que la mejor solución pasa por ocultarlos. Esto puede hacerse con unos cuantos programas disponibles en la red, que generalmente lo que hacen es poner un cero en la clave de registro “HKCU\ControlPanel\Phone\ShowSIM” (Si no sabes de lo que estoy hablando… mejor no toques nada en el registro).

El problema surge porque en algunos terminales, este valor se pone a 1 (mostrando los contactos de la SIM) automágicamente en algún momento del arranque, así que aunque instalemos un programa que lo pone a 0 tras hacer un soft-reset, a menudo nos encontramos conque no ha funcionado y los contactos de la SIM vuelven a estar ahí… Mal.

¿Una posible solución? Hacer un programa que vuelve a poner el ShowSIM a 0, pero esta vez con un retardo, 120 segundos por ejemplo, de este modo esquivamos el problema y a los dos minutos desde el arranque se ocultarán los contactos que no queremos ver… Fácil, ¿no?

Ya hay un par de programas por ahí que hacen algo así, pero en realidad es algo relativamente sencillo y tenía ganas de aprender a hacer programas “de consola” para windows mobile, así que… Ahí va algo de código experimental, por si os interesa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Threading; // To Sleep
using System.Runtime.InteropServices;  // For dllimport
using Microsoft.Win32; // For Registry access :-)

namespace pimhider
{
    class Program
    {
        [DllImport("coredll.dll")]
        public static extern IntPtr SetCursor(IntPtr hCursor);
        static void Main(string[] args)
        {
           
            IntPtr hOldCursor = SetCursor(IntPtr.Zero); // Hide the "waiting" cursor
            Thread.Sleep(120*1000); // Sleep for some time
            String regPath = Registry.CurrentUser + "\\ControlPanel\\Phone\\";
            Registry.SetValue(regPath, "ShowSIM", 0); // And hide the contacts!
        }
    }
}

En mi teléfono funciona, pero no me hago responsable de que en otro lo haga, o de que le pasen cosas malas al terminal o incluso a la tostadora. Usar con precaución ;-)

Write text to file in C#

Martes, octubre 20th, 2009

To write a text in a file in windows mobile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Text;
using System.IO;

{
  StreamWriter tw = null;
  string log_name = "\\foo.txt";
  string st_toFile = "bar";
  tw = new StreamWriter(log_name);
  tw.WriteLine(st_toFile);
  if (tw != null)
  {
    tw.Flush();
    tw.Close();
  }
}

Remember catching possible errors if output directory doesn’t exist!

Nueva sección: “Code snippets”

Lunes, agosto 24th, 2009

Es decir, pequeños trozos de código que voy escribiendo o encontrando por ahí, y que iré colgando aquí a modo de portapapeles permanente, para recordar funciones o algoritmos que pueden serme (o a mis visitantes) útiles de nuevo más adelante…

1
2
3
4
5
6
7
#include <iostream>

int main(int argc, char* argv[])
{
  cout << "Hello World!" << endl;
  return 0;
}

He barajado también utilizar alguno de los servicios que hay online que hacen justo esto. Pero, ya que al final yo siempre acabo acudiendo a un buscador general para encontrar trozos de código que necesite, creo que por ahora es mejor idea guardar mis snippets en el blog.

Eso sí, me temo que el mundo de la programación funciona en inglés, así que probablemente en esta sección la mayor parte de las entradas (si no todas) estarán en inglés, principalmente para hacerlas más accesibles a quien pueda buscarlas a través de un buscador.

Por cierto, en principio voy a utilizar el plugin CodeColorer para colorear automágicamente las líneas de código.