Ejemplo n.º 1
0
		/// <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);
		}
Ejemplo n.º 2
0
		/// <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>();
		}
Ejemplo n.º 3
0
		/// <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;
		}
Ejemplo n.º 4
0
		/// <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);
			}
		}
Ejemplo n.º 5
0
		//处理空命令
		private void ProcessCommand_Nop(Message m, Host h)
		{
			if (h == null) return;
		}
Ejemplo n.º 6
0
		//收到消息包了?
		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));
		}
Ejemplo n.º 7
0
		/// <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(), "");
		}
Ejemplo n.º 8
0
		/// <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);
		}
Ejemplo n.º 9
0
		/// <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);
		}
Ejemplo n.º 10
0
		/// <summary>
		/// 查询客户端版本
		/// </summary>
		/// <param name="host">客户端</param>
		public void GetVersion(Host host)
		{
			SendCommand(host, Consts.Commands.GetInfo, 0ul, "", "");
		}
Ejemplo n.º 11
0
		//process received absencemode
		private void ProcessCommand_SendAbsenceInfo(Message message, Host host)
		{
			if (host == null) return;

			host.ChangeAbsenceMode(host.IsInAbsenceMode, message.NormalMsg);
		}
Ejemplo n.º 12
0
		//离开状态或昵称更改
		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;
		}
Ejemplo n.º 13
0
		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);
		}
Ejemplo n.º 14
0
		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
		}
Ejemplo n.º 15
0
		//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);
		}
Ejemplo n.º 16
0
		//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));
				});
			}
		}
Ejemplo n.º 17
0
		//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)));
			}
		}
Ejemplo n.º 18
0
		//接收到文字消息
		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);
		}
Ejemplo n.º 19
0
		//发送离开信息?
		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, "");
		}
Ejemplo n.º 20
0
		private void ProcessCommand_IsGetList(Message message, Host host)
		{
			if (host == null) return;

		}
Ejemplo n.º 21
0
		//查询版本回应
		private void ProcessCommand_SendInfo(Message message, Host host)
		{
			if (host == null) return;

			host.ClientVersion = message.NormalMsg;
		}
Ejemplo n.º 22
0
		/// <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);
		}
Ejemplo n.º 23
0
		//请求查询版本信息
		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, "");
		}
Ejemplo n.º 24
0
		/// <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);
			}
		}
Ejemplo n.º 25
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="host">绑定的客户端</param>
 public HostInfoNodeBase(Host host)
 {
     this.Host = host;
 }
Ejemplo n.º 26
0
		/// <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(), "");
		}
Ejemplo n.º 27
0
		private void ProcessCommand_ReadMsg(Message message, Host host)
		{
			if (host != null)
				OnTextMessageOpened(new MessageEventArgs(message, host));
		}
Ejemplo n.º 28
0
		/// <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);
		}
Ejemplo n.º 29
0
		//数据包收到确认
		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);
		}
Ejemplo n.º 30
0
		private void ProcessCommand_DelMsg(Message message, Host host)
		{
			if (host == null) return;

		}
Ejemplo n.º 31
0
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="host">绑定的客户端</param>
		public HostInfoNodeBase(Host host)
		{
			this.Host = host;
		}