Utilizamos cookies propias y de terceros. Al navegar entendemos que aceptas el uso de cookies. +Info.
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Usuario
· Wiki

Nick


Contraseña


Nuevo usuario


English

Programacion: Insertar evento de Google Calendar con Visual Basic .Net y Google Data API
Visual Studio .NET


Explicamos en este artículo paso a paso y con comentarios y capturas de pantalla cómo insertar un evento o cita en el calendario de Google Calendar, usando para ello el IDE y lenguaje de programación Microsoft Visual Studio .Net (Visual Basic .Net) 2010. Para poder insertar o añadir una cita en un calendario de Google Calendar será necesario usar el API de Google, también explicamos cómo descargarlo y cómo usarlo. Mostramos y publicamos la aplicación AjpdSoft Insertar Evento Google Calendar con código fuente gratuito como ejemplo de este artículo: inserta un evento, muestra los eventos de todos los calendarios de un intervalo de fechas, muestra todos los calendarios.



 

Descargar e instalar Google Data API SDK

Para instalar Google Data API en un equipo con Microsoft Windows 7 abriremos un navegador web como Mozilla Firefox y accederemos a la URL:

http://code.google.com/p/google-gdata/downloads/list

Seleccionaremos Google Data API Setup (1.7.0.1).msi (21 MB):

Descargar e instalar Google Data API SDK

Pulsaremos en el enlace Google Data API Setup (1.7.0.1).msi para iniciar la descarga:

Descargar e instalar Google Data API SDK

Una vez descargado el fichero "Google Data API Setup (1.7.0.1).msi" haremos doble clic sobre él para iniciar la instalación:

Descargar e instalar Google Data API SDK

Microsoft Windows 7 nos advertirá de que se va a ejecutar un archivo potencialmente peligroso (por tratarse de una descarga de Internet). Pulsaremos "Ejecutar" para continuar:

Descargar e instalar Google Data API SDK

Se iniciará el asistente de instalación de Google Data API SDK, pulsaremos "Next" para continuar:

Descargar e instalar Google Data API SDK

Indicaremos la carpeta de instalación, por defecto:

C:/Program Files (x86)/Google/Google Data API SDK

Pulsaermos "Next" par acontinuar:

Descargar e instalar Google Data API SDK

Tras la instalación de Google Data API SDK, el asistente nos informará de que el proceso de instalación ha concluido, con el texto "Google Data API SDK has been successfully installed". Pulsaremos "Close":

Descargar e instalar Google Data API SDK

En realidad, el programa de instalación de Google Data API SDK extrae varios ficheros y carpetas. Los importantes son las librerías (dll) que serán usadas por nuestra aplicación para el acceso a los servicios de Google Calendar, se encuentran en la carpeta "redist":

Descargar e instalar Google Data API SDK

 

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Crear nuevo proyecto en Visual Studio 2010, agregar referencia a Google Data API SDK

Una vez instalado Google Data API SDK e instalado Microsoft Visual Studio .Net 2010, abriremos Microsoft Visual Studio y pulsaremos en el menú "Archivo" - "Nuevo proyecto...":

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Seleccionaremos, en la parte izquierda, en "Plantillas instaladas" la opción "Visual Basic" y en la parte derecha seleccionaremos "Aplicación de Windows Forms". Elegiremos .NET Framework 3.5, hay que tener en cuenta que el API actual de Google, en su versión 1.7.0.1, no soporta Framework 4.0, por lo que para el correcto funcionamiento seleccionaremos .NET Framework 3.5. En "Nombre" introduciremos el nombre de la solución, por ejemplo "AjpdSoftInsertarEventoGoogleCalendar". Pulsaremos "Aceptar" para continuar:

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

En el Explorador de soluciones , en la parte derecha, pulsaremos con el botón derecho sobre nuestra Solución y seleccionaremos "Agregar referencia...":

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

En la pestaña "Examinar", accederemos a la carpeta de instalación de Google Data API SDK, a la subcarpeta "Redist", seleccionaremos las tres librerías necesarias de Google: Google.GData.Calendar.dll, Google.GData.Client.dll y Google.GData.Extensions.dll:

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Pulsaremos a continuación en el menú "Ver" - "Código" (o la tecla rápida F7) y añadiremos los siguientes Imports (si no han sido añadidos automáticamente al agregar las referencias):

Imports Google.GData.Calendar
Imports Google.GData.Client
Imports Google.GData.Extensions

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

 

Componentes necesarios para insertar cita en Google Calendar y para mostrar las citas de una fecha

En el formulario principal de la aplicación, en nuestro caso "formEnviarCitaCalendar.vb" añadiremos los siguientes componentes (podremos añadir los que queramos y como queramos, en la imagen mostramos un ejemplo):

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

A continuación indicamos los componentes más importantes:

  • TextBox (txtUsuario): nombre de usuario de Google con el que iniciaremos sesión.
  • TextBox (txtContrasena): contraseña del usuario de Google con el que iniciaremos sesión.
  • TabControl (Tab): donde colocaremos los componentes para insertar la cita en una pestaña y en otra pestaña los componentes para mostrar las citas (consulta).
    • En el TabControl para insertar la cita introduciremos los siguientes componentes:
      • ComboBox (lsCalendarios): donde obtendremos la lista de los calendarios del usuario que ha iniciado sesión en Google Calendar, para que seleccione en el que se insertará el evento.
      • DateTimePiker (txtDesdeDia): fecha desde la que empezará la cita o evento de Google Calendar.
      • MaskedTextBox (txtDesdeHora): hora desde la que empezará la cita o evento de Google Calendar.
      • DateTimePiker (txtHastaDia): fecha en la que finalizará la cita o evento de Google Calendar.
      • MaskedTextBox (txtHastaHora): hora en la que acabará la cita o evento de Google Calendar.
      • TextBox (txtEvento): asunto del evento de Google Calendar.
      • TextBox (txtLugar): lugar donde se producirá la cita o evento de Google Calendar.
      • TextBox (txtDescripcion): descripción de la cita de Google Calendar.
      • ComboBox (lsRecordatorio): lista con el tipo de recordatorio (SMS, Correo electrónico, Ventana emergente).
      • TextBox (txtInvitados): posibles invitados al evento o cita de Google Calendar.
      • Button (btValidar): botón para probar el usuario y la contraseña, para validar en cuenta de google.
      • Button (btListaCalendarios): botón para obtener y mostrar los calendarios del usuario de Google Calendar.
      • Button (btEnviar): botón para enviar el evento o cita a Google Calendar.
      • Button (btSalir): botón para salir y guardar los datos actuales en fichero INI.
    • En el TabControl para mostrar las citas usaremos los siguientes componentes:
      • ComboBox (lsCalendariosCitas): donde obtendremos la lista de los calendarios del usuario que ha iniciado sesión en Google Calendar, para que seleccione el calendario del que se obtendrán los eventos/citas.
      • DateTimePiker (txtCitasDesde): fecha desde la que mostraremos las citas de Google Calendar.
      • DateTimePiker (txtCitasHasta): fecha hasta la que mostraremos las citas de Google Calendar.
      • NumericUpDown (txtNumeroMaximoCitas): para limitar el número máximo de eventos a obtener.
      • ListView (lsCitas): campo donde mostraremos las citas de Google Calendar del período elegido.
      • Button (btObtenerCitas): botón para obtener las citas del período elegido de Google Calendar.
      • Button (btExportarCSV): botón para exportar las citas/eventos a fichero CSV separado por comas.

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

    • En el TabControl para mostrar los calendarios usaremos los siguientes componentes:
      • Button (btObtenerCalendariosLista): botón para obtener todos los calendarios del usuario.
      • CheckBox (opSoloPropietarioListaCalendarios): check para mostrar todos los calendarios del usuario o sólo los calendarios de los que sea propietario.
      • ListView (lsListaCalendarios): lista para mostrar todos los calendarios.
      • Otros componentes para añadir un nuevo calendario (TextBox, Button, CheckBox).

      Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

El código fuente source code más importante, validar en Google, insertar evento Google Calendar, obtener calendarios y citas, insertar calendario

A continuación mostramos los procedimientos y funciones más importantes de AjpdSoft Insertar Evento Google Calendar.

