* #27232: jni: added pjproject checkout as regular git content

We will remove it once the next release of pjsip (with Android support)
comes out and is merged into SFLphone.
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
+