Browse Source

update StickyNotes sample to use latest API changes.

Tim Burks 9 years ago
parent
commit
733cb0b61e

+ 0 - 1
Examples/Echo/Swift/Echo/AppDelegate.swift

@@ -32,7 +32,6 @@
  */
 import Cocoa
 import gRPC
-import QuickProto
 
 @NSApplicationMain
 class AppDelegate: NSObject, NSApplicationDelegate {

+ 4 - 0
Examples/StickyNotes/StickyNotes.xcodeproj/project.pbxproj

@@ -15,6 +15,7 @@
 		D3A0EAB41D74B851008F687D /* gRPC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35C9FC61D74B097000443CD /* gRPC.framework */; };
 		D3A0EAB51D74B851008F687D /* QuickProto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35C9FBE1D74B08C000443CD /* QuickProto.framework */; };
 		D3A0EABD1D74BABC008F687D /* stickynote.out in Resources */ = {isa = PBXBuildFile; fileRef = D3A0EABC1D74BABC008F687D /* stickynote.out */; };
+		D3A682F91D81D601009E3E9E /* StickyServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3A682F81D81D601009E3E9E /* StickyServer.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -66,6 +67,7 @@
 		D35C9FC71D74B0C1000443CD /* StickyNoteViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickyNoteViewController.swift; sourceTree = "<group>"; };
 		D35C9FD01D74B3BD000443CD /* StickyNoteView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickyNoteView.swift; sourceTree = "<group>"; };
 		D3A0EABC1D74BABC008F687D /* stickynote.out */ = {isa = PBXFileReference; lastKnownFileType = file; path = stickynote.out; sourceTree = "<group>"; };
+		D3A682F81D81D601009E3E9E /* StickyServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickyServer.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -109,6 +111,7 @@
 				D35C9FB21D74B079000443CD /* Info.plist */,
 				D35C9FC71D74B0C1000443CD /* StickyNoteViewController.swift */,
 				D35C9FD01D74B3BD000443CD /* StickyNoteView.swift */,
+				D3A682F81D81D601009E3E9E /* StickyServer.swift */,
 			);
 			path = StickyNotes;
 			sourceTree = "<group>";
@@ -242,6 +245,7 @@
 				D35C9FD11D74B3BD000443CD /* StickyNoteView.swift in Sources */,
 				D35C9FC81D74B0C1000443CD /* StickyNoteViewController.swift in Sources */,
 				D35C9FAC1D74B079000443CD /* AppDelegate.swift in Sources */,
+				D3A682F91D81D601009E3E9E /* StickyServer.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 5 - 90
Examples/StickyNotes/StickyNotes/AppDelegate.swift

@@ -32,105 +32,20 @@
  */
 import Cocoa
 import gRPC
-import QuickProto
 
 @NSApplicationMain
 class AppDelegate: NSObject, NSApplicationDelegate {
 
   @IBOutlet weak var window: NSWindow!
 
+  var stickyServer: StickyServer!
+
   func applicationDidFinishLaunching(_ aNotification: Notification) {
     gRPC.initialize()
-    startServer(address:"localhost:8081")
-  }
-
-  func log(_ message: String) {
-    print(message)
-  }
-
-  func startServer(address:String) {
-    let fileDescriptorSet = FileDescriptorSet(filename:"stickynote.out")
-
-    DispatchQueue.global().async {
-      self.log("Server Starting")
-      self.log("GRPC version " + gRPC.version())
-
-      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))
-            }
-
-            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()) {
-
-              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)
-
-                let trailingMetadataToSend = Metadata(pairs:[MetadataPair(key:"0", value:"zero"),
-                                                             MetadataPair(key:"1", value:"one"),
-                                                             MetadataPair(key:"2", value:"two")])
-
-                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
-        }
-      }
-    }
+    
+    self.stickyServer = StickyServer(address:"localhost:8085")
+    stickyServer.start()
   }
 
-  /// draw a stickynote
-  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)
-                              let trialS = CGFloat(300.0)
-                              let trialFont = NSFont.userFont(ofSize:trialS)!
-                              let trialAttributes = [NSFontAttributeName: trialFont]
-                              let trialSize = string.size(withAttributes: trialAttributes)
-                              let s = trialS * 300 / trialSize.width;
-                              let font = NSFont.userFont(ofSize:s)!
-                              let attributes = [NSFontAttributeName: font]
-                              let size = string.size(withAttributes: attributes)
-                              let x = rect.origin.x + 0.5*(rect.size.width - size.width)
-                              let y = rect.origin.y + 0.5*(rect.size.height - size.height)
-                              let r = NSMakeRect(x, y, size.width, size.height)
-                              string.draw(in: r, withAttributes:attributes)
-                              return true})
-    let imgData: Data! = image.tiffRepresentation!
-    let bitmap: NSBitmapImageRep! = NSBitmapImageRep(data: imgData)
-    let pngImage = bitmap!.representation(using:NSBitmapImageFileType.PNG, properties:[:])
-    return NSData(data:pngImage!)
-  }
 }
 

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

@@ -38,14 +38,26 @@ class StickyNoteViewController : NSViewController, NSTextFieldDelegate {
   @IBOutlet weak var messageField: NSTextField!
   @IBOutlet weak var imageView: NSImageView!
 
+  var client: Client!
+
+  var enabled = false
+
   @IBAction func messageReturnPressed(sender: NSTextField) {
-    callServer(address:"localhost:8081")
+    if enabled {
+      callServer(address:"localhost:8085")
+    }
   }
 
   override func viewDidLoad() {
     gRPC.initialize()
   }
 
+  override func viewDidAppear() {
+    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
+      self.enabled = true
+    }
+  }
+
   func log(_ message: String) {
     print(message)
   }
