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 {
|
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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user