Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }