|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SevenZip;
using CBR.Core.Models;
using System.IO;
using CBR.Core.Helpers;
using System.Xml;
using System.Windows;
using System.Windows.Threading;
using System.Threading;
using System.Windows.Media.Imaging;
namespace CBR.Core.Services
{
public class ePUBBookService : BookServiceBase
{
override public object LoadBook(Book bk)
{
SevenZipExtractor temp = null;
try
{
base.LoadBook(bk);
temp = ZipHelper.Instance.GetExtractor(bk.FilePath);
bk.Size = temp.PackedSize / 1024 / 1024;
bk.PageCount = temp.ArchiveFileNames.Count;
string outputFolder = DirectoryHelper.CreateApplicationTemporary();
temp.ExtractArchive( outputFolder );
ePUB docPUB = new ePUBParser().ParseExtracted(bk.FilePath, outputFolder);
bk.Tag = docPUB;
}
catch (Exception err)
{
ExceptionHelper.Manage("BookService:LoadBook", err);
}
finally
{
ZipHelper.Instance.ReleaseExtractor(temp);
}
return null; //bk.Pages[0];
}
override internal void LoadCoverThread(object param)
{
Book bk = param as Book;
try
{
// all ready unzipped ?
if (bk != null && bk.Tag != null)
{
ePUB docPUB = bk.Tag as ePUB;
string coverFile = docPUB.GetCoverFile();
Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate
{
BitmapImage myImage = new BitmapImage();
myImage.BeginInit();
myImage.UriSource = new Uri(coverFile);
myImage.CacheOption = BitmapCacheOption.OnLoad;
myImage.DecodePixelWidth = 70;
myImage.EndInit();
bk.Cover = myImage;
});
}
else
{
ePUB docPUB = new ePUBParser().ParseFile(bk.FilePath);
string coverFile = docPUB.GetCoverFile();
SevenZipExtractor temp = null;
try
{
temp = ZipHelper.Instance.GetExtractor(bk.FilePath);
bk.Size = temp.PackedSize / 1024 / 1024;
ArchiveFileInfo fil = temp.ArchiveFileData.Where(p => !p.IsDirectory && p.FileName == coverFile).First();
using (MemoryStream stream = new MemoryStream())
{
temp.ExtractFile(fil.FileName, stream);
using (MemoryStream stream2 = new MemoryStream())
{
stream.WriteTo(stream2);
stream.Flush();
stream.Close();
stream2.Position = 0;
Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate
{
BitmapImage myImage = new BitmapImage();
myImage.BeginInit();
myImage.StreamSource = stream2;
myImage.CacheOption = BitmapCacheOption.OnLoad;
myImage.DecodePixelWidth = 70;
myImage.EndInit();
bk.Cover = myImage;
});
stream2.Flush();
stream2.Close();
}
}
}
catch (Exception err)
{
ExceptionHelper.Manage("BookService:LoadCoverThread", err);
}
finally
{
ZipHelper.Instance.ReleaseExtractor(temp);
}
}
}
catch (Exception err)
{
ExceptionHelper.Manage("BookService:LoadCoverThread", err);
}
finally
{
}
}
override public void UnloadBook(Book bk)
{
base.UnloadBook(bk);
if (bk != null && bk.Tag != null)
{
ePUB docPUB = bk.Tag as ePUB;
if( !string.IsNullOrEmpty(docPUB.ContentFolder))
Directory.Delete(docPUB.ContentFolder, true);
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
WPF and MVVM fan, I practice C # in all its forms from the beginning of the NET Framework without mentioning C ++ / MFC and other software packages such as databases, ASP, WCF, Web & Windows services, Application, and now Core and UWP.
In my wasted hours, I am guilty of having fathered C.B.R. and its cousins C.B.R. for WinRT and UWP on the Windows store.
But apart from that, I am a great handyman ... the house, a rocket stove to heat the jacuzzi and the last one: a wood oven for pizza, bread, and everything that goes inside
https://guillaumewaser.wordpress.com/
https://fouretcompagnie.wordpress.com/