コード例 #1
0
        internal bool ReplaceNumeric(string name, string[] values, double val)
        {
            int     ix;
            DBField field = FetchField(name, out ix);

            if (field == null)
            {
                ServerLog.Register("El campo \"" + name + "\" no existe en la tabla \"" + Name + "\".");
                return(false);
            }
            if (field.Type != DB.FieldTypeNumeric)
            {
                ServerLog.Register("El campo \"" + name + "\" en la tabla \"" + Name + "\" no es numérico.");
                return(false);
            }
            string fmt;

            if (field.Decimals > 0)
            {
                int intpos = field.Size - field.Decimals - 1;
                fmt = "{0:".PadRight(intpos + 3, '0') + "." + "".PadRight(field.Decimals, '0') + "}";
            }
            else
            {
                fmt = "{0:".PadRight(field.Size + 3, '0') + "}";
            }
            values[ix] = String.Format(fmt, val);
            return(true);
        }
コード例 #2
0
        static void Read(IAsyncResult resul)
        {
            String  command = String.Empty;
            Request request = (Request)resul.AsyncState;
            Socket  handler = request.Socket;

            try {
                int bRead = handler.EndReceive(resul);

                if (bRead > 0)
                {
                    if (request.Read(bRead))
                    {
                        if (request.Remaining == 0)
                        {
                            Reply(request);
                        }
                        else
                        {
                            handler.BeginReceive(request.Buffer, 0, Request.BufferSize, 0, new AsyncCallback(Read), request);
                        }
                    }
                }
                else
                {
                    ServerLog.Register("Error de lectura. Cero bytes recibidos.", true);
                }
            } catch (Exception e) {
                ServerLog.Register(e.Message);
            }
        }
コード例 #3
0
        public static void Listen(int port)
        {
            ServerLog.Register("Iniciando...", true);

            IPHostEntry hostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress   address  = hostInfo.AddressList[0];
            EndPoint    endPoint = new IPEndPoint(address, port);
            Socket      listener = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            try {
                listener.Bind(endPoint);
                listener.Listen(100);

                ServerLog.Register("¡Escuchando!", true);

                while (true)
                {
                    Done.Reset();
                    listener.BeginAccept(new AsyncCallback(Accept), listener);
                    Done.WaitOne();
                }
            } catch (Exception e) {
                ServerLog.Register(e.Message, true);
            }
        }
コード例 #4
0
        public bool Read(int bRead)
        {
            StrBulder.Append(Encoding.ASCII.GetString(Buffer, 0, bRead));

            if (Remaining == -1)
            {
                String command = StrBulder.ToString();
                int    pos     = command.IndexOf(":");
                if (pos > -1)
                {
                    try {
                        CommandLen = int.Parse(command.Substring(0, pos));
                    } catch (FormatException) {
                        ServerLog.Register("Solicitud inválida. Se especificó un dato no numérico en \"Tamaño\"", true);
                        return(false);
                    }
                }
                else
                {
                    ServerLog.Register("Solicitud inválida. Falta delimitador de \"Tamaño\" (\":\").", true);
                    return(false);
                }
                CommandPt = pos + 1;
                Remaining = CommandLen + CommandPt;
            }

            Remaining -= bRead;
            if (Remaining < 0)
            {
                ServerLog.Register("Tamaño manifestado en la solicitud es menor a los datos enviados", true);
                return(false);
            }

            return(true);
        }
コード例 #5
0
        static void Reply(Request request)
        {
            string[] command = request.Command();
            ServerLog.Register(command[0]);
            string reply = IPServ.Process(command);

            byte[] response = Encoding.ASCII.GetBytes(String.Format("{0}:{1}", reply.Length, reply));
            Socket handler  = request.Socket;

            handler.BeginSend(response, 0, response.Length, 0, new AsyncCallback(Send), handler);
        }
