-- ----------------------------------------------------------------------------
  | 
   Module      : 
   Copyright   : Copyright ( C ) 2008   
   License     : MIT 

   Maintainer :   (  ) 
   Stability   : experimental 
   Portability : portable 
   Version     : 0.1 



  Module     : 
  Copyright  : Copyright (C) 2008 Stefan Schmidt
  License    : MIT

  Maintainer : Stefan Schmidt ()
  Stability  : experimental
  Portability: portable
  Version    : 0.1


-}
-- ----------------------------------------------------------------------------

module Main(main) where

import           Control.Concurrent
import qualified Data.ByteString.Lazy as B

import           Holumbus.Common.Logging
import           Holumbus.Common.Utils
import           Holumbus.Network.Port
import           Holumbus.Network.PortRegistry.PortRegistryPort
import qualified Holumbus.Console.Console as Console


type StringStream = Stream String
type StringPort   = Port String


newStringStream :: IO StringStream
newStringStream = newLocalStream Nothing


decodeStringPort :: Maybe B.ByteString -> Maybe StringPort
decodeStringPort = decodeMaybe


version :: String
version = "Ports-Demo Receiver 0.1"


main :: IO ()
main
  = do
    initializeLogging []
    putStrLn version    
    putStrLn "Begin"
    reg <- newPortRegistryFromXmlFile "/tmp/registry.xml"
    setPortRegistry reg
    printStreamController
    putStrLn "initialising streams..."
    s <- newStringStream
    p <- newPortFromStream s
    globalS <- newStream  STGlobal  (Just "global")  (Just 10002)
    putStrLn "streams initialised"
    writePortToFile p "p.port"
    forkIO $ printMessages "global" globalS
    Console.handleUserInput createConsole ()


printMessages :: String -> StringStream -> IO ()
printMessages info s
  = do
    msg <- readStreamMsg s
    putStrLn $ "port: " ++ info
    putStrLn "Incoming Message:"
    putStrLn $ show msg
    let replyPort = decodeStringPort $ getGenericData msg
    let text      = getMessageData msg
    case replyPort of
        (Nothing) ->  
          do
          putStrLn "no reply port in message"
        (Just p) ->
          do
          send p ("ECHO:" ++ text)
    printMessages info s
    
    
createConsole :: Console.ConsoleData ()
createConsole =
  Console.addConsoleCommand "debug" printDebug "prints internal state of the filesystem (DEBUG)" $ 
  Console.addConsoleCommand "version" printVersion "prints the version" $ 
  Console.initializeConsole

 
printDebug :: () -> [String] -> IO ()
printDebug _ _
  = do
    printStreamController
  
printVersion :: () -> [String] -> IO ()
printVersion _ _
  = do
    putStrLn version


 ----------------------------------------------------------------------------
 ----------------------------------------------------------------------------
  | 
   Module      : 
   Copyright   : Copyright ( C ) 2008   
   License     : MIT 

   Maintainer :   (  ) 
   Stability   : experimental 
   Portability : portable 
   Version     : 0.1 



  Module     : 
  Copyright  : Copyright (C) 2008 Stefan Schmidt
  License    : MIT

  Maintainer : Stefan Schmidt ()
  Stability  : experimental
  Portability: portable
  Version    : 0.1


-}

module Main(main) where

import           Control.Concurrent
import qualified Data.ByteString.Lazy as B

import           Holumbus.Common.Logging
import           Holumbus.Common.Utils
import           Holumbus.Network.Port
import           Holumbus.Network.PortRegistry.PortRegistryPort
import qualified Holumbus.Console.Console as Console


type StringStream = Stream String
type StringPort   = Port String


newStringStream :: IO StringStream
newStringStream = newLocalStream Nothing


decodeStringPort :: Maybe B.ByteString -> Maybe StringPort
decodeStringPort = decodeMaybe


version :: String
version = "Ports-Demo Receiver 0.1"


main :: IO ()
main
  = do
    initializeLogging []
    putStrLn version    
    putStrLn "Begin"
    reg <- newPortRegistryFromXmlFile "/tmp/registry.xml"
    setPortRegistry reg
    printStreamController
    putStrLn "initialising streams..."
    s <- newStringStream
    p <- newPortFromStream s
    globalS <- newStream  STGlobal  (Just "global")  (Just 10002)
    putStrLn "streams initialised"
    writePortToFile p "p.port"
    forkIO $ printMessages "global" globalS
    Console.handleUserInput createConsole ()


printMessages :: String -> StringStream -> IO ()
printMessages info s
  = do
    msg <- readStreamMsg s
    putStrLn $ "port: " ++ info
    putStrLn "Incoming Message:"
    putStrLn $ show msg
    let replyPort = decodeStringPort $ getGenericData msg
    let text      = getMessageData msg
    case replyPort of
        (Nothing) ->  
          do
          putStrLn "no reply port in message"
        (Just p) ->
          do
          send p ("ECHO:" ++ text)
    printMessages info s
    
    
createConsole :: Console.ConsoleData ()
createConsole =
  Console.addConsoleCommand "debug" printDebug "prints internal state of the filesystem (DEBUG)" $ 
  Console.addConsoleCommand "version" printVersion "prints the version" $ 
  Console.initializeConsole

 
printDebug :: () -> [String] -> IO ()
printDebug _ _
  = do
    printStreamController
  
printVersion :: () -> [String] -> IO ()
printVersion _ _
  = do
    putStrLn version

