Change how recieved data is handled
This commit is contained in:
parent
0fef6d88a1
commit
b455370466
31
README.md
31
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])
|
||||
```
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user