diff --git a/QControlKit/Constants/QDefines.cs b/QControlKit/Constants/QDefines.cs index 3820ab7..94f901d 100644 --- a/QControlKit/Constants/QDefines.cs +++ b/QControlKit/Constants/QDefines.cs @@ -289,6 +289,17 @@ public const string Error = "error"; } + public static class QConnectionRole + { + public const string View = "view"; + public const string ViewEdit = "view|edit"; + public const string ViewEditControl = "view|edit|control"; + public const string ViewControl = "view|control"; + public const string EditControl = "edit|control"; + public const string Edit = "edit"; + public const string Control = "control"; + } + public static class QColorName { public const string Red = "red"; diff --git a/QControlKit/Events/QEventArgs.cs b/QControlKit/Events/QEventArgs.cs index a07c661..a40e29a 100644 --- a/QControlKit/Events/QEventArgs.cs +++ b/QControlKit/Events/QEventArgs.cs @@ -48,7 +48,8 @@ namespace QControlKit.Events public class QWorkspaceConnectedArgs : EventArgs { - + public string status { get; set; } + public string data { get; set; } } public class QWorkspaceDisconnectedArgs : EventArgs @@ -59,6 +60,7 @@ namespace QControlKit.Events public class QWorkspaceConnectionErrorArgs : EventArgs { public string status { get; set; } + public string data { get; set; } } public class QQLabPreferencesUpdatedArgs : EventArgs { diff --git a/QControlKit/QClient.cs b/QControlKit/QClient.cs index 5f281a9..7f52ff3 100644 --- a/QControlKit/QClient.cs +++ b/QControlKit/QClient.cs @@ -75,7 +75,7 @@ namespace QControlKit if (message.IsReply) { - JToken data = message.response; + JToken data = message.data; //special case, want to update cue properties if (message.IsReplyFromCue) @@ -101,13 +101,13 @@ namespace QControlKit } else { - _log.Error($"unhandled reply from cue: Type: {data.Type} value: {message.response}"); + _log.Error($"unhandled reply from cue: Type: {data.Type} value: {message.data}"); } } else if (message.IsReplyFromCueLists) { - OnCueListsUpdated(message.response); + OnCueListsUpdated(message.data); } else if (message.IsWorkspacesInfo) { @@ -115,10 +115,12 @@ namespace QControlKit } else if (message.IsConnect) { - if (message.response.ToString().Contains("ok")) - OnWorkspaceConnected(); + _log.Verbose(message.data.ToString()); + _log.Verbose("Status:" + message.status.ToString()); + if (message.status.ToString().Equals("ok")) + OnWorkspaceConnected(message.status.ToString(),message.data.ToString()); else - OnWorkspaceConnectionError(message.response.ToString()); + OnWorkspaceConnectionError(message.status.ToString(), message.data.ToString()); } else { @@ -227,14 +229,14 @@ namespace QControlKit WorkspaceDisconnected?.Invoke(this, new QWorkspaceDisconnectedArgs()); } - protected virtual void OnWorkspaceConnected() + protected virtual void OnWorkspaceConnected(string status, string data) { - WorkspaceConnected?.Invoke(this, new QWorkspaceConnectedArgs()); + WorkspaceConnected?.Invoke(this, new QWorkspaceConnectedArgs { status = status, data = data }); } - protected virtual void OnWorkspaceConnectionError(string status) + protected virtual void OnWorkspaceConnectionError(string status, string data) { - WorkspaceConnectionError?.Invoke(this, new QWorkspaceConnectionErrorArgs { status = status }); + WorkspaceConnectionError?.Invoke(this, new QWorkspaceConnectionErrorArgs { status = status, data = data }); } protected virtual void OnWorkspacesUpdated(QMessage message) @@ -242,7 +244,7 @@ namespace QControlKit if(WorkspacesUpdated != null) { List workspaces = new List(); - foreach (var item in message.response) + foreach (var item in message.data) { QWorkspaceInfo workspacefound = JsonConvert.DeserializeObject(item.ToString()); workspaces.Add(workspacefound); diff --git a/QControlKit/QMessage.cs b/QControlKit/QMessage.cs index 403a7dd..abfec99 100644 --- a/QControlKit/QMessage.cs +++ b/QControlKit/QMessage.cs @@ -141,12 +141,25 @@ namespace QControlKit public string[] AddressParts { get { return address.Split(new char[] { '/' },StringSplitOptions.RemoveEmptyEntries); } } - public JToken response + public JToken data { get { - JObject responseObj = JObject.Parse((string)arguments[0]); - return responseObj["data"]; + JObject dataObj = JObject.Parse((string)arguments[0]); + return dataObj["data"]; + } + } + + public JToken status + { + get + { + if (arguments != null && arguments.Count > 0) + { + JObject statusObj = JObject.Parse((string)arguments[0]); + return statusObj["status"]; + } + return null; } } diff --git a/QControlKit/QWorkspace.cs b/QControlKit/QWorkspace.cs index e505ac5..aa33b31 100644 --- a/QControlKit/QWorkspace.cs +++ b/QControlKit/QWorkspace.cs @@ -160,6 +160,8 @@ namespace QControlKit public string[] versionParts { get { return version.Split('.'); } } public bool connectedToQLab3 { get { return versionParts[0] == "3"; } } + public bool connectedToQLab4 { get { return versionParts[0] == "4"; } } + public bool connectedToQLab5 { get { return versionParts[0] == "5"; } } #region Connection/reconnection @@ -170,14 +172,14 @@ namespace QControlKit if(hasPasscode && passcode == null) { _log.Error($"*** workspace <{name}> requires a passcode but none was supplied."); - OnWorkspaceConnectionError(this, new QWorkspaceConnectionErrorArgs { status = QConnectionStatus.BadPass }); + OnWorkspaceConnectionError(this, new QWorkspaceConnectionErrorArgs { status = QConnectionStatus.BadPass, data = "badpass" }); return; } if (!client.connect()) { _log.Error($"*** couldn't connect to server client is not connected."); - OnWorkspaceConnectionError(this, new QWorkspaceConnectionErrorArgs { status = QConnectionStatus.Error }); + OnWorkspaceConnectionError(this, new QWorkspaceConnectionErrorArgs { status = QConnectionStatus.Error, data = "error" }); return; } @@ -425,13 +427,13 @@ namespace QControlKit _log.Error($"*** Unable to connect to workspace: <{name}> on server: <{server.name}>"); } - WorkspaceConnectionError?.Invoke(this, new QWorkspaceConnectionErrorArgs { status = args.status }); + WorkspaceConnectionError?.Invoke(this, args); } private void OnWorkspaceConnected(object source, QWorkspaceConnectedArgs args) { _log.Information($"Connection to <{name}> successful, finishing things up."); - WorkspaceConnected?.Invoke(this, new QWorkspaceConnectedArgs()); + WorkspaceConnected?.Invoke(this, args); finishConnection(); } diff --git a/QControlKitXamDemo/QControlKitXamDemo/CueListPage.xaml.cs b/QControlKitXamDemo/QControlKitXamDemo/CueListPage.xaml.cs index 4bb6f3a..5b068bb 100644 --- a/QControlKitXamDemo/QControlKitXamDemo/CueListPage.xaml.cs +++ b/QControlKitXamDemo/QControlKitXamDemo/CueListPage.xaml.cs @@ -21,25 +21,44 @@ namespace QControlKitXamDemo connectedWorkspace = workspace; connectedWorkspace.WorkspaceUpdated += Workspace_WorkspaceUpdated; connectedWorkspace.WorkspaceConnectionError += ConnectedWorkspace_WorkspaceConnectionError; + connectedWorkspace.WorkspaceConnected += ConnectedWorkspace_WorkspaceConnected; ; connectedWorkspace.connect(passcode); connectedWorkspace.defaultSendUpdatesOSC = true; connectedWorkspace.CueListChangedPlaybackPosition += ConnectedWorkspace_CueListChangedPlaybackPosition; } + + protected override void OnDisappearing() { base.OnDisappearing(); connectedWorkspace.disconnect(); connectedWorkspace.WorkspaceUpdated -= Workspace_WorkspaceUpdated; connectedWorkspace.WorkspaceConnectionError -= ConnectedWorkspace_WorkspaceConnectionError; + connectedWorkspace.WorkspaceConnected -= ConnectedWorkspace_WorkspaceConnected; connectedWorkspace.CueListChangedPlaybackPosition -= ConnectedWorkspace_CueListChangedPlaybackPosition; } + private async void ConnectedWorkspace_WorkspaceConnected(object source, QWorkspaceConnectedArgs args) + { + if (args.status.Equals("ok") && connectedWorkspace.connectedToQLab5) + { + if (!args.data.Contains(QConnectionRole.View)) + { + string passcode = await DisplayPromptAsync("PIN does not have view permissions.", "Try Again", maxLength: 4, keyboard: Keyboard.Numeric); + if (passcode != null) + { + connectedWorkspace.connect(passcode); + } + } + } + } + private async void ConnectedWorkspace_WorkspaceConnectionError(object source, QWorkspaceConnectionErrorArgs args) { if (args.status.Equals("badpass")) { - string passcode = await DisplayPromptAsync("Passcode was incorrect.", "Try Again", maxLength: 4, keyboard: Keyboard.Numeric); + string passcode = await DisplayPromptAsync("PIN is incorrect.", "Try Again", maxLength: 4, keyboard: Keyboard.Numeric); if (passcode != null) { connectedWorkspace.connect(passcode);