public static ArchiveFileAbstraction Create(string fileName, string entryName, int index)
        {
            var fileAbstraction = new ArchiveFileAbstraction(fileName, entryName, index);

            fileAbstraction.Open();
            return(fileAbstraction);
        }
Example #2
0
        protected virtual async Task Create(IntPtr archive, string path, List <T> items)
        {
            var count          = default(int);
            var metaDataSource = this.MetaDataSourceFactory.Create();

            if (Archive.GetEntryCount(archive, out count))
            {
                for (var a = 0; a < count; a++)
                {
                    var entry = default(Archive.ArchiveEntry);
                    if (Archive.GetEntry(archive, out entry, a))
                    {
                        if (!this.Output.IsSupported(entry.path))
                        {
                            continue;
                        }
                        var fileName = ArchiveUtils.CreateUrl(path, entry.path);
                        var item     = new T()
                        {
                            //An archive is a virtual directory I suppose? Not sure if this will cause any problems.
                            DirectoryName = path,
                            FileName      = fileName
                        };
                        if (this.MetaData.Value)
                        {
                            try
                            {
retry:
                                using (var fileAbstraction = ArchiveFileAbstraction.Create(path, entry.path, a))
                                {
                                    if (fileAbstraction.IsOpen)
                                    {
                                        item.MetaDatas = (
                                            await metaDataSource.GetMetaData(fileAbstraction).ConfigureAwait(false)
                                            ).ToList();
                                        switch (fileAbstraction.Result)
                                        {
                                        case ArchiveEntry.RESULT_PASSWORD_REQUIRED:
                                            Logger.Write(this, LogLevel.Warn, "Invalid password for \"{0}\".", path);
                                            if (this.PasswordBehaviour != null && !this.PasswordBehaviour.WasCancelled(path))
                                            {
                                                this.PasswordBehaviour.Reset(path);
                                                goto retry;
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Logger.Write(this, LogLevel.Debug, "Failed to read meta data from file \"{0}\": {1}", path, e.Message);
                            }
                        }
                        this.EnsureMetaData(a, entry, item);
                        items.Add(item);
                    }
                    else
                    {
                        //TODO: Warn.
                    }
                }
            }
            else
            {
                //TODO: Warn.
            }
        }