packages feed

toxcore-c-0.2.11: src/Network/Tox/C/Callbacks.hs

module Network.Tox.C.Callbacks where

import           Control.Exception  (bracket)
import           Foreign.Ptr        (freeHaskellFunPtr, nullFunPtr)

import qualified Network.Tox.C.Tox  as Tox
import           Network.Tox.C.Type (Tox)


-- | Low level event handler. The functions in this class are directly
-- registered with the corresponding C callback. We use 'StablePtr' to pass
-- opaque Haskell values around in C.
class CHandler a where
  cSelfConnectionStatus     :: Tox.SelfConnectionStatusCb     a
  cSelfConnectionStatus _ _ = return
  cFriendName               :: Tox.FriendNameCb               a
  cFriendName _ _ _ = return
  cFriendStatusMessage      :: Tox.FriendStatusMessageCb      a
  cFriendStatusMessage _ _ _ = return
  cFriendStatus             :: Tox.FriendStatusCb             a
  cFriendStatus _ _ _ = return
  cFriendConnectionStatus   :: Tox.FriendConnectionStatusCb   a
  cFriendConnectionStatus _ _ _ = return
  cFriendTyping             :: Tox.FriendTypingCb             a
  cFriendTyping _ _ _ = return
  cFriendReadReceipt        :: Tox.FriendReadReceiptCb        a
  cFriendReadReceipt _ _ _ = return
  cFriendRequest            :: Tox.FriendRequestCb            a
  cFriendRequest _ _ _ = return
  cFriendMessage            :: Tox.FriendMessageCb            a
  cFriendMessage _ _ _ _ = return
  cFileRecvControl          :: Tox.FileRecvControlCb          a
  cFileRecvControl _ _ _ _ = return
  cFileChunkRequest         :: Tox.FileChunkRequestCb         a
  cFileChunkRequest _ _ _ _ _ = return
  cFileRecv                 :: Tox.FileRecvCb                 a
  cFileRecv _ _ _ _ _ _ = return
  cFileRecvChunk            :: Tox.FileRecvChunkCb            a
  cFileRecvChunk _ _ _ _ _ = return
  cConferenceInvite         :: Tox.ConferenceInviteCb         a
  cConferenceInvite _ _ _ _ = return
  cConferenceMessage        :: Tox.ConferenceMessageCb        a
  cConferenceMessage _ _ _ _ _ = return
  cConferenceTitle          :: Tox.ConferenceTitleCb          a
  cConferenceTitle _ _ _ _ = return
  cConferencePeerName :: Tox.ConferencePeerNameCb a
  cConferencePeerName _ _ _ _ = return
  cConferencePeerListChanged :: Tox.ConferencePeerListChangedCb a
  cConferencePeerListChanged _ _ = return
  cFriendLossyPacket        :: Tox.FriendLossyPacketCb        a
  cFriendLossyPacket _ _ _ = return
  cFriendLosslessPacket     :: Tox.FriendLosslessPacketCb     a
  cFriendLosslessPacket _ _ _ = return


-- | Installs an event handler into the passed 'Tox' instance. After performing
-- the IO action, all event handlers are reset to null. This function does not
-- save the original event handlers.
withCHandler :: CHandler a => Tox a -> IO r -> IO r
withCHandler tox =
  install Tox.tox_callback_self_connection_status       (Tox.selfConnectionStatusCb      cSelfConnectionStatus     ) .
  install Tox.tox_callback_friend_name                  (Tox.friendNameCb                cFriendName               ) .
  install Tox.tox_callback_friend_status_message        (Tox.friendStatusMessageCb       cFriendStatusMessage      ) .
  install Tox.tox_callback_friend_status                (Tox.friendStatusCb              cFriendStatus             ) .
  install Tox.tox_callback_friend_connection_status     (Tox.friendConnectionStatusCb    cFriendConnectionStatus   ) .
  install Tox.tox_callback_friend_typing                (Tox.friendTypingCb              cFriendTyping             ) .
  install Tox.tox_callback_friend_read_receipt          (Tox.friendReadReceiptCb         cFriendReadReceipt        ) .
  install Tox.tox_callback_friend_request               (Tox.friendRequestCb             cFriendRequest            ) .
  install Tox.tox_callback_friend_message               (Tox.friendMessageCb             cFriendMessage            ) .
  install Tox.tox_callback_file_recv_control            (Tox.fileRecvControlCb           cFileRecvControl          ) .
  install Tox.tox_callback_file_chunk_request           (Tox.fileChunkRequestCb          cFileChunkRequest         ) .
  install Tox.tox_callback_file_recv                    (Tox.fileRecvCb                  cFileRecv                 ) .
  install Tox.tox_callback_file_recv_chunk              (Tox.fileRecvChunkCb             cFileRecvChunk            ) .
  install Tox.tox_callback_conference_invite            (Tox.conferenceInviteCb          cConferenceInvite         ) .
  install Tox.tox_callback_conference_message           (Tox.conferenceMessageCb         cConferenceMessage        ) .
  install Tox.tox_callback_conference_title             (Tox.conferenceTitleCb           cConferenceTitle          ) .
  install Tox.tox_callback_conference_peer_name         (Tox.conferencePeerNameCb        cConferencePeerName       ) .
  install Tox.tox_callback_conference_peer_list_changed (Tox.conferencePeerListChangedCb cConferencePeerListChanged ) .
  install Tox.tox_callback_friend_lossy_packet          (Tox.friendLossyPacketCb         cFriendLossyPacket        ) .
  install Tox.tox_callback_friend_lossless_packet       (Tox.friendLosslessPacketCb      cFriendLosslessPacket     )
  where
    install cInstall wrapper action =
      bracket wrapper (uninstall cInstall) $ \cb -> do
        () <- cInstall tox cb
        action

    uninstall cInstall cb = do
      freeHaskellFunPtr cb
      cInstall tox nullFunPtr