diff options
Diffstat (limited to 'pjsip-apps/src/ipjsystest/Classes/RootViewController.m')
-rw-r--r-- | pjsip-apps/src/ipjsystest/Classes/RootViewController.m | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/pjsip-apps/src/ipjsystest/Classes/RootViewController.m b/pjsip-apps/src/ipjsystest/Classes/RootViewController.m new file mode 100644 index 0000000..e4cfab0 --- /dev/null +++ b/pjsip-apps/src/ipjsystest/Classes/RootViewController.m @@ -0,0 +1,335 @@ +/* $Id: RootViewController.m 3552 2011-05-05 05:50:48Z nanang $ */ +/* + * 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 + |