summaryrefslogtreecommitdiff
path: root/src/Erebos/ICE.chs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Erebos/ICE.chs')
-rw-r--r--src/Erebos/ICE.chs53
1 files changed, 35 insertions, 18 deletions
diff --git a/src/Erebos/ICE.chs b/src/Erebos/ICE.chs
index 2c6f500..a3dd9bc 100644
--- a/src/Erebos/ICE.chs
+++ b/src/Erebos/ICE.chs
@@ -8,6 +8,7 @@ module Erebos.ICE (
IceRemoteInfo,
iceCreateConfig,
+ iceStopThread,
iceCreateSession,
iceDestroy,
iceRemoteInfo,
@@ -15,7 +16,7 @@ module Erebos.ICE (
iceConnect,
iceSend,
- iceSetChan,
+ serverPeerIce,
) where
import Control.Arrow
@@ -31,7 +32,6 @@ import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Encoding qualified as T
import Data.Text.Read qualified as T
-import Data.Void
import Data.Word
import Foreign.C.String
@@ -42,7 +42,7 @@ import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.StablePtr
-import Erebos.Flow
+import Erebos.Network
import Erebos.Object
import Erebos.Storable
import Erebos.Storage
@@ -52,7 +52,7 @@ import Erebos.Storage
data IceSession = IceSession
{ isStrans :: PjIceStrans
, _isConfig :: IceConfig
- , isChan :: MVar (Either [ByteString] (Flow Void ByteString))
+ , isChan :: MVar (Either [ ByteString ] (ByteString -> IO ()))
}
instance Eq IceSession where
@@ -64,6 +64,10 @@ instance Ord IceSession where
instance Show IceSession where
show _ = "<ICE>"
+instance PeerAddressType IceSession where
+ sendBytesToAddress = iceSend
+ connectionToAddressClosed = iceDestroy
+
data IceRemoteInfo = IceRemoteInfo
{ iriUsernameFrament :: Text
@@ -125,9 +129,9 @@ instance StorableText IceCandidate where
data PjIceStransCfg
newtype IceConfig = IceConfig (ForeignPtr PjIceStransCfg)
-foreign import ccall unsafe "pjproject.h &ice_cfg_free"
+foreign import ccall unsafe "pjproject.h &erebos_ice_cfg_free"
ice_cfg_free :: FunPtr (Ptr PjIceStransCfg -> IO ())
-foreign import ccall unsafe "pjproject.h ice_cfg_create"
+foreign import ccall unsafe "pjproject.h erebos_ice_cfg_create"
ice_cfg_create :: CString -> Word16 -> CString -> Word16 -> IO (Ptr PjIceStransCfg)
iceCreateConfig :: Maybe ( Text, Word16 ) -> Maybe ( Text, Word16 ) -> IO (Maybe IceConfig)
@@ -139,6 +143,12 @@ iceCreateConfig stun turn =
then return Nothing
else Just . IceConfig <$> newForeignPtr ice_cfg_free cfg
+foreign import ccall unsafe "pjproject.h erebos_ice_cfg_stop_thread"
+ ice_cfg_stop_thread :: Ptr PjIceStransCfg -> IO ()
+
+iceStopThread :: IceConfig -> IO ()
+iceStopThread (IceConfig fcfg) = withForeignPtr fcfg ice_cfg_stop_thread
+
{#pointer *pj_ice_strans as ^ #}
iceCreateSession :: IceConfig -> IceSessionRole -> (IceSession -> IO ()) -> IO IceSession
@@ -151,13 +161,13 @@ iceCreateSession icfg@(IceConfig fcfg) role cb = do
forkIO $ cb sess
sess <- IceSession
<$> (withForeignPtr fcfg $ \cfg ->
- {#call ice_create #} (castPtr cfg) (fromIntegral $ fromEnum role) (castStablePtrToPtr sptr) (castStablePtrToPtr cbptr)
+ {#call erebos_ice_create #} (castPtr cfg) (fromIntegral $ fromEnum role) (castStablePtrToPtr sptr) (castStablePtrToPtr cbptr)
)
<*> pure icfg
<*> (newMVar $ Left [])
return $ sess
-{#fun ice_destroy as ^ { isStrans `IceSession' } -> `()' #}
+{#fun erebos_ice_destroy as iceDestroy { isStrans `IceSession' } -> `()' #}
iceRemoteInfo :: IceSession -> IO IceRemoteInfo
iceRemoteInfo sess = do
@@ -172,7 +182,7 @@ iceRemoteInfo sess = do
let cptrs = take maxcand $ iterate (`plusPtr` maxlen) bytes
pokeArray carr $ take maxcand cptrs
- ncand <- {#call ice_encode_session #} (isStrans sess) ufrag pass def carr (fromIntegral maxlen) (fromIntegral maxcand)
+ ncand <- {#call erebos_ice_encode_session #} (isStrans sess) ufrag pass def carr (fromIntegral maxlen) (fromIntegral maxcand)
if ncand < 0 then fail "failed to generate ICE remote info"
else IceRemoteInfo
<$> (T.pack <$> peekCString ufrag)
@@ -189,13 +199,13 @@ iceShow sess = do
iceConnect :: IceSession -> IceRemoteInfo -> (IO ()) -> IO ()
iceConnect sess remote cb = do
cbptr <- newStablePtr $ cb
- ice_connect sess cbptr
+ erebos_ice_connect sess cbptr
(iriUsernameFrament remote)
(iriPassword remote)
(iriDefaultCandidate remote)
(iriCandidates remote)
-{#fun ice_connect { isStrans `IceSession', castStablePtrToPtr `StablePtr (IO ())',
+{#fun erebos_ice_connect { isStrans `IceSession', castStablePtrToPtr `StablePtr (IO ())',
withText* `Text', withText* `Text', withText* `Text', withTextArray* `[Text]'& } -> `()' #}
withText :: Text -> (Ptr CChar -> IO a) -> IO a
@@ -211,19 +221,19 @@ withTextArray tsAll f = helper tsAll []
withByteStringLen :: Num n => ByteString -> ((Ptr CChar, n) -> IO a) -> IO a
withByteStringLen t f = unsafeUseAsCStringLen t (f . (id *** fromIntegral))
-{#fun ice_send as ^ { isStrans `IceSession', withByteStringLen* `ByteString'& } -> `()' #}
+{#fun erebos_ice_send as iceSend { isStrans `IceSession', withByteStringLen* `ByteString'& } -> `()' #}
foreign export ccall ice_call_cb :: StablePtr (IO ()) -> IO ()
ice_call_cb :: StablePtr (IO ()) -> IO ()
ice_call_cb = join . deRefStablePtr
-iceSetChan :: IceSession -> Flow Void ByteString -> IO ()
-iceSetChan sess chan = do
+iceSetServer :: IceSession -> Server -> IO ()
+iceSetServer sess server = do
modifyMVar_ (isChan sess) $ \orig -> do
case orig of
- Left buf -> mapM_ (writeFlowIO chan) $ reverse buf
+ Left buf -> mapM_ (receivedFromCustomAddress server sess) $ reverse buf
Right _ -> return ()
- return $ Right chan
+ return $ Right $ receivedFromCustomAddress server sess
foreign export ccall ice_rx_data :: StablePtr IceSession -> Ptr CChar -> Int -> IO ()
ice_rx_data :: StablePtr IceSession -> Ptr CChar -> Int -> IO ()
@@ -231,5 +241,12 @@ ice_rx_data sptr buf len = do
sess <- deRefStablePtr sptr
bs <- packCStringLen (buf, len)
modifyMVar_ (isChan sess) $ \case
- mc@(Right chan) -> writeFlowIO chan bs >> return mc
- Left bss -> return $ Left (bs:bss)
+ mc@(Right sendToServer) -> sendToServer bs >> return mc
+ Left bss -> return $ Left (bs : bss)
+
+
+serverPeerIce :: Server -> IceSession -> IO Peer
+serverPeerIce server ice = do
+ peer <- serverPeerCustom server ice
+ iceSetServer ice server
+ return peer