예제 #1
0
        public void Parse_Throws_MessageReadException_On_Missing_Data()
        {
            var msg = new MessageBuilder()
                      .WriteCode(MessageCode.Server.Login)
                      .Build();

            var ex = Record.Exception(() => LoginResponse.Parse(msg));

            Assert.NotNull(ex);
            Assert.IsType <MessageReadException>(ex);
        }
예제 #2
0
        public void Parse_Throws_MessageException_On_Code_Mismatch()
        {
            var msg = new MessageBuilder()
                      .WriteCode(MessageCode.Peer.BrowseRequest)
                      .Build();

            var ex = Record.Exception(() => LoginResponse.Parse(msg));

            Assert.NotNull(ex);
            Assert.IsType <MessageException>(ex);
        }
예제 #3
0
        public void Parse_Returns_Expected_Data_On_Failure()
        {
            var str = RandomGuid;

            var msg = new MessageBuilder()
                      .WriteCode(MessageCode.Server.Login)
                      .WriteByte(0)
                      .WriteString(str)
                      .Build();

            var response = LoginResponse.Parse(msg);

            Assert.False(response.Succeeded);
            Assert.Equal(str, response.Message);
        }
예제 #4
0
        public void Parse_Returns_Expected_Data_On_Success()
        {
            var ip      = new IPAddress(Random.Next(1024));
            var ipBytes = ip.GetAddressBytes();

            Array.Reverse(ipBytes);

            var msg = new MessageBuilder()
                      .WriteCode(MessageCode.Server.Login)
                      .WriteByte(1)
                      .WriteString(string.Empty)
                      .WriteBytes(ipBytes)
                      .Build();

            var response = LoginResponse.Parse(msg);

            Assert.True(response.Succeeded);
            Assert.Equal(string.Empty, response.Message);
            Assert.Equal(ip, response.IPAddress);
        }
예제 #5
0
        private static ResponseBase ReadResponse(BinaryReader reader)
        {
            int responseSize = reader.ReadInt32();

            byte[] bytes = reader.ReadBytes(responseSize);

            ResponseType responseType = (ResponseType)BitConverter.ToInt32(bytes, 0);

            switch (responseType)
            {
            case ResponseType.RegistrationResult:
                return(RegistrationResponse.Parse(bytes));

            case ResponseType.LoginResult:
                return(LoginResponse.Parse(bytes));

            case ResponseType.AddContact:
                return(AddContactResponse.Parse(bytes));

            case ResponseType.GetContacts:
                return(GetContactsResponse.Parse(bytes));

            case ResponseType.SendMessage:
                return(SendMessageResponse.Parse(bytes));

            case ResponseType.ReceiveMessages:
                return(ReceiveMessagesResponse.Parse(bytes));

            case ResponseType.Ok:
            case ResponseType.InvalidAuthToken:
                throw new NotImplementedException();

            case ResponseType.ServerError:
                throw new ServerErrorException(ServerErrorResponse.Parse(bytes).ErrorMessage);

            default:
                throw new InvalidOperationException("Invalid type of response");
            }
        }
        public LoginResponse Login(string email, string password)
        {
            var result = new LoginResponse();
            var request = Core.CoreRequest.Create(LoginServer, LoginServerPort, "login");

            request.Params.Add("e", email);
            request.Params.Add("p", password);
            request.Params.Add("protoversion", "8.2");
            request.Params.Add("client", ClientID);
            request.Params.Add("h", Host);
            request.Params.Add("build", Build);

            result.RequestTime = DateTime.Now;
            var response = request.GetResponse();
            result.ResponseTime = DateTime.Now;

            result.Parse(response);

            this.SessionID = result.Session;
            this.Server = result.RedirectIP;
            this.Port = result.RedirectPort;

            return result;
        }
