/// <summary> /// 绑定主机到TabPage /// </summary> /// <param name="host">主机对象</param> public void BindHost(Host host) { this.Host = host; host.AbsenceModeChanged += host_AbsenceModeChanged; host.NickNameChanged += host_NickNameChanged; host.AbsenceMessageChanged += host_AbsenceMessageChanged; this.Text = Core.HostInfoManager.GetHostDisyplayName(host); }
/// <summary> /// 创建一个新的 FileTaskInfo 对象. /// </summary> public FileTaskInfo(FileTransferDirection direction, ulong packageID, Host remoteHost) { Direction = direction; PackageID = packageID; RemoteHost = remoteHost; CreateTime = DateTime.Now; CancelPadding = false; TaskList = new List<FileTaskItem>(); }
/// <summary> /// 从文本信息里面解析出任务信息 /// </summary> /// <param name="taskMessage"></param> /// <returns></returns> public static FileTaskInfo DecompileTaskInfo(Host Host, Message msg) { if (!msg.IsFileAttached || string.IsNullOrEmpty(msg.ExtendMessage)) return null; FileTaskInfo task = new FileTaskInfo(FileTransferDirection.Receive, msg.PackageNo, Host); string[] f = msg.ExtendMessage.Split('\a'); for (int i = 0; i < f.Length; i++) { string[] ef = f[i].Split(':'); if (ef.Length < 5) continue; int index = 0; string name = ""; ulong size = 0ul; ulong filetypeAttr; if (!int.TryParse(ef[0], out index) || !ulong.TryParse(ef[2], System.Globalization.NumberStyles.AllowHexSpecifier, null, out size) || !ulong.TryParse(ef[4], System.Globalization.NumberStyles.AllowHexSpecifier, null, out filetypeAttr)) continue; name = ef[1]; if (string.IsNullOrEmpty(name)) continue; else name = Network.TCPThread.replaceReg.Replace(name, "_"); task.TaskList.Add(new FileTaskItem() { TaskInfo = task, TotalSize = size, CancelPadding = false, FileCount = 0, FolderCount = 0, FinishedFileCount = 0, FinishedSize = 0, FinishedFolderCount = 0, EndTime = null, FullPath = "", CurrentFileTransfered = 0, Index = index, IsFolder = (filetypeAttr & (ulong)Define.Consts.Cmd_FileType_Option.Dir) == (ulong)Define.Consts.Cmd_FileType_Option.Dir, StartTime = null, CurrentName = name, CurrentFileSize = (filetypeAttr & (ulong)Define.Consts.Cmd_FileType_Option.Dir) == (ulong)Define.Consts.Cmd_FileType_Option.Dir ? 0ul : size, State = FileTaskItemState.Scheduled, Name = name }); } if (task.TaskList.Count == 0) return null; else return task; }
/// <summary> /// 获得主机显示名称 /// </summary> /// <param name="host"></param> /// <returns></returns> public static string GetHostDisyplayName(Host host) { string key = host.HostSub.Ipv4Address.Address.ToString(); string memo = Env.ClientConfig.HostInfo.HostMemo.ContainsKey(key) ? Env.ClientConfig.HostInfo.HostMemo[key] : string.Empty; if (string.IsNullOrEmpty(memo) || Env.ClientConfig.HostInfo.DisplayStyle == IPMessagerNet.Config.HostNameDisplayStyle.NameOnly) return string.Format("{0} ({1})", host.NickName, host.GroupName); switch (Env.ClientConfig.HostInfo.DisplayStyle) { case IPMessagerNet.Config.HostNameDisplayStyle.MemoOnly: return memo; case IPMessagerNet.Config.HostNameDisplayStyle.MemoBeforeName: return string.Format("{2} ({0}/{1})", host.NickName, host.GroupName, memo); case IPMessagerNet.Config.HostNameDisplayStyle.NameOnly: return string.Format("{0} ({1})", host.NickName, host.GroupName); default: return string.Format("{0} ({1})", host.NickName, host.GroupName); } }
//处理空命令 private void ProcessCommand_Nop(Message m, Host h) { if (h == null) return; }
//收到消息包了? private void ProcessCommand_RecvMsg(Message message, Host host) { if (host == null) return; ulong pkno = message.NormalMsg.TryParseToInt(0ul); if (pkno == 0) return; Client.PopSendItemFromList(pkno, 0); OnTextMessageArrived(new MessageEventArgs(message, host)); }
/// <summary> /// 发送文件取消接收消息 /// </summary> /// <param name="host">远程主机</param> /// <param name="packageNo">包编号</param> public void SendReleaseFilesSignal(Host host, ulong packageNo) { SendCommand(host, Consts.Commands.ReleaseFiles, 0ul, packageNo.ToString(), ""); }
/// <summary> /// 向用户发送消息 /// </summary> /// <param name="packageID">消息包ID</param> /// <param name="host">主机</param> /// <param name="content">消息内容</param> /// <param name="isHtml">是否HTML格式消息</param> /// <param name="isRtf">是否RTF格式消息</param> /// <param name="packed">是否封包</param> /// <param name="isAutoReply">是否是自动回复信息</param> /// <param name="password">是否加密</param> /// <param name="attachContent">附件内容</param> /// <param name="isBoardCast">是否是广播</param> /// <returns>发出去的消息包编号</returns> public ulong SendTextMessage(ulong packageID, Host host, string content, bool isHtml, bool isRtf, bool packed, bool password, bool isBoardCast, bool isAutoReply, string attachContent) { ulong options = 0ul; if (isHtml) options |= (ulong)Consts.Cmd_Send_Option.Content_Html; if (isRtf) options |= (ulong)Consts.Cmd_Send_Option.Content_RTF; if (password) options |= (ulong)Consts.Cmd_Send_Option.Password; if (!string.IsNullOrEmpty(attachContent)) options |= (ulong)Consts.Cmd_All_Option.FileAttach | (ulong)Consts.Cmd_All_Option.NewFileAttach; return SendCommand(host, Consts.Commands.SendMsg, options, content, attachContent, isBoardCast, true, false, false, isAutoReply, host.SupportEncrypt, packed, false); }
/// <summary> /// 发送消息 /// </summary> /// <param name="host">主机</param> /// <param name="cmd">命令</param> /// <param name="options">选项</param> /// <param name="msg">消息</param> /// <param name="extMsg">扩展消息</param> /// <param name="isBroadCast">是否是广播</param> /// <param name="sendCheck">是否需要确认收到</param> /// <param name="noAddList">是否忽略到主机列表</param> /// <param name="noLog">是否不记录日志</param> /// <param name="isAutoRet">是否是自动回复</param> /// <param name="isEncrypt">是否是加密信息</param> /// <param name="isSecret">是否需要阅读确认</param> /// <param name="noPopup">是否不自动弹出</param> /// <returns>发出去的消息包编号</returns> public ulong SendCommand(Host host, Consts.Commands cmd, ulong options, string msg, string extMsg, bool isBroadCast, bool sendCheck , bool noAddList, bool noLog, bool isAutoRet, bool isEncrypt, bool isSecret, bool noPopup) { return SendCommand(host, null, cmd, options, msg, extMsg, isBroadCast, sendCheck, noAddList, noLog, isAutoRet, isEncrypt, isSecret, noPopup); }
/// <summary> /// 查询客户端版本 /// </summary> /// <param name="host">客户端</param> public void GetVersion(Host host) { SendCommand(host, Consts.Commands.GetInfo, 0ul, "", ""); }
//process received absencemode private void ProcessCommand_SendAbsenceInfo(Message message, Host host) { if (host == null) return; host.ChangeAbsenceMode(host.IsInAbsenceMode, message.NormalMsg); }
//离开状态或昵称更改 private void ProcessCommand_BrAbsence(Message message, Host host) { if (host == null) return; host.ChangeAbsenceMode(Consts.Check(message.Options, Consts.Cmd_All_Option.Absence), ""); if (!string.IsNullOrEmpty(message.NormalMsg)) host.NickName = message.NormalMsg; if (!string.IsNullOrEmpty(message.ExtendMessage)) host.GroupName = message.ExtendMessage; host.HostFeature = message.Options; }
private void ProcessCommand_ReleaseFiles(Message message, Host host) { if (host == null) return; //释放文件 ulong pkgid = 0; if (!ulong.TryParse(message.NormalMsg, out pkgid) || pkgid == 0) return; FileTaskManager.ReleaseFile(pkgid); }
private void ProcessCommand_GetFileData(Message message, Host host) { if (host == null) return; //this command was executed by tcp file send,so we doesn't process this command here //but maybe we need to keep this section because it maybe useable }
//AnsEntry void ProcessCommand_AnsEntry(Message m, Host h) { if (h == null && (Config.IgnoreNoAddListFlag || !Consts.Check(m.Options, Consts.Cmd_Send_Option.NoAddList))) { h = new Host() { ClientVersion = string.Empty, GroupName = m.ExtendMessage, HasShare = false, HostSub = new HostSub() { HostName = m.HostName, Ipv4Address = m.HostAddr, UserName = m.UserName }, Index = 0, IsEnhancedContractEnabled = Consts.Check(m.Options, Consts.Cmd_All_Option.EnableNewDataContract), NickName = m.NormalMsg }; if (Consts.Check(m.Options, Consts.Cmd_All_Option.Absence)) h.ChangeAbsenceMode(true, Resources.CommandExecutor_ProcessCommand_Br_Entry_LeaveModeText); LivedHost.Add(m.HostAddr.Address.ToString(), h); h.AbsenceModeChanged += Host_AbsendModeChanged; //立刻查询离开消息 if (h.IsInAbsenceMode) Host_AbsendModeChanged(h, null); m.Host = h; } h.SupportEncrypt = Consts.Check(m.Options, Consts.Cmd_All_Option.Encrypt); h.SupportFileTransport = Consts.Check(m.Options, Consts.Cmd_All_Option.FileAttach); }
//Br_Exit void ProcessCommand_Br_Exit(Message m, Host h) { //如果开启了通知功能,则告知非本网段主机 if (h == null) return; LivedHost.Delete(h.HostSub.Ipv4Address.Address.ToString()); //通知非本网段主机 if (Config.EnableHostNotifyBroadcast && !Config.ForceOldContract) { Host[] list = LivedHost.Values.Where(s => s.HostSub.IPHeader != h.HostSub.IPHeader).Distinct(Helper.HostSubEqualityCompare.StaticObj).ToArray(); Array.ForEach(list, s => { MessageProxy.SendWithNoCheck(s, Consts.Commands.Br_Exit_Forward, 0, s.HostSub.Ipv4Address.Address.GetAddressBytes(), BitConverter.GetBytes(s.HostSub.PortNo)); }); } }
//Br_Entry void ProcessCommand_Br_Entry(Message m, Host h) { if (h == null && (Config.IgnoreNoAddListFlag || !Consts.Check(m.Options, Consts.Cmd_Send_Option.NoAddList))) { h = new Host() { ClientVersion = string.Empty, GroupName = m.ExtendMessage, HasShare = false, HostSub = new HostSub() { HostName = m.HostName, Ipv4Address = m.HostAddr, UserName = m.UserName }, Index = 0, IsEnhancedContractEnabled = Consts.Check(m.Options, Consts.Cmd_All_Option.EnableNewDataContract), NickName = m.NormalMsg, HostFeature = m.Options }; if (Consts.Check(m.Options, Consts.Cmd_All_Option.Absence)) h.ChangeAbsenceMode(true, Resources.CommandExecutor_ProcessCommand_Br_Entry_LeaveModeText); h.SupportEncrypt = Consts.Check(m.Options, Consts.Cmd_All_Option.Encrypt); h.SupportFileTransport = Consts.Check(m.Options, Consts.Cmd_All_Option.FileAttach); LivedHost.Add(m.HostAddr.Address.ToString(), h); h.AbsenceModeChanged += Host_AbsendModeChanged; //立刻查询离开消息 if (h.IsInAbsenceMode) Host_AbsendModeChanged(h, null); m.Host = h; } ulong opt = 0ul; if (Config.IsInAbsenceMode) opt |= (ulong)Consts.Cmd_All_Option.Absence; if (Config.EnableFileTransfer) opt |= (ulong)Consts.Cmd_All_Option.FileAttach; //插件 if (Config.Services != null) Config.Services.ProviderExecute(s => opt |= s.GenerateClientFeatures()); //回复证明自己在线 MessageProxy.SendWithNoCheck(h, Consts.Commands.AnsEntry, opt, Config.NickName, Config.GroupName); //如果开启了通知功能,则告知非本网段主机 if (h != null && Config.EnableHostNotifyBroadcast && !Config.ForceOldContract) { Host[] list = LivedHost.Values.Where(s => s.HostSub.IPHeader != h.HostSub.IPHeader && h.IsEnhancedContractEnabled).Distinct(Helper.HostSubEqualityCompare.StaticObj).ToArray(); Array.ForEach(list, s => MessageProxy.SendWithNoCheck(s, Consts.Commands.Br_Entry_Forward, 0, s.HostSub.Ipv4Address.Address.GetAddressBytes(), BitConverter.GetBytes(s.HostSub.PortNo))); } }
//接收到文字消息 private void ProcessCommand_SendMsg(Message message, Host host) { if (host == null) return; //确认是否需要自动回复? if (!message.IsAutoSendMessage && (Config.AutoReply || (Config.AutoReplyWhenAbsence && Config.IsInAbsenceMode))) { string msg = string.IsNullOrEmpty(Config.AutoReplyMessage) ? Config.AutoReplyMessage : Config.AbsenceMessage; if (string.IsNullOrEmpty(msg)) msg = Resources.CommandExecutor_ProcessCommand_SendMsg_AutoReplyMessage; MessageProxy.SendWithNoCheck(host, Consts.Commands.SendMsg, (ulong)Consts.Cmd_Send_Option.AutoRet, msg, string.Empty); message.AutoReplyTime = DateTime.Now; } //触发事件 MessageEventArgs e = new MessageEventArgs(message, host); OnTextMessageReceiving(e); if (!e.IsHandled) OnTextMessageReceived(e); }
//发送离开信息? private void ProcessCommand_GetAbsenceInfo(Message message, Host host) { if (host == null) return; MessageProxy.SendWithNoCheck(host, Consts.Commands.SendAbsenceInfo, 0ul, Config.IsInAbsenceMode ? Config.AbsenceMessage : Resources.CommandExecutor_ProcessCommand_GetAbsenceInfo_NotAbsenceMode, ""); }
private void ProcessCommand_IsGetList(Message message, Host host) { if (host == null) return; }
//查询版本回应 private void ProcessCommand_SendInfo(Message message, Host host) { if (host == null) return; host.ClientVersion = message.NormalMsg; }
/// <summary> /// 发送消息 /// </summary> /// <param name="host">主机对象</param> /// <param name="endPoint">主机地址</param> /// <param name="cmd">命令</param> /// <param name="options">选项</param> /// <param name="msg">消息</param> /// <param name="extMsg">扩展消息</param> /// <returns>发出去的消息包编号</returns> public ulong SendCommand(Host host, IPEndPoint endPoint, Consts.Commands cmd, ulong options, string msg, string extMsg) { return SendCommand(host, endPoint, cmd, options, msg, extMsg, false, false, false, false, false, false, false, false); }
//请求查询版本信息 private void ProcessCommand_GetInfo(Message message, Host host) { if (host == null) return; string version = Config.VersionInfo; if (string.IsNullOrEmpty(version)) { version = System.Reflection.Assembly.GetExecutingAssembly().FullName; } MessageProxy.SendWithNoCheck(host, Consts.Commands.SendInfo, 0, version, ""); }
/// <summary> /// 发送消息 /// </summary> /// <param name="host">主机</param> /// <param name="remoteEndPoint">远程主机地址</param> /// <param name="cmd">命令</param> /// <param name="options">选项</param> /// <param name="msg">消息</param> /// <param name="extMsg">扩展消息</param> /// <param name="isBroadCast">是否是广播</param> /// <param name="sendCheck">是否需要确认收到</param> /// <param name="noAddList">是否忽略到主机列表</param> /// <param name="noLog">是否不记录日志</param> /// <param name="isAutoRet">是否是自动回复</param> /// <param name="isEncrypt">是否是加密信息</param> /// <param name="isSecret">是否需要阅读确认</param> /// <param name="noPopup">是否不自动弹出</param> /// <returns>发出去的消息包编号</returns> public ulong SendCommand(Host host, IPEndPoint remoteEndPoint, Consts.Commands cmd, ulong options, string msg, string extMsg, bool isBroadCast, bool sendCheck , bool noAddList, bool noLog, bool isAutoRet, bool isEncrypt, bool isSecret, bool noPopup) { if (isBroadCast) options |= (ulong)Consts.Cmd_Send_Option.BroadCast; if (sendCheck) options |= (ulong)Consts.Cmd_Send_Option.SendCheck; if (noAddList) options |= (ulong)Consts.Cmd_Send_Option.NoAddList; if (noLog) options |= (ulong)Consts.Cmd_Send_Option.NoLog; if (isAutoRet) options |= (ulong)Consts.Cmd_Send_Option.AutoRet; if (isEncrypt) options |= (ulong)Consts.Cmd_All_Option.Encrypt; if (isSecret) options |= (ulong)Consts.Cmd_Send_Option.Secret; if (noPopup) options |= (ulong)Consts.Cmd_Send_Option.NoPopup; if (sendCheck && host != null) { return MessageProxy.SendWithCheck(host, cmd, options, msg, extMsg); } else { if (host == null) return MessageProxy.SendByIp(remoteEndPoint, cmd, options, msg, extMsg); else return MessageProxy.SendWithNoCheck(host, cmd, options, msg, extMsg); } }
/// <summary> /// 构造函数 /// </summary> /// <param name="host">绑定的客户端</param> public HostInfoNodeBase(Host host) { this.Host = host; }
/// <summary> /// 发送消息打开确认包 /// </summary> /// <param name="host">远程主机</param> /// <param name="packageNo">包编号</param> public void SendMessageOpenedSignal(Host host, ulong packageNo) { SendCommand(host, Consts.Commands.ReadMsg, 0ul, packageNo.ToString(), ""); }
private void ProcessCommand_ReadMsg(Message message, Host host) { if (host != null) OnTextMessageOpened(new MessageEventArgs(message, host)); }
/// <summary> /// 向用户发送消息 /// </summary> /// <param name="host">主机</param> /// <param name="content">消息内容</param> /// <param name="isHtml">是否HTML格式消息</param> /// <param name="isRtf">是否RTF格式消息</param> /// <param name="packed">是否封包</param> /// <param name="password">是否加密</param> /// <returns>发出去的消息包编号</returns> public ulong SendTextMessage(Host host, string content, bool isHtml, bool isRtf, bool packed, bool password) { return SendTextMessage(host, content, isHtml, isRtf, packed, password, false, false, String.Empty); }
//数据包收到确认 private void ProcessCommand_Ex_PackageRecevied(Message message, Host host) { if (host == null) return; ulong pkno = message.NormalMsg.TryParseToInt(0ul); int pkindex = message.ExtendMessage.TryParseToInt(0); if (pkno == 0) return; Client.PopSendItemFromList(pkno, pkindex); }
private void ProcessCommand_DelMsg(Message message, Host host) { if (host == null) return; }
/// <summary> /// 构造函数 /// </summary> /// <param name="host">绑定的客户端</param> public HostInfoNodeBase(Host host) { this.Host = host; }