Browse Source

Polishing API usage in the StickyNotes sample

Tim Burks 9 years ago
parent
commit
2cce8444f5

+ 41 - 48
Examples/StickyNotes/StickyNotes/AppDelegate.swift

@@ -49,70 +49,63 @@ class AppDelegate: NSObject, NSApplicationDelegate {
   }
   }
 
 
   func startServer(address:String) {
   func startServer(address:String) {
+    let fileDescriptorSet = FileDescriptorSet(filename:"stickynote.out")
 
 
-    if let fileDescriptorSetProto =
-      NSData(contentsOfFile:Bundle.main.path(forResource: "stickynote", ofType: "out")!) {
-      // load a FileDescriptorSet that includes a descriptor for the messages we create and read
-      let fileDescriptorSet = FileDescriptorSet(proto:fileDescriptorSetProto)
+    DispatchQueue.global().async {
+      self.log("Server Starting")
+      self.log("GRPC version " + gRPC.version())
 
 
-      DispatchQueue.global().async {
-        self.log("Server Starting")
-        self.log("GRPC version " + gRPC.version())
+      let server = gRPC.Server(address:address)
+      server.start()
 
 
-        let server = gRPC.Server(address:address)
-        server.start()
+      while(true) {
+        let (callError, completionType, requestHandler) = server.getNextRequest(timeout:1.0)
+        if (callError != GRPC_CALL_OK) {
+          self.log("Call error \(callError)")
+          self.log("------------------------------")
+        } else if (completionType == GRPC_OP_COMPLETE) {
+          if let requestHandler = requestHandler {
+            self.log("Received request to " + requestHandler.host()
+              + " calling " + requestHandler.method()
+              + " from " + requestHandler.caller())
+            let initialMetadata = requestHandler.requestMetadata
+            for i in 0..<initialMetadata.count() {
+              self.log("Received initial metadata -> " + initialMetadata.key(index:i) + ":" + initialMetadata.value(index:i))
+            }
 
 
-        var requestCount = 0
-        while(true) {
-          let (callError, completionType, requestHandler) = server.getNextRequest(timeout:1.0)
-          if (callError != GRPC_CALL_OK) {
-            self.log("\(requestCount): Call error \(callError)")
-            self.log("------------------------------")
-          } else if (completionType == GRPC_OP_COMPLETE) {
-            if let requestHandler = requestHandler {
-              requestCount += 1
-              self.log("\(requestCount): Received request " + requestHandler.host() + " " + requestHandler.method() + " from " + requestHandler.caller())
-              let initialMetadata = requestHandler.requestMetadata
-              for i in 0..<initialMetadata.count() {
-                self.log("\(requestCount): Received initial metadata -> " + initialMetadata.key(index:i) + ":" + initialMetadata.value(index:i))
-              }
+            let initialMetadataToSend = Metadata(pairs:[MetadataPair(key:"a", value:"Apple"),
+                                                        MetadataPair(key:"b", value:"Banana"),
+                                                        MetadataPair(key:"c", value:"Cherry")])
+            let (_, _, requestBuffer) = requestHandler.receiveMessage(initialMetadata:initialMetadataToSend)
+            if let requestBuffer = requestBuffer,
+              let requestMessage = fileDescriptorSet.readMessage(name:"StickyNoteRequest",
+                                                                 proto:requestBuffer.data()) {
 
 
-              let initialMetadataToSend = Metadata()
-              initialMetadataToSend.add(key:"a", value:"Apple")
-              initialMetadataToSend.add(key:"b", value:"Banana")
-              initialMetadataToSend.add(key:"c", value:"Cherry")
-              let (_, _, message) = requestHandler.receiveMessage(initialMetadata:initialMetadataToSend)
-              if let message = message {
-                self.log("\(requestCount): Received message: \(message.data())")
-                let requestMessage = fileDescriptorSet.readMessage(name:"StickyNoteRequest", proto:message.data())
+              requestMessage.forOneField(name:"message") {(field) in
+                let imageData = self.drawImage(message: field.string())
 
 
-                requestMessage?.forOneField(name:"message") {(field) in
-                  let imageData = self.drawImage(message: field.string())
+                let replyMessage = fileDescriptorSet.createMessage(name:"StickyNoteResponse")!
+                replyMessage.addField(name:"image", value:imageData)
 
 
-                  // construct an internal representation of the message
-                  let replyMessage = fileDescriptorSet.createMessage(name:"StickyNoteResponse")!
-                  replyMessage.addField(name:"image") {(field) in field.setData(imageData)}
+                let trailingMetadataToSend = Metadata(pairs:[MetadataPair(key:"0", value:"zero"),
+                                                             MetadataPair(key:"1", value:"one"),
+                                                             MetadataPair(key:"2", value:"two")])
 
 
-                  let trailingMetadataToSend = Metadata()
-                  trailingMetadataToSend.add(key:"0", value:"zero")
-                  trailingMetadataToSend.add(key:"1", value:"one")
-                  trailingMetadataToSend.add(key:"2", value:"two")
-                  let (_, _) = requestHandler.sendResponse(message:ByteBuffer(data:replyMessage.serialize()),
-                                                           trailingMetadata:trailingMetadataToSend)
-                  self.log("------------------------------")
-                }
+                let (_, _) = requestHandler.sendResponse(message:ByteBuffer(data:replyMessage.serialize()),
+                                                         trailingMetadata:trailingMetadataToSend)
               }
               }
             }
             }
-          } else if (completionType == GRPC_QUEUE_TIMEOUT) {
-            // everything is fine
-          } else if (completionType == GRPC_QUEUE_SHUTDOWN) {
-            // we should stop
           }
           }
+        } else if (completionType == GRPC_QUEUE_TIMEOUT) {
+          // everything is fine
+        } else if (completionType == GRPC_QUEUE_SHUTDOWN) {
+          // we should stop
         }
         }
       }
       }
     }
     }
   }
   }
 
 
