summaryrefslogtreecommitdiff
path: root/bindings/objc/src/SwordBook.mm
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/objc/src/SwordBook.mm')
-rw-r--r--bindings/objc/src/SwordBook.mm152
1 files changed, 152 insertions, 0 deletions
diff --git a/bindings/objc/src/SwordBook.mm b/bindings/objc/src/SwordBook.mm
new file mode 100644
index 0000000..bcee1e4
--- /dev/null
+++ b/bindings/objc/src/SwordBook.mm
@@ -0,0 +1,152 @@
+/* SwordBook.mm - Sword API wrapper for GenBooks.
+
+ Copyright 2008 Manfred Bergmann
+ Based on code by Will Thimbleby
+
+ This program is free software; you can redistribute it and/or modify it under the terms of the
+ GNU General Public License as published by the Free Software Foundation version 2.
+
+ This program 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
+ General Public License for more details. (http://www.gnu.org/licenses/gpl.html)
+*/
+
+#import "SwordBook.h"
+#import "SwordModuleTreeEntry.h"
+
+@interface SwordBook ()
+
+- (SwordModuleTreeEntry *)_treeEntryForKey:(sword::TreeKeyIdx *)treeKey;
+
+@end
+
+@implementation SwordBook
+
+@synthesize contents;
+
+- (id)initWithName:(NSString *)aName swordManager:(SwordManager *)aManager {
+ self = [super initWithName:aName swordManager:aManager];
+ if(self) {
+ [self setContents:[NSMutableDictionary dictionary]];
+ }
+
+ return self;
+}
+
+- (id)initWithSWModule:(sword::SWModule *)aModule swordManager:(SwordManager *)aManager {
+ self = [super initWithSWModule:aModule swordManager:aManager];
+ if(self) {
+ [self setContents:[NSMutableDictionary dictionary]];
+ }
+
+ return self;
+}
+
+- (void)finalize {
+ [super finalize];
+}
+
+- (void)dealloc {
+ [self setContents:nil];
+
+ [super dealloc];
+}
+
+- (SwordModuleTreeEntry *)treeEntryForKey:(NSString *)treeKey {
+ SwordModuleTreeEntry * ret;
+
+ [moduleLock lock];
+ if(treeKey == nil) {
+ ret = [contents objectForKey:@"root"];
+ if(ret == nil) {
+ sword::TreeKeyIdx *tk = dynamic_cast<sword::TreeKeyIdx*>((sword::SWKey *)*(swModule));
+ ret = [self _treeEntryForKey:tk];
+ // add to content
+ [contents setObject:ret forKey:@"root"];
+ }
+ } else {
+ ret = [contents objectForKey:treeKey];
+ if(ret == nil) {
+ const char *keyStr = [treeKey UTF8String];
+ if(![self isUnicode]) {
+ keyStr = [treeKey cStringUsingEncoding:NSISOLatin1StringEncoding];
+ }
+ // position module
+ sword::SWKey *mkey = new sword::SWKey(keyStr);
+ swModule->setKey(mkey);
+ sword::TreeKeyIdx *key = dynamic_cast<sword::TreeKeyIdx*>((sword::SWKey *)*(swModule));
+ ret = [self _treeEntryForKey:key];
+ // add to content
+ [contents setObject:ret forKey:treeKey];
+ }
+ }
+ [moduleLock unlock];
+
+ return ret;
+}
+
+- (SwordModuleTreeEntry *)_treeEntryForKey:(sword::TreeKeyIdx *)treeKey {
+ SwordModuleTreeEntry *ret = [[[SwordModuleTreeEntry alloc] init] autorelease];
+
+ char *treeNodeName = (char *)treeKey->getText();
+ NSString *nName;
+
+ if(strlen(treeNodeName) == 0) {
+ nName = @"root";
+ } else {
+ // key encoding depends on module encoding
+ nName = [NSString stringWithUTF8String:treeNodeName];
+ if(!nName) {
+ nName = [NSString stringWithCString:treeNodeName encoding:NSISOLatin1StringEncoding];
+ }
+ }
+ // set name
+ [ret setKey:nName];
+ NSMutableArray *c = [NSMutableArray array];
+ [ret setContent:c];
+
+ // if this node has children, walk them
+ if(treeKey->hasChildren()) {
+ // get first child
+ treeKey->firstChild();
+ do {
+ NSString *subName;
+ // key encoding depends on module encoding
+ const char *textStr = treeKey->getText();
+ subName = [NSString stringWithUTF8String:textStr];
+ if(!subName) {
+ subName = [NSString stringWithCString:textStr encoding:NSISOLatin1StringEncoding];
+ }
+ if(subName) {
+ [c addObject:subName];
+ }
+ }
+ while(treeKey->nextSibling());
+ }
+
+ return ret;
+}
+
+- (void)testLoop {
+ SwordModuleTreeEntry *entry = [self treeEntryForKey:nil];
+ if([[entry content] count] > 0) {
+ for(NSString *subKey in [entry content]) {
+ entry = [self treeEntryForKey:subKey];
+ if([[entry content] count] > 0) {
+ } else {
+ DLog(@"Entry: %@", [entry key]);
+ }
+ }
+ } else {
+ DLog(@"Entry: %@", [entry key]);
+ }
+}
+
+#pragma mark - SwordModuleAccess
+
+- (long)entryCount {
+ // TODO: set value according to maximum entries here
+ return 1000;
+}
+
+@end