Browse Source

Add simple gRPC server to StickyNotes app

Tim Burks 9 years ago
parent
commit
8be779ec8d

+ 88 - 4
Examples/StickyNotes/StickyNotes/AppDelegate.swift

@@ -31,21 +31,105 @@
  *
  *
  */
  */
 import Cocoa
 import Cocoa
+import gRPC
+import QuickProto
 
 
 @NSApplicationMain
 @NSApplicationMain
 class AppDelegate: NSObject, NSApplicationDelegate {
 class AppDelegate: NSObject, NSApplicationDelegate {
 
 
   @IBOutlet weak var window: NSWindow!
   @IBOutlet weak var window: NSWindow!
 
 
-
   func applicationDidFinishLaunching(_ aNotification: Notification) {
   func applicationDidFinishLaunching(_ aNotification: Notification) {
-    // Insert code here to initialize your application
+    startServer(address:"localhost:8081")
+  }
+
+  func log(_ message: String) {
+    print(message)
   }
   }
 
 
-  func applicationWillTerminate(_ aNotification: Notification) {
-    // Insert code here to tear down your application
+  func startServer(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)
+
+      DispatchQueue.global().async {
+        self.log("Server Starting")
+        self.log("GRPC version " + gRPC.version())
+
+        let server = gRPC.Server(address:address)
+        server.start()
+
+        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()
+              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())
+
+                  // 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()
+                  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("------------------------------")
+                }
+              }
+            }
+          } else if (completionType == GRPC_QUEUE_TIMEOUT) {
+            // everything is fine
+          } else if (completionType == GRPC_QUEUE_SHUTDOWN) {
+            // we should stop
+          }
+        }
+      }
+    }
   }
   }
 
 
+  func drawImage(message: String) -> NSData {
+    let image = NSImage.init(size: NSSize.init(width: 400, height: 400),
+                             flipped: false,
+                             drawingHandler: { (rect) -> Bool in
+                              NSColor.yellow.set()
+                              NSRectFill(rect)
+                              NSColor.black.set()
+                              let string = NSString(string:message)
+                              // TODO: size and center string
+                              // let attributes = [NSFontAttributeName: NSFont.userFont(ofSize:40)]
+                              // string.size(withAttributes: attributes)
+                              string.draw(in: rect, withAttributes: [:])
+                              return true})
 
 
+    let imgData: Data! = image.tiffRepresentation!
+    let bitmap: NSBitmapImageRep! = NSBitmapImageRep(data: imgData)
+    let pngCoverImage = bitmap!.representation(using:NSBitmapImageFileType.PNG, properties:[:])
+    return NSData(data:pngCoverImage!)
+  }
 }
 }
 
 

+ 1 - 1
Examples/StickyNotes/StickyNotes/StickyNoteViewController.swift

@@ -45,7 +45,7 @@ class StickyNoteViewController : NSViewController, NSTextFieldDelegate {
 
 
   @IBAction func messageReturnPressed(sender: NSTextField) {
   @IBAction func messageReturnPressed(sender: NSTextField) {
     log("return pressed")
     log("return pressed")
-    callServer(address:"localhost:8080")
+    callServer(address:"localhost:8081")
   }
   }
 
 
   func log(_ message: String) {
   func log(_ message: String) {