miércoles, abril 11, 2007

Lo prometido es deuda

Después de una completa reingeniería del midlet (aplicando correctamente el patrón observador sobre el módulo de conexión, vuelvo a la carga con un poco de documentación). Como anotación a los cambios realizados, indico que ahora, el módulo de conexion, cada vez que abre un socket, crea un thread dedicado a este, y no son los managers de almacenado los que se encargan de crerlo. Cuando en uno de estos threads se genera un evento, se dispara, y se avisa a todos los listers del módulo de conexion. Un lujazo, vamos xD.

La idea para postear en los foros de moodle, como ya he comentado con anterioridad, reside en simular el comportamiento de un navegador web, al enviar un formulario HTML.

Para postear en un foro, necesitamos, en primer lugar, hacer login correctamente, y luego, conocer todos los datos necesarios para poder enviar al método Post.PHP todo lo que necesita para colgar algo en un thread, es decir, curso, id del foro, id del thread, padre del thread (el mismo que el anterior, si queremos contestar a un tema de discusión y no a una respuesta de alguien), id del usuario, y por último, el título del post, y su contenido (por el momento, aparcamos el tema de añadir attachs y cosas por el estilo ;) ).

El proceso, sería más o menos el que sigue:
    1. Obtener cookies de sesión (abriendo una conexión al servidor de moodle, para que nos envíe las cookies correspondientes), las almacenamos, y lanzamos un evento de conexión indicandolo a todos nuestros listeners.

    2. Recogemos el evento desde el módulo deseado, e iniciamos la acción de hacer login, añadiendo a la cabecera del socket las propiedades necesarias (content-type, cookies, etc...) y configurándolo como post. Una vez establecida la conexión, enviamos por el outputStream el username y el password de nuestro usuario.

    3. Añadimos la cookie de id que nos retorna el servidor mediante el inputStream a nuestro repositorio (y es esta, además de la de sesión la que usaremos para posteriores conexiones...). Lanzamos un evento que notifique de esto a todos nuestros listeners.
- Ahora ya estamos logueados correctamente en el servidor, y tenemos acceso a cualquier zona. Para contestar al thread deseado, necesitamos, como he mencionado con anterioridad, una serie de campos. Estos, serán enviados por Post al método POST.php del módulo de los foros de moodle.


    4. Recogemos el evento generado por el módulo de conexión que indica que ya estamos logeados, y abrimos un socket con llamada al método post.php del módulo de los foros de moodle, configurado como Post, y con la cabecera adecuadamente configurada (Content-type, User-Agent, cookies, etc...). Enviamos por el OutputStream un mensaje con todos los campos que se generarian en el formulario HTML que moodle usa para contestar a los foros. Es decir, algo como lo que sigue "course=2&forum=1&discussion=3&parent=3&userid=3&subject=Hola&message=Hola, este mensaje se ha enviado desde un midlet." enviaría el mensaje ("Hola","Hola, este...") como respuesta del usuario 3 al thread 3 del foro 1 del curso 2 de un moodle.



Y en principio, esto es todo. Añadiré unas pantallas que certifiquen que esto funciona. Pero ahora el problema reside en, cómo obtener todos los datos necesarios de un thread para poder contestar... podria parsear el link que contiene el fichero rss, pero sería algo muy muy chapucero. La id del usuario me la puede proporcionar el webservice. El resto... a ver que me propone Marc...

viernes, marzo 30, 2007

El POSTing vía http, un poco menos misterioso que ayer (Suena "Just like you imagined", de Nine Inch Nails)

Pues eso, resuelto el posting http a los foros de moodle: simple (y no tanto, en realidad). El secreto reside en simular el comportamiento de un navegador convencional, en lo que al tratamiento de las cabeceras http se refiere (cookies, sesion, contenido, etc...), y en añadir al cuerpo de la petición http los campos que necesita la función post.php de los foros de moodle (se trata de ojear el código html de la página que te envía el moodle cuando quieres contestar a un thread, y observar los campos que contiene el formulario html).

Tan fácil, y tan complicado.... Cuando pensaba que gracias al webservice de ori&alex me iba a librar de todo esto, pam! Resulta que vuelvo a necesitar el repositorio de cookies que implementé hace algun tiempo... qué cosas...

Este fin de semana, si tengo tiempo, trabajaré en una documentación detallada donde se explique cómo realizar el proceso.

