예제 #1
0
        /// <summary>
        /// Agrega a la cola de trabajos el trabajo de enviar la lista completa de versiones de empleados
        /// BETA: Todos son ADMIN: true y todos tienen Password: alutel
        /// NUEVO: EMPLIST envia ahora SOLAMENTE la lista de versiones de empleados, para que el HH pida solamente los que le faltan
        /// </summary>
        /// <param name="v_eventArgs"></param>
        public void agregarTrabajoListaEmpleados(stringEventArgs v_eventArgs)
        {
            try
            {
                string dataString = "";
                Dictionary<int, Employee> listaEmpleados = mainApp.DataManager.getListaEmpleados();

                DateTime ultimaActualizacionHandHeld = mainApp.DataManager.obtenerUltimaFechaSync(v_eventArgs.stateObject.HHID);

                //MUTEX
                try
                {
                    StaticTools.obtenerMutex_ListaEmpleados();
                    loguearString("Entro a agregarTrabajoListaEmpleados(EMPLIST) con : " + listaEmpleados.Count.ToString(),TiposLOG.LENEL);

                    foreach (KeyValuePair<int, Employee> emp in listaEmpleados)
                    {
                        if (v_eventArgs.stateObject.abortFlag)
                        {
                            loguearString("Hizo ABORTFLAG=TRUE ",TiposLOG.LENEL);
                            break;
                        }
                        //if (i == 0) break;  // debug
                        //i--;    // debug
                        DateTime ultimaActualizacionEmpleado = emp.Value.ultimaActualizacion;

                        Tarjeta tarjeta = mainApp.DataManager.buscarTarjetadeEmpleado(emp.Value.Id);

                        // Solo se envia la info de un empleado si tiene tarjeta asociada y algun accesslevel asociado
                        if ((tarjeta != null))
                        {
                            string accessLevels =AccessLevelLogic.getAccessLevelsByBadgeInHH(tarjeta.NUMERODETARJETA, v_eventArgs.stateObject.HHID);
                            DateTime ultimaActualizacionTarjeta = tarjeta.ultimaActualizacion;
                            if (accessLevels.Trim().Length>0)
                            {
                                if ((ultimaActualizacionEmpleado > ultimaActualizacionHandHeld)||(ultimaActualizacionTarjeta > ultimaActualizacionHandHeld ))
                                {

                                    // Envío los empleados con sus versiones para que el hh pida los datos SOLO de aquellos que cambiaron
                                    dataString += emp.Value.PersonID.ToString() + "," + emp.Value.VersionEmpleado.ToString() + "|";

                                }
                            }
                        }
                    }

                   // loguearString("dataString: " + dataString,TiposLOG.LENEL);

                }
                catch (Exception ex)
                {
                    loguearString("Excepcion en agregarTrabajoListaEmpleados-MUTEX " + ex.Message, TiposLOG.HH);
                }
                finally
                {
                    //MUTEX
                    StaticTools.liberarMutex_ListaEmpleados();
                }

                if (dataString.Length > 0)
                    dataString = dataString.Substring(0, dataString.Length - 1);    // Le saco el | de más al final
                else
                {
                    EnviarJobFinSync(v_eventArgs.stateObject.HHID, v_eventArgs.stateObject);
                    return;
                }
                // Solo encola el trabajo si se dispone efectivamente informacion sobre el HH y no esta en proceso de abort...
                if (mainApp.ComunicationSystem.communicationLAYER.isPannelConnected(v_eventArgs.stateObject.HHID) && !v_eventArgs.stateObject.abortFlag)
                {
                    string dataStringEncriptado = Encriptar_Datos.Encriptar.encriptar(dataString, communicationSystem.ClaveEncriptar);
                    byte[] dataBytes = Encoding.ASCII.GetBytes(dataStringEncriptado);

                    int chunkSize = FIXED_HEADER_LENGTH + dataBytes.Length;
                    string header = "TYPE:EMPLIST,SIZE:" + chunkSize.ToString();

                    // Nuevo: Encriptado de datos.
                    string headerEncriptado = Encriptar_Datos.Encriptar.encriptar(header, communicationSystem.ClaveEncriptar);
                    headerEncriptado = "SIZE:" + chunkSize.ToString() + ",DATA:" + headerEncriptado;
                    string finalHeader = headerEncriptado.PadRight(FIXED_HEADER_LENGTH);

                    byte[] headerBytedata = Encoding.ASCII.GetBytes(finalHeader);

                    byte[] dataToSend = new byte[finalHeader.Length + dataBytes.Length];
                    System.Buffer.BlockCopy(headerBytedata, 0, dataToSend, 0, headerBytedata.Length);
                    System.Buffer.BlockCopy(dataBytes, 0, dataToSend, headerBytedata.Length, dataBytes.Length);

                    JobToSendToClient j = new JobToSendToClient();

                    jobCounter++;
                    j.ID = jobCounter;
                    j.header = headerEncriptado;                // Usa el encriptado.
                    j.byteData = dataToSend;

                    // Nuevo: un pendingJobs por cada stateobject de cada cliente.
                    v_eventArgs.stateObject.pendingJobs.Enqueue(j);
                    v_eventArgs.stateObject.readyToSend.Set();        // Le aviso al semaforo que hay cosas encoladas para mandar.

                    loguearString(v_eventArgs.stateObject.HHID + "- Encolado TRABAJO EMPLIST", TiposLOG.LENEL);
                   // loguearString(v_eventArgs.stateObject.HHID + "- Cantidad de trabajos: " + v_eventArgs.stateObject.pendingJobs.Count.ToString(), TiposLOG.ALUTRACK);

                    int orgID = mainApp.DataManager.obtenerOrganizationIDFromHHID(v_eventArgs.stateObject.HHID);

                    //layerLENEL.enviarAccessLevelsDefinitions(v_eventArgs.stateObject.HHID, orgID);

                }
                else
                {
                    loguearString(v_eventArgs.stateObject.HHID + "- no conectado. NO SE AGREGA EL TRABAJO " + dataString, TiposLOG.HH);
                }
            }
            catch (Exception ex) { loguearString("Excepcion en agregarTrabajoListaEmpleados(): " + ex.Message, TiposLOG.HH); }
        }
