Modified src/Makefile
from [ab50c41823]
to [fd93e350db].
︙ | | |
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
+
|
OFSHA256Hash.m \
OFSHA384Hash.m \
OFSHA384Or512Hash.m \
OFSHA512Hash.m \
OFScrypt.m \
OFSecureData.m \
OFSeekableStream.m \
OFSerialization.m \
OFSet.m \
OFSortedList.m \
OFStdIOStream.m \
OFStrPTime.m \
OFStream.m \
OFString.m \
OFString+CryptographicHashing.m \
|
︙ | | |
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
-
|
OFCollection.h \
OFCryptographicHash.h \
OFJSONRepresentation.h \
OFKernelEventObserver.h \
OFKeyValueCoding.h \
OFLocking.h \
OFMessagePackRepresentation.h \
OFSerialization.h \
OFTLSSocket.h \
ObjFW.h \
macros.h \
objfw-defs.h \
platform.h \
${USE_INCLUDES_ATOMIC}
|
︙ | | |
Modified src/OFAdjacentArray.m
from [a4b7755fe9]
to [82d92d7ef3].
︙ | | |
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
-
+
-
+
|
self = [self init];
@try {
void *pool = objc_autoreleasePoolPush();
if ((![element.name isEqual: @"OFArray"] &&
![element.name isEqual: @"OFMutableArray"]) ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
for (OFXMLElement *child in
[element elementsForNamespace: OF_SERIALIZATION_NS]) {
[element elementsForNamespace: OFSerializationNS]) {
void *pool2 = objc_autoreleasePoolPush();
id object;
object = child.objectByDeserializing;
[_array addItem: &object];
[object retain];
|
︙ | | |
Modified src/OFArray.m
from [3a75bc9f84]
to [37c945555f].
︙ | | |
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
|
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
|
-
+
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
if ([self isKindOfClass: [OFMutableArray class]])
element = [OFXMLElement elementWithName: @"OFMutableArray"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
else
element = [OFXMLElement elementWithName: @"OFArray"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
for (id <OFSerialization> object in self) {
void *pool2 = objc_autoreleasePoolPush();
[element addChild: object.XMLElementBySerializing];
objc_autoreleasePoolPop(pool2);
|
︙ | | |
Modified src/OFCountedMapTableSet.m
from [00546e8e62]
to [fb2a261b38].
︙ | | |
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
-
+
-
+
-
+
|
{
self = [self init];
@try {
void *pool = objc_autoreleasePoolPush();
if (![element.name isEqual: @"OFCountedSet"] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
for (OFXMLElement *objectElement in
[element elementsForName: @"object"
namespace: OF_SERIALIZATION_NS]) {
namespace: OFSerializationNS]) {
void *pool2 = objc_autoreleasePoolPush();
OFXMLElement *object;
OFXMLAttribute *countAttribute;
unsigned long long count;
object = [objectElement elementsForNamespace:
OF_SERIALIZATION_NS].firstObject;
OFSerializationNS].firstObject;
countAttribute =
[objectElement attributeForName: @"count"];
if (object == nil || countAttribute == nil)
@throw [OFInvalidFormatException exception];
count = countAttribute.unsignedLongLongValue;
|
︙ | | |
Modified src/OFCountedSet.m
from [fe3c7716dc]
to [f1dc200ff4].
︙ | | |
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
-
+
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
element = [OFXMLElement elementWithName: @"OFCountedSet"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
for (id <OFSerialization> object in self) {
void *pool2 = objc_autoreleasePoolPush();
OFXMLElement *objectElement;
OFString *count;
count =
[OFString stringWithFormat: @"%zu",
[self countForObject: object]];
objectElement = [OFXMLElement
elementWithName: @"object"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[objectElement addAttributeWithName: @"count"
stringValue: count];
[objectElement addChild: object.XMLElementBySerializing];
[element addChild: objectElement];
objc_autoreleasePoolPop(pool2);
}
|
︙ | | |
Modified src/OFDNSResolver.h
from [366ea735f5]
to [9570988a05].
︙ | | |
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
-
+
|
#import "OFDNSResourceRecord.h"
#import "OFDNSResponse.h"
#import "OFRunLoop.h"
#import "OFString.h"
OF_ASSUME_NONNULL_BEGIN
#define OF_DNS_RESOLVER_BUFFER_LENGTH 512
#define OFDNSResolverBufferLength 512
@class OFArray OF_GENERIC(ObjectType);
@class OFDNSResolver;
@class OFDNSResolverContext;
@class OFDNSResolverSettings;
@class OFDate;
@class OFDictionary OF_GENERIC(KeyType, ObjectType);
|
︙ | | |
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
-
+
|
@interface OFDNSResolver: OFObject
{
OFDNSResolverSettings *_settings;
OFUDPSocket *_IPv4Socket;
#ifdef OF_HAVE_IPV6
OFUDPSocket *_IPv6Socket;
#endif
char _buffer[OF_DNS_RESOLVER_BUFFER_LENGTH];
char _buffer[OFDNSResolverBufferLength];
OFMutableDictionary OF_GENERIC(OFNumber *, OFDNSResolverContext *)
*_queries;
OFMutableDictionary OF_GENERIC(OFTCPSocket *, OFDNSResolverContext *)
*_TCPQueries;
}
/**
|
︙ | | |
Modified src/OFDNSResolver.m
from [2c62153187]
to [9a8423f14c].
︙ | | |
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
|
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
-
-
+
+
-
-
+
-
|
#import "OFOutOfRangeException.h"
#import "OFTruncatedDataException.h"
#ifndef SOCK_DNS
# define SOCK_DNS 0
#endif
#define BUFFER_LENGTH OF_DNS_RESOLVER_BUFFER_LENGTH
#define MAX_DNS_RESPONSE_LENGTH 65536
static const size_t bufferLength = OFDNSResolverBufferLength;
static const size_t maxDNSResponseLength = 65536;
/*
* RFC 1035 doesn't specify if pointers to pointers are allowed, and if so how
* many. Since it's unspecified, we have to assume that it might happen, but we
* also want to limit it to avoid DoS. Limiting it to 16 levels of pointers and
* immediately rejecting pointers to itself seems like a fair balance.
*/
#define MAX_ALLOWED_POINTERS 16
static const uint_fast8_t maxAllowedPointers = 16;
#define CNAME_RECURSION 3
@interface OFDNSResolver () <OFUDPSocketDelegate, OFTCPSocketDelegate>
- (void)of_contextTimedOut: (OFDNSResolverContext *)context;
@end
OF_DIRECT_MEMBERS
@interface OFDNSResolverContext: OFObject
|
︙ | | |
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
-
+
-
+
-
+
-
+
|
return [[[OFADNSResourceRecord alloc]
initWithName: name
address: &address
TTL: TTL] autorelease];
} else if (recordType == OFDNSRecordTypeNS) {
size_t j = i;
OFString *authoritativeHost = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
if (j != i + dataLength)
@throw [OFInvalidServerReplyException exception];
return [[[OFNSDNSResourceRecord alloc]
initWithName: name
DNSClass: DNSClass
authoritativeHost: authoritativeHost
TTL: TTL] autorelease];
} else if (recordType == OFDNSRecordTypeCNAME) {
size_t j = i;
OFString *alias = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
if (j != i + dataLength)
@throw [OFInvalidServerReplyException exception];
return [[[OFCNAMEDNSResourceRecord alloc]
initWithName: name
DNSClass: DNSClass
alias: alias
TTL: TTL] autorelease];
} else if (recordType == OFDNSRecordTypeSOA) {
size_t j = i;
OFString *primaryNameServer = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
OFString *responsiblePerson;
uint32_t serialNumber, refreshInterval, retryInterval;
uint32_t expirationInterval, minTTL;
if (j > i + dataLength)
@throw [OFInvalidServerReplyException exception];
responsiblePerson = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
if (dataLength - (j - i) != 20)
@throw [OFInvalidServerReplyException exception];
serialNumber = (buffer[j] << 24) | (buffer[j + 1] << 16) |
(buffer[j + 2] << 8) | buffer[j + 3];
refreshInterval = (buffer[j + 4] << 24) |
|
︙ | | |
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
|
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
|
-
+
|
retryInterval: retryInterval
expirationInterval: expirationInterval
minTTL: minTTL
TTL: TTL] autorelease];
} else if (recordType == OFDNSRecordTypePTR) {
size_t j = i;
OFString *domainName = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
if (j != i + dataLength)
@throw [OFInvalidServerReplyException exception];
return [[[OFPTRDNSResourceRecord alloc]
initWithName: name
DNSClass: DNSClass
|
︙ | | |
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
|
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
|
-
+
|
if (dataLength < 2)
@throw [OFInvalidServerReplyException exception];
preference = (buffer[i] << 8) | buffer[i + 1];
j = i + 2;
mailExchange = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
if (j != i + dataLength)
@throw [OFInvalidServerReplyException exception];
return [[[OFMXDNSResourceRecord alloc]
initWithName: name
DNSClass: DNSClass
|
︙ | | |
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
|
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
|
-
+
-
+
|
initWithName: name
DNSClass: DNSClass
textStrings: textStrings
TTL: TTL] autorelease];
} else if (recordType == OFDNSRecordTypeRP) {
size_t j = i;
OFString *mailbox = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
OFString *TXTDomainName;
if (j > i + dataLength)
@throw [OFInvalidServerReplyException exception];
TXTDomainName = parseName(buffer, length, &j,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
if (j != i + dataLength)
@throw [OFInvalidServerReplyException exception];
return [[[OFRPDNSResourceRecord alloc]
initWithName: name
DNSClass: DNSClass
|
︙ | | |
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
|
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
|
-
+
|
@throw [OFInvalidServerReplyException exception];
priority = (buffer[i] << 8) | buffer[i + 1];
weight = (buffer[i + 2] << 8) | buffer[i + 3];
port = (buffer[i + 4] << 8) | buffer[i + 5];
j = i + 6;
target = parseName(buffer, length, &j, MAX_ALLOWED_POINTERS);
target = parseName(buffer, length, &j, maxAllowedPointers);
if (j != i + dataLength)
@throw [OFInvalidServerReplyException exception];
return [[[OFSRVDNSResourceRecord alloc]
initWithName: name
priority: priority
|
︙ | | |
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
|
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
|
-
+
|
{
OFMutableDictionary *ret = [OFMutableDictionary dictionary];
OFEnumerator OF_GENERIC(OFMutableArray *) *objectEnumerator;
OFMutableArray *array;
for (uint_fast16_t j = 0; j < count; j++) {
OFString *name = parseName(buffer, length, i,
MAX_ALLOWED_POINTERS);
maxAllowedPointers);
OFDNSClass DNSClass;
OFDNSRecordType recordType;
uint32_t TTL;
uint16_t dataLength;
OFDNSResourceRecord *record;
if (*i + 10 > length)
|
︙ | | |
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
|
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
|
-
+
|
@throw [OFInvalidArgumentException exception];
}
[sock asyncSendData: context->_queryData
receiver: &context->_usedNameServer
runLoopMode: runLoopMode];
[sock asyncReceiveIntoBuffer: _buffer
length: BUFFER_LENGTH
length: bufferLength
runLoopMode: runLoopMode];
}
- (void)asyncPerformQuery: (OFDNSQuery *)query
delegate: (id <OFDNSResolverQueryDelegate>)delegate
{
[self asyncPerformQuery: query
|
︙ | | |
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
|
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
|
-
+
-
+
|
[_queries removeObjectForKey: context->_ID];
/*
* Cancel any pending queries, to avoid a send being still pending and
* trying to access the query once it no longer exists.
*/
[_IPv4Socket cancelAsyncRequests];
[_IPv4Socket asyncReceiveIntoBuffer: _buffer length: BUFFER_LENGTH];
[_IPv4Socket asyncReceiveIntoBuffer: _buffer length: bufferLength];
#ifdef OF_HAVE_IPV6
[_IPv6Socket cancelAsyncRequests];
[_IPv6Socket asyncReceiveIntoBuffer: _buffer length: BUFFER_LENGTH];
[_IPv6Socket asyncReceiveIntoBuffer: _buffer length: bufferLength];
#endif
exception = [OFDNSQueryFailedException
exceptionWithQuery: context->_query
errorCode: OFDNSResolverErrorCodeTimeout];
[context->_delegate resolver: self
|
︙ | | |
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
|
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
|
-
+
|
/*
* Skip over the questions - we use the ID to identify the
* query.
*
* TODO: Compare to our query, just in case?
*/
for (uint_fast16_t j = 0; j < numQuestions; j++) {
parseName(buffer, length, &i, MAX_ALLOWED_POINTERS);
parseName(buffer, length, &i, maxAllowedPointers);
i += 4;
}
answerRecords = parseSection(buffer, length, &i, numAnswers);
authorityRecords = parseSection(buffer, length, &i,
numAuthorityRecords);
additionalRecords = parseSection(buffer, length, &i,
|
︙ | | |
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
|
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
|
-
+
|
[context->_TCPSocket release];
context->_TCPSocket = nil;
context->_responseLength = 0;
return nil;
}
if (context->_TCPBuffer == nil)
context->_TCPBuffer = OFAllocMemory(MAX_DNS_RESPONSE_LENGTH, 1);
context->_TCPBuffer = OFAllocMemory(maxDNSResponseLength, 1);
[sock asyncReadIntoBuffer: context->_TCPBuffer exactLength: 2];
return nil;
}
- (bool)stream: (OFStream *)stream
didReadIntoBuffer: (void *)buffer
|
︙ | | |
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
|
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
|
-
+
|
if (context->_responseLength == 0) {
unsigned char *ucBuffer = buffer;
OFEnsure(length == 2);
context->_responseLength = (ucBuffer[0] << 8) | ucBuffer[1];
if (context->_responseLength > MAX_DNS_RESPONSE_LENGTH)
if (context->_responseLength > maxDNSResponseLength)
@throw [OFOutOfRangeException exception];
if (context->_responseLength == 0)
goto done;
[sock asyncReadIntoBuffer: context->_TCPBuffer
exactLength: context->_responseLength];
|
︙ | | |
Modified src/OFData.m
from [d0e4846ab5]
to [1a9ee2a47d].
︙ | | |
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
|
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
|
-
+
|
- (instancetype)initWithSerialization: (OFXMLElement *)element
{
void *pool = objc_autoreleasePoolPush();
OFString *stringValue;
@try {
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
stringValue = element.stringValue;
} @catch (id e) {
[self release];
@throw e;
}
|
︙ | | |
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
|
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
|
-
+
|
if (_itemSize != 1)
@throw [OFInvalidArgumentException exception];
pool = objc_autoreleasePoolPush();
element = [OFXMLElement
elementWithName: self.className
namespace: OF_SERIALIZATION_NS
namespace: OFSerializationNS
stringValue: OFBase64Encode(_items, _count * _itemSize)];
[element retain];
objc_autoreleasePoolPop(pool);
return [element autorelease];
|
︙ | | |
Modified src/OFDate.m
from [67965e0984]
to [d16c6de57b].
︙ | | |
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
|
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
|
-
+
|
OFTimeInterval seconds;
@try {
void *pool = objc_autoreleasePoolPush();
unsigned long long value;
if (![element.name isEqual: @"OFDate"] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
value = [element unsignedLongLongValueWithBase: 16];
if (value > UINT64_MAX)
@throw [OFOutOfRangeException exception];
|
︙ | | |
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
|
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
|
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
element = [OFXMLElement elementWithName: @"OFDate"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
element.stringValue = [OFString stringWithFormat: @"%016" PRIx64,
OFFromBigEndian64(OFDoubleToRawUInt64(OFToBigEndianDouble(
self.timeIntervalSince1970)))];
[element retain];
|
︙ | | |
Modified src/OFDictionary.m
from [157e7e0a35]
to [804d125c3d].
︙ | | |
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
|
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
|
-
+
-
+
-
+
-
+
|
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
OFEnumerator *keyEnumerator, *objectEnumerator;
id <OFSerialization> key, object;
if ([self isKindOfClass: [OFMutableDictionary class]])
element = [OFXMLElement elementWithName: @"OFMutableDictionary"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
else
element = [OFXMLElement elementWithName: @"OFDictionary"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
keyEnumerator = [self keyEnumerator];
objectEnumerator = [self objectEnumerator];
while ((key = [keyEnumerator nextObject]) != nil &&
(object = [objectEnumerator nextObject]) != nil) {
void *pool2 = objc_autoreleasePoolPush();
OFXMLElement *keyElement, *objectElement;
keyElement = [OFXMLElement
elementWithName: @"key"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[keyElement addChild: key.XMLElementBySerializing];
objectElement = [OFXMLElement
elementWithName: @"object"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[objectElement addChild: object.XMLElementBySerializing];
[element addChild: keyElement];
[element addChild: objectElement];
objc_autoreleasePoolPop(pool2);
}
|
︙ | | |
Modified src/OFFile.h
from [db0bb12b6a]
to [7c5aab04f3].
︙ | | |
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
-
+
-
+
|
*/
#import "OFSeekableStream.h"
#import "OFKernelEventObserver.h"
#ifndef OF_AMIGAOS
# define OF_FILE_HANDLE_IS_FD
# define OF_INVALID_FILE_HANDLE (-1)
typedef int OFFileHandle;
static const OFFileHandle OFInvalidFileHandle = -1;
#else
# define OF_INVALID_FILE_HANDLE NULL
typedef struct OFFileHandle *OFFileHandle;
static const OFFileHandle OFInvalidFileHandle = NULL;
#endif
OF_ASSUME_NONNULL_BEGIN
@class OFURL;
/**
|
︙ | | |
Modified src/OFFile.m
from [642a5fcb6b]
to [5d9cdb9d33].
︙ | | |
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
-
+
-
+
|
_handle = handle;
return self;
}
- (bool)lowlevelIsAtEndOfStream
{
if (_handle == OF_INVALID_FILE_HANDLE)
if (_handle == OFInvalidFileHandle)
@throw [OFNotOpenException exceptionWithObject: self];
return _atEndOfStream;
}
- (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length
{
ssize_t ret;
if (_handle == OF_INVALID_FILE_HANDLE)
if (_handle == OFInvalidFileHandle)
@throw [OFNotOpenException exceptionWithObject: self];
#if defined(OF_WINDOWS)
if (length > UINT_MAX)
@throw [OFOutOfRangeException exception];
if ((ret = read(_handle, buffer, (unsigned int)length)) < 0)
|
︙ | | |
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
|
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
|
-
+
|
_atEndOfStream = true;
return ret;
}
- (size_t)lowlevelWriteBuffer: (const void *)buffer length: (size_t)length
{
if (_handle == OF_INVALID_FILE_HANDLE)
if (_handle == OFInvalidFileHandle)
@throw [OFNotOpenException exceptionWithObject: self];
#if defined(OF_WINDOWS)
int bytesWritten;
if (length > INT_MAX)
@throw [OFOutOfRangeException exception];
|
︙ | | |
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
|
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
|
-
+
|
return (size_t)bytesWritten;
}
- (OFFileOffset)lowlevelSeekToOffset: (OFFileOffset)offset whence: (int)whence
{
OFFileOffset ret;
if (_handle == OF_INVALID_FILE_HANDLE)
if (_handle == OFInvalidFileHandle)
@throw [OFNotOpenException exceptionWithObject: self];
#ifndef OF_AMIGAOS
# if defined(OF_WINDOWS)
ret = _lseeki64(_handle, offset, whence);
# elif defined(HAVE_LSEEK64)
ret = lseek64(_handle, offset, whence);
|
︙ | | |
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
|
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
|
-
+
-
+
-
+
|
{
return _handle;
}
#endif
- (void)close
{
if (_handle == OF_INVALID_FILE_HANDLE)
if (_handle == OFInvalidFileHandle)
@throw [OFNotOpenException exceptionWithObject: self];
closeHandle(_handle);
_handle = OF_INVALID_FILE_HANDLE;
_handle = OFInvalidFileHandle;
[super close];
}
- (void)dealloc
{
if (_handle != OF_INVALID_FILE_HANDLE)
if (_handle != OFInvalidFileHandle)
[self close];
[super dealloc];
}
@end
|
Modified src/OFList.m
from [030fa83d33]
to [270e405c2f].
︙ | | |
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
-
+
-
+
|
{
self = [self init];
@try {
void *pool = objc_autoreleasePoolPush();
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
for (OFXMLElement *child in
[element elementsForNamespace: OF_SERIALIZATION_NS]) {
[element elementsForNamespace: OFSerializationNS]) {
void *pool2 = objc_autoreleasePoolPush();
[self appendObject: child.objectByDeserializing];
objc_autoreleasePoolPop(pool2);
}
|
︙ | | |
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
-
+
|
return ret;
}
- (OFXMLElement *)XMLElementBySerializing
{
OFXMLElement *element =
[OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
for (OFListItem *iter = _firstListItem;
iter != NULL; iter = iter->next) {
void *pool = objc_autoreleasePoolPush();
[element addChild: [iter->object XMLElementBySerializing]];
|
︙ | | |
Modified src/OFMD5Hash.h
from [339183e371]
to [cdc110c606].
︙ | | |
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
-
+
|
OF_SUBCLASSING_RESTRICTED
@interface OFMD5Hash: OFObject <OFCryptographicHash>
{
OFSecureData *_iVarsData;
struct {
uint32_t state[4];
uint64_t bits;
union of_md5_hash_buffer {
union {
unsigned char bytes[64];
uint32_t words[16];
} buffer;
size_t bufferLength;
} *_iVars;
bool _allowsSwappableMemory;
bool _calculated;
}
@end
OF_ASSUME_NONNULL_END
|
Modified src/OFMapTableDictionary.m
from [475d73ba26]
to [121bed2172].
︙ | | |
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
|
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
|
-
+
-
+
-
+
-
+
|
@try {
void *pool = objc_autoreleasePoolPush();
OFArray *keys, *objects;
OFEnumerator *keyEnumerator, *objectEnumerator;
OFXMLElement *keyElement, *objectElement;
keys = [element elementsForName: @"key"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
objects = [element elementsForName: @"object"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
if (keys.count != objects.count)
@throw [OFInvalidFormatException exception];
_mapTable = [[OFMapTable alloc]
initWithKeyFunctions: keyFunctions
objectFunctions: objectFunctions
capacity: keys.count];
keyEnumerator = [keys objectEnumerator];
objectEnumerator = [objects objectEnumerator];
while ((keyElement = [keyEnumerator nextObject]) != nil &&
(objectElement = [objectEnumerator nextObject]) != nil) {
void *pool2 = objc_autoreleasePoolPush();
OFXMLElement *key, *object;
key = [keyElement elementsForNamespace:
OF_SERIALIZATION_NS].firstObject;
OFSerializationNS].firstObject;
object = [objectElement elementsForNamespace:
OF_SERIALIZATION_NS].firstObject;
OFSerializationNS].firstObject;
if (key == nil || object == nil)
@throw [OFInvalidFormatException exception];
[_mapTable setObject: object.objectByDeserializing
forKey: key.objectByDeserializing];
|
︙ | | |
Modified src/OFMapTableSet.m
from [25ed7b20ac]
to [5b1053bcbc].
︙ | | |
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
-
+
-
+
|
self = [self init];
@try {
void *pool = objc_autoreleasePoolPush();
if ((![element.name isEqual: @"OFSet"] &&
![element.name isEqual: @"OFMutableSet"]) ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
for (OFXMLElement *child in
[element elementsForNamespace: OF_SERIALIZATION_NS]) {
[element elementsForNamespace: OFSerializationNS]) {
void *pool2 = objc_autoreleasePoolPush();
[_mapTable setObject: (void *)1
forKey: [child objectByDeserializing]];
objc_autoreleasePoolPop(pool2);
}
|
︙ | | |
Modified src/OFNull.m
from [f8e3d50797]
to [56077ec169].
︙ | | |
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
-
+
|
void *pool;
[self release];
pool = objc_autoreleasePoolPush();
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
objc_autoreleasePoolPop(pool);
return [OFNull null];
}
|
︙ | | |
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
element = [OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[element retain];
objc_autoreleasePoolPop(pool);
return [element autorelease];
}
|
︙ | | |
Modified src/OFNumber.h
from [6fc4bc7a5d]
to [1bc62b5876].
︙ | | |
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
-
+
|
*/
#ifndef OF_NUMBER_M
OF_SUBCLASSING_RESTRICTED
#endif
@interface OFNumber: OFValue <OFComparing, OFSerialization,
OFJSONRepresentation, OFMessagePackRepresentation>
{
union of_number_value {
union {
double float_;
long long signed_;
unsigned long long unsigned_;
} _value;
const char *_typeEncoding;
}
|
︙ | | |
Modified src/OFNumber.m
from [10bbeb0e0f]
to [3b421cd558].
︙ | | |
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
|
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
|
-
+
|
self = [super init];
@try {
void *pool = objc_autoreleasePoolPush();
OFString *typeString;
if (![element.name isEqual: @"OFNumber"] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
typeString = [element attributeForName: @"type"].stringValue;
if ([typeString isEqual: @"bool"]) {
OFString *stringValue = element.stringValue;
if ([stringValue isEqual: @"true"])
|
︙ | | |
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
|
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
|
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
element = [OFXMLElement elementWithName: @"OFNumber"
namespace: OF_SERIALIZATION_NS
namespace: OFSerializationNS
stringValue: self.description];
if (*self.objCType == 'B')
[element addAttributeWithName: @"type" stringValue: @"bool"];
else if (isFloat(self)) {
[element addAttributeWithName: @"type" stringValue: @"float"];
element.stringValue = [OFString
|
︙ | | |
Modified src/OFObject+Serialization.m
from [fe39eedbf9]
to [4ae1aec1cc].
︙ | | |
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
-
+
|
abort();
}
pool = objc_autoreleasePoolPush();
element = ((id <OFSerialization>)self).XMLElementBySerializing;
root = [OFXMLElement elementWithName: @"serialization"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[root addAttributeWithName: @"version" stringValue: @"1"];
[root addChild: element];
ret = [@"<?xml version='1.0' encoding='UTF-8'?>\n"
stringByAppendingString: [root XMLStringWithIndentation: 2]];
[ret retain];
objc_autoreleasePoolPop(pool);
return [ret autorelease];
}
@end
|
Modified src/OFPlainMutex.h
from [f2be57e77e]
to [d6ce7e7a04].
︙ | | |
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
-
|
# include <exec/semaphores.h>
typedef struct SignalSemaphore OFPlainMutex;
#endif
#if defined(OF_HAVE_ATOMIC_OPS)
# import "OFAtomic.h"
typedef volatile int OFSpinlock;
# define OF_SPINCOUNT 10
#elif defined(OF_HAVE_PTHREAD_SPINLOCKS)
typedef pthread_spinlock_t OFSpinlock;
#else
typedef OFPlainMutex OFSpinlock;
#endif
#ifdef OF_HAVE_SCHED_YIELD
|
︙ | | |
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
-
+
|
static OF_INLINE int
OFSpinlockLock(OFSpinlock *spinlock)
{
#if defined(OF_HAVE_ATOMIC_OPS)
size_t i;
for (i = 0; i < OF_SPINCOUNT; i++)
for (i = 0; i < 10; i++)
if (OFSpinlockTryLock(spinlock) == 0)
return 0;
while (OFSpinlockTryLock(spinlock) == EBUSY)
OFYieldThread();
return 0;
|
︙ | | |
Modified src/OFPlugin.h
from [70b1b483a7]
to [f2f4fe0c3b].
︙ | | |
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
-
-
+
+
+
+
+
-
-
+
+
+
+
+
|
#import "OFObject.h"
@class OFString;
#ifndef OF_WINDOWS
# include <dlfcn.h>
# define OF_RTLD_LAZY RTLD_LAZY
# define OF_RTLD_NOW RTLD_NOW
typedef void *OFPluginHandle;
typedef enum OFDLOpenFlags {
OFDLOpenFlagLazy = RTLD_LAZY,
OFDLOpenFlagNow = RTLD_NOW
} OFDLOpenFlags;
#else
# include <windows.h>
# define OF_RTLD_LAZY 0
# define OF_RTLD_NOW 0
typedef HMODULE OFPluginHandle;
enum OFDLOpenFlags {
OFDLOpenFlagLazy = 0,
OFDLOpenFlagNow = 0
};
#endif
OF_ASSUME_NONNULL_BEGIN
/**
* @class OFPlugin OFPlugin.h ObjFW/OFPlugin.h
*
|
︙ | | |
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
-
-
-
-
+
+
+
+
|
*/
+ (OF_KINDOF(OFPlugin *))pluginWithPath: (OFString *)path;
@end
#ifdef __cplusplus
extern "C" {
#endif
extern OFPluginHandle OFDlOpen(OFString *path, int flags);
extern void *OFDlSym(OFPluginHandle handle, const char *symbol);
extern OFString *_Nullable OFDlError(void);
extern void OFDlClose(OFPluginHandle handle);
extern OFPluginHandle OFDLOpen(OFString *path, OFDLOpenFlags flags);
extern void *OFDLSym(OFPluginHandle handle, const char *symbol);
extern OFString *_Nullable OFDLError(void);
extern void OFDLClose(OFPluginHandle handle);
#ifdef __cplusplus
}
#endif
OF_ASSUME_NONNULL_END
|
Modified src/OFPlugin.m
from [f022309a5c]
to [4e653a2def].
︙ | | |
29
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
|
29
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
|
-
+
-
+
-
+
-
+
|
#import "OFInitializationFailedException.h"
#import "OFLoadPluginFailedException.h"
typedef OFPlugin *(*init_plugin_t)(void);
OFPluginHandle
OFDlOpen(OFString *path, int flags)
OFDLOpen(OFString *path, OFDLOpenFlags flags)
{
#ifndef OF_WINDOWS
return dlopen([path cStringWithEncoding: [OFLocale encoding]], flags);
#else
if (path == nil)
return GetModuleHandle(NULL);
if ([OFSystemInfo isWindowsNT])
return LoadLibraryW(path.UTF16String);
else
return LoadLibraryA(
[path cStringWithEncoding: [OFLocale encoding]]);
#endif
}
void *
OFDlSym(OFPluginHandle handle, const char *symbol)
OFDLSym(OFPluginHandle handle, const char *symbol)
{
#ifndef OF_WINDOWS
return dlsym(handle, symbol);
#else
return (void *)(uintptr_t)GetProcAddress(handle, symbol);
#endif
}
void
OFDlClose(OFPluginHandle handle)
OFDLClose(OFPluginHandle handle)
{
#ifndef OF_WINDOWS
dlclose(handle);
#else
FreeLibrary(handle);
#endif
}
OFString *
OFDlError(void)
OFDLError(void)
{
#ifndef OF_WINDOWS
return [OFString stringWithCString: dlerror()
encoding: [OFLocale encoding]];
#else
return nil;
#endif
|
︙ | | |
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
-
+
-
+
-
+
-
+
|
#elif defined(OF_IOS)
path = [path stringByAppendingFormat: @".bundle/%@",
path.lastPathComponent];
#else
path = [path stringByAppendingString: @PLUGIN_SUFFIX];
#endif
if ((handle = OFDlOpen(path, OF_RTLD_LAZY)) == NULL)
if ((handle = OFDLOpen(path, OFDLOpenFlagLazy)) == NULL)
@throw [OFLoadPluginFailedException
exceptionWithPath: path
error: OFDlError()];
error: OFDLError()];
objc_autoreleasePoolPop(pool);
initPlugin = (init_plugin_t)(uintptr_t)OFDlSym(handle, "init_plugin");
initPlugin = (init_plugin_t)(uintptr_t)OFDLSym(handle, "init_plugin");
if (initPlugin == (init_plugin_t)0 || (plugin = initPlugin()) == nil) {
OFDlClose(handle);
OFDLClose(handle);
@throw [OFInitializationFailedException
exceptionWithClass: self];
}
plugin->_pluginHandle = handle;
return plugin;
}
|
︙ | | |
134
135
136
137
138
139
140
141
142
143
|
134
135
136
137
138
139
140
141
142
143
|
-
+
|
- (void)dealloc
{
OFPluginHandle h = _pluginHandle;
[super dealloc];
OFDlClose(h);
OFDLClose(h);
}
@end
|
Modified src/OFRIPEMD160Hash.h
from [0b19515ab4]
to [887ee4002d].
︙ | | |
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
-
+
|
OF_SUBCLASSING_RESTRICTED
@interface OFRIPEMD160Hash: OFObject <OFCryptographicHash>
{
OFSecureData *_iVarsData;
struct {
uint32_t state[5];
uint64_t bits;
union of_ripemd160_hash_buffer {
union {
unsigned char bytes[64];
uint32_t words[16];
} buffer;
size_t bufferLength;
} *_iVars;
bool _allowsSwappableMemory;
bool _calculated;
}
@end
OF_ASSUME_NONNULL_END
|
Modified src/OFSHA1Hash.h
from [af6053ff2d]
to [96facd340e].
︙ | | |
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
-
+
|
OF_SUBCLASSING_RESTRICTED
@interface OFSHA1Hash: OFObject <OFCryptographicHash>
{
OFSecureData *_iVarsData;
struct {
uint32_t state[5];
uint64_t bits;
union of_sha1_hash_buffer {
union {
unsigned char bytes[64];
uint32_t words[80];
} buffer;
size_t bufferLength;
} *_iVars;
bool _allowsSwappableMemory;
bool _calculated;
}
@end
OF_ASSUME_NONNULL_END
|
Modified src/OFSHA224Or256Hash.h
from [bbb35d6ed5]
to [502962edb9].
︙ | | |
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
-
+
|
{
@private
OFSecureData *_iVarsData;
@protected
struct {
uint32_t state[8];
uint64_t bits;
union of_sha224_or_256_hash_buffer {
union {
unsigned char bytes[64];
uint32_t words[64];
} buffer;
size_t bufferLength;
} *_iVars;
@private
bool _allowsSwappableMemory;
bool _calculated;
OF_RESERVE_IVARS(OFSHA224Or256Hash, 4)
}
@end
OF_ASSUME_NONNULL_END
|
Modified src/OFSHA384Or512Hash.h
from [825cb3a856]
to [e05082b6ff].
︙ | | |
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
-
+
|
{
@private
OFSecureData *_iVarsData;
@protected
struct {
uint64_t state[8];
uint64_t bits[2];
union of_sha384_or_512_hash_buffer {
union {
unsigned char bytes[128];
uint64_t words[80];
} buffer;
size_t bufferLength;
} *_iVars;
@private
bool _allowsSwappableMemory;
bool _calculated;
OF_RESERVE_IVARS(OFSHA384Or512Hash, 4)
}
@end
OF_ASSUME_NONNULL_END
|
Modified src/OFSerialization.h
from [4e7cb4c5a0]
to [e824a5f7ee].
︙ | | |
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
-
-
|
* file.
*/
#import "OFObject.h"
OF_ASSUME_NONNULL_BEGIN
#define OF_SERIALIZATION_NS @"https://objfw.nil.im/serialization"
@class OFXMLElement;
/**
* @protocol OFSerialization OFSerialization.h ObjFW/OFSerialization.h
*
* @brief A protocol for serializing objects.
*/
|
︙ | | |
36
37
38
39
40
41
42
43
44
|
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
+
+
+
+
+
+
+
+
|
* @brief Initializes the object with the specified XML element serialization.
*
* @param element An OFXMLElement with the serialized object
* @return An initialized object
*/
- (instancetype)initWithSerialization: (OFXMLElement *)element;
@end
#ifdef __cplusplus
extern "C" {
#endif
extern OFString *const OFSerializationNS;
#ifdef __cplusplus
}
#endif
OF_ASSUME_NONNULL_END
|
Added src/OFSerialization.m version [0a6892a6f3].
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
/*
* Copyright (c) 2008-2021 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#import "OFSerialization.h"
#import "OFString.h"
OFString *const OFSerializationNS = @"https://objfw.nil.im/serialization";
|
| | | | | | | | | | | | | | | | | |
Modified src/OFSet.m
from [b7d60ea604]
to [a3dd281791].
︙ | | |
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
|
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
|
-
+
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
if ([self isKindOfClass: [OFMutableSet class]])
element = [OFXMLElement elementWithName: @"OFMutableSet"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
else
element = [OFXMLElement elementWithName: @"OFSet"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
for (id <OFSerialization> object in self) {
void *pool2 = objc_autoreleasePoolPush();
[element addChild: object.XMLElementBySerializing];
objc_autoreleasePoolPop(pool2);
}
|
︙ | | |
Modified src/OFString+PathAdditions.h
from [5bff0ead4d]
to [0d70d05c92].
︙ | | |
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
-
-
-
-
-
-
|
* file.
*/
#import "OFString.h"
OF_ASSUME_NONNULL_BEGIN
#ifdef OF_AMIGAOS
# define OF_PATH_CURRENT_DIRECTORY @""
#else
# define OF_PATH_CURRENT_DIRECTORY @"."
#endif
#ifdef __cplusplus
extern "C" {
#endif
extern int _OFString_PathAdditions_reference;
#ifdef __cplusplus
}
#endif
|
︙ | | |
Modified src/OFString+Serialization.m
from [8faf6d47b7]
to [8e1b78d5c6].
︙ | | |
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
-
+
|
if (version == nil)
@throw [OFInvalidArgumentException exception];
if (version.unsignedLongLongValue != 1)
@throw [OFUnsupportedVersionException
exceptionWithVersion: version];
elements = [root elementsForNamespace: OF_SERIALIZATION_NS];
elements = [root elementsForNamespace: OFSerializationNS];
if (elements.count != 1)
@throw [OFInvalidArgumentException exception];
object = [[elements.firstObject objectByDeserializing] retain];
objc_autoreleasePoolPop(pool);
return [object autorelease];
}
@end
|
Modified src/OFString.m
from [afb8450add]
to [97ce83e21e].
︙ | | |
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
|
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
|
-
+
|
- (instancetype)initWithSerialization: (OFXMLElement *)element
{
void *pool = objc_autoreleasePoolPush();
OFString *stringValue;
@try {
if (![element.namespace isEqual: OF_SERIALIZATION_NS])
if (![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
if ([self isKindOfClass: [OFMutableString class]]) {
if (![element.name isEqual: @"OFMutableString"])
@throw [OFInvalidArgumentException exception];
} else {
if (![element.name isEqual: @"OFString"])
|
︙ | | |
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
|
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
|
-
+
|
if ([self isKindOfClass: [OFMutableString class]])
className = @"OFMutableString";
else
className = @"OFString";
element = [OFXMLElement elementWithName: className
namespace: OF_SERIALIZATION_NS
namespace: OFSerializationNS
stringValue: self];
[element retain];
objc_autoreleasePoolPop(pool);
return [element autorelease];
|
︙ | | |
Modified src/OFURL.m
from [753279e2cb]
to [8f125e31a5].
︙ | | |
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
|
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
|
-
+
|
- (instancetype)initWithSerialization: (OFXMLElement *)element
{
void *pool = objc_autoreleasePoolPush();
OFString *stringValue;
@try {
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
stringValue = element.stringValue;
} @catch (id e) {
[self release];
@throw e;
}
|
︙ | | |
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
|
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
|
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
element = [OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS
namespace: OFSerializationNS
stringValue: self.string];
[element retain];
objc_autoreleasePoolPop(pool);
return [element autorelease];
}
@end
|
Modified src/OFXMLAttribute.m
from [62ddc040cf]
to [21dca426df].
︙ | | |
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
-
+
|
{
self = [super of_init];
@try {
void *pool = objc_autoreleasePoolPush();
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
_name = [[element attributeForName: @"name"].stringValue copy];
_namespace = [[element attributeForName: @"namespace"]
.stringValue copy];
_stringValue = [[element attributeForName: @"stringValue"]
.stringValue copy];
|
︙ | | |
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
element = [OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[element addAttributeWithName: @"name" stringValue: _name];
if (_namespace != nil)
[element addAttributeWithName: @"namespace"
stringValue: _namespace];
[element addAttributeWithName: @"stringValue"
|
︙ | | |
Modified src/OFXMLCDATA.m
from [d5c3657cc1]
to [22eb5b46a5].
︙ | | |
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
-
+
|
{
self = [super of_init];
@try {
void *pool = objc_autoreleasePoolPush();
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
_CDATA = [element.stringValue copy];
objc_autoreleasePoolPop(pool);
} @catch (id e) {
[self release];
|
︙ | | |
132
133
134
135
136
137
138
139
140
141
142
143
144
|
132
133
134
135
136
137
138
139
140
141
142
143
144
|
-
+
|
return self.XMLString;
}
- (OFXMLElement *)XMLElementBySerializing
{
OFXMLElement *element =
[OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[element addChild: self];
return element;
}
@end
|
Modified src/OFXMLCharacters.m
from [e5ae18f07a]
to [f6eb447f0f].
︙ | | |
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
-
+
|
{
self = [super of_init];
@try {
void *pool = objc_autoreleasePoolPush();
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
_characters = [element.stringValue copy];
objc_autoreleasePoolPop(pool);
} @catch (id e) {
[self release];
|
︙ | | |
123
124
125
126
127
128
129
130
131
132
133
|
123
124
125
126
127
128
129
130
131
132
133
|
-
+
|
{
return _characters.stringByXMLEscaping;
}
- (OFXMLElement *)XMLElementBySerializing
{
return [OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS
namespace: OFSerializationNS
stringValue: _characters];
}
@end
|
Modified src/OFXMLComment.m
from [81bdd43784]
to [ba94b5bb12].
︙ | | |
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
-
+
|
{
self = [super of_init];
@try {
void *pool = objc_autoreleasePoolPush();
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
_text = [element.stringValue copy];
objc_autoreleasePoolPop(pool);
} @catch (id e) {
[self release];
|
︙ | | |
136
137
138
139
140
141
142
143
144
145
146
|
136
137
138
139
140
141
142
143
144
145
146
|
-
+
|
{
return [OFString stringWithFormat: @"<!--%@-->", _text];
}
- (OFXMLElement *)XMLElementBySerializing
{
return [OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS
namespace: OFSerializationNS
stringValue: _text];
}
@end
|
Modified src/OFXMLElement.m
from [75b5d65456]
to [7a0a61d375].
︙ | | |
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
|
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
|
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
void *pool = objc_autoreleasePoolPush();
OFXMLElement *attributesElement, *namespacesElement;
OFXMLElement *childrenElement;
OFEnumerator *keyEnumerator, *objectEnumerator;
OFString *key, *object;
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
_name = [[element attributeForName: @"name"].stringValue copy];
_namespace = [[element attributeForName: @"namespace"]
.stringValue copy];
_defaultNamespace = [[element attributeForName:
@"defaultNamespace"].stringValue copy];
attributesElement = [[element
elementForName: @"attributes"
namespace: OF_SERIALIZATION_NS] elementsForNamespace:
OF_SERIALIZATION_NS].firstObject;
namespace: OFSerializationNS] elementsForNamespace:
OFSerializationNS].firstObject;
namespacesElement = [[element
elementForName: @"namespaces"
namespace: OF_SERIALIZATION_NS] elementsForNamespace:
OF_SERIALIZATION_NS].firstObject;
namespace: OFSerializationNS] elementsForNamespace:
OFSerializationNS].firstObject;
childrenElement = [[element
elementForName: @"children"
namespace: OF_SERIALIZATION_NS] elementsForNamespace:
OF_SERIALIZATION_NS].firstObject;
namespace: OFSerializationNS] elementsForNamespace:
OFSerializationNS].firstObject;
_attributes = [attributesElement.objectByDeserializing
mutableCopy];
_namespaces = [namespacesElement.objectByDeserializing
mutableCopy];
_children = [childrenElement.objectByDeserializing
mutableCopy];
|
︙ | | |
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
|
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
|
-
+
-
+
-
+
-
+
|
- (OFXMLElement *)XMLElementBySerializing
{
void *pool = objc_autoreleasePoolPush();
OFXMLElement *element;
element = [OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
if (_name != nil)
[element addAttributeWithName: @"name" stringValue: _name];
if (_namespace != nil)
[element addAttributeWithName: @"namespace"
stringValue: _namespace];
if (_defaultNamespace != nil)
[element addAttributeWithName: @"defaultNamespace"
stringValue: _defaultNamespace];
if (_attributes != nil) {
OFXMLElement *attributesElement;
attributesElement =
[OFXMLElement elementWithName: @"attributes"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[attributesElement addChild:
_attributes.XMLElementBySerializing];
[element addChild: attributesElement];
}
if (_namespaces != nil) {
OFXMLElement *namespacesElement;
OFMutableDictionary *namespacesCopy =
[[_namespaces mutableCopy] autorelease];
[namespacesCopy removeObjectForKey:
@"http://www.w3.org/XML/1998/namespace"];
[namespacesCopy removeObjectForKey:
@"http://www.w3.org/2000/xmlns/"];
if (namespacesCopy.count > 0) {
namespacesElement =
[OFXMLElement elementWithName: @"namespaces"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[namespacesElement addChild:
namespacesCopy.XMLElementBySerializing];
[element addChild: namespacesElement];
}
}
if (_children != nil) {
OFXMLElement *childrenElement;
childrenElement =
[OFXMLElement elementWithName: @"children"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
[childrenElement addChild: _children.XMLElementBySerializing];
[element addChild: childrenElement];
}
[element retain];
objc_autoreleasePoolPop(pool);
|
︙ | | |
Modified src/OFXMLProcessingInstruction.m
from [443a5da79e]
to [f3e07ddc76].
︙ | | |
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
-
+
-
+
|
- (instancetype)initWithSerialization: (OFXMLElement *)element
{
@try {
void *pool = objc_autoreleasePoolPush();
OFXMLAttribute *targetAttr;
if (![element.name isEqual: self.className] ||
![element.namespace isEqual: OF_SERIALIZATION_NS])
![element.namespace isEqual: OFSerializationNS])
@throw [OFInvalidArgumentException exception];
targetAttr = [element attributeForName: @"target"
namespace: OF_SERIALIZATION_NS];
namespace: OFSerializationNS];
if (targetAttr.stringValue.length == 0)
@throw [OFInvalidArgumentException exception];
self = [self initWithTarget: targetAttr.stringValue
data: element.stringValue];
objc_autoreleasePoolPop(pool);
|
︙ | | |
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
-
+
|
{
return self.XMLString;
}
- (OFXMLElement *)XMLElementBySerializing
{
OFXMLElement *ret = [OFXMLElement elementWithName: self.className
namespace: OF_SERIALIZATION_NS
namespace: OFSerializationNS
stringValue: _data];
void *pool = objc_autoreleasePoolPush();
[ret addAttribute: [OFXMLAttribute attributeWithName: @"target"
stringValue: _target]];
objc_autoreleasePoolPop(pool);
return ret;
}
@end
|
Modified utils/ofarc/OFArc.m
from [6f8d6d31cd]
to [2272ddff5d].
︙ | | |
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
|
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
|
-
-
+
+
+
+
+
+
|
[sandbox unveilPath: remainingArguments.firstObject
permissions: @"r"];
if (files.count > 0)
for (OFString *path in files)
[sandbox unveilPath: path permissions: @"wc"];
else {
OFString *path = (outputDir != nil
? outputDir : OF_PATH_CURRENT_DIRECTORY);
OFString *path = outputDir;
if (path == nil)
path = [[OFFileManager defaultManager]
currentDirectoryPath];
/* We need 'r' to change the directory to it. */
[sandbox unveilPath: path permissions: @"rwc"];
}
sandbox.allowsUnveil = false;
[OFApplication of_activateSandbox: sandbox];
#endif
|
︙ | | |
Modified utils/ofhttp/OFHTTP.m
from [fa0717c415]
to [fd5b97783f].
︙ | | |
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
|
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
|
-
+
|
#ifdef OF_HAVE_PLUGINS
+ (void)initialize
{
if (self != [OFHTTP class])
return;
/* Opportunistically try loading ObjOpenSSL and ignore any errors. */
OFDlOpen(@LIB_PREFIX @"objopenssl" @LIB_SUFFIX, OF_RTLD_LAZY);
OFDLOpen(@LIB_PREFIX @"objopenssl" @LIB_SUFFIX, OFDLOpenFlagLazy);
}
#endif
- (instancetype)init
{
self = [super init];
|
︙ | | |
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
|
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
|
+
-
-
-
+
+
+
+
+
+
+
|
[OFApplication terminateWithStatus: 1];
break;
}
}
#ifdef OF_HAVE_SANDBOX
if (outputPath != nil)
[sandbox unveilPath: (outputPath != nil
? outputPath : OF_PATH_CURRENT_DIRECTORY)
permissions: (_continue ? @"rwc" : @"wc")];
[sandbox unveilPath: outputPath
permissions: (_continue ? @"rwc" : @"wc")];
else
[sandbox unveilPath: [[OFFileManger defaultManager]
currentDirectoryPath]
permissions: (_continue ? @"rwc" : @"wc")];
/* In case we use ObjOpenSSL for https later */
[sandbox unveilPath: @"/etc/ssl" permissions: @"r"];
sandbox.allowsUnveil = false;
[OFApplication of_activateSandbox: sandbox];
#endif
|
︙ | | |