work on sending binary data

This commit is contained in:
Erik 2014-11-26 11:32:36 -05:00
parent 5d292a249b
commit 25082ebb61

View File

@ -25,22 +25,7 @@ private class EventHandler: NSObject {
} }
} }
private struct binaryMessage { private struct Event {
let messageFormat = "45%@-[\"%@\",%@]"
var event:String!
var data:NSData!
init(event:String, data:NSData) {
self.event = event
self.data = data
}
func createMessage() -> String {
return NSString(format: messageFormat, event)
}
}
private struct SocketMessage {
var event:String! var event:String!
var args:Any! var args:Any!
var placeholders:Int! var placeholders:Int!
@ -72,6 +57,26 @@ private struct SocketMessage {
} }
} }
func createBinaryMessage() -> String {
var array = "45\(self.placeholders)-["
array += "\"" + event + "\""
if (args? != nil) {
if (args is NSDictionary) {
array += ","
var jsonSendError:NSError?
var jsonSend = NSJSONSerialization.dataWithJSONObject(args as NSDictionary,
options: NSJSONWritingOptions(0), error: &jsonSendError)
var jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding)
return array + jsonString! + "]"
} else {
array += ",\"\(args!)\""
return array + "]"
}
} else {
return array + "]"
}
}
mutating func fillInPlaceHolder(data:NSData) -> Bool { mutating func fillInPlaceHolder(data:NSData) -> Bool {
func checkDoEvent() -> Bool { func checkDoEvent() -> Bool {
if (self.placeholders == self.currentPlace) { if (self.placeholders == self.currentPlace) {
@ -105,7 +110,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
private var handlers = [EventHandler]() private var handlers = [EventHandler]()
var io:SRWebSocket? var io:SRWebSocket?
var pingTimer:NSTimer! var pingTimer:NSTimer!
private var lastSocketMessage:SocketMessage? private var lastSocketMessage:Event?
var secure = false var secure = false
init(socketURL:String, secure:Bool = false) { init(socketURL:String, secure:Bool = false) {
@ -146,19 +151,48 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
self.io?.open() self.io?.open()
} }
// Creates a binary message, ready for sending
private func createBinaryDataForSend(data:NSData) -> NSData {
var byteArray = [UInt8](count: 1, repeatedValue: 0x0)
byteArray[0] = 4
var mutData = NSMutableData(bytes: &byteArray, length: 1)
mutData.appendData(data)
return mutData
}
// Sends a message // Sends a message
func emit(event:String, args:Any? = nil) { func emit(event:String, args:Any? = nil) {
if (!self.connected) { if (!self.connected) {
return return
} }
var frame:Event!
var str:String!
if let binaryData = args as? NSData { if let dict = args as? NSDictionary {
self.sendBinaryData(event, data: binaryData) // Check for binary data
let (newDict, hadBinary, binaryDatas) = self.parseNSDictionary(event: event, dict: dict)
if (hadBinary) {
frame = Event(event: event, args: newDict, placeholders: binaryDatas!.count)
str = frame.createBinaryMessage()
self.io?.send(str)
for data in binaryDatas! {
let sendData = self.createBinaryDataForSend(data)
self.io?.send(sendData)
}
return
}
} else if let binaryData = args as? NSData {
// args is just binary
frame = Event(event: event, args: ["_placeholder": true, "num": 0], placeholders: 1)
str = frame.createBinaryMessage()
self.io?.send(str)
let sendData = self.createBinaryDataForSend(binaryData)
self.io?.send(sendData)
return return
} }
let frame = SocketMessage(event: event, args: args) frame = Event(event: event, args: args)
let str = frame.createMessage() str = frame.createMessage()
// println("Sending: \(str)") // println("Sending: \(str)")
self.io?.send(str) self.io?.send(str)
@ -190,6 +224,29 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
self.connect() self.connect()
} }
// Parses a NSDictionary, looking for NSData objects
func parseNSDictionary(#event:String, dict:NSDictionary) -> (NSDictionary, Bool, [NSData]?) {
var returnDict = NSMutableDictionary()
var placeholder = 0
var containedData = false
var returnDatas = [NSData]()
for (key, value) in dict {
if let binaryData = value as? NSData {
containedData = true
returnDatas.append(binaryData)
returnDict[key as String] = ["_placeholder": true, "num": placeholder]
placeholder++
} else {
returnDict[key as String] = value
}
}
if (containedData) {
return (returnDict, true, returnDatas)
} else {
return (returnDict, false, nil)
}
}
// Parses messages recieved // Parses messages recieved
private func parseSocketMessage(#message:AnyObject?) { private func parseSocketMessage(#message:AnyObject?) {
if (message == nil) { if (message == nil) {
@ -267,7 +324,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
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 = SocketMessage(event: event, args: placeholdersRemoved, let mes = Event(event: event, args: placeholdersRemoved,
placeholders: numberOfPlaceholders.integerValue) placeholders: numberOfPlaceholders.integerValue)
self.lastSocketMessage = mes self.lastSocketMessage = mes
return return
@ -293,26 +350,6 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} }
} }
// Sends binary data
func sendBinaryData(event:String, data:NSData) {
println("should send binary")
let message = binaryMessage(event: event, data: data)
// var hexBits = ""
// var byteArray = [UInt8](count: data.length, repeatedValue: 0x0)
// data.getBytes(&byteArray, length:data.length)
// for value in byteArray {
// hexBits += NSString(format:"%2X", value) as String
// }
// let hexBytes = hexBits.stringByReplacingOccurrencesOfString("\u{0020}", withString: "0",
// options: NSStringCompareOptions.CaseInsensitiveSearch)
// println(hexBytes)
// println("binary message " + message.createMessage())
// println(byteArray)
// println("[" + ", ".join(byteArray.map({"\($0)"})) + "]")
self.io?.send(message.createMessage())
self.io?.send(data)
}
// Sends ping // Sends ping
func sendPing() { func sendPing() {
if (!self.connected) { if (!self.connected) {