예제 #2
0
        /// <summary>
        /// Actualiza localmente el ultimo dato GPS recibido y lanza el evento que verifica los accesos a las Virtual gates.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="v_eventArgs"></param>
        void actualizeGPS(object sender, stringEventArgs v_eventArgs)
        {
            string HHID = v_eventArgs.textData["HHID"];
            string latitud = v_eventArgs.textData["LATITUD"];
            string longitud = v_eventArgs.textData["LONGITUD"];
            string hora = v_eventArgs.textData["HORA"];

            EventoGPS nuevoEvento = new EventoGPS(HHID, mainApp.InterpretarLatitud(latitud), mainApp.InterpretarLongitud(longitud), hora);

            EventoGPS ultimoEvento = mainApp.DataManager.getLastEventoGPS(HHID);

            mainApp.DataManager.addEventoGPS(HHID, nuevoEvento);

            mainApp.DataManager.updateVirtualGateEvents(ultimoEvento, nuevoEvento);
        }
예제 #3
0
        void ThreadEnviarVersionImagenes(stringEventArgs e)
        {
            StateObject clientState = e.stateObject;

            try
            {
                string dataString = "";
                Dictionary<int, Employee> listaEmpleados = mainApp.DataManager.getListaEmpleados();

                //int i = 50; // Para debug

                foreach (KeyValuePair<int, Employee> emp in listaEmpleados)
                {
                    if (clientState.abortFlag)
                    {
                        break;
                    }

                    //if (i == 0) break;  // debug
                    //i--;    // debug

                    // VERIFICO QUE EL EMPLEADO TENGA IMAGEN
                    string pathImagenDB = mainApp.DataManager.cargarPathImagen(emp.Value.PersonID.ToString());

                    if (HayImagen(pathImagenDB))
                    {
                        Tarjeta tarjeta = mainApp.DataManager.buscarTarjetadeEmpleado(emp.Value.Id);
                        // Solo se envia la info de un empleado si tiene tarjeta asociada y algun accesslevel asociado
                        if (tarjeta != null)
                        {
                            string accessLevels = AccessLevelLogic.getAccessLevelsByBadgeInHH(tarjeta.NUMERODETARJETA, e.stateObject.HHID);

                            if (accessLevels.Trim().Length > 0)
                            {
                                // Envío las versiones de las imagenes para que el hh pida los datos SOLO de aquellos que cambiaron
                                dataString += emp.Value.PersonID.ToString() + ":" + emp.Value.imageVersion.ToString() + ",";
                            }
                        }
                    }
                }

                if (dataString.Length > 0)   // Si ninguna de las tarjetas a enviar al HH tienen foto, terminar la secuencia enviando FinSYNC
                {
                    dataString = dataString.Substring(0, dataString.Length - 1);    // Le saco el | de más al final

                    // Solo encola el trabajo si se dispone efectivamente informacion sobre el HH
                    if (mainApp.ComunicationSystem.communicationLAYER.isPannelConnected(e.stateObject.HHID) && (!clientState.abortFlag))
                    {
                        string dataStringEncriptado = Encriptar_Datos.Encriptar.encriptar(dataString, communicationSystem.ClaveEncriptar);
                        byte[] dataBytes = Encoding.ASCII.GetBytes(dataStringEncriptado);

                        int chunkSize = FIXED_HEADER_LENGTH + dataBytes.Length;
                        string header = "TYPE:VERIMGLIST,SIZE:" + chunkSize.ToString();

                        // Nuevo: Encriptado de datos.
                        string headerEncriptado = Encriptar_Datos.Encriptar.encriptar(header, communicationSystem.ClaveEncriptar);
                        headerEncriptado = "SIZE:" + chunkSize.ToString() + ",DATA:" + headerEncriptado;
                        string finalHeader = headerEncriptado.PadRight(FIXED_HEADER_LENGTH);

                        byte[] headerBytedata = Encoding.ASCII.GetBytes(finalHeader);

                        byte[] dataToSend = new byte[finalHeader.Length + dataBytes.Length];
                        System.Buffer.BlockCopy(headerBytedata, 0, dataToSend, 0, headerBytedata.Length);
                        System.Buffer.BlockCopy(dataBytes, 0, dataToSend, headerBytedata.Length, dataBytes.Length);

                        JobToSendToClient j = new JobToSendToClient();

                        jobCounter++;
                        j.ID = jobCounter;
                        j.header = headerEncriptado;                // Usa el encriptado.
                        j.byteData = dataToSend;

                        // Nuevo: un pendingJobs por cada stateobject de cada cliente.
                        e.stateObject.pendingJobs.Enqueue(j);
                        e.stateObject.readyToSend.Set();        // Le aviso al semaforo que hay cosas encoladas para mandar.

                        loguearString(e.stateObject.HHID + "- TRABAJO VERIMGLIST", TiposLOG.HH);
                        loguearString(e.stateObject.HHID + "- Cantidad de trabajos: " + e.stateObject.pendingJobs.Count.ToString(), TiposLOG.HH);

                    }
                    else
                    {
                        loguearString(e.stateObject.HHID + "- No conectado. NO SE AGREGA EL TRABAJO " + dataString, TiposLOG.HH);
                    }
                }
                else       // Si ninguna de las tarjetas a enviar al HH tienen foto, terminar la secuencia enviando FinSYNC
                {
                    EnviarJobFinSync(e.stateObject.HHID, e.stateObject);
                }
            }
            catch (Exception ex) { loguearString("Excepcion en ThreadEnviarVersionImagenes(): " + ex.Message, TiposLOG.HH); }
        }
