private void OnReceived(IAsyncResult result) { try { if (_client == null) { var client = (UdpClient)result.AsyncState; client.EndReceive(result, ref _endPoint); return; } var ea = new IncomingUdpMessageEventArgs(); ea.Message = Encoding.Default.GetString(_client.EndReceive(result, ref _endPoint)); OnIncomingMessage(ea); if (ea.Message.StartsWith("$SR")) { var args = new SearchResultEventArgs { Message = SRMessage.Parse(ea.Message) }; OnSearchResult(args); } } catch (Exception x) { } finally { if (_client != null) { _client.BeginReceive(OnReceived, null); } } }
private void HubSearchRequest(object sender, SearchRequestEventArgs e) { var ea = new EngineSearchRequestEventArgs { HubConnection = (HubConnection)sender, Message = e.Message }; OnSearchRequest(ea); if (ea.Cancel) { return; } if (Share != null && e.Message.SearchType == SearchType.TTH) { _searchesAverage.Update(1); var results = Share.Search(new SearchQuery { Query = e.Message.SearchRequest, SearchType = SearchType.TTH }); if (results.Count > 0) { var result = results[0]; var hub = (HubConnection)sender; var res = new SRMessage { FileName = result.VirtualPath, FileSize = result.Magnet.Size, Nickname = hub.Settings.Nickname, FreeSlots = Settings.MaxUploadThreads > 0 ? Settings.MaxUploadThreads - TransferManager.TransfersCount : 0, HubAddress = hub.RemoteAddressString, HubName = "TTH:" + result.Magnet.TTH, TotalSlots = Settings.MaxUploadThreads }; if (e.Message.SearchAddress.StartsWith("Hub:")) { res.TargetNickname = e.Message.SearchAddress.Remove(0, 4); hub.SendMessage(res.Raw); } else { UdpConnection.SendMessage(res.Raw, e.Message.SearchAddress); } } } }
public void InjectResult(SRMessage resultMsg) { var resultMagnet = new Magnet { TTH = resultMsg.HubName, Size = resultMsg.FileSize, FileName = Path.GetFileName(resultMsg.FileName) }; var resultSource = new Source { UserNickname = resultMsg.Nickname, HubAddress = resultMsg.HubAddress }; //Logger.Info("Found source {0}", resultSource); HubSearchResult result; lock (_syncRoot) { if (!_tthList.TryGetValue(resultMagnet.TTH, out result)) { result = new HubSearchResult(resultMagnet, resultSource, resultMsg.FileName); _tthList.Add(resultMagnet.TTH, result); _results.Add(result); } else { if (result.Sources.FindIndex(s => s.UserNickname == resultSource.UserNickname && s.HubAddress == resultSource.HubAddress) == -1) { result.Sources.Add(resultSource); result.VirtualDirs.Add(resultMsg.FileName); } } } OnSearchResult(new SearchManagerResultEventArgs { Result = result }); var item = _engine.DownloadManager.GetDownloadItem(resultMagnet.TTH); if (item != null) { item.Sources.Add(resultSource); } }
private void OnMessageSR(SRMessage srMessage) { OnPassiveSearchResult(new SearchResultEventArgs { Message = srMessage }); }
protected override void ParseRaw(byte[] buffer, int offset, int length) { var received = _encoding.GetString(buffer, offset, length); if (!string.IsNullOrEmpty(_dataBuffer)) { received = _dataBuffer + received; _dataBuffer = null; } var commands = received.Split('|'); var processCount = commands.Length; if (!received.EndsWith("|")) { _dataBuffer = received.Substring(received.LastIndexOf('|') + 1); processCount--; } for (int i = 0; i < processCount; i++) { var cmd = commands[i]; if (cmd.Length == 0) { continue; } if (IncomingMessage != null) { OnIncomingMessage(new MessageEventArgs { Message = cmd }); } if (cmd[0] == '$') { // command var spaceIndex = cmd.IndexOf(' '); var cmdName = spaceIndex == -1 ? cmd : cmd.Substring(0, spaceIndex); try { switch (cmdName) { case "$Hello": { var arg = HelloMessage.Parse(cmd); OnMessageHello(ref arg); } break; case "$HubName": { var arg = HubNameMessage.Parse(cmd); OnMessageHubName(ref arg); } break; case "$Lock": { var arg = LockMessage.Parse(cmd); OnMessageLock(ref arg); } break; case "$Search": { var arg = SearchMessage.Parse(cmd); OnMessageSearch(ref arg); } break; case "$ConnectToMe": { var arg = ConnectToMeMessage.Parse(cmd); var ea = new OutgoingConnectionRequestEventArgs { Message = arg }; OnOutgoingConnectionRequest(ea); } break; case "$RevConnectToMe": { var arg = RevConnectToMeMessage.Parse(cmd); var ea = new IncomingConnectionRequestEventArgs { Message = arg }; OnIncomingConnectionRequest(ea); if (!string.IsNullOrEmpty(ea.LocalAddress)) { SendMessage( new ConnectToMeMessage { RecipientNickname = arg.SenderNickname, SenderAddress = ea.LocalAddress }.Raw); } } break; case "$GetPass": { OnMessageGetPass(); } break; case "$MyINFO": { var arg = MyINFOMessage.Parse(cmd); OnMessageMyINFO(arg); } break; case "$Quit": { var arg = QuitMessage.Parse(cmd); OnMessageQuit(arg); } break; case "$SR": { var arg = SRMessage.Parse(cmd); OnMessageSR(arg); } break; case "$UserIP": { var arg = UserIPMessage.Parse(cmd); OnUserIPMessage(arg); } break; } } catch (Exception x) { Logger.Error("Error when trying to parse a command: " + x.Message); } } else { // chat message _lastChatMessage = cmd; OnChatMessage(new ChatMessageEventArgs { RawMessage = cmd }); } } }