summaryrefslogtreecommitdiff
path: root/swift/test/TestDriver/iOS/ViewController.swift
blob: 1f7161434d9184caf5f5a11c7ebe9408f2492a3e (plain)
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
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//

import UIKit
import Darwin

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet weak var interfaceIPv4: UIPickerView!
    @IBOutlet weak var interfaceIPv6: UIPickerView!
    @IBOutlet weak var output: UITextView!

    var interfacesIPv4: [String]!
    var interfacesIPv6: [String]!

    override func viewDidLoad() {
        super.viewDidLoad()

        interfacesIPv4 = [String]()
        interfacesIPv4.append("127.0.0.1")

        interfacesIPv6 = [String]()
        interfacesIPv6.append("::1")

        var ifap: UnsafeMutablePointer<ifaddrs>?

        if getifaddrs(&ifap) == 0 {
            for curr in sequence(first: ifap!, next: { $0.pointee.ifa_next }) {
                if (curr.pointee.ifa_flags & UInt32(IFF_UP)) != 0 &&
                    (curr.pointee.ifa_flags & UInt32(IFF_LOOPBACK)) == 0 {

                    if curr.pointee.ifa_addr!.pointee.sa_family == UInt32(AF_INET) {
                        var buf = [Int8](repeating: 0, count: Int(INET_ADDRSTRLEN))
                        curr.pointee.ifa_addr!.withMemoryRebound(to: sockaddr_in.self, capacity: 1) { addr in
                            let s = inet_ntop(AF_INET, &addr.pointee.sin_addr, &buf, socklen_t(INET_ADDRSTRLEN))
                            interfacesIPv4.append("\(String(cString: s!))")
                        }
                    } else if curr.pointee.ifa_addr!.pointee.sa_family == UInt32(AF_INET6) {
                        var buf = [Int8](repeating: 0, count: Int(INET6_ADDRSTRLEN))
                        curr.pointee.ifa_addr!.withMemoryRebound(to: sockaddr_in6.self, capacity: 1) { addr6 in
                            let s = inet_ntop(AF_INET6, &addr6.pointee.sin6_addr, &buf, socklen_t(INET6_ADDRSTRLEN))
                            interfacesIPv6.append("\(String(cString: s!))")
                        }
                    }
                }
            }
            freeifaddrs(ifap)
        }

        // By default, use the loopback
        interfaceIPv4.selectedRow(inComponent: 0)
        interfaceIPv6.selectedRow(inComponent: 0)

        do {
            try ControllerI.startController(view: self, ipv4: interfacesIPv4[0], ipv6: interfacesIPv6[0])
        } catch {
            println("Error: \(error)")
        }
    }

    public func write(_ msg: String) {
        output.insertText(msg)
        output.layoutIfNeeded()
        output.scrollRangeToVisible(NSRange(location: output.text.count - 1, length: 1))
    }

    public func print(_ msg: String) {
        DispatchQueue.main.async {
            self.write(msg)
        }
    }

    public func println(_ msg: String) {
        print("\(msg)\n")
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ view: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if view === interfaceIPv4 {
            return interfacesIPv4.count
        } else {
            return interfacesIPv6.count
        }
    }

    func pickerView(_ view: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if view === interfaceIPv4 {
            return interfacesIPv4[row]
        } else {
            return interfacesIPv6[row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        do {
            ControllerI.stopController()
            try ControllerI.startController(view: self,
                                            ipv4: interfacesIPv4[interfaceIPv4.selectedRow(inComponent: 0)],
                                            ipv6: interfacesIPv6[interfaceIPv6.selectedRow(inComponent: 0)])
        } catch {
            print("Error: \(error)")
        }
    }
}