public void launchListeningLoop() { while (sessionActive) { PowerMessage mess; try { mess = PowerMessage.Deserialize(stream); //Console.WriteLine("{0}: {1} | {2}", mess.messType, mess.details, mess.value); } catch (IOException e) { OnError(this, "The server gone away..", e); return; } catch (Exception e) { OnError(this, "We have a problem, Houston.. But we continue", e); continue; } switch (mess.messType) { case MessageType.Greeting: //greet(); break; case MessageType.EndSession: sessionActive = false; break; case MessageType.AuthInitResult: if (mess.details != Details.UserExists) { new PowerMessage(MessageType.RegistrationRequest, xmlPublicKey).Serialize(stream); } break; case MessageType.RegistrationResult: if (mess.details == Details.AccessDenied) { throw new Exception("Registration refused"); } new PowerMessage(MessageType.AuthInit, xmlPublicKey).Serialize(stream); break; case MessageType.AuthToken: byte[] token = (byte[])mess.value; byte[] signedToken = provider.SignData(token, "SHA256"); new PowerMessage(MessageType.AuthToken, signedToken).Serialize(stream); break; case MessageType.AuthTokenResult: if (mess.details == Details.Authorised) { authorized = true; new PowerMessage(MessageType.TasksList).Serialize(stream); } if (OnAuthFinished != null) { OnAuthFinished(this, authorized); } break; case MessageType.TasksList: if (mess.details != Details.OK) { break; } availableTasks = (Dictionary <string, PowerTaskFunc>)mess.value; OnTasksListGot(this, availableTasks); break; case MessageType.TaskInitResult: if (mess.details != Details.Accepted) { throw new Exception("Task " + ((int)mess.value).ToString() + " wasn't accepted"); } PowerTaskIds ids = (PowerTaskIds)mess.value; if (initTasksCallback.ContainsKey(ids.clientId)) { initTasksCallback[ids.clientId](ids.taskId); //Console.WriteLine("Task \"{2}{0}\" initialized as \"{2}{1}\" on server", ids.clientId, ids.taskId, ids.taskName); } break; case MessageType.TaskError: PowerTaskError taskError = (PowerTaskError)mess.value; if (runningTasksError.ContainsKey(taskError.taskId)) { runningTasksError[taskError.taskId](taskError); } if (taskError.fatal) { OnTaskFinished(this, taskError, mess, false); } break; case MessageType.TaskProgress: PowerTaskProgress taskProgress = (PowerTaskProgress)mess.value; if (runningTasksProgress.ContainsKey(taskProgress.taskId)) { runningTasksProgress[taskProgress.taskId](taskProgress); } break; case MessageType.TaskComplete: PowerTaskResult taskComplete = (PowerTaskResult)mess.value; if (runningTasksComplete.ContainsKey(taskComplete.taskId)) { runningTasksComplete[taskComplete.taskId](taskComplete); } OnTaskFinished(this, taskComplete, mess, false); break; case MessageType.TaskResult: PowerTaskResult taskResult = (PowerTaskResult)mess.value; if (runningTasksResult.ContainsKey(taskResult.taskId)) { runningTasksResult[taskResult.taskId](taskResult); } break; } OnPowerMessageProcessed(this, mess); } }
private void Client_OnPowerMessageProcessed(object sender, PowerMessage mess) { runOnUIThread(() => { switch (mess.messType) { case MessageType.TasksList: listBoxAvailableTasks.Items.Clear(); foreach (PowerTaskFunc taskFunc in client.availableTasks.Values) { ListBoxItem item = new ListBoxItem(); item.Content = taskFunc.taskName; item.PreviewMouseDown += (it, arg) => { textBoxChosenTaskToRun.Text = taskNameToRun = taskFunc.taskName; }; listBoxAvailableTasks.Items.Add(item); } break; case MessageType.TaskResult: int valuesCount = 0; PowerTaskResult res = (PowerTaskResult)mess.value; int[][] spectr = ((int[][])(res).result); foreach (int[] arr in spectr) { valuesCount += arr.Length; } tasksStack[res.taskId] += "Got " + valuesCount.ToString() + " values\n"; if (watchingTaskId == res.taskId) { textBoxTaskOutput.Text = tasksStack[res.taskId]; textBoxTaskOutput.ScrollToEnd(); } break; case MessageType.TaskProgress: PowerTaskProgress progress = (PowerTaskProgress)mess.value; if (watchingTaskId == progress.taskId) { progressBarRunningTask.Value = progress.progress * 100; } break; default: bool itIs = mess.value is PowerTask; if (itIs) { PowerTask task = (PowerTask)mess.value; Console.WriteLine("{0}: {1} | {2}", mess.messType, mess.value, task.taskName); if (!tasksStack.ContainsKey(task.taskId)) { return; } tasksStack[task.taskId] += mess.details.ToString(); textBoxTaskOutput.Text = tasksStack[task.taskId]; textBoxTaskOutput.ScrollToEnd(); } break; } }); }