Skip to content

Commit 4bbcb4b

Browse files
authored
Merge PR #364: Add nameEncoding parameter to Tar entries
* add encoding parameter to creating tar entry default is same as current master behavior(omit upper byte) * add encoding tests(cp932) and add doc comment(#364) * add header bytes test and mark obsolete methods without encodings(#364) but IEntryFactory does not considering name encoding. * forget to mark as obsoleting(#364) * add doc comment for name encoding parameter (#364)
1 parent 4a5ae32 commit 4bbcb4b

6 files changed

Lines changed: 480 additions & 81 deletions

File tree

src/ICSharpCode.SharpZipLib/Tar/TarArchive.cs

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,22 @@ protected TarArchive(TarOutputStream stream)
100100
/// </summary>
101101
/// <param name="inputStream">The stream to retrieve archive data from.</param>
102102
/// <returns>Returns a new <see cref="TarArchive"/> suitable for reading from.</returns>
103+
[Obsolete("No Encoding for Name field is specified, any non-ASCII bytes will be discarded")]
103104
public static TarArchive CreateInputTarArchive(Stream inputStream)
105+
{
106+
return CreateInputTarArchive(inputStream, null);
107+
}
108+
109+
/// <summary>
110+
/// The InputStream based constructors create a TarArchive for the
111+
/// purposes of extracting or listing a tar archive. Thus, use
112+
/// these constructors when you wish to extract files from or list
113+
/// the contents of an existing tar archive.
114+
/// </summary>
115+
/// <param name="inputStream">The stream to retrieve archive data from.</param>
116+
/// <param name="nameEncoding">The <see cref="Encoding"/> used for the Name fields, or null for ASCII only</param>
117+
/// <returns>Returns a new <see cref="TarArchive"/> suitable for reading from.</returns>
118+
public static TarArchive CreateInputTarArchive(Stream inputStream, Encoding nameEncoding)
104119
{
105120
if (inputStream == null)
106121
{
@@ -116,7 +131,7 @@ public static TarArchive CreateInputTarArchive(Stream inputStream)
116131
}
117132
else
118133
{
119-
result = CreateInputTarArchive(inputStream, TarBuffer.DefaultBlockFactor);
134+
result = CreateInputTarArchive(inputStream, TarBuffer.DefaultBlockFactor, nameEncoding);
120135
}
121136
return result;
122137
}
@@ -127,7 +142,20 @@ public static TarArchive CreateInputTarArchive(Stream inputStream)
127142
/// <param name="inputStream">A stream containing the tar archive contents</param>
128143
/// <param name="blockFactor">The blocking factor to apply</param>
129144
/// <returns>Returns a <see cref="TarArchive"/> suitable for reading.</returns>
145+
[Obsolete("No Encoding for Name field is specified, any non-ASCII bytes will be discarded")]
130146
public static TarArchive CreateInputTarArchive(Stream inputStream, int blockFactor)
147+
{
148+
return CreateInputTarArchive(inputStream, blockFactor, null);
149+
}
150+
151+
/// <summary>
152+
/// Create TarArchive for reading setting block factor
153+
/// </summary>
154+
/// <param name="inputStream">A stream containing the tar archive contents</param>
155+
/// <param name="blockFactor">The blocking factor to apply</param>
156+
/// <param name="nameEncoding">The <see cref="Encoding"/> used for the Name fields, or null for ASCII only</param>
157+
/// <returns>Returns a <see cref="TarArchive"/> suitable for reading.</returns>
158+
public static TarArchive CreateInputTarArchive(Stream inputStream, int blockFactor, Encoding nameEncoding)
131159
{
132160
if (inputStream == null)
133161
{
@@ -139,15 +167,15 @@ public static TarArchive CreateInputTarArchive(Stream inputStream, int blockFact
139167
throw new ArgumentException("TarInputStream not valid");
140168
}
141169

142-
return new TarArchive(new TarInputStream(inputStream, blockFactor));
170+
return new TarArchive(new TarInputStream(inputStream, blockFactor, nameEncoding));
143171
}
144-
145172
/// <summary>
146173
/// Create a TarArchive for writing to, using the default blocking factor
147174
/// </summary>
148175
/// <param name="outputStream">The <see cref="Stream"/> to write to</param>
176+
/// <param name="nameEncoding">The <see cref="Encoding"/> used for the Name fields, or null for ASCII only</param>
149177
/// <returns>Returns a <see cref="TarArchive"/> suitable for writing.</returns>
150-
public static TarArchive CreateOutputTarArchive(Stream outputStream)
178+
public static TarArchive CreateOutputTarArchive(Stream outputStream, Encoding nameEncoding)
151179
{
152180
if (outputStream == null)
153181
{
@@ -163,10 +191,19 @@ public static TarArchive CreateOutputTarArchive(Stream outputStream)
163191
}
164192
else
165193
{
166-
result = CreateOutputTarArchive(outputStream, TarBuffer.DefaultBlockFactor);
194+
result = CreateOutputTarArchive(outputStream, TarBuffer.DefaultBlockFactor, nameEncoding);
167195
}
168196
return result;
169197
}
198+
/// <summary>
199+
/// Create a TarArchive for writing to, using the default blocking factor
200+
/// </summary>
201+
/// <param name="outputStream">The <see cref="Stream"/> to write to</param>
202+
/// <returns>Returns a <see cref="TarArchive"/> suitable for writing.</returns>
203+
public static TarArchive CreateOutputTarArchive(Stream outputStream)
204+
{
205+
return CreateOutputTarArchive(outputStream, null);
206+
}
170207

171208
/// <summary>
172209
/// Create a <see cref="TarArchive">tar archive</see> for writing.
@@ -175,6 +212,17 @@ public static TarArchive CreateOutputTarArchive(Stream outputStream)
175212
/// <param name="blockFactor">The blocking factor to use for buffering.</param>
176213
/// <returns>Returns a <see cref="TarArchive"/> suitable for writing.</returns>
177214
public static TarArchive CreateOutputTarArchive(Stream outputStream, int blockFactor)
215+
{
216+
return CreateOutputTarArchive(outputStream, blockFactor, null);
217+
}
218+
/// <summary>
219+
/// Create a <see cref="TarArchive">tar archive</see> for writing.
220+
/// </summary>
221+
/// <param name="outputStream">The stream to write to</param>
222+
/// <param name="blockFactor">The blocking factor to use for buffering.</param>
223+
/// <param name="nameEncoding">The <see cref="Encoding"/> used for the Name fields, or null for ASCII only</param>
224+
/// <returns>Returns a <see cref="TarArchive"/> suitable for writing.</returns>
225+
public static TarArchive CreateOutputTarArchive(Stream outputStream, int blockFactor, Encoding nameEncoding)
178226
{
179227
if (outputStream == null)
180228
{
@@ -186,7 +234,7 @@ public static TarArchive CreateOutputTarArchive(Stream outputStream, int blockFa
186234
throw new ArgumentException("TarOutputStream is not valid");
187235
}
188236

189-
return new TarArchive(new TarOutputStream(outputStream, blockFactor));
237+
return new TarArchive(new TarOutputStream(outputStream, blockFactor, nameEncoding));
190238
}
191239

192240
#endregion Static factory methods

src/ICSharpCode.SharpZipLib/Tar/TarEntry.cs

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.IO;
3+
using System.Text;
34

45
namespace ICSharpCode.SharpZipLib.Tar
56
{
@@ -49,10 +50,25 @@ private TarEntry()
4950
/// <param name = "headerBuffer">
5051
/// The header bytes from a tar archive entry.
5152
/// </param>
52-
public TarEntry(byte[] headerBuffer)
53+
[Obsolete("No Encoding for Name field is specified, any non-ASCII bytes will be discarded")]
54+
public TarEntry(byte[] headerBuffer) : this(headerBuffer, null)
55+
{
56+
}
57+
58+
/// <summary>
59+
/// Construct an entry from an archive's header bytes. File is set
60+
/// to null.
61+
/// </summary>
62+
/// <param name = "headerBuffer">
63+
/// The header bytes from a tar archive entry.
64+
/// </param>
65+
/// <param name = "nameEncoding">
66+
/// The <see cref="Encoding"/> used for the Name fields, or null for ASCII only
67+
/// </param>
68+
public TarEntry(byte[] headerBuffer, Encoding nameEncoding)
5369
{
5470
header = new TarHeader();
55-
header.ParseBuffer(headerBuffer);
71+
header.ParseBuffer(headerBuffer, nameEncoding);
5672
}
5773

5874
/// <summary>
@@ -469,9 +485,24 @@ public TarEntry[] GetDirectoryEntries()
469485
/// <param name = "outBuffer">
470486
/// The tar entry header buffer to fill in.
471487
/// </param>
488+
[Obsolete("No Encoding for Name field is specified, any non-ASCII bytes will be discarded")]
472489
public void WriteEntryHeader(byte[] outBuffer)
473490
{
474-
header.WriteHeader(outBuffer);
491+
WriteEntryHeader(outBuffer, null);
492+
}
493+
494+
/// <summary>
495+
/// Write an entry's header information to a header buffer.
496+
/// </summary>
497+
/// <param name = "outBuffer">
498+
/// The tar entry header buffer to fill in.
499+
/// </param>
500+
/// <param name = "nameEncoding">
501+
/// The <see cref="Encoding"/> used for the Name fields, or null for ASCII only
502+
/// </param>
503+
public void WriteEntryHeader(byte[] outBuffer, Encoding nameEncoding)
504+
{
505+
header.WriteHeader(outBuffer, nameEncoding);
475506
}
476507

477508
/// <summary>
@@ -484,9 +515,28 @@ public void WriteEntryHeader(byte[] outBuffer)
484515
/// <param name="newName">
485516
/// The new name to place into the header buffer.
486517
/// </param>
518+
[Obsolete("No Encoding for Name field is specified, any non-ASCII bytes will be discarded")]
487519
static public void AdjustEntryName(byte[] buffer, string newName)
488520
{
489-
TarHeader.GetNameBytes(newName, buffer, 0, TarHeader.NAMELEN);
521+
AdjustEntryName(buffer, newName, null);
522+
}
523+
524+
/// <summary>
525+
/// Convenience method that will modify an entry's name directly
526+
/// in place in an entry header buffer byte array.
527+
/// </summary>
528+
/// <param name="buffer">
529+
/// The buffer containing the entry header to modify.
530+
/// </param>
531+
/// <param name="newName">
532+
/// The new name to place into the header buffer.
533+
/// </param>
534+
/// <param name="nameEncoding">
535+
/// The <see cref="Encoding"/> used for the Name fields, or null for ASCII only
536+
/// </param>
537+
static public void AdjustEntryName(byte[] buffer, string newName, Encoding nameEncoding)
538+
{
539+
TarHeader.GetNameBytes(newName, buffer, 0, TarHeader.NAMELEN, nameEncoding);
490540
}
491541

492542
/// <summary>

0 commit comments

Comments
 (0)