1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//
#import "ControllerView.h"
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>
@implementation ControllerView
- (void)viewDidLoad
{
[super viewDidLoad];
//
// Load the controller bundle.
//
NSString* bundlePath = [[NSBundle mainBundle] privateFrameworksPath];
#ifdef ICE_CPP11_MAPPING
const char* bundle = "Cpp11ControllerBundle.bundle";
#else
const char* bundle = "Cpp98ControllerBundle.bundle";
#endif
bundlePath = [bundlePath stringByAppendingPathComponent:[NSString stringWithUTF8String:bundle]];
NSURL* bundleURL = [NSURL fileURLWithPath:bundlePath];
CFBundleRef handle = CFBundleCreate(NULL, (CFURLRef)bundleURL);
if(!handle)
{
[self println:[NSString stringWithFormat:@"Could not find bundle %@", bundlePath]];
return;
}
CFErrorRef error = nil;
Boolean loaded = CFBundleLoadExecutableAndReturnError(handle, &error);
if(error != nil || !loaded)
{
[self println:[(__bridge NSError *)error description]];
return;
}
startController = CFBundleGetFunctionPointerForName(handle, CFSTR("startController"));
if(startController == 0)
{
NSString* err = [NSString stringWithFormat:@"Could not get function pointer startController from bundle %@",
bundlePath];
[self println:err];
return;
}
stopController = CFBundleGetFunctionPointerForName(handle, CFSTR("stopController"));
if(stopController == 0)
{
NSString* err = [NSString stringWithFormat:@"Could not get function pointer stopController from bundle %@",
bundlePath];
[self println:err];
return;
}
//
// 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 ControllerView
-(void) print:(NSString*)msg
{
[self performSelectorOnMainThread:@selector(write:) withObject:msg waitUntilDone:NO];
}
-(void) println:(NSString*)msg
{
[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
|