diff options
author | Benoit Foucher <benoit@zeroc.com> | 2016-12-15 16:09:25 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2016-12-15 16:09:25 +0100 |
commit | 49e1618006301fdbe090f11851557c386466028c (patch) | |
tree | a0d206bfb536995e959f6b4d2b2671e3e0b362e3 /cpp/test/ios/controller/Classes/ViewController.m | |
parent | Fix (ICE-7111) - iceboxnet --version/-v (diff) | |
download | ice-49e1618006301fdbe090f11851557c386466028c.tar.bz2 ice-49e1618006301fdbe090f11851557c386466028c.tar.xz ice-49e1618006301fdbe090f11851557c386466028c.zip |
iOS C++ controller fixes
Diffstat (limited to 'cpp/test/ios/controller/Classes/ViewController.m')
-rw-r--r-- | cpp/test/ios/controller/Classes/ViewController.m | 107 |
1 files changed, 102 insertions, 5 deletions
diff --git a/cpp/test/ios/controller/Classes/ViewController.m b/cpp/test/ios/controller/Classes/ViewController.m index 10f99f408c6..92c1dfca50e 100644 --- a/cpp/test/ios/controller/Classes/ViewController.m +++ b/cpp/test/ios/controller/Classes/ViewController.m @@ -9,12 +9,19 @@ #import "ViewController.h" +#include <ifaddrs.h> +#include <arpa/inet.h> +#include <net/if.h> + @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; - + + // + // Load the controller bundle. + // NSString* bundlePath = [[NSBundle mainBundle] privateFrameworksPath]; #ifdef ICE_CPP11_MAPPING const char* bundle = "Cpp11ControllerBundle.bundle"; @@ -39,7 +46,7 @@ return; } - void (*startController)(id<ViewController>) = CFBundleGetFunctionPointerForName(handle, CFSTR("startController")); + startController = CFBundleGetFunctionPointerForName(handle, CFSTR("startController")); if(startController == 0) { NSString* err = [NSString stringWithFormat:@"Could not get function pointer startController from bundle %@", @@ -47,7 +54,7 @@ [self println:err]; return; } - + stopController = CFBundleGetFunctionPointerForName(handle, CFSTR("stopController")); if(stopController == 0) { @@ -56,20 +63,68 @@ [self println:err]; return; } - - (*startController)(self); + // + // Search for local network interfaces + // + interfacesIPv4 = [NSMutableArray array]; + [interfacesIPv4 addObject:@"127.0.0.1"]; + interfacesIPv6 = [NSMutableArray array]; + [interfacesIPv6 addObject:@"::1"]; + struct ifaddrs* ifap; + if(getifaddrs(&ifap) == 0) + { + struct ifaddrs* curr = ifap; + while(curr != 0) + { + if(curr->ifa_addr && curr->ifa_flags & IFF_UP && !(curr->ifa_flags & IFF_LOOPBACK)) + { + if(curr->ifa_addr->sa_family == AF_INET) + { + char buf[INET_ADDRSTRLEN]; + const struct sockaddr_in *addr = (const struct sockaddr_in*)curr->ifa_addr; + if(inet_ntop(AF_INET, &addr->sin_addr, buf, INET_ADDRSTRLEN)) + { + [interfacesIPv4 addObject:[NSString stringWithUTF8String:buf]]; + } + } + else if(curr->ifa_addr->sa_family == AF_INET6) + { + char buf[INET6_ADDRSTRLEN]; + const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)curr->ifa_addr; + if(inet_ntop(AF_INET6, &addr6->sin6_addr, buf, INET6_ADDRSTRLEN)) + { + [interfacesIPv6 addObject:[NSString stringWithUTF8String:buf]]; + } + } + } + curr = curr->ifa_next; + } + freeifaddrs(ifap); + } + + // By default, use the loopback + [interfaceIPv4 selectRow:0 inComponent:0 animated:NO]; + [interfaceIPv6 selectRow:0 inComponent:0 animated:NO]; + (*startController)(self, + [interfacesIPv4 objectAtIndex:[interfaceIPv4 selectedRowInComponent:0]], + [interfacesIPv6 objectAtIndex:[interfaceIPv6 selectedRowInComponent:0]]); } + - (void) dealloc { (*stopController)(self); } + -(void) write:(NSString*)msg { [output insertText:msg]; [output layoutIfNeeded]; [output scrollRangeToVisible:NSMakeRange([output.text length] - 1, 1)]; } + +#pragma mark ViewController + -(void) print:(NSString*)msg { [self performSelectorOnMainThread:@selector(write:) withObject:msg waitUntilDone:NO]; @@ -78,4 +133,46 @@ { [self print:[msg stringByAppendingString:@"\n"]]; } + +#pragma mark UIPickerViewDelegate + +- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component +{ + if(pickerView == interfaceIPv4) + { + return [interfacesIPv4 objectAtIndex:row]; + } + else + { + return [interfacesIPv6 objectAtIndex:row]; + } +} + +- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component +{ + (*stopController)(self); + (*startController)(self, + [interfacesIPv4 objectAtIndex:[interfaceIPv4 selectedRowInComponent:0]], + [interfacesIPv6 objectAtIndex:[interfaceIPv6 selectedRowInComponent:0]]); +} + +#pragma mark UIPickerViewDataSource + +- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView +{ + return 1; +} + +- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component +{ + if(pickerView == interfaceIPv4) + { + return interfacesIPv4.count; + } + else + { + return interfacesIPv6.count; + } +} + @end |