En primer lugar, para validar un usuario y contraseña de Google usaremos el siguiente código (correspondiente al botón "Probar validación" del formulario de la aplicación):

    Private Sub btValidar_Click(ByVal sender As System.Object,
                                ByVal e As System.EventArgs) Handles btValidar.Click
        Try
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            bePanel1.Text = "Validando credenciales en Google..."
            be.Refresh()

            'Autenticación en Google con usuario y contraseña
            Dim servicioGoogle As New CalendarService("AjpdSoftCitaGoogleCalendar")
            Dim token As String

            servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)
            token = servicioGoogle.QueryClientLoginToken()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            MsgBox("Validación realizada correctamente con la " & _
                   "cuenta de Google indicada." & _
                   vbCrLf & vbCrLf + "Token: " & vbCrLf & token,
                   MsgBoxStyle.Information + MsgBoxStyle.OkOnly)

        Catch ex As Exception
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            MsgBox("Se ha producido un error al intentar validar el usuario " &
                   "y la contraseña en Google: " & _
               vbCrLf & vbCrLf & ex.Message,
               MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub
 

 

Para mostrar una lista de todos los calendarios dados de alta por el usuario de Google Calendar (correspondiente al botón "Calendarios" del formulario de la aplicación):

       Private Sub btListaCalendarios_Click(ByVal sender As System.Object,
                ByVal e As System.EventArgs) Handles btListaCalendarios.Click
        Dim titulo As String = ""
        Dim subtitulo As String = ""
        Try
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            bePanel1.Text = "Obteniendo lista de calendarios de Google Calendar..."
            be.Refresh()

            lsCalendarios.Items.Clear()

            obtenerCalendarios(opSoloPropietario.Checked)

            Dim i As Integer
            For i = 0 To calendariosT.Count - 1
                lsCalendarios.Items.Add(calendariosT.Item(i).titulo)
            Next i
            If calendariosT.Count > 0 Then
                lsCalendarios.SelectedIndex = 0
            End If

            bePanel1.Text = "Lista de calendarios obtenida correctamente"
            be.Refresh()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
        Catch ex As Exception
            bePanel1.Text = "Error al obtener lista de calendarios..."
            be.Refresh()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            MsgBox("Se ha producido un error al intentar obtener la " & _
                   "lista de calendarios de Google Calendar: " & _
                vbCrLf & vbCrLf & ex.Message,
                MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub
 

El botón anterior usa el procedimiento "obtenerClanedarios" que mostramos a continuación:

    'Obtiene los calendarios del usuario de Google Calendar
    Private Sub obtenerCalendarios(ByVal propietario As Boolean)
        Try
            'Alta del servicio de Google y autenticación en Google
            Dim servicioGoogle As New CalendarService("AjpdSoftInsertarCitaGoogleCalendar")
            servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)

            Dim consultaCalendar As CalendarQuery = New CalendarQuery()

            If propietario Then
                consultaCalendar.Uri =
                    New Uri("https://www.google.com/calendar/feeds/default/owncalendars/full")
            Else
                consultaCalendar.Uri =
                    New Uri("https://www.google.com/calendar/feeds/default/allcalendars/full")
            End If

            Dim resultadoFeed As CalendarFeed = servicioGoogle.Query(consultaCalendar)

            calendariosT.Clear()
            Dim creadoresCalendario As String
            Dim i As Integer
            For Each entradaActual As CalendarEntry In resultadoFeed.Entries
                Dim calendarios As New calendariosGoogleCalendar
                calendarios.titulo = entradaActual.Title.Text
                calendarios.uri = entradaActual.Id.AbsoluteUri.Substring(63)
                calendarios.descripcion = entradaActual.Summary.Text
                calendarios.soloLectura = resultadoFeed.ReadOnly
                creadoresCalendario = ""
                For i = 0 To resultadoFeed.Authors.Count - 1
                    If creadoresCalendario <> "" Then
                        creadoresCalendario = creadoresCalendario & ", " & resultadoFeed.Authors.Item(i).Email
                    Else
                        creadoresCalendario = resultadoFeed.Authors.Item(i).Email
                    End If
                Next

                calendarios.creadores = creadoresCalendario
                calendariosT.Add(calendarios)
            Next
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub
 

 

El código fuente source code VB.Net para insertar un evento o cita en Google Calendar (botón "Enviar evento"):

    Private Sub btEnviar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btEnviar.Click
        If lsCalendarios.Text = "" Then
            MsgBox("Debe especificiar el calendario en el que se insertará el evento.",
                   MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            lsCalendarios.Focus()
        Else

            Try
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
                bePanel1.Text = "Enviando evento a Google Calendar..."
                be.Refresh()

                'Alta del servicio de Google y autenticación en Google
                Dim servicioGoogle As New CalendarService("AjpdSoftInsertarCitaGoogleCalendar")
                servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)

                Dim entradaCalendario As New EventEntry

                'Asunto (título) del evento Google Calendar
                entradaCalendario.Title.Text = txtEvento.Text

                'Descripción del evento Google Calendar
                entradaCalendario.Content.Content = txtDescripcion.Text

                'Lugar del evento Google Calendar
                Dim ubicacionEvento = New Where()
                ubicacionEvento.ValueString = txtLugar.Text
                entradaCalendario.Locations.Add(ubicacionEvento)

                'Fecha y hora inicio del evento, fecha y hora fin del evento Google Calendar
                Dim fechaInicioTxt As String = txtDesdeDia.Text & " " & txtDesdeHora.Text
                Dim fechaInicio As Date =
                    Date.Parse(fechaInicioTxt, System.Globalization.CultureInfo.CurrentCulture)
                Dim fechaFinTxt As String = txtHastaDia.Text & " " & txtHastaHora.Text
                Dim fechaFin As Date =
                    Date.Parse(fechaFinTxt, System.Globalization.CultureInfo.CurrentCulture)

                Dim desdeHastaCalendar As New [When](fechaInicio, fechaFin)
                entradaCalendario.Times.Add(desdeHastaCalendar)

                '** INICIO Activar tipo de Recordatorio
                Dim Recordatorio As New Reminder

                'Unidad de tiempo (horas, minutos, días)
                If lsRecordatorioUnidadTiempo.Text = "minutos" Then
                    Recordatorio.Minutes = CInt(txtRecordatorioTiempo.Text)
                End If
                If lsRecordatorioUnidadTiempo.Text = "horas" Then
                    Recordatorio.Hours = CInt(txtRecordatorioTiempo.Text)
                End If
                If lsRecordatorioUnidadTiempo.Text = "días" Then
                    Recordatorio.Days = CInt(txtRecordatorioTiempo.Text)
                End If

                'tipo de recordatorio (SMS, correo electrónico, ventana emergente)
                If lsRecordatorio.Text = "SMS" Then
                    Recordatorio.Method = Reminder.ReminderMethod.sms
                End If
                If lsRecordatorio.Text = "Correo electrónico" Then
                    Recordatorio.Method = Reminder.ReminderMethod.email
                End If
                If lsRecordatorio.Text = "Ventana emergente" Then
                    Recordatorio.Method = Reminder.ReminderMethod.alert
                End If

                entradaCalendario.Reminders.Add(Recordatorio)
                '** FIN Activar tipo de Recordatorio

                'Inserta los invitados de la cita de Google Calendar
                If txtInvitados.Text <> "" Then
                    Dim invintadosSeparados() As String
                    Dim i As Integer
                    invintadosSeparados = Split(txtInvitados.Text, ",")
                    Dim invitado As Who
                    For i = 0 To UBound(invintadosSeparados)
                        invitado = New Who()
                        invitado.Rel = Who.RelType.MESSAGE_TO
                        invitado.Email = invintadosSeparados(i)
                        entradaCalendario.Participants.Add(invitado)
                    Next i
                End If

                'Insertamos el evento creado en Google Calendar
                Dim uriDireccionGoogle As New Uri("https://www.google.com/calendar/feeds/" &
                             calendariosT.Item(lsCalendarios.SelectedIndex).uri & "/private/full")
                Dim entradaEventoInsertar As AtomEntry =
                    servicioGoogle.Insert(uriDireccionGoogle, entradaCalendario)

                MsgBox("Evento enviado correctamente a Google Calendar.",
                       MsgBoxStyle.OkOnly + MsgBoxStyle.Information)

                bePanel1.Text = "Evento enviado correctamente a Google Calendar"
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            Catch ex As Exception
                bePanel1.Text = "Error al enviar evento a Google Calendar..."
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
                MsgBox("Se ha producido un error al intentar insertar un " & _
                       "evento en Google Calendar: " & _
                    vbCrLf & vbCrLf & ex.Message,
                    MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
            End Try
        End If
    End Sub
 

 

El código fuente source code VB.Net para obtener las citas o eventos de Google Calendar (botón "Obtener citas") :

    Private Sub btObtenerCitas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btObtenerCitas.Click
        If lsCalendariosCitas.Text = "" Then
            MsgBox("Debe especificiar el calendario del que se obtendrán los eventos/citas.",
                   MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            lsCalendariosCitas.Focus()
        Else
            Dim i As Integer

            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            bePanel1.Text = "Obteniendo eventos/citas de Google Calendar..."
            be.Refresh()
            Try
                lsCitas.BeginUpdate()
                lsCitas.Columns.Clear()
                lsCitas.Items.Clear()
                lsCitas.View = View.Details
                lsCitas.Columns.Add(New ColHeader("Fecha inicio", 120, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Fecha fin", 120, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Asunto", 200, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Lugar", 100, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Descripción", 200, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Participantes", 100, HorizontalAlignment.Left, True))
                obtenerCitasGoogleCalendar(calendariosT.Item(lsCalendariosCitas.SelectedIndex).uri, txtNumeroMaximoCitas.Value)
                For i = 0 To citasT.Count - 1
                    Dim elementoLista As New ListViewItem
                    elementoLista = New ListViewItem(CStr(citasT.Item(i).fechaInicio))
                    elementoLista.SubItems.Add(CStr(citasT.Item(i).fechaFin))
                    elementoLista.SubItems.Add(citasT.Item(i).titulo)
                    elementoLista.SubItems.Add(citasT.Item(i).lugar)
                    elementoLista.SubItems.Add(citasT.Item(i).contenido)
                    elementoLista.SubItems.Add(citasT.Item(i).participantes)
                    lsCitas.Items.Add(elementoLista)
                    lInfoNumCitas.Text = "Obteniendo evento/cita: " & CStr(i + 1)
                    lInfoNumCitas.Refresh()
                Next i
                lsCitas.EndUpdate()
                lInfoNumCitas.Text = "Número de citas/eventos: " & CStr(citasT.Count)
                lInfoNumCitas.Refresh()

                bePanel1.Text = "Obtenidas " & CStr(citasT.Count) & " citas"
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default

            Catch ex As Exception
                bePanel1.Text = "Error al consultar citas/eventos de Google Calendar."
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
                MsgBox("Se ha producido un error al intentar obtener eventos de Google Calendar: " & _
                    vbCrLf & vbCrLf & ex.Message,
                    MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
            End Try
        End If
    End 

El botón anterior usa el procedimiento obtenerCitasGoogleCalendar para obtener las citas en un array de structure, el procedimiento obtenerCitasGoogleCalendar:

    'Obtiene las citas (eventos) del calendario indicado según el filtro indicado
    Private Sub obtenerCitasGoogleCalendar(ByVal calendario As String, ByVal numeroMaximoCitas As Integer)
        Dim lugarCita As String
        Dim participantesCita As String
        Dim i As Integer

        Try
            Dim servicioGoogle As Google.GData.Calendar.CalendarService =
                    New Google.GData.Calendar.CalendarService("AjpdSoftInsertarCitaGoogleCalendar")
            servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)
            Dim consultaCalendar As Google.GData.Calendar.EventQuery =
                New Google.GData.Calendar.EventQuery()
            ' consultaCalendar.Uri = New Uri("http://www.google.com/calendar/feeds/" +
            '                      servicioGoogle.Credentials.Username +
            '                    "/private/full?max-results=1000")

            'Insertamos el evento creado en Google Calendar
            consultaCalendar.Uri = New Uri("https://www.google.com/calendar/feeds/" &
                         calendario &
                         "/private/full?max-results=" & CStr(numeroMaximoCitas))

            consultaCalendar.StartTime = txtCitasDesde.Value
            consultaCalendar.EndTime = txtCitasHasta.Value

            Dim entradaFeed As Google.GData.Calendar.EventEntry
            Dim calendarioFeed As Google.GData.Calendar.EventFeed = servicioGoogle.Query(consultaCalendar)

            citasT.Clear()

            For Each entradaFeed In calendarioFeed.Entries
                Dim fechaEvento As New [When](entradaFeed.Times(0).StartTime, entradaFeed.Times(0).EndTime)
                Dim citasGoogle As New citasGoogleCalendar

                citasGoogle.contenido = entradaFeed.Content.Content
                citasGoogle.titulo = entradaFeed.Title.Text
                citasGoogle.fechaInicio = fechaEvento.StartTime
                citasGoogle.fechaFin = fechaEvento.EndTime

                lugarCita = ""
                For i = 0 To entradaFeed.Locations.Count - 1
                    If lugarCita <> "" Then
                        lugarCita = lugarCita & ", " & entradaFeed.Locations.Item(i).ValueString
                    Else
                        lugarCita = entradaFeed.Locations.Item(i).ValueString
                    End If
                Next
                citasGoogle.lugar = lugarCita

                participantesCita = ""
                For i = 0 To entradaFeed.Participants.Count - 1
                    If participantesCita <> "" Then
                        participantesCita = participantesCita & ", " & entradaFeed.Participants.Item(i).ValueString
                    Else
                        participantesCita = entradaFeed.Participants.Item(i).ValueString
                    End If
                Next
                citasGoogle.participantes = participantesCita
                citasT.Add(citasGoogle)
            Next
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub
 

El código fuente source code en VB .Net para exportar las citas del ListView a un fichero de texto plano con formato CSV (botón "Exportar citas a fichero CSV"):

    Private Sub btExportarCSV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExportarCSV.Click
        dlGuardar.Filter = "Archivos CSV (*.csv)|*.csv|Todos los archivos (*.*)|*.*"
        dlGuardar.FilterIndex = 1
        dlGuardar.DefaultExt = "csv"
        dlGuardar.FileName = "Eventos google calendar"
        dlGuardar.OverwritePrompt = True
        dlGuardar.Title = "Guardar eventos Google Calendar"
        If dlGuardar.ShowDialog Then
            exportarListViewCSV(lsCitas, dlGuardar.FileName)
        End If
    End Sub
 

El botón anterior usa el procedimiento exportarListViewCSV para realizar la exportación:

    'Exportar contenido ListView a formato CSV 
    'para abrir con Microsoft Office Excel, OppenOffice Calc o con 
    Private Sub exportarListViewCSV(ByVal lstview As ListView, ByVal ficheroCSV As String)
        Dim lineasCSV As New System.Text.StringBuilder
        Dim lineaActual As String = String.Empty

        'Escribir nombre de columnas y encabezados en la variable temporal
        For columnIndex As Int32 = 0 To lstview.Columns.Count - 1
            lineaActual &= (String.Format(Chr(34) & "{0}" & Chr(34) & ";", lstview.Columns(columnIndex).Text))
        Next

        'Quitar la coma final
        lineasCSV.AppendLine(lineaActual.Substring(0, lineaActual.Length - 1))
        lineaActual = String.Empty

        'Escribir los datos del ListView en la variable temporal
        For Each item As ListViewItem In lstview.Items
            For Each subItem As ListViewItem.ListViewSubItem In item.SubItems
                lineaActual &= (String.Format(Chr(34) & "{0}" & Chr(34) & ";", subItem.Text))
            Next

            'Quitar coma final
            lineasCSV.AppendLine(lineaActual.Substring(0, lineaActual.Length - 1))
            lineaActual = String.Empty
        Next

        'Guardar datos variable temporal a fichero CSV
        Dim Sys As New System.IO.StreamWriter(ficheroCSV)
        Sys.WriteLine(lineasCSV.ToString)
        Sys.Flush()
        Sys.Dispose()
    End Sub
 

El código fuente en Visual Basic .Net para obtener los calendarios del usuario de Google Calendar (botón "Obtener calendarios") :

    Private Sub btObtenerCalendariosLista_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
                Handles btObtenerCalendariosLista.Click
        Try
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            bePanel1.Text = "Obteniendo lista de calendarios de Google Calendar..."
            be.Refresh()

            lsListaCalendarios.Items.Clear()

            obtenerCalendarios(opSoloPropietarioListaCalendarios.Checked)

            lsListaCalendarios.BeginUpdate()
            lsListaCalendarios.Columns.Clear()
            lsListaCalendarios.Items.Clear()
            lsListaCalendarios.View = View.Details
            lsListaCalendarios.Columns.Add(New ColHeader("Título", 200, HorizontalAlignment.Left, True))
            lsListaCalendarios.Columns.Add(New ColHeader("Descripción", 200, HorizontalAlignment.Left, True))
            lsListaCalendarios.Columns.Add(New ColHeader("Creadores/Autores", 200, HorizontalAlignment.Left, True))
            lsListaCalendarios.Columns.Add(New ColHeader("ID", 150, HorizontalAlignment.Left, True))
            lsListaCalendarios.Columns.Add(New ColHeader("Sólo lectura", 100, HorizontalAlignment.Left, True))

            Dim i As Integer
            For i = 0 To calendariosT.Count - 1
                Dim elementoLista As New ListViewItem
                elementoLista = New ListViewItem(CStr(calendariosT.Item(i).titulo))
                elementoLista.SubItems.Add(CStr(calendariosT.Item(i).descripcion))
                elementoLista.SubItems.Add(CStr(calendariosT.Item(i).creadores))
                elementoLista.SubItems.Add(calendariosT.Item(i).uri)
                elementoLista.SubItems.Add(CStr(calendariosT.Item(i).soloLectura))
                lsListaCalendarios.Items.Add(elementoLista)
            Next i
            lsListaCalendarios.EndUpdate()

            bePanel1.Text = "Lista de calendarios obtenida correctamente"
            be.Refresh()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
        Catch ex As Exception
            bePanel1.Text = "Error al obtener lista de calendarios..."
            be.Refresh()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            MsgBox("Se ha producido un error al intentar obtener la " & _
                   "lista de calendarios de Google Calendar: " & _
                vbCrLf & vbCrLf & ex.Message,
                MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub
 

El botón anterior usa el procedimiento "obtenerClanedarios" que ya hemos listado anteriormente.

 

Existen otros procedimientos aunque no tienen que ver con Google Calendar, como son:

 

Guardar datos de configuración en fichero INI:

    Private Sub guardarDatosINI()
        Try
            Dim objFicherosINI As New FicherosINI(
                Path.Combine(Application.StartupPath, "configuracion.ini"))
            Dim objCifrarRSA As New encriptacionRSA()
            Dim ficheroDescripcion As String

            objFicherosINI.WriteString("Validación",
                                       "Usuario", txtUsuario.Text)
            objFicherosINI.WriteBoolean("Validación", "Guardar contraseña", opRecordarContrasena.Checked)
            objFicherosINI.WriteString("Evento",
                                       "Asunto", txtEvento.Text)
            objFicherosINI.WriteString("Evento",
                                       "Lugar", txtLugar.Text)
            objFicherosINI.WriteString("Evento",
                                       "Recordatorio - Tiempo", txtRecordatorioTiempo.Text)
            objFicherosINI.WriteString("Evento",
                                       "Recordatorio - Tipo", lsRecordatorio.Text)
            objFicherosINI.WriteString("Evento",
                                       "Recordatorio - Unidad", lsRecordatorioUnidadTiempo.Text)
            objFicherosINI.WriteString("Calendario", "Calendario actual", lsCalendarios.Text)
            objFicherosINI.WriteBoolean("Calendario", "Sólo propietario", opSoloPropietario.Checked)
            objFicherosINI.WriteString("Evento", "Invitados", txtInvitados.Text)

            If opRecordarContrasena.Checked = True Then
                ' Cifrar/Encriptar la contraseña y guardarla en el INI
                objFicherosINI.WriteString("Validación", "Contraseña",
                    Trim(objCifrarRSA.encriptar128BitRijndael(txtContrasena.Text, "clave_ajpdsoft")))
            Else
                objFicherosINI.WriteString("Validación", "Contraseña", "")
            End If

            'Guardar descripción en fichero
            ficheroDescripcion = Path.Combine(Application.StartupPath, "descripcion.txt")
            Dim fichero As New StreamWriter(ficheroDescripcion)
            fichero.WriteLine(txtDescripcion.Text)
            fichero.Close()

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub
 

Y la clase "FicherosINI":

Public Class FicherosINI
    ' Funciones del API de Windows para ficheros INI
    Private Declare Ansi Function GetPrivateProfileString _
      Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _
      (ByVal lpApplicationName As String, _
      ByVal lpKeyName As String, ByVal lpDefault As String, _
      ByVal lpReturnedString As System.Text.StringBuilder, _
      ByVal nSize As Integer, ByVal lpFileName As String) _
      As Integer

    Private Declare Ansi Function WritePrivateProfileString _
      Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
      (ByVal lpApplicationName As String, _
      ByVal lpKeyName As String, ByVal lpString As String, _
      ByVal lpFileName As String) As Integer

    Private Declare Ansi Function GetPrivateProfileInt _
      Lib "kernel32.dll" Alias "GetPrivateProfileIntA" _
      (ByVal lpApplicationName As String, _
      ByVal lpKeyName As String, ByVal nDefault As Integer, _
      ByVal lpFileName As String) As Integer

    Private Declare Ansi Function FlushPrivateProfileString _
      Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
      (ByVal lpApplicationName As Integer, _
      ByVal lpKeyName As Integer, ByVal lpString As Integer, _
      ByVal lpFileName As String) As Integer

    Dim strFilename As String

    ' Constructor, para aceptar el fichero INI
    Public Sub New(ByVal Filename As String)
        strFilename = Filename
    End Sub

    'Propiedad sólo lectura con nombre de fichero
    ReadOnly Property FileName() As String
        Get
            Return strFilename
        End Get
    End Property

    'Función para leer cadena de texto (string) de fichero INI
    Public Function GetString(ByVal Section As String, _
      ByVal Key As String, ByVal [Default] As String) As String
        Dim intCharCount As Integer
        Dim objResult As New System.Text.StringBuilder(256)

        intCharCount = GetPrivateProfileString(Section, Key, _
           [Default], objResult, objResult.Capacity, strFilename)
        If intCharCount > 0 Then
            GetString = Left(objResult.ToString, intCharCount)
        Else
            GetString = ""
        End If
    End Function

    'Función para leer un valor numérico del fichero INI
    Public Function GetInteger(ByVal Section As String, _
      ByVal Key As String, ByVal [Default] As Integer) As Integer
        Return GetPrivateProfileInt(Section, Key, _
           [Default], strFilename)
    End Function

    'Función para leer un valor booleano de fichero INI
    Public Function GetBoolean(ByVal Section As String, _
      ByVal Key As String, ByVal [Default] As Boolean) As Boolean
        Return (GetPrivateProfileInt(Section, Key, _
           CInt([Default]), strFilename) = 1)
    End Function

    'Función para escribir valor de cadena (string) en fichero INI
    Public Sub WriteString(ByVal Section As String, _
      ByVal Key As String, ByVal Value As String)
        WritePrivateProfileString(Section, Key, Value, strFilename)
        Flush()
    End Sub

    'Función para escribir valor numérico en fichero INI
    Public Sub WriteInteger(ByVal Section As String, _
      ByVal Key As String, ByVal Value As Integer)
        ' Writes an integer to your INI file
        WriteString(Section, Key, CStr(Value))
        Flush()
    End Sub

    'Función para escribir valor booleano en fichero INI
    Public Sub WriteBoolean(ByVal Section As String, _
    ByVal Key As String, ByVal Value As Boolean)
        ' Writes a boolean to your INI file
        WriteString(Section, Key, CStr(Math.Abs(CInt(Value))))
        Flush()
    End Sub

    'Guarda los cambios de la caché en fichero INI
    Private Sub Flush()
        FlushPrivateProfileString(0, 0, 0, strFilename)
    End Sub
End Class

Para la encriptación de la contraseña del usuario (si decide guardarla):

Public Class encriptacionRSA

    Public Function encriptar128BitRijndael(
            ByVal textoEncriptar As String,
            ByVal claveEncriptacion As String) As String
        Dim bytValue() As Byte
        Dim bytKey() As Byte
        Dim bytEncoded() As Byte = New Byte() {}
        Dim bytIV() As Byte = {121, 241, 10, 1, 132,
                               74, 11, 39, 255, 91, 45,
                               78, 14, 211, 22, 62}
        Dim intLength As Integer
        Dim intRemaining As Integer
        Dim objMemoryStream As New MemoryStream()
        Dim objCryptoStream As CryptoStream
        Dim objRijndaelManaged As RijndaelManaged


        'Quitar nulos en cadena de texto a encriptar
        textoEncriptar = quitarNullCadena(textoEncriptar)

        If textoEncriptar = "" Then
            Return ""
        End If

        bytValue = Encoding.ASCII.GetBytes(textoEncriptar.ToCharArray)

        intLength = Len(claveEncriptacion)


        'La clave de cifrado debe ser de 256 bits de longitud (32 bytes)
        'Si tiene más de 32 bytes se truncará
        'Si es menor de 32 bytes se rellenará con X
        If intLength >= 32 Then
            claveEncriptacion = Strings.Left(claveEncriptacion, 32)
        Else
            intLength = Len(claveEncriptacion)
            intRemaining = 32 - intLength
            claveEncriptacion = claveEncriptacion & Strings.StrDup(intRemaining, "X")
        End If

        bytKey = Encoding.ASCII.GetBytes(claveEncriptacion.ToCharArray)

        objRijndaelManaged = New RijndaelManaged()

        Try
            'Crear objeto Encryptor y escribir su valor 
            'después de que se convierta en array de bytes
            objCryptoStream = New CryptoStream(objMemoryStream, _
              objRijndaelManaged.CreateEncryptor(bytKey, bytIV), _
              CryptoStreamMode.Write)
            objCryptoStream.Write(bytValue, 0, bytValue.Length)

            objCryptoStream.FlushFinalBlock()

            bytEncoded = objMemoryStream.ToArray
            objMemoryStream.Close()
            objCryptoStream.Close()
        Catch ex As Exception
            MsgBox("Error al encriptar cadena de texto: " &
                   ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try

        'Devolver el valor del texto encriptado
        'convertido de array de bytes a texto en base64
        Return Convert.ToBase64String(bytEncoded)
    End Function



    Public Function desencriptar128BitRijndael(
            ByVal textoEncriptado As String,
            ByVal claveDesencriptacion As String) As String
        Dim bytDataToBeDecrypted() As Byte
        Dim bytTemp() As Byte
        Dim bytIV() As Byte = {121, 241, 10, 1, 132,
                               74, 11, 39, 255, 91,
                               45, 78, 14, 211, 22, 62}
        Dim objRijndaelManaged As New RijndaelManaged()
        Dim objMemoryStream As MemoryStream
        Dim objCryptoStream As CryptoStream
        Dim bytDecryptionKey() As Byte

        Dim intLength As Integer
        Dim intRemaining As Integer
        Dim strReturnString As String = String.Empty

        If textoEncriptado = "" Then
            Return ""
        End If

        'Convertir el valor encriptado base64 a array de bytes
        bytDataToBeDecrypted = Convert.FromBase64String(textoEncriptado)

        'La clave de desencriptación debe ser de 256 bits de longitud (32 bytes)
        'Si tiene más de 32 bytes se truncará
        'Si es menor de 32 bytes se rellenará con A
        intLength = Len(claveDesencriptacion)

        If intLength >= 32 Then
            claveDesencriptacion = Strings.Left(claveDesencriptacion, 32)
        Else
            intLength = Len(claveDesencriptacion)
            intRemaining = 32 - intLength
            claveDesencriptacion = claveDesencriptacion & Strings.StrDup(intRemaining, "X")
        End If

        bytDecryptionKey = Encoding.ASCII.GetBytes(claveDesencriptacion.ToCharArray)

        ReDim bytTemp(bytDataToBeDecrypted.Length)

        objMemoryStream = New MemoryStream(bytDataToBeDecrypted)

        Try
            'Crear objeto Dencryptor y escribir su valor 
            'después de que se convierta en array de bytes
            objCryptoStream = New CryptoStream(objMemoryStream, _
               objRijndaelManaged.CreateDecryptor(bytDecryptionKey, bytIV), _
               CryptoStreamMode.Read)

            objCryptoStream.Read(bytTemp, 0, bytTemp.Length)

            'objCryptoStream.FlushFinalBlock()
            objMemoryStream.Close()
            objCryptoStream.Close()
        Catch ex As Exception
            MsgBox("Error al desencriptar cadena de texto: " &
                   ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try

        'Devolver la cadena de texto desencriptada
        'convertida de array de bytes a cadena de texto ASCII
        Return quitarNullCadena(Encoding.ASCII.GetString(bytTemp))
    End Function

    'Quita nulos de una cadena de texto
    Public Function quitarNullCadena(
            ByVal texto As String) As String
        Dim posicionNull As Integer
        Dim textoSinNull As String

        posicionNull = 1
        textoSinNull = texto

        Do While posicionNull > 0
            posicionNull = InStr(posicionNull, texto, vbNullChar)

            If posicionNull > 0 Then
                textoSinNull =
                    Left$(textoSinNull, posicionNull - 1) & _
                    Right$(textoSinNull,
                    Len(textoSinNull) - posicionNull)
            End If

            If posicionNull > textoSinNull.Length Then
                Exit Do
            End If
        Loop

        Return textoSinNull
    End Function
End Class

 

AjpdSoft Insertar Evento Google Calendar

Si eres desarrollador de software y quieres descargar gratuitamente el código fuente source code completo en Microsoft Visual Basic .Net (Microsoft Visual Studio 2010) sólo tendrás que registrarte en nuestra web (de forma completamente gratuita) y acceder a la descarga:

AjpdSoft Insertar Evento Google Calendar

A continuación os mostramos la aplicación AjpdSoft Insertar Evento Google Calendar en funcionamiento:

En primer lugar introduciremos usuario y contraseña de nuestra cuenta de Google, si queremos comprobar si los datos son correctos pulsaremos "Probar validación":

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Si el usuario y contraseña pertenecen a una cuenta de Google mostrará el siguiente mensaje indicando "Validación realizada correctamente con la cuenta de Google indicada. Token ...":

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Para insertar o añadir un nuevo evento en un calendario del usuario, en primer lugar pulsaremos en el botón "Calendarios" en la pestaña "Insertar cita" para obtener la lista de todos los calendarios del usuario, a continuación seleccionaremos el calendario en el que queramos insertar el evento, introduciremos los datos (fecha desde, fecha hasta, evento, lugar, descripción, tipo de recordatorio, invitados y pulsaremos "Enviar evento":

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Si todo es correcto la aplicación AjpdSoft Insertar Evento Google Calendar mostrará el mensaje "Evento enviado correctamente a Google Calendar":

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Ahora podremos comprobar que, efectivamente, el evento ha sido añadido abriendo un navegador web y accediendo a nuestra cuenta de Google Calendar (Gmail):

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Pulsando en el evento podremos ver todos los datos insertados con nuestra aplicación AjpdSoft Insertar Evento Google Calendar:

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Desde la pestaña "Mostrar citas" podremos consultar todas las citas o eventos de cualquier calendario de nuestro usuario de Google Calendar, podremos acotar el resultado seleccionando una fecha desde y una fecha hasta. Como en la ventana de inserción de cita, en este caso también pulsaremos en "Calendarios" para obtener la lista de los calendarios del usuario, seleccionaremos el calendario del que queramos consultar los eventos, la fecha desde, fecha hasta y número máximo de eventos a consultar y pulsaremos en "Obtener citas". Si todo es correcto la aplicación AjpdSoft Insertar Evento Google Calendar obtendrá todos los eventos entre las fechas indicadas del calendario seleccionado: fecha de inicio, fecha de fin, asunto, lugar, descripción y participantes (invitados):

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

Además, en la ventana anterior, AjpdSoft Insertar Evento Google Calendar permite exportar las citas/eventos obtenidos a un fichero de texto CSV, para ello será suficiente con pulsar en el botón "Exportar citas a fichero CSV".

Desde la pestaña "Calendarios" podremos obtener la lista de todos los calendarios del usuario de Google Calendar e insertar un nuevo calendario:

Crear aplicación con Visual Basic .Net 2010 que inserta un evento en Google Calendar usando Google Data API

 

Anexo

  • Código fuente source code completo en Microsoft Visual Basic .Net 2010 VB.Net (fichero "formEnviarCitaCalendar.vb"):
Imports Google.GData.Calendar
Imports Google.GData.Client
Imports Google.GData.Extensions

Imports System.IO



Public Class formEnviarCitaCalendar

    'Para obtener las citas de un calendario Google Calendar
    Public Structure citasGoogleCalendar
        Public id As String
        Public titulo As String
        Public fechaInicio As Date
        Public fechaFin As Date
        Public contenido As String
        Public lugar As String
        Public participantes As String
    End Structure

    Dim citasT As New List(Of citasGoogleCalendar)


    'Para obtener los calendarios de Google Calendar
    Public Structure calendariosGoogleCalendar
        Public titulo As String
        Public uri As String
        Public descripcion As String
        Public soloLectura As Boolean
        Public creadores As String
    End Structure

    Dim calendariosT As New List(Of calendariosGoogleCalendar)

    ' Clase ColHeader es un objeto ColumnHeader con una propiedad
    ' adicional para determinar un orden ascendente o descendente
    ' True especifica orden ascendente, false descendente
    Public Class ColHeader
        Inherits ColumnHeader
        Public ascending As Boolean

        Public Sub New(ByVal [text] As String, ByVal width As Integer,
                       ByVal align As HorizontalAlignment, ByVal asc As Boolean)
            Me.Text = [text]
            Me.Width = width
            Me.TextAlign = align
            Me.ascending = asc
        End Sub
    End Class


    'Exportar contenido ListView a formato CSV 
    'para abrir con Microsoft Office Excel, OppenOffice Calc o con 
    Private Sub exportarListViewCSV(ByVal lstview As ListView, ByVal ficheroCSV As String)
        Dim lineasCSV As New System.Text.StringBuilder
        Dim lineaActual As String = String.Empty

        'Escribir nombre de columnas y encabezados en la variable temporal
        For columnIndex As Int32 = 0 To lstview.Columns.Count - 1
            lineaActual &= (String.Format(Chr(34) & "{0}" & Chr(34) & ";", lstview.Columns(columnIndex).Text))
        Next

        'Quitar la coma final
        lineasCSV.AppendLine(lineaActual.Substring(0, lineaActual.Length - 1))
        lineaActual = String.Empty

        'Escribir los datos del ListView en la variable temporal
        For Each item As ListViewItem In lstview.Items
            For Each subItem As ListViewItem.ListViewSubItem In item.SubItems
                lineaActual &= (String.Format(Chr(34) & "{0}" & Chr(34) & ";", subItem.Text))
            Next

            'Quitar coma final
            lineasCSV.AppendLine(lineaActual.Substring(0, lineaActual.Length - 1))
            lineaActual = String.Empty
        Next

        'Guardar datos variable temporal a fichero CSV
        Dim Sys As New System.IO.StreamWriter(ficheroCSV)
        Sys.WriteLine(lineasCSV.ToString)
        Sys.Flush()
        Sys.Dispose()
    End Sub

    Private Sub btValidar_Click(ByVal sender As System.Object,
                                ByVal e As System.EventArgs) Handles btValidar.Click
        Try
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            bePanel1.Text = "Validando credenciales en Google..."
            be.Refresh()

            'Autenticación en Google con usuario y contraseña
            Dim servicioGoogle As New CalendarService("AjpdSoftCitaGoogleCalendar")
            Dim token As String

            servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)
            token = servicioGoogle.QueryClientLoginToken()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            MsgBox("Validación realizada correctamente con la " & _
                   "cuenta de Google indicada." & _
                   vbCrLf & vbCrLf + "Token: " & vbCrLf & token,
                   MsgBoxStyle.Information + MsgBoxStyle.OkOnly)

        Catch ex As Exception
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            MsgBox("Se ha producido un error al intentar validar el usuario " &
                   "y la contraseña en Google: " & _
               vbCrLf & vbCrLf & ex.Message,
               MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub

    Function obtenerHoraMinuto(ByVal fecha As Date) As String
        Dim horaMinuto As String = "00:00"
        Dim hora As String = "00"
        Dim minuto As String = "00"

        If Len(Trim(Str(fecha.Hour))) = 1 Then
            hora = "0" & fecha.Hour
        Else
            hora = fecha.Hour
        End If
        If Len(Trim(Str(fecha.Minute))) = 1 Then
            minuto = "0" & fecha.Minute
        Else
            minuto = fecha.Minute
        End If

        horaMinuto = hora & ":" & minuto

        obtenerHoraMinuto = horaMinuto
    End Function

    Private Sub guardarDatosINI()
        Try
            Dim objFicherosINI As New FicherosINI(
                Path.Combine(Application.StartupPath, "configuracion.ini"))
            Dim objCifrarRSA As New encriptacionRSA()
            Dim ficheroDescripcion As String

            objFicherosINI.WriteString("Validación",
                                       "Usuario", txtUsuario.Text)
            objFicherosINI.WriteBoolean("Validación", "Guardar contraseña", opRecordarContrasena.Checked)
            objFicherosINI.WriteString("Evento",
                                       "Asunto", txtEvento.Text)
            objFicherosINI.WriteString("Evento",
                                       "Lugar", txtLugar.Text)
            objFicherosINI.WriteString("Evento",
                                       "Recordatorio - Tiempo", txtRecordatorioTiempo.Text)
            objFicherosINI.WriteString("Evento",
                                       "Recordatorio - Tipo", lsRecordatorio.Text)
            objFicherosINI.WriteString("Evento",
                                       "Recordatorio - Unidad", lsRecordatorioUnidadTiempo.Text)
            objFicherosINI.WriteString("Calendario", "Calendario actual", lsCalendarios.Text)
            objFicherosINI.WriteBoolean("Calendario", "Sólo propietario", opSoloPropietario.Checked)
            objFicherosINI.WriteString("Evento", "Invitados", txtInvitados.Text)

            If opRecordarContrasena.Checked = True Then
                ' Cifrar/Encriptar la contraseña y guardarla en el INI
                objFicherosINI.WriteString("Validación", "Contraseña",
                    Trim(objCifrarRSA.encriptar128BitRijndael(txtContrasena.Text, "clave_ajpdsoft")))
            Else
                objFicherosINI.WriteString("Validación", "Contraseña", "")
            End If

            'Guardar descripción en fichero
            ficheroDescripcion = Path.Combine(Application.StartupPath, "descripcion.txt")
            Dim fichero As New StreamWriter(ficheroDescripcion)
            fichero.WriteLine(txtDescripcion.Text)
            fichero.Close()

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub


    Private Sub formEnviarCitaCalendar_Load(
                   ByVal sender As System.Object,
                   ByVal e As System.EventArgs) Handles MyBase.Load

        Dim objFicherosINI As New FicherosINI(
            Path.Combine(Application.StartupPath, "configuracion.ini"))
        Dim objCifrarRSA As New encriptacionRSA()
        Dim fecha As Date = Now()
        Dim ficheroDescripcion As String
        Dim calendarioActual As String

        Try
            'Establecemos la fecha y hora de inicio y de fin
            fecha = DateTime.Now
            txtDesdeDia.Value = fecha
            txtHastaDia.Value = fecha
            txtDesdeHora.Text = obtenerHoraMinuto(fecha)
            fecha = fecha.AddMinutes(30)

            txtHastaHora.Text = obtenerHoraMinuto(fecha)

            'Cargamos los valores del fichero de configuracion.ini
            opRecordarContrasena.Checked = objFicherosINI.GetBoolean("Validación", "Guardar contraseña", False)
            txtUsuario.Text = objFicherosINI.GetString("Validación", "Usuario", "")
            txtEvento.Text = objFicherosINI.GetString("Evento", "Asunto", "")
            txtLugar.Text = objFicherosINI.GetString("Evento", "Lugar", "")
            txtRecordatorioTiempo.Text =
                objFicherosINI.GetString("Evento", "Recordatorio - Tiempo", "")
            lsRecordatorio.Text =
                objFicherosINI.GetString("Evento", "Recordatorio - Tipo", "")
            lsRecordatorioUnidadTiempo.Text =
                objFicherosINI.GetString("Evento", "Recordatorio - Unidad", "")
            txtInvitados.Text =
                objFicherosINI.GetString("Evento", "Invitados", "")
            calendarioActual = objFicherosINI.GetString("Calendario", "Calendario actual", "")
            lsCalendarios.Items.Add(calendarioActual)
            lsCalendarios.Text = calendarioActual
            opSoloPropietario.Checked = objFicherosINI.GetBoolean("Calendario", "Sólo propietario", False)
            opRecordarContrasena.Checked = objFicherosINI.GetBoolean("Validación", "Guardar contraseña", False)

            'Desencriptar/descifrar la contraseña y mostrarla
            txtContrasena.Text = objCifrarRSA.desencriptar128BitRijndael(
                objFicherosINI.GetString("Validación", "Contraseña", ""), "clave_ajpdsoft")

            ficheroDescripcion = Path.Combine(Application.StartupPath, "descripcion.txt")

            If File.Exists(ficheroDescripcion) = True Then
                Dim Reader As StreamReader = File.OpenText(ficheroDescripcion)
                Dim fichero As String = Reader.ReadToEnd()
                Reader.Close()
                txtDescripcion.Text = fichero
            End If

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub

    Private Sub btSalinSinGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        End
    End Sub

    Private Sub ValidarUsuarioToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        btValidar_Click(sender, e)
    End Sub

    Private Sub ObtenerCalendariosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        btListaCalendarios_Click(sender, e)
    End Sub

    Private Sub EnviarEventocitaToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        btEnviar_Click(sender, e)
    End Sub

    Private Sub LimpiarDatosActualesToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        btLimpiar_Click(sender, e)
    End Sub


    Private Sub SalirYGuardarDatosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        btSalir_Click(sender, e)
    End Sub

    'Obtiene los calendarios del usuario de Google Calendar
    Private Sub obtenerCalendarios(ByVal propietario As Boolean)
        Try
            'Alta del servicio de Google y autenticación en Google
            Dim servicioGoogle As New CalendarService("AjpdSoftInsertarCitaGoogleCalendar")
            servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)

            Dim consultaCalendar As CalendarQuery = New CalendarQuery()

            If propietario Then
                consultaCalendar.Uri =
                    New Uri("https://www.google.com/calendar/feeds/default/owncalendars/full")
            Else
                consultaCalendar.Uri =
                    New Uri("https://www.google.com/calendar/feeds/default/allcalendars/full")
            End If

            Dim resultadoFeed As CalendarFeed = servicioGoogle.Query(consultaCalendar)

            calendariosT.Clear()
            Dim creadoresCalendario As String
            Dim i As Integer
            For Each entradaActual As CalendarEntry In resultadoFeed.Entries
                Dim calendarios As New calendariosGoogleCalendar
                calendarios.titulo = entradaActual.Title.Text
                calendarios.uri = entradaActual.Id.AbsoluteUri.Substring(63)
                calendarios.descripcion = entradaActual.Summary.Text
                calendarios.soloLectura = resultadoFeed.ReadOnly
                creadoresCalendario = ""
                For i = 0 To resultadoFeed.Authors.Count - 1
                    If creadoresCalendario <> "" Then
                        creadoresCalendario = creadoresCalendario & ", " & resultadoFeed.Authors.Item(i).Email
                    Else
                        creadoresCalendario = resultadoFeed.Authors.Item(i).Email
                    End If
                Next

                calendarios.creadores = creadoresCalendario
                calendariosT.Add(calendarios)
            Next
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub



    'Obtiene las citas (eventos) del calendario indicado según el filtro indicado
    Private Sub obtenerCitasGoogleCalendar(ByVal calendario As String, ByVal numeroMaximoCitas As Integer)
        Dim lugarCita As String
        Dim participantesCita As String
        Dim i As Integer

        Try
            Dim servicioGoogle As Google.GData.Calendar.CalendarService =
                    New Google.GData.Calendar.CalendarService("AjpdSoftInsertarCitaGoogleCalendar")
            servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)
            Dim consultaCalendar As Google.GData.Calendar.EventQuery =
                New Google.GData.Calendar.EventQuery()
            ' consultaCalendar.Uri = New Uri("http://www.google.com/calendar/feeds/" +
            '                      servicioGoogle.Credentials.Username +
            '                    "/private/full?max-results=1000")

            'Insertamos el evento creado en Google Calendar
            consultaCalendar.Uri = New Uri("https://www.google.com/calendar/feeds/" &
                         calendario &
                         "/private/full?max-results=" & CStr(numeroMaximoCitas))

            consultaCalendar.StartTime = txtCitasDesde.Value
            consultaCalendar.EndTime = txtCitasHasta.Value

            Dim entradaFeed As Google.GData.Calendar.EventEntry
            Dim calendarioFeed As Google.GData.Calendar.EventFeed = servicioGoogle.Query(consultaCalendar)

            citasT.Clear()

            For Each entradaFeed In calendarioFeed.Entries
                Dim fechaEvento As New [When](entradaFeed.Times(0).StartTime, entradaFeed.Times(0).EndTime)
                Dim citasGoogle As New citasGoogleCalendar

                citasGoogle.contenido = entradaFeed.Content.Content
                citasGoogle.titulo = entradaFeed.Title.Text
                citasGoogle.fechaInicio = fechaEvento.StartTime
                citasGoogle.fechaFin = fechaEvento.EndTime

                lugarCita = ""
                For i = 0 To entradaFeed.Locations.Count - 1
                    If lugarCita <> "" Then
                        lugarCita = lugarCita & ", " & entradaFeed.Locations.Item(i).ValueString
                    Else
                        lugarCita = entradaFeed.Locations.Item(i).ValueString
                    End If
                Next
                citasGoogle.lugar = lugarCita

                participantesCita = ""
                For i = 0 To entradaFeed.Participants.Count - 1
                    If participantesCita <> "" Then
                        participantesCita = participantesCita & ", " & entradaFeed.Participants.Item(i).ValueString
                    Else
                        participantesCita = entradaFeed.Participants.Item(i).ValueString
                    End If
                Next
                citasGoogle.participantes = participantesCita
                citasT.Add(citasGoogle)
            Next
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub


    Private Sub btObtenerCitas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btObtenerCitas.Click
        If lsCalendariosCitas.Text = "" Then
            MsgBox("Debe especificiar el calendario del que se obtendrán los eventos/citas.",
                   MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            lsCalendariosCitas.Focus()
        Else
            Dim i As Integer

            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            bePanel1.Text = "Obteniendo eventos/citas de Google Calendar..."
            be.Refresh()
            Try
                lsCitas.BeginUpdate()
                lsCitas.Columns.Clear()
                lsCitas.Items.Clear()
                lsCitas.View = View.Details
                lsCitas.Columns.Add(New ColHeader("Fecha inicio", 120, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Fecha fin", 120, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Asunto", 200, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Lugar", 100, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Descripción", 200, HorizontalAlignment.Left, True))
                lsCitas.Columns.Add(New ColHeader("Participantes", 100, HorizontalAlignment.Left, True))
                obtenerCitasGoogleCalendar(calendariosT.Item(lsCalendariosCitas.SelectedIndex).uri, txtNumeroMaximoCitas.Value)
                For i = 0 To citasT.Count - 1
                    Dim elementoLista As New ListViewItem
                    elementoLista = New ListViewItem(CStr(citasT.Item(i).fechaInicio))
                    elementoLista.SubItems.Add(CStr(citasT.Item(i).fechaFin))
                    elementoLista.SubItems.Add(citasT.Item(i).titulo)
                    elementoLista.SubItems.Add(citasT.Item(i).lugar)
                    elementoLista.SubItems.Add(citasT.Item(i).contenido)
                    elementoLista.SubItems.Add(citasT.Item(i).participantes)
                    lsCitas.Items.Add(elementoLista)
                    lInfoNumCitas.Text = "Obteniendo evento/cita: " & CStr(i + 1)
                    lInfoNumCitas.Refresh()
                Next i
                lsCitas.EndUpdate()
                lInfoNumCitas.Text = "Número de citas/eventos: " & CStr(citasT.Count)
                lInfoNumCitas.Refresh()

                bePanel1.Text = "Obtenidas " & CStr(citasT.Count) & " citas"
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default

            Catch ex As Exception
                bePanel1.Text = "Error al consultar citas/eventos de Google Calendar."
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
                MsgBox("Se ha producido un error al intentar obtener eventos de Google Calendar: " & _
                    vbCrLf & vbCrLf & ex.Message,
                    MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
            End Try
        End If
    End Sub

    Private Sub btEnviar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btEnviar.Click
        If lsCalendarios.Text = "" Then
            MsgBox("Debe especificiar el calendario en el que se insertará el evento.",
                   MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            lsCalendarios.Focus()
        Else

            Try
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
                bePanel1.Text = "Enviando evento a Google Calendar..."
                be.Refresh()

                'Alta del servicio de Google y autenticación en Google
                Dim servicioGoogle As New CalendarService("AjpdSoftInsertarCitaGoogleCalendar")
                servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)

                Dim entradaCalendario As New EventEntry

                'Asunto (título) del evento Google Calendar
                entradaCalendario.Title.Text = txtEvento.Text

                'Descripción del evento Google Calendar
                entradaCalendario.Content.Content = txtDescripcion.Text

                'Lugar del evento Google Calendar
                Dim ubicacionEvento = New Where()
                ubicacionEvento.ValueString = txtLugar.Text
                entradaCalendario.Locations.Add(ubicacionEvento)

                'Fecha y hora inicio del evento, fecha y hora fin del evento Google Calendar
                Dim fechaInicioTxt As String = txtDesdeDia.Text & " " & txtDesdeHora.Text
                Dim fechaInicio As Date =
                    Date.Parse(fechaInicioTxt, System.Globalization.CultureInfo.CurrentCulture)
                Dim fechaFinTxt As String = txtHastaDia.Text & " " & txtHastaHora.Text
                Dim fechaFin As Date =
                    Date.Parse(fechaFinTxt, System.Globalization.CultureInfo.CurrentCulture)

                Dim desdeHastaCalendar As New [When](fechaInicio, fechaFin)
                entradaCalendario.Times.Add(desdeHastaCalendar)

                '** INICIO Activar tipo de Recordatorio
                Dim Recordatorio As New Reminder

                'Unidad de tiempo (horas, minutos, días)
                If lsRecordatorioUnidadTiempo.Text = "minutos" Then
                    Recordatorio.Minutes = CInt(txtRecordatorioTiempo.Text)
                End If
                If lsRecordatorioUnidadTiempo.Text = "horas" Then
                    Recordatorio.Hours = CInt(txtRecordatorioTiempo.Text)
                End If
                If lsRecordatorioUnidadTiempo.Text = "días" Then
                    Recordatorio.Days = CInt(txtRecordatorioTiempo.Text)
                End If

                'tipo de recordatorio (SMS, correo electrónico, ventana emergente)
                If lsRecordatorio.Text = "SMS" Then
                    Recordatorio.Method = Reminder.ReminderMethod.sms
                End If
                If lsRecordatorio.Text = "Correo electrónico" Then
                    Recordatorio.Method = Reminder.ReminderMethod.email
                End If
                If lsRecordatorio.Text = "Ventana emergente" Then
                    Recordatorio.Method = Reminder.ReminderMethod.alert
                End If

                entradaCalendario.Reminders.Add(Recordatorio)
                '** FIN Activar tipo de Recordatorio

                'Inserta los invitados de la cita de Google Calendar
                If txtInvitados.Text <> "" Then
                    Dim invintadosSeparados() As String
                    Dim i As Integer
                    invintadosSeparados = Split(txtInvitados.Text, ",")
                    Dim invitado As Who
                    For i = 0 To UBound(invintadosSeparados)
                        invitado = New Who()
                        invitado.Rel = Who.RelType.MESSAGE_TO
                        invitado.Email = invintadosSeparados(i)
                        entradaCalendario.Participants.Add(invitado)
                    Next i
                End If

                'Insertamos el evento creado en Google Calendar
                Dim uriDireccionGoogle As New Uri("https://www.google.com/calendar/feeds/" &
                             calendariosT.Item(lsCalendarios.SelectedIndex).uri & "/private/full")
                Dim entradaEventoInsertar As AtomEntry =
                    servicioGoogle.Insert(uriDireccionGoogle, entradaCalendario)

                MsgBox("Evento enviado correctamente a Google Calendar.",
                       MsgBoxStyle.OkOnly + MsgBoxStyle.Information)

                bePanel1.Text = "Evento enviado correctamente a Google Calendar"
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            Catch ex As Exception
                bePanel1.Text = "Error al enviar evento a Google Calendar..."
                be.Refresh()
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
                MsgBox("Se ha producido un error al intentar insertar un " & _
                       "evento en Google Calendar: " & _
                    vbCrLf & vbCrLf & ex.Message,
                    MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
            End Try
        End If
    End Sub


    Private Sub btListaCalendarios_Click(ByVal sender As System.Object,
                ByVal e As System.EventArgs) Handles btListaCalendarios.Click
        Dim titulo As String = ""
        Dim subtitulo As String = ""
        Try
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            bePanel1.Text = "Obteniendo lista de calendarios de Google Calendar..."
            be.Refresh()

            lsCalendarios.Items.Clear()

            obtenerCalendarios(opSoloPropietario.Checked)

            Dim i As Integer
            For i = 0 To calendariosT.Count - 1
                lsCalendarios.Items.Add(calendariosT.Item(i).titulo)
            Next i
            If calendariosT.Count > 0 Then
                lsCalendarios.SelectedIndex = 0
            End If

            bePanel1.Text = "Lista de calendarios obtenida correctamente"
            be.Refresh()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
        Catch ex As Exception
            bePanel1.Text = "Error al obtener lista de calendarios..."
            be.Refresh()
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            MsgBox("Se ha producido un error al intentar obtener la " & _
                   "lista de calendarios de Google Calendar: " & _
                vbCrLf & vbCrLf & ex.Message,
                MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub


    Private Sub btLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLimpiar.Click
        txtEvento.Text = ""
        txtLugar.Text = ""
        txtDescripcion.Text = ""
        txtInvitados.Text = ""
    End Sub

    Private Sub btSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSalir.Click
        guardarDatosINI()
        End
    End Sub

    Private Sub btSalinSinGuardar_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSalinSinGuardar.Click
        End
    End Sub

    Private Sub btCalendarioColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCalendarioColor.Click
        If dlColor.ShowDialog Then
            txtNuevoCalendarioColor.Text = "#" & CStr(Hex$(dlColor.Color.ToArgb))
        End If
    End Sub

    Private Sub btInsertarCalendario_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btInsertarCalendario.Click
        Try
            'Alta del servicio de Google y autenticación en Google
            Dim servicioGoogle As New CalendarService("AjpdSoftInsertarCitaGoogleCalendar")
            servicioGoogle.setUserCredentials(txtUsuario.Text, txtContrasena.Text)

            Dim entradaCalendario As New CalendarEntry
            entradaCalendario.Title.Text = txtNuevoCalendarioNombre.Text
            entradaCalendario.Summary.Text = txtNuevoCalendarioDescripcion.Text
            entradaCalendario.TimeZone = System.TimeZone.CurrentTimeZone.StandardName
            entradaCalendario.Hidden = opNuevoCalendarioOculto.Checked
            entradaCalendario.Color = txtNuevoCalendarioColor.Text
            entradaCalendario.Location = New Where("", "", txtNuevoCalendarioUbicacion.Text)
            entradaCalendario.Selected = opNuevoCalendarioSeleccionado.Checked

            Dim uriDireccionGoogle As New Uri("https://www.google.com/calendar/feeds/default/owncalendars/full")
            servicioGoogle.Insert(uriDireccionGoogle, entradaCalendario)

            Dim nuevoCalendario As CalendarEntry =
                servicioGoogle.Insert(uriDireccionGoogle, entradaCalendario)

            MsgBox("Calendario añadido correctamente.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly)

        Catch ex As Exception
            MsgBox("Se ha producido un error al intentar añadir un calendario: " & _
                    vbCrLf & vbCrLf & ex.Message,
                    MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try
    End Sub

    Private Sub btExportarCSV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExportarCSV.Click
        dlGuardar.Filter = "Archivos CSV (*.csv)|*.csv|Todos los archivos (*.*)|*.*"
        dlGuardar.FilterIndex = 1
        dlGuardar.DefaultExt = "csv"
        dlGuardar.FileName = "Eventos google calendar"
        dlGuardar.OverwritePrompt = True
        dlGuardar.Title = "Guardar eventos Google Calendar"
        If dlGuardar.ShowDialog Then
            exportarListViewCSV(lsCitas, dlGuardar.FileName)
        End If
    End Sub

    
    Private Sub btObtenerCalendariosMostrarCitas_Click(ByVal sender As System.Object, 
ByVal e As System.EventArgs) Handles btObtenerCalendariosMostrarCitas.Click Try System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor bePanel1.Text = "Obteniendo lista de calendarios de Google Calendar..." be.Refresh() lsCalendariosCitas.Items.Clear() obtenerCalendarios(opSoloPropietarioCitas.Checked) Dim i As Integer For i = 0 To calendariosT.Count - 1 lsCalendariosCitas.Items.Add(calendariosT.Item(i).titulo) Next i If calendariosT.Count > 0 Then lsCalendariosCitas.SelectedIndex = 0 End If bePanel1.Text = "Lista de calendarios obtenida correctamente" be.Refresh() System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default Catch ex As Exception bePanel1.Text = "Error al obtener lista de calendarios..." be.Refresh() System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default MsgBox("Se ha producido un error al intentar obtener la " & _ "lista de calendarios de Google Calendar: " & _ vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation) End Try End Sub Private Sub btObtenerCalendariosLista_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btObtenerCalendariosLista.Click Try System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor bePanel1.Text = "Obteniendo lista de calendarios de Google Calendar..." be.Refresh() lsListaCalendarios.Items.Clear() obtenerCalendarios(opSoloPropietarioListaCalendarios.Checked) lsListaCalendarios.BeginUpdate() lsListaCalendarios.Columns.Clear() lsListaCalendarios.Items.Clear() lsListaCalendarios.View = View.Details lsListaCalendarios.Columns.Add(New ColHeader("Título", 200, HorizontalAlignment.Left, True)) lsListaCalendarios.Columns.Add(New ColHeader("Descripción", 200, HorizontalAlignment.Left, True)) lsListaCalendarios.Columns.Add(New ColHeader("Creadores/Autores", 200, HorizontalAlignment.Left, True)) lsListaCalendarios.Columns.Add(New ColHeader("ID", 150, HorizontalAlignment.Left, True)) lsListaCalendarios.Columns.Add(New ColHeader("Sólo lectura", 100, HorizontalAlignment.Left, True)) Dim i As Integer For i = 0 To calendariosT.Count - 1 Dim elementoLista As New ListViewItem elementoLista = New ListViewItem(CStr(calendariosT.Item(i).titulo)) elementoLista.SubItems.Add(CStr(calendariosT.Item(i).descripcion)) elementoLista.SubItems.Add(CStr(calendariosT.Item(i).creadores)) elementoLista.SubItems.Add(calendariosT.Item(i).uri) elementoLista.SubItems.Add(CStr(calendariosT.Item(i).soloLectura)) lsListaCalendarios.Items.Add(elementoLista) Next i lsListaCalendarios.EndUpdate() bePanel1.Text = "Lista de calendarios obtenida correctamente" be.Refresh() System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default Catch ex As Exception bePanel1.Text = "Error al obtener lista de calendarios..." be.Refresh() System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default MsgBox("Se ha producido un error al intentar obtener la " & _ "lista de calendarios de Google Calendar: " & _ vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation) End Try End Sub End Class

  • Código fuente Visual Basic .Net (fichero "encriptacionRSA.vb"):
Imports System.Security.Cryptography
Imports System.Text
Imports System.IO


Public Class encriptacionRSA

    Public Function encriptar128BitRijndael(
            ByVal textoEncriptar As String,
            ByVal claveEncriptacion As String) As String
        Dim bytValue() As Byte
        Dim bytKey() As Byte
        Dim bytEncoded() As Byte = New Byte() {}
        Dim bytIV() As Byte = {121, 241, 10, 1, 132,
                               74, 11, 39, 255, 91, 45,
                               78, 14, 211, 22, 62}
        Dim intLength As Integer
        Dim intRemaining As Integer
        Dim objMemoryStream As New MemoryStream()
        Dim objCryptoStream As CryptoStream
        Dim objRijndaelManaged As RijndaelManaged


        'Quitar nulos en cadena de texto a encriptar
        textoEncriptar = quitarNullCadena(textoEncriptar)

        If textoEncriptar = "" Then
            Return ""
        End If

        bytValue = Encoding.ASCII.GetBytes(textoEncriptar.ToCharArray)

        intLength = Len(claveEncriptacion)


        'La clave de cifrado debe ser de 256 bits de longitud (32 bytes)
        'Si tiene más de 32 bytes se truncará
        'Si es menor de 32 bytes se rellenará con X
        If intLength >= 32 Then
            claveEncriptacion = Strings.Left(claveEncriptacion, 32)
        Else
            intLength = Len(claveEncriptacion)
            intRemaining = 32 - intLength
            claveEncriptacion = claveEncriptacion & Strings.StrDup(intRemaining, "X")
        End If

        bytKey = Encoding.ASCII.GetBytes(claveEncriptacion.ToCharArray)

        objRijndaelManaged = New RijndaelManaged()

        Try
            'Crear objeto Encryptor y escribir su valor 
            'después de que se convierta en array de bytes
            objCryptoStream = New CryptoStream(objMemoryStream, _
              objRijndaelManaged.CreateEncryptor(bytKey, bytIV), _
              CryptoStreamMode.Write)
            objCryptoStream.Write(bytValue, 0, bytValue.Length)

            objCryptoStream.FlushFinalBlock()

            bytEncoded = objMemoryStream.ToArray
            objMemoryStream.Close()
            objCryptoStream.Close()
        Catch ex As Exception
            MsgBox("Error al encriptar cadena de texto: " &
                   ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try

        'Devolver el valor del texto encriptado
        'convertido de array de bytes a texto en base64
        Return Convert.ToBase64String(bytEncoded)
    End Function



    Public Function desencriptar128BitRijndael(
            ByVal textoEncriptado As String,
            ByVal claveDesencriptacion As String) As String
        Dim bytDataToBeDecrypted() As Byte
        Dim bytTemp() As Byte
        Dim bytIV() As Byte = {121, 241, 10, 1, 132,
                               74, 11, 39, 255, 91,
                               45, 78, 14, 211, 22, 62}
        Dim objRijndaelManaged As New RijndaelManaged()
        Dim objMemoryStream As MemoryStream
        Dim objCryptoStream As CryptoStream
        Dim bytDecryptionKey() As Byte

        Dim intLength As Integer
        Dim intRemaining As Integer
        Dim strReturnString As String = String.Empty

        If textoEncriptado = "" Then
            Return ""
        End If

        'Convertir el valor encriptado base64 a array de bytes
        bytDataToBeDecrypted = Convert.FromBase64String(textoEncriptado)

        'La clave de desencriptación debe ser de 256 bits de longitud (32 bytes)
        'Si tiene más de 32 bytes se truncará
        'Si es menor de 32 bytes se rellenará con A
        intLength = Len(claveDesencriptacion)

        If intLength >= 32 Then
            claveDesencriptacion = Strings.Left(claveDesencriptacion, 32)
        Else
            intLength = Len(claveDesencriptacion)
            intRemaining = 32 - intLength
            claveDesencriptacion = claveDesencriptacion & Strings.StrDup(intRemaining, "X")
        End If

        bytDecryptionKey = Encoding.ASCII.GetBytes(claveDesencriptacion.ToCharArray)

        ReDim bytTemp(bytDataToBeDecrypted.Length)

        objMemoryStream = New MemoryStream(bytDataToBeDecrypted)

        Try
            'Crear objeto Dencryptor y escribir su valor 
            'después de que se convierta en array de bytes
            objCryptoStream = New CryptoStream(objMemoryStream, _
               objRijndaelManaged.CreateDecryptor(bytDecryptionKey, bytIV), _
               CryptoStreamMode.Read)

            objCryptoStream.Read(bytTemp, 0, bytTemp.Length)

            'objCryptoStream.FlushFinalBlock()
            objMemoryStream.Close()
            objCryptoStream.Close()
        Catch ex As Exception
            MsgBox("Error al desencriptar cadena de texto: " &
                   ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
        End Try

        'Devolver la cadena de texto desencriptada
        'convertida de array de bytes a cadena de texto ASCII
        Return quitarNullCadena(Encoding.ASCII.GetString(bytTemp))
    End Function

    'Quita nulos de una cadena de texto
    Public Function quitarNullCadena(
            ByVal texto As String) As String
        Dim posicionNull As Integer
        Dim textoSinNull As String

        posicionNull = 1
        textoSinNull = texto

        Do While posicionNull > 0
            posicionNull = InStr(posicionNull, texto, vbNullChar)

            If posicionNull > 0 Then
                textoSinNull =
                    Left$(textoSinNull, posicionNull - 1) & _
                    Right$(textoSinNull,
                    Len(textoSinNull) - posicionNull)
            End If

            If posicionNull > textoSinNull.Length Then
                Exit Do
            End If
        Loop

        Return textoSinNull
    End Function
End Class

  • Código fuente VB.Net fichero FicherosINI.vb:
Public Class FicherosINI
    ' Funciones del API de Windows para ficheros INI
    Private Declare Ansi Function GetPrivateProfileString _
      Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _
      (ByVal lpApplicationName As String, _
      ByVal lpKeyName As String, ByVal lpDefault As String, _
      ByVal lpReturnedString As System.Text.StringBuilder, _
      ByVal nSize As Integer, ByVal lpFileName As String) _
      As Integer

    Private Declare Ansi Function WritePrivateProfileString _
      Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
      (ByVal lpApplicationName As String, _
      ByVal lpKeyName As String, ByVal lpString As String, _
      ByVal lpFileName As String) As Integer

    Private Declare Ansi Function GetPrivateProfileInt _
      Lib "kernel32.dll" Alias "GetPrivateProfileIntA" _
      (ByVal lpApplicationName As String, _
      ByVal lpKeyName As String, ByVal nDefault As Integer, _
      ByVal lpFileName As String) As Integer

    Private Declare Ansi Function FlushPrivateProfileString _
      Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
      (ByVal lpApplicationName As Integer, _
      ByVal lpKeyName As Integer, ByVal lpString As Integer, _
      ByVal lpFileName As String) As Integer

    Dim strFilename As String

    ' Constructor, para aceptar el fichero INI
    Public Sub New(ByVal Filename As String)
        strFilename = Filename
    End Sub

    'Propiedad sólo lectura con nombre de fichero
    ReadOnly Property FileName() As String
        Get
            Return strFilename
        End Get
    End Property

    'Función para leer cadena de texto (string) de fichero INI
    Public Function GetString(ByVal Section As String, _
      ByVal Key As String, ByVal [Default] As String) As String
        Dim intCharCount As Integer
        Dim objResult As New System.Text.StringBuilder(256)

        intCharCount = GetPrivateProfileString(Section, Key, _
           [Default], objResult, objResult.Capacity, strFilename)
        If intCharCount > 0 Then
            GetString = Left(objResult.ToString, intCharCount)
        Else
            GetString = ""
        End If
    End Function

    'Función para leer un valor numérico del fichero INI
    Public Function GetInteger(ByVal Section As String, _
      ByVal Key As String, ByVal [Default] As Integer) As Integer
        Return GetPrivateProfileInt(Section, Key, _
           [Default], strFilename)
    End Function

    'Función para leer un valor booleano de fichero INI
    Public Function GetBoolean(ByVal Section As String, _
      ByVal Key As String, ByVal [Default] As Boolean) As Boolean
        Return (GetPrivateProfileInt(Section, Key, _
           CInt([Default]), strFilename) = 1)
    End Function

    'Función para escribir valor de cadena (string) en fichero INI
    Public Sub WriteString(ByVal Section As String, _
      ByVal Key As String, ByVal Value As String)
        WritePrivateProfileString(Section, Key, Value, strFilename)
        Flush()
    End Sub

    'Función para escribir valor numérico en fichero INI
    Public Sub WriteInteger(ByVal Section As String, _
      ByVal Key As String, ByVal Value As Integer)
        ' Writes an integer to your INI file
        WriteString(Section, Key, CStr(Value))
        Flush()
    End Sub

    'Función para escribir valor booleano en fichero INI
    Public Sub WriteBoolean(ByVal Section As String, _
    ByVal Key As String, ByVal Value As Boolean)
        ' Writes a boolean to your INI file
        WriteString(Section, Key, CStr(Math.Abs(CInt(Value))))
        Flush()
    End Sub

    'Guarda los cambios de la caché en fichero INI
    Private Sub Flush()
        FlushPrivateProfileString(0, 0, 0, strFilename)
    End Sub
End Class

 

Artículos relacionados

  

Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del proyecto AjpdSoft.


Anuncios


Enviado el Martes, 26 abril a las 01:25:27 por ajpdsoft
Este sitio web NO CONTIENE malware, todos los programas con código fuente aquí. Autor: Alonso Javier Pérez Díaz Google+ Síguenos en Google+