+  /// draw a stickynote
   func drawImage(message: String) -> NSData {
   func drawImage(message: String) -> NSData {
     let image = NSImage.init(size: NSSize.init(width: 400, height: 400),
     let image = NSImage.init(size: NSSize.init(width: 400, height: 400),
                              flipped: false,
                              flipped: false,

+ 39 - 49
Examples/StickyNotes/StickyNotes/StickyNoteViewController.swift

@@ -42,69 +42,59 @@ class StickyNoteViewController : NSViewController, NSTextFieldDelegate {
     callServer(address:"localhost:8081")
     callServer(address:"localhost:8081")
   }
   }
 
 
+  override func viewDidLoad() {
+    gRPC.initialize()
+  }
+
   func log(_ message: String) {
   func log(_ message: String) {
     print(message)
     print(message)
   }
   }
 
 
   func callServer(address:String) {
   func callServer(address:String) {
-    if let fileDescriptorSetProto =
-      NSData(contentsOfFile:Bundle.main.path(forResource: "stickynote", ofType: "out")!) {
-      // load a FileDescriptorSet that includes a descriptor for the message to be created
-      let fileDescriptorSet = FileDescriptorSet(proto:fileDescriptorSetProto)
-
-      // construct an internal representation of the message
-      if let message = fileDescriptorSet.createMessage(name:"StickyNoteRequest") {
-        message.addField(name:"message") {(field) in field.setString(self.messageField.stringValue)}
-        message.display()
+    let fileDescriptorSet = FileDescriptorSet(filename:"stickynote.out")
 
 
-        // write the message as a protocol buffer
-        let data = message.serialize()
-        data.write(toFile: "SampleRequest.out", atomically: false)
+    // build the message
+    if let requestMessage = fileDescriptorSet.createMessage(name:"StickyNoteRequest") {
+      requestMessage.addField(name:"message", value:self.messageField.stringValue)
 
 
-        self.log("Client Starting")
-        self.log("GRPC version " + gRPC.version())
+      let requestHost = "foo.test.google.fr"
+      let requestMethod = "/messagepb.StickyNote/Get"
+      let requestBuffer = ByteBuffer(data:requestMessage.serialize())
+      let requestMetadata = Metadata(pairs:[MetadataPair(key:"x", value:"xylophone"),
+                                            MetadataPair(key:"y", value:"yu"),
+                                            MetadataPair(key:"z", value:"zither")])
 
 
-        let host = "foo.test.google.fr"
-        let message = gRPC.ByteBuffer(data:data)
+      let client = Client(address:address)
+      let response = client.performRequest(host:requestHost,
+                                           method:requestMethod,
+                                           message:requestBuffer,
+                                           metadata:requestMetadata)
 
 
-        let i = 1
-        let c = gRPC.Client(address:address)
-        let method = "/messagepb.StickyNote/Get"
-
-        let metadata = Metadata(pairs:[MetadataPair(key:"x", value:"xylophone"),
-                                       MetadataPair(key:"y", value:"yu"),
-                                       MetadataPair(key:"z", value:"zither")])
+      if let initialMetadata = response.initialMetadata {
+        for j in 0..<initialMetadata.count() {
+          self.log("Received initial metadata -> "
+            + initialMetadata.key(index:j) + " : "
+            + initialMetadata.value(index:j))
+        }
+      }
 
 
-        let response = c.performRequest(host:host,
-                                        method:method,
-                                        message:message,
-                                        metadata:metadata)
+      self.log("Received status: \(response.status) " + response.statusDetails)
 
 
-        if let initialMetadata = response.initialMetadata {
-          for j in 0..<initialMetadata.count() {
-            self.log("\(i): Received initial metadata -> " + initialMetadata.key(index:j) + " : " + initialMetadata.value(index:j))
+      if let responseBuffer = response.message,
+        let responseMessage = fileDescriptorSet.readMessage(name:"StickyNoteResponse",
+                                                            proto:responseBuffer.data()) {
+        responseMessage.forOneField(name:"image") {(field) in
+          if let image = NSImage(data: field.data() as Data) {
+            self.imageView.image = image
           }
           }
         }
         }
+      }
 
 
-        self.log("Received status: \(response.status) " + response.statusDetails)
-        if let responsemessage = response.message {
-          let data = responsemessage.data()
-          if let message = fileDescriptorSet.readMessage(name:"StickyNoteResponse",
-                                                         proto:data) {
-            message.forOneField(name:"image") {(field) in
-              let data = field.data()
-              if let image = NSImage(data: data as Data) {
-                self.imageView.image = image
-              }
-            }
-          }
-          if let trailingMetadata = response.trailingMetadata {
-            for j in 0..<trailingMetadata.count() {
-              self.log("\(i): Received trailing metadata -> " + trailingMetadata.key(index:j) + " : " + trailingMetadata.value(index:j))
-            }
-          }
-          self.log("------------------------------")
-          self.log("Client Stopped")
+      if let trailingMetadata = response.trailingMetadata {
+        for j in 0..<trailingMetadata.count() {
+          self.log("Received trailing metadata -> "
+            + trailingMetadata.key(index:j) + " : "
+            + trailingMetadata.value(index:j))
         }
         }
       }
       }
     }
     }

+ 0 - 3
Packages/gRPC/Sources/ByteBuffer.swift

@@ -62,7 +62,6 @@ public class ByteBuffer {
     self.b = cgrpc_byte_buffer_create_with_data(data.bytes, data.length)
     self.b = cgrpc_byte_buffer_create_with_data(data.bytes, data.length)
   }
   }
 
 
-
   deinit {
   deinit {
     cgrpc_byte_buffer_destroy(b);
     cgrpc_byte_buffer_destroy(b);
   }
   }
@@ -75,7 +74,6 @@ public class ByteBuffer {
                   encoding:String.Encoding.utf8)!
                   encoding:String.Encoding.utf8)!
   }
   }
 
 
-
   /// Gets raw data from the contents of the ByteBuffer
   /// Gets raw data from the contents of the ByteBuffer
   ///
   ///
   /// - Returns: data formed from the ByteBuffer contents
   /// - Returns: data formed from the ByteBuffer contents
@@ -84,5 +82,4 @@ public class ByteBuffer {
     let bytes = cgrpc_byte_buffer_as_data(b, &length)
     let bytes = cgrpc_byte_buffer_as_data(b, &length)
     return NSData(bytes:bytes, length: length)
     return NSData(bytes:bytes, length: length)
   }
   }
