using FileTransDataObject; using Google.Protobuf.WellKnownTypes; using Sog; namespace SMAgent { class AgentFileRecvMng : Singleton { private FileRecvMgr recvMgr; private bool isFinish; private long lastTickTime; public AgentFileRecvMng() { recvMgr = new FileRecvMgr(); recvMgr._SendFileContentReq = SendFileContentReq; recvMgr._SendFileRecvStateReq = SendFileRecvStateReq; isFinish = true; } public void Clear() { TraceLog.Debug("AgentFileRecvMng.Clear"); isFinish = true; recvMgr.Clear(); } public void Tick(long nowMs) { if (nowMs < lastTickTime + 1000) { return; } lastTickTime = nowMs; recvMgr.Tick(nowMs); // agent同一时间只会从一个center拉取数据, 接收完成并上报结果后释放资源 if (! isFinish && recvMgr.IsFinish()) { isFinish = true; Clear(); } } public void OnTransFileNotify(SMTransFileNotify notify) { // agent同一时间只会从一个center拉取数据, 所以收到传送通知时直接开始新一轮接收 Clear(); isFinish = false; recvMgr.OnTransFileNotify(notify); } public void OnFileContentRes(SMFileContentRes res) { recvMgr.OnFileContentRes(res); } public void OnFileRecvStateRes(SMFileRecvStateRes res) { recvMgr.OnFileRecvStateRes(res); } public void OnCancelTransNotify(SMCancelTransNotify notify) { recvMgr.CancelTrans(notify.HostName); } public void SendFileContentReq(FileRecvNode recvNode, FileRecvData fileData) { var req = new SMFileContentReq { FileName = fileData.fileName, FileMd5 = fileData.fileMd5, HostName = SMAgentUtils.HostName, ContentOffset = fileData.ReqFileOffset, TransSeq = recvNode.transSeq }; SMAgentNet.Instance.SendMsgToCenter(req, SMMsgID.FileContentReq); } public void SendFileRecvStateReq(FileRecvNode recvNode) { SMFileRecvStateReq req = new SMFileRecvStateReq(); req.TransSeq = recvNode.transSeq; req.HostName = SMAgentUtils.HostName; foreach (FileRecvData fileData in recvNode.fileList) { req.FileList.Add(new FileRecvState { FileName = fileData.fileName, FileMd5 = fileData.fileMd5, RecvState = fileData.recvState, }); } SMAgentNet.Instance.SendMsgToCenter(req, SMMsgID.FileRecvStateReq); } } }