internal XmlImportFileEntry(ImportFileEntry fileEntry)
        {
            if (fileEntry == null)
            {
                throw new ArgumentNullException("fileEntry");
            }

            selected = fileEntry.Selected;
            status = fileEntry.Status;
            displayText = fileEntry.DisplayText;
            uri = fileEntry.Uri;
        }
Beispiel #2
0
        private void ProcessDirectory(IFileObject directory, bool includeSubDirs)
        {
            IFileObject[] files = directory.findFiles(Selectors.SELECT_CHILDREN);
            if (files == null)
            {
                return;
            }

            foreach (IFileObject file in files)
            {
                if (this.excludeList.ContainsKey(file.Name.URI))
                {
                    continue;
                }

                if (file.Type == FileType.FILE)
                {
                    IFileName name = file.Name;
                    string extension = name.Extension;

                    switch (extension)
                    {
                        case "fb2":
                            ImportFileEntry entry = new ImportFileEntry(chkSelectFoundFiles.Checked, name.BaseName, name.URI);
                            entry.Status = ImportStatus.ReadyToProcess;

                            if (entry.Selected)
                            {
                                this.processLegend.IncrementCounter(ImportStatus.ReadyToProcess);
                                this.grdLegend.RefreshDataSource();
                            }

                            this.fileEntries.Add(entry);
                            this.excludeList.Add(file.Name.URI, entry);
                            break;

                        case "zip":
                            String url = "zip:" + name.URI + "!/";

                            //string filename = Path.ChangeExtension(name.BaseName, null);
                            //if(String.Compare(Path.GetExtension(filename), ".fb2", true) == 0)
                            //{
                            //    if (this.excludeList.ContainsKey(url + filename))
                            //    {
                            //        continue;
                            //    }

                            //    entry = new ImportFileEntry(chkSelectFoundFiles.Checked, filename, url + filename);
                            //    entry.Status = ImportStatus.ReadyToProcess;

                            //    if (entry.Selected)
                            //    {
                            //        this.processLegend.IncrementCounter(ImportStatus.ReadyToProcess);
                            //        this.grdLegend.RefreshDataSource();
                            //    }

                            //    this.fileEntries.Add(entry);
                            //    this.excludeList.Add(entry.Uri, entry);
                            //    break;

                            //}

                            IFileObject zipFile = manager.resolveFile(url);
                            ProcessDirectory(zipFile, true);
                            break;

                        case "7z":
                            IFileObject sevenZipFile = manager.resolveFile("sevenzip:" + name.URI + "!/");
                            ProcessDirectory(sevenZipFile, true);
                            break;

                        case "rar":
                            IFileObject rarFile = manager.resolveFile("rar:" + name.URI + "!/");
                            ProcessDirectory(rarFile, true);
                            break;
                    }
                }
                else if (file.Type == FileType.FOLDER && includeSubDirs)
                {
                    ProcessDirectory(file, true);
                }
            }
        }
Beispiel #3
0
        private void Process(ImportFileEntry entry)
        {
            Fb2DocumentEntry documentEntry = null;

            try
            {
                IFileObject fileObject = manager.resolveFile(entry.Uri);

                documentEntry = new Fb2DocumentEntry();
                documentEntry.OriginalFileName = entry.DisplayText;
                documentEntry.Filename = entry.Uri;
                documentEntry.FileDate = new DateTime(fileObject.Content.LastModifiedTime);
                documentEntry.FileSize = fileObject.Content.Size;

                try
                {
                    try
                    {
                        processLog.Add(documentEntry);

                        using (Stream stream = fileObject.Content.InputStream)
                        {
                            try
                            {
                                if (stream.CanSeek)
                                {
                                    documentEntry.Status = ProcessDocument(documentEntry, stream);
                                }
                                else
                                {
                                    using (MemoryStream memoryStream = new MemoryStream((int)documentEntry.FileSize))
                                    {
                                        byte[] buffer = bufferPool.Aquire();

                                        try
                                        {
                                            StreamUtils.Copy(stream, memoryStream, buffer);
                                        }
                                        finally
                                        {
                                            bufferPool.Release(buffer);
                                        }

                                        memoryStream.Seek(0, SeekOrigin.Begin);

                                        documentEntry.Status = ProcessDocument(documentEntry, stream);
                                    }
                                }

                            }
                            finally
                            {
                                stream.Close();
                            }
                        }

                        entry.Status = documentEntry.Status;
                    }
                    catch (Exception exp)
                    {
                        Logger.WriteError(exp.Message);
                        Logger.WriteLine(TraceEventType.Verbose, exp);

                        documentEntry.Status = ImportStatus.ParsingError;
                        documentEntry.ErrorText = exp.Message;

                        entry.Status = ImportStatus.ParsingError;

                        this.processLegend.IncrementCounter(ImportStatus.ParsingError);
                    }
                }
                finally
                {
                    manager.closeFileSystem(fileObject.FileSystem);
                }

                this.grdResult.RefreshDataSource();

                switch (documentEntry.Status)
                {
                    case ImportStatus.Added:
                    case ImportStatus.FilteredOut:
                    case ImportStatus.Updated:
                    case ImportStatus.Duplicate:
                        entry.Selected = false;
                        this.processLegend.DecrementCounter(ImportStatus.ReadyToProcess);
                        break;
                }
            }
            catch (FileSystemException exp)
            {
                Logger.WriteError(exp.Message);
                Logger.WriteLine(TraceEventType.Verbose, exp);

                if (documentEntry != null)
                {
                    documentEntry.Status = ImportStatus.ArchiveError;
                    documentEntry.ErrorText = exp.Message;
                }

                entry.Status = ImportStatus.ArchiveError;

                this.processLegend.IncrementCounter(ImportStatus.ArchiveError);
            }

            this.grdSelectedFiles.RefreshDataSource();
            this.grdLegend.RefreshDataSource();

            Application.DoEvents();
        }