From 5068986a50e21b89fd56b7684c6bf8bbf7e4f40f Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 3 Jan 2016 11:56:16 -0500 Subject: [PATCH] fix socketio/socket.io-client-swift#233 --- Source/SocketEngine.swift | 2 +- Source/SocketIOClient.swift | 2 +- Source/SocketIOClientOption.swift | 194 ++++++++++++++++++++---------- 3 files changed, 134 insertions(+), 64 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 620d29c..f59a955 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -109,7 +109,7 @@ public final class SocketEngine: NSObject, SocketEngineSpec, WebSocketDelegate { public convenience init(client: SocketEngineClient, url: String, options: NSDictionary?) { self.init(client: client, url: url, - options: Set.NSDictionaryToSocketOptionsSet(options ?? [:])) + options: options?.toSocketOptionsSet() ?? []) } deinit { diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index ea52cc3..d434424 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -104,7 +104,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { */ public convenience init(socketURL: String, options: NSDictionary?) { self.init(socketURL: socketURL, - options: Set.NSDictionaryToSocketOptionsSet(options ?? [:])) + options: options?.toSocketOptionsSet() ?? []) } deinit { diff --git a/Source/SocketIOClientOption.swift b/Source/SocketIOClientOption.swift index c278336..c43db7f 100644 --- a/Source/SocketIOClientOption.swift +++ b/Source/SocketIOClientOption.swift @@ -25,7 +25,7 @@ import Foundation protocol ClientOption: CustomStringConvertible, Hashable { - func getSocketIOOptionValue() -> AnyObject? + func getSocketIOOptionValue() -> AnyObject } public enum SocketIOClientOption: ClientOption { @@ -49,62 +49,97 @@ public enum SocketIOClientOption: ClientOption { case VoipEnabled(Bool) public var description: String { - if let label = Mirror(reflecting: self).children.first?.label { - return String(label[label.startIndex]).lowercaseString + String(label.characters.dropFirst()) - } else { - return "" + let description: String + + switch self { + case .ConnectParams: + description = "connectParams" + case .Cookies: + description = "cookies" + case .ExtraHeaders: + description = "extraHeaders" + case .ForceNew: + description = "forceNew" + case .ForcePolling: + description = "forcePolling" + case .ForceWebsockets: + description = "forceWebsockets" + case .HandleQueue: + description = "handleQueue" + case .Log: + description = "log" + case .Logger: + description = "logger" + case .Nsp: + description = "nsp" + case .Path: + description = "path" + case .Reconnects: + description = "reconnects" + case .ReconnectAttempts: + description = "reconnectAttempts" + case .ReconnectWait: + description = "reconnectWait" + case .Secure: + description = "secure" + case .SelfSigned: + description = "selfSigned" + case .SessionDelegate: + description = "sessionDelegate" + case .VoipEnabled: + description = "voipEnabled" } + + return description } public var hashValue: Int { return description.hashValue } - static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? { - switch (key, value) { - case ("connectParams", let params as [String: AnyObject]): - return .ConnectParams(params) - case ("reconnects", let reconnects as Bool): - return .Reconnects(reconnects) - case ("reconnectAttempts", let attempts as Int): - return .ReconnectAttempts(attempts) - case ("reconnectWait", let wait as Int): - return .ReconnectWait(wait) - case ("forceNew", let force as Bool): - return .ForceNew(force) - case ("forcePolling", let force as Bool): - return .ForcePolling(force) - case ("forceWebsockets", let force as Bool): - return .ForceWebsockets(force) - case ("nsp", let nsp as String): - return .Nsp(nsp) - case ("cookies", let cookies as [NSHTTPCookie]): - return .Cookies(cookies) - case ("log", let log as Bool): - return .Log(log) - case ("logger", let logger as SocketLogger): - return .Logger(logger) - case ("sessionDelegate", let delegate as NSURLSessionDelegate): - return .SessionDelegate(delegate) - case ("path", let path as String): - return .Path(path) - case ("extraHeaders", let headers as [String: String]): - return .ExtraHeaders(headers) - case ("handleQueue", let queue as dispatch_queue_t): - return .HandleQueue(queue) - case ("voipEnabled", let enable as Bool): - return .VoipEnabled(enable) - case ("secure", let secure as Bool): - return .Secure(secure) - case ("selfSigned", let selfSigned as Bool): - return .SelfSigned(selfSigned) - default: - return nil + func getSocketIOOptionValue() -> AnyObject { + let value: AnyObject + + switch self { + case let .ConnectParams(params): + value = params + case let .Cookies(cookies): + value = cookies + case let .ExtraHeaders(headers): + value = headers + case let .ForceNew(force): + value = force + case let .ForcePolling(force): + value = force + case let .ForceWebsockets(force): + value = force + case let .HandleQueue(queue): + value = queue + case let .Log(log): + value = log + case let .Logger(logger): + value = logger + case let .Nsp(nsp): + value = nsp + case let .Path(path): + value = path + case let .Reconnects(reconnects): + value = reconnects + case let .ReconnectAttempts(attempts): + value = attempts + case let .ReconnectWait(wait): + value = wait + case let .Secure(secure): + value = secure + case let .SelfSigned(signed): + value = signed + case let .SessionDelegate(delegate): + value = delegate + case let .VoipEnabled(enabled): + value = enabled } - } - - func getSocketIOOptionValue() -> AnyObject? { - return Mirror(reflecting: self).children.first?.value as? AnyObject + + return value } } @@ -118,26 +153,61 @@ extension Set where Element: ClientOption { insert(element) } } +} + +extension NSDictionary { + static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? { + switch (key, value) { + case let ("connectParams", params as [String: AnyObject]): + return .ConnectParams(params) + case let ("reconnects", reconnects as Bool): + return .Reconnects(reconnects) + case let ("reconnectAttempts", attempts as Int): + return .ReconnectAttempts(attempts) + case let ("reconnectWait", wait as Int): + return .ReconnectWait(wait) + case let ("forceNew", force as Bool): + return .ForceNew(force) + case let ("forcePolling", force as Bool): + return .ForcePolling(force) + case let ("forceWebsockets", force as Bool): + return .ForceWebsockets(force) + case let ("nsp", nsp as String): + return .Nsp(nsp) + case let ("cookies", cookies as [NSHTTPCookie]): + return .Cookies(cookies) + case let ("log", log as Bool): + return .Log(log) + case let ("logger", logger as SocketLogger): + return .Logger(logger) + case let ("sessionDelegate", delegate as NSURLSessionDelegate): + return .SessionDelegate(delegate) + case let ("path", path as String): + return .Path(path) + case let ("extraHeaders", headers as [String: String]): + return .ExtraHeaders(headers) + case let ("handleQueue", queue as dispatch_queue_t): + return .HandleQueue(queue) + case let ("voipEnabled", enable as Bool): + return .VoipEnabled(enable) + case let ("secure", secure as Bool): + return .Secure(secure) + case let ("selfSigned", selfSigned as Bool): + return .SelfSigned(selfSigned) + default: + return nil + } + } - static func NSDictionaryToSocketOptionsSet(dict: NSDictionary) -> Set { + func toSocketOptionsSet() -> Set { var options = Set() - for (rawKey, value) in dict { - if let key = rawKey as? String, opt = SocketIOClientOption.keyValueToSocketIOClientOption(key, value: value) { + for (rawKey, value) in self { + if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { options.insertIgnore(opt) } } return options } - - func SocketOptionsSetToNSDictionary() -> NSDictionary { - let options = NSMutableDictionary() - - for option in self { - options[option.description] = option.getSocketIOOptionValue() - } - - return options - } }