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); }
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(); } } }); }