diff --git a/jni/pjproject-android/.svn/pristine/2d/2d306888182175955e11dc0380eeaae20a303801.svn-base b/jni/pjproject-android/.svn/pristine/2d/2d306888182175955e11dc0380eeaae20a303801.svn-base
new file mode 100644
index 0000000..a3be41b
--- /dev/null
+++ b/jni/pjproject-android/.svn/pristine/2d/2d306888182175955e11dc0380eeaae20a303801.svn-base
@@ -0,0 +1,335 @@
+/* $Id$ */
+/* 
+ * Copyright (C) 2010-2011 Teluu Inc. (http://www.teluu.com)
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
+ */
+#import "RootViewController.h"
+#import "gui.h"
+#import "systest.h"
+
+/* Sleep interval duration, change to shorter duration for better
+ * interaction but make sure there is enough time for the other
+ * thread to do what it's supposed to do
+ */
+#define SLEEP_INTERVAL 0.5
+
+@implementation RootViewController
+@synthesize titles;
+@synthesize menus;
+@synthesize testView;
+
+RootViewController	*view;
+
+bool			systest_initialized;
+bool			thread_quit;
+gui_menu		*gmenu;
+int			section;
+int			row;
+const char		*ctitle;
+const char		*cmsg; 
+enum gui_flag		cflag;
+
+pj_status_t gui_init(gui_menu *menu)
+{
+    PJ_UNUSED_ARG(menu);
+    return PJ_SUCCESS;
+}
+
+/* Run GUI main loop */
+pj_status_t gui_start(gui_menu *menu)
+{
+    view.titles = [NSMutableArray arrayWithCapacity:menu->submenu_cnt];
+    view.menus = [NSMutableArray arrayWithCapacity:menu->submenu_cnt];
+    NSMutableArray *smenu;
+    for (int i = 0; i < menu->submenu_cnt; i++) {
+	NSString *str = [NSString stringWithFormat:@"%s" , menu->submenus[i]->title];
+	[view.titles addObject: str];
+	smenu = [NSMutableArray arrayWithCapacity:menu->submenus[i]->submenu_cnt];
+	/* We do not need the last two menus of the "Tests" menu (NULL and "Exit"),
+	 * so subtract by 2
+	 */
+	for (int j = 0; j < menu->submenus[i]->submenu_cnt - (i==0? 2: 0); j++) {
+	    str = [NSString stringWithFormat:@"%s" , menu->submenus[i]->submenus[j]->title];
+	    [smenu addObject:str];
+	}
+	[view.menus addObject:smenu];
+    }
+    gmenu = menu;
+    
+    return PJ_SUCCESS;
+}
+
+/* Signal GUI mainloop to stop */
+void gui_destroy(void)
+{
+}
+
+/* AUX: display messagebox */
+enum gui_key gui_msgbox(const char *title, const char *message, enum gui_flag flag)
+{
+    ctitle = title;
+    cmsg = message;
+    cflag = flag;
+    [view performSelectorOnMainThread:@selector(showMsg) withObject:nil waitUntilDone:YES];
+    
+    view.testView.key = 0;
+    while(view.testView.key == 0) {
+	/* Let the main thread do its job (refresh the view) while we wait for 
+	 * user interaction (button click)
+	 */
+	[NSThread sleepForTimeInterval:SLEEP_INTERVAL];
+    }
+    
+    if (view.testView.key == 1)
+	return KEY_OK;
+    else
+	return (flag == WITH_YESNO? KEY_NO: KEY_CANCEL);
+}
+
+/* AUX: sleep */
+void gui_sleep(unsigned sec)
+{
+    [NSThread sleepForTimeInterval:sec];
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    view = self;
+    
+    /* Get a writable path for output files */
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+    NSString *documentsDirectory = [paths objectAtIndex:0];
+    [documentsDirectory getCString:doc_path maxLength:PATH_LENGTH encoding:NSASCIIStringEncoding];
+    strncat(doc_path, "/", PATH_LENGTH);
+
+    /* Get path for our test resources (the wav files) */
+    NSString *resPath = [[NSBundle mainBundle] resourcePath];
+    [resPath getCString:res_path maxLength:PATH_LENGTH encoding:NSASCIIStringEncoding];
+    strncat(res_path, "/", PATH_LENGTH);
+    
+    systest_initialized = false;
+    thread_quit = false;
+    [NSThread detachNewThreadSelector:@selector(startTest) toTarget:self withObject:nil];
+    /* Let our new thread initialize */
+    while (!systest_initialized) {
+	[NSThread sleepForTimeInterval:SLEEP_INTERVAL];
+    }
+
+    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
+    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
+}
+
+/*
+ - (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+ }
+ */
+/*
+ - (void)viewDidAppear:(BOOL)animated {
+    [super viewDidAppear:animated];
+ }
+ */
+/*
+ - (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+ }
+ */
+/*
+ - (void)viewDidDisappear:(BOOL)animated {
+    [super viewDidDisappear:animated];
+ }
+ */
+
+/*
+ // Override to allow orientations other than the default portrait orientation.
+ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+    // Return YES for supported orientations.
+    return (interfaceOrientation == UIInterfaceOrientationPortrait);
+ }
+ */
+
+- (void)didReceiveMemoryWarning {
+    // Releases the view if it doesn't have a superview.
+    [super didReceiveMemoryWarning];
+    
+    // Release any cached data, images, etc that aren't in use.
+}
+
+- (void)viewDidUnload {
+    // Release anything that can be recreated in viewDidLoad or on demand.
+    // e.g. self.myOutlet = nil;
+    self.titles = nil;
+    self.menus = nil;
+    
+    thread_quit = true;
+    [NSThread sleepForTimeInterval:SLEEP_INTERVAL];
+}
+
+
+#pragma mark Table view methods
+
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+    return [titles count];
+}
+
+
+// Customize the number of rows in the table view.
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return [[menus objectAtIndex:section] count];
+}
+
+
+- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
+    // The header for the section is the region name -- get this from the region at the section index.
+    return [titles objectAtIndex:section];
+}
+
+// Customize the appearance of table view cells.
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    
+    static NSString *CellIdentifier = @"Cell";
+    
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+    if (cell == nil) {
+        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
+    }
+    
+    // Configure the cell.
+    cell.textLabel.text = [[menus objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
+    
+    return cell;
+}
+
+- (void)startTest {
+    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+    if (systest_init() != PJ_SUCCESS) {
+	[pool release];
+	return;
+    }
+    
+    systest_run();
+    
+    systest_initialized = 1;
+    while(!thread_quit) {
+	section = -1;
+	while (section == -1) {
+	    [NSThread sleepForTimeInterval:SLEEP_INTERVAL];
+	}
+	(*gmenu->submenus[section]->submenus[row]->handler)();
+	cmsg = NULL;
+	[view performSelectorOnMainThread:@selector(showMsg) withObject:nil waitUntilDone:YES];
+    }
+    
+    systest_deinit();
+    [pool release];
+}
+
+- (void)showMsg {
+    if (cmsg == NULL) {
+	self.testView.testDesc.text = [self.testView.testDesc.text stringByAppendingString: @"Finished"];
+	[self.testView.testDesc scrollRangeToVisible:NSMakeRange([self.testView.testDesc.text length] - 1, 1)];
+	[self.testView.button1 setHidden:true];
+	[self.testView.button2 setHidden:true];
+	return;
+    }
+    self.testView.title = [NSString stringWithFormat:@"%s", ctitle];
+    self.testView.testDesc.text = [self.testView.testDesc.text stringByAppendingString: [NSString stringWithFormat:@"%s\n\n", cmsg]];
+    [self.testView.testDesc scrollRangeToVisible:NSMakeRange([self.testView.testDesc.text length] - 1, 1)];
+    
+    [self.testView.button1 setHidden:false];
+    [self.testView.button2 setHidden:false];
+    if (cflag == WITH_YESNO) {
+	[self.testView.button1 setTitle:@"Yes" forState:UIControlStateNormal];
+	[self.testView.button2 setTitle:@"No" forState:UIControlStateNormal];
+    } else if (cflag == WITH_OK) {
+	[self.testView.button1 setTitle:@"OK" forState:UIControlStateNormal];
+	[self.testView.button2 setHidden:true];
+    } else if (cflag == WITH_OKCANCEL) {
+	[self.testView.button1 setTitle:@"OK" forState:UIControlStateNormal];
+	[self.testView.button2 setTitle:@"Cancel" forState:UIControlStateNormal];
+    }
+}
+
+
+// Override to support row selection in the table view.
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    
+    // Navigation logic may go here -- for example, create and push another view controller.
+    // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
+    // [self.navigationController pushViewController:anotherViewController animated:YES];
+    // [anotherViewController release];
+    
+    if (self.testView == nil) {
+	self.testView = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:[NSBundle mainBundle]];
+    }
+    
+    [self.navigationController pushViewController:self.testView animated:YES];
+    self.testView.title = [[menus objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
+    self.testView.testDesc.text = @"";
+    section = indexPath.section;
+    row = indexPath.row;
+}
+
+
+/*
+ // Override to support conditional editing of the table view.
+ - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+    // Return NO if you do not want the specified item to be editable.
+    return YES;
+ }
+ */
+
+
+/*
+ // Override to support editing the table view.
+ - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
+ 
+    if (editingStyle == UITableViewCellEditingStyleDelete) {
+	// Delete the row from the data source.
+	[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
+    }   
+    else if (editingStyle == UITableViewCellEditingStyleInsert) {
+	// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
+    }   
+ }
+ */
+
+
+/*
+ // Override to support rearranging the table view.
+ - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
+ }
+ */
+
+
+/*
+ // Override to support conditional rearranging of the table view.
+ - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+    // Return NO if you do not want the item to be re-orderable.
+    return YES;
+ }
+ */
+
+
+- (void)dealloc {
+    [super dealloc];
+}
+
+
+@end
+
