From 0ef7f532506266f9d284584946b1d373cc6142ab Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Sun, 5 Jul 2009 08:35:44 -0700 Subject: [PATCH] Fix for throwing a proper exception when class isn't defined in an archive. Reviewed by me. --- Foundation/CPKeyedUnarchiver.j | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Foundation/CPKeyedUnarchiver.j b/Foundation/CPKeyedUnarchiver.j index 0bf92f2f6..b646db995 100644 --- a/Foundation/CPKeyedUnarchiver.j +++ b/Foundation/CPKeyedUnarchiver.j @@ -24,11 +24,14 @@ @import "CPCoder.j" -var _CPKeyedUnarchiverCannotDecodeObjectOfClassNameOriginalClassesSelector = 1, - _CPKeyedUnarchiverDidDecodeObjectSelector = 1 << 1, - _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector = 1 << 2, - _CPKeyedUnarchiverWillFinishSelector = 1 << 3, - _CPKeyedUnarchiverDidFinishSelector = 1 << 4; +CPInvalidUnarchiveOperationException = @"CPInvalidUnarchiveOperationException"; + +var _CPKeyedUnarchiverCannotDecodeObjectOfClassNameOriginalClassesSelector = 1 << 0, + _CPKeyedUnarchiverDidDecodeObjectSelector = 1 << 1, + _CPKeyedUnarchiverWillReplaceObjectWithObjectSelector = 1 << 2, + _CPKeyedUnarchiverWillFinishSelector = 1 << 3, + _CPKeyedUnarchiverDidFinishSelector = 1 << 4, + CPKeyedUnarchiverDelegate_unarchiver_cannotDecodeObjectOfClassName_originalClasses_ = 1 << 5; var _CPKeyedArchiverNullString = "$null" @@ -384,6 +387,9 @@ var _CPKeyedUnarchiverArrayClass = Ni if ([_delegate respondsToSelector:@selector(unarchiverDidFinish:)]) _delegateSelectors |= _CPKeyedUnarchiverDidFinishSelector; + + if ([_delegate respondsToSelector:@selector(unarchiver:cannotDecodeObjectOfClassName:originalClasses:)]) + _delegateSelectors |= CPKeyedUnarchiverDelegate_unarchiver_cannotDecodeObjectOfClassName_originalClasses_; } - (void)setClass:(Class)aClass forClassName:(CPString)aClassName @@ -426,6 +432,12 @@ var _CPKeyedUnarchiverDecodeObjectAtIndex = function(self, anIndex) if (!theClass) theClass = CPClassFromString(className); + if (!theClass && (self._delegateSelectors & CPKeyedUnarchiverDelegate_unarchiver_cannotDecodeObjectOfClassName_originalClasses_)) + theClass = [_delegate unarchiver:self cannotDecodeObjectOfClassName:className originalClasses:classes]; + + if (!theClass) + [CPException raise:CPInvalidUnarchiveOperationException reason:@"-[CPKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (" + className + @")"]; + var savedPlistObject = self._plistObject; self._plistObject = plistObject;