예제 #4
0
 /// <summary>
 /// Handler
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 public void agregarItemLOG(object sender, stringEventArgs e)
 {
     loguearString(e.text, e.LOGTYPE);
     //try
     //{
     //    LOGInformation.Enqueue(e);     // MUTEX ACA??
     //}
     //catch (Exception ex)
     //{
     //}
 }
예제 #5
0
        //***********************************LOG*******************************************
        /// <summary>
        /// 
        /// </summary>
        /// <param name="v_texto"></param>
        /// <param name="v_tipoLOG"></param>
        private void loguearString(string v_texto, TiposLOG v_tipoLOG)
        {
            if (m_LOGHandler != null)
            {
                stringEventArgs p = new stringEventArgs(v_texto, null);
                p.LOGTYPE = v_tipoLOG;

                m_LOGHandler(this, p);          // Llamada al handler del LOG.
            }
        }
예제 #6
0
        void ThreadAddSendEmployeeListJob(stringEventArgs e)
        {
            //Se envian los AccessLevels UNA sola vez por conexion,
            if (!e.stateObject.envioInicialAccessLevels)
            {
                string HHID = e.stateObject.HHID;
                int orgID = mainApp.DataManager.obtenerOrganizationIDFromHHID(HHID);
                communicationLAYER.enviarAccessLevelsDefinitions(HHID, orgID,"1");          // El "1"es para que no se envion los allPersonIDs en esta llamada.
                e.stateObject.envioInicialAccessLevels= true;
            }

            agregarTrabajoListaEmpleados(e);
        }
예제 #7
0
        public void agregarEmp(object sender, stringEventArgs e)
        {
            try
            {
                string dataEmp = string.Empty;
                string isAdmin_BETA = "true";
                string passWord_BETA = "alutel";

                string tarjeta = e.textData["TARJETA"];         // La tarjeta del empleado que se va a agregar
                string id = e.textData["HHID"];

                Employee emp = mainApp.DataManager.buscarEmpleadoxTarjeta(tarjeta);

                Tarjeta t = mainApp.DataManager.buscarTarjetadeEmpleado(emp.Id);
                // Solo se envia la info de un empleado si tiene tarjeta asociada y algun accesslevel asociado
                if ((tarjeta == null) || (t == null))
                {
                    loguearString("NO SE PUDO ENVIAR LA INFORMACIÓN DEL EMPLEADO CON TARJETA " + tarjeta, TiposLOG.HH);
                    return;
                }

                string accessLevels = AccessLevelLogic.getAccessLevelsByBadgeInHH(t.NUMERODETARJETA, e.stateObject.HHID);

                if (accessLevels.Trim().Length > 0)
                {

                    dataEmp = "TARJETA:" + t.NUMERODETARJETA + ",NOMBRE:" + emp.Nombre + ",APELLIDO:" + emp.Apellido + ",DOCUMENTO:" + emp.NumeroDocumento + ",EMPRESA:" + emp.Empresa + ",ACCESO:" + t.ESTADO.ToString() + ",IMGVER:" + emp.imageVersion.ToString().Trim() + ",ADMIN:" + isAdmin_BETA + ",PASS:"******",ACCESSID:" + accessLevels + ",VERSION:" + emp.VersionEmpleado.ToString() +",PERSONID:" + emp.PersonID.ToString();

                    //dataEmp = "TARJETA:" + t.NUMERODETARJETA + ",NOMBRE:" + emp.Nombre + ",APELLIDO:" + emp.Apellido + ",DOCUMENTO:" + emp.NumeroDocumento + ",EMPRESA:" + emp.Empresa + ",ACCESO:" + t.ESTADO.ToString() + ",IMGVER:" + emp.imageVersion.ToString().Trim() + ",ADMIN:" + isAdmin_BETA + ",PASS:"******",ACCESSID:" + accessLevels;

                }

                // Solo encola el trabajo si se dispone efectivamente informacion sobre el HH
                if (mainApp.ComunicationSystem.communicationLAYER.isPannelConnected(id))
                {

                    string dataStringEncriptado = Encriptar_Datos.Encriptar.encriptar(dataEmp, communicationSystem.ClaveEncriptar);
                    byte[] dataBytes = Encoding.ASCII.GetBytes(dataStringEncriptado);

                    int chunkSize = FIXED_HEADER_LENGTH + dataBytes.Length;
                    //TYPE:ADDEMP,SIZE:(.*)
                    string header = "TYPE:ADDEMP,SIZE:" + chunkSize.ToString();

                    // Nuevo: Encriptado de datos.
                    string headerEncriptado = Encriptar_Datos.Encriptar.encriptar(header, communicationSystem.ClaveEncriptar);
                    headerEncriptado = "SIZE:" + chunkSize.ToString() + ",DATA:" + headerEncriptado;

                    string finalHeader = headerEncriptado.PadRight(FIXED_HEADER_LENGTH);
                    byte[] headerBytedata = Encoding.ASCII.GetBytes(finalHeader);

                    byte[] dataToSend = new byte[finalHeader.Length + dataBytes.Length];
                    System.Buffer.BlockCopy(headerBytedata, 0, dataToSend, 0, headerBytedata.Length);
                    System.Buffer.BlockCopy(dataBytes, 0, dataToSend, headerBytedata.Length, dataBytes.Length);

                    JobToSendToClient j = new JobToSendToClient();

                    jobCounter++;
                    j.ID = jobCounter;
                    j.header = headerEncriptado;
                    j.byteData = dataToSend;

                    e.stateObject.pendingJobs.Enqueue(j);     // Nuevo: un pendingjobs por cada cliente.
                    e.stateObject.readyToSend.Set();
                    loguearString(e.stateObject.HHID + "- TRABAJO Agregar empleado: " + header, TiposLOG.HH);
                }
            }
            catch (Exception ex) { loguearString("Excepción agregando empleado: "+ex.Message, TiposLOG.HH); }
        }