Hasta entonces, agur, os dejo con otra joya de NIN

miércoles, marzo 07, 2007

Primer release del cliente

A continuación adjunto una pre-pre-pre release de mobilemoodle.
Tiene algunos bugs... pero bueno, en principio, funciona con cualquier moodle con la nwiki 1.5+ instalado (y con el webservicelib php del dfwikit

jueves, febrero 15, 2007

Posteando voy... posteando vengo vengo...
  • POST /crom/mod/forum/post.php HTTP/1.1
  • Host: morfeo.upc.es
  • User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9
  • Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
  • Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
  • Accept-Encoding: gzip,deflat
  • Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  • Keep-Alive: 300
  • Connection: keep-alive
  • Referer: http://morfeo.upc.es/crom/mod/forum/post.php?reply=578
  • Cookie: __utmz=259079446.1171562739.3.3.utmccn=(referral)|utmcsr=morfeo.upc.edu|utmcct=/crom/|utmcmd=referral; __utma=259079446.2102471737.1170793834.1171559297.1171562739.3; MoodleSessioncrom=7328cb07cb18d8f8ca26abac0d7d2fa0; MoodleSessionTestcrom=p38BEjofU0; __utmb=259079446; __utmc=259079446; MOODLEID_crom=%25E9%25C3%250DI%25B2o
  • Content-Type: multipart/form-data; boundary=---------------------------185001198021420
  • Content-Length: 1702
  • -----------------------------185001198021420
  • Content-Disposition: form-data; name="subject"
  • Re: webservice + appserv = no va!
Y esto es la cabecera + parte del contenido de un reply a un post de los foros de moodle... casi ná...
Mucho más simple es añadir algunos métodos al webservicelib, para que permita hacer post... luego seria sencillo pasarle un xml con los datos para que él haga el insert en la bbdd... Pero para todo esto, el webservice se tendria q pasar al modulo "forum".

Y aqui estan las capturas de pantalla de la demo del proyecto, así como una breve exposición de sus funcionalidades:

Login
  • Esta es la pantalla de login. Se envía al webservice de login (la dirección del webservice será una constante, simplemente deberemos especificar la dirección del servidor: si deseamos cambiarla, seleccionar la opción dedicada a ello) el login especificado, y un MD5-hash del password.


Welcome

  • Cuando hacemos login con éxito, aparecerá una pantalla que nos lo hará saber, y nos dará la bienvenida a la aplicación.


Menu
  • Después, accedemos al menú principal de la aplicación. Desde aquí, podemos acceder a las diferentes funcionalidades de la aplicación.


Profile
  • Detalle del perfil del usuario.


Feedlist
  • RSS feeds del usuario cargado. Los feeds aún no se han descargado (si es que no se habían descargado con anterioridad); el propio perfil de usuario contiene una serie de enlaces a los foros de los cursos a los que está subscrito.


Threads
  • Lista de los threads que contiene el feed seleccionado (en este caso, el feed titulado "Nasa"). Cuando seleccionamos un feed de la lista anterior, forzamos su descarga (si es que no se encontraba almacenado ya). El feed se descarga, parsea y se pasa del juego de carácteres UTF-8 al estándar.


Geminidas
  • Ésta es la ventana donde se muestra el contenido de un thread. El título del thread aparece en el título de la ventana, y su fecha de publicación (si es que el RSS contiene tal información) aparece en el campo "Date".


UserFiles
  • Por último, ésta es la ventana de gestión de los ficheros de un usuario. Si éste dispone de ficheros descargados (correspondientes a feeds, o a su perfil de usuario, por ejemplo), desde aquí puede forzar su actualización, e incluso borrarlos.



miércoles, febrero 07, 2007

Reunión de la segunda temporada (xD, como prison break!)

Como andaba sospechando, se requiere que conteste a los post de los foros (supongo que la solución pasa por añadir algunos métodos al webservice de ori -camarero, una de php!)...

Menos mal que en su día se me ocurrió implementar el método UTFencode... al final parece que me va a resultar útil y todo :P

Y por lo visto, trabajar con los forms para las interficies gráficas resulta lo más razonable...

  • Tareas pendientes: añadir al cvs de la farga los archivos de mi proyecto, así como hecharle un vistazo y añadir algo de información a la wiki de crom's lair.
  • Observar cómo se hace post a los foros de moodle.... (ethereal, i luv u)
Ale, a currar 1pokito...