Files
SWCompression/docs/index.html
T
2016-12-29 22:20:07 +03:00

324 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<title>SWCompression Reference</title>
<link rel="stylesheet" type="text/css" href="css/jazzy.css" />
<link rel="stylesheet" type="text/css" href="css/highlight.css" />
<meta charset="utf-8">
<script src="js/jquery.min.js" defer></script>
<script src="js/jazzy.js" defer></script>
</head>
<body>
<a title="SWCompression Reference"></a>
<header class="header">
<p class="header-col header-col--primary">
<a class="header-link" href="index.html">
SWCompression Docs
</a>
(100% documented)
</p>
<p class="header-col header-col--secondary">
<a class="header-link" href="https://github.com/tsolomko/SWCompression">
<img class="header-icon" src="img/gh.png"/>
View on GitHub
</a>
</p>
</header>
<p class="breadcrumbs">
<a class="breadcrumb" href="index.html">SWCompression Reference</a>
<img class="carat" src="img/carat.png" />
SWCompression Reference
</p>
<div class="content-wrapper">
<nav class="navigation">
<ul class="nav-groups">
<li class="nav-group-name">
<a class="nav-group-name-link" href="Classes.html">Classes</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a class="nav-group-task-link" href="Classes/BZip2.html">BZip2</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Classes/Deflate.html">Deflate</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Classes/GzipArchive.html">GzipArchive</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Classes/LZMA.html">LZMA</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Classes/LZMA2.html">LZMA2</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Classes/XZArchive.html">XZArchive</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Classes/ZlibArchive.html">ZlibArchive</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a class="nav-group-name-link" href="Enums.html">Enums</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a class="nav-group-task-link" href="Enums/BZip2Error.html">BZip2Error</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Enums/DeflateError.html">DeflateError</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Enums/GzipError.html">GzipError</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Enums/LZMA2Error.html">LZMA2Error</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Enums/LZMAError.html">LZMAError</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Enums/XZError.html">XZError</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Enums/ZlibError.html">ZlibError</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a class="nav-group-name-link" href="Protocols.html">Protocols</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a class="nav-group-task-link" href="Protocols/Archive.html">Archive</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Protocols/DecompressionAlgorithm.html">DecompressionAlgorithm</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a class="nav-group-name-link" href="Structs.html">Structs</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/GzipHeader.html">GzipHeader</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/GzipHeader/CompressionMethod.html"> CompressionMethod</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/GzipHeader/FileSystemType.html"> FileSystemType</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/ZlibHeader.html">ZlibHeader</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/ZlibHeader/CompressionMethod.html"> CompressionMethod</a>
</li>
<li class="nav-group-task">
<a class="nav-group-task-link" href="Structs/ZlibHeader/CompressionLevel.html"> CompressionLevel</a>
</li>
</ul>
</li>
</ul>
</nav>
<article class="main-content">
<section class="section">
<div class="section-content">
<a href='#swcompression' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h1 id='swcompression'>SWCompression</h1>
<p><a href="https://raw.githubusercontent.com/tsolomko/SWCompression/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-lightgrey.svg" alt="GitHub license"></a> <a href="https://cocoapods.org/pods/SWCompression"><img src="https://img.shields.io/cocoapods/p/SWCompression.svg" alt="CocoaPods"></a> <a href="https://developer.apple.com/swift/"><img src="https://img.shields.io/badge/Swift-3.0.2-lightgrey.svg" alt="Swift 3"></a>
<a href="https://travis-ci.org/tsolomko/SWCompression"><img src="https://travis-ci.org/tsolomko/SWCompression.svg?branch=develop" alt="Build Status"></a> <a href="https://codecov.io/gh/tsolomko/SWCompression"><img src="https://codecov.io/gh/tsolomko/SWCompression/branch/develop/graph/badge.svg" alt="codecov"></a></p>
<p><a href="https://cocoapods.org/pods/SWCompression"><img src="https://img.shields.io/cocoapods/v/SWCompression.svg" alt="CocoaPods"></a>
<a href="https://github.com/Carthage/Carthage"><img src="https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat" alt="Carthage compatible"></a></p>
<p>A framework which contains implementations of (de)compression algorithms.</p>
<p><strong>Developed with Swift.</strong></p>
<a href='#why-have-you-made-this-framework' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h2 id='why-have-you-made-this-framework'>Why have you made this framework?</h2>
<p>There are a couple of reasons for this.</p>
<p>The main reason is that it is very educational and somewhat fun.</p>
<p>Secondly, if you are a Swift developer and you want to compress/decompress something in your project
you have to use either wrapper around system libraries (which is probably written in Objective-C)
or you have to use built-in Compression framework.
You might think that last option is what you need, but, frankly
that framework has a bit complicated API and somewhat questionable choice of supported compression algorithms.
And yes, it is also in Objective-C.</p>
<p>And here comes SWCompression: no Objective-C, pure Swift.</p>
<a href='#features' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h2 id='features'>Features</h2>
<ul>
<li>(De)compression algorithms:
<ul>
<li>LZMA/LZMA2</li>
<li>Deflate</li>
<li>BZip2</li>
</ul></li>
<li>Archives:
<ul>
<li>XZ</li>
<li>GZip</li>
<li>Zlib</li>
</ul></li>
<li>Platform independent.</li>
<li><em>Swift only.</em></li>
</ul>
<p>By the way, it seems like GZip, Deflate and Zlib implementations are <strong>specification compliant</strong>.</p>
<a href='#installation' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h2 id='installation'>Installation</h2>
<p>SWCompression can be integrated into your project either using CocoaPods, Carthage or Swift Package Manager.</p>
<a href='#cocoapods' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h5 id='cocoapods'>CocoaPods</h5>
<p>Add to your Podfile <code>pod &#39;SWCompression&#39;</code>.</p>
<p>There are several sub-podspecs in case you need only parts of framework&rsquo;s functionality.
Available subspecs:</p>
<ul>
<li>SWCompression/LZMA</li>
<li>SWCompression/XZ</li>
<li>SWCompression/Deflate</li>
<li>SWCompression/Gzip</li>
<li>SWCompression/Zlib</li>
<li>SWCompression/BZip2</li>
</ul>
<p>You can add some or all of them instead of <code>pod &#39;SWCompression&#39;</code></p>
<p>Also, do not forget to include <code>use_frameworks!</code> line in your Podfile.</p>
<p>To complete installation, run <code>pod install</code>.</p>
<p><em>Note:</em> Actually, there is one more subspec (SWCompression/Common) but it does not contain any end-user functions. It is included in every other subspec and should not be specified directly in Podfile.</p>
<a href='#carthage' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h5 id='carthage'>Carthage</h5>
<p>Add to your Cartfile <code>github &quot;tsolomko/SWCompression&quot;</code>.</p>
<p>Then run <code>carthage update</code>.</p>
<p>Finally, drag and drop <code>SWCompression.framework</code> from <code>Carthage/Build</code> folder into the <q>Embedded Binaries</q> section on your targets&rsquo; <q>General</q> tab.</p>
<a href='#swift-package-manager' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h5 id='swift-package-manager'>Swift Package Manager</h5>
<p>Add to you package dependecies <code>.Package(url: &quot;https://github.com/tsolomko/SWCompression.git&quot;)</code>, for example like this:</p>
<pre class="highlight swift"><code><span class="kd">import</span> <span class="kt">PackageDescription</span>
<span class="k">let</span> <span class="nv">package</span> <span class="o">=</span> <span class="kt">Package</span><span class="p">(</span>
<span class="nv">name</span><span class="p">:</span> <span class="s">"PackageName"</span><span class="p">,</span>
<span class="nv">dependencies</span><span class="p">:</span> <span class="p">[</span>
<span class="o">.</span><span class="kt">Package</span><span class="p">(</span><span class="nv">url</span><span class="p">:</span> <span class="s">"https://github.com/tsolomko/SWCompression.git"</span><span class="p">,</span> <span class="nv">majorVersion</span><span class="p">:</span> <span class="mi">2</span><span class="p">)</span>
<span class="p">]</span>
<span class="p">)</span>
</code></pre>
<p>More info about SPM you can find at <a href="https://github.com/apple/swift-package-manager/tree/master/Documentation">Swift Package Manager&rsquo;s Documentation</a>.</p>
<a href='#usage' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h2 id='usage'>Usage</h2>
<a href='#basics' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h4 id='basics'>Basics</h4>
<p>If you&rsquo;d like to decompress <q>deflated</q> data just use:</p>
<pre class="highlight swift"><code><span class="k">let</span> <span class="nv">data</span> <span class="o">=</span> <span class="k">try!</span> <span class="kt">Data</span><span class="p">(</span><span class="nv">contentsOf</span><span class="p">:</span> <span class="kt">URL</span><span class="p">(</span><span class="nv">fileURLWithPath</span><span class="p">:</span> <span class="s">"path/to/file"</span><span class="p">),</span>
<span class="nv">options</span><span class="p">:</span> <span class="o">.</span><span class="n">mappedIfSafe</span><span class="p">)</span>
<span class="k">let</span> <span class="nv">decompressedData</span> <span class="o">=</span> <span class="k">try</span><span class="p">?</span> <span class="kt">Deflate</span><span class="o">.</span><span class="nf">decompress</span><span class="p">(</span><span class="nv">compressedData</span><span class="p">:</span> <span class="n">data</span><span class="p">)</span>
</code></pre>
<p><em>Note:</em> It is <strong>highly recommended</strong> to specify <code>Data.ReadingOptions.mappedIfSafe</code>,
especially if you are working with large files,
so you don&rsquo;t run out of system memory.</p>
<p>However, it is unlikely that you will encounter deflated data outside of any archive.
So, in case of GZip archive you should use:</p>
<pre class="highlight swift"><code><span class="k">let</span> <span class="nv">decompressedData</span> <span class="o">=</span> <span class="k">try</span><span class="p">?</span> <span class="kt">GzipArchive</span><span class="o">.</span><span class="nf">unarchive</span><span class="p">(</span><span class="nv">archiveData</span><span class="p">:</span> <span class="n">data</span><span class="p">)</span>
</code></pre>
<p>One final note: every unarchive/decompress function can throw an error and
you are responsible for handling them.</p>
<a href='#documentation' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h4 id='documentation'>Documentation</h4>
<p>Every function or class of public API of SWCompression is documented.
This documentation can be found at its own <a href="http://tsolomko.github.io/SWCompression">website</a>.</p>
<a href='#handling-errors' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h4 id='handling-errors'>Handling Errors</h4>
<p>If you look at list of available error types and their cases,
you may be frightened by their number.
However, most of these cases (such as <code>XZError.WrongMagic</code>) exist for diagnostic purposes.</p>
<p>Thus, you only need to handle the most common type of error for your archive/algorithm.
For example:</p>
<pre class="highlight swift"><code><span class="k">do</span> <span class="p">{</span>
<span class="k">let</span> <span class="nv">data</span> <span class="o">=</span> <span class="k">try</span> <span class="kt">Data</span><span class="p">(</span><span class="nv">contentsOf</span><span class="p">:</span> <span class="kt">URL</span><span class="p">(</span><span class="nv">fileURLWithPath</span><span class="p">:</span> <span class="s">"path/to/file"</span><span class="p">),</span>
<span class="nv">options</span><span class="p">:</span> <span class="o">.</span><span class="n">mappedIfSafe</span><span class="p">)</span>
<span class="k">let</span> <span class="nv">decompressedData</span> <span class="o">=</span> <span class="kt">XZArchive</span><span class="o">.</span><span class="nf">unarchive</span><span class="p">(</span><span class="nv">archiveData</span><span class="p">:</span> <span class="n">data</span><span class="p">)</span>
<span class="p">}</span> <span class="k">catch</span> <span class="k">let</span> <span class="nv">error</span> <span class="k">as</span> <span class="kt">XZError</span> <span class="p">{</span>
<span class="o">&lt;</span><span class="n">handle</span> <span class="kt">XZ</span> <span class="n">related</span> <span class="n">error</span> <span class="n">here</span><span class="o">&gt;</span>
<span class="p">}</span> <span class="k">catch</span> <span class="k">let</span> <span class="nv">error</span> <span class="p">{</span>
<span class="o">&lt;</span><span class="n">handle</span> <span class="n">all</span> <span class="n">other</span> <span class="n">errors</span> <span class="n">here</span><span class="o">&gt;</span>
<span class="p">}</span>
</code></pre>
<a href='#sophisticated-example' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h4 id='sophisticated-example'>Sophisticated example</h4>
<p>There is a small program, <a href="https://github.com/tsolomko/swcomp">swcomp</a>,
which uses SWCompression for unarchiving several types of archives.</p>
<a href='#why-is-it-so-slow' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h2 id='why-is-it-so-slow'>Why is it so slow?</h2>
<p>Version 2.0 came with a great performance improvement.
Just look at the test results at &lsquo;Tests/Test Result&rsquo;.
So if it&rsquo;s slow the first thing you should do is to make sure you are using version &gt;= 2.0.</p>
<p>Is it still slow?
Maybe you are compiling SWCompression not for &lsquo;Release&rsquo; but with &lsquo;Debug&rsquo; build configuration?
For some reason, when framework is built for &lsquo;Debug&rsquo; its performance <strong>significantly</strong> worse.
You can once again check test results if you want to convince yourself that this is the case.</p>
<p>Finally, SWCompression&rsquo;s code is not as optimized as original C/C++ versions of corresponding algorithms,
so some difference in speed is expected.</p>
<p>To sum up, it is <strong>highly recommended</strong> to build SWCompression with &lsquo;Release&rsquo; configuration and use the latest version (at least 2.0).</p>
<a href='#future-plans' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h2 id='future-plans'>Future plans</h2>
<ul>
<li>Tar unarchiving.</li>
<li>Deflate compression.</li>
<li>BZip2 compression.</li>
<li>Something else&hellip;</li>
</ul>
<a href='#references' class='anchor' aria-hidden=true><span class="header-anchor"></span></a><h2 id='references'>References</h2>
<ul>
<li><a href="http://www.paul.sladen.org/projects/pyflate/">pyflate</a></li>
<li><a href="https://www.ietf.org/rfc/rfc1951.txt">Deflate specification</a></li>
<li><a href="https://www.ietf.org/rfc/rfc1952.txt">GZip specification</a></li>
<li><a href="https://www.ietf.org/rfc/rfc1950.txt">Zlib specfication</a></li>
<li><a href="http://www.7-zip.org/sdk.html">LZMA SDK and specification</a></li>
<li><a href="http://tukaani.org/xz/xz-file-format-1.0.4.txt">XZ specification</a></li>
<li><a href="https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm">Wikipedia article about LZMA</a></li>
</ul>
</div>
</section>
</article>
</div>
<section class="footer">
<p>© 2016 Timofey Solomko</p>
<p>Generated by <a class="link" href="https://github.com/realm/jazzy" target="_blank" rel="external">jazzy ♪♫ v0.7.3</a>, a <a class="link" href="http://realm.io" target="_blank" rel="external">Realm</a> project.</p>
</section>
</body>
</div>
</html>