> On 6 Jan 2020, at 00:51, Rand Dvorak <randdvo...@gmail.com> wrote:
> 
> 
> I am trying to implement a simple server in PyObjC for the Criollo HTTP 
> server.  The server has a method to set route handlers by passing a block to 
> setup the route and then when it receives and HTTP request for the route it 
> calls the block.  The block has the signature:
> 
> typedef void(^CRRouteBlock)(CRRequest* _Nonnull request, CRResponse* _Nonnull 
> response, CRRouteCompletionBlock _Nonnull completionHandler);
> 
> 
> So, here is my simple proof of concept:
> 
> import objc 
> CRApplication = objc.lookUpClass("CRApplication")
> global server
> 
> def helloHandler(self, request, response, handler):
>       response.send_("Hello World!")
>       handler()
>       
> if __name__ == "__main__":
>       server = CRApplication.sharedApplication().delegate().server()
>       server.get_block_("/", objc.selector(helloHandler, 
> signature=b'v@:@@@‘))  *** error occurs here
>       server.startListening()
> 
> 
> But, when I try to setup the route I get the following error:
> 
> Traceback (most recent call last):
>  File "main.py", line 21, in <module>
>    server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@'))
> TypeError: Argument 3 is a block, but no signature available
> 
> 
> Any ideas how to workaround this issue and implement the route handlers in 
> PyObjC?

The code below should do the trick, but eas typed directly into this mail and 
might therefore contain syntax errors.

import objc
objc.registerMetaDataForSelector(
    b”CRApplication”,  # name of the class implementing “get_block:”, or 
“NSObject”
    b”get_block:”,
   {
     “arguments”: {
       2: {
         “callable”: {
          “arguments”: {
           0: { “type”: b”^v” },
           1: { “type”: b”@” },
           2: { “type”: b”@” },
           3: { “type”: b”@” }
          },
          “retail”: { “type”: b”v” }
        } 
      }
   }
)

This tells the bridge the signature for the block argument of the “get_block:” 
selector, which is information that cannot be retrieved from the Objective-C 
runtime.  Argument 2 is the first real argument of ObjC selectors, after the 
implicit arguments “self” and “_imp” (which is not available in python code).

Ronald
—

Twitter: @ronaldoussoren
Blog: https://blog.ronaldoussoren.net/
> _______________________________________________
> Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
> https://mail.python.org/mailman/listinfo/pythonmac-sig
> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG

_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
https://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG

Reply via email to