@@ -53,50 +65,56 @@ class StickyNoteViewController : NSViewController, NSTextFieldDelegate {
   func callServer(address:String) {
     let fileDescriptorSet = FileDescriptorSet(filename:"stickynote.out")
 
+    let text = self.messageField.stringValue
+    
     // build the message
     if let requestMessage = fileDescriptorSet.createMessage(name:"StickyNoteRequest") {
-      requestMessage.addField(name:"message", value:self.messageField.stringValue)
+      requestMessage.addField(name:"message", value:text)
 
       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 client = Client(address:address)
-      let response = client.performRequest(host:requestHost,
-                                           method:requestMethod,
-                                           message:requestBuffer,
-                                           metadata:requestMetadata)
-
-      if let initialMetadata = response.initialMetadata {
-        for j in 0..<initialMetadata.count() {
-          self.log("Received initial metadata -> "
-            + initialMetadata.key(index:j) + " : "
-            + initialMetadata.value(index:j))
-        }
-      }
+      client = Client(address:address)
+      let call = client.createCall(host: requestHost, method: requestMethod, timeout: 600)
+      call.performNonStreamingCall(messageData: requestMessage.serialize(),
+                                   metadata: requestMetadata,
+                                   completion:
+        { (response) in
+
+          if let initialMetadata = response.initialMetadata {
+            for j in 0..<initialMetadata.count() {
+              self.log("Received initial metadata -> "
+                + initialMetadata.key(index:j) + " : "
+                + initialMetadata.value(index:j))
+            }
+          }
 
-      self.log("Received status: \(response.status) " + response.statusDetails)
+          self.log("Received status: \(response.status) " + response.statusDetails)
 
-      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
+          if let responseData = response.messageData,
+            let responseMessage = fileDescriptorSet.readMessage(name:"StickyNoteResponse",
+                                                                proto:responseData) {
+            responseMessage.forOneField(name:"image") {(field) in
+              if let image = NSImage(data: field.data() as Data) {
+                DispatchQueue.main.async {
+                  self.imageView.image = image
+                }
+              }
+            }
           }
-        }
-      }
 
-      if let trailingMetadata = response.trailingMetadata {
-        for j in 0..<trailingMetadata.count() {
-          self.log("Received trailing metadata -> "
-            + trailingMetadata.key(index:j) + " : "
-            + trailingMetadata.value(index:j))
+          if let trailingMetadata = response.trailingMetadata {
+            for j in 0..<trailingMetadata.count() {
+              self.log("Received trailing metadata -> "
+                + trailingMetadata.key(index:j) + " : "
+                + trailingMetadata.value(index:j))
+            }
+          }
         }
-      }
+      )
     }
   }
 }

+ 94 - 0
Examples/StickyNotes/StickyNotes/StickyServer.swift

@@ -0,0 +1,94 @@
+//
+//  StickyServer.swift
+//  StickyNotes
+//
+//  Created by Tim Burks on 9/8/16.
+//  Copyright © 2016 Google. All rights reserved.
+//
+
+import Foundation
+import gRPC
+import QuickProto
+
+class StickyServer {
+
+  private var address : String
+
+  init(address: String) {
+    gRPC.initialize()
+    self.address = address
+  }
+
+  func log(_ message: String) {
+    print(message)
+  }
+
+  func start() {
+    let fileDescriptorSet = FileDescriptorSet(filename:"stickynote.out")
+
+    DispatchQueue.global().async {
+      self.log("Server Starting")
+      self.log("GRPC version " + gRPC.version())
+
+      let server = gRPC.Server(address:self.address)
+      server.run {(requestHandler) in
+
+        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))
+        }
+
+        if (requestHandler.method() == "/messagepb.StickyNote/Get") {
+          requestHandler.receiveMessage(initialMetadata:Metadata())
+          {(requestBuffer) in
+            if let requestBuffer = requestBuffer,
+              let requestMessage =
+              fileDescriptorSet.readMessage(name:"StickyNoteRequest",
+                                            proto:requestBuffer.data()) {
+              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)
+                requestHandler.sendResponse(message:ByteBuffer(data:replyMessage.serialize()),
+                                            trailingMetadata:Metadata())
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /// draw a stickynote
+  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)
+                              let trialS = CGFloat(300.0)
+                              let trialFont = NSFont.userFont(ofSize:trialS)!
+                              let trialAttributes = [NSFontAttributeName: trialFont]
+                              let trialSize = string.size(withAttributes: trialAttributes)
+                              let s = trialS * 300 / trialSize.width;
+                              let font = NSFont.userFont(ofSize:s)!
+                              let attributes = [NSFontAttributeName: font]
+                              let size = string.size(withAttributes: attributes)
+                              let x = rect.origin.x + 0.5*(rect.size.width - size.width)
+                              let y = rect.origin.y + 0.5*(rect.size.height - size.height)
+                              let r = NSMakeRect(x, y, size.width, size.height)
+                              string.draw(in: r, withAttributes:attributes)
+                              return true})
+    let imgData: Data! = image.tiffRepresentation!
+    let bitmap: NSBitmapImageRep! = NSBitmapImageRep(data: imgData)
+    let pngImage = bitmap!.representation(using:NSBitmapImageFileType.PNG, properties:[:])
+    return NSData(data:pngImage!)
+  }
+
+}

+ 3 - 1
Packages/gRPC/Sources/CallResponse.swift

@@ -95,7 +95,9 @@ public class CallResponse {
     self.completion = GRPC_OP_COMPLETE
     self.status = status
     self.statusDetails = statusDetails
-    self.messageData = message!.data()
+    if let message = message {
+      self.messageData = message.data()
+    }
     self.initialMetadata = initialMetadata
     self.trailingMetadata = trailingMetadata
   }