packages feed

Holumbus-Distribution-0.1.0: Examples/Distribution/ChatDChan/MessagesDChan.hs

-- ----------------------------------------------------------------------------

{- |
  Module     : Holumbus
  Copyright  : Copyright (C) 2009 Stefan Schmidt
  License    : MIT

  Maintainer : Stefan Schmidt (stefanschmidt@web.de)
  Stability  : experimental
  Portability: portable
  Version    : 0.1
  
-}

-- ----------------------------------------------------------------------------

module MessagesDChan
(
    ChatRequest(..)
  , ChatResponse(..)
  
  , ClientToken
  , genClientToken
)
where

import           Data.Binary
--import           Holumbus.Common.MRBinary
import           System.Random
import           Holumbus.Distribution.DChan


data ChatRequest
  = ReqRegister String (DChan ChatResponse)
  | ReqUnregister ClientToken
  | ReqMessage ClientToken String

instance Binary ChatRequest where
  put(ReqRegister cn ch)  = putWord8 1 >> put cn >> put ch
  put(ReqUnregister ct)   = putWord8 2 >> put ct
  put(ReqMessage ct text) = putWord8 3 >> put ct >> put text
  get
    = do
      t <- getWord8
      case t of
        1 -> get >>= \cn -> get >>= \ch -> return (ReqRegister cn ch)
        2 -> get >>= \ct -> return (ReqUnregister ct)
        3 -> get >>= \ct -> get >>= \text -> return (ReqMessage ct text)
        _ -> error "ChatRequest: wrong encoding"

data ChatResponse
  = RspRegister ClientToken
  | RspMessage String String
  | RspError String
  
instance Binary ChatResponse where
  put(RspRegister ct)     = putWord8 1 >> put ct
  put(RspMessage cn text) = putWord8 2 >> put cn >> put text
  put(RspError e)         = putWord8 3 >> put e
  get
    = do
      t <- getWord8
      case t of
        1 -> get >>= \ct -> return (RspRegister ct)
        2 -> get >>= \cn -> get >>= \text -> return (RspMessage cn text)
        3 -> get >>= \e -> return (RspError e)
        _ -> error "ChatResponse: wrong encoding"


data ClientToken = ClientToken Integer Integer
  deriving (Show, Eq, Ord)

instance Binary ClientToken where
  put(ClientToken i rnd) = put i >> put rnd
  get = get >>= \i -> get >>= \rnd -> return (ClientToken i rnd)

genClientToken :: Integer -> IO ClientToken
genClientToken i
  = do
    rnd <- getStdRandom (randomR (1,1000000000))
    return $ ClientToken i rnd