Skip to content

Commit 63246a0

Browse files
Fixed bug in nutella transport protocol
1 parent 639cfba commit 63246a0

File tree

6 files changed

+79
-41
lines changed

6 files changed

+79
-41
lines changed

Common/Dictionary.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// Dictionary.swift
3+
//
4+
//
5+
// Created by Gianluca Venturini on 23/01/15.
6+
//
7+
//
8+
9+
import Foundation
10+
11+
extension Dictionary {
12+
mutating func update(other:Dictionary) {
13+
for (key,value) in other {
14+
self.updateValue(value, forKey:key)
15+
}
16+
}
17+
}

Common/NutellaNet.swift

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,28 @@ public class NutellaNet: SimpleMQTTClientDelegate {
7777
if let an = delegate?.actorName {
7878
actorName = an
7979
}
80-
var finalMessage: [String:AnyObject] = ["payload": message,
81-
"from": actorName]
80+
var finalMessage: [String:AnyObject] = [String:AnyObject]()
81+
if message is String {
82+
finalMessage = ["payload": message,
83+
"from": actorName]
84+
}
85+
else if let m = message as? Dictionary<String, AnyObject>{
86+
finalMessage["from"] = actorName
87+
finalMessage.update(m)
88+
}
8289
var json = JSON(finalMessage)
8390

8491
mqtt.publish(urlInit+channel, message: json.rawString(options: nil)!)
8592
}
8693

