introduced a prettier and less complex API for iOS/OSX framework usage

This commit is contained in:
Joseph Henry
2016-09-07 18:16:46 -07:00
parent 1af75c386e
commit 06747d35f3
6 changed files with 312 additions and 83 deletions

View File

@@ -1424,6 +1424,7 @@
"-D__IOS__", "-D__IOS__",
"-DLWIP_DEBUG", "-DLWIP_DEBUG",
"-DSDK_BUNDLED", "-DSDK_BUNDLED",
"-DUSING_BRIDGING_HEADER",
); );
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS"; PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1457,6 +1458,7 @@
"-DSDK", "-DSDK",
"-D__IOS__", "-D__IOS__",
"-DSDK_BUNDLED", "-DSDK_BUNDLED",
"-DUSING_BRIDGING_HEADER",
); );
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS"; PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-iOS";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1492,6 +1494,7 @@
"-DSDK_DEBUG", "-DSDK_DEBUG",
"-D__XCODE__", "-D__XCODE__",
"-DLWIP_DEBUG", "-DLWIP_DEBUG",
"-DUSING_BRIDGING_HEADER",
); );
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX"; PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1522,6 +1525,7 @@
"-DSDK_SERVICE", "-DSDK_SERVICE",
"-DSDK_BUNDLED", "-DSDK_BUNDLED",
"-D__XCODE__", "-D__XCODE__",
"-DUSING_BRIDGING_HEADER",
); );
PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX"; PRODUCT_BUNDLE_IDENTIFIER = "zerotier.ZeroTierSDK-OSX";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -7,6 +7,7 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
7C1345841D80CDD700AF7FD1 /* ZTSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1345831D80CDD700AF7FD1 /* ZTSDK.swift */; };
7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */; }; 7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */; };
7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03D1D3348A6001E1B6F /* ViewController.swift */; }; 7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8BC03D1D3348A6001E1B6F /* ViewController.swift */; };
7C8BC0411D3348A6001E1B6F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C8BC03F1D3348A6001E1B6F /* Main.storyboard */; }; 7C8BC0411D3348A6001E1B6F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7C8BC03F1D3348A6001E1B6F /* Main.storyboard */; };
@@ -32,6 +33,7 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
7C1345831D80CDD700AF7FD1 /* ZTSDK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ZTSDK.swift; path = ../../../../../src/ZTSDK.swift; sourceTree = "<group>"; };
7C8BC0381D3348A6001E1B6F /* Example_iOS_App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example_iOS_App.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7C8BC0381D3348A6001E1B6F /* Example_iOS_App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example_iOS_App.app; sourceTree = BUILT_PRODUCTS_DIR; };
7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7C8BC03D1D3348A6001E1B6F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; }; 7C8BC03D1D3348A6001E1B6F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
@@ -76,6 +78,7 @@
7C8BC03A1D3348A6001E1B6F /* Example_iOS_App */ = { 7C8BC03A1D3348A6001E1B6F /* Example_iOS_App */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7C1345831D80CDD700AF7FD1 /* ZTSDK.swift */,
7CE8BFA91D3C553400350023 /* SDK_XcodeWrapper.cpp */, 7CE8BFA91D3C553400350023 /* SDK_XcodeWrapper.cpp */,
7CE8BFAA1D3C553400350023 /* SDK_XcodeWrapper.hpp */, 7CE8BFAA1D3C553400350023 /* SDK_XcodeWrapper.hpp */,
7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */, 7C8BC03B1D3348A6001E1B6F /* AppDelegate.swift */,
@@ -163,6 +166,7 @@
files = ( files = (
7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */, 7C8BC03E1D3348A6001E1B6F /* ViewController.swift in Sources */,
7CE8BFAB1D3C553400350023 /* SDK_XcodeWrapper.cpp in Sources */, 7CE8BFAB1D3C553400350023 /* SDK_XcodeWrapper.cpp in Sources */,
7C1345841D80CDD700AF7FD1 /* ZTSDK.swift in Sources */,
7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */, 7C8BC03C1D3348A6001E1B6F /* AppDelegate.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View File

@@ -10,11 +10,11 @@
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Example_iOS_App/ViewController.swift" filePath = "Example_iOS_App/ViewController.swift"
timestampString = "492476189.334255" timestampString = "494987032.463726"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "56" startingLineNumber = "54"
endingLineNumber = "56" endingLineNumber = "54"
landmarkName = "UI_TX(_:)" landmarkName = "UI_TX(_:)"
landmarkType = "5"> landmarkType = "5">
</BreakpointContent> </BreakpointContent>
@@ -26,11 +26,11 @@
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Example_iOS_App/ViewController.swift" filePath = "Example_iOS_App/ViewController.swift"
timestampString = "492477955.572263" timestampString = "494987032.463726"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "249" startingLineNumber = "230"
endingLineNumber = "249" endingLineNumber = "230"
landmarkName = "update_rx()" landmarkName = "update_rx()"
landmarkType = "5"> landmarkType = "5">
</BreakpointContent> </BreakpointContent>
@@ -42,14 +42,78 @@
ignoreCount = "0" ignoreCount = "0"
continueAfterRunningActions = "No" continueAfterRunningActions = "No"
filePath = "Example_iOS_App/ViewController.swift" filePath = "Example_iOS_App/ViewController.swift"
timestampString = "492482204.82335" timestampString = "494987032.463726"
startingColumnNumber = "9223372036854775807" startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807"
startingLineNumber = "283" startingLineNumber = "261"
endingLineNumber = "283" endingLineNumber = "261"
landmarkName = "update_rx()" landmarkName = "update_rx()"
landmarkType = "5"> landmarkType = "5">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Example_iOS_App/ZTSDK.swift"
timestampString = "494980386.753348"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "44"
endingLineNumber = "44"
landmarkName = "join_network(_:)"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Example_iOS_App/ZTSDK.swift"
timestampString = "494980195.451716"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "17"
endingLineNumber = "17"
landmarkName = "ztnc_start_service(_:)"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "../../../../src/ZTSDK.swift"
timestampString = "494987032.463726"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "34"
endingLineNumber = "34"
landmarkName = "to_sockaddr_in()"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "../../../../src/ZTSDK.swift"
timestampString = "494987032.463726"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "148"
endingLineNumber = "148"
landmarkName = "listen(_:backlog:)"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints> </Breakpoints>
</Bucket> </Bucket>

View File

@@ -10,7 +10,9 @@ import UIKit
class ViewController: UIViewController { class ViewController: UIViewController {
var serverPort:UInt16 = 8080 let zt = ZTSDK();
var serverPort:Int16 = 8080
var serverAddr:String = "10.9.9.100" var serverAddr:String = "10.9.9.100"
var selectedProtocol:Int32 = 0 var selectedProtocol:Int32 = 0
var sock:Int32 = -1 var sock:Int32 = -1
@@ -29,18 +31,16 @@ class ViewController: UIViewController {
// Use ordinary read/write calls on ZeroTier socket // Use ordinary read/write calls on ZeroTier socket
// TCP // TCP
if(selectedProtocol == SOCK_STREAM) if(selectedProtocol == SOCK_STREAM) {
{
var buffer = [UInt8](count: 100, repeatedValue: 0) var buffer = [UInt8](count: 100, repeatedValue: 0)
read(accepted_sock, &buffer, 100); read(accepted_sock, &buffer, 100);
print(buffer) print(buffer)
} }
// UDP // UDP
if(selectedProtocol == SOCK_DGRAM) if(selectedProtocol == SOCK_DGRAM) {
{
var buffer = [UInt8](count: 100, repeatedValue: 0) var buffer = [UInt8](count: 100, repeatedValue: 0)
read(sock, &buffer, 100); read(Int32(sock), &buffer, 100);
print(buffer) print(buffer)
} }
} }
@@ -48,16 +48,13 @@ class ViewController: UIViewController {
@IBAction func UI_TX(sender: AnyObject) { @IBAction func UI_TX(sender: AnyObject) {
// Use ordinary read/write calls on ZeroTier socket // Use ordinary read/write calls on ZeroTier socket
// TCP // TCP
if(selectedProtocol == SOCK_STREAM) if(selectedProtocol == SOCK_STREAM) {
{ write(Int32(sock), txtTX.description, txtTX.description.characters.count);
write(sock, txtTX.description, txtTX.description.characters.count);
} }
// UDP // UDP
if(selectedProtocol == SOCK_DGRAM) if(selectedProtocol == SOCK_DGRAM) {
{ sendto(Int32(sock), txtTX.description, txtTX.description.characters.count, 0, UnsafePointer<sockaddr>([udp_addr]), UInt32(udp_addr.sin_len))
sendto(sock, txtTX.description, txtTX.description.characters.count, 0, UnsafePointer<sockaddr>([udp_addr]), UInt32(udp_addr.sin_len))
} }
} }
@@ -66,12 +63,12 @@ class ViewController: UIViewController {
@IBOutlet weak var btnJoinNetwork: UIButton! @IBOutlet weak var btnJoinNetwork: UIButton!
@IBAction func UI_JoinNetwork(sender: AnyObject) { @IBAction func UI_JoinNetwork(sender: AnyObject) {
zt_join_network(txtNWID.text!) zt.join_network(txtNWID.text!)
} }
@IBOutlet weak var btnLeaveNetwork: UIButton! @IBOutlet weak var btnLeaveNetwork: UIButton!
@IBAction func UI_LeaveNetwork(sender: AnyObject) { @IBAction func UI_LeaveNetwork(sender: AnyObject) {
zt_leave_network(txtNWID.text!) zt.leave_network(txtNWID.text!)
} }
@IBOutlet weak var segmentProtocol: UISegmentedControl! @IBOutlet weak var segmentProtocol: UISegmentedControl!
@@ -95,16 +92,10 @@ class ViewController: UIViewController {
// TCP // TCP
if(selectedProtocol == SOCK_STREAM) if(selectedProtocol == SOCK_STREAM)
{ {
sock = zt_socket(AF_INET, SOCK_STREAM, 0) sock = zt.socket(AF_INET, socket_type: SOCK_STREAM, socket_protocol: 0)
var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort)
sin_family: UInt8(AF_INET), let connect_err = zt.connect(sock, addr: ztaddr)
sin_port: UInt16(serverPort).bigEndian,
sin_addr: in_addr(s_addr: 0),
sin_zero: (0,0,0,0,0,0,0,0))
inet_pton(AF_INET, serverAddr, &(addr.sin_addr));
let connect_err = zt_connect(sock, UnsafePointer<sockaddr>([addr]), UInt32(addr.sin_len))
print("connect_err = \(connect_err),\(errno)") print("connect_err = \(connect_err),\(errno)")
if connect_err < 0 { if connect_err < 0 {
@@ -138,16 +129,9 @@ class ViewController: UIViewController {
// TCP // TCP
if(selectedProtocol == SOCK_STREAM) if(selectedProtocol == SOCK_STREAM)
{ {
sock = zt_socket(AF_INET, SOCK_STREAM, 0) sock = Int16(zt_socket(AF_INET, SOCK_STREAM, 0))
var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort)
sin_family: UInt8(AF_INET), let bind_err = zt.bind(sock, addr: ztaddr)
sin_port: UInt16(serverPort).bigEndian,
sin_addr: in_addr(s_addr: 0),
sin_zero: (0,0,0,0,0,0,0,0))
inet_pton(AF_INET, serverAddr, &(addr.sin_addr));
let bind_err = zt_bind(sock, UnsafePointer<sockaddr>([addr]), UInt32(addr.sin_len))
print("bind_err = \(bind_err),\(errno)") print("bind_err = \(bind_err),\(errno)")
@@ -158,13 +142,13 @@ class ViewController: UIViewController {
} }
// Put socket into listening state // Put socket into listening state
zt_listen(sock, 1); zt_listen(Int32(sock), 1);
// Accept connection // Accept connection
var len:socklen_t = 0; var len:socklen_t = 0;
var legIntPtr = withUnsafeMutablePointer(&len, { $0 }) var legIntPtr = withUnsafeMutablePointer(&len, { $0 })
while(accepted_sock < 0) { while(accepted_sock < 0) {
accepted_sock = zt_accept(sock, UnsafeMutablePointer<sockaddr>([addr]), legIntPtr) accepted_sock = zt.accept(sock, addr: ztaddr)
} }
print("accepted connection") print("accepted connection")
} }
@@ -172,18 +156,13 @@ class ViewController: UIViewController {
// UDP // UDP
if(selectedProtocol == SOCK_DGRAM) if(selectedProtocol == SOCK_DGRAM)
{ {
var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), let ztaddr: ZTAddress = ZTAddress(family: AF_INET, addr: serverAddr, port: serverPort)
sin_family: UInt8(AF_INET),
sin_port: UInt16(serverPort).bigEndian,
sin_addr: in_addr(s_addr: 0),
sin_zero: (0,0,0,0,0,0,0,0))
sock = Int16(zt_socket(AF_INET, SOCK_DGRAM, 0))
sock = zt_socket(AF_INET, SOCK_DGRAM, 0) err = zt.bind(sock, addr: ztaddr)
err = zt_bind(sock, UnsafePointer<sockaddr>([addr]), UInt32(addr.sin_len))
print("bind_err = ", err) print("bind_err = ", err)
err = zt_listen(sock, 0) err = zt.listen(sock, backlog: 0)
print("listen_err = ", err) print("listen_err = ", err)
} }
} }
@@ -208,13 +187,15 @@ class ViewController: UIViewController {
while(true) while(true)
{ {
sleep(1) sleep(1)
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {
var str_buf = [Int8](count: 16, repeatedValue: 0) var str_buf = [Int8](count: 16, repeatedValue: 0)
zt_get_addresses(self.txtNWID.text!, &str_buf); print(self.zt.get_address(self.txtNWID.text!)) //, &str_buf);
self.lblAddress.text = String.fromCString(str_buf) self.lblAddress.text = String.fromCString(str_buf)
// print("IPV4 = ", String.fromCString(str_buf)) // print("IPV4 = ", String.fromCString(str_buf))
} }
// TCP // TCP
if(selectedProtocol == SOCK_STREAM) if(selectedProtocol == SOCK_STREAM)
{ {
@@ -233,23 +214,22 @@ class ViewController: UIViewController {
} }
} }
// UDP // UDP
/*
if(selectedProtocol == SOCK_DGRAM) if(selectedProtocol == SOCK_DGRAM)
{ {
let len = 32 let len = 32
var buffer = [UInt8](count: len, repeatedValue: 0) var buffer = [UInt8](count: len, repeatedValue: 0)
/* //udp_addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
udp_addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), // sin_family: UInt8(AF_INET),
sin_family: UInt8(AF_INET), // sin_port: UInt16(0).bigEndian,
sin_port: UInt16(0).bigEndian, // sin_addr: in_addr(s_addr: 0),
sin_addr: in_addr(s_addr: 0), // sin_zero: (0,0,0,0,0,0,0,0))
sin_zero: (0,0,0,0,0,0,0,0))
var addrlen:socklen_t = 0;
var legIntPtr = withUnsafeMutablePointer(&addrlen, { $0 })
let n = recvfrom(sock, &buffer, len, 0, UnsafeMutablePointer<sockaddr>([udp_addr]), legIntPtr)
*/
//var addrlen:socklen_t = 0;
//var legIntPtr = withUnsafeMutablePointer(&addrlen, { $0 })
//let n = recvfrom(sock, &buffer, len, 0, UnsafeMutablePointer<sockaddr>([udp_addr]), legIntPtr)
var socketAddress = sockaddr_storage() var socketAddress = sockaddr_storage()
var socketAddressLength = socklen_t(sizeof(sockaddr_storage.self)) var socketAddressLength = socklen_t(sizeof(sockaddr_storage.self))
@@ -269,11 +249,9 @@ class ViewController: UIViewController {
print("bytesWritten = ", bytesWritten); print("bytesWritten = ", bytesWritten);
/* //let bytesWritten = withUnsafePointer(&socketAddress.sin) {
let bytesWritten = withUnsafePointer(&socketAddress.sin) { // sendto(sock, buffer, len, 0, UnsafePointer($0), socklen_t(socketAddress.sin.sin_len))
sendto(sock, buffer, len, 0, UnsafePointer($0), socklen_t(socketAddress.sin.sin_len)) //}
}
*/
if let str = String(data: NSData(bytes: &buffer, length: len), encoding: NSUTF8StringEncoding) { if let str = String(data: NSData(bytes: &buffer, length: len), encoding: NSUTF8StringEncoding) {
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {
@@ -284,15 +262,9 @@ class ViewController: UIViewController {
} }
} }
} }
*/
} }
} }
// ZeroTier service thread
var service_thread : NSThread!
func ztnc_start_service() {
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
zt_start_service_and_rpc(path[0],"8056c2e21c000001")
}
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
@@ -306,11 +278,13 @@ class ViewController: UIViewController {
selectedProtocol = SOCK_STREAM selectedProtocol = SOCK_STREAM
// ZeroTier Service thread print("Starting ZeroTier...\n");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { zt.start_service(nil);
self.service_thread = NSThread(target:self, selector:"ztnc_start_service", object:nil)
self.service_thread.start() print("Joining network...\n");
}); zt.join_network(txtNWID.text!);
print("Complete\n");
// UI RX update // UI RX update
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {

View File

@@ -18,6 +18,7 @@ void zt_enable_intercept();
void zt_start_service(const char * path); void zt_start_service(const char * path);
void zt_stop_service(); void zt_stop_service();
void zt_start_service_and_rpc(const char * path, const char * nwid); void zt_start_service_and_rpc(const char * path, const char * nwid);
bool zt_service_is_running();
void zt_join_network(const char *nwid); void zt_join_network(const char *nwid);
void zt_leave_network(const char *nwid); void zt_leave_network(const char *nwid);
void zt_is_running(const char *nwid); void zt_is_running(const char *nwid);

182
src/ZTSDK.swift Normal file
View File

@@ -0,0 +1,182 @@
//
// ZTSDK.swift
// Example_iOS_App
//
// Created by Joseph Henry on 9/7/16.
// Copyright © 2016 ZeroTier Inc. All rights reserved.
//
import Foundation
// Convenience structure for getting address data to/from the native library
struct ZTAddress
{
var family: Int32
var addr: String
var port: Int16
var data: sockaddr_in?
init(family: Int32, addr: String, port: Int16)
{
self.family = family
self.addr = addr
self.port = port
}
func to_sockaddr_in() -> UnsafePointer<sockaddr>
{
var data = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)),
sin_family: UInt8(AF_INET),
sin_port: UInt16(port).bigEndian,
sin_addr: in_addr(s_addr: 0),
sin_zero: (0,0,0,0,0,0,0,0))
inet_pton(AF_INET, addr, &(data.sin_addr));
return UnsafePointer<sockaddr>([data]);
}
func len() -> UInt8
{
return UInt8(sizeof(sockaddr_in))
}
}
// Convenience wrapper class for ZeroTier/SDK/Proxy controls
// Implemented in terms of SDK_XcodeWrapper.cpp
class ZTSDK : NSObject
{
var service_thread : NSThread!
private func ztnc_start_service(path: String?)
{
if(path == nil) {
zt_start_service(
NSSearchPathForDirectoriesInDomains(
NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true)[0])
return;
}
zt_start_service(path!)
}
// Starts the ZeroTier background service
func start_service(path: String?)
{
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) {
self.ztnc_start_service(path)
}
sleep(2)
while(service_is_running() == false) { /* waiting for service to start */ }
}
// Stops the ZeroTier background service
func stop_service()
{
zt_stop_service();
}
// Returns whether the ZeroTier background service is running
func service_is_running() -> Bool
{
return zt_service_is_running();
}
// Joins a ZeroTier network
func join_network(nwid: String)
{
zt_join_network(nwid);
}
// Leaves a ZeroTier network
func leave_network(nwid: String)
{
zt_leave_network(nwid);
}
// Returns the address of this device on a given ZeroTier network
func get_address(nwid: String) -> (String, String)
{
// zts_get_addresses(nwid, addrstr);
return ("ipv4", "ipv6")
}
// PROXY SERVER CONTROLS
//
/*
func start_proxy_server(homepath: String, nwid: String, struct sockaddr_storage *addr) {
zt_start_proxy_server(homepath, nwid, addr);
}
//
func stop_proxy_server(nwid: String) {
zt_stop_proxy_server(nwid);
}
//
func proxy_is_running(const char *homepath, const char *nwid, struct sockaddr_storage *addr) {
zt_start_proxy_server(homepath, nwid, addr);
}
//
func get_proxy_server_address(const char *nwid, struct sockaddr_storage *addr) {
zt_get_proxy_server_address(nwid, addr);
}
// Explicit ZT API wrappers
#if !defined(__IOS__)
// This isn't available for iOS since function interposition isn't as reliable
func init_rpc(const char *path, const char *nwid) {
zt_init_rpc(path, nwid);
}
#endif
*/
// SOCKET API
func socket(socket_family: Int32, _ socket_type: Int32, _ socket_protocol: Int32) -> Int16 {
return Int16(zt_socket(socket_family, socket_type, socket_protocol));
}
func connect(fd: Int32, _ addr: ZTAddress) -> Int32 {
return zt_connect(Int32(fd), addr.to_sockaddr_in(), UInt32(addr.len()));
}
func bind(fd: Int32, _ addr: ZTAddress) -> Int32 {
return zt_bind(Int32(fd), addr.to_sockaddr_in(), UInt32(addr.len()));
}
func accept(fd: Int32, _ addr: ZTAddress) -> Int32 {
return zt_accept(Int32(fd), UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
}
func listen(fd: Int32, _ backlog: Int16) -> Int32 {
return zt_listen(Int32(fd), Int32(backlog));
}
func setsockopt(fd: Int32, _ level: Int32, _ optname: Int32, _ optval: UnsafePointer<Void>, _ optlen: Int32) -> Int32 {
return zt_setsockopt(fd, level, optname, optval, UInt32(optlen));
}
func getsockopt(fd: Int32, _ level: Int32, _ optname: Int32, _ optval: UnsafeMutablePointer<Void>, _ optlen: UInt32) -> Int32 {
return zt_getsockopt(fd, level, optname, optval, UnsafeMutablePointer<UInt32>([optlen]));
}
func close(fd: Int32) -> Int32 {
return zt_close(fd);
}
func getsockname(fd: Int32, _ addr: ZTAddress) -> Int32 {
return zt_getsockname(fd, UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
}
func getpeername(fd: Int32, _ addr: ZTAddress) -> Int32 {
return zt_getpeername(fd, UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
}
/*
func fcntl(fd: Int32, _ cmd: Int32, _ flags: Int32) -> Int32 {
return zt_fcntl(fd, cmd, flags);
}
*/
func recvfrom(fd: Int32, _ buf: UnsafeMutablePointer<Void>, _ len: Int32, _ flags: Int32, _ addr: ZTAddress) -> Int32 {
return zt_recvfrom(fd, buf, Int(len), flags, UnsafeMutablePointer<sockaddr>([addr.data]), UnsafeMutablePointer<UInt32>([addr.len]));
}
func sendto(fd: Int32, _ buf: UnsafePointer<Void>, _ len: Int32, _ flags: Int32, _ addr: ZTAddress) -> Int32 {
return zt_sendto(fd, buf, Int(len), flags, addr.to_sockaddr_in(), UInt32(addr.len()));
}
}