-
 }
 }

+ 1 - 1
QuickProto/QuickProto/Field.swift

@@ -35,7 +35,7 @@ import Foundation
 /// A representation of a protocol buffer field that can be used to read and build protobufs
 /// A representation of a protocol buffer field that can be used to read and build protobufs
 public class Field {
 public class Field {
   private var descriptor: FieldDescriptor
   private var descriptor: FieldDescriptor
-  private var value: Any!
+  var value: Any!
 
 
   init(descriptor: FieldDescriptor, value: Any) {
   init(descriptor: FieldDescriptor, value: Any) {
     self.descriptor = descriptor
     self.descriptor = descriptor

+ 7 - 0
QuickProto/QuickProto/FileDescriptorSet.swift

@@ -52,6 +52,13 @@ public class FileDescriptorSet {
     }
     }
   }
   }
 
 
+  convenience public init(filename:String) {
+    let path = Bundle.main.resourcePath!.appending("/").appending(filename)
+    let fileDescriptorSetProto = NSData(contentsOfFile:path)
+    assert(fileDescriptorSetProto != nil) // the file to be loaded must be in the resource bundle
+    self.init(proto:fileDescriptorSetProto!)
+  }
+
   init(message:Message) {
   init(message:Message) {
     message.forEachField(path:["file"]) { (field) in
     message.forEachField(path:["file"]) { (field) in
       let fileDescriptor = FileDescriptor(message: field.message())
       let fileDescriptor = FileDescriptor(message: field.message())

+ 15 - 0
QuickProto/QuickProto/Message.swift

@@ -66,6 +66,21 @@ public class Message {
     }
     }
   }
   }
 
 
+
+  /// add a field and set it to the specified value
+  public func addField(name: String, value: Any) {
+    // look up the field descriptor
+    for fieldDescriptor in descriptor.fieldDescriptors {
+      if (fieldDescriptor.name == name) {
+        // create a field with that descriptor
+        let field = Field(descriptor:fieldDescriptor)
+        // add it to self.fields
+        self.fields.append(field)
+        field.value = value
+      }
+    }
+  }
+
   /// get one field with the specified name
   /// get one field with the specified name
   public func oneField(name: String) -> Field? {
   public func oneField(name: String) -> Field? {
     for field in fields {
     for field in fields {