30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
|
static OFArc *app;
static void
setPermissions(OFString *path, OFTarArchiveEntry *entry)
{
#ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS
OFNumber *mode = [OFNumber numberWithUnsignedShort: entry.mode & 0777];
of_file_attributes_t attributes = [OFDictionary
dictionaryWithObject: mode
forKey: of_file_attribute_key_posix_permissions];
[[OFFileManager defaultManager] setAttributes: attributes
ofItemAtPath: path];
#endif
}
static void
setModificationDate(OFString *path, OFTarArchiveEntry *entry)
{
OFDate *modificationDate = entry.modificationDate;
of_file_attributes_t attributes;
if (modificationDate == nil)
return;
attributes = [OFDictionary
dictionaryWithObject: modificationDate
forKey: of_file_attribute_key_modification_date];
[[OFFileManager defaultManager] setAttributes: attributes
ofItemAtPath: path];
}
@implementation TarArchive
+ (void)initialize
{
if (self == [TarArchive class])
app = (OFArc *)[OFApplication sharedApplication].delegate;
}
+ (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream
mode: (OFString *)mode
encoding: (of_string_encoding_t)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
{
self = [super init];
@try {
_archive = [[OFTarArchive alloc] initWithStream: stream
mode: mode];
if (encoding != OF_STRING_ENCODING_AUTODETECT)
_archive.encoding = encoding;
} @catch (id e) {
[self release];
@throw e;
}
return self;
|
|
|
|
|
|
|
|
|
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
|
static OFArc *app;
static void
setPermissions(OFString *path, OFTarArchiveEntry *entry)
{
#ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS
OFNumber *mode = [OFNumber numberWithUnsignedShort: entry.mode & 0777];
OFFileAttributes attributes = [OFDictionary
dictionaryWithObject: mode
forKey: OFFilePOSIXPermissions];
[[OFFileManager defaultManager] setAttributes: attributes
ofItemAtPath: path];
#endif
}
static void
setModificationDate(OFString *path, OFTarArchiveEntry *entry)
{
OFDate *modificationDate = entry.modificationDate;
OFFileAttributes attributes;
if (modificationDate == nil)
return;
attributes = [OFDictionary
dictionaryWithObject: modificationDate
forKey: OFFileModificationDate];
[[OFFileManager defaultManager] setAttributes: attributes
ofItemAtPath: path];
}
@implementation TarArchive
+ (void)initialize
{
if (self == [TarArchive class])
app = (OFArc *)[OFApplication sharedApplication].delegate;
}
+ (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream
mode: (OFString *)mode
encoding: (OFStringEncoding)encoding
{
return [[[self alloc] initWithStream: stream
mode: mode
encoding: encoding] autorelease];
}
- (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream
mode: (OFString *)mode
encoding: (OFStringEncoding)encoding
{
self = [super init];
@try {
_archive = [[OFTarArchive alloc] initWithStream: stream
mode: mode];
if (encoding != OFStringEncodingAutodetect)
_archive.encoding = encoding;
} @catch (id e) {
[self release];
@throw e;
}
return self;
|
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
498
499
500
501
502
503
504
505
506
|
@"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;
OFMutableTarArchiveEntry *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 = [OFMutableTarArchiveEntry entryWithFileName: fileName];
#ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS
entry.mode = attributes.filePOSIXPermissions;
#endif
entry.size = attributes.fileSize;
entry.modificationDate = attributes.fileModificationDate;
#ifdef OF_FILE_MANAGER_SUPPORTS_OWNER
entry.UID = attributes.filePOSIXUID;
entry.GID = attributes.filePOSIXGID;
entry.owner = attributes.fileOwner;
entry.group = attributes.fileGroup;
#endif
if ([type isEqual: of_file_type_regular])
entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE;
else if ([type isEqual: of_file_type_directory]) {
entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_DIRECTORY;
entry.size = 0;
} else if ([type isEqual: of_file_type_symbolic_link]) {
entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_SYMLINK;
entry.targetFileName =
attributes.fileSymbolicLinkDestination;
entry.size = 0;
}
[entry makeImmutable];
|
|
|
|
|
|
|
|
|
|
|
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
498
499
500
501
502
503
504
505
506
|
@"Need one or more files to add!")];
app->_exitStatus = 1;
return;
}
for (OFString *fileName in files) {
void *pool = objc_autoreleasePoolPush();
OFFileAttributes attributes;
OFFileAttributeType type;
OFMutableTarArchiveEntry *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 = [OFMutableTarArchiveEntry entryWithFileName: fileName];
#ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS
entry.mode = attributes.filePOSIXPermissions;
#endif
entry.size = attributes.fileSize;
entry.modificationDate = attributes.fileModificationDate;
#ifdef OF_FILE_MANAGER_SUPPORTS_OWNER
entry.UID = attributes.fileOwnerAccountID;
entry.GID = attributes.fileGroupOwnerAccountID;
entry.owner = attributes.fileOwnerAccountName;
entry.group = attributes.fileGroupOwnerAccountName;
#endif
if ([type isEqual: OFFileTypeRegular])
entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE;
else if ([type isEqual: OFFileTypeDirectory]) {
entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_DIRECTORY;
entry.size = 0;
} else if ([type isEqual: OFFileTypeSymbolicLink]) {
entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_SYMLINK;
entry.targetFileName =
attributes.fileSymbolicLinkDestination;
entry.size = 0;
}
[entry makeImmutable];
|