private static void ProcessError(ValidationBehavior validationBehavior, string errorMessage, ValidationResults log)
        {
            ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;;

            switch (validationBehavior)
            {
            case ValidationBehavior.Enforce:
                // throw an exception
                log.AddResult(new ValidationResult(true, errorMessage));
                throw new InvalidPackageException(errorMessage);

            case ValidationBehavior.LogError:
                // log an error
                log.AddResult(new ValidationResult(true, errorMessage));
                break;

            case ValidationBehavior.LogWarning:
                // log a warning
                log.AddResult(new ValidationResult(false, errorMessage));
                break;

            case ValidationBehavior.None:
                // do nothing
                break;
            }
        }
        private static void CheckPackageFiles(ReadOnlyCollection <string> packageFilePaths,
                                              Dictionary <string, bool> manifestFilePaths, ValidationResults log,
                                              PackageValidatorSettings packageValidatorSettings)
        {
            ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;;

            // Check all of the files in the package to make sure they are referenced in the manifest.
            foreach (string filePath in packageFilePaths)
            {
                string fileExtension = Path.GetExtension(filePath);
                if (filePath != "imsmanifest.xml" &&
                    string.Compare(fileExtension, ".xsd", StringComparison.OrdinalIgnoreCase) != 0 &&
                    string.Compare(fileExtension, ".dtd", StringComparison.OrdinalIgnoreCase) != 0 &&
                    !manifestFilePaths.ContainsKey(filePath))
                {
                    ProcessError(packageValidatorSettings.ScormRecommendationValidation,
                                 string.Format(CultureInfo.CurrentCulture,
                                               ValidatorResources.OrphanedFile, filePath), log);
                }
            }
        }
        private static void CheckManifestFiles(ReadOnlyCollection <string> packageFilePaths,
                                               Dictionary <string, bool> manifestFilePaths, ValidationResults log,
                                               PackageValidatorSettings packageValidatorSettings)
        {
            ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;;

            // Check all of the files in the manifest to make sure they are referenced in the package.
            Dictionary <string, bool> packageFileDictionary = new Dictionary <string, bool>(StringComparer.OrdinalIgnoreCase);

            foreach (string filePath in packageFilePaths)
            {
                packageFileDictionary.Add(filePath, true);
            }

            foreach (string filePath in manifestFilePaths.Keys)
            {
                if (!packageFileDictionary.ContainsKey(filePath))
                {
                    ProcessError(packageValidatorSettings.ScormRequirementValidation,
                                 string.Format(CultureInfo.CurrentCulture,
                                               ValidatorResources.FileMissing, filePath), log);
                }
            }
        }
        internal static void Validate(PackageValidatorSettings packageValidatorSettings,
                                      PackageReader packageReader,
                                      bool logReplacement,
                                      ValidationResults log,
                                      ManifestReaderSettings manifestSettings,
                                      bool fixLrmViolations,
                                      out ManifestReader manifestReader)
        {
            ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;;

            if (packageReader == null)
            {
                throw new ArgumentNullException("packageReader");
            }

            ValidationResults manifestLog;
            XPathNavigator    manifest;

            packageReader.CreateManifestNavigator(packageValidatorSettings.LrmRequirementValidation, fixLrmViolations, out manifestLog, out manifest);

            if (manifestLog != null)
            {
                foreach (ValidationResult result in manifestLog.Results)
                {
                    log.AddResult(result);
                }
            }

            manifestReader = new ManifestReader(packageReader, manifestSettings, packageValidatorSettings, logReplacement, log, manifest);

            if (packageValidatorSettings.MlcRequirementValidation != ValidationBehavior.None)
            {
                int activityCount = 0;
                if (manifestReader.Organizations.Count > 0)
                {
                    foreach (OrganizationNodeReader nodeReader in manifestReader.Organizations)
                    {
                        activityCount += nodeReader.Activities.Count;
                    }
                    if (activityCount == 0)
                    {
                        ProcessError(packageValidatorSettings.MlcRequirementValidation,
                                     ValidatorResources.MlcViolationActivityMissing,
                                     log);
                    }
                }
                else
                {
                    ProcessError(packageValidatorSettings.MlcRequirementValidation,
                                 ValidatorResources.MlcViolationOrganizationMissing,
                                 log);
                }
            }
            ManifestValidator.Validate(manifestReader);

            // Add all files in the manifest to a Dictionary
            Dictionary <string, bool> manifestFilePaths = new Dictionary <string, bool>(StringComparer.OrdinalIgnoreCase);

            foreach (ResourceNodeReader r in manifestReader.Resources.Values)
            {
                foreach (FileNodeReader fileNode in r.Files)
                {
                    if (!fileNode.Location.IsAbsoluteUri)
                    {
                        // get the path component of the Location property, and URL decode the string
                        // so it is a proper file path.
                        string path = System.Web.HttpUtility.UrlDecode(RemoveQueryAndAnchor(fileNode.Location.OriginalString));
                        if (!manifestFilePaths.ContainsKey(path))
                        {
                            manifestFilePaths.Add(path, true);
                        }
                    }
                }
            }

            ReadOnlyCollection <string> packageFilePaths = packageReader.GetFilePaths();

            CheckManifestFiles(packageFilePaths, manifestFilePaths, log, packageValidatorSettings);
            CheckPackageFiles(packageFilePaths, manifestFilePaths, log, packageValidatorSettings);
        }