public PackedPackage(FileInfo fileInfo)
        {
            // Generate temporary directory
            var tempDir = new DirectoryInfo(Path.GetTempPath()).CreateSubdirectory(Path.GetRandomFileName());

            // Extract the package
            if (!SevenZipArchive.IsSevenZipFile(fileInfo))
                throw new InvalidDataException("Not a valid 7-Zip archive. All Craftitude packages need to be packed in the 7-Zip format.");
            using (var szarch = SevenZipArchive.Open(fileInfo))
            {
                szarch.WriteToDirectory(tempDir.FullName);
            }

            // Create package instance of the freshly unpacked stuff
            Package = new Package(tempDir);
        }
 public IEnumerable<Package.Version> SearchPackageVersions(Package package, IEnumerable<Package.Version.Condition.VersionCondition> versionConditions)
 {
     var versions = package.Versions;
     foreach (var condition in versionConditions)
     {
         versions.RemoveAll(v =>
         {
             bool r;
             switch (condition.ConditionType)
             {
                 case Package.Version.Condition.VersionCondition.VersionConditionType.Equal:
                     r = v.ID == condition.Version;
                     break;
                 case Package.Version.Condition.VersionCondition.VersionConditionType.Newer:
                     r = versions.IndexOf(v) > versions.IndexOf(versions.Single(sv => sv.ID.Equals(condition.Version)));
                     break;
                 case Package.Version.Condition.VersionCondition.VersionConditionType.NewerOrEqual:
                     r = versions.IndexOf(v) >= versions.IndexOf(versions.Single(sv => sv.ID.Equals(condition.Version)));
                     break;
                 case Package.Version.Condition.VersionCondition.VersionConditionType.Not:
                     r = versions.IndexOf(v) != versions.IndexOf(versions.Single(sv => sv.ID.Equals(condition.Version)));
                     break;
                 case Package.Version.Condition.VersionCondition.VersionConditionType.Older:
                     r = versions.IndexOf(v) < versions.IndexOf(versions.Single(sv => sv.ID.Equals(condition.Version)));
                     break;
                 case Package.Version.Condition.VersionCondition.VersionConditionType.OlderOrEqual:
                     r = versions.IndexOf(v) <= versions.IndexOf(versions.Single(sv => sv.ID.Equals(condition.Version)));
                     break;
                 default: // regex
                     r = Regex.IsMatch(
                         v.ID,
                         Regex.Escape(condition.Version).Replace(@"\*", ".*").Replace(@"\?", ".") // 1.* => 1\..*
                     );
                     break;
             }
             return !r;
         });
     }
     return versions;
 }
 public IEnumerable<Package.Version> SearchPackageVersions(Package package, params Package.Version.Condition.VersionCondition[] versionConditions)
 {
     return this.SearchPackageVersions(package, versionConditions.AsEnumerable());
 }