Exemple #1
0
 static CheDaoInterface create(LocalChePackage p)
 {
     Trace.WriteLineIf(Program.trace_sw.TraceVerbose, String.Format("incomming package {0:d} {1:s}", p.msg_type, p.rawXML), "message");
     if (p.msg_type == CheDaoInterface.data_validation)
     {
         Invoice_Request_Count++;
         return(CheRequest.create(p.rawXML, p.time_ticks));
     }
     if (p.msg_type == CheDaoInterface.scan_print || p.msg_type == CheDaoInterface.manual_print)
     {
         Print_Request_Count++;
         return(ChePrintRequest.create(p.msg_type, p.rawXML, p.time_ticks));
     }
     if (p.msg_type == CheDaoInterface.print_confirm)
     {
         Print_Act_Count++;
         return(ChePActionRequest.create(p.rawXML, p.time_ticks));//it is just a string
     }
     if (p.msg_type == CheDaoInterface.delete_cmd)
     {
         Print_Act_Count++;
         return(CheDeleteActionRequest.create(p.rawXML, p.time_ticks));//it is just a string
     }
     return(new SimpleRequest(p.msg_type));
 }
Exemple #2
0
        /* handle the message from network side*/
        internal static byte[] HandlePackage(short cur_type, byte[] msg_body, int buffer_point)
        {
            LocalChePackage p   = new LocalChePackage(cur_type, msg_body, buffer_point);
            CheDaoInterface msg = _HandlePackage(p);

            if (msg != null)
            {
                string rsp_msg = msg.Response();
                Trace.WriteLineIf(Program.trace_sw.TraceVerbose, "send response: " + rsp_msg, "message");
                byte[]       body_buffer = Encoding.UTF8.GetBytes(rsp_msg);
                MemoryStream rsp_str     = new MemoryStream(body_buffer.Length + 6);
                byte[]       tmp         = System.BitConverter.GetBytes((int)rsp_msg.Length);
                Array.Reverse(tmp);
                rsp_str.Write(tmp, 0, sizeof(int));
                tmp = System.BitConverter.GetBytes((short)p.msg_type);
                Array.Reverse(tmp);
                rsp_str.Write(tmp, 0, sizeof(short));
                rsp_str.Write(body_buffer, 0, body_buffer.Length);
                return(rsp_str.GetBuffer());
            }
            return(null);
        }
 /**
     make sure the function is re-entriable.
 **/
 static CheDaoInterface _HandlePackage(LocalChePackage p)
 {
     CheDaoInterface msg = create(p);
     if (msg != null) {
         switch(msg.message_type){
             case CheDaoInterface.data_validation:
                 lock (mPendingList)
                 {
                     CheRequest item = (CheRequest)msg;
                     try
                     {
                         //put to pending list
                         mPendingList.Add(item.Order_Number, item);
                     }
                     catch (Exception e)
                     {
                         Trace.WriteLineIf(Program.trace_sw.TraceError, "Insert CheRequest Failed, maybe the key already exist " + e.Message, "error");
                         msg.Result = 2; //2:其它不符;
                     }
                 }
                 break;
             case CheDaoInterface.clean_cmd://delete the item one hour later
                 int bypass_counter = 0;
                 lock (mPendingList)
                 {
                     Dictionary<String, CheRequest> newPendingList = new Dictionary<String, CheRequest>();
                     foreach (String str in mPendingList.Keys)
                     {
                         CheRequest c_item = mPendingList[str];
                         DateTime c_date = new DateTime(c_item.create_time);
                         if (c_date.AddMinutes(AppConfig.GetLifeTimeOfRec()) > DateTime.Now)
                         {
                             newPendingList.Add(str, c_item);
                         }
                         else {
                             bypass_counter++;
                         }
                     }
                     mPendingList = newPendingList;
                 }
                 Trace.WriteLineIf(Program.trace_sw.TraceVerbose, "clean up the internal cache and bypass " + bypass_counter.ToString());
                 break;
             case CheDaoInterface.scan_print:
             case CheDaoInterface.manual_print:
                 lock (mPendingList)
                 {
                     ChePrintRequest p_item = (ChePrintRequest)msg;
                     if (mPendingList.ContainsKey(p_item.Order_Number))
                     {
                         CheRequest w_item = mPendingList[p_item.Order_Number];
                         mPendingList.Remove(p_item.Order_Number);
                         Program.NewRequest(w_item); // to be print
                     }
                     else
                     {
                         Trace.WriteLineIf(Program.trace_sw.TraceError, "invalide print request, no key exist", "error");
                         msg.Result = 2;//2:已开票;
                     }
                 }
                 break;
             case CheDaoInterface.print_confirm:
                 Program.NewRequest(msg); //internal message
                 break;
             case CheDaoInterface.delete_cmd:
                 Program.NewRequest(msg); //internal message
                 break;
             default:
                 msg = null;
                 break;
         }
         try
         {
             lock (bk_stream)
             {
                 if (msg != null) p.save(bk_stream); // just save the valid msg
             }
         }
         catch (Exception e)
         {
             save_error_count++;
             Trace.WriteLineIf(Program.trace_sw.TraceError,"Write backup stream failed " + e.Message,"error");
         }
     }
     return msg;
 }
 static CheDaoInterface create(LocalChePackage p)
 {
     Trace.WriteLineIf(Program.trace_sw.TraceVerbose,String.Format("incomming package {0:d} {1:s}", p.msg_type, p.rawXML),"message");
     if (p.msg_type == CheDaoInterface.data_validation)
     {
         Invoice_Request_Count++;
         return CheRequest.create(p.rawXML,p.time_ticks);
     }
     if (p.msg_type == CheDaoInterface.scan_print || p.msg_type == CheDaoInterface.manual_print) {
         Print_Request_Count++;
         return ChePrintRequest.create(p.msg_type,p.rawXML,p.time_ticks);
     }
     if (p.msg_type == CheDaoInterface.print_confirm) {
         Print_Act_Count++;
         return ChePActionRequest.create(p.rawXML,p.time_ticks);//it is just a string
     }
     if (p.msg_type == CheDaoInterface.delete_cmd) {
         Print_Act_Count++;
         return CheDeleteActionRequest.create(p.rawXML, p.time_ticks);//it is just a string
     }
     return new SimpleRequest(p.msg_type);
 }
 /*
     it is a bad choice, the call is from GUI thread
     the package is from GUI*/
 internal static void Handle_Internal_Package(short msg_type, byte[] msg_body)
 {
     LocalChePackage p = new LocalChePackage(msg_type, msg_body, msg_body.Length);
     _HandlePackage(p);
 }
 /* handle the message from network side*/
 internal static byte[] HandlePackage(short cur_type, byte[] msg_body, int buffer_point)
 {
     LocalChePackage p = new LocalChePackage(cur_type, msg_body, buffer_point);
     CheDaoInterface msg = _HandlePackage(p);
     if (msg != null) {
         string rsp_msg = msg.Response();
         Trace.WriteLineIf(Program.trace_sw.TraceVerbose,"send response: " + rsp_msg,"message");
         byte[] body_buffer = Encoding.UTF8.GetBytes(rsp_msg);
         MemoryStream rsp_str = new MemoryStream(body_buffer.Length + 6);
         byte[] tmp = System.BitConverter.GetBytes((int)rsp_msg.Length);
         Array.Reverse(tmp);
         rsp_str.Write(tmp, 0, sizeof(int));
         tmp = System.BitConverter.GetBytes((short)p.msg_type);
         Array.Reverse(tmp);
         rsp_str.Write(tmp, 0, sizeof(short));
         rsp_str.Write(body_buffer,0,body_buffer.Length);
         return rsp_str.GetBuffer();
     }
     return null;
 }
 public static void restore()
 {
     const int max_fragment = 1024;
     byte[] buffer = new byte[max_fragment];
     int read_len = 0;
     if (rst_stream != null)
     {
         int msg_count = 0;
         int discard_count = 0;
         Trace.WriteLineIf(Program.trace_sw.TraceVerbose,"restore dumped package","info");
         Boolean read_ok = false;
         do
         {
             read_ok = false;
             read_len = rst_stream.Read(buffer, 0, sizeof(int));
             if (read_len != sizeof(int)) { continue; }
             int msg_len = BitConverter.ToInt32(buffer, 0);
             read_len = rst_stream.Read(buffer, 0, sizeof(short));
             if (read_len != sizeof(short)) { continue; }
             short msg_type = BitConverter.ToInt16(buffer, 0);
             read_len = rst_stream.Read(buffer, 0, sizeof(long));
             if (read_len != sizeof(long)) { continue; }
             DateTime c_t = new DateTime(BitConverter.ToInt64(buffer, 0));
             read_len = rst_stream.Read(buffer, 0, msg_len);
             if (read_len != msg_len) { continue; }
             read_ok = true;
             msg_count++;
             if (c_t.AddMinutes(AppConfig.GetLifeTimeOfRec()) < DateTime.Now)
             {
                 discard_count++;
                 continue; // skip the message because it is too old.
             }
             LocalChePackage p = new LocalChePackage(msg_type, buffer, msg_len, c_t.Ticks);
             _HandlePackage(p);
         } while (read_ok);
         Trace.WriteLineIf(Program.trace_sw.TraceInfo,String.Format("restore done found msg {0:d} discard {1:d}",msg_count,discard_count),"info");
         String obsolete_fn = active_a == "A-" ? "B-" : "A-";
         rst_stream.Close();
         try
         {
             File.Delete(obsolete_fn + bk_fn);
         }
         catch (Exception e) {
             Trace.WriteLineIf(Program.trace_sw.TraceError,"delete backup file " + obsolete_fn + bk_fn + " failed" + e.Message,"error");
         }
     }
     return;
 }
