26 var _CPKeyedUnarchiverCannotDecodeObjectOfClassNameOriginalClassesSelector = 1 << 0,
27 _CPKeyedUnarchiverDidDecodeObjectSelector = 1 << 1,
28 _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector = 1 << 2,
29 _CPKeyedUnarchiverWillFinishSelector = 1 << 3,
30 _CPKeyedUnarchiverDidFinishSelector = 1 << 4,
33 var _CPKeyedArchiverNullString =
"$null",
35 _CPKeyedArchiverUIDKey =
"CP$UID",
37 _CPKeyedArchiverTopKey =
"$top",
38 _CPKeyedArchiverObjectsKey =
"$objects",
39 _CPKeyedArchiverArchiverKey =
"$archiver",
40 _CPKeyedArchiverVersionKey =
"$version",
42 _CPKeyedArchiverClassNameKey =
"$classname",
43 _CPKeyedArchiverClassesKey =
"$classes",
44 _CPKeyedArchiverClassKey =
"$class";
53 _CPKeyedArchiverValueClass = Nil;
103 unsigned _delegateSelectors;
113 CPArray _plistObjects;
131 _CPKeyedArchiverValueClass = [_CPKeyedArchiverValue class];
139 - (id)initForReadingWithData:(
CPData)data
148 _plistObject = [_archive objectForKey:_CPKeyedArchiverTopKey];
149 _plistObjects = [_archive objectForKey:_CPKeyedArchiverObjectsKey];
151 _replacementClasses =
new CFMutableDictionary();
162 + (id)unarchiveObjectWithData:(
CPData)aData
166 CPLog.error(
"Null data passed to -[CPKeyedUnarchiver unarchiveObjectWithData:].");
171 object = [unarchiver decodeObjectForKey:@"root"];
173 [unarchiver finishDecoding];
188 + (id)unarchiveObjectWithFile:(
CPString)aFilePath asynchronously:(BOOL)aFlag
198 return _plistObject.valueForKey(aKey) != nil;
204 var
object = _plistObject.valueForKey(aKey),
205 objectClass = (
object != nil) &&
object.
isa;
209 var keys =
object.keys(),
212 dictionary =
new CFMutableDictionary();
214 for (; index < count; ++index)
216 var key = keys[index];
218 dictionary.setValueForKey(key, _CPKeyedUnarchiverDecodeObjectAtIndex(
self,
object.valueForKey(key).valueForKey(_CPKeyedArchiverUIDKey)));
246 return f === nil ? 0.0 : f;
258 return d === nil ? 0.0 : d;
270 return i === nil ? 0 : i;
283 return CGPointFromString(
object);
285 return CGPointMakeZero();
298 return CGRectFromString(
object);
300 return CGRectMakeZero();
313 return CGSizeFromString(
object);
315 return CGSizeMakeZero();
325 var
object = _plistObject && _plistObject.valueForKey(aKey),
326 objectClass = (
object != nil) &&
object.
isa;
329 return _CPKeyedUnarchiverDecodeObjectAtIndex(
self,
object.valueForKey(_CPKeyedArchiverUIDKey));
334 else if (objectClass === _CPJavaScriptArray)
337 count =
object.length,
340 for (; index < count; ++index)
341 array[index] = _CPKeyedUnarchiverDecodeObjectAtIndex(
self,
object[index].valueForKey(_CPKeyedArchiverUIDKey));
364 var objectClass = data.isa;
375 - (void)finishDecoding
377 if (_delegateSelectors & _CPKeyedUnarchiverWillFinishSelector)
378 [_delegate unarchiverWillFinish:self];
380 if (_delegateSelectors & _CPKeyedUnarchiverDidFinishSelector)
381 [_delegate unarchiverDidFinish:self];
396 - (void)setDelegate:(
id)aDelegate
398 _delegate = aDelegate;
400 if ([_delegate respondsToSelector:
@selector(unarchiver:cannotDecodeObjectOfClassName:originalClasses:)])
401 _delegateSelectors |= _CPKeyedUnarchiverCannotDecodeObjectOfClassNameOriginalClassesSelector;
403 if ([_delegate respondsToSelector:
@selector(unarchiver:didDecodeObject:)])
404 _delegateSelectors |= _CPKeyedUnarchiverDidDecodeObjectSelector;
406 if ([_delegate respondsToSelector:
@selector(unarchiver:willReplaceObject:withObject:)])
407 _delegateSelectors |= _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector;
409 if ([_delegate respondsToSelector:
@selector(unarchiverWillFinish:)])
410 _delegateSelectors |= _CPKeyedUnarchiverWillFinishSelector;
412 if ([_delegate respondsToSelector:
@selector(unarchiverDidFinish:)])
413 _delegateSelectors |= _CPKeyedUnarchiverDidFinishSelector;
415 if ([_delegate respondsToSelector:
@selector(unarchiver:cannotDecodeObjectOfClassName:originalClasses:)])
419 - (void)setClass:(Class)aClass forClassName:(
CPString)aClassName
421 _replacementClasses.setValueForKey(aClassName, aClass);
426 return _replacementClasses.valueForKey(aClassName);
429 - (BOOL)allowsKeyedCoding
436 var _CPKeyedUnarchiverDecodeObjectAtIndex =
function(
self, anIndex)
438 var
object =
self._objects[anIndex];
442 if (
object ===
self._objects[0])
449 var plistObject =
self._plistObjects[anIndex],
450 plistObjectClass = plistObject.isa;
454 var plistClass =
self._plistObjects[plistObject.valueForKey(_CPKeyedArchiverClassKey).valueForKey(_CPKeyedArchiverUIDKey)],
455 className = plistClass.valueForKey(_CPKeyedArchiverClassNameKey),
456 classes = plistClass.valueForKey(_CPKeyedArchiverClassesKey),
457 theClass = [
self classForClassName:className];
465 theClass = [
self._delegate unarchiver:self cannotDecodeObjectOfClassName:className originalClasses:classes];
469 [
CPException raise:CPInvalidUnarchiveOperationException
format:@"-[CPKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (%@)", className];
471 var savedPlistObject =
self._plistObject;
473 self._plistObject = plistObject;
476 object = [theClass allocWithCoder:self];
479 self._objects[anIndex] = object;
481 var processedObject = [object initWithCoder:self];
483 self._plistObject = savedPlistObject;
485 if (processedObject !==
object)
487 if (
self._delegateSelectors & _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector)
488 [
self._delegate unarchiver:self willReplaceObject:object withObject:processedObject];
490 object = processedObject;
491 self._objects[anIndex] = processedObject;
494 processedObject = [object awakeAfterUsingCoder:self];
496 if (processedObject !==
object)
498 if (
self._delegateSelectors & _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector)
499 [
self._delegate unarchiver:self willReplaceObject:object withObject:processedObject];
501 object = processedObject;
502 self._objects[anIndex] = processedObject;
507 if (
self._delegateSelectors & _CPKeyedUnarchiverDidDecodeObjectSelector)
508 processedObject = [
self._delegate unarchiver:self didDecodeObject:object];
510 if (processedObject && processedObject !=
object)
512 if (
self._delegateSelectors & _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector)
513 [
self._delegate unarchiver:self willReplaceObject:object withObject:processedObject];
515 object = processedObject;
516 self._objects[anIndex] = processedObject;
522 self._objects[anIndex] =
object = plistObject;
526 if (
object === _CPKeyedArchiverNullString)
528 self._objects[anIndex] =
self._objects[0];
533 self._objects[anIndex] =
object = plistObject;
540 if ((
object != nil) && (
object.
isa === _CPKeyedArchiverValueClass))
541 object = [object JSObject];
Used to implement exception handling (creating & raising).
An object representation of nil.
void raise:format:(CPString aName, [format] CPString aFormat, [,] ...)
A Cappuccino wrapper for any data type.
id initForReadingWithData:(CPData data)
Unarchives objects created using CPKeyedArchiver.
A mutable key-value pair collection.
CPInvalidUnarchiveOperationException
An immutable string (collection of characters).
id decodeObjectForKey:(CPString aKey)
var CPKeyedUnarchiverDelegate_unarchiver_cannotDecodeObjectOfClassName_originalClasses_
Defines methods for use when archiving & restoring (enc/decoding).
var CPMutableDictionaryClass
A bridged object to native Javascript numbers.
function CPClassFromString(aClassName)