コード例 #6
0
        static void Send(IAsyncResult resul)
        {
            try {
                Socket handler   = (Socket)resul.AsyncState;
                int    bytesSent = handler.EndSend(resul);

                Request request = new Request();
                request.Socket = handler;
                handler.BeginReceive(request.Buffer, 0, Request.BufferSize, 0, new AsyncCallback(Read), request);
            } catch (Exception e) {
                ServerLog.Register(e.ToString());
            }
        }
コード例 #7
0
 internal static bool CanSaveStruct(string name)
 {
     if (Tables.ContainsKey(name))
     {
         ServerLog.Register("Se intentó crear \"" + name + "\" pero la tabla ya está abierta.");
         return(false);
     }
     if (DBFile.Exists(name))
     {
         ServerLog.Register("Se intentó crear \"" + name + "\" pero la tabla ya existe.");
         return(false);
     }
     return(true);
 }
コード例 #8
0
 internal void SetField(int ix, string name, byte type, int size, byte decimals)
 {
     if (DBStream != null)
     {
         ServerLog.Register("Se intentó inicializar la columna  \"" + name + "\" en la tabla \"" + Name + "\" pero la tabla ya está abierta.");
         return;
     }
     if (ix > FieldCount)
     {
         ServerLog.Register("Se intentó inicializar la columna " + ix.ToString() + " en la tabla \"" + Name + "\" pero la estructura solo contiene " + FieldCount.ToString() + " columnas.");
         return;
     }
     Fields[ix] = new DBField(name, type, size, decimals);
 }
コード例 #9
0
 public static string Save(string[] param)
 {
     if (param.Length != 3)
     {
         ServerLog.Register("Esperando 2 parameteros en: save.");
         return("ERROR");
     }
     try {
         Image <Gray, byte> Img = new Image <Gray, byte>(100, 100);
         Img.Bytes = Convert.FromBase64String(param[2]);
         FaceList.Save(param[1], Img);
         return("OK");
     } catch (Exception e) {
         ServerLog.Register(e.Message);
         return("ERROR");
     }
 }
コード例 #10
0
        internal string ReadString(string name, string[] values)
        {
            int     ix;
            DBField field = FetchField(name, out ix);

            if (field == null)
            {
                ServerLog.Register("El campo \"" + name + "\" no existe en la tabla \"" + Name + "\".");
                return(String.Empty);
            }
            if (field.Type != DB.FieldTypeString)
            {
                ServerLog.Register("El campo \"" + name + "\" en la tabla \"" + Name + "\" no es texto.");
                return(String.Empty);
            }
            return(values[ix]);
        }
コード例 #11
0
        public static string Test(string[] param)
        {
            if (param.Length != 4)
            {
                ServerLog.Register("Esperando 3 parameteros en: test.");
                return("ERROR");
            }

            try {
                Image <Gray, byte> Img = new Image <Gray, byte>(100, 100);
                Img.Bytes = Convert.FromBase64String(param[3]);
                return(FaceList.Test(param[1] == "T", param[2], Img));
            } catch (Exception e) {
                ServerLog.Register(e.Message);
                return("ERROR");
            }
        }
コード例 #12
0
        internal static DBStatus Open(string name)
        {
            if (Tables.ContainsKey(name))
            {
                DBFile tab = Tables[name];
                return(tab.Open());
            }
            if (!DBFile.Exists(name))
            {
                ServerLog.Register("No se pudo abrir la table \"" + name + "\", debido a que no existe.");
                return(null);
            }
            DBFile   table  = new DBFile(name);
            DBStatus status = table.Open();

            Tables.Add(name, table);
            return(status);
        }
コード例 #13
0
        internal bool ReplaceString(string name, string[] values, string val)
        {
            int     ix;
            DBField field = FetchField(name, out ix);

            if (field == null)
            {
                ServerLog.Register("El campo \"" + name + "\" no existe en la tabla \"" + Name + "\".");
                return(false);
            }
            if (field.Type != DB.FieldTypeString)
            {
                ServerLog.Register("El campo \"" + name + "\" en la tabla \"" + Name + "\" no es texto.");
                return(false);
            }
            values[ix] = val.PadRight(field.Size).Substring(0, field.Size);
            return(true);
        }
