Imports System.Runtime.Remoting
Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization
Imports System.Windows.Forms
Imports System.Drawing
Imports tsl5.Enumeraciones
Imports tsl5.tsl5Model


Public Class Rutinas
    Shared Sub IniciaServicioNR(Puerto As Integer, Nombre As String, tipo As Type)
        Dim ht As New Hashtable
        ht("port") = Puerto
        ht("name") = Nombre
        Dim serverProvTcp As New System.Runtime.Remoting.Channels.BinaryServerFormatterSinkProvider
        serverProvTcp.TypeFilterLevel = Runtime.Serialization.Formatters.TypeFilterLevel.Full
        Dim clientProvTcp As New System.Runtime.Remoting.Channels.BinaryClientFormatterSinkProvider
        Dim tc As System.Runtime.Remoting.Channels.Tcp.TcpChannel = New System.Runtime.Remoting.Channels.Tcp.TcpChannel(ht, clientProvTcp, serverProvTcp)
        System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(tipo, Nombre & ".soap", WellKnownObjectMode.Singleton)
    End Sub
    Shared Function ObtieneObjetoServicioNR(Servidor As String, Puerto As Integer, Nombre As String) As tsl5.Interfaces.IServicioNR
        Dim sr As tsl5.Interfaces.IServicioNR
        Dim sPuertoNR As String = Puerto
        sr = System.Activator.GetObject(GetType(tsl5.Interfaces.IServicioNR), "tcp://" & Servidor & ":" & sPuertoNR & "/" & Nombre & ".soap")
        Return sr

    End Function
    'Shared Function ObtieneActualizaciones(VersionServidor As Datos.Actualizacion, ByRef VersionAComparar As Datos.Actualizacion) As tsl5.Enumeraciones.tipoActualizacionEnum
    '    Dim TipoActualizacion As tsl5.Enumeraciones.tipoActualizacionEnum = Enumeraciones.tipoActualizacionEnum.No_Actualizar
    '    Dim NuevosElementos As New List(Of Datos.ElementoActualizable)
    '    For Each fichero In VersionServidor.Elementos 'VersionAComparar.Elementos
    '        Dim sNombreFichero As String = fichero.NombreFichero
    '        Dim sRutaFichero As String = fichero.RutaFichero
    '        Dim TipoFichero As TipoFicheroActualizableEnum = fichero.tipoFichero
    '        Dim fs = From f In VersionAComparar.Elementos Where f.NombreFichero = sNombreFichero And f.tipoFichero = TipoFichero And f.RutaFichero = sRutaFichero Select f
    '        If fs.Count = 0 Then
    '            Dim NuevoFich As New Datos.ElementoActualizable
    '            NuevoFich = fichero
    '            NuevoFich.Comparacion = Enumeraciones.ComparacionEnum.Nuevo
    '            NuevosElementos.Add(NuevoFich)
    '            If NuevoFich.tipoFichero = Enumeraciones.tipoFicheroActualizableEnum.Datos Then
    '                If TipoActualizacion = Enumeraciones.tipoActualizacionEnum.No_Actualizar Then
    '                    TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Sin_Reinicio
    '                ElseIf TipoActualizacion = TipoActualizacionEnum.Actualizacion_Con_Reinicio Then
    '                    TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Mixta
    '                End If
    '            Else
    '                If TipoActualizacion = Enumeraciones.tipoActualizacionEnum.No_Actualizar Then
    '                    TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Con_Reinicio
    '                Else
    '                    If TipoActualizacion = TipoActualizacionEnum.Actualizacion_Sin_Reinicio Then TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Mixta
    '                End If
    '            End If
    '        Else
    '            If fs(0).FechaModificacion <> fichero.FechaModificacion Then
    '                If fichero.tipoFichero = Enumeraciones.tipoFicheroActualizableEnum.Datos Then
    '                    If TipoActualizacion = Enumeraciones.tipoActualizacionEnum.No_Actualizar Then
    '                        TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Sin_Reinicio
    '                    ElseIf TipoActualizacion = TipoActualizacionEnum.Actualizacion_Con_Reinicio Then
    '                        TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Mixta
    '                    End If
    '                Else
    '                    If TipoActualizacion = Enumeraciones.tipoActualizacionEnum.No_Actualizar Then
    '                        TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Con_Reinicio
    '                    Else
    '                        If TipoActualizacion = TipoActualizacionEnum.Actualizacion_Sin_Reinicio Then TipoActualizacion = Enumeraciones.tipoActualizacionEnum.Actualizacion_Mixta
    '                    End If
    '                End If
    '                fs(0).Comparacion = Enumeraciones.ComparacionEnum.Diferente
    '                fs(0).FechaModificacion = fichero.FechaModificacion
    '            Else
    '                fs(0).Comparacion = Enumeraciones.ComparacionEnum.Sin_Cambios
    '            End If
    '        End If
    '    Next
    '    For Each fichero In VersionAComparar.Elementos
    '        Dim sNombreFichero As String = fichero.NombreFichero
    '        Dim sRutaFichero As String = fichero.RutaFichero
    '        Dim TipoFichero As TipoFicheroActualizableEnum = fichero.tipoFichero
    '        Dim fs = From f In VersionServidor.Elementos Where f.NombreFichero = sNombreFichero And f.tipoFichero = TipoFichero And f.RutaFichero = sRutaFichero Select f
    '        'Dim fs = From f In VersionServidor.Elementos Where f.NombreFichero = sNombreFichero Select f
    '        If fs.Count = 0 Then
    '            fichero.Comparacion = Enumeraciones.ComparacionEnum.Inexistente
    '        End If
    '    Next
    '    For Each fichero In NuevosElementos
    '        VersionAComparar.Elementos.Add(fichero)
    '    Next
    '    Return TipoActualizacion
    'End Function

    'Public Shared Function ObtieneVersionFicherosRecursivo(NombreActualizacion As String, RutaDatos As String) As Datos.Actualizacion
    '    Dim Actualizacion As New Datos.Actualizacion       
    '    ObtieneVersion(Actualizacion, RutaDatos, RutaDatos, Enumeraciones.TipoFicheroActualizableEnum.Datos)
    '    Actualizacion.Nombre = NombreActualizacion
    '    Return Actualizacion
    'End Function

    'Public Shared Sub ObtieneVersion(ByRef Version As Datos.Actualizacion, Ruta As String, RutaInicial As String, TipoFichero As Enumeraciones.tipoFicheroActualizableEnum)
    '    Dim iBarra As Integer = 1
    '    If Ruta.EndsWith("\") Then iBarra = 0
    '    Dim sDirectorios() As String = IO.Directory.GetDirectories(Ruta)
    '    For Each sdirectorio In sDirectorios
    '        ObtieneVersion(Version, sdirectorio, RutaInicial, TipoFichero)
    '    Next
    '    Dim sFicheros() As String = IO.Directory.GetFiles(Ruta)
    '    Dim sfichero As String
    '    Dim ea As Datos.ElementoActualizable
    '    Dim fi As FileInfo
    '    For Each sfichero In sFicheros
    '        ea = New Datos.ElementoActualizable
    '        ea.NombreFichero = sfichero.Substring(Ruta.Length + iBarra)
    '        fi = New FileInfo(sfichero)
    '        ea.FechaModificacion = fi.LastWriteTimeUtc
    '        ea.tipoFichero = TipoFichero
    '        ea.RutaFichero = ""
    '        If Ruta <> RutaInicial Then ea.RutaFichero = Ruta.Substring(RutaInicial.Length).trimStart("\") & "\"
    '        Version.Elementos.Add(ea)
    '    Next
    'End Sub

    ' Shared Function GeneraDatosActualizacion(NombreActualizacion As String, RutaDatos As String) As Datos.Actualizacion
    '    Dim act As New Datos.Actualizacion
    '    act = ObtieneVersionFicherosRecursivo(NombreActualizacion, RutaDatos)
    '    Return act
    'End Function

    'Shared Sub InicioServicios(ByRef Configuracion As Datos.DatosConfiguracionServicio, ByRef VersionesFicherosCliente() As Datos.Actualizacion, ServicioNetRemoting As Type)
    '    'ReDim VersionesFicherosCliente(Configuracion.OtrosActualizadores.Count - 1)
    '    'Dim da As New Datos.Actualizacion
    '    'For i = 0 To Configuracion.OtrosActualizadores.Count - 1
    '    '    da = ObtieneVersionFicherosRecursivo(Configuracion.OtrosActualizadores(i).Nombre, Configuracion.OtrosActualizadores(i).RutaDatos)
    '    '    VersionesFicherosCliente(i) = da
    '    'Next
    '    Call tsl5.Rutinas.IniciaServicioNR(Configuracion.PuertoNR, Configuracion.NombreServicio, ServicioNetRemoting)
    'End Sub

    Shared Function IniciarSesion(FicheroConfiguracion As String, Usuario As String, SHA1passwd As String, ByRef idGrupoBD As Integer, dllProcesos As String) As tsl5.Datos.DatosSesionCliente
        Try
            Dim configuracionservidor As New tsl5.Datos.DatosConfiguracionServicio
            configuracionservidor = Datos.DatosConfiguracionServicio.CargaConfiguracion(FicheroConfiguracion, dllProcesos)
            Dim bd As New MySql.Data.MySqlClient.MySqlConnection(bbdd.GeneraConnectionStringMySQL(configuracionservidor.BasesDatos(0).Servidor, configuracionservidor.BasesDatos(0).DataBase, configuracionservidor.BasesDatos(0).Usuario, configuracionservidor.BasesDatos(0).Password, configuracionservidor.BasesDatos(0).Puerto))
            Dim drUsuario As DataRow = bbdd.ObtienePrimeraFilaMysql(bd, "Select * From Usuarios where Usuario=? and SHA1passwd=?", {Usuario, SHA1passwd})
            If drUsuario Is Nothing Then Throw New Exception("Usuario no válido")
            Dim drGrupo As DataRow = bbdd.ObtienePrimeraFilaMysql(bd, "Select * From GruposUsuarios where idGrupo=?", {drUsuario("idGrupo")})
            Dim ds As New tsl5.Datos.DatosSesionCliente
            ds.IdSesion = 1 'TODO: leer de constante    
            ds.idUsuario = drUsuario("idUsuarios")
            ds.idGrupoMenu = drGrupo("idGrupoMenu")
            idGrupoBD = drUsuario("idGrupobd")
            Return ds
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Public Shared Function ObtieneDatConexClienteSinServicio(FicheroConf As String, Peticion As tsl5.Datos.DatosConfiguracionCliente, idGrupoBD As Integer) As tsl5.Datos.DatosConexionCliente
        Try

            Return tsl5.Rutinas.ObtieneDatosConexionCliente(FicheroConf, Peticion.ConstantesCliente.NombreServicio, Peticion.ServidorActivo.Localizacion, idGrupoBD, "")
        Catch exc As Exception
            Throw New Exception(exc.Message, exc)
        End Try
    End Function

    Shared Function ObtieneDatosConexionClienteSinServicio(FicheroConfiguracion As String, NombreServicio As String, Localizacion As Enumeraciones.LocalizacionesEnum, idGrupoBD As Integer, dllProcesos As String) As tsl5.Datos.DatosConexionCliente
        Try
            Dim configuracionservidor As New tsl5.Datos.DatosConfiguracionServicio
            configuracionservidor = Datos.DatosConfiguracionServicio.CargaConfiguracion(FicheroConfiguracion, dllProcesos)
            Dim bd As New MySql.Data.MySqlClient.MySqlConnection(bbdd.GeneraConnectionStringMySQL(configuracionservidor.BasesDatos(0).Servidor, configuracionservidor.BasesDatos(0).DataBase, configuracionservidor.BasesDatos(0).Usuario, configuracionservidor.BasesDatos(0).Password, configuracionservidor.BasesDatos(0).Puerto))
            ' ''Dim drUsuario As DataRow = bbdd.ObtienePrimeraFilaMysql(bd, "Select * From Usuarios where Usuario=? and SHA1passwd=?", {Peticion.Usuario, Peticion.Password})
            ' ''If drUsuario Is Nothing Then Throw New Exception("Usuario no válido")
            Dim dtBBDD As DataTable = bbdd.ObtieneTablaMysql(bd, "SELECT * FROM conexionesbd inner join grupobd on grupobd.idgrupobd=conexionesbd.idgrupobd where grupobd.idgrupobd=?", {idGrupoBD})
            Dim dcc As New tsl5.Datos.DatosConexionCliente
            For Each dr In dtBBDD.Rows
                Dim bbdd As New tsl5.Datos.BBDD
                bbdd.Usuario = dr("Usuario")
                bbdd.Password = dr("Password")
                bbdd.DataBase = dr("Esquema")
                If Localizacion = Enumeraciones.LocalizacionesEnum.Local Then
                    bbdd.Servidor = dr("ServidorLocal")
                    bbdd.Puerto = dr("PuertoLocal")
                Else
                    bbdd.Servidor = dr("ServidorRemoto")
                    bbdd.Puerto = dr("PuertoRemoto")
                End If
                dcc.BasesDatos.Add(bbdd)
            Next

            'Dim act = From a In configuracionservidor.OtrosActualizadores Where a.Nombre = NombreServicio Select a
            'If Localizacion = Enumeraciones.LocalizacionesEnum.Local Then
            '    dcc.ServidorActualizador = act(0).ServidorLocal
            'Else
            '    dcc.ServidorActualizador = act(0).ServidorRemoto
            'End If
            Return dcc
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Shared Function ObtieneDatosConexionCliente(FicheroConfiguracion As String, NombreServicio As String, Localizacion As Enumeraciones.LocalizacionesEnum, idGrupoBD As Integer, dllProcesos As String) As tsl5.Datos.DatosConexionCliente
        Try
            Dim configuracionservidor As New tsl5.Datos.DatosConfiguracionServicio
            configuracionservidor = Datos.DatosConfiguracionServicio.CargaConfiguracion(FicheroConfiguracion, dllProcesos)
            Dim bd As New MySql.Data.MySqlClient.MySqlConnection(bbdd.GeneraConnectionStringMySQL(configuracionservidor.BasesDatos(0).Servidor, configuracionservidor.BasesDatos(0).DataBase, configuracionservidor.BasesDatos(0).Usuario, configuracionservidor.BasesDatos(0).Password, configuracionservidor.BasesDatos(0).Puerto))
            ' ''Dim drUsuario As DataRow = bbdd.ObtienePrimeraFilaMysql(bd, "Select * From Usuarios where Usuario=? and SHA1passwd=?", {Peticion.Usuario, Peticion.Password})
            ' ''If drUsuario Is Nothing Then Throw New Exception("Usuario no válido")
            Dim dtBBDD As DataTable = bbdd.ObtieneTablaMysql(bd, "SELECT * FROM conexionesbd inner join grupobd on grupobd.idgrupobd=conexionesbd.idgrupobd where grupobd.idgrupobd=?", {idGrupoBD})
            Dim dcc As New tsl5.Datos.DatosConexionCliente
            For Each dr In dtBBDD.Rows
                Dim bbdd As New tsl5.Datos.BBDD
                bbdd.Usuario = dr("Usuario")
                bbdd.Password = dr("Password")
                bbdd.DataBase = dr("Esquema")
                If Localizacion = Enumeraciones.LocalizacionesEnum.Local Then
                    bbdd.Servidor = dr("ServidorLocal")
                    bbdd.Puerto = dr("PuertoLocal")
                Else
                    bbdd.Servidor = dr("ServidorRemoto")
                    bbdd.Puerto = dr("PuertoRemoto")
                End If
                dcc.BasesDatos.Add(bbdd)
            Next

            'Dim act = From a In configuracionservidor.OtrosActualizadores Where a.Nombre = NombreServicio Select a
            'If Localizacion = Enumeraciones.LocalizacionesEnum.Local Then
            '    dcc.ServidorActualizador = act(0).ServidorLocal
            'Else
            '    dcc.ServidorActualizador = act(0).ServidorRemoto
            'End If
            Return dcc
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Shared Function IniciaSesion(sr As tsl5.Interfaces.IServicioNR, Usuario As String, Contraseña As String, idGrupoBD As Integer) As Datos.DatosSesionCliente
        Dim e As Exception = Nothing
        Dim dsc As Datos.DatosSesionCliente
        dsc = sr.IniciaSesion(Usuario, Contraseña, idGrupoBD, e)
        If Not e Is Nothing Then Throw e
        Return dsc
    End Function

    Public Shared Function IniciaSesionSinServicio(Usuario As String, Contraseña As String, ByRef idGrupoBD As Integer, Aplicacion As String, ByRef ex As System.Exception) As tsl5.Datos.DatosSesionCliente
        Try
            ex = Nothing
            Dim sSHA1passwd As String = crypt.SHA1("M3Soft." & Contraseña)
            Dim sFicheroConf As String = ObtieneFicheroConfiguracionGenerico(Aplicacion)
            Return tsl5.Rutinas.IniciarSesion(sFicheroConf, Usuario, sSHA1passwd, idGrupoBD, "")
        Catch exc As Exception
            ex = exc
            Return Nothing
        End Try
    End Function

    Shared Function ObtieneFicheroConfiguracionGenerico(Aplicacion) As String
        Dim sRutaConfiguraciones As String
        sRutaConfiguraciones = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) & "\Depuracion\" & Aplicacion & "\Servidor\ServidorConfig.xml"
        If Not IO.File.Exists(sRutaConfiguraciones) Then
            sRutaConfiguraciones = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) & "\" & Aplicacion & "\Servidor\ServidorConfig.xml"
        End If
        Return sRutaConfiguraciones
    End Function


    Shared Function ObtieneDatConexCliente(Dcc As Datos.DatosConfiguracionCliente, ByRef sr As tsl5.Interfaces.IServicioNR, idGrupoBD As Integer) As Datos.DatosConexionCliente
        Dim e As Exception = Nothing
        Dim dc As Datos.DatosConexionCliente
        sr = tsl5.Rutinas.ObtieneObjetoServicioNR(Dcc.ServidorActivo.Servidor, Dcc.ServidorActivo.Puerto, Dcc.ConstantesCliente.NombreServicio)
        'dc = sr.IniciaSesion(Dcc, e)
        dc = sr.ObtieneDatosConexionCliente(Dcc, idGrupoBD, e)
        If Not e Is Nothing Then Throw e
        Return dc
    End Function

    'Shared Sub ActualizaCliente(DatConfCli As Datos.DatosConfiguracionCliente, ByRef DatConexCli As Datos.DatosConexionCliente, sr As tsl5.Interfaces.IServicioNR)
    '    Try
    '        If Not Windows.Forms.Application.StartupPath.ToLower.StartsWith("c:\tecnosis.tfs\") Then
    '            Dim da As New Datos.Actualizacion
    '            Dim e As Exception = Nothing
    '            da = tsl5.Rutinas.GeneraDatosActualizacion(DatConfCli.ConstantesCliente.NombreServicio, DatConfCli.ConstantesCliente.RutaDatos)
    '            Dim ap As Enumeraciones.tipoActualizacionEnum = sr.CompruebaActualizacionesCliente(DatConfCli.ConstantesCliente.NombreServicio, da, e)
    '            If Not e Is Nothing Then Throw e
    '            Select Case ap
    '                Case Enumeraciones.tipoActualizacionEnum.Actualizacion_Mixta
    '                    Actualiza(da, DatConfCli, DatConexCli, TipoFicheroActualizableEnum.Datos)
    '                    LlamaActualizadorAuxiliar(da, DatConfCli, DatConexCli)
    '                Case Enumeraciones.tipoActualizacionEnum.Actualizacion_Sin_Reinicio
    '                    Actualiza(da, DatConfCli, DatConexCli, TipoFicheroActualizableEnum.Datos)
    '                Case TipoActualizacionEnum.Actualizacion_Con_Reinicio
    '                    LlamaActualizadorAuxiliar(da, DatConfCli, DatConexCli)
    '            End Select
    '        End If
    '    Catch ex As Exception
    '        Throw ex
    '    End Try
    'End Sub

    'Public Shared Sub Actualiza(DatosActualizacion As Datos.Actualizacion, DatConfCli As Datos.DatosConfiguracionCliente, DatConexCli As Datos.DatosConexionCliente, FicherosAActualizar As TipoFicheroActualizableEnum)
    '    Try
    '        If IO.Directory.Exists(DatConfCli.ConstantesCliente.RutaTmp) Then IO.Directory.Delete(DatConfCli.ConstantesCliente.RutaTmp, True)
    '        IO.Directory.CreateDirectory(DatConfCli.ConstantesCliente.RutaTmp)
    '        Dim fActualizador As New frmActualizador
    '        fActualizador.tipoActualizacion = FicherosAActualizar
    '        fActualizador.DatosActualizacion = DatosActualizacion
    '        fActualizador.DatConfCli = DatConfCli
    '        fActualizador.DatConexCli = DatConexCli
    '        fActualizador.ShowDialog()
    '    Catch ex As Exception
    '        Throw ex
    '    End Try
    'End Sub

    'Private Shared Sub DescargaElementoFTP(servidorActualizacion As Datos.ServidorActualizacion, NombreFichero As String, RutaDescarga As String)
    '    Dim ftp As New Dart.PowerTCP.SecureFtp.Ftp
    '    ftp.Server = servidorActualizacion.Servidor
    '    ftp.Username = servidorActualizacion.Usuario
    '    ftp.Password = servidorActualizacion.Contraseña
    '    ftp.Passive = servidorActualizacion.Pasivo
    '    ftp.ServerPort = servidorActualizacion.Puerto
    '    If servidorActualizacion.SSL Then
    '        ftp.Security = Dart.PowerTCP.SecureFtp.Security.Implicit
    '    Else
    '        ftp.Security = Dart.PowerTCP.SecureFtp.Security.None
    '    End If
    '    ftp.Get(servidorActualizacion.Directorio & NombreFichero, RutaDescarga & NombreFichero)
    'End Sub

    'Private Shared Sub DescargaElementoSamba(servidorActualizacion As Datos.ServidorActualizacion, NombreFichero As String, RutaDescarga As String)
    '    IO.File.Copy(servidorActualizacion.Directorio & "\" & NombreFichero, RutaDescarga & NombreFichero, True)
    'End Sub

    'Private Shared Sub LlamaActualizadorAuxiliar(da As Datos.Actualizacion, DatConfCli As Datos.DatosConfiguracionCliente, DatConexCli As Datos.DatosConexionCliente)
    '    Dim DatosActAux As New Datos.DatosActualizadorAuxiliar
    '    DatosActAux.Actualizacion = da
    '    DatosActAux.ConfiguracionCliente = DatConfCli
    '    DatosActAux.ConexionCliente = DatConexCli
    '    DatosActAux.RutaEjecutable = Windows.Forms.Application.StartupPath & "\" & Process.GetCurrentProcess.ProcessName & ".exe"
    '    Dim sFicDatosAct As String
    '    sFicDatosAct = DatConfCli.ConstantesCliente.RutaDatos & "\ActualizadorAuxiliar\DatosActAux.xml"
    '    Utilidades.serializar(DatosActAux, sFicDatosAct)
    '    If Not IO.File.Exists(DatConfCli.ConstantesCliente.RutaDatos & "\ActualizadorAuxiliar\ActualizadorAuxiliar.exe") Then
    '        MsgBox("No existe el programa actualizador", MsgBoxStyle.Critical, "Error")
    '    Else
    '        Process.Start(DatConfCli.ConstantesCliente.RutaDatos & "\ActualizadorAuxiliar\ActualizadorAuxiliar.exe", sFicDatosAct)
    '        'MsgBox("El programa se tiene que actualizar.")
    '        'Windows.Forms.Application.Exit()
    '        Environment.Exit(0)

    '    End If
    'End Sub

    Shared Sub GeneraMenus(Formulario As Form, datconexcli As Datos.DatosConexionCliente, datsesioncli As Datos.DatosSesionCliente, Evento As EventHandler)
        Dim menuprincipal As New MenuStrip
        Dim bd As tsl5Entities
        menuprincipal.Location = New Point(0.0)
        Dim tsmi As ToolStripMenuItem
        Select Case datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Tipo
            Case TipoBD.MYSQL
                bd = bbdd.ConectarTsl5EntityMySQL(datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Servidor, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).DataBase, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Puerto, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Usuario, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Password, "tsl5Model")
            Case TipoBD.SQLSERVER
                bd = bbdd.ConectarTsl5EntitySQLServer(datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Servidor, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).DataBase, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Usuario, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Password, "tsl5Model")
            Case TipoBD.LOCALDB
                bd = bbdd.ConectarTsl5EntityLocalDB(datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Servidor, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).Fichero, datconexcli.BasesDatos(datconexcli.NumeroBDConfiguracion).DataBase, "tsl5Model")
            Case Else
                Throw New Exception("Tipo de bd no soportado")
        End Select


        Dim menuiniciales = (From m In bd.menus Where m.idGrupoMenu = datsesioncli.idGrupoMenu Order By m.Orden Select m).ToList

        For Each mi In menuiniciales
            tsmi = New ToolStripMenuItem(mi.Texto, Nothing, Evento)
            Call generamenurecursivo(bd, tsmi, mi, Evento)
            menuprincipal.Items.Add(tsmi)
        Next

        Formulario.Controls.Add(menuprincipal)
        Formulario.MainMenuStrip = menuprincipal
    End Sub

    Private Shared Sub generamenurecursivo(bd As tsl5Entities, ByRef tsmi As ToolStripMenuItem, mi As menus, Evento As EventHandler)
        Dim tssmi As ToolStripMenuItem
        Dim submenus = (From m In bd.menus Where m.idMenuPadre = mi.idMenus Order By m.Orden Select m).ToList
        For Each sm In submenus
            tssmi = New ToolStripMenuItem(sm.Texto, Nothing, Evento)
            tssmi.Tag = sm.Accion
            tssmi.ToolTipText = sm.Ayuda
            Call generamenurecursivo(bd, tssmi, sm, Evento)
            tsmi.DropDownItems.Add(tssmi)
        Next
    End Sub
    <System.Diagnostics.DebuggerStepThrough()> Public Shared Function Ttagi(ByVal sValortag As String, ByVal sToken As String) As String
        Ttagi = ""
        Try
            sValortag = "|" & sValortag & "|"
            If InStr(1, "|" & sValortag & "|", "|" & sToken & "=", vbTextCompare) > 0 Then
                Ttagi = Mid(sValortag, (InStr(1, sValortag, "|" & sToken & "=") + Len(sToken) + 2), InStr(1, Mid(sValortag, InStr(1, sValortag, "|" & sToken & "=") + Len(sToken) + 2), "|") - 1)
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Function
    Public Shared Function FindType(ByVal name As String) As Type
        Dim base As Type

        base = Reflection.Assembly.GetEntryAssembly.GetType(name, False, True)
        If base IsNot Nothing Then Return base

        base = Reflection.Assembly.GetExecutingAssembly.GetType(name, False, True)
        If base IsNot Nothing Then Return base

        For Each assembly As Reflection.Assembly In _
          AppDomain.CurrentDomain.GetAssemblies
            base = assembly.GetType(name, False, True)
            If base IsNot Nothing Then Return base
        Next
        Throw New Exception("Clase no encontrada")
    End Function
    Public Shared Sub InicioCliente(NombreServicio As String, Formulario As Form, tcFormularios As System.Windows.Forms.TabControl, FichConfProduccion As String, FichConfDesarrollo As String, Evento As EventHandler, ByRef datconfcli As Datos.DatosConfiguracionCliente, ByRef datconexcli As Datos.DatosConexionCliente, ByRef datsesioncli As Datos.DatosSesionCliente)
        Try
            Dim fidentificacion As New frmIdentificacion
            Dim sr As tsl5.Interfaces.IServicioNR = Nothing
            Dim datconfapl As Datos.DatosConfiguracionAplicacion = Nothing
            Dim sFichConf As String
            If IO.File.Exists(FichConfDesarrollo) Then
                sFichConf = FichConfDesarrollo
            Else
                sFichConf = FichConfProduccion
            End If
            Dim bReintentar As Boolean = True
            Dim bCambiarConfiguracion As Boolean
            Dim bGuardarConfiguracion As Boolean
            Do
                If bReintentar Then
                    If Not IO.File.Exists(sFichConf) Or bCambiarConfiguracion Then

                        Dim fConfig As New frmConfiguracionAplicacion
                        Dim ServLocal As New tsl5.Datos.Servidor
                        Dim ServRemoto As New tsl5.Datos.Servidor
                        If datconfapl Is Nothing Then
                            fConfig.tbRutaDatos.Text = IO.Path.GetDirectoryName(sFichConf) & "\datos\"
                            fConfig.tbRutaTemporales.Text = IO.Path.GetDirectoryName(sFichConf) & "\tmp\"
                        Else
                            fConfig.tbRutaDatos.Text = datconfcli.ConstantesCliente.RutaDatos
                            fConfig.tbRutaTemporales.Text = datconfcli.ConstantesCliente.RutaTmp
                            For Each servidor In datconfapl.Servidores
                                Try
                                    If servidor.Localizacion = LocalizacionesEnum.Local Then
                                        fConfig.tbServidorLocal.Text = servidor.Servidor
                                        fConfig.tbPuertoLocal.Text = servidor.Puerto
                                    Else
                                        fConfig.tbServidorRemoto.Text = servidor.Servidor
                                        fConfig.tbPuertoRemoto.Text = servidor.Puerto
                                    End If
                                Catch ex As Exception
                                End Try
                            Next
                        End If
                        fConfig.tbServidorLocal.Focus()
                        fConfig.ShowDialog()


                        Dim conscli As New Datos.ConstantesCliente
                        conscli.NombreServicio = NombreServicio
                        conscli.RutaDatos = fConfig.tbRutaDatos.Text
                        conscli.RutaTmp = fConfig.tbRutaTemporales.Text
                        conscli.RutaAplicacion = Windows.Forms.Application.StartupPath
                        datconfapl = New Datos.DatosConfiguracionAplicacion
                        datconfapl.ConstantesCliente = conscli
                        If fConfig.tbServidorLocal.Text.Trim <> "" Then
                            ServLocal.Localizacion = LocalizacionesEnum.Local
                            ServLocal.Servidor = fConfig.tbServidorLocal.Text
                            ServLocal.Puerto = fConfig.tbPuertoLocal.Text
                            datconfapl.Servidores.Add(ServLocal)
                        End If
                        If fConfig.tbServidorRemoto.Text.Trim <> "" Then
                            ServRemoto.Localizacion = LocalizacionesEnum.Remoto
                            ServRemoto.Servidor = fConfig.tbServidorRemoto.Text
                            ServRemoto.Puerto = fConfig.tbPuertoRemoto.Text
                            datconfapl.Servidores.Add(ServRemoto)
                        End If
                        bGuardarConfiguracion = True
                    Else
                        datconfapl = New Datos.DatosConfiguracionAplicacion
                        datconfapl = tsl5.Utilidades.DeserializaFichero(sFichConf, datconfapl.GetType)
                    End If
                End If
                Try
                    Dim bConectado As Boolean = False
                    For Each servidor In datconfapl.Servidores
                        Try
                            datconfcli = New Datos.DatosConfiguracionCliente
                            datconfcli.ServidorActivo = servidor
                            datconfcli.ConstantesCliente = datconfapl.ConstantesCliente
                            datconfcli.NombreEjecutable = Process.GetCurrentProcess.ProcessName & ".exe"
                            datconexcli = tsl5.Rutinas.ObtieneDatConexCliente(datconfcli, sr, 1)
                            bConectado = True
                            Exit For
                        Catch ex As Exception
                        End Try
                    Next
                    If Not bConectado Then Throw New Exception("No se ha podido conectar con ninguno de los servidores")
                    If bGuardarConfiguracion Then
                        If IO.File.Exists(sFichConf) Then IO.File.Delete(sFichConf)
                        tsl5.Utilidades.CreaEstructuraDirectorio(IO.Path.GetDirectoryName(sFichConf))
                        tsl5.Utilidades.CreaEstructuraDirectorio(datconfcli.ConstantesCliente.RutaDatos)
                        tsl5.Utilidades.CreaEstructuraDirectorio(datconfcli.ConstantesCliente.RutaTmp)
                        tsl5.Utilidades.serializar(datconfapl, sFichConf)
                    End If

                    Exit Do
                Catch ex As Exception
                    Select Case MsgBox(ex.Message & vbCrLf & "Pulse si para volver a intentar, 'no' para modificar la configuración, cancelar para salir de la aplicación", MsgBoxStyle.YesNoCancel, "¡Atención!")
                        Case MsgBoxResult.No
                            bReintentar = True
                            If IO.File.Exists(sFichConf) Then IO.File.Delete(sFichConf)
                        Case MsgBoxResult.Yes
                            bReintentar = False

                        Case MsgBoxResult.Cancel
                            Environment.Exit(0)
                    End Select
                End Try
            Loop
            '   tsl5.Rutinas.ActualizaCliente(datconfcli, datconexcli, sr) 'solo datos 20120614
            Dim exc As Exception = Nothing
            Dim idGrupoBD As Integer
            Do
                exc = Nothing
                Try
                    If fidentificacion.ShowDialog = Windows.Forms.DialogResult.OK Then
                        datsesioncli = sr.IniciaSesion(fidentificacion.tbUsuario.Text, fidentificacion.tbClave.Text, idGrupoBD, exc)
                        If Not exc Is Nothing Then Throw exc
                        Exit Do
                    Else
                        Environment.Exit(0)
                    End If
                Catch ex As Exception
                    MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Atención")
                End Try
            Loop
            If idGrupoBD <> 1 Then datconexcli = tsl5.Rutinas.ObtieneDatConexCliente(datconfcli, sr, idGrupoBD)
            tsl5.Rutinas.GeneraMenus(Formulario, datconexcli, datsesioncli, Evento)
            tcFormularios.CausesValidation = False
            Formulario.IsMdiContainer = True
            Dim c As Control
            For Each c In Formulario.Controls
                If TypeOf c Is MdiClient Then
                    ' '' c.BackColor = Color.FromArgb(8, 98, 83)
                    c.BackColor = Color.White
                    Exit For
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message & vbCrLf & ex.StackTrace, MsgBoxStyle.Exclamation, "Error frmInicio_Load")
            Environment.Exit(0)
        Finally
            Formulario.Enabled = True
        End Try
    End Sub
    Public Shared Sub InicioClienteSinServicio(Aplicacion As String, Formulario As Form, tcFormularios As System.Windows.Forms.TabControl, FicheroConfServidor As String, FichConfProduccion As String, FichConfDesarrollo As String, Evento As EventHandler, ByRef datconfcli As Datos.DatosConfiguracionCliente, ByRef datconexcli As Datos.DatosConexionCliente, ByRef datsesioncli As Datos.DatosSesionCliente, Optional NumeroBDServicio As Integer = 0)
        Try
            Dim fidentificacion As New frmIdentificacion
            'Dim sr As tsl5.Interfaces.IServicioNR = Nothing
            Dim datconfapl As Datos.DatosConfiguracionAplicacion = Nothing
            Dim sFichConf As String
            If IO.File.Exists(FichConfDesarrollo) Then
                sFichConf = FichConfDesarrollo
            Else
                sFichConf = FichConfProduccion
            End If
            Dim bReintentar As Boolean = True
            Dim bCambiarConfiguracion As Boolean
            Dim bGuardarConfiguracion As Boolean
            Do
                If bReintentar Then
                    If Not IO.File.Exists(sFichConf) Or bCambiarConfiguracion Then

                        Dim fConfig As New frmConfiguracionAplicacion
                        Dim ServLocal As New tsl5.Datos.Servidor
                        Dim ServRemoto As New tsl5.Datos.Servidor
                        If datconfapl Is Nothing Then
                            fConfig.tbRutaDatos.Text = IO.Path.GetDirectoryName(sFichConf) & "\datos\"
                            fConfig.tbRutaTemporales.Text = IO.Path.GetDirectoryName(sFichConf) & "\tmp\"
                        Else
                            fConfig.tbRutaDatos.Text = datconfcli.ConstantesCliente.RutaDatos
                            fConfig.tbRutaTemporales.Text = datconfcli.ConstantesCliente.RutaTmp
                            For Each servidor In datconfapl.Servidores
                                Try
                                    If servidor.Localizacion = LocalizacionesEnum.Local Then
                                        fConfig.tbServidorLocal.Text = servidor.Servidor
                                        fConfig.tbPuertoLocal.Text = servidor.Puerto
                                    Else
                                        fConfig.tbServidorRemoto.Text = servidor.Servidor
                                        fConfig.tbPuertoRemoto.Text = servidor.Puerto
                                    End If
                                Catch ex As Exception
                                End Try
                            Next
                        End If
                        fConfig.tbServidorLocal.Focus()
                        fConfig.ShowDialog()


                        Dim conscli As New Datos.ConstantesCliente
                        conscli.NombreServicio = ""
                        conscli.RutaDatos = fConfig.tbRutaDatos.Text
                        conscli.RutaTmp = fConfig.tbRutaTemporales.Text
                        conscli.RutaAplicacion = Windows.Forms.Application.StartupPath
                        datconfapl = New Datos.DatosConfiguracionAplicacion
                        datconfapl.ConstantesCliente = conscli
                        If fConfig.tbServidorLocal.Text.Trim <> "" Then
                            ServLocal.Localizacion = LocalizacionesEnum.Local
                            ServLocal.Servidor = fConfig.tbServidorLocal.Text
                            ServLocal.Puerto = fConfig.tbPuertoLocal.Text
                            datconfapl.Servidores.Add(ServLocal)
                        End If
                        If fConfig.tbServidorRemoto.Text.Trim <> "" Then
                            ServRemoto.Localizacion = LocalizacionesEnum.Remoto
                            ServRemoto.Servidor = fConfig.tbServidorRemoto.Text
                            ServRemoto.Puerto = fConfig.tbPuertoRemoto.Text
                            datconfapl.Servidores.Add(ServRemoto)
                        End If
                        bGuardarConfiguracion = True
                    Else
                        datconfapl = New Datos.DatosConfiguracionAplicacion
                        datconfapl = tsl5.Utilidades.DeserializaFichero(sFichConf, datconfapl.GetType)
                    End If
                End If
                Try
                    Dim bConectado As Boolean = False
                    For Each servidor In datconfapl.Servidores
                        Try
                            datconfcli = New Datos.DatosConfiguracionCliente
                            datconfcli.ServidorActivo = servidor
                            datconfcli.ConstantesCliente = datconfapl.ConstantesCliente
                            datconfcli.NombreEjecutable = Process.GetCurrentProcess.ProcessName & ".exe"
                            datconexcli = tsl5.Rutinas.ObtieneDatConexClienteSinServicio(FicheroConfServidor, datconfcli, 1)
                            bConectado = True
                            Exit For
                        Catch ex As Exception
                        End Try
                    Next
                    If Not bConectado Then Throw New Exception("No se ha podido conectar con ninguno de los servidores")
                    If bGuardarConfiguracion Then
                        If IO.File.Exists(sFichConf) Then IO.File.Delete(sFichConf)
                        tsl5.Utilidades.CreaEstructuraDirectorio(IO.Path.GetDirectoryName(sFichConf))
                        tsl5.Utilidades.CreaEstructuraDirectorio(datconfcli.ConstantesCliente.RutaDatos)
                        tsl5.Utilidades.CreaEstructuraDirectorio(datconfcli.ConstantesCliente.RutaTmp)
                        tsl5.Utilidades.serializar(datconfapl, sFichConf)
                    End If

                    Exit Do
                Catch ex As Exception
                    Select Case MsgBox(ex.Message & vbCrLf & "Pulse si para volver a intentar, 'no' para modificar la configuración, cancelar para salir de la aplicación", MsgBoxStyle.YesNoCancel, "¡Atención!")
                        Case MsgBoxResult.No
                            bReintentar = True
                            If IO.File.Exists(sFichConf) Then IO.File.Delete(sFichConf)
                        Case MsgBoxResult.Yes
                            bReintentar = False

                        Case MsgBoxResult.Cancel
                            Environment.Exit(0)
                    End Select
                End Try
            Loop
            '   tsl5.Rutinas.ActualizaCliente(datconfcli, datconexcli, sr) 'solo datos 20120614
            Dim exc As Exception = Nothing
            Dim idGrupoBD As Integer
            Do
                exc = Nothing
                Try
                    If fidentificacion.ShowDialog = Windows.Forms.DialogResult.OK Then
                        datsesioncli = IniciaSesionSinServicio(fidentificacion.tbUsuario.Text, fidentificacion.tbClave.Text, idGrupoBD, Aplicacion, exc)
                        If Not exc Is Nothing Then Throw exc
                        Exit Do
                    Else
                        Environment.Exit(0)
                    End If
                Catch ex As Exception
                    MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Atención")
                End Try
            Loop
            If idGrupoBD <> 1 Then datconexcli = tsl5.Rutinas.ObtieneDatConexClienteSinServicio(FicheroConfServidor, datconfcli, idGrupoBD)
            tsl5.Rutinas.GeneraMenus(Formulario, datconexcli, datsesioncli, Evento)
            tcFormularios.CausesValidation = False
            Formulario.IsMdiContainer = True
            Dim c As Control
            For Each c In Formulario.Controls
                If TypeOf c Is MdiClient Then
                    ' '' c.BackColor = Color.FromArgb(8, 98, 83)
                    c.BackColor = Color.White
                    Exit For
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message & vbCrLf & ex.StackTrace, MsgBoxStyle.Exclamation, "Error frmInicio_Load")
            Environment.Exit(0)
        Finally
            Formulario.Enabled = True
        End Try
    End Sub

End Class
