diff --git a/README.md b/README.md index 9619e14..f92df65 100644 --- a/README.md +++ b/README.md @@ -70,24 +70,27 @@ socket.on("intTest") {data in println(intData) } } -socket.connect() -``` - -Binary support is not guaranteed to work. All recieved data is encoded in base64 strings. -```swift -// Sending binary -socket.emit("testObject", args: [ - "data": "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, - "test": true]) // Recieving data socket.on("dataTest") {data in - if let json = data as? NSDictionary { - var textData = NSData(base64EncodedString: (json["test"] as String), - options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) - if let dataAsString = NSString(data: textData!, encoding: NSUTF8StringEncoding) { - println(dataAsString) + if let data = data as? NSData { + println("data is binary") + } +} + +socket.on("objectDataTest") {data in + if let dict = data as? NSDictionary { + if let data = dict["data"] as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding) + println("Got data: \(string!)") } } } + +socket.connect() + +// Sending binary +socket.emit("testData", args: [ + "data": "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, + "test": true]) ``` diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 96037e4..39e4ba1 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -43,10 +43,11 @@ private class EventHandler: NSObject { } private class Event { - var event:String! var args:AnyObject! - var placeholders:Int! var currentPlace = 0 + var event:String! + lazy var datas = [NSData]() + var placeholders:Int! init(event:String, args:AnyObject?, placeholders:Int = 0) { self.event = event @@ -54,6 +55,30 @@ private class Event { self.placeholders = placeholders } + func addData(data:NSData) -> Bool { + func checkDoEvent() -> Bool { + if self.placeholders == self.currentPlace { + return true + } else { + return false + } + } + + if checkDoEvent() { + return true + } + + self.datas.append(data) + self.currentPlace++ + + if checkDoEvent() { + self.currentPlace = 0 + return true + } else { + return false + } + } + func createMessage() -> String { var array = "42[" array += "\"" + event + "\"" @@ -95,27 +120,30 @@ private class Event { } } - func fillInPlaceHolder(data:NSData) -> Bool { - func checkDoEvent() -> Bool { - if self.placeholders == self.currentPlace { - return true - } else { - return false + func fillInPlaceholders(args:AnyObject) -> AnyObject { + if let dict = args as? NSDictionary { + var newDict = [String: AnyObject]() + + for (key, value) in dict { + newDict[key as String] = value + + // If the value is a string we need to check + // if it is a placeholder for data + if let value = value as? String { + if value == "~~\(self.currentPlace)" { + newDict[key as String] = self.datas.removeAtIndex(0) + self.currentPlace++ + } + } + } + + return newDict + } else if let string = args as? String { + if string == "~~\(self.currentPlace)" { + return self.datas.removeAtIndex(0) } } - if checkDoEvent() { - return true - } - - if let stringArgs = args as? String { - let mutStringArgs = RegexMutable(stringArgs) - let base64 = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros) - let placeHolder = "~~" + String(self.currentPlace) - self.args = mutStringArgs[placeHolder] ~= "\"" + base64 + "\"" - self.currentPlace++ - return checkDoEvent() - } return false } } @@ -395,7 +423,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate { let numberOfPlaceholders = messageType["45"] ~= "" let event = binaryGroup[2] let mutMessageObject = RegexMutable(binaryGroup[3]) - let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "~~$2" + let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" let mes = Event(event: event, args: placeholdersRemoved, placeholders: numberOfPlaceholders.integerValue) self.lastSocketMessage = mes @@ -413,12 +441,15 @@ class SocketIOClient: NSObject, SRWebSocketDelegate { return } - let shouldExecute = self.lastSocketMessage?.fillInPlaceHolder(data) - var event = self.lastSocketMessage!.event - var args:AnyObject? = self.parseData(self.lastSocketMessage!.args as? String) + let shouldExecute = self.lastSocketMessage?.addData(data) if shouldExecute != nil && shouldExecute! { - self.handleEvent(event: event, data: args) + var event = self.lastSocketMessage!.event + var parsedArgs:AnyObject? = self.parseData(self.lastSocketMessage!.args as? String) + if let args:AnyObject = parsedArgs { + let filledInArgs:AnyObject = self.lastSocketMessage!.fillInPlaceholders(args) + self.handleEvent(event: event, data: filledInArgs) + } } }