Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
                    }
                }
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
 private void OnMessageSR(SRMessage srMessage)
 {
     OnPassiveSearchResult(new SearchResultEventArgs {
         Message = srMessage
     });
 }
Esempio n. 5
0
        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
                    });
                }
            }
        }