1
0
mirror of https://github.com/thes3m/XNI synced 2024-12-26 13:26:06 +01:00

86 lines
2.1 KiB
Objective-C

//
// ContentReader.m
// XNI
//
// Created by Matej Jan on 10.9.10.
// Copyright 2010 Retronator. All rights reserved.
//
#import "ContentReader.h"
#import "Retronator.Xni.Framework.Content.h"
#import "Retronator.Xni.Framework.Content.Pipeline.h"
#import "ContentManager+Internal.h"
@implementation ContentReader
- (id) initWithContentManager:(ContentManager *)theContentManager Content:(id)theContent {
if (self = [super init]) {
contentManager = theContentManager;
contentStack = [[NSMutableArray alloc] init];
[contentStack addObject:theContent];
sharedResources = CFDictionaryCreateMutable(NULL, 0, NULL, &kCFTypeDictionaryValueCallBacks);
}
return self;
}
@synthesize contentManager;
- (id) content {
return [contentStack lastObject];
}
- (id) readObjectFrom:(id)source {
// Push the source onto the content stack.
[contentStack addObject:source];
id result = nil;
if ([source isKindOfClass:[ExternalReference class]]) {
ExternalReference *externalReference = (ExternalReference*)source;
// We should load the item with content manager.
result = [[contentManager load:externalReference.name fromFile:externalReference.filename] autorelease]; // TODO: Be sure to remove this release when content manager is coded correctly.
} else {
// Get the correct reader for item.
ContentTypeReader *typeReader = [contentManager.readerManager getTypeReaderFor:[source class]];
// Read the object.
result = [typeReader readFromInput:self into:nil];
}
// Return to previous content on the stack.
[contentStack removeLastObject];
return result;
}
- (id) readSharedResourceFrom:(id)source {
if (!source) {
return nil;
}
// See if the resource has already been loaded.
id resource;
void *resourcePointer = nil;
CFDictionaryGetValueIfPresent(sharedResources, source, resourcePointer);
resource = (id)resourcePointer;
if (!resource) {
resource = [self readObjectFrom:source];
CFDictionarySetValue(sharedResources, source, resource);
}
return resource;
}
- (void) dealloc
{
CFRelease(sharedResources);
[contentStack release];
[super dealloc];
}
@end