8794
/**
88-
Execute a sychronous request of information on the specified Nutella channel.
95+
Execute an asychronous request of information on the specified Nutella channel.
8996

9097
:param: channel The name of the channel on which executing the request.
91-
:param: message A dictionary that represent the message.
98+
:param: message A message that can be bot Dictionary or a String
9299
:param: requestName An optional name assigned to the request in order to recognize it later.
93100
*/
94-
public func syncRequest(channel: String, message: [String:AnyObject], requestName: String?) {
101+
public func asyncRequest(channel: String, message: AnyObject, requestName: String?) {
95102
var id = Int(arc4random_uniform(1000000000))
96103
// FIX: there's the possibility (1/1000000000 of times) that two requests have the same id. You're more likely to win the lottery.
97104

@@ -102,18 +109,25 @@ public class NutellaNet: SimpleMQTTClientDelegate {
102109

103110
mqtt.subscribe(urlInit+channel)
104111

105-
var finalMessage: [String:AnyObject] = ["payload": message,
106-
"id": id,
107-
"messageType": "request"]
112+
var finalMessage: [String:AnyObject] = ["id": id,
113+
"messageType": "request"]
114+
115+
if message is String {
116+
finalMessage["payload"] = message
117+
}
118+
else if let m = message as? Dictionary<String, AnyObject>{
119+
finalMessage.update(m)
120+
}
121+
108122

109123
var json = JSON(finalMessage)
110124
mqtt.publish(urlInit+channel, message: json.rawString(options: nil)!)
111125
}
112126

113127
/**
114-
Not yet implemented, sorry, use syncRequest that is almost the same
128+
Not yet implemented, sorry, use asyncRequest that is almost the same
115129
*/
116-
public func asyncRequest(channel: String, message: String, requestName: String?) {
130+
public func syncRequest(channel: String, message: String, requestName: String?) {
117131

118132
}
119133

@@ -165,22 +179,26 @@ public class NutellaNet: SimpleMQTTClientDelegate {
165179
if let id = jsonDic["id"] as? Int {
166180
if let messageType = jsonDic["messageType"] as? String {
167181
if messageType == "request" {
168-
if let payload: AnyObject = jsonDic["payload"] {
169-
if contains(self.handlingChannels, channel) {
170-
//println("Valid request")
171-
// Reply if the delegate implements the requestReceived function
172-
if let reply: AnyObject = self.delegate?.requestReceived(newChannel, request: payload) {
173-
174-
//Publish the message
175-
var finalMessage: [String:AnyObject] = ["id": id,
176-
"messageType": "response",
177-
"payload": reply]
178-
var json = JSON(finalMessage)
179-
180-
mqtt.publish(channel, message: json.rawString(options: nil)!)
181-
182-
requestResponse = true
182+
if contains(self.handlingChannels, channel) {
183+
//println("Valid request")
184+
// Reply if the delegate implements the requestReceived function
185+
if let reply: AnyObject = self.delegate?.requestReceived(newChannel, request: jsonDic) {
186+
187+
//Publish the message
188+
var finalMessage: [String:AnyObject] = ["id": id,
189+
"messageType": "response"]
190+
191+
if reply is String {
192+
finalMessage["payload"] = reply
183193
}
194+
else if let r = reply as? Dictionary<String, AnyObject>{
195+
finalMessage.update(r)
196+
}
197+
var json = JSON(finalMessage)
198+
199+
mqtt.publish(channel, message: json.rawString(options: nil)!)
200+
201+
requestResponse = true
184202
}
185203
}
186204
}
@@ -191,25 +209,21 @@ public class NutellaNet: SimpleMQTTClientDelegate {
191209
if let id = jsonDic["id"] as? Int {
192210
if let messageType = jsonDic["messageType"] as? String {
193211
if messageType == "response" {
194-
if let payload: AnyObject = jsonDic["payload"] {
195-
if let request = requests[id] {
196-
//println("Valid response")
197-
self.delegate?.responseReceived(newChannel,
198-
requestName: request.name,
199-
response: payload)
200-
201-
requestResponse = true
202-
}
212+
if let request = requests[id] {
213+
//println("Valid response")
214+
self.delegate?.responseReceived(newChannel,
215+
requestName: request.name,
216+
response: jsonDic)
217+
218+
requestResponse = true
203219
}
204220
}
205221
}
206222
}
207223

208224
if requestResponse == false {
209225
if let from = jsonDic["from"] as? String {
210-
if let payload: AnyObject = jsonDic["payload"] {
211-
self.delegate?.messageReceived(newChannel, message: payload, from: from)
212-
}
226+
self.delegate?.messageReceived(newChannel, message: jsonDic, from: from)
213227
}
214228
}
215229
}

Common/NutellaNetRequest.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ struct NutellaNetRequest {
1212
var channel: String
1313
var id: Int
1414
var name: String?
15-
var message: [String: AnyObject]
15+
var message: AnyObject
1616

17-
init(channel: String, id: Int, name: String?, message: [String: AnyObject]) {
17+
init(channel: String, id: Int, name: String?, message: AnyObject) {
1818
self.channel = channel
1919
self.id = id
2020
self.name = name

Mac/Nutella/Nutella.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
993179E31A72228A003F196F /* Dictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993179E21A72228A003F196F /* Dictionary.swift */; };
1011
993E1B831A6789E500FA2F9A /* SwiftyJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993E1B821A6789E500FA2F9A /* SwiftyJSON.swift */; };
1112
9991B65E1A65CF94003F35BE /* Nutella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9991B65D1A65CF94003F35BE /* Nutella.h */; settings = {ATTRIBUTES = (Public, ); }; };
1213
9991B6641A65CF94003F35BE /* Nutella.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9991B6581A65CF94003F35BE /* Nutella.framework */; };
@@ -47,6 +48,7 @@
4748
/* End PBXCopyFilesBuildPhase section */
4849

4950
/* Begin PBXFileReference section */
51+
993179E21A72228A003F196F /* Dictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Dictionary.swift; path = ../../Common/Dictionary.swift; sourceTree = "<group>"; };
5052
993E1B821A6789E500FA2F9A /* SwiftyJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftyJSON.swift; path = ../../Common/SwiftyJSON.swift; sourceTree = "<group>"; };
5153
9991B6581A65CF94003F35BE /* Nutella.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nutella.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5254
9991B65C1A65CF94003F35BE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -142,6 +144,7 @@
142144
9991B67C1A65CFC0003F35BE /* Common */ = {
143145
isa = PBXGroup;
144146
children = (
147+
993179E21A72228A003F196F /* Dictionary.swift */,
145148
993E1B821A6789E500FA2F9A /* SwiftyJSON.swift */,
146149
9991B6741A65CFB4003F35BE /* NutellaMain.swift */,
147150
9991B6751A65CFB4003F35BE /* NutellaDelegate.swift */,
@@ -273,6 +276,7 @@
273276
9991B67A1A65CFB4003F35BE /* NutellaNet.swift in Sources */,
274277
9991B67B1A65CFB4003F35BE /* NutellaNetDelegate.swift in Sources */,
275278
9991B6781A65CFB4003F35BE /* NutellaMain.swift in Sources */,
279+
993179E31A72228A003F196F /* Dictionary.swift in Sources */,
276280
993E1B831A6789E500FA2F9A /* SwiftyJSON.swift in Sources */,
277281
99AF26E81A67798900DCD8A6 /* NutellaNetRequest.swift in Sources */,
278282
);

Mac/Nutella/NutellaTests/NutellaTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ class NutellaTests: XCTestCase, NutellaDelegate {
4141
func testRequestSync() {
4242
nutella?.net.handleRequest("test/request1")
4343
nutella?.net.handleRequest("test/request2")
44-
nutella?.net.syncRequest("test/request1", message: ["test":"test"], requestName: "test_request1")
45-
nutella?.net.syncRequest("test/request2", message: ["test":"test"], requestName: "test_request2")
44+
nutella?.net.asyncRequest("test/request1", message: ["test":"test"], requestName: "test_request1")
45+
nutella?.net.asyncRequest("test/request2", message: ["test":"test"], requestName: "test_request2")
4646

4747
expectation = expectationWithDescription("Response 1 back")
4848

Nutella.xcworkspace/contents.xcworkspacedata

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)