Пример #1
0
        public async Task <ConnectionResponse> RequestConnection(string username, string password, bool silentMode = false)
        {
            try
            {
                string timestamp = null;
                if (DataCache.ApplicationMetadata?.TimeStamp != null)
                {
                    timestamp = DataCache.ApplicationMetadata.TimeStamp.ToString();
                }

                //TODO: how to determine the value of the app version
                var request = new ConnectionRequest(username, password, "1", timestamp: timestamp, sessionId: User.Current?.SessionId);

                var output = await WebSocketsClient.DoRequestAsync <ConnectionRequest, ConnectionResponse>(request, silentMode : silentMode);

                ServiceContainer.InvalidateCache();
                if (output != null && output.Body != null)
                {
                    if (User.Current != null)
                    {
                        User.Current.SessionId = output.Body.SessionId;

                        if (output.Body.Devices != null)
                        {
                            if (output.Body.MetaData != null)
                            {
                                DataCache.ApplicationMetadata = output.Body.MetaData;
                            }

                            if (output.Body.User?.Name != null)
                            {
                                User.Current.Name = output.Body.User?.Name;
                            }

                            if (output.Body.User?.DevicesAccess != null)
                            {
                                User.Current.DevicesAccess = output.Body.User?.DevicesAccess;
                            }

                            DataCache.SetDeviceOrder(output.Body?.Devices?.Keys?.ToList());
                            DataCache.CacheDevicesResponse(output.Body?.Devices?.Items);
                            DataCache.SetActiveAlertsCount(output.Body?.AlertsCount);
                            DataCache.SyncCommandProgresses(output.Body?.CommandProgresses);
                        }

                        User.Current.Save();
                    }
                }

                return(output);
            }
            catch (Exception e)
            {
                LogUtility.LogException(e);
            }

            return(null);
        }
Пример #2
0
            public override void ReceivedMessage(WebSocket webSocket, NSObject message)
            {
                ExceptionUtility.Try(() =>
                {
                    this.ResetMissedPongs();
                    string msg = (message != null ? message.ToString() : String.Empty);
                    LogUtility.LogMessage(String.Format("{2}:Websocket Message Rcvd (from {0}: {1}", this._client.Url, WebSocketsClientIos.FormatJsonForLogging(msg), this._client._instanceId.ToString()));

                    var waitingForResponse = _client._waitingForResponse.ToList();

                    //deserialize object (or attempt to)
                    var response = ResponseFactory.ParseResponse(msg);

                    //call our callbacks
                    if (response != null && response.Header != null)
                    {
                        foreach (var item in waitingForResponse)
                        {
                            if (item.Value != null)
                            {
                                if ((response.Header.Channel != null && response.Header.Channel == item.Key) || response.IsGlobalResponse)
                                {
                                    _client.UnregisterWaitingForResponse(item.Key);

                                    item.Value(response);
                                }
                            }
                        }
                    }

                    //handle clients waiting for updates
                    var progressResponse = response as ProgressResponse;
                    if (progressResponse != null)
                    {
                        Action <ProgressResponse> callback;
                        if (_client._waitingForUpdates.TryGetValue(progressResponse.CommandId, out callback))
                        {
                            callback(progressResponse);
                            if (response.IsFinal)
                            {
                                _client.UnregisterFromProgressUpdates(progressResponse.CommandId);
                            }

                            if (progressResponse?.Body?.Devices != null)
                            {
                                DataCache.CacheDevicesResponse((response as ProgressResponse)?.Body?.Devices.Items);
                            }
                        }
                    }

                    //handle ad hoc device updates
                    var devicesResponse = response as DevicesResponse;
                    if (devicesResponse != null)
                    {
                        DataCache.CacheDevicesResponse(devicesResponse);
                    }

                    //handle ad hoc alerts updates
                    var alertsResponse = response as AlertsResponse;
                    if (alertsResponse != null)
                    {
                        DataCache.HandleAlertsResponse(alertsResponse);
                    }

                    //handle ad hoc device briefs updates
                    var deviceBriefsResponse = response as DeviceBriefsResponse;
                    if (deviceBriefsResponse != null)
                    {
                        DataCache.CacheDevicesResponse(deviceBriefsResponse?.Body?.Devices.Items);
                    }

                    //handle ad hoc reconnect responses
                    var errorResponse = response as ErrorResponse;
                    if (errorResponse != null)
                    {
                        if (errorResponse.IsReconnectResponse)
                        {
                            LogUtility.LogMessage("Received an ad hoc Reconnect response from server; will reconnect");
                            _client.FireReconnectEvent();
                        }
                    }
                });
            }