예제 #7
0
        public async void HandleMessage(object sender, byte[] message)
        {
            var code = new MessageReader <MessageCode.Server>(message).ReadCode();

            Diagnostic.Debug($"Server message received: {code}");

            try
            {
                switch (code)
                {
                case MessageCode.Server.ParentMinSpeed:
                case MessageCode.Server.ParentSpeedRatio:
                case MessageCode.Server.WishlistInterval:
                    SoulseekClient.Waiter.Complete(new WaitKey(code), IntegerResponse.Parse <MessageCode.Server>(message));
                    break;

                case MessageCode.Server.Login:
                    SoulseekClient.Waiter.Complete(new WaitKey(code), LoginResponse.Parse(message));
                    break;

                case MessageCode.Server.RoomList:
                    SoulseekClient.Waiter.Complete(new WaitKey(code), RoomList.Parse(message));
                    break;

                case MessageCode.Server.PrivilegedUsers:
                    SoulseekClient.Waiter.Complete(new WaitKey(code), PrivilegedUserList.Parse(message));
                    break;

                case MessageCode.Server.NetInfo:
                    var netInfo = NetInfo.Parse(message);
                    foreach (var peer in netInfo.Parents)
                    {
                        Console.WriteLine($"{peer.Username} {peer.IPAddress} {peer.Port}");
                    }

                    break;

                case MessageCode.Server.ConnectToPeer:
                    var connectToPeerResponse = ConnectToPeerResponse.Parse(message);

                    if (connectToPeerResponse.Type == Constants.ConnectionType.Tranfer)
                    {
                        // ensure that we are expecting at least one file from this user before we connect. the response
                        // doesn't contain any other identifying information about the file.
                        if (!SoulseekClient.Downloads.IsEmpty && SoulseekClient.Downloads.Values.Any(d => d.Username == connectToPeerResponse.Username))
                        {
                            var(connection, remoteToken) = await SoulseekClient.PeerConnectionManager.GetTransferConnectionAsync(connectToPeerResponse).ConfigureAwait(false);

                            var download = SoulseekClient.Downloads.Values.FirstOrDefault(v => v.RemoteToken == remoteToken && v.Username == connectToPeerResponse.Username);

                            if (download != default(Transfer))
                            {
                                SoulseekClient.Waiter.Complete(new WaitKey(Constants.WaitKey.IndirectTransfer, download.Username, download.Filename, download.RemoteToken), connection);
                            }
                        }
                        else
                        {
                            throw new SoulseekClientException($"Unexpected transfer request from {connectToPeerResponse.Username} ({connectToPeerResponse.IPAddress}:{connectToPeerResponse.Port}); Ignored.");
                        }
                    }
                    else
                    {
                        await SoulseekClient.PeerConnectionManager.GetOrAddMessageConnectionAsync(connectToPeerResponse).ConfigureAwait(false);
                    }

                    break;

                case MessageCode.Server.AddUser:
                    var addUserResponse = AddUserResponse.Parse(message);
                    SoulseekClient.Waiter.Complete(new WaitKey(code, addUserResponse.Username), addUserResponse);
                    break;

                case MessageCode.Server.GetStatus:
                    var statsResponse = GetStatusResponse.Parse(message);
                    SoulseekClient.Waiter.Complete(new WaitKey(code, statsResponse.Username), statsResponse);
                    UserStatusChanged?.Invoke(this, new UserStatusChangedEventArgs(statsResponse));
                    break;

                case MessageCode.Server.PrivateMessage:
                    var pm = PrivateMessage.Parse(message);
                    PrivateMessageReceived?.Invoke(this, pm);

                    if (SoulseekClient.Options.AutoAcknowledgePrivateMessages)
                    {
                        await SoulseekClient.AcknowledgePrivateMessageAsync(pm.Id, CancellationToken.None).ConfigureAwait(false);
                    }

                    break;

                case MessageCode.Server.GetPeerAddress:
                    var peerAddressResponse = GetPeerAddressResponse.Parse(message);
                    SoulseekClient.Waiter.Complete(new WaitKey(code, peerAddressResponse.Username), peerAddressResponse);
                    break;

                default:
                    Diagnostic.Debug($"Unhandled server message: {code}; {message.Length} bytes");
                    break;
                }
            }
            catch (Exception ex)
            {
                Diagnostic.Warning($"Error handling server message: {code}; {ex.Message}", ex);
            }
        }
