void ProcessDialog(uint clientID, IEnumerable <Message> msgs) { ActiveClientsQueue.IClientData clData = m_onlineClients.Get(clientID); if (clData == null) { return; } uint lastClMsgID = clData.LastClientMessageID; var seq = from msg in msgs where msg.ID > lastClMsgID select msg; if (seq.Any()) { uint lastSrvMsgID = clData.LastSrvMessageID; var respList = new List <Message>(seq.Count()); var clStatus = m_ndxerClientsStatus.Get(clientID) as ClientStatus; clStatus.LastSeen = DateTime.Now; clData.TimeToLive = ActiveClientsQueue.InitTimeToLive; clData.LastClientMessageID = seq.Max(m => m.ID); foreach (Message msg in seq) { Dbg.Log($"Processing dialog msg {msg.ID}: {msg.MessageCode}..."); if (m_msgProcessors.ContainsKey(msg.MessageCode)) { Message resp = m_msgProcessors[msg.MessageCode](msg, clientID); if (resp != null) { respList.Add(resp); } } } if (respList.Count > 0) { DialogEngin.AppendSrvDialog(AppPaths.GetSrvDialogFilePath(clientID), respList); AddUpload(Names.GetSrvDialogFile(clientID)); } Dbg.Assert(clData.LastClientMessageID >= lastClMsgID); clStatus.SentMsgCount += clData.LastClientMessageID - lastClMsgID; Dbg.Assert(clData.LastSrvMessageID >= lastSrvMsgID); clStatus.ReceivedMsgCount += clData.LastSrvMessageID - lastSrvMsgID; m_ndxerClientsStatus.Source.Replace(m_ndxerClientsStatus.IndexOf(clientID), clStatus); } }
void ProcessRunningClients() { var deadClients = new List <uint>(); foreach (uint clID in m_onlineClients.ClientsID) { ActiveClientsQueue.IClientData clData = m_onlineClients.Get(clID); if (clData == null) { continue; } if (--clData.TimeToLive <= TTL_DIE) { deadClients.Add(clID); } else if (clData.TimeToLive <= 0) { AppContext.LogManager.LogSysActivity($"Envoi d'un message de synchronisation au client {ClientStrID(clID)}", true); var msg = new Message(++clData.LastSrvMessageID, 0, Message_t.Sync); //delegate status update to processdialog method DialogEngin.AppendSrvDialog(AppPaths.GetSrvDialogFilePath(clID), msg); AddUpload(Names.GetSrvDialogFile(clID)); } } foreach (uint id in deadClients) { AppContext.LogManager.LogSysActivity($"Client {ClientStrID(id)} présumé déconnecté", true); m_onlineClients.Remove(id); AppContext.LogManager.CloseLogger(id); ClientClosed?.Invoke(id); } foreach (uint clID in m_onlineClients.ClientsID) { AddDownload(Names.GetClientDialogFile(clID)); } }
Message ProcessSyncMessage(Message msg) { Dbg.Assert(msg.MessageCode == Message_t.Sync); var ms = new MemoryStream(msg.Data); var reader = new RawDataReader(ms, Encoding.UTF8); uint clID = reader.ReadUInt(); uint srvMsgID = reader.ReadUInt(); uint clMsgId = reader.ReadUInt(); AppContext.LogManager.LogSysActivity($"Reception d'un message de synchronisation du client {ClientStrID(clID)}", true); ActiveClientsQueue.IClientData clData = m_onlineClients.Get(clID); if (clData != null) { clData.TimeToLive = ActiveClientsQueue.InitTimeToLive; var resp = new Message(++clData.LastSrvMessageID, 0, Message_t.Null); DialogEngin.AppendSrvDialog(AppPaths.GetSrvDialogFilePath(clID), resp); AddUpload(Names.GetSrvDialogFile(clID)); //maj status var clStatus = m_ndxerClientsStatus.Get(clID) as ClientStatus; clStatus.LastSeen = DateTime.Now; ++clStatus.ReceivedMsgCount; m_ndxerClientsStatus.Source.Replace(m_ndxerClientsStatus.IndexOf(clID), clStatus); return(null); } var client = m_ndxerClients.Get(clID) as HubClient; if (client == null) { AppContext.LogManager.LogSysActivity("Réception d’une demande de synchronisation " + $"de la part d’un client inexistant ({ClientStrID(clID)}). Réinitialisation du client", true); //maj du fichier gov string srvDlgFile = AppPaths.GetSrvDialogFilePath(clID); //le client n'existe pas => son fichier gov n'existe pas var clDlg = new ClientDialog(clID, ClientStatus_t.Reseted, Enumerable.Empty <Message>()); DialogEngin.WriteSrvDialog(srvDlgFile, clDlg); AddUpload(Path.GetFileName(srvDlgFile)); return(null); } var status = m_ndxerClientsStatus.Get(clID) as ClientStatus; var respMsg = new Message(++srvMsgID, 0, Message_t.Null); var dlg = new ClientDialog(clID, status.Status, new Message[] { respMsg }); DialogEngin.WriteSrvDialog(AppPaths.GetSrvDialogFilePath(clID), dlg); AddUpload(Names.GetSrvDialogFile(clID)); if (status.Status == ClientStatus_t.Enabled) { ActiveClientsQueue.IClientData clientData = m_onlineClients.Add(clID); clientData.LastClientMessageID = clMsgId; clientData.LastSrvMessageID = srvMsgID; AppContext.LogManager.StartLogger(clID); } return(null); }