Change how recieved data is handled

This commit is contained in:
Erik 2015-01-18 13:58:35 -05:00
parent 0fef6d88a1
commit b455370466
2 changed files with 73 additions and 39 deletions

View File

@ -70,24 +70,27 @@ socket.on("intTest") {data in
println(intData) 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 // Recieving data
socket.on("dataTest") {data in socket.on("dataTest") {data in
if let json = data as? NSDictionary { if let data = data as? NSData {
var textData = NSData(base64EncodedString: (json["test"] as String), println("data is binary")
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) }
if let dataAsString = NSString(data: textData!, encoding: NSUTF8StringEncoding) { }
println(dataAsString)
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])
``` ```

View File

@ -43,10 +43,11 @@ private class EventHandler: NSObject {
} }
private class Event { private class Event {
var event:String!
var args:AnyObject! var args:AnyObject!
var placeholders:Int!
var currentPlace = 0 var currentPlace = 0
var event:String!
lazy var datas = [NSData]()
var placeholders:Int!
init(event:String, args:AnyObject?, placeholders:Int = 0) { init(event:String, args:AnyObject?, placeholders:Int = 0) {
self.event = event self.event = event
@ -54,6 +55,30 @@ private class Event {
self.placeholders = placeholders 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 { func createMessage() -> String {
var array = "42[" var array = "42["
array += "\"" + event + "\"" array += "\"" + event + "\""
@ -95,27 +120,30 @@ private class Event {
} }
} }
func fillInPlaceHolder(data:NSData) -> Bool { func fillInPlaceholders(args:AnyObject) -> AnyObject {
func checkDoEvent() -> Bool { if let dict = args as? NSDictionary {
if self.placeholders == self.currentPlace { var newDict = [String: AnyObject]()
return true
} else {
return false
}
}
if checkDoEvent() { for (key, value) in dict {
return true newDict[key as String] = value
}
if let stringArgs = args as? String { // If the value is a string we need to check
let mutStringArgs = RegexMutable(stringArgs) // if it is a placeholder for data
let base64 = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros) if let value = value as? String {
let placeHolder = "~~" + String(self.currentPlace) if value == "~~\(self.currentPlace)" {
self.args = mutStringArgs[placeHolder] ~= "\"" + base64 + "\"" newDict[key as String] = self.datas.removeAtIndex(0)
self.currentPlace++ self.currentPlace++
return checkDoEvent()
} }
}
}
return newDict
} else if let string = args as? String {
if string == "~~\(self.currentPlace)" {
return self.datas.removeAtIndex(0)
}
}
return false return false
} }
} }
@ -395,7 +423,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
let numberOfPlaceholders = messageType["45"] ~= "" let numberOfPlaceholders = messageType["45"] ~= ""
let event = binaryGroup[2] let event = binaryGroup[2]
let mutMessageObject = RegexMutable(binaryGroup[3]) 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, let mes = Event(event: event, args: placeholdersRemoved,
placeholders: numberOfPlaceholders.integerValue) placeholders: numberOfPlaceholders.integerValue)
self.lastSocketMessage = mes self.lastSocketMessage = mes
@ -413,12 +441,15 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
return return
} }
let shouldExecute = self.lastSocketMessage?.fillInPlaceHolder(data) let shouldExecute = self.lastSocketMessage?.addData(data)
var event = self.lastSocketMessage!.event
var args:AnyObject? = self.parseData(self.lastSocketMessage!.args as? String)
if shouldExecute != nil && shouldExecute! { 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)
}
} }
} }