예제 #8
0
        void borrarEmp(object sender, stringEventArgs e)
        {
            try
            {
                string tarjeta = e.textData["TARJETA"];         // La tarjeta del empleado que se va a eliminar
                string id = e.textData["HHID"];

                // Solo encola el trabajo si se dispone efectivamente informacion sobre el HH
                if (mainApp.ComunicationSystem.communicationLAYER.isPannelConnected(id))
                {
                    int chunkSize = FIXED_HEADER_LENGTH;

                    string header = "TYPE:DELEMP,SIZE:" + chunkSize.ToString() + ",BADGE:" + tarjeta;

                    // Nuevo: Encriptado de datos.
                    string headerEncriptado = Encriptar_Datos.Encriptar.encriptar(header, communicationSystem.ClaveEncriptar);
                    headerEncriptado = "SIZE:" + chunkSize.ToString() + ",DATA:" + headerEncriptado;

                    string finalHeader = headerEncriptado.PadRight(FIXED_HEADER_LENGTH);
                    byte[] headerBytedata = Encoding.ASCII.GetBytes(finalHeader);

                    byte[] dataToSend = new byte[finalHeader.Length];
                    System.Buffer.BlockCopy(headerBytedata, 0, dataToSend, 0, headerBytedata.Length);

                    JobToSendToClient j = new JobToSendToClient();

                    jobCounter++;
                    j.ID = jobCounter;
                    j.header = headerEncriptado;
                    j.byteData = dataToSend;

                    e.stateObject.pendingJobs.Enqueue(j);     // Nuevo: un pendingjobs por cada cliente.
                    e.stateObject.readyToSend.Set();
                    loguearString(e.stateObject.HHID + "- TRABAJO Borrar empleado: " + header, TiposLOG.HH);
                }
            }
            catch (Exception ex) { loguearString("Excepción borrando empleado: " + ex.Message, TiposLOG.HH); }
        }
예제 #9
0
        public void enviarAgregarUnEmpleado(string tarjeta, string v_HHID)
        {
            if (mainApp.ComunicationSystem.socketServerGeneral.isHandHeldOnLine(v_HHID))
            {
                StateObject cliente = mainApp.ComunicationSystem.socketServerGeneral.getCliente(v_HHID);

                if (cliente != null)
                {
                    stringEventArgs e = new stringEventArgs("", cliente);
                    e.textData.Add("HHID", v_HHID);
                    e.textData.Add("TARJETA", tarjeta);

                    mainApp.ComunicationSystem.agregarEmp(this, e);
                }
            }
            else loguearString("enviarAgregarUnEmpleado(): " + v_HHID + " no está online");

            //string header = "TYPE:ADDEMP,HHID:" + v_HHID + ",SIZE:" + communicationSystem.FIXED_HEADER_LENGTH + ",BADGE:" + tarjeta;

            //try
            //{
            //    StaticTools.obtenerMutex_StateObjectClients();
            //    Dictionary<string, StateObject> listaClientes = mainApp.ComunicationSystem.socketServerGeneral.stateObjectsClients;
            //    bool enc = false;
            //    StateObject ClienteHH = null;
            //    foreach (KeyValuePair<string, StateObject> pair in listaClientes)
            //    {
            //        if (pair.Value.HHID == v_HHID)
            //        {
            //            enc = true;
            //            ClienteHH = pair.Value;
            //            break;
            //        }
            //    }

            //    if (enc)
            //    {
            //        loguearString("VA A AGREGAR EL EMPLEADO: " + tarjeta);
            //        mainApp.ComunicationSystem.socketServerGeneral.AddJobs(header, null, ClienteHH);
            //    }
            //}
            //catch (Exception ex)
            //{
            //    loguearString(v_HHID + " - excepcion en enviarAgrearUnEmpleado(): " + ex.Message);
            //}
            //finally
            //{
            //    StaticTools.liberarMutex_StateObjectClients();
            //}
        }
