30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
-
+
|
#endif
#import "OFString.h"
#import "OFString_UTF8.h"
#import "OFString_UTF8+Private.h"
#import "OFArray.h"
#import "OFDictionary.h"
#import "OFDataArray.h"
#import "OFData.h"
#import "OFLocalization.h"
#ifdef OF_HAVE_FILES
# import "OFFile.h"
# import "OFFileManager.h"
#endif
#import "OFURL.h"
#ifdef OF_HAVE_SOCKETS
|
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
|
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
|
-
-
-
-
-
-
-
-
-
+
-
-
+
-
-
+
+
+
+
+
+
-
+
+
+
|
return [self initWithContentsOfURL: URL
encoding: OF_STRING_ENCODING_AUTODETECT];
}
- initWithContentsOfURL: (OFURL *)URL
encoding: (of_string_encoding_t)encoding
{
void *pool;
OFString *scheme;
# ifdef OF_HAVE_FILES
Class c = [self class];
# endif
[self release];
pool = objc_autoreleasePoolPush();
void *pool = objc_autoreleasePoolPush();
scheme = [URL scheme];
OFString *scheme = [URL scheme];
# ifdef OF_HAVE_FILES
if ([scheme isEqual: @"file"]) {
if (encoding == OF_STRING_ENCODING_AUTODETECT)
encoding = OF_STRING_ENCODING_UTF_8;
self = [[c alloc] initWithContentsOfFile: [URL path]
encoding: encoding];
self = [self initWithContentsOfFile: [URL path]
encoding: encoding];
} else
# endif
# ifdef OF_HAVE_SOCKETS
if ([scheme isEqual: @"http"] || [scheme isEqual: @"https"]) {
bool mutable = [self isKindOfClass: [OFMutableString class]];
OFHTTPClient *client = [OFHTTPClient client];
OFHTTPRequest *request = [OFHTTPRequest requestWithURL: URL];
OFHTTPResponse *response = [client performRequest: request];
if ([response statusCode] != 200)
@throw [OFHTTPRequestFailedException
exceptionWithRequest: request
response: response];
[self release];
if (mutable)
self = [[response string] retain];
self = [[response string] mutableCopy];
else
self = [[response string] copy];
} else
# endif
@throw [OFUnsupportedProtocolException exceptionWithURL: URL];
objc_autoreleasePoolPop(pool);
return self;
|
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
|
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
|
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
|
}
[JSON makeImmutable];
return JSON;
}
- (OFDataArray *)messagePackRepresentation
- (OFData *)messagePackRepresentation
{
OFDataArray *data;
OFMutableData *data;
size_t length;
length = [self UTF8StringLength];
if (length <= 31) {
uint8_t tmp = 0xA0 | ((uint8_t)length & 0x1F);
data = [OFDataArray dataArrayWithItemSize: 1
capacity: length + 1];
data = [OFMutableData dataWithItemSize: 1
capacity: length + 1];
[data addItem: &tmp];
} else if (length <= UINT8_MAX) {
uint8_t type = 0xD9;
uint8_t tmp = (uint8_t)length;
data = [OFDataArray dataArrayWithItemSize: 1
capacity: length + 2];
data = [OFMutableData dataWithItemSize: 1
capacity: length + 2];
[data addItem: &type];
[data addItem: &tmp];
} else if (length <= UINT16_MAX) {
uint8_t type = 0xDA;
uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)length);
data = [OFDataArray dataArrayWithItemSize: 1
capacity: length + 3];
data = [OFMutableData dataWithItemSize: 1
capacity: length + 3];
[data addItem: &type];
[data addItems: &tmp
count: sizeof(tmp)];
} else if (length <= UINT32_MAX) {
uint8_t type = 0xDB;
uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)length);
data = [OFDataArray dataArrayWithItemSize: 1
capacity: length + 5];
data = [OFMutableData dataWithItemSize: 1
capacity: length + 5];
[data addItem: &type];
[data addItems: &tmp
count: sizeof(tmp)];
} else
@throw [OFOutOfRangeException exception];
|