work on sending binary data
This commit is contained in:
parent
5d292a249b
commit
25082ebb61
@ -25,22 +25,7 @@ private class EventHandler: NSObject {
|
||||
}
|
||||
}
|
||||
|
||||
private struct binaryMessage {
|
||||
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 {
|
||||
private struct Event {
|
||||
var event:String!
|
||||
var args:Any!
|
||||
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 {
|
||||
func checkDoEvent() -> Bool {
|
||||
if (self.placeholders == self.currentPlace) {
|
||||
@ -105,7 +110,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
|
||||
private var handlers = [EventHandler]()
|
||||
var io:SRWebSocket?
|
||||
var pingTimer:NSTimer!
|
||||
private var lastSocketMessage:SocketMessage?
|
||||
private var lastSocketMessage:Event?
|
||||
var secure = false
|
||||
|
||||
init(socketURL:String, secure:Bool = false) {
|
||||
@ -146,19 +151,48 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
|
||||
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
|
||||
func emit(event:String, args:Any? = nil) {
|
||||
if (!self.connected) {
|
||||
return
|
||||
}
|
||||
var frame:Event!
|
||||
var str:String!
|
||||
|
||||
if let binaryData = args as? NSData {
|
||||
self.sendBinaryData(event, data: binaryData)
|
||||
if let dict = args as? NSDictionary {
|
||||
// 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
|
||||
}
|
||||
|
||||
let frame = SocketMessage(event: event, args: args)
|
||||
let str = frame.createMessage()
|
||||
frame = Event(event: event, args: args)
|
||||
str = frame.createMessage()
|
||||
|
||||
// println("Sending: \(str)")
|
||||
self.io?.send(str)
|
||||
@ -190,6 +224,29 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
|
||||
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
|
||||
private func parseSocketMessage(#message:AnyObject?) {
|
||||
if (message == nil) {
|
||||
@ -267,7 +324,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
|
||||
let event = binaryGroup[2]
|
||||
let mutMessageObject = RegexMutable(binaryGroup[3])
|
||||
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)
|
||||
self.lastSocketMessage = mes
|
||||
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
|
||||
func sendPing() {
|
||||
if (!self.connected) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user