internal void Handle(SaveDiagnosticsTask input) {
         var output = new SaveDiagnosticsTaskResponse();

         using (var dbConn = DatabaseManager.DbConn()) {
            var task = dbConn.ExecuteBpl(new DiagnosticsTaskGetById { TaskId = input.Task.TaskId });
            if (task == null) {
               var taskAdd = dbConn.ExecuteBpl(new DiagnosticsTaskGetByName {
                  TaskName = input.Task.TaskName
               });

               if (taskAdd != null) {
                  Log.Warn("Attempt to add duplicated task with name '{0}'", input.Task.TaskName);
                  output.swlr = SwlResult.ALREADY_EXISTS;
                  goto Exit;
               }

               dbConn.ExecuteBpl(new DiagnosticsTaskAdd {
                  TaskId = input.Task.TaskId,
                  TaskType = input.Task.TaskType,
                  TaskName = input.Task.TaskName,
                  TaskSchedule = input.Task.TaskSchedule,
                  TaskData = input.Task.TaskData
               });
            } else {
               dbConn.ExecuteBpl(new DiagnosticsTaskUpdate {
                  TaskId = input.Task.TaskId,
                  TaskSchedule = input.Task.TaskSchedule,
                  TaskData = input.Task.TaskData
               });
            }

            output.swlr = SwlResult.OK;
         }

      Exit:
         Reply(output);
      }
      private void _btnSaveOnClick(object sender, EventArgs e) {
         if (_task == null) {
            _task = new DiagnosticsTaskInfo();
         }

         if (_task.TaskId.IsEmpty) {
            _task.TaskId = BplIdentity.Get(Guid.NewGuid().ToString());

            if (textName.Text == "") {
               MessageBox.Show("Enter task name", "Task name is empty", MessageBoxButtons.OK, MessageBoxIcon.Error);
               textName.Focus();
               return;
            }

            _task.TaskName = textName.Text;

            if (((DiagnosticsTaskType)cmbType.SelectedItem) == DiagnosticsTaskType.None) {
               MessageBox.Show("Enter correct task type", "Incorrect task type", MessageBoxButtons.OK, MessageBoxIcon.Error);
               cmbType.Focus();
               return;
            }

            _task.TaskType = (DiagnosticsTaskType)cmbType.SelectedItem;
         }

         try {
            _task.TaskSchedule = TimeSpan.Parse(textSchedule.Text);
         } catch (Exception ex) {
            MessageBox.Show("Enter schedule in correct format", ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
            textSchedule.Focus();
            return;
         }

         if (textData.Text != "") {
            _task.TaskData = System.Text.Encoding.Unicode.GetBytes(textData.Text);
         }

         var req = new SaveDiagnosticsTask();
         req.Task = _task.Clone();
         SendRequest(req);
      }