Exemple #1
0
        /// <summary>
        /// Creates a new object of the specified type.
        /// This is important to use instead of the new operator, because this will invoke the required parameters
        /// for the DefaultWorker.
        /// </summary>
        /// <typeparam name="T">The type of IWorker</typeparam>
        /// <returns>The new IWorker object</returns>
        /// <exception cref="ArgumentException">If the specified type is not registered in the WorkerGroups</exception>
        public static T CreateWorker <T>() where T : IWorker
        {
            if (WorkerGroups.ObjectBindings.GetOrNothing(typeof(T), out var group))
            {
                return(DefaultWorker.Instantiate <T>(@group, Guid.NewGuid()));
            }

            throw new ArgumentException("missing group for worker");
        }
Exemple #2
0
        private void OnCellClick(object sender, DataGridViewCellEventArgs args)
        {
            if (args.RowIndex < 0)
            {
                return;
            }
            var current = overview.Rows[args.RowIndex];

            var create = false;

            if (!(current.Cells[2].Value is IWorker worker))
            {
                if (!DialogWorkerType(out var group, out var label))
                {
                    return;
                }
                if (!WorkerGroups.ObjectBindings.GetOrNothing(group, out var clazz))
                {
                    Logger.Warn("Unable to get class for group id {0}", group);
                    return;
                }

                create = true;
                worker = DefaultWorker.Instantiate(clazz, group, label);
            }

            using (var parameters = new Parameters(worker))
            {
reopen:
                var result = parameters.ShowDialog();

                switch (result)
                {
                case DialogResult.OK when create:
                {
                    ShowWorker(worker);
                    workers[worker.Label] = worker;
                    break;
                }

                case DialogResult.No when !create:
                {
                    SystemSounds.Exclamation.Play();
                    goto reopen;
                }
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// Loads the IWorker objects from the configuration into the IDictionary.
        /// </summary>
        /// <param name="workers">The IDictionary to store the workers</param>
        /// <returns>true if the operation was successful otherwise false</returns>
        public bool Load(IDictionary <Guid, IWorker> workers)
        {
            if (!File.Exists(configuration))
            {
                return(false);
            }
            try
            {
                using (var stream = new FileStream(configuration, FileMode.Open, FileAccess.Read))
                {
                    var reader = new BinaryReader(stream);

                    var count = reader.ReadInt32();

                    for (var i = 0; i < count; i++)
                    {
                        var group = reader.ReadGuid();
                        var label = reader.ReadGuid();

                        if (!WorkerGroups.ObjectBindings.GetOrNothing(group, out var clazz))
                        {
                            Logger.Warn("Can't find class binding for group id {0}", group);
                            // ToDo: drain further stream
                            continue;
                        }

                        var worker = DefaultWorker.Instantiate(clazz, group, label);

                        var payloadAmount = reader.ReadInt32();
                        var payloadBuffer = reader.ReadBytes(payloadAmount);

                        if (worker is DefaultWorker defaults)
                        {
                            using (var payload = new MemoryStream(payloadBuffer, false))
                            {
                                try
                                {
                                    defaults.LoadPreferences(payload);
                                }
                                catch (Exception ex)
                                {
                                    Logger.Error("An error occurred while loading preferences for {0}",
                                                 worker.GetType());
                                    Logger.Debug("Exception: {0}", ex);
                                }
                            }
                        }
                        else
                        {
                            Logger.Warn("Cannot load preferences for non DefaultWorker");
                            Logger.Debug("Please note Worker must implement DefaultWorker to use preferences");
                        }

                        workers[label] = worker;
                    }
                }
            }
            catch (IOException)
            {
                Logger.Error("An unexpected io exception occurred while loading from file {0}", configuration);
                return(false);
            }

            return(true);
        }