44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
-
+
-
+
-
+
-
+
-
+
-
+
-
+
|
if (mode == nil)
return;
mode = [OFNumber numberWithUnsignedShort:
mode.unsignedShortValue & 0777];
of_file_attributes_t attributes = [OFDictionary
OFFileAttributes attributes = [OFDictionary
dictionaryWithObject: mode
forKey: of_file_attribute_key_posix_permissions];
forKey: OFFilePOSIXPermissions];
[[OFFileManager defaultManager] setAttributes: attributes
ofItemAtPath: path];
#endif
}
static void
setModificationDate(OFString *path, OFLHAArchiveEntry *entry)
{
OFDate *modificationDate = entry.modificationDate;
of_file_attributes_t attributes;
OFFileAttributes attributes;
if (modificationDate == nil) {
/*
* Fall back to the original date if we have no modification
* date, as the modification date is a UNIX extension.
*/
modificationDate = entry.date;
if (modificationDate == nil)
return;
}
attributes = [OFDictionary
dictionaryWithObject: modificationDate
forKey: of_file_attribute_key_modification_date];
forKey: OFFileModificationDate];
[[OFFileManager defaultManager] setAttributes: attributes
ofItemAtPath: path];
}
@implementation LHAArchive
+ (void)initialize
{
if (self == [LHAArchive class])
app = (OFArc *)[OFApplication sharedApplication].delegate;
}
+ (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream
mode: (OFString *)mode
encoding: (of_string_encoding_t)encoding
encoding: (OFStringEncoding)encoding
{
return [[[self alloc] initWithStream: stream
mode: mode
encoding: encoding] autorelease];
}
- (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream
mode: (OFString *)mode
encoding: (of_string_encoding_t)encoding
encoding: (OFStringEncoding)encoding
{
self = [super init];
@try {
_archive = [[OFLHAArchive alloc] initWithStream: stream
mode: mode];
if (encoding != OF_STRING_ENCODING_AUTODETECT)
if (encoding != OFStringEncodingAutodetect)
_archive.encoding = encoding;
} @catch (id e) {
[self release];
@throw e;
}
return self;
|
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
|
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
|
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
|
@"Need one or more files to add!")];
app->_exitStatus = 1;
return;
}
for (OFString *fileName in files) {
void *pool = objc_autoreleasePoolPush();
of_file_attributes_t attributes;
of_file_type_t type;
OFFileAttributes attributes;
OFFileAttributeType type;
OFMutableLHAArchiveEntry *entry;
OFStream *output;
if (app->_outputLevel >= 0)
[of_stdout writeString: OF_LOCALIZED(@"adding_file",
@"Adding %[file]...",
@"file", fileName)];
attributes = [fileManager attributesOfItemAtPath: fileName];
type = attributes.fileType;
entry = [OFMutableLHAArchiveEntry entryWithFileName: fileName];
#ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS
entry.mode = [OFNumber numberWithUnsignedLong:
attributes.filePOSIXPermissions];
#endif
entry.date = attributes.fileModificationDate;
#ifdef OF_FILE_MANAGER_SUPPORTS_OWNER
entry.UID =
[OFNumber numberWithUnsignedLong: attributes.filePOSIXUID];
entry.GID =
[OFNumber numberWithUnsignedLong: attributes.filePOSIXGID];
entry.owner = attributes.fileOwner;
entry.group = attributes.fileGroup;
entry.UID = [OFNumber numberWithUnsignedLong:
attributes.fileOwnerAccountID];
entry.GID = [OFNumber numberWithUnsignedLong:
attributes.fileGroupOwnerAccountID];
entry.owner = attributes.fileOwnerAccountName;
entry.group = attributes.fileGroupOwnerAccountName;
#endif
if ([type isEqual: of_file_type_directory])
if ([type isEqual: OFFileTypeDirectory])
entry.compressionMethod = @"-lhd-";
output = [_archive streamForWritingEntry: entry];
if ([type isEqual: of_file_type_regular]) {
if ([type isEqual: OFFileTypeRegular]) {
unsigned long long written = 0;
unsigned long long size = attributes.fileSize;
int8_t percent = -1, newPercent;
OFFile *input = [OFFile fileWithPath: fileName
mode: @"r"];
|