Skip to content

Commit 0634a08

Browse files
committed
moving filenameStringWithCString to its own method
1 parent 1011c5e commit 0634a08

File tree

1 file changed

+40
-33
lines changed

1 file changed

+40
-33
lines changed

SSZipArchive/SSZipArchive.m

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -339,39 +339,7 @@ + (BOOL)unzipFileAtPath:(NSString *)path
339339

340340
BOOL fileIsSymbolicLink = _fileIsSymbolicLink(&fileInfo);
341341

342-
NSString * strPath = @(filename);
343-
if (!strPath) {
344-
// if filename is non-unicode, detect and transform Encoding
345-
NSData *data = [NSData dataWithBytes:(const void *)filename length:sizeof(unsigned char) * fileInfo.size_filename];
346-
#ifdef __MAC_10_13
347-
// Xcode 9+
348-
if (@available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *)) {
349-
// supported encodings are in [NSString availableStringEncodings]
350-
[NSString stringEncodingForData:data encodingOptions:nil convertedString:&strPath usedLossyConversion:nil];
351-
}
352-
#else
353-
// Xcode 8-
354-
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_9_2) {
355-
// supported encodings are in [NSString availableStringEncodings]
356-
[NSString stringEncodingForData:data encodingOptions:nil convertedString:&strPath usedLossyConversion:nil];
357-
}
358-
#endif
359-
else {
360-
// fallback to a simple manual detect for macOS 10.9 or older
361-
NSArray<NSNumber *> *encodings = @[@(kCFStringEncodingGB_18030_2000), @(kCFStringEncodingShiftJIS)];
362-
for (NSNumber *encoding in encodings) {
363-
strPath = [NSString stringWithCString:filename encoding:(NSStringEncoding)CFStringConvertEncodingToNSStringEncoding(encoding.unsignedIntValue)];
364-
if (strPath) {
365-
break;
366-
}
367-
}
368-
}
369-
if (!strPath) {
370-
// if filename encoding is non-detected, we default to something based on data
371-
// _hexString is more readable than _base64RFC4648 for debugging unknown encodings
372-
strPath = [data _hexString];
373-
}
374-
}
342+
NSString * strPath = [SSZipArchive _filenameStringWithCString:filename size:fileInfo.size_filename];
375343
if (!strPath.length) {
376344
// if filename data is unsalvageable, we default to currentFileNumber
377345
strPath = @(currentFileNumber).stringValue;
@@ -929,6 +897,45 @@ - (BOOL)close
929897

930898
#pragma mark - Private
931899

900+
+ (NSString *)_filenameStringWithCString:(const char *)filename size:(uint16_t)size_filename
901+
{
902+
NSString * strPath = @(filename);
903+
if (strPath) {
904+
return strPath;
905+
}
906+
// if filename is non-unicode, detect and transform Encoding
907+
NSData *data = [NSData dataWithBytes:(const void *)filename length:sizeof(unsigned char) * size_filename];
908+
#ifdef __MAC_10_13
909+
// Xcode 9+
910+
if (@available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *)) {
911+
// supported encodings are in [NSString availableStringEncodings]
912+
[NSString stringEncodingForData:data encodingOptions:nil convertedString:&strPath usedLossyConversion:nil];
913+
}
914+
#else
915+
// Xcode 8-
916+
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_9_2) {
917+
// supported encodings are in [NSString availableStringEncodings]
918+
[NSString stringEncodingForData:data encodingOptions:nil convertedString:&strPath usedLossyConversion:nil];
919+
}
920+
#endif
921+
else {
922+
// fallback to a simple manual detect for macOS 10.9 or older
923+
NSArray<NSNumber *> *encodings = @[@(kCFStringEncodingGB_18030_2000), @(kCFStringEncodingShiftJIS)];
924+
for (NSNumber *encoding in encodings) {
925+
strPath = [NSString stringWithCString:filename encoding:(NSStringEncoding)CFStringConvertEncodingToNSStringEncoding(encoding.unsignedIntValue)];
926+
if (strPath) {
927+
break;
928+
}
929+
}
930+
}
931+
if (!strPath) {
932+
// if filename encoding is non-detected, we default to something based on data
933+
// _hexString is more readable than _base64RFC4648 for debugging unknown encodings
934+
strPath = [data _hexString];
935+
}
936+
return strPath;
937+
}
938+
932939
+ (NSString *)_temporaryPathForDiscardableFile
933940
{
934941
static NSString *discardableFileName = @".DS_Store";

0 commit comments

Comments
 (0)