/*!
@header ECXMLControlDefaultAllocator
@abstract Module of Encore
@availability OS X, GNUstep
@copyright 2004, 2005, 2006 Oliver Langer
Author: Oliver Langer
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-------------------------------------------------------------------------
Modification history
27.11.05 ola initial version
22.08.06 ola license changed
-------------------------------------------------------------------------
*/
#include
#include
#include
@implementation ECXMLControlDefaultAllocatorRule
- (BOOL) mayActOn: (ECXMLControlContext *) aContext {
return [[[aContext event] eventId]
isEqual: [ECXMLControlEvent eventId_elementStarted]];
}
- (BOOL) actOn: (ECXMLControlContext *) aContext {
NSMutableDictionary *attributes;
Class classObject = nil;
NSAssert( [[[aContext event] eventId]
isEqual: [ECXMLControlEvent eventId_elementStarted]],
@"ECXMLControlDefaultAllocatorRule::actOn: May only react on \"start "\
"element\" events." );
EC_AUTORELEASEPOOL_BEGIN
/* look for attribute class */
attributes = [[aContext event] attributes];
if( nil != attributes ) {
NSString *classname = [attributes objectForKey: __CLASS_ATTRIBUTE];
if( nil != classname ) {
[attributes removeObjectForKey: classname];
// try to fetch the class object whose name equals "classname"
classObject = NSClassFromString( classname );
}
}
if( nil == classObject ) {
// now try to get the
classObject = NSClassFromString( [[aContext event] elementName] );
}
if( nil != classObject ) {
id userObject = [[[classObject alloc] init] autorelease];
[[aContext state] pushUserObject: userObject];
} else {
[[[ECIllegalArgumentException alloc]
initWithArgumentInfo: [[[NSString alloc]
initWithFormat: @"ECXMLControlDefaultAllocatorRule::actOn:"\
" Unable to find class for %@", [[aContext event] elementName]]
autorelease]]
raise];
}
EC_AUTORELEASEPOOL_END
return YES;
}
@end