# -*- coding: cp1252 -*-
# Demo de los servicios Copiagenda y MensajeriaMultimediaWeb.
#
# Características:
# * Implementación de clase para recuperar la agenda de contactos.
# * Implementación de clase para enviar un mensaje por web.
# * Uso de un diálogo con un control ListCtrl.


import sys
if "--noxp" in sys.argv:
    import win32gui
else:
    import winxpgui as win32gui
import win32api
import win32con
import struct, array
import commctrl
import Queue
import os

import win32gui_struct

import httplib, urllib, urlparse

import tkFileDialog

IDC_LOGIN = 1024
IDC_PASSWORD = 1025
IDC_ASUNTO = 1026
IDC_MENSAJE = 1027
IDC_PATH_IMAGEN = 1028
IDC_BUTTON_IMAGEN = 1029
IDC_PATH_AUDIO = 1030
IDC_BUTTON_SONIDO = 1031
IDC_PATH_VIDEO = 1032
IDC_BUTTON_VIDEO = 1033
IDC_DESTINATARIO = 1034
IDC_BUTTON_ENVIO = 1035

g_registeredClass = 0

g_iconPathName = os.path.abspath(os.path.join( os.path.split(sys.executable)[0], "C:\\Python25\\DLLs\\pyc.ico" ))
if not os.path.isfile(g_iconPathName):
    # Buscamos en el árbol del código.
    g_iconPathName = os.path.abspath(os.path.join( os.path.split(sys.executable)[0], "..\\PC\\pyc.ico" ))
    if not os.path.isfile(g_iconPathName):
        print "No se encuentra el icono"
        g_iconPathName = None

class _WIN32MASKEDSTRUCT:
    def __init__(self, **kw):
        full_fmt = ""
        for name, fmt, default, mask in self._struct_items_:
            self.__dict__[name] = None
            if fmt == "z":
                full_fmt += "pi"
            else:
                full_fmt += fmt
        for name, val in kw.items():
            if not self.__dict__.has_key(name):
                raise ValueError, "La estructura LVITEM no tiene un elemento '%s'" % (name,)
            self.__dict__[name] = val

    def __setattr__(self, attr, val):
        if not attr.startswith("_") and not self.__dict__.has_key(attr):
            raise AttributeError, attr
        self.__dict__[attr] = val

    def toparam(self):
        self._buffs = []
        full_fmt = ""
        vals = []
        mask = 0
        # Calculamos la máscara
        for name, fmt, default, this_mask in self._struct_items_:
            if this_mask is not None and self.__dict__.get(name) is not None:
                mask |= this_mask
        self.mask = mask
        for name, fmt, default, this_mask in self._struct_items_:
            val = self.__dict__[name]
            if fmt == "z":
                fmt = "Pi"
                if val is None:
                    vals.append(0)
                    vals.append(0)
                else:
                    str_buf = array.array("c", val+'\0')
                    vals.append(str_buf.buffer_info()[0])
                    vals.append(len(val))
                    self._buffs.append(str_buf)
            else:
                if val is None:
                    val = default
                vals.append(val)
            full_fmt += fmt
        return apply(struct.pack, (full_fmt,) + tuple(vals) )

