ComponentWrapper GetAutoselectLibrary(ComponentWrapper component) { Debug.Assert(component.ComponentType == ComponentTypeWrapper.LibraryCategory); ReferenceData refData = this[component]; LibraryCategoryWrapper libcat = refData.Wrapper as LibraryCategoryWrapper; Debug.Assert(libcat != null); ComponentWrapper defaultLib = null; ComponentWrapper stubLib = null; ComponentWrapper templateLib = null; ComponentWrapper bootloaderLib = null; ComponentWrapper projectLib = null; LibraryWrapper defaultWrapper = null; bool alterLib = false; foreach (ComponentWrapper library in refData.Realization) { LibraryWrapper wrapper = this[library].Wrapper as LibraryWrapper; Debug.Assert(wrapper != null); if (wrapper != null) { if (this.Project.Libraries.Contains(library)) { if (wrapper.IsStub == false) { projectLib = library; } else { stubLib = library; } } if (wrapper.IsStub) { if (stubLib == null) { stubLib = library; } } else if (wrapper.IsBootloaderLibrary()) { bootloaderLib = library; } else if (wrapper.IsTemplate) { templateLib = library; } else if (defaultLib == null) { defaultLib = library; defaultWrapper = wrapper; } else { alterLib = true; } } } if (libcat != null) { if (libcat.FeatureAssociations.Count != 0) { bool selected = false; foreach (ComponentWrapper feature in libcat.FeatureAssociations) { if (feature.Checked == true) { selected = true; break; } } if (selected) { if (this.Project.IsBootloaderProject() == false) { if ((alterLib == false) && (defaultLib != null)) { return(defaultLib); } if (projectLib != null) { return(projectLib); } } else if (bootloaderLib == null) { if (this.IsTransport(libcat)) { if (alterLib == false) { return(defaultLib); } if (stubLib != null) { return(stubLib); } if (((alterLib == true) || (defaultLib == null)) || (((templateLib != null) && (string.IsNullOrEmpty(defaultWrapper.CustomFilter))) && ((defaultWrapper.ProcessorSpecific != null) && (string.IsNullOrEmpty(defaultWrapper.ProcessorSpecific.Guid))))) { return(null); } return(defaultLib); } } else { return(bootloaderLib); } } else { if (this.IsTransport(libcat)) { return(null); } return(stubLib); } } else { if (!this.Project.IsBootloaderProject()) { if ((alterLib == false) && (defaultLib != null)) { if ((stubLib == null) && (templateLib == null)) { return(defaultLib); } if (!string.IsNullOrEmpty(defaultWrapper.CustomFilter) || ((defaultWrapper.ProcessorSpecific != null) && (!string.IsNullOrEmpty(defaultWrapper.ProcessorSpecific.Guid)))) { return(defaultLib); } } if (projectLib != null) { return(projectLib); } if ((stubLib != null) && (this.Project.Libraries.Contains(stubLib))) { return(stubLib); } } else if (bootloaderLib == null) { if (stubLib != null) { return(stubLib); } if (alterLib == false) { return(defaultLib); } } else { return(bootloaderLib); } } } return(null); }
private bool ValidateLibrary(LibraryWrapper library) { if (((library.ProcessorSpecific != null) && !string.IsNullOrEmpty(library.ProcessorSpecific.Guid)) && (string.Compare(library.ProcessorSpecific.Guid, this.Solution.Processor.Guid, true) != 0)) { return(false); } if (!string.IsNullOrEmpty(library.CustomFilter)) { bool found = false; //CustomFilter содержит список процессоров через разделитель ';' //Идем вдоль процессоров библиотеки foreach (string libfilter in library.CustomFilter.Split(new char[] { ';' })) { //Идем вдоль процессоров процессора foreach (string procfilter in this.Processor.CustomFilter.Split(new char[] { ';' })) { //Если найдено соответствие, то найдено if (string.Compare(procfilter, libfilter, true) == 0) { found = true; break; } } //Если соответствия не найдено if (found == false) { //Ищем в процессорах решения foreach (string solutionfilter in this.Solution.CustomFilter.Split(new char[] { ';' })) { if (string.Compare(solutionfilter, libfilter, true) == 0) { found = true; break; } } } //Если не найдено if (found == false) { //Находим проект CLR Collection <ComponentWrapper> features = null; if (this.Project.IsClrProject) { features = this.FeaturesInfo.CheckedComponents; } else { foreach (ProjectWrapper project in this.Solution.Projects) { if (project.IsClrProject) { features = GetComponents(project.Features); break; } } } if (features != null) { //Идем вдоль фич проекта CLR foreach (ComponentWrapper component in features) { //Находим соответствующую фичу FeatureWrapper feature = this[component].Wrapper as FeatureWrapper; //И проверяем ее фильтр, если совпало, устанавливаем флаг if ((feature != null) && (string.Compare(feature.Filter, libfilter, true) == 0)) { found = true; break; } } } } //Если не найдено, в конечном итоге сравниваем с именем решения if (!found) { found = 0 == string.Compare(library.CustomFilter, this.Solution.Name, true); } //Если найдено хоть одно соответствие выходим if (found) { break; } } if (!found) { return(false); } } //Если проект не Загрузчик а библиотека - загрузчик, то валидация не проходит if (!this.Project.IsBootloaderProject() && library.IsBootloaderLibrary()) { return(false); } //Есби библиотека - CLR а проект - нет, то валидация не проходит if ((library.Level == LibraryLevelWrapper.CLR) && !this.Project.IsClrProject) { return(false); } string libProjectPath = library.ProjectPath.ToLower(); //Если библиотека лежит в примерах, то валидация не проходит if (libProjectPath.Contains(@"\devicecode\drivers\sample\")) { return(false); } //Если библиотека находится в другом проекте, то валидация не проходит if (libProjectPath.Contains(@"\solutions\") && !libProjectPath.Contains(@"\solutions\" + this.Solution.Name.ToLower() + @"\")) { return(false); } return(true); }