Overview
Comment: | Add serialization and deserialization to OFDataArray. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
bfa01e9b5c527e68594fdc83d51a9850 |
User & Date: | js on 2011-06-28 21:07:31 |
Other Links: | manifest | tags |
Context
2011-06-28
| ||
22:20 | Use isa as class for the copy where useful. check-in: 6d3b3d0468 user: js tags: trunk | |
21:07 | Add serialization and deserialization to OFDataArray. check-in: bfa01e9b5c user: js tags: trunk | |
18:14 | Use floats for of_point_t and of_dimension_t. check-in: 722f0808e8 user: js tags: trunk | |
Changes
Modified src/OFDataArray.h from [bb04b4c706] to [a9d438e321].
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | * 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 "OFObject.h" @class OFString; @class OFURL; /** * \brief A class for storing arbitrary data in an array. * * If you plan to store large hunks of data, you should consider using * OFBigDataArray, which allocates the memory in pages rather than in bytes. */ | > > > > | | 11 12 13 14 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 | * 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 "OFObject.h" #import "OFSerialization.h" @class OFString; @class OFURL; /** * \brief A class for storing arbitrary data in an array. * * If you plan to store large hunks of data, you should consider using * OFBigDataArray, which allocates the memory in pages rather than in bytes. * * For security reasons, serialization and deserialization is only implemented * for OFDataArrays with item size 1. */ @interface OFDataArray: OFObject <OFCopying, OFComparing, OFSerialization> { char *data; size_t count; size_t itemSize; } #ifdef OF_HAVE_PROPERTIES |
︙ | ︙ |
Modified src/OFDataArray.m from [57d47bf4a5] to [3b5c7f98e9].
︙ | ︙ | |||
21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <limits.h> #import "OFDataArray.h" #import "OFString.h" #import "OFFile.h" #import "OFURL.h" #import "OFHTTPRequest.h" #import "OFAutoreleasePool.h" #import "OFHTTPRequestFailedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidEncodingException.h" #import "OFNotImplementedException.h" #import "OFOutOfMemoryException.h" | > | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <limits.h> #import "OFDataArray.h" #import "OFString.h" #import "OFFile.h" #import "OFURL.h" #import "OFHTTPRequest.h" #import "OFXMLElement.h" #import "OFAutoreleasePool.h" #import "OFHTTPRequestFailedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidEncodingException.h" #import "OFNotImplementedException.h" #import "OFOutOfMemoryException.h" |
︙ | ︙ | |||
167 168 169 170 171 172 173 174 175 176 177 178 179 180 | itemSize = 1; if (!of_base64_decode(self, [string cString], [string cStringLength])) { Class c = isa; [self release]; @throw [OFInvalidEncodingException newWithClass: c]; } return self; } - (size_t)count { return count; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 168 169 170 171 172 173 174 175 176 177 178 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 208 209 210 211 | itemSize = 1; if (!of_base64_decode(self, [string cString], [string cStringLength])) { Class c = isa; [self release]; @throw [OFInvalidEncodingException newWithClass: c]; } return self; } - initWithSerialization: (OFXMLElement*)element { self = [super init]; itemSize = 1; @try { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFString *stringValue; if (![[element name] isEqual: [self className]] || ![[element namespace] isEqual: OF_SERIALIZATION_NS]) @throw [OFInvalidArgumentException newWithClass: isa selector: _cmd]; stringValue = [element stringValue]; if (!of_base64_decode(self, [stringValue cString], [stringValue cStringLength])) @throw [OFInvalidEncodingException newWithClass: isa]; [pool release]; } @catch (id e) { [self release]; @throw e; } return self; } - (size_t)count { return count; |
︙ | ︙ | |||
411 412 413 414 415 416 417 418 419 420 421 422 423 424 | @try { [file writeNBytes: count * itemSize fromBuffer: data]; } @finally { [file release]; } } @end @implementation OFBigDataArray - (void)addItem: (const void*)item { size_t newSize, lastPageByte; | > > > > > > > > > > > > > > > > > > > > > > > > > | 442 443 444 445 446 447 448 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 | @try { [file writeNBytes: count * itemSize fromBuffer: data]; } @finally { [file release]; } } - (OFXMLElement*)XMLElementBySerializing { OFAutoreleasePool *pool; OFXMLElement *element; if (itemSize != 1) @throw [OFNotImplementedException newWithClass: isa selector: _cmd]; pool = [[OFAutoreleasePool alloc] init]; element = [OFXMLElement elementWithName: [self className] namespace: OF_SERIALIZATION_NS stringValue: of_base64_encode(data, count * itemSize)]; [element retain]; @try { [pool release]; } @finally { [element autorelease]; } return element; } @end @implementation OFBigDataArray - (void)addItem: (const void*)item { size_t newSize, lastPageByte; |
︙ | ︙ |
Modified tests/OFSerializationTests.m from [eec9b3e1a8] to [43de409da6].
︙ | ︙ | |||
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #import "OFString.h" #import "OFArray.h" #import "OFDictionary.h" #import "OFList.h" #import "OFNumber.h" #import "OFDate.h" #import "OFURL.h" #import "OFAutoreleasePool.h" #import "OFXMLElement.h" #import "TestsAppDelegate.h" static OFString *module = @"OFSerialization"; @implementation TestsAppDelegate (SerializationTests) - (void)serializationTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFMutableDictionary *d = [OFMutableDictionary dictionary]; OFMutableArray *a = [OFMutableArray array]; OFList *l = [OFList list]; OFString *s; [a addObject: @"Qu\"xbar\ntest"]; [a addObject: [OFNumber numberWithInt: 1234]]; [a addObject: [OFMutableString stringWithString: @"asd"]]; [a addObject: [OFDate dateWithTimeIntervalSince1970: 1234 microseconds: 5678]]; | > > | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #import "OFString.h" #import "OFArray.h" #import "OFDictionary.h" #import "OFList.h" #import "OFNumber.h" #import "OFDate.h" #import "OFURL.h" #import "OFDataArray.h" #import "OFAutoreleasePool.h" #import "OFXMLElement.h" #import "TestsAppDelegate.h" static OFString *module = @"OFSerialization"; @implementation TestsAppDelegate (SerializationTests) - (void)serializationTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFMutableDictionary *d = [OFMutableDictionary dictionary]; OFMutableArray *a = [OFMutableArray array]; OFList *l = [OFList list]; OFDataArray *da = [OFDataArray dataArray]; OFString *s; [a addObject: @"Qu\"xbar\ntest"]; [a addObject: [OFNumber numberWithInt: 1234]]; [a addObject: [OFMutableString stringWithString: @"asd"]]; [a addObject: [OFDate dateWithTimeIntervalSince1970: 1234 microseconds: 5678]]; |
︙ | ︙ | |||
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | [l appendObject: [OFURL URLWithString: @"https://webkeks.org/"]]; [l appendObject: [OFXMLElement elementWithXMLString: @"<x><y/><![CDATA[<]]></x>"]]; [d setObject: @"list" forKey: l]; TEST(@"-[stringBySerializing]", (s = [d stringBySerializing]) && [s isEqual: [OFString stringWithContentsOfFile: @"serialization.xml"]]) TEST(@"-[objectByDeserializing]", [[s objectByDeserializing] isEqual: d]) [pool drain]; } @end | > > > > > | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | [l appendObject: [OFURL URLWithString: @"https://webkeks.org/"]]; [l appendObject: [OFXMLElement elementWithXMLString: @"<x><y/><![CDATA[<]]></x>"]]; [d setObject: @"list" forKey: l]; [da addNItems: 39 fromCArray: "0123456789:;<ABCDEFGHJIKLMNOPQRSTUVWXYZ"]; [d setObject: @"data" forKey: da]; TEST(@"-[stringBySerializing]", (s = [d stringBySerializing]) && [s isEqual: [OFString stringWithContentsOfFile: @"serialization.xml"]]) TEST(@"-[objectByDeserializing]", [[s objectByDeserializing] isEqual: d]) [pool drain]; } @end |
Modified tests/serialization.xml from [7e037e6365] to [e609429c3c].
︙ | ︙ | |||
69 70 71 72 73 74 75 76 77 | </object> <key> <OFString>Blub</OFString> </key> <object> <OFString>B"la</OFString> </object> </OFMutableDictionary> </serialization> | > > > > > > | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | </object> <key> <OFString>Blub</OFString> </key> <object> <OFString>B"la</OFString> </object> <key> <OFDataArray>MDEyMzQ1Njc4OTo7PEFCQ0RFRkdISklLTE1OT1BRUlNUVVZXWFla</OFDataArray> </key> <object> <OFString>data</OFString> </object> </OFMutableDictionary> </serialization> |