예제 #10
0
 private void loguearString(string v_texto)
 {
     if (m_LOGHandler != null)
     {
         stringEventArgs p = new stringEventArgs(v_texto, null);
         p.LOGTYPE = TiposLOG.LENEL;
         this.m_LOGHandler(this, p);
     }
     else
     {
         StaticTools.loguearString(v_texto);
     }
 }
예제 #11
0
        //
        /// <summary>
        /// AddJobs:  Reconoce de Headers y responde en consecuencia
        /// </summary>
        /// <param name="v_header"></param>
        /// <param name="v_byteData"></param>
        /// <param name="v_state"></param>
        public void AddJobs(string v_header, byte[] v_byteData, StateObject v_state)
        {
            Match matchHeader;
            byte[] finalBuffer = v_byteData;
            string retMessage = "";
            string resConnectMessage = "";

            // RECIBI un registro GPS
            // NUEVO EN VERSION 1.3: Se conecta al alutrack via ALUTRACK LAYER
            matchHeader = GPSdata.Match(v_header);
            if (matchHeader.Success)
            {
                loguearString(v_header);        // Loguea el GPS

                string HHID = getMatchData(matchHeader, 1).Trim();
                string latitud = getMatchData(matchHeader, 3).Trim();
                string longitud = getMatchData(matchHeader, 4).Trim();
                string hora = getMatchData(matchHeader, 5).Trim();
                string heading = getMatchData(matchHeader, 6).Trim();
                string speed =getMatchData(matchHeader, 7).Trim();

                stringEventArgs retorno = new stringEventArgs(v_header, v_state);
                retorno.textData.Add("HHID", HHID);
                retorno.textData.Add("LATITUD", latitud);
                retorno.textData.Add("LONGITUD", longitud);
                retorno.textData.Add("HORA", hora);

                // Actualiza la base LOCAL con los GPS, chequea los accesos a zonas y da de alta eventos de acceso en caso de Entrada/Salida.
                this.actualizeGPSData(this, retorno);

                mainApp.DataManager.actualizarUltimaPosGPS(latitud, longitud, hora, HHID);

                //********************************************
                // Conexion al layer ALUTRACK: Alutracklayer
                //********************************************

                if (!HHGPSLayer.isConnected(HHID))
                {
                    if (HHGPSLayer.conectar(HHID, out resConnectMessage))
                    {
                       // loguearString("HandHeld: " + HHID + " conectado al ALUTRACK LAYER");
                        if (HHGPSLayer.sendGPSData(HHID, latitud, longitud, hora, heading, speed, out retMessage))
                        {
                         //   loguearString(HHID + " envio GPS(" + latitud + "," + longitud + ") al ALUTRACK LAYER");
                        }
                        else
                        {
                           // loguearString("Error al enviar GPS desde el HH: " + HHID + ", error: " + retMessage + ". Desconectando...");
                            HHGPSLayer.desconectar(HHID);
                           // loguearString("HH: " + HHID + "desconectado");
                        }
                    }
                    else // No se pudo conectar...
                    {
                       // loguearString("Error al conectar HHID: " + HHID + "- " + resConnectMessage);
                    }
                }
                else
                {
                    if (HHGPSLayer.sendGPSData(HHID, latitud, longitud, hora, heading, speed, out retMessage))
                    {
                        loguearString(HHID + " envio GPS(" + latitud + "," + longitud + ") al ALUTRACK LAYER");
                    }
                    else
                    {
                        //loguearString("Error al enviar GPS desde el HH: " + HHID + " Error: " + retMessage);
                    }
                }

                return;
            }

            // RECIBI DUMMY
            //
            matchHeader = dummyHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                loguearString(HHID + "- DUMMY" );
                //stringEventArgs retorno = new stringEventArgs(v_header, v_state);
                //this.responderDUMMY(this, retorno);
                return;
            }

            // RECIBI el pedido de actualización de la lista de empleados.
            // Es el lugar donde se asocia el StateObject al HHID y a la Organizacion.
            // Si el dispositivo esta registrado (agregado previamente desde LENEL o desde la WEB), entonces
            // se da de alta en la lista de stateObjectClients, con clave String HHID
            matchHeader = getEmpListHeader.Match(v_header);
            if (matchHeader.Success)
            {
                if (getEmployeeList != null)
                {
                    string HHID = getMatchData(matchHeader, 1).Trim();
                    v_state.HHID = HHID;                                // registra el nombre del Dispositivo en el State del cliente.

                    stringEventArgs retorno = new stringEventArgs(v_header, v_state);

                    int orgID = mainApp.DataManager.obtenerOrganizationIDFromHHID(HHID);
                    if (orgID > 0)
                    {
                        v_state.orgID=orgID;

                        try
                        {
                            StaticTools.obtenerMutex_StateObjectClients();
                            if (!stateObjectsClients.ContainsKey(HHID))
                            {
                                stateObjectsClients.Add(HHID, v_state);
                            }
                        }
                        catch (Exception ex)
                        {
                            loguearString(HHID + " - excepcion en matchHeader= getEmpListHeader creando Stateobject: " + ex.Message);
                        }
                        finally
                        {
                            StaticTools.liberarMutex_StateObjectClients();
                        }

                        this.getEmployeeList(this, retorno);                 // hace un rise para avisar que va a comenzar el envio de lista de empleados.
                    }
                    else
                    {
                        loguearString("El HH: " + HHID + " no tiene organizacion asociada.");
                        v_state.abortAllThreads(null);
                        v_state.closeAllSockets();
                    }

                }
                return;
            }

            // Desde Lenel se eliminó un empleado
            matchHeader = DeleteEmpHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                string tarjeta = getMatchData(matchHeader, 3).Trim();

                stringEventArgs retorno = new stringEventArgs(v_header, v_state);
                retorno.textData.Add("HHID", HHID);
                retorno.textData.Add("TARJETA", tarjeta);

                this.deleteEmp(this, retorno);
                return;
            }

            // Desde Lenel se agregó un empleado
            matchHeader = AddEmpHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                string tarjeta = getMatchData(matchHeader, 3).Trim();

                stringEventArgs retorno = new stringEventArgs(v_header, v_state);
                retorno.textData.Add("HHID", HHID);
                retorno.textData.Add("TARJETA", tarjeta);

                this.addEmp(this, retorno);
                return;
            }

            // Desde el HH recibí pedido de empleados por versión
            matchHeader = EmpxVersionHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                int chunkSize = Convert.ToInt32(getMatchData(matchHeader, 2).Trim());
                byte[] byteData = getDataBytes(finalBuffer, chunkSize);

                byteArrayEventArgs retorno = new byteArrayEventArgs(v_header, byteData, v_state);
                retorno.textData.Add("HHID", HHID);

                this.sendEmpxVersion(this, retorno);
                return;
            }

            // Desde el HH recibí pedido de siguiente bloque de imagenes
            matchHeader = MasImgsHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();

                stringEventArgs retorno = new stringEventArgs(v_header, v_state);
                retorno.textData.Add("HHID", HHID);

                this.enviarMasImagenes(this, retorno);
                return;
            }

            // Desde el HH recibí pedido de lista de imagenes
            matchHeader = ImgVersionHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();

                stringEventArgs retorno = new stringEventArgs(v_header, v_state);
                retorno.textData.Add("HHID", HHID);

                this.enviarVersionImagenes(this, retorno);
                return;
            }

            // Desde el HH recibí pedido de lista de imagenes
            matchHeader = ImgListHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                int chunkSize = Convert.ToInt32(getMatchData(matchHeader, 2).Trim());
                byte[] byteData = getDataBytes(finalBuffer, chunkSize);

                byteArrayEventArgs retorno = new byteArrayEventArgs(v_header, byteData, v_state);
                retorno.textData.Add("HHID", HHID);

                this.enviarListaImagenes(this, retorno);
                return;
            }

            // RECIBI un pedido de actualización de una imagen de un usuario.
            matchHeader = getImageHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                string tarjeta = getMatchData(matchHeader, 3).Trim();

                stringEventArgs retorno = new stringEventArgs(v_header,v_state);
                retorno.textData.Add("HHID", HHID);
                retorno.textData.Add("TARJETA", tarjeta);

                this.getImage(this, retorno);                  // Hace un rise del evento registrado, el cual va a agregar el job EMPIMAGE a la lista de jobs del socket.
                return;
            }

            // RECIBI un ACCESS de una tarjeta
            matchHeader =accessHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                int chunkSize = int.Parse(getMatchData(matchHeader, 2));
                string tarjeta = getMatchData(matchHeader, 3).Trim();
                string Latitud = getMatchData(matchHeader, 4).Trim();
                string Longitud = getMatchData(matchHeader, 5).Trim();
                string hora = getMatchData(matchHeader, 6).Trim();
                string hasImage = getMatchData(matchHeader, 7).Trim();
                string tipoAcceso = getMatchData(matchHeader, 8).Trim();
                string id = getMatchData(matchHeader, 9).Trim();
                byte[] dataBytes;
                if (bool.Parse(hasImage))
                {
                    dataBytes = getDataBytes(finalBuffer, chunkSize);
                }
                else
                {
                    dataBytes = new byte[0];
                }

                byteArrayEventArgs retorno = new byteArrayEventArgs(v_header, dataBytes,v_state);
                retorno.textData.Add("HHID", HHID);
                retorno.textData.Add("TARJETA", tarjeta);
                retorno.textData.Add("LATITUD", Latitud);
                retorno.textData.Add("LONGITUD", Longitud);
                retorno.textData.Add("HORA", hora);
                retorno.textData.Add("IMAGEN", hasImage);
                retorno.textData.Add("TIPOACCESO", tipoAcceso);
                retorno.textData.Add("ID", id);

                loguearString("Reconocido ACCESO CON ID: " + id);
                this.actualizeAccess(this, retorno);                   // Llama al evento registrado para actualizar el movimiento de acceso
                return;
            }

            // RECIBI VISITA
            matchHeader = visitHeader.Match(v_header);
            if (matchHeader.Success)
            {
                string HHID = getMatchData(matchHeader, 1).Trim();
                int chunkSize = int.Parse(getMatchData(matchHeader, 2));
                string nombre = getMatchData(matchHeader, 3).Trim();
                string apellido = getMatchData(matchHeader, 4).Trim();
                string documento = getMatchData(matchHeader, 5).Trim();
                string empresa = getMatchData(matchHeader, 6).Trim();
                string tarjeta = getMatchData(matchHeader, 7).Trim();
                string latitud = getMatchData(matchHeader, 8).Trim();
                string longitud = getMatchData(matchHeader, 9).Trim();
                string hora = getMatchData(matchHeader, 10).Trim();
                string hasImage = getMatchData(matchHeader, 11).Trim();
                string tipoAcceso = getMatchData(matchHeader, 12).Trim();
                string id = getMatchData(matchHeader, 13).Trim();

                byte[] dataBytes;
                if (bool.Parse(hasImage))   // Hay imagen asociada. Viene el databytes.
                {
                    dataBytes = getDataBytes(finalBuffer, chunkSize);
                }
                else
                {
                    dataBytes = new byte[0];
                }

                byteArrayEventArgs retorno = new byteArrayEventArgs(v_header, dataBytes, v_state);
                retorno.textData.Add("HHID", HHID);
                retorno.textData.Add("TARJETA", tarjeta);
                retorno.textData.Add("NOMBRE", nombre);
                retorno.textData.Add("APELLIDO", apellido);
                retorno.textData.Add("DOCUMENTO", documento);
                retorno.textData.Add("EMPRESA", empresa);
                retorno.textData.Add("LATITUD", latitud);
                retorno.textData.Add("LONGITUD", longitud);
                retorno.textData.Add("HORA", hora);
                retorno.textData.Add("IMAGEN", hasImage);
                retorno.textData.Add("TIPOACCESO", tipoAcceso);
                retorno.textData.Add("ID", id);

                int orgID = mainApp.DataManager.obtenerOrganizationIDFromHHID(HHID);
                if (orgID > 0)
                {
                    retorno.textData.Add("ORGID", orgID.ToString());
                    this.actualizeVisit(this, retorno);

                }

                return;
            }

            // Recibi un mensaje de Fin de sincronizacion
            matchHeader = FinSyncHeader.Match(v_header);
            if (matchHeader.Success)
            {

                mainApp.DataManager.actualizarFechaSync(v_state.HHID);
                mainApp.ComunicationSystem.EnviarJobFinSync(v_state.HHID, v_state);
                return;
            }

            // RECIBI ARCHIVO DE LOG
            matchHeader = LOGFile.Match(v_header);
            if (matchHeader.Success)
            {

                string HHID = getMatchData(matchHeader, 1).Trim();
                int fileSize = int.Parse(getMatchData(matchHeader, 2));
                string logName = getMatchData(matchHeader, 3).Trim();
                try
                {
                    byte[] dataBytes;
                    dataBytes = getDataBytes(finalBuffer, fileSize);
                    if (dataBytes.Length > 0 && logName != "")
                    {
                        DateTime ahora = DateTime.Now;
                        string finalLogName = HHID + "_" + ahora.Year.ToString() + ahora.Month.ToString() + ahora.Day.ToString() + "_" + ahora.Hour.ToString() + "-" + ahora.Minute.ToString() + "-" + ahora.Second.ToString() + "_" + logName;
                        File.WriteAllBytes(SystemConfiguration.ImagesPath + @"\" + finalLogName, dataBytes);
                    }
                    loguearString(HHID + " - Server recibió log: " + logName);

                    stringEventArgs retorno = new stringEventArgs(logName, v_state);

                    retorno.textData.Add("LOGNAME", logName);
                    this.confirmarLOG(this, retorno);                   //TYPE:BORRARLOG Manda la confirmacion de recepcion del archivo de LOG para que el HH lo borre de su disco: BORRARLOG
                }
                catch (Exception ex)
                {
                    loguearString(HHID +"- Excepcion en LOGFile: " + ex.Message);
                }
                return;
            }
            /* NO RECONOCIO HEADER */
            else loguearString("ATENCION! Header no reconocido: " + v_header);
        }