コード例 #14
0
        internal DBStatus Open()
        {
            if (OpenCount > 0)
            {
                OpenCount++;
                DBStatus stat = new DBStatus();
                stat.Values = new string[FieldCount];
                stat.BlankRow();
                return(stat);
            }

            try {
                DBStream = new FileStream(DataFileName(Name + DBFEXENSION), FileMode.Open);
            }catch (Exception e) {
                LogError(e);
                return(null);
            }

            Formatter = new BinaryFormatter();
            Header    = (DBHeader)Formatter.Deserialize(DBStream);
            if (!Header.IsValid())
            {
                DBStream.Close();
                ServerLog.Register("No se puedo abrir \"" + Name + "\" debido a que el encabezado es inválido.");
                return(null);
            }
            FieldCount = Header.Fields;
            Fields     = new DBField[FieldCount];
            for (int i = 0; i < FieldCount; i++)
            {
                DBField field = (DBField)Formatter.Deserialize(DBStream);
                field.Name = Encoding.ASCII.GetString(field.BName).Trim();
                Fields[i]  = field;
            }

            DBStatus status = new DBStatus();

            status.Table  = this;
            status.Values = new string[FieldCount];
            status.BlankRow();
            return(status);
        }
コード例 #15
0
        internal double ReadNumeric(string name, string[] values)
        {
            int     ix;
            DBField field = FetchField(name, out ix);

            if (field == null)
            {
                ServerLog.Register("El campo \"" + name + "\" no existe en la tabla \"" + Name + "\".");
                return(0);
            }
            if (field.Type != DB.FieldTypeString)
            {
                ServerLog.Register("El campo \"" + name + "\" en la tabla \"" + Name + "\" no es texto.");
                return(0);
            }
            try {
                return(Convert.ToDouble(values[ix]));
            } catch (Exception) {
                ServerLog.Register("El campo \"" + name + "\" de la tabla \"" + Name + "\" no se puede convertir a \"double\".");
                return(0);
            }
        }
コード例 #16
0
 void LogError(Exception e)
 {
     ServerLog.Register(String.Format("Tabla \"{0}\": {1}", Name, e.Message), true);
 }
コード例 #17
0
        internal string[] SaveStruct()
        {
            int          rsize   = 0;
            int          fieldCt = Fields.Length;
            MemoryStream stream  = new MemoryStream();

            Formatter  = new BinaryFormatter();
            Header     = new DBHeader();
            FieldCount = 0;
            Formatter.Serialize(stream, Header);
            int ix;

            for (int i = 0; i < fieldCt; i++)
            {
                DBField field = Fields[i];
                switch (field.Type)
                {
                case DB.FieldTypeString:
                    break;

                case DB.FieldTypeNumeric:
                    break;

                default:
                    ServerLog.Register("Se intentó crear \"" + Name + "\" con al menos un tipo de dato inválido.");
                    return(null);
                }
                if (FetchField(field.Name, out ix) != null)
                {
                    ServerLog.Register("Se intentó crear \"" + Name + "\" con al menos un campo duplicado.");
                    return(null);
                }
                FieldCount++;
                field.Offset = rsize;
                rsize       += field.Size;
                Formatter.Serialize(stream, field);
            }
            if (rsize == 0)
            {
                ServerLog.Register("Se intentó crear \"" + Name + "\" pero la longitud del registro es cero.");
                return(null);
            }

            Header.Fields     = fieldCt;
            Header.RowSize    = rsize;
            Header.HeaderSize = stream.Position;
            Header.VirtualEOF = stream.Position;
            stream.Position   = 0;
            Formatter.Serialize(stream, Header);

            try {
                DBStream = new FileStream(DataFileName(Name + DBFEXENSION), FileMode.CreateNew);
                byte[] bytes = stream.ToArray();
                DBStream.Write(bytes, 0, bytes.Length);
                stream.Close();
                DBStream.Flush();
                OpenCount++;
            } catch (Exception e) {
                LogError(e);
                return(null);
            }
            string[] values = new string[FieldCount];
            BlankRow(values);
            return(values);
        }