/******************************************************************************/ private void timer_1min_Tick(object sender, EventArgs e) { m60mCounter++; if (m60mCounter >= AppConfig.GetLifeTimeOfRec() / 2) { m60mCounter = 0; CheDaoFactory.Handle_Internal_Package(CheDaoInterface.clean_cmd, Encoding.UTF8.GetBytes("Cleanup")); } m10mCounter++; if (m10mCounter >= upload_rec_period && base_url != null && !mWebClient.IsBusy && mRecBuffer != null && mPendingBuffer == null) { m10mCounter = 0; mPendingBuffer = "[" + mRecBuffer.ToString() + "]"; mRecBuffer = null; //the operation is safe mWebClient.UploadStringAsync(new Uri(base_url), mPendingBuffer); } }
/** * 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); }
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; }