예제 #12
0
 private void loguearString2(string texto)
 {
     //LOGToFile.doLOGExcepciones(texto);
     loguearString(texto);
     if (actualizarLOG != null)
     {
         stringEventArgs p = new stringEventArgs(texto, null);
         p.LOGTYPE = TiposLOG.HH;
         this.actualizarLOG(this, p);
     }
 }
예제 #13
0
        public void ThreadSendDummy()
        {
            StateObject StateClient = sessionState;
            try
            {
                while (!StateClient.abortFlag)
                {

                    stringEventArgs retorno = new stringEventArgs("", StateClient);

                    this.enviarDummy(this, retorno);

                    Thread.Sleep(30000);
                }
                loguearString("ABORT: Saliendo de ThreadSendDummy()");
                // Finalizo el thread: Libero los sockets, sus recursos y sus puertos.
                EliminarThreadsySockets(StateClient, sessionState.t_dummySend);
            }
            catch (Exception ex)
            {

                setAbortFlag("Excepcion en ThreadSendDummy. Abortando todos los threads. " + ex.Message, StateClient);

                EliminarThreadsySockets(StateClient, sessionState.t_dummySend);
            }
        }
예제 #14
0
 void addSendEmployeeListJob(object sender, stringEventArgs e)
 {
     loguearString(e.stateObject.HHID + "-Pidio la lista de Versiones de Empleados",TiposLOG.LENEL);
     Thread t = new Thread(() => ThreadAddSendEmployeeListJob(e));
     t.Name = "ThreadAddSendEmployeeListJob";
     t.Start();
 }