class MMSWindow:

    MiAgenda = []
    
    def __init__(self):
        win32gui.InitCommonControls()
        self.hinst = win32gui.dllhandle

    def _RegisterWndClass(self):
        className = "MultienvioSMS"
        global g_registeredClass
        if not g_registeredClass:
            message_map = {}
            wc = win32gui.WNDCLASS()
            wc.SetDialogProc() # Creamos una clase de diálogo.
            wc.hInstance = self.hinst
            wc.lpszClassName = className
            wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW
            wc.hCursor = win32gui.LoadCursor( 0, win32con.IDC_ARROW )
            wc.hbrBackground = win32con.COLOR_WINDOW + 1
            wc.lpfnWndProc = message_map # También se podría especificar una función WndProc.
            wc.cbWndExtra = win32con.DLGWINDOWEXTRA + struct.calcsize("Pi")
            icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
            wc.hIcon = win32gui.LoadImage(self.hinst, g_iconPathName, win32con.IMAGE_ICON, 0, 0, icon_flags)
            classAtom = win32gui.RegisterClass(wc)
            g_registeredClass = 1
        return className

    def _GetDialogTemplate(self, dlgClassName):
        style = win32con.WS_POPUP | win32con.WS_VISIBLE | win32con.WS_CAPTION | win32con.WS_SYSMENU | win32con.DS_SETFONT | win32con.WS_MINIMIZEBOX
        cs = win32con.WS_CHILD | win32con.WS_VISIBLE
        title = "Envío MMS"

        # Marco y título de la ventana
        dlg = [ [title, (0, 0, 209, 228), style, None, (8, "MS Sans Serif"), None, dlgClassName], ]

        # Cajas de texto estático
        dlg.append([130, "Usuario", -1, (7, 10, 25, 8), cs | win32con.SS_LEFT])
        dlg.append([130, "Clave", -1, (87, 10, 19, 8), cs | win32con.SS_LEFT])
        dlg.append([130, "Para:", -1, (7, 187, 18, 8), cs | win32con.SS_LEFT])
        dlg.append([130, "Asunto:", -1, (7, 29, 25, 8), cs | win32con.SS_LEFT])
        dlg.append([130, "Imagen", -1, (15, 118, 24, 8), cs | win32con.SS_LEFT])
        dlg.append([130, "Audio", -1, (15, 138, 19, 8), cs | win32con.SS_LEFT])
        dlg.append([130, "Vídeo", -1, (15, 158, 20, 8), cs | win32con.SS_LEFT])
        dlg.append([128, "Adjuntos", -1, (7, 106, 195, 70), cs | win32con.BS_GROUPBOX])
        
        # Controles de edición
        # Login y password
        dlg.append(['EDIT', None, IDC_LOGIN, (37, 7, 41, 12), cs | win32con.WS_TABSTOP | win32con.WS_BORDER | win32con.ES_NUMBER])
        dlg.append(['EDIT', None, IDC_PASSWORD, (151, 7, 51, 12), cs | win32con.WS_TABSTOP | win32con.WS_BORDER | win32con.ES_PASSWORD])
        # Asunto del mensaje
        dlg.append(['EDIT', None, IDC_ASUNTO, (40, 27, 162, 12), cs | win32con.WS_TABSTOP | win32con.WS_BORDER])
        # Texto del mensaje
        dlg.append(['EDIT', "Escribe aquí el texto del mensaje", IDC_MENSAJE, (7, 48, 195, 48), cs | win32con.WS_TABSTOP | win32con.WS_BORDER | win32con.ES_MULTILINE])

        # Paths y botones de los adjuntos
        dlg.append(['EDIT', None, IDC_PATH_IMAGEN, (48, 116, 130, 12), cs | win32con.WS_TABSTOP | win32con.WS_BORDER])
        dlg.append([128, "...", IDC_BUTTON_IMAGEN, (182, 115, 13, 14), cs | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
        dlg.append(['EDIT', None, IDC_PATH_AUDIO, (48, 136, 130, 12), cs | win32con.WS_TABSTOP | win32con.WS_BORDER])
        dlg.append([128, "...", IDC_BUTTON_SONIDO, (182, 135, 13, 14), cs | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])
        dlg.append(['EDIT', None, IDC_PATH_VIDEO, (48, 156, 130, 12), cs | win32con.WS_TABSTOP | win32con.WS_BORDER])
        dlg.append([128, "...", IDC_BUTTON_VIDEO, (182, 155, 13, 14), cs | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])

        # Destinatario (número de teléfono o email)
        dlg.append(['EDIT', None, IDC_DESTINATARIO, (40, 185, 162, 12), cs | win32con.WS_TABSTOP | win32con.WS_BORDER])

        # Botón de Envío
        dlg.append([128, "Enviar", IDC_BUTTON_ENVIO, (7, 207, 195, 14), cs | win32con.WS_TABSTOP | win32con.BS_PUSHBUTTON])

        return dlg

    def _DoCreate(self, fn):
        message_map = {
            win32con.WM_COMMAND: self.OnCommand,
            win32con.WM_INITDIALOG: self.OnInitDialog,
            win32con.WM_CLOSE: self.OnClose,
            win32con.WM_DESTROY: self.OnDestroy
        }
        dlgClassName = self._RegisterWndClass()
        template = self._GetDialogTemplate(dlgClassName)
        return fn(self.hinst, template, 0, message_map)

    def OnInitDialog(self, hwnd, msg, wparam, lparam):
        self.hwnd = hwnd
        # Centramos el diálogo en la pantalla
        desktop = win32gui.GetDesktopWindow()
        l,t,r,b = win32gui.GetWindowRect(self.hwnd)
        dt_l, dt_t, dt_r, dt_b = win32gui.GetWindowRect(desktop)
        centre_x, centre_y = win32gui.ClientToScreen( desktop, ( (dt_r-dt_l)/2, (dt_b-dt_t)/2) )
        win32gui.MoveWindow(hwnd, centre_x-(r/2), centre_y-(b/2), r-l, b-t, 0)
        l,t,r,b = win32gui.GetClientRect(self.hwnd)

    def OnCommand(self, hwnd, msg, wparam, lparam):
        id = win32api.LOWORD(wparam)

        if id == IDC_BUTTON_ENVIO:
            # Obtenemos el login del usuario
            loginhwnd = win32gui.GetDlgItem(self.hwnd, IDC_LOGIN)
            login = win32gui.GetWindowText(loginhwnd)

            # Obtenemos la password del usuario
            password = win32gui.GetDlgItem(self.hwnd, IDC_PASSWORD)
            pwd = win32gui.GetWindowText(password)

            # Obtenemos el asunto del mensaje
            subjectHwnd = win32gui.GetDlgItem(self.hwnd, IDC_ASUNTO)
            subject = win32gui.GetWindowText(subjectHwnd)

            # Obtenemos el texto del mensaje
            msgHwnd = win32gui.GetDlgItem(self.hwnd, IDC_MENSAJE)
            msg = win32gui.GetWindowText(msgHwnd)

            # Obtenemos el número del destinatario
            destHwnd = win32gui.GetDlgItem(self.hwnd, IDC_DESTINATARIO)
            dest = win32gui.GetWindowText(destHwnd)

            if dest != "" :
                sender=MensajeriaMultimediaWeb()
                user = sender.Login(login, pwd)

                if user != '' :
                    imagenHwnd = win32gui.GetDlgItem(self.hwnd, IDC_PATH_IMAGEN)
                    imagen = win32gui.GetWindowText(imagenHwnd)
                    if imagen != '' :
                        imagenPartes = imagen.split('\\')
                        sender.InsertaImagen(imagenPartes[-1].replace('.','_'),imagen)

                    audioHwnd = win32gui.GetDlgItem(self.hwnd, IDC_PATH_AUDIO)
                    audio = win32gui.GetWindowText(audioHwnd)
                    if audio != '' :
                        audioPartes = audio.split('\\')
                        sender.InsertaAudio(audioPartes[-1].replace('.','_'),audio)

                    videoHwnd = win32gui.GetDlgItem(self.hwnd, IDC_PATH_VIDEO)
                    video = win32gui.GetWindowText(videoHwnd)
                    if video != '' :
                        videoPartes = video.split('\\')
                        sender.InsertaVideo(videoPartes[-1].replace('.','_'),video)

                    print "Enviando mensaje a " + dest
                    sender.EnviaMensaje(subject, dest, msg)
                    user = sender.Logout()
                else :
                    print 'Login no realizado'

        elif id == IDC_BUTTON_IMAGEN :
            openfilename=tkFileDialog.askopenfilename(title='Seleccionar imagen', filetypes=[("Imágenes", "*.gif *.jpg *.jpeg *.png *.bmp")])
            if openfilename != '' :
                openfilename = openfilename.replace('/', '\\')
                hwnd = win32gui.GetDlgItem(self.hwnd, IDC_PATH_IMAGEN)
                win32gui.SetWindowText(hwnd, openfilename)

        elif id == IDC_BUTTON_SONIDO :
            openfilename=tkFileDialog.askopenfilename(title='Seleccionar archivo de audio', filetypes=[("Archivos de audio", "*.mid *.wav *.mp3")])
            if openfilename != '' :
                openfilename = openfilename.replace('/', '\\')
                hwnd = win32gui.GetDlgItem(self.hwnd, IDC_PATH_AUDIO)
                win32gui.SetWindowText(hwnd, openfilename)

        elif id == IDC_BUTTON_VIDEO :
            openfilename=tkFileDialog.askopenfilename(title='Seleccionar archivo de vídeo', filetypes=[("Archivos de vídeo", "*.avi *.asf *.mpg *.mpeg *.wmv")])
            if openfilename != '' :
                openfilename = openfilename.replace('/', '\\')
                hwnd = win32gui.GetDlgItem(self.hwnd, IDC_PATH_VIDEO)
                win32gui.SetWindowText(hwnd, openfilename)

    # These function differ based on how the window is used, so may be overridden
    def OnClose(self, hwnd, msg, wparam, lparam):
        raise NotImplementedError

    def OnDestroy(self, hwnd, msg, wparam, lparam):
        pass

class MensajeriaMultimediaWeb :

    login = ''
    user = ''
    sk = ''
    cookie = ''
    server = 'www.multimedia.movistar.es'

    def Login(self, login, pwd) :
        """Realiza el login al servicio MMS
            Entrada:  login=cadena con el numero de telefono,
                      pwd=cadena con el password de acceso a la web"""

        print 'Iniciando Login... (http://' + self.server + '/)'

        # Intentamos entrar en www.multimedia.movistar.es para que nos diga a cual tenemos que ir
        headers = {"User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive"}
        conn=httplib.HTTPConnection(self.server)
        conn.request ("GET", "/", None, headers)
        resp=conn.getresponse()
        if resp.status == 302 :
            respuesta=resp.read()

            ## Nos redirecionan (imagino que al servidor con menos carga)
            location = ''
            headresp=resp.getheaders()
            for n in headresp :
                if n[0] == 'location' :
                    location = n[1]

            print resp.status, ' => ', location
            components = urlparse.urlsplit(location)
            server = components[1]
            self.server = server

        self.login = login

        # Enviamos los datos de login
        params = urllib.urlencode ({'source': 'olduid', 'TM_ACTION': 'LOGIN', 'TM_LOGIN': self.login, 'TM_PASSWORD': pwd})
        headers = {"Content-type":"application/x-www-form-urlencoded", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive"}
        conn=httplib.HTTPConnection(self.server)
        conn.request ("POST", "/login", params, headers)
        resp=conn.getresponse()
        if resp.status == 302 :
            respuesta=resp.read()

            ## Nos redirecionan y nos dan una cookie (la necesitaremos para las peticiones posteriores)
            location = ''
            cookie = ''
            headresp=resp.getheaders()
            for n in headresp :
                if n[0] == 'location' :
                    location = n[1]
                elif n[0] == 'set-cookie' :
                    cookie = n[1]

            print resp.status, ' => ', location
            components = urlparse.urlsplit(location)
            server = components[1]
            path = components[2]

            cookieList = cookie.split(';')
            cookie = cookieList[0]  # Usamos la primera parte de la lista porque después vienen las condiciones
            self.cookie = cookie
            print '\tCookie: ' + self.cookie

            # Tenemos que conservar los valores uid y sk para el resto de las peticiones
            variables = components[3].split('&')
            for n in variables :
                lista = n.split('=')
                if lista[0] == 'uid' :
                    self.user = lista[1]
                elif lista[0] == 'sk' :
                    self.sk = lista[1]
                elif lista[0] == 'error' :
                    print 'Se ha producido un error (' + lista[1] + ')'

            print '\tuid: ' + self.user
            print '\tsk: ' + self.sk

            if self.user != '' :
                params2 = urllib.urlencode ({'sk': self.sk, 'uid': self.user, 'source': '', 'olduid': ''})
                headers2 = {"Accept": "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive","Cookie" : self.cookie}
                conn2=httplib.HTTPConnection(server)
                conn2.request ("GET", '/main/?'+params2, None, headers2)
                resp2=conn2.getresponse()

                if resp2.status == 200 :
                    params3 = urllib.urlencode ({'uid': self.user, 'sk': self.sk})
                    headers3 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive","Cookie" : self.cookie}
                    conn3=httplib.HTTPConnection(self.server)
                    conn3.request("GET", '/compose/send?'+params3, None, headers3)
                    resp3=conn3.getresponse()
                    status3 = resp3.status
                    respuesta3=resp3.read()

                    conn3.close()

                conn2.close()

        conn.close()
        return self.user

    def InsertaImagen(self, nombreObj, pathObj) :
        """Inserta un objeto en el mensaje MMS
            Entrada:  nombreObj=cadena con el nombre del objeto,
                      pathObj=cadena con el path local del archivo"""

        listaContentType = {'gif': 'image/gif', 'jpg': 'image/pjpeg', 'jpeg': 'image/pjpeg', 'png': 'image/x-png', 'bmp': 'image/bmp'} # en principio sólo enviaremos estos tipos
        path = pathObj.split('.')
        extension = path[-1] # usando números negativos recorremos la lista en orden inverso (el elemento -1 es el último)
        contentType = listaContentType[extension]

        print 'Insertando imagen...'

        params2 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'folderid': '', 'uploadtofolder': 'false', 'foldertype': '1', 'rnd': '74065'})
        referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=1'
        headers2 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
        conn2=httplib.HTTPConnection(self.server)
        conn2.request("GET", '/folders/upload_frame?' + params2, None, headers2)
        resp2=conn2.getresponse()

        if resp2.status == 200 :

            separador="---------------------------7d77df567a4b9"

            # generamos los datos del objeto
            userPart = '--' + separador + '\r\nContent-Disposition: form-data; name="user"\r\n\r\n34' + self.login + '\r\n'
            limitPart = '--' + separador + '\r\nContent-Disposition: form-data; name="limit"\r\n\r\n307200\r\n'

            urlReturn = 'http://' + self.server + '/folders/upload_close?uid=' + self.user + '&sk=' + self.sk + '&uploadtofolder=false'
            urlReturnPart = '--' + separador + '\r\nContent-Disposition: form-data; name="url_return"\r\n\r\n' + urlReturn +'\r\n'

            namePart = '--' + separador + '\r\nContent-Disposition: form-data; name="name"\r\n\r\n' + nombreObj + '\r\n'
            filenamePart = '--' + separador + '\r\nContent-Disposition: form-data; name="filename"; filename="' + pathObj + '"\r\nContent-Type: ' + contentType + '\r\n\r\n'

            final = '\r\n--' + separador + '--\r\n'

            f=open(pathObj, 'rb')
            contenido = f.read()
            f.close()
            data = userPart + limitPart + urlReturnPart + namePart + filenamePart + contenido + final

            # es necesario crear la cabecera Referer con los parámetros de la petición anterior
            referer = 'http://' + self.server + '/folders/upload_frame?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=1&rnd=74065'

            contentType = "multipart/form-data; boundary="+separador
            headers = {"Content-type": contentType, "Accept-Language": "es", "Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Accept-Encoding": "gzip, deflate", "Cache-Control": "no-cache", "Cookie": self.cookie, "Referer": referer}

            conn=httplib.HTTPConnection(self.server)
            conn.request ("POST", "/mas/messaging_as/temporalcontentservlet", data, headers)
            resp=conn.getresponse()
            respuesta = resp.read()

            # Tenemos que recibir la cabecera oid con el identificador del objeto insertado
            oid = ''
            headresp=resp.getheaders()
            for n in headresp :
                if n[0] == 'oid' :
                    oid = n[1]
            print '\toid: ' + oid

            if oid != '' :
                print '\tImagen insertada'
                params3 = urllib.urlencode ({'uploadtofolder': 'false', 'uid': self.user, 'sk': self.sk, 'status': 'success', 'oid': oid})
                referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=1'
                headers3 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
                conn3=httplib.HTTPConnection(self.server)
                conn3.request("GET", '/folders/upload_close?' + params3, None, headers3)
                resp3=conn3.getresponse()

                conn3.close()

                params4 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'slide_num': '1', 'function_name': 'img', 'value': oid})
                referer = 'http://' + self.server + '/compose?uid=' + self.user + '&sk=' + self.sk + '&fr=ns&pathstring=+:+Env%EDo+Mensaje+MultiMedia&adultcheckparam=no'
                headers4 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
                conn4=httplib.HTTPConnection(self.server)
                conn4.request("GET", '/compose/ms?' + params4, None, headers4)
                resp4=conn4.getresponse()

                conn4.close()

            conn.close()

        conn2.close()

    def InsertaAudio(self, nombreObj, pathObj) :
        """Inserta un objeto en el mensaje MMS
            Entrada:  nombreObj=cadena con el nombre del objeto,
                      pathObj=cadena con el path local del archivo"""

        listaContentType = {'mid': 'audio/mid', 'wav': 'audio/wav', 'mp3': 'audio/mpeg'} # en principio sólo enviaremos estos tipos
        path = pathObj.split('.')
        extension = path[-1] # usando números negativos recorremos la lista en orden inverso (el elemento -1 es el último)
        contentType = listaContentType[extension]

        print 'Insertando audio...'

        params2 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'folderid': '', 'uploadtofolder': 'false', 'foldertype': '2', 'rnd': '74065'})
        referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=2'
        headers2 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
        conn2=httplib.HTTPConnection(self.server)
        conn2.request("GET", '/folders/upload_frame?' + params2, None, headers2)
        resp2=conn2.getresponse()

        if resp2.status == 200 :

            separador="---------------------------7d77df567a4b9"

            # generamos los datos del objeto
            userPart = '--' + separador + '\r\nContent-Disposition: form-data; name="user"\r\n\r\n34' + self.login + '\r\n'
            limitPart = '--' + separador + '\r\nContent-Disposition: form-data; name="limit"\r\n\r\n307200\r\n'

            urlReturn = 'http://' + self.server + '/folders/upload_close?uid=' + self.user + '&sk=' + self.sk + '&uploadtofolder=false'
            urlReturnPart = '--' + separador + '\r\nContent-Disposition: form-data; name="url_return"\r\n\r\n' + urlReturn +'\r\n'

            namePart = '--' + separador + '\r\nContent-Disposition: form-data; name="name"\r\n\r\n' + nombreObj + '\r\n'
            filenamePart = '--' + separador + '\r\nContent-Disposition: form-data; name="filename"; filename="' + pathObj + '"\r\nContent-Type: ' + contentType + '\r\n\r\n'

            final = '\r\n--' + separador + '--\r\n'

            f=open(pathObj, 'rb')
            contenido = f.read()
            f.close()
            data = userPart + limitPart + urlReturnPart + namePart + filenamePart + contenido + final

            # es necesario crear la cabecera Referer con los parámetros de la petición anterior
            referer = 'http://' + self.server + '/folders/upload_frame?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=2&rnd=74065'

            contentType = "multipart/form-data; boundary="+separador
            headers = {"Content-type": contentType, "Accept-Language": "es", "Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Accept-Encoding": "gzip, deflate", "Cache-Control": "no-cache", "Cookie": self.cookie, "Referer": referer}

            conn=httplib.HTTPConnection(self.server)
            conn.request ("POST", "/mas/messaging_as/temporalcontentservlet", data, headers)
            resp=conn.getresponse()
            respuesta = resp.read()

            # Tenemos que recibir la cabecera oid con el identificador del objeto insertado
            oid = ''
            headresp=resp.getheaders()
            for n in headresp :
                if n[0] == 'oid' :
                    oid = n[1]
            print '\toid: ' + oid

            if oid != '' :
                print '\tAudio insertado'
                params3 = urllib.urlencode ({'uploadtofolder': 'false', 'uid': self.user, 'sk': self.sk, 'status': 'success', 'oid': oid})
                referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=2'
                headers3 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
                conn3=httplib.HTTPConnection(self.server)
                conn3.request("GET", '/folders/upload_close?' + params3, None, headers3)
                resp3=conn3.getresponse()

                conn3.close()

                params4 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'slide_num': '1', 'function_name': 'audio', 'value': oid})
                referer = 'http://' + self.server + '/compose?uid=' + self.user + '&sk=' + self.sk + '&fr=ns&pathstring=+:+Env%EDo+Mensaje+MultiMedia&adultcheckparam=no'
                headers4 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
                conn4=httplib.HTTPConnection(self.server)
                conn4.request("GET", '/compose/ms?' + params4, None, headers4)
                resp4=conn4.getresponse()

                conn4.close()

            conn.close()

        conn2.close()

    def InsertaVideo(self, nombreObj, pathObj) :
        """Inserta un objeto en el mensaje MMS
            Entrada:  nombreObj=cadena con el nombre del objeto,
                      pathObj=cadena con el path local del archivo"""

        listaContentType = {'avi': 'video/avi', 'asf': 'video/x-ms-asf', 'mpg': 'video/mpeg', 'mpeg': 'video/mpeg', 'wmv': 'video/x-ms-wmv'} # en principio sólo enviaremos estos tipos
        path = pathObj.split('.')
        extension = path[-1] # usando números negativos recorremos la lista en orden inverso (el elemento -1 es el último)
        contentType = listaContentType[extension]

        print 'Insertando vídeo...'

        params2 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'folderid': '', 'uploadtofolder': 'false', 'foldertype': '3', 'rnd': '74065'})
        referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=3'
        headers2 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
        conn2=httplib.HTTPConnection(self.server)
        conn2.request("GET", '/folders/upload_frame?' + params2, None, headers2)
        resp2=conn2.getresponse()

        if resp2.status == 200 :

            separador="---------------------------7d77df567a4b9"

            # generamos los datos del objeto
            userPart = '--' + separador + '\r\nContent-Disposition: form-data; name="user"\r\n\r\n34' + self.login + '\r\n'
            limitPart = '--' + separador + '\r\nContent-Disposition: form-data; name="limit"\r\n\r\n307200\r\n'

            urlReturn = 'http://' + self.server + '/folders/upload_close?uid=' + self.user + '&sk=' + self.sk + '&uploadtofolder=false'
            urlReturnPart = '--' + separador + '\r\nContent-Disposition: form-data; name="url_return"\r\n\r\n' + urlReturn +'\r\n'

            namePart = '--' + separador + '\r\nContent-Disposition: form-data; name="name"\r\n\r\n' + nombreObj + '\r\n'
            filenamePart = '--' + separador + '\r\nContent-Disposition: form-data; name="filename"; filename="' + pathObj + '"\r\nContent-Type: ' + contentType + '\r\n\r\n'

            final = '\r\n--' + separador + '--\r\n'

            f=open(pathObj, 'rb')
            contenido = f.read()
            f.close()
            data = userPart + limitPart + urlReturnPart + namePart + filenamePart + contenido + final

            # es necesario crear la cabecera Referer con los parámetros de la petición anterior
            referer = 'http://' + self.server + '/folders/upload_frame?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=3&rnd=74065'

            contentType = "multipart/form-data; boundary="+separador
            headers = {"Content-type": contentType, "Accept-Language": "es", "Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Accept-Encoding": "gzip, deflate", "Cache-Control": "no-cache", "Cookie": self.cookie, "Referer": referer}

            conn=httplib.HTTPConnection(self.server)
            conn.request ("POST", "/mas/messaging_as/temporalcontentservlet", data, headers)
            resp=conn.getresponse()
            respuesta = resp.read()

            # Tenemos que recibir la cabecera oid con el identificador del objeto insertado
            oid = ''
            headresp=resp.getheaders()
            for n in headresp :
                if n[0] == 'oid' :
                    oid = n[1]
            print '\toid: ' + oid

            if oid != '' :
                print '\tVídeo insertado'
                params3 = urllib.urlencode ({'uploadtofolder': 'false', 'uid': self.user, 'sk': self.sk, 'status': 'success', 'oid': oid})
                referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=3'
                headers3 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
                conn3=httplib.HTTPConnection(self.server)
                conn3.request("GET", '/folders/upload_close?' + params3, None, headers3)
                resp3=conn3.getresponse()

                conn3.close()

                params4 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'slide_num': '1', 'function_name': 'video', 'value': oid})
                referer = 'http://' + self.server + '/compose?uid=' + self.user + '&sk=' + self.sk + '&fr=ns&pathstring=+:+Env%EDo+Mensaje+MultiMedia&adultcheckparam=no'
                headers4 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer}
                conn4=httplib.HTTPConnection(self.server)
                conn4.request("GET", '/compose/ms?' + params4, None, headers4)
                resp4=conn4.getresponse()

                conn4.close()

            conn.close()

        conn2.close()

    def EnviaMensaje(self, subject, dest, msg) :
        """Realiza el envío del mensaje MMS
            Entrada:  subject=asunto del mensaje
                      dest=cadena con el destinatario del mensaje
                      msg=cadena con el texto del mensaje"""

        print 'Enviando mensaje...'

        params4 = urllib.urlencode ({'user': self.user, 'sk': self.sk, 'function_name': 'send', 'text_function': 'update', 'text_value': msg, 'slide_num': '1', 'subject': subject, 'to1': dest, 'to2': '', 'to3': '', 'frag': ''})

        # es necesario crear la cabecera Referer con sus parámetros
        paramsReferer = urllib.urlencode({'uid': self.user, 'sk': self.sk, 'fr': 'ns', 'pathstring': 'Envío Mensaje MultiMedia', 'adultcheckparam': 'no'})
        referer = 'http://' + self.server + '/compose?'+paramsReferer
                    
        headers4 = {"Content-type":"application/x-www-form-urlencoded", "Accept": "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive","Cookie" : self.cookie, "Referer": referer}
        conn4=httplib.HTTPConnection(self.server)
        conn4.request ("POST", '/compose/ms', params4, headers4)
        resp4=conn4.getresponse()
        respuesta4 = resp4.read()

        if respuesta4.find('is_sent_ok=true') :
            print '\tMensaje enviado'
        elif respuesta4.find('is_sent_ok=false') :
            print '\tEl mensaje no se ha podido enviar'

        if resp4.status == 200 :
            params5 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'is_sent_ok': 'true', 'to1': dest})
            headers5 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive","Cookie" : self.cookie}
            conn5=httplib.HTTPConnection(self.server)
            conn5.request("GET", '/compose/send/confirm?'+params5, None, headers5)
            resp5=conn5.getresponse()

            if resp5.status == 200 :
                paramsReferer = urllib.urlencode({'sk': self.sk, 'uid': self.user, 'source': '', 'olduid': ''})
                referer = 'http://' + self.server + '/main/?'+paramsReferer
                
                params6 = urllib.urlencode ({'uid': self.user, 'sk': self.sk})
                headers6 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive","Cookie" : self.cookie}
                conn6=httplib.HTTPConnection(self.server)
                conn6.request("GET", '/login_frame?'+params6, None, headers6)
                resp6=conn6.getresponse()
                conn6.close()

                params7 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'fr': 'ns', 'pathstring': ' : Envío Mensaje Multimedia', 'adultcheckparam': 'no'})
                headers7 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive","Cookie" : self.cookie}
                conn7=httplib.HTTPConnection(self.server)
                conn7.request("GET", '/compose?'+params7, None, headers7)
                resp7=conn7.getresponse()
                conn7.close()

            conn5.close()

        conn4.close()

    def Logout(self) :

        print 'Iniciando Logout...'
        
        # hacemos el logout
        paramsLogout = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'TM_ACTION': 'LOGOUT'})

        # es necesario crear la cabecera Referer con sus parámetros
        paramsRefererLogout = urllib.urlencode({'sk': self.sk, 'uid': self.user, 'source': '', 'olduid': ''})
        refererLogout = 'http://' + self.server + '/main/?' + paramsRefererLogout

        headersLogout = {"Content-type":"application/x-www-form-urlencoded", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" :  "Keep-Alive", 'Referer': refererLogout}
        connLogout=httplib.HTTPConnection(self.server)
        connLogout.request ("POST", "/logout",paramsLogout, headersLogout)
        respLogout=connLogout.getresponse()

        connLogout.close()

class DemoDialog(MMSWindow):
    def DoModal(self):
        return self._DoCreate(win32gui.DialogBoxIndirect)

    def OnClose(self, hwnd, msg, wparam, lparam):
        win32gui.EndDialog(hwnd, 0)

def DemoModal():
    w=DemoDialog()
    w.DoModal()
    
if __name__=='__main__':
    DemoModal()
