Fix XMM scanning on Mac x86.
[mono.git] / mcs / class / System.IO.Compression / SharpCompress / Reader / ReaderFactory.cs
1 using System;
2 using System.IO;
3 #if GZIP
4 using SharpCompress.Archive.GZip;
5 #endif
6 #if RAR
7 using SharpCompress.Archive.Rar;
8 #endif
9 #if TAR
10 using SharpCompress.Archive.Tar;
11 #endif
12 using SharpCompress.Archive.Zip;
13 using SharpCompress.Common;
14 using SharpCompress.Compressor;
15 #if BZIP2
16 using SharpCompress.Compressor.BZip2;
17 #endif
18 using SharpCompress.IO;
19 #if GZIP
20 using SharpCompress.Reader.GZip;
21 #endif
22 #if RAR
23 using SharpCompress.Reader.Rar;
24 #endif
25 #if TAR
26 using SharpCompress.Reader.Tar;
27 #endif
28 using SharpCompress.Reader.Zip;
29 #if DEFLATE
30 using GZipStream = SharpCompress.Compressor.Deflate.GZipStream;
31 #endif
32
33 namespace SharpCompress.Reader
34 {
35     internal static class ReaderFactory
36     {
37         /// <summary>
38         /// Opens a Reader for Non-seeking usage
39         /// </summary>
40         /// <param name="stream"></param>
41         /// <param name="options"></param>
42         /// <returns></returns>
43         public static IReader Open(Stream stream, Options options = Options.KeepStreamsOpen)
44         {
45             stream.CheckNotNull("stream");
46
47             RewindableStream rewindableStream = new RewindableStream(stream);
48             rewindableStream.StartRecording();
49             if (ZipArchive.IsZipFile(rewindableStream, null))
50             {
51                 rewindableStream.Rewind(true);
52                 return ZipReader.Open(rewindableStream, null, options);
53             }
54 #if GZIP
55             rewindableStream.Rewind(false);
56             if (GZipArchive.IsGZipFile(rewindableStream))
57             {
58                 rewindableStream.Rewind(false);
59                 GZipStream testStream = new GZipStream(rewindableStream, CompressionMode.Decompress);
60                 if (TarArchive.IsTarFile(testStream))
61                 {
62                     rewindableStream.Rewind(true);
63                     return new TarReader(rewindableStream, CompressionType.GZip, options);
64                 }
65                 rewindableStream.Rewind(true);
66                 return GZipReader.Open(rewindableStream, options);
67             }
68 #endif
69
70 #if BZIP2
71             rewindableStream.Rewind(false);
72             if (BZip2Stream.IsBZip2(rewindableStream))
73             {
74                 rewindableStream.Rewind(false);
75                 BZip2Stream testStream = new BZip2Stream(rewindableStream, CompressionMode.Decompress, false);
76 #if TAR
77                 if (TarArchive.IsTarFile(testStream))
78                 {
79                     rewindableStream.Rewind(true);
80                     return new TarReader(rewindableStream, CompressionType.BZip2, options);
81                 }
82 #endif
83             }
84 #endif
85
86 #if TAR
87             rewindableStream.Rewind(false);
88             if (TarArchive.IsTarFile(rewindableStream))
89             {
90                 rewindableStream.Rewind(true);
91                 return TarReader.Open(rewindableStream, options);
92             }
93 #endif
94 #if RAR
95             rewindableStream.Rewind(false);
96             if (RarArchive.IsRarFile(rewindableStream, options))
97             {
98                 rewindableStream.Rewind(true);
99                 return RarReader.Open(rewindableStream, options);
100             }
101 #endif
102
103             throw new InvalidOperationException("Cannot determine compressed stream type.  Supported Reader Formats: Zip, GZip, BZip2, Tar, Rar");
104         }
105     }
106 }