예제 #8
0
        public static NetworkMessageBase Decode(string messageString)
        {
            if (string.IsNullOrWhiteSpace(messageString))
            {
                return(null);
            }

            var type = (NetworkMessageType)Enum.Parse(typeof(NetworkMessageType), GetTypeFromMsg(messageString));
            var msg  = GetMsgContent(messageString);

            switch (type)
            {
            case NetworkMessageType.ErrorResponse:                       return(ErrorResponse.Parse(msg));

            case NetworkMessageType.HeartbeatRequest:                    return(HeartbeatRequest.Parse(msg));

            case NetworkMessageType.HeartbeatResponse:                   return(HeartbeatResponse.Parse(msg));

            case NetworkMessageType.BeginConnectionRequest:              return(BeginConnectionRequest.Parse(msg));

            case NetworkMessageType.BeginConnectionResponse:             return(BeginConnectionResponse.Parse(msg));

            case NetworkMessageType.BeginDebugConnectionRequest:         return(BeginDebugConnectionRequest.Parse(msg));

            case NetworkMessageType.BeginDebugConnectionResponse:        return(BeginDebugConnectionResponse.Parse(msg));

            case NetworkMessageType.EndConnectionRequest:                return(EndConnectionRequest.Parse(msg));

            case NetworkMessageType.EndConnectionResponse:               return(EndConnectionResponse.Parse(msg));

            case NetworkMessageType.GetUserListRequest:                  return(GetUserListRequest.Parse(msg));

            case NetworkMessageType.GetUserListResponse:                 return(GetUserListResponse.Parse(msg));

            case NetworkMessageType.LoginRequest:                        return(LoginRequest.Parse(msg));

            case NetworkMessageType.LoginResponse:                       return(LoginResponse.Parse(msg));

            case NetworkMessageType.LogoutRequest:                       return(LogoutRequest.Parse(msg));

            case NetworkMessageType.LogoutResponse:                      return(LogoutResponse.Parse(msg));

            case NetworkMessageType.GetAppointmentsOfADayRequest:        return(GetAppointmentsOfADayRequest.Parse(msg));

            case NetworkMessageType.GetAppointmentsOfADayResponse:       return(GetAppointmentsOfADayResponse.Parse(msg));

            case NetworkMessageType.GetAppointmentsOfAPatientRequest:    return(GetAppointmentsOfAPatientRequest.Parse(msg));

            case NetworkMessageType.GetAppointmentsOfAPatientResponse:   return(GetAppointmentsOfAPatientResponse.Parse(msg));

            case NetworkMessageType.GetPatientListRequest:               return(GetPatientListRequest.Parse(msg));

            case NetworkMessageType.GetPatientListResponse:              return(GetPatientListResponse.Parse(msg));

            case NetworkMessageType.GetMedicalPracticeRequest:           return(GetMedicalPracticeRequest.Parse(msg));

            case NetworkMessageType.GetMedicalPracticeResponse:          return(GetMedicalPracticeResponse.Parse(msg));

            case NetworkMessageType.GetTherapyPlacesTypeListRequest:     return(GetTherapyPlacesTypeListRequest.Parse(msg));

            case NetworkMessageType.GetTherapyPlacesTypeListResponse:    return(GetTherapyPlacesTypeListResponse.Parse(msg));

            case NetworkMessageType.GetPracticeVersionInfoRequest:       return(GetPracticeVersionInfoRequest.Parse(msg));

            case NetworkMessageType.GetPracticeVersionInfoResponse:      return(GetPracticeVersionInfoResponse.Parse(msg));

            case NetworkMessageType.TryToAddNewEventsRequest:                        return(TryToAddNewEventsRequest.Parse(msg));

            case NetworkMessageType.TryToAddNewEventsResponse:                       return(TryToAddNewEventsResponse.Parse(msg));

            case NetworkMessageType.GetLockRequest:                                          return(GetLockRequest.Parse(msg));

            case NetworkMessageType.GetLockResponse:                                         return(GetLockResponse.Parse(msg));

            case NetworkMessageType.ReleaseLockRequest:                                      return(ReleaseLockRequest.Parse(msg));

            case NetworkMessageType.ReleaseLockResponse:                             return(ReleaseLockResponse.Parse(msg));

            case NetworkMessageType.GetLabelListRequest:                             return(GetLabelListRequest.Parse(msg));

            case NetworkMessageType.GetLabelListResponse:                            return(GetLabelListResponse.Parse(msg));

            case NetworkMessageType.EventBusNotification:                return(EventBusNotification.Parse(msg));

            case NetworkMessageType.PatientAddedNotification:            return(PatientAddedNotification.Parse(msg));

            case NetworkMessageType.PatientUpdatedNotification:          return(PatientUpdatedNotification.Parse(msg));

            case NetworkMessageType.TherapyPlaceTypeAddedNotification:   return(TherapyPlaceTypeAddedNotification.Parse(msg));

            case NetworkMessageType.TherapyPlaceTypeUpdatedNotification: return(TherapyPlaceTypeUpdatedNotification.Parse(msg));

            default:
                throw new ArgumentException();
            }
        }