// @return value: whether new or updated addins found.
        ResolutionResult ParseAndUpdateAddin(ScanFilePack filePack)
        {
            var scanFilePackResult = new ScanFilePackResult();

            scanFilePackResult.AddScanFilePack(filePack);
            var proxy = new AddinResolverProxy();

            return(proxy.Resolve(_addinFramework.NameConvention, _addinFramework.FileSettings, _addinFramework.AssemblyLoadPolicy, _addinStorage, _addinRelationManager, scanFilePackResult));
        }
 internal abstract bool TryParse(/*ILogger logger, */ ScanFilePack scanFilePack, out AddinManifest addinManifest);
        internal override bool TryParse(/*ILogger logger, */ ScanFilePack scanFilePack, out AddinManifest addinManifest)
        {
            addinManifest = null;
            if (!ShouldParse(scanFilePack.ManifestFile))
            {
                return(false);
            }

            var header = ReadHeader();

            var extensionSchema = ReadExtensionSchema();
            var extensions      = ReadExtensions();

            //if (extensionSchema == null && extensions == null)
            //    return false;

            var manifest = new XmlAddinManifest
            {
                AddinHeader     = header,
                ExtensionSchema = extensionSchema,
                Extensions      = extensions,
                AddinActivator  = ReadAddinActivator(),
            };

            var addinDir         = Path.Combine(scanFilePack.AddinProbingDirectory, scanFilePack.AddinDirectory);
            var manifestFilePath = IoHelper.GetRelativePath(scanFilePack.ManifestFile, addinDir);
            var fi = IoHelper.GetFileInfo(scanFilePack.ManifestFile);

            manifest.ManifestFile = new ManifestFileXml
            {
                Directory     = addinDir,
                FilePath      = manifestFilePath,
                LastWriteTime = fi.LastWriteTime,
                FileLength    = fi.Length,
                FileHash      = IoHelper.GetFileHash(scanFilePack.ManifestFile),
            };

            // if the manifest file does not contains a Files node, then use the ScanFilePack
            List <AssemblyFileXml> assemblyFiles;
            List <DataFileXml>     dataFiles;

            if (!TryReadFiles(addinDir, out assemblyFiles, out dataFiles))
            {
                if (scanFilePack.AssemblyFiles != null)
                {
                    assemblyFiles = new List <AssemblyFileXml>();
                    foreach (var assemblyFile in scanFilePack.AssemblyFiles)
                    {
                        var asmFile = new AssemblyFileXml
                        {
                            FilePath      = IoHelper.GetRelativePath(assemblyFile, addinDir),
                            LastWriteTime = IoHelper.GetLastWriteTime(assemblyFile)
                        };
                        assemblyFiles.Add(asmFile);
                    }
                }

                if (scanFilePack.DataFiles != null)
                {
                    dataFiles = new List <DataFileXml>();
                    foreach (var dataFile in scanFilePack.DataFiles)
                    {
                        var dtFile = new DataFileXml {
                            FilePath = IoHelper.GetRelativePath(dataFile, addinDir)
                        };
                        dataFiles.Add(dtFile);
                    }
                }
            }

            manifest.AssemblyFiles = assemblyFiles;
            manifest.DataFiles     = dataFiles;

            addinManifest = manifest;
            return(true);
        }