on master help sign in
Merge aa-clib-appcallbacks
commit95b40f168ac991dd51b568a898abe20e2d87ec8c authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateMon 22 May 2017, 16:30 (9 years ago) parent8100e0253ac06c
5 files changed+48−6
jsaddle-clib/cbits/include/jsaddle.h+4 jsaddle-clib/default.nix+2−2 jsaddle-clib/jsaddle-clib.cabal+2 jsaddle-clib/src-ghc/Language/Javascript/JSaddle/CLib.hs+28−4 jsaddle-clib/src/Language/Javascript/JSaddle/CLib/Internal.hsc+12
jsaddle-clib/cbits/include/jsaddle.h+4
@@ -8,4 +8,8 @@ typedef struct native_callbacks {
88 char * jsaddleHtmlData;
99} native_callbacks;
1010
11+typedef struct app_callbacks {
12+ void (* firebaseInstanceIdService_sendRegistrationToServer) (char *);
13+} app_callbacks;
14+
1115#endif
jsaddle-clib/default.nix+2−2
@@ -1,9 +1,9 @@
1−{ mkDerivation, aeson, base, bytestring, jsaddle, stdenv }:
1+{ mkDerivation, aeson, base, bytestring, data-default, jsaddle, stdenv, text }:
22mkDerivation {
33 pname = "jsaddle-clib";
44 version = "0.8.2.0";
55 src = builtins.filterSource (path: type: !(builtins.elem (baseNameOf path) [ ".git" "dist" ])) ./.;
6− libraryHaskellDepends = [ aeson base bytestring jsaddle ];
6+ libraryHaskellDepends = [ aeson base bytestring data-default jsaddle text ];
77 description = "Interface for JavaScript that works with GHCJS and GHC";
88 license = stdenv.lib.licenses.mit;
99}
jsaddle-clib/jsaddle-clib.cabal+2
@@ -25,6 +25,8 @@ library
2525 base <5,
2626 bytestring >=0.10.6.0 && <0.11,
2727 jsaddle >= 0.9.0.0 && <0.10
28+ data-default,
29+ text
2830 default-language: Haskell2010
2931 hs-source-dirs: src
3032 Include-dirs: cbits/include
jsaddle-clib/src-ghc/Language/Javascript/JSaddle/CLib.hs+28−4
@@ -2,19 +2,27 @@
22module Language.Javascript.JSaddle.CLib
33 ( jsaddleInit
44 , NativeCallbacks (..)
5+ , AppCallbacks (..)
6+ , AppConfig (..)
7+ , pokeAppConfig
8+ , appConfigToAppCallbacks
59 ) where
610
711import Control.Monad (void)
812import Control.Concurrent (forkIO)
913
10−import Data.Monoid ((<>))
14+import Data.Aeson (encode, decode)
1115import Data.ByteString (useAsCString, packCString)
12−import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
1316import Data.ByteString.Char8 (unpack)
14−import Data.Aeson (encode, decode)
17+import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
18+import Data.Default (def, Default)
19+import Data.Monoid ((<>))
20+import Data.Text (Text)
21+import qualified Data.Text as T
1522
16−import Foreign.C.String (CString, newCString)
23+import Foreign.C.String (CString, newCString, peekCString)
1724import Foreign.Ptr (FunPtr, Ptr)
25+import Foreign.Storable (poke)
1826import Foreign.Marshal.Utils (new)
1927
2028import Language.Javascript.JSaddle (JSM)
@@ -53,6 +61,22 @@ jsaddleInit jsm evaluateJavascriptAsyncPtr = do
5361 , _nativeCallbacks_jsaddleHtmlData = jsaddleHtmlPtr
5462 }
5563
64+data AppConfig = AppConfig
65+ { _appConfig_firebaseInstanceIdServiceSendRegistrationToServer :: Text -> IO ()
66+ }
67+
68+instance Default AppConfig where
69+ def = AppConfig (\_ -> return ())
70+
71+appConfigToAppCallbacks :: AppConfig -> IO AppCallbacks
72+appConfigToAppCallbacks (AppConfig firebaseReg) = do
73+ firebaseRegPtr <- wrapMessageCallback $ \token ->
74+ firebaseReg =<< (T.pack <$> peekCString token)
75+ return $ AppCallbacks firebaseRegPtr
76+
77+pokeAppConfig :: Ptr AppCallbacks -> AppConfig -> IO ()
78+pokeAppConfig ptr cfg = poke ptr =<< appConfigToAppCallbacks cfg
79+
5680jsaddleJs :: ByteString
5781jsaddleJs = ghcjsHelpers <> "\
5882 \runJSaddleBatch = (function() {\n\
jsaddle-clib/src/Language/Javascript/JSaddle/CLib/Internal.hsc+12
@@ -26,3 +26,15 @@ instance Storable NativeCallbacks where
2626 <*> #{peek native_callbacks, jsaddleResult} p
2727 <*> #{peek native_callbacks, jsaddleJsData} p
2828 <*> #{peek native_callbacks, jsaddleHtmlData} p
29+
30+data AppCallbacks = AppCallbacks
31+ { _appCallbacks_firebaseInstanceIdService_sendRegistrationToServer :: !(FunPtr (CString -> IO ()))
32+ }
33+
34+instance Storable AppCallbacks where
35+ sizeOf _ = #{size app_callbacks}
36+ alignment _ = #{alignment app_callbacks}
37+ poke p nc = do
38+ #{poke app_callbacks, firebaseInstanceIdService_sendRegistrationToServer} p $ _appCallbacks_firebaseInstanceIdService_sendRegistrationToServer nc
39+ peek p = AppCallbacks
40+ <$> #{peek app_callbacks, firebaseInstanceIdService_sendRegistrationToServer} p