//Добавление в поток уже созданного проекта, isSetup = false - добавление при настройке другого потока public void PasteProject(Project project) { AddEvent("Добавление проекта", "Проект " + project.Code + " из потока " + project.ThreadCalc.Id); try { project.ThreadCalc = this; Projects.Add(project.Code, project); ProjectsList.Add(project); var list = project.Providers.Values.Select(p => p.Copy(this)).ToList(); project.Providers.Clear(); foreach (var p in list) { if (ProvidersDic.ContainsKey(p.Name)) { project.Providers.Add(p.Name, ProvidersDic[p.Name]); } else { project.Providers.Add(p.Name, p); ProvidersDic.Add(p.Name, p); } ProvidersDic[p.Name].Projects.Add(project.Code); } } catch (Exception ex) { AddError("Ошибка при добавлении проекта", ex); } MakeProviders(); MakeProjectString(); }
//Удаление проекта project из потока, isSetup = false - удаление при настройке другого потока public void DeleteProject(Project project) { AddEvent("Удаление проекта", project.Code); try { foreach (var p in project.Providers.Values) { p.Projects.Remove(project.Code); if (p.Projects.Count == 0) { ProvidersDic.Remove(p.Name); } } Projects.Remove(project.Code); ProjectsList.Remove(project); } catch (Exception ex) { AddError("Ошибка при удалении проекта", ex); } MakeProviders(); MakeProjectString(); }
//Загружет списки проектов и провайдеров для потока public void ReadSetup() { try { Projects.Clear(); ProjectsList.Clear(); foreach (var provider in ProvidersDic.Values) { var pi = provider.ProviderInstance; if (pi != null) { if (ApplicationType == ApplicationType.Controller && General.ProvidersQueues.ContainsKey(pi.Hash)) { General.ProvidersQueues.Remove(pi.Hash); } pi.Dispose(); } } ProvidersDic.Clear(); Sources.Clear(); Receivers.Clear(); Imitators.Clear(); Archive = null; ArchivePr = null; using (var rec = new RecDao(General.ControllerFile, "SELECT * FROM Projects WHERE ThreadId =" + Id + " ORDER BY Project")) while (rec.Read()) { var proj = new Project(rec, this); if (!Command.IsError && !Projects.ContainsKey(proj.Code)) { Projects.Add(proj.Code, proj); ProjectsList.Add(proj); AddEvent("Добавлен проект", proj.Code + ", " + proj.File); proj.ReadProviders();//Чтение списка провайдеров } } MakeProviders(); MakeProjectString(); } catch (Exception ex) { AddError("Ошибка загрузки списка проектов. Необходимо повторить настройку", ex); } Procent = 70; try //Список провайдеров { AddEvent("Чтение настроек провайдеров"); using (var rec = new RecDao(General.ControllerFile, "SELECT * FROM Providers WHERE ThreadId =" + Id)) while (rec.Read()) { var name = rec.GetString("ProviderName"); if (ProvidersDic.ContainsKey(name)) { var prov = ProvidersDic[name]; prov.Code = rec.GetString("ProviderCode"); prov.Inf = rec.GetString("ProviderInf"); prov.Otm = rec.GetBool("Otm"); } } foreach (var prov in ProvidersDic.Values) { if (prov.Otm) { prov.ProviderInstance = General.RunProvider(prov.Code, prov.Name, prov.Inf, this); if (prov.ProviderInstance != null) { switch (prov.Type.ToProviderType()) { case ProviderType.Archive: Archive = (IArchive)prov.ProviderInstance; ArchivePr = prov; break; case ProviderType.Source: Sources.Add(prov.Name, (ISource)prov.ProviderInstance); break; case ProviderType.Imitator: var ims = (Imitator)prov.ProviderInstance; Imitators.Add(prov.Name, ims); var pname = prov.Name.Substring(0, prov.Name.Length - 4); if (Projects.ContainsKey(pname)) { Projects[pname].Imitator = ims; } else { AddError("Недопустимое имя провайдера имитатора", null, prov.Name); } break; case ProviderType.Receiver: Receivers.Add(prov.Name, (IReceiver)prov.ProviderInstance); break; } if (ApplicationType == ApplicationType.Controller) { string hash = prov.ProviderInstance.Hash; if (!General.ProvidersQueues.ContainsKey(hash)) { General.ProvidersQueues.Add(hash, new Queue <int>()); } prov.ProviderQueue = General.ProvidersQueues[hash]; } } } } MakeProviders(); } catch (Exception ex) { AddError("Ошибка при чтении настроек провайдеров", ex); } }