Leyendo XML con c#

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#

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

HP Photosmart Wireless b109n-z

septiembre 2nd, 2010

Sí, al contrario de lo que pone en la página de drivers para linux de HP, es posible comunicarse con la HP Photosmart Wireless b109n-z a través de una red inalámbrica desde Linux :D

Conseguirlo es realmente fácil, tan sólo hay que instalar la aplicación HPLIP y seguir las instrucciones, desde Debian (Squeeze):

1
aptitude install hplip hplip-gui

Una vez instalado HPLIP, lanzamos (como root) la aplicación para instalar la impresora: hp-setup. El asistente nos irá guiando, y si queremos acceder a la impresora por wifi nos pedirá que la conectemos por USB temporalmente para configurar la red y demás… El proceso no tiene pérdida, y una vez finalizado podremos escanear a través de XSane e imprimir a través de Cups, todo ello de forma inalámbrica :D

Feliz verano

julio 20th, 2010

¿Os habéis suscrito ya al feed en momentaneafoto.com? Las entradas sobre fotografía irán progresivamente apareciendo sólo por allí. Pero por ahora… Feliz verano :-)

Feliz verano

Recuperar el sonido tras suspensión

julio 12th, 2010

Acabo de descubir que al poner en suspensión mi Compaq mini 110 (con Debian Squeeze), y volver a despertarlo, el sonido no funciona… Una búsqueda rápida en Google y encuentro el siguiente script que se encarga de detener los servidores de sonido antes de entrar en suspensión, y levantar todo de nuevo al despertar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function kill_sound_apps() {
pidsnd=$(lsof | grep /dev/snd | awk '{ print $2 }')
pidmixer=$(lsof | grep /dev/mixer | awk '{ print $2 }')
piddsp=$(lsof | grep /dev/dsp | awk '{ print $2 }')
kill $pidsnd $pidmixer $piddsp
}

case "$1" in
hibernate|suspend)
kill_sound_apps
echo `date` shut down sound for pm
;;
thaw|resume)
modprobe -r snd_hda_intel
modprobe snd_hda_intel
echo `date` starting sound coming out of pm
;;
*)
;;
esac

exit $?

Para hacerlo funcionar sólo hay que meterlo en /etc/pm/sleep.d/49sound, y darle permisos de ejecución con un chmod 755

Y, al menos en mi caso, con eso es suficiente :D

En ese foro sugieren una mejora, que probaré otro día…