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;
104 unsigned _delegateSelectors;
114 CPArray _plistObjects;
132 _CPKeyedArchiverValueClass = [_CPKeyedArchiverValue class];
140 - (id)initForReadingWithData:(
CPData)data
149 _plistObject = [_archive objectForKey:_CPKeyedArchiverTopKey];
150 _plistObjects = [_archive objectForKey:_CPKeyedArchiverObjectsKey];
152 _replacementClasses =
new CFMutableDictionary();
163 + (id)unarchiveObjectWithData:(
CPData)aData
167 CPLog.error(
"Null data passed to -[CPKeyedUnarchiver unarchiveObjectWithData:].");
171 var unarchiver = [[
self alloc] initForReadingWithData:aData],
172 object = [unarchiver decodeObjectForKey:@"root"];
174 [unarchiver finishDecoding];
189 + (id)unarchiveObjectWithFile:(
CPString)aFilePath asynchronously:(BOOL)aFlag
199 return _plistObject.valueForKey(aKey) != nil;
205 var
object = _plistObject.valueForKey(aKey),
206 objectClass = (
object != nil) &&
object.
isa;
210 var keys =
object.keys(),
213 dictionary =
new CFMutableDictionary();
215 for (; index < count; ++index)
217 var key = keys[index];
219 dictionary.setValueForKey(key, _CPKeyedUnarchiverDecodeObjectAtIndex(
self,
object.valueForKey(key).valueForKey(_CPKeyedArchiverUIDKey)));
247 return f === nil ? 0.0 : f;
259 return d === nil ? 0.0 : d;
271 return i === nil ? 0 : i;
284 return CGPointFromString(
object);
286 return CGPointMakeZero();
299 return CGRectFromString(
object);
301 return CGRectMakeZero();
314 return CGSizeFromString(
object);
316 return CGSizeMakeZero();
326 var
object = _plistObject.valueForKey(aKey),
327 objectClass = (
object != nil) &&
object.
isa;
330 return _CPKeyedUnarchiverDecodeObjectAtIndex(
self,
object.valueForKey(_CPKeyedArchiverUIDKey));
335 else if (objectClass === _CPJavaScriptArray)
338 count =
object.length,
341 for (; index < count; ++index)
342 array[index] = _CPKeyedUnarchiverDecodeObjectAtIndex(
self,
object[index].valueForKey(_CPKeyedArchiverUIDKey));
365 var objectClass = data.isa;
376 - (void)finishDecoding
378 if (_delegateSelectors & _CPKeyedUnarchiverWillFinishSelector)
379 [_delegate unarchiverWillFinish:self];
381 if (_delegateSelectors & _CPKeyedUnarchiverDidFinishSelector)
382 [_delegate unarchiverDidFinish:self];
397 - (void)setDelegate:(
id)aDelegate
399 _delegate = aDelegate;
401 if ([_delegate respondsToSelector:
@selector(unarchiver:cannotDecodeObjectOfClassName:originalClasses:)])
402 _delegateSelectors |= _CPKeyedUnarchiverCannotDecodeObjectOfClassNameOriginalClassesSelector;
404 if ([_delegate respondsToSelector:
@selector(unarchiver:didDecodeObject:)])
405 _delegateSelectors |= _CPKeyedUnarchiverDidDecodeObjectSelector;
407 if ([_delegate respondsToSelector:
@selector(unarchiver:willReplaceObject:withObject:)])
408 _delegateSelectors |= _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector;
410 if ([_delegate respondsToSelector:
@selector(unarchiverWillFinish:)])
411 _delegateSelectors |= _CPKeyedUnarchiverWillFinishSelector;
413 if ([_delegate respondsToSelector:
@selector(unarchiverDidFinish:)])
414 _delegateSelectors |= _CPKeyedUnarchiverDidFinishSelector;
416 if ([_delegate respondsToSelector:
@selector(unarchiver:cannotDecodeObjectOfClassName:originalClasses:)])
420 - (void)setClass:(Class)aClass forClassName:(
CPString)aClassName
422 _replacementClasses.setValueForKey(aClassName, aClass);
427 return _replacementClasses.valueForKey(aClassName);
430 - (BOOL)allowsKeyedCoding
437 var _CPKeyedUnarchiverDecodeObjectAtIndex =
function(
self, anIndex)
439 var
object =
self._objects[anIndex];
443 if (
object ===
self._objects[0])
450 var plistObject =
self._plistObjects[anIndex],
451 plistObjectClass = plistObject.isa;
455 var plistClass =
self._plistObjects[plistObject.valueForKey(_CPKeyedArchiverClassKey).valueForKey(_CPKeyedArchiverUIDKey)],
456 className = plistClass.valueForKey(_CPKeyedArchiverClassNameKey),
457 classes = plistClass.valueForKey(_CPKeyedArchiverClassesKey),
458 theClass = [
self classForClassName:className];
466 theClass = [
self._delegate unarchiver:self cannotDecodeObjectOfClassName:className originalClasses:classes];
470 [
CPException raise:CPInvalidUnarchiveOperationException
format:@"-[CPKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (%@)", className];
472 var savedPlistObject =
self._plistObject;
474 self._plistObject = plistObject;
477 object = [theClass allocWithCoder:self];
480 self._objects[anIndex] = object;
482 var processedObject = [object initWithCoder:self];
484 self._plistObject = savedPlistObject;
486 if (processedObject !==
object)
488 if (
self._delegateSelectors & _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector)
489 [
self._delegate unarchiver:self willReplaceObject:object withObject:processedObject];
491 object = processedObject;
492 self._objects[anIndex] = processedObject;
495 processedObject = [object awakeAfterUsingCoder:self];
497 if (processedObject !==
object)
499 if (
self._delegateSelectors & _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector)
500 [
self._delegate unarchiver:self willReplaceObject:object withObject:processedObject];
502 object = processedObject;
503 self._objects[anIndex] = processedObject;
508 if (
self._delegateSelectors & _CPKeyedUnarchiverDidDecodeObjectSelector)
509 processedObject = [
self._delegate unarchiver:self didDecodeObject:object];
511 if (processedObject && processedObject !=
object)
513 if (
self._delegateSelectors & _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector)
514 [
self._delegate unarchiver:self willReplaceObject:object withObject:processedObject];
516 object = processedObject;
517 self._objects[anIndex] = processedObject;
523 self._objects[anIndex] =
object = plistObject;
527 if (
object === _CPKeyedArchiverNullString)
529 self._objects[anIndex] =
self._objects[0];
534 self._objects[anIndex] =
object = plistObject;
541 if ((
object != nil) && (
object.
isa === _CPKeyedArchiverValueClass))
542 object = [object JSObject];