/// <summary>
        ///   Creates <c>ProjectInfo</c> for project provided.
        /// </summary>
        /// <param name="project">
        ///   Project examined.
        /// </param>
        /// <param name="projectTypeInfo">
        ///   Project type info for the project.
        /// </param>
        /// <returns>
        ///   <c>ProjectInfo</c> for the project provided.
        /// </returns>
        private ProjectInfo GetProjectInfo(Project project, string parentUiPath, ProjectTypeInfo projectTypeInfo, int level)
        {
            if (!projectTypeInfo.IsVersionable)
            {
                return(new ProjectInfo(project.Name, project.FullName, AppendBranchToPath(parentUiPath, project.Name), projectTypeInfo, level));
            }
            // array of version streams that will be provided to ProjectInfo constructor
            ArrayList versionStreams = new ArrayList();
            // AssemblyVersions used to find the largest one
            AssemblyVersions assemblyVersions = AssemblyVersions.Empty;

            // for a VC++ project search for resource file (which may contain version) if configured so
            if (projectTypeInfo == ProjectTypeInfo.VCppProject && m_numberingOptions.IncludeVCppResourceFiles)
            {
                string[] resourceFilenames = GetProjectVersionFile(project, "*.rc");
                // if VC++ project contains both AssemblyInfo file and resource
                // file with version, compare them and get the larger value
                foreach (string resourceFilename in resourceFilenames)
                {
                    VersionStream    resourceFileStream = new ResourceFileStream(resourceFilename);
                    AssemblyVersions resourceVersion    = resourceFileStream.GetVersions();
                    versionStreams.Add(resourceFileStream);
                    assemblyVersions = AssemblyVersions.Max(assemblyVersions, resourceVersion);
                }
            }
            string[] assemblyInfoFilenames = GetProjectVersionFile(project, projectTypeInfo.AssemblyInfoFilename);
            Debug.Assert(assemblyInfoFilenames.Length <= 1);
            if (assemblyInfoFilenames.Length > 0)
            {
                VersionStream    assemblyInfoStream   = new AssemblyInfoStream(assemblyInfoFilenames[0]);
                AssemblyVersions assemblyInfoVersions = assemblyInfoStream.GetVersions();
                versionStreams.Add(assemblyInfoStream);
                if (assemblyVersions == AssemblyVersions.Empty)
                {
                    assemblyVersions = assemblyInfoVersions;
                }
                else
                {
                    assemblyVersions = AssemblyVersions.Max(assemblyVersions, assemblyInfoVersions);
                }
            }
            VersionStream[] vs = (VersionStream[])versionStreams.ToArray(typeof(VersionStream));
            bool            isProjectModified = IsProjectModified(project, vs);

            return(new ProjectInfo(project.Name, project.FullName, AppendBranchToPath(parentUiPath, project.Name), projectTypeInfo, isProjectModified, level, assemblyVersions, vs));
        }
 /// <summary>
 ///   Creates a <c>ProjectInfoList</c> containing <c>ProjectInfo</c>
 ///   objects that have passed the filter provided.
 /// </summary>
 /// <param name="projectInfos">
 ///   An array of all <c>ProjectInfo</c> objects.
 /// </param>
 /// <param name="filter">
 ///   A filter used to select <c>ProjectInfo</c> objects.
 /// </param>
 /// <param name="newVersionProvider">
 ///   <c>NewVersionProvider</c> object responsible to propose a new
 ///   version for each <c>ProjectInfo</c> object.
 /// </param>
 /// <param name="assemblyVersionsUpdateMask">
 ///   Mask defining which versions (AssemblyInfo, Informational or
 ///   Product) may be updated.
 /// </param>
 public ProjectInfoList(ProjectInfo[] projectInfos, IProjectFilter filter, NewVersionProvider newVersionProvider, AssemblyVersionType assemblyVersionsUpdateMask)
 {
     m_projectInfos = new ArrayList(projectInfos.Length);
     m_highestToBeAssemblyVersions    = AssemblyVersions.MinValue;
     m_highestProposedAssemblyVersion = AssemblyVersions.MinValue;
     foreach (ProjectInfo projectInfo in projectInfos)
     {
         if (filter.Pass(projectInfo))
         {
             ProjectInfo pi = projectInfo;
             pi.SetToBecomeVersion(newVersionProvider);
             if (pi.Modified)
             {
                 pi.MarkAssemblyVersionsForUpdate(assemblyVersionsUpdateMask);
             }
             m_projectInfos.Add(pi);
             m_highestToBeAssemblyVersions    = AssemblyVersions.Max(m_highestToBeAssemblyVersions, pi);
             m_highestProposedAssemblyVersion = AssemblyVersions.MaxProposed(m_highestProposedAssemblyVersion, pi);
         }
     }
 }