Exemple #8
0
        /*
         *  it is a bad choice, the call is from GUI thread
         *  the package is from GUI*/
        internal static void Handle_Internal_Package(short msg_type, byte[] msg_body)
        {
            LocalChePackage p = new LocalChePackage(msg_type, msg_body, msg_body.Length);

            _HandlePackage(p);
        }
Exemple #9
0
        /**
         *  make sure the function is re-entriable.
         **/
        static CheDaoInterface _HandlePackage(LocalChePackage p)
        {
            CheDaoInterface msg = create(p);

            if (msg != null)
            {
                switch (msg.message_type)
                {
                case CheDaoInterface.data_validation:
                    lock (mPendingList)
                    {
                        CheRequest item = (CheRequest)msg;
                        try
                        {
                            //put to pending list
                            mPendingList.Add(item.Order_Number, item);
                        }
                        catch (Exception e)
                        {
                            Trace.WriteLineIf(Program.trace_sw.TraceError, "Insert CheRequest Failed, maybe the key already exist " + e.Message, "error");
                            msg.Result = 2;     //2:其它不符;
                        }
                    }
                    break;

                case CheDaoInterface.clean_cmd:    //delete the item one hour later
                    int bypass_counter = 0;
                    lock (mPendingList)
                    {
                        Dictionary <String, CheRequest> newPendingList = new Dictionary <String, CheRequest>();
                        foreach (String str in mPendingList.Keys)
                        {
                            CheRequest c_item = mPendingList[str];
                            DateTime   c_date = new DateTime(c_item.create_time);
                            if (c_date.AddMinutes(AppConfig.GetLifeTimeOfRec()) > DateTime.Now)
                            {
                                newPendingList.Add(str, c_item);
                            }
                            else
                            {
                                bypass_counter++;
                            }
                        }
                        mPendingList = newPendingList;
                    }
                    Trace.WriteLineIf(Program.trace_sw.TraceVerbose, "clean up the internal cache and bypass " + bypass_counter.ToString());
                    break;

                case CheDaoInterface.scan_print:
                case CheDaoInterface.manual_print:
                    lock (mPendingList)
                    {
                        ChePrintRequest p_item = (ChePrintRequest)msg;
                        if (mPendingList.ContainsKey(p_item.Order_Number))
                        {
                            CheRequest w_item = mPendingList[p_item.Order_Number];
                            mPendingList.Remove(p_item.Order_Number);
                            Program.NewRequest(w_item);     // to be print
                        }
                        else
                        {
                            Trace.WriteLineIf(Program.trace_sw.TraceError, "invalide print request, no key exist", "error");
                            msg.Result = 2;    //2:已开票;
                        }
                    }
                    break;

                case CheDaoInterface.print_confirm:
                    Program.NewRequest(msg);     //internal message
                    break;

                case CheDaoInterface.delete_cmd:
                    Program.NewRequest(msg);     //internal message
                    break;

                default:
                    msg = null;
                    break;
                }
                try
                {
                    lock (bk_stream)
                    {
                        if (msg != null)
                        {
                            p.save(bk_stream);              // just save the valid msg
                        }
                    }
                }
                catch (Exception e)
                {
                    save_error_count++;
                    Trace.WriteLineIf(Program.trace_sw.TraceError, "Write backup stream failed " + e.Message, "error");
                }
            }
            return(msg);
        }
Exemple #10
0
        public static void restore()
        {
            const int max_fragment = 1024;

            byte[] buffer   = new byte[max_fragment];
            int    read_len = 0;

            if (rst_stream != null)
            {
                int msg_count     = 0;
                int discard_count = 0;
                Trace.WriteLineIf(Program.trace_sw.TraceVerbose, "restore dumped package", "info");
                Boolean read_ok = false;
                do
                {
                    read_ok  = false;
                    read_len = rst_stream.Read(buffer, 0, sizeof(int));
                    if (read_len != sizeof(int))
                    {
                        continue;
                    }
                    int msg_len = BitConverter.ToInt32(buffer, 0);
                    read_len = rst_stream.Read(buffer, 0, sizeof(short));
                    if (read_len != sizeof(short))
                    {
                        continue;
                    }
                    short msg_type = BitConverter.ToInt16(buffer, 0);
                    read_len = rst_stream.Read(buffer, 0, sizeof(long));
                    if (read_len != sizeof(long))
                    {
                        continue;
                    }
                    DateTime c_t = new DateTime(BitConverter.ToInt64(buffer, 0));
                    read_len = rst_stream.Read(buffer, 0, msg_len);
                    if (read_len != msg_len)
                    {
                        continue;
                    }
                    read_ok = true;
                    msg_count++;
                    if (c_t.AddMinutes(AppConfig.GetLifeTimeOfRec()) < DateTime.Now)
                    {
                        discard_count++;
                        continue; // skip the message because it is too old.
                    }
                    LocalChePackage p = new LocalChePackage(msg_type, buffer, msg_len, c_t.Ticks);
                    _HandlePackage(p);
                } while (read_ok);
                Trace.WriteLineIf(Program.trace_sw.TraceInfo, String.Format("restore done found msg {0:d} discard {1:d}", msg_count, discard_count), "info");
                String obsolete_fn = active_a == "A-" ? "B-" : "A-";
                rst_stream.Close();
                try
                {
                    File.Delete(obsolete_fn + bk_fn);
                }
                catch (Exception e) {
                    Trace.WriteLineIf(Program.trace_sw.TraceError, "delete backup file " + obsolete_fn + bk_fn + " failed" + e.Message, "error");
                }
            }
            return;
        }