123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Globalization;
- #if !WINCE
- using System.Runtime.Remoting.Messaging;
- #endif
- #if DOTNET20
- using System.Threading;
- #else
- using System.Windows.Threading;
- #endif
- #if MONO
- using SevenZip.Mono.COM;
- #endif
- namespace SevenZip
- {
- #if UNMANAGED
-
-
-
- public enum EventSynchronizationStrategy
- {
-
-
-
- Default,
-
-
-
- AlwaysAsynchronous,
-
-
-
- AlwaysSynchronous
- }
-
-
-
- public class SevenZipBase : MarshalByRefObject
- {
- private readonly string _password;
- private readonly bool _reportErrors;
- private readonly int _uniqueID;
- private static readonly List<int> Identificators = new List<int>();
- #if !WINCE
- internal static readonly AsyncCallback AsyncCallbackImplementation = AsyncCallbackMethod;
-
-
-
- protected internal bool NeedsToBeRecreated;
-
-
-
-
- internal static void AsyncCallbackMethod(IAsyncResult ar)
- {
- var result = (AsyncResult) ar;
- result.AsyncDelegate.GetType().GetMethod("EndInvoke").Invoke(result.AsyncDelegate, new[] { ar });
- ((SevenZipBase)ar.AsyncState).ReleaseContext();
- }
- virtual internal void SaveContext(
- #if !DOTNET20
- DispatcherPriority priority = DispatcherPriority.Normal
- #endif
- )
- {
- #if !DOTNET20
- Dispatcher = Dispatcher.CurrentDispatcher;
- Priority = priority;
- #else
- Context = SynchronizationContext.Current;
- #endif
- NeedsToBeRecreated = true;
- }
- internal void ReleaseContext()
- {
- #if !DOTNET20
- Dispatcher = null;
- #else
- Context = null;
- #endif
- NeedsToBeRecreated = true;
- }
- private delegate void EventHandlerDelegate<T>(EventHandler<T> handler, T e) where T : EventArgs;
- internal void OnEvent<T>(EventHandler<T> handler, T e, bool synchronous) where T: EventArgs
- {
- try
- {
- if (handler != null)
- {
- switch (EventSynchronization)
- {
- case EventSynchronizationStrategy.AlwaysAsynchronous:
- synchronous = false;
- break;
- case EventSynchronizationStrategy.AlwaysSynchronous:
- synchronous = true;
- break;
- }
- if (
- #if !DOTNET20
- Dispatcher == null
- #else
- Context == null
- #endif
- )
- {
-
- handler(this, e);
- }
- else
- {
- #if !DOTNET20
- var eventHandlerDelegate = new EventHandlerDelegate<T>((h, ee) => h(this, ee));
- if (synchronous)
- {
-
- Dispatcher.Invoke(eventHandlerDelegate, Priority, handler, e);
- }
- else
- {
- Dispatcher.BeginInvoke(eventHandlerDelegate, Priority, handler, e);
- }
- #else
- var callback = new SendOrPostCallback((obj) =>
- {
- var array = (object[])obj;
- ((EventHandler<T>)array[0])(array[1], (T)array[2]);
- });
- if (synchronous)
- {
-
- this.Context.Send(callback, new object[] { handler, this, e });
- }
- else
- {
- this.Context.Post(callback, new object[] { handler, this, e });
- }
- #endif
- }
- }
- }
- catch (Exception ex)
- {
- AddException(ex);
- }
- }
- #if !DOTNET20
-
-
-
-
- internal Dispatcher Dispatcher { get; set; }
-
-
-
- internal DispatcherPriority Priority { get; set; }
- #else
- internal SynchronizationContext Context { get; set; }
- #endif
-
-
-
- public EventSynchronizationStrategy EventSynchronization { get; set; }
- #else // WINCE
- internal void OnEvent<T>(EventHandler<T> handler, T e, bool synchronous) where T : System.EventArgs
- {
- try
- {
- handler(this, e);
- }
- catch (Exception ex)
- {
- AddException(ex);
- }
- }
- #endif
-
-
-
- public int UniqueID
- {
- get
- {
- return _uniqueID;
- }
- }
-
-
-
- private readonly List<Exception> _exceptions = new List<Exception>();
- private static int GetUniqueID()
- {
- int id;
- var rnd = new Random(DateTime.Now.Millisecond);
- do
- {
- id = rnd.Next(Int32.MaxValue);
- }
- while (Identificators.Contains(id));
- Identificators.Add(id);
- return id;
- }
- #region Constructors
-
-
-
- protected SevenZipBase()
- {
- _password = "";
- _reportErrors = true;
- _uniqueID = GetUniqueID();
- }
-
-
-
-
- protected SevenZipBase(string password)
- {
- if (String.IsNullOrEmpty(password))
- {
- throw new SevenZipException("Empty password was specified.");
- }
- _password = password;
- _reportErrors = true;
- _uniqueID = GetUniqueID();
- }
- #endregion
-
-
-
- ~SevenZipBase()
- {
- Identificators.Remove(_uniqueID);
- }
-
-
-
- public string Password
- {
- get
- {
- return _password;
- }
- }
-
-
-
- internal bool ReportErrors
- {
- get
- {
- return _reportErrors;
- }
- }
-
-
-
- internal ReadOnlyCollection<Exception> Exceptions
- {
- get
- {
- return new ReadOnlyCollection<Exception>(_exceptions);
- }
- }
- internal void AddException(Exception e)
- {
- _exceptions.Add(e);
- }
- internal void ClearExceptions()
- {
- _exceptions.Clear();
- }
- internal bool HasExceptions
- {
- get
- {
- return _exceptions.Count > 0;
- }
- }
-
-
-
-
-
- internal bool ThrowException(CallbackBase handler, params Exception[] e)
- {
- if (_reportErrors && (handler == null || !handler.Canceled))
- {
- throw e[0];
- }
- return false;
- }
- internal void ThrowUserException()
- {
- if (HasExceptions)
- {
- throw new SevenZipException(SevenZipException.USER_EXCEPTION_MESSAGE);
- }
- }
-
-
-
-
-
-
- internal void CheckedExecute(int hresult, string message, CallbackBase handler)
- {
- if (hresult != (int) OperationResult.Ok || handler.HasExceptions)
- {
- if (!handler.HasExceptions)
- {
- if (hresult < -2000000000)
- {
- ThrowException(handler,
- new SevenZipException(
- "执行已经在SevenZipSharp失败,原因是该bug.\n" +
- "关于它请举报 http://sevenzipsharp.codeplex.com/WorkItem/List.aspx, 发布版本号并附加档案."));
- }
- else
- {
- ThrowException(handler,
- new SevenZipException(message + hresult.ToString(CultureInfo.InvariantCulture) +
- '.'));
- }
- }
- else
- {
- ThrowException(handler, handler.Exceptions[0]);
- }
- }
- }
- #if !WINCE && !MONO
-
-
-
-
- public static void SetLibraryPath(string libraryPath)
- {
- SevenZipLibraryManager.SetLibraryPath(libraryPath);
- }
- #endif
-
-
-
- [CLSCompliant(false)]
- public static LibraryFeature CurrentLibraryFeatures
- {
- get
- {
- return SevenZipLibraryManager.CurrentLibraryFeatures;
- }
- }
-
-
-
-
-
- public override bool Equals(object obj)
- {
- var inst = obj as SevenZipBase;
- if (inst == null)
- {
- return false;
- }
- return _uniqueID == inst._uniqueID;
- }
-
-
-
-
- public override int GetHashCode()
- {
- return _uniqueID;
- }
-
-
-
-
- public override string ToString()
- {
- var type = "SevenZipBase";
- if (this is SevenZipExtractor)
- {
- type = "SevenZipExtractor";
- }
- if (this is SevenZipCompressor)
- {
- type = "SevenZipCompressor";
- }
- return string.Format("{0} [{1}]", type, _uniqueID);
- }
- }
- internal class CallbackBase : MarshalByRefObject
- {
- private readonly string _password;
- private readonly bool _reportErrors;
-
-
-
- private readonly List<Exception> _exceptions = new List<Exception>();
- #region Constructors
-
-
-
- protected CallbackBase()
- {
- _password = "";
- _reportErrors = true;
- }
-
-
-
-
- protected CallbackBase(string password)
- {
- if (String.IsNullOrEmpty(password))
- {
- throw new SevenZipException("Empty password was specified.");
- }
- _password = password;
- _reportErrors = true;
- }
- #endregion
-
-
-
- public string Password
- {
- get
- {
- return _password;
- }
- }
-
-
-
- public bool Canceled { get; set; }
-
-
-
- public bool ReportErrors
- {
- get
- {
- return _reportErrors;
- }
- }
-
-
-
- public ReadOnlyCollection<Exception> Exceptions
- {
- get
- {
- return new ReadOnlyCollection<Exception>(_exceptions);
- }
- }
- public void AddException(Exception e)
- {
- _exceptions.Add(e);
- }
- public void ClearExceptions()
- {
- _exceptions.Clear();
- }
- public bool HasExceptions
- {
- get
- {
- return _exceptions.Count > 0;
- }
- }
-
-
-
-
-
- public bool ThrowException(CallbackBase handler, params Exception[] e)
- {
- if (_reportErrors && (handler == null || !handler.Canceled))
- {
- throw e[0];
- }
- return false;
- }
-
-
-
-
- public bool ThrowException()
- {
- if (HasExceptions && _reportErrors)
- {
- throw _exceptions[0];
- }
- return true;
- }
- public void ThrowUserException()
- {
- if (HasExceptions)
- {
- throw new SevenZipException(SevenZipException.USER_EXCEPTION_MESSAGE);
- }
- }
- }
-
-
-
- public struct ArchiveFileInfo
- {
-
-
-
- [CLSCompliant(false)]
- public int Index { get; set; }
-
-
-
- public string FileName { get; set; }
-
-
-
- public DateTime LastWriteTime { get; set; }
-
-
-
- public DateTime CreationTime { get; set; }
-
-
-
- public DateTime LastAccessTime { get; set; }
-
-
-
- [CLSCompliant(false)]
- public ulong Size { get; set; }
-
-
-
- [CLSCompliant(false)]
- public uint Crc { get; set; }
-
-
-
- [CLSCompliant(false)]
- public uint Attributes { get; set; }
-
-
-
- public bool IsDirectory { get; set; }
-
-
-
- public bool Encrypted { get; set; }
-
-
-
- public string Comment { get; set; }
-
-
-
-
-
- public override bool Equals(object obj)
- {
- return (obj is ArchiveFileInfo) ? Equals((ArchiveFileInfo) obj) : false;
- }
-
-
-
-
-
- public bool Equals(ArchiveFileInfo afi)
- {
- return afi.Index == Index && afi.FileName == FileName;
- }
-
-
-
-
- public override int GetHashCode()
- {
- return FileName.GetHashCode() ^ Index;
- }
-
-
-
-
- public override string ToString()
- {
- return "[" + Index.ToString(CultureInfo.CurrentCulture) + "] " + FileName;
- }
-
-
-
-
-
-
- public static bool operator ==(ArchiveFileInfo afi1, ArchiveFileInfo afi2)
- {
- return afi1.Equals(afi2);
- }
-
-
-
-
-
-
- public static bool operator !=(ArchiveFileInfo afi1, ArchiveFileInfo afi2)
- {
- return !afi1.Equals(afi2);
- }
- }
-
-
-
- public struct ArchiveProperty
- {
-
-
-
- public string Name { get; internal set; }
-
-
-
- public object Value { get; internal set; }
-
-
-
-
-
- public override bool Equals(object obj)
- {
- return (obj is ArchiveProperty) ? Equals((ArchiveProperty) obj) : false;
- }
-
-
-
-
-
- public bool Equals(ArchiveProperty afi)
- {
- return afi.Name == Name && afi.Value == Value;
- }
-
-
-
-
- public override int GetHashCode()
- {
- return Name.GetHashCode() ^ Value.GetHashCode();
- }
-
-
-
-
- public override string ToString()
- {
- return Name + " = " + Value;
- }
-
-
-
-
-
-
- public static bool operator ==(ArchiveProperty afi1, ArchiveProperty afi2)
- {
- return afi1.Equals(afi2);
- }
-
-
-
-
-
-
- public static bool operator !=(ArchiveProperty afi1, ArchiveProperty afi2)
- {
- return !afi1.Equals(afi2);
- }
- }
- #if COMPRESS
-
-
-
- public enum CompressionMode
- {
-
-
-
- Create,
-
-
-
- Append,
- }
- internal enum InternalCompressionMode
- {
-
-
-
- Create,
-
-
-
- Append,
-
-
-
- Modify
- }
-
-
-
- public enum ZipEncryptionMethod
- {
-
-
-
- ZipCrypto,
-
-
-
- Aes128,
-
-
-
- Aes192,
-
-
-
- Aes256
- }
-
-
-
- internal struct UpdateData
- {
- public uint FilesCount;
- public InternalCompressionMode Mode;
- public Dictionary<int, string> FileNamesToModify { get; set; }
- public List<ArchiveFileInfo> ArchiveFileData { get; set; }
- }
- #endif
- #endif
- }
|