Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/woip/app/SearchView.m
diff options
context:
space:
mode:
Diffstat (limited to 'woip/app/SearchView.m')
-rw-r--r--woip/app/SearchView.m179
1 files changed, 179 insertions, 0 deletions
diff --git a/woip/app/SearchView.m b/woip/app/SearchView.m
new file mode 100644
index 0000000..9936136
--- /dev/null
+++ b/woip/app/SearchView.m
@@ -0,0 +1,179 @@
+#import "SearchView.h"
+#import "WikiApp.h"
+
+#define MAXRES 10
+
+int nresults = 0;
+uint32_t blocks[MAXRES];
+char *matches[MAXRES];
+char *buf;
+
+bool chandleResult(char *s) {
+ NSLog(@"chandleResult: %s", s);
+ buf = xalloc(MAXSTR * sizeof(char));
+ strcpy(buf, s);
+
+ NSLog(@"buf: 0x%x, %s", buf, buf);
+
+ char *blockpos = strrchr(buf, ' ');
+ int c;
+
+ if(nresults >= MAXRES) return false;
+
+ if(blockpos) {
+ *(blockpos - 1) = '\0';
+ blockpos++;
+
+ blocks[nresults] = atoi(blockpos);
+
+ matches[nresults] = buf;
+ } else
+ fatal("invalid: '%s'", buf);
+
+ NSLog(@"chandleResult returning...");
+ return ++nresults < MAXRES;
+}
+
+void zeroResults() {
+ int i;
+ for(i = 0; i < nresults; i++) free(matches[i]);
+ nresults = 0;
+}
+int numResults() { return nresults; }
+char *resultAt(int i) { return matches[i]; }
+uint32_t blockAt(int i) { return blocks[i]; }
+
+@implementation SearchView
+
+-(void) initMatches {
+ int i;
+ for(i = 0; i < MAXRES; i++)
+ matches[i] = xalloc(MAXSTR * sizeof(char));
+ buf = NULL;
+}
+
+-(id) initWithFrame: (struct CGRect) frame
+{
+ self = [super initWithFrame: frame];
+
+ curNeedle = xalloc(MAXSTR * sizeof(char));
+ [self initMatches];
+ sthread = nil;
+ lock = [[NSRecursiveLock alloc] init];
+
+ struct CGRect rect = [UIHardware fullScreenApplicationContentRect];
+ //TODO: re-enable me when I want progress bar
+ //table = [[UICompletionTable alloc] initWithFrame: CGRectMake(0, 0, frame.size.width, frame.size.height - 240)];
+ table = [[UICompletionTable alloc] initWithFrame: CGRectMake(0, 0, frame.size.width, frame.size.height - 215)];
+
+ [table setDelegate: self];
+
+ [self addSubview: table];
+
+ prog = [[UIProgressBar alloc] initWithFrame: CGRectMake(0, 180, 320, 20)];
+ [prog setStyle: 0];
+ [prog setProgress: 1.0];
+ //[self addSubview: prog];
+ //TODO: re-enable above to get progress bar
+
+ kbrd = [[UIKeyboard alloc] initWithFrame: CGRectMake(0, 200, 320, 480)];
+ [self addSubview: kbrd];
+
+ dump = xalloc(sizeof(wp_dump));
+
+ load_dump(dump,
+ "/var/root/wp/processed",
+ "/var/root/wp/locate.db",
+ "/var/root/wp/locate.prefixdb",
+ "/var/root/wp/blocks.db");
+
+ updater = [NSTimer scheduledTimerWithTimeInterval: 1
+ target: self
+ selector: @selector(refreshResults:)
+ userInfo: nil
+ repeats: YES];
+
+ return self;
+}
+
+-(void) stopSearch {
+ NSLog(@"stopSearch");
+ kill_search();
+ while(sthread && [sthread isExecuting]) {
+ //usleep(100000);
+ //NSLog(@"waiting for sthread");
+ }
+}
+
+
+-(void) runSearch {
+ NSLog(@"runSearch with needle: '%s'", curNeedle);
+ NSAutoreleasePool* pool = [NSAutoreleasePool new];
+ search(&dump->index, curNeedle, &chandleResult, NULL, true, true);
+ needRefresh = true;
+ NSLog(@"search done");
+ [pool release];
+}
+
+-(void) refreshResults: (NSTimer *) timer {
+ NSLog(@"refreshResults");
+ [lock lock];
+ if(needRefresh || (sthread && [sthread isExecuting])) {
+ [table reloadData];
+ if(needRefresh) needRefresh = false;
+ }
+ double d;
+ search_progress(&dump->index, &d);
+ [prog setProgress: d];
+ [prog updateIfNecessary];
+ [lock unlock];
+}
+
+-(void) updateResults {
+ NSLog(@"Updating results for '%@'", needle);
+ [self stopSearch];
+ zeroResults();
+ curResults = 0;
+ needRefresh = false;
+
+ /* TODO: keep the table results that match the new needle */
+ [table reloadData];
+ [prog setProgress: 0.0];
+
+ strncpy(curNeedle, [[needle capitalizedString] UTF8String], MAXSTR);
+
+ sthread = [[NSThread alloc] initWithTarget: self selector: @selector(runSearch) object: nil];
+ [sthread start];
+}
+
+-(int) numberOfCompletionsInTable:(UICompletionTable *) t {
+ return numResults();
+}
+
+-(UITableCell *) table:(UITable *)t completionAtIndex: (int) index {
+ return [NSString stringWithUTF8String: resultAt(index)];
+}
+
+-(void) table: (UICompletionTable *) t didSelectCompletionAtIndex: (int) i {
+ [aview loadArticle: [NSString stringWithUTF8String: resultAt(i)] fromBlock: blockAt(i)];
+ [parent switchToArticle];
+}
+
+- (void) setParent: (WikiApp *) w {
+ parent = w;
+}
+
+-(void) setNeedle: (NSString *) s {
+ [lock lock];
+ needle = s;
+
+ if([s length] > 0 && [s characterAtIndex: 0] != ' ')
+ [self updateResults];
+ [lock unlock];
+}
+
+- (void) setArticleView: (ArticleView *) a {
+ aview = a;
+ [aview setDump: dump];
+}
+@end