예제 #15
0
 void enviarMasImagenes(object sender, stringEventArgs e)
 {
     // SETEAR FLAG PARA ENVIAR NUEVO BLOQUE DE IMAGENES
     e.stateObject.masImagenes = true;
 }
예제 #16
0
        /// <summary>
        /// Evento lanzado por el socket que agrega un JOB de enviar una Imagen a la cola de pendingJobs.
        /// En el parametro TARJETA viene el numero de tarjeta cuya imagen hay que enviar.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="v_eventArgs"></param>
        void addSendImageJob(object sender, stringEventArgs v_eventArgs)
        {
            try
            {
                string tarjeta = v_eventArgs.textData["TARJETA"];         // La tarjeta cuya imagen hay que enviar

                int idEmp = mainApp.DataManager.buscarEmpleadoxTarjeta(tarjeta).Id;

                Dictionary<int, Employee> listaEmpleados = mainApp.DataManager.getListaEmpleados();

                if (listaEmpleados.ContainsKey(idEmp))
                {
                    if (listaEmpleados[idEmp].hasImage())
                    {
                        byte[] imageBytes = listaEmpleados[idEmp].getImage();
                        int chunkSize = FIXED_HEADER_LENGTH + imageBytes.Length;
                        int imageVersion = listaEmpleados[idEmp].imageVersion;

                        //string header = "TYPE:IMAGE,SIZE:" + chunkSize.ToString() + ",TARJETA:" + tarjeta + ",IMGVER:" + imageVersion.ToString().Trim();
                        string header = "TYPE:IMAGE,SIZE:" + chunkSize.ToString() + ",TARJETA:" + tarjeta + ",IMGVER:" + imageVersion.ToString().Trim() + ",PERSONID:" +listaEmpleados[idEmp].PersonID;

                        // Nuevo: Encriptado de datos.
                        string headerEncriptado = Encriptar_Datos.Encriptar.encriptar(header, communicationSystem.ClaveEncriptar);
                        headerEncriptado = "SIZE:" + chunkSize.ToString() + ",DATA:" + headerEncriptado;

                        string finalHeader = headerEncriptado.PadRight(FIXED_HEADER_LENGTH);
                        byte[] headerBytedata = Encoding.ASCII.GetBytes(finalHeader);

                        byte[] dataToSend = new byte[finalHeader.Length + imageBytes.Length];
                        System.Buffer.BlockCopy(headerBytedata, 0, dataToSend, 0, headerBytedata.Length);
                        System.Buffer.BlockCopy(imageBytes, 0, dataToSend, headerBytedata.Length, imageBytes.Length);

                        JobToSendToClient j = new JobToSendToClient();

                        jobCounter++;
                        j.ID = jobCounter;
                        j.header = headerEncriptado;
                        j.byteData = dataToSend;

                        v_eventArgs.stateObject.pendingJobs.Enqueue(j);     // Nuevo: un pendingjobs por cada cliente.
                        v_eventArgs.stateObject.readyToSend.Set();
                        loguearString(v_eventArgs.stateObject.HHID + "- TRABAJO SEND IMAGE: " + header, TiposLOG.HH);

                    }
                    else loguearString("No hay imagen asociada a la tarjeta " + tarjeta, TiposLOG.HH);
                }
                else
                {
                    //lstStatus.Items.Add("ERROR: la tarjeta NO EXISTE");
                }
            }
            catch (Exception e) { loguearString("Excepcion enviando imagen: " + e.Message, TiposLOG.HH); }
        }
예제 #17
0
 void enviarVersionImagenes(object sender, stringEventArgs e)
 {
     loguearString(e.stateObject.HHID + " - Recibio pedido de LISTA DE VERSIONES DE IMAGENES", TiposLOG.LENEL);
     Thread t = new Thread(() => ThreadEnviarVersionImagenes(e));
     t.Name = "ThreadEnviarVersionImagenes";
     t.Start();
 }
예제 #18
0
        void enviarDummy(object sender, stringEventArgs e)
        {
            int chunkSize = FIXED_HEADER_LENGTH;
            string header = "TYPE:DUMMY";

            // Nuevo: Encriptado de datos.
            string headerEncriptado = Encriptar_Datos.Encriptar.encriptar(header, communicationSystem.ClaveEncriptar);
            headerEncriptado = "SIZE:" + chunkSize.ToString() + ",DATA:" + headerEncriptado;
            string finalHeader = headerEncriptado.PadRight(FIXED_HEADER_LENGTH);

            byte[] headerBytedata = Encoding.ASCII.GetBytes(finalHeader);

            byte[] dataToSend = new byte[finalHeader.Length];
            System.Buffer.BlockCopy(headerBytedata, 0, dataToSend, 0, headerBytedata.Length);

            JobToSendToClient j = new JobToSendToClient();

            jobCounter++;
            j.ID = jobCounter;
            j.header = headerEncriptado;                // Usa el encriptado.
            j.byteData = dataToSend;

            // Nuevo: un pendingJobs por cada stateobject de cada cliente.
            e.stateObject.pendingJobs.Enqueue(j);
            e.stateObject.readyToSend.Set();
        }
예제 #19
0
 public void loguearString(string v_texto)
 {
     if (actualizarLOG != null)
     {
         stringEventArgs p = new  stringEventArgs(v_texto, null);
         p.LOGTYPE = TiposLOG.HH;
         actualizarLOG(this, p);
     }
 }