Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Cartfile
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
github "mxcl/PromiseKit" ~> 6.0
#github "mxcl/PromiseKit" ~> 6.0
github "dougzilla32/PromiseKit" "PMKCancel"
#github "PromiseKit/Cancel" ~> 1.0
github "dougzilla32/Cancel" ~> 1.0
3 changes: 2 additions & 1 deletion Cartfile.resolved
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
github "mxcl/PromiseKit" "6.3.3"
github "dougzilla32/Cancel" "1.0.0"
github "dougzilla32/PromiseKit" "a0217bd7b69af68237dcdeee0197e63259b9d445"
5 changes: 5 additions & 0 deletions PMKSystemConfiguration.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
6362F84F1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 6362F84D1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m */; };
6383E14B1D611E0D00897651 /* SCTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6383E14A1D611E0D00897651 /* SCTests.swift */; };
63C7FFF71D5C020D003BAE60 /* PMKSystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKSystemConfiguration.framework */; };
911E6FC820F578E2006F49B9 /* SCNetworkReachability+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 911E6FC720F578E2006F49B9 /* SCNetworkReachability+Promise.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand All @@ -34,6 +35,7 @@
63C7FFF21D5C020D003BAE60 /* PMKSCTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKSCTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = "<group>"; };
63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = "<group>"; };
911E6FC720F578E2006F49B9 /* SCNetworkReachability+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SCNetworkReachability+Promise.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -82,6 +84,7 @@
6358AB791D5D4B6700B9B157 /* PMKSystemConfiguration.h */,
6362F84C1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.h */,
6362F84D1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m */,
911E6FC720F578E2006F49B9 /* SCNetworkReachability+Promise.swift */,
);
path = Sources;
sourceTree = "<group>";
Expand Down Expand Up @@ -192,6 +195,7 @@
);
inputPaths = (
PromiseKit,
PMKCancel,
);
name = "Embed Carthage Frameworks";
outputPaths = (
Expand All @@ -208,6 +212,7 @@
buildActionMask = 2147483647;
files = (
6362F84F1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m in Sources */,
911E6FC820F578E2006F49B9 /* SCNetworkReachability+Promise.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
50 changes: 39 additions & 11 deletions Sources/SCNetworkReachability+Promise.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import SystemConfiguration
#if !PMKCocoaPods
import PMKCancel
import PromiseKit
#endif

public extension SCNetworkReachability {

Expand All @@ -9,23 +12,31 @@ public extension SCNetworkReachability {

static func promise() -> Promise<Void> {
do {
var zeroAddress = sockaddr()
zeroAddress.sa_len = UInt8(MemoryLayout<sockaddr>.size)
zeroAddress.sa_family = sa_family_t(AF_INET)
guard let ref = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress) else {
throw PMKError.couldNotInitializeReachability
}

var flags = SCNetworkReachabilityFlags()
if SCNetworkReachabilityGetFlags(ref, &flags), flags.contains(.reachable) {
if let promise = try pending()?.promise {
return promise
} else {
return Promise()
}

return try Helper(ref: ref).pending.promise
} catch {
return Promise(error: error)
}
}

fileprivate static func pending() throws -> (promise: Promise<Void>, resolver: Resolver<Void>)? {
var zeroAddress = sockaddr()
zeroAddress.sa_len = UInt8(MemoryLayout<sockaddr>.size)
zeroAddress.sa_family = sa_family_t(AF_INET)
guard let ref = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress) else {
throw PMKError.couldNotInitializeReachability
}

var flags = SCNetworkReachabilityFlags()
if SCNetworkReachabilityGetFlags(ref, &flags), flags.contains(.reachable) {
return nil
}

return try Helper(ref: ref).pending
}
}

private func callback(reachability: SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) {
Expand Down Expand Up @@ -58,3 +69,20 @@ private class Helper {
}
}
}

//////////////////////////////////////////////////////////// Cancellation

public extension SCNetworkReachability {
static func promiseCC() -> CancellablePromise<Void> {
do {
if let pending = try pending() {
return CancellablePromise(promise: pending.promise, resolver: pending.resolver)
} else {
return CancellablePromise()
}
} catch {
return CancellablePromise(error: error)
}
}
}

1 change: 1 addition & 0 deletions Tests/SCTests.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import PMKCancel
import PMKSystemConfiguration
import XCTest

Expand Down