content: -- ----------------------------------------------------------------------------
  {- |
    Module     : Holumbus.Network.PortRegistry.PortRegistryPort
    Copyright  : Copyright (C) 2008 Stefan Schmidt
    License    : MIT
  
    Maintainer : Stefan Schmidt (stefanschmidt@web.de)
    Stability  : experimental
    Portability: portable
    Version    : 0.1
  
    
    This module contains the Interface for external access to the PortRegistry.
    
  -}
  -- ----------------------------------------------------------------------------
  
  module Holumbus.Network.PortRegistry.PortRegistryPort
  {-# DEPRECATED "this module will be remove in the next release, please use the packages from Holumbus.Distribution.*" #-}
  (
  -- * Datatypes
    PortRegistryPort
    
  -- * Creation
  , newPortRegistryPort
  , newPortRegistryFromData
  , newPortRegistryFromXmlFile 
  
  -- * reexport
  , setPortRegistry 
  )
  where
  
  import System.Log.Logger
  
  import Holumbus.Common.FileHandling
  import Holumbus.Network.Port
  import Holumbus.Network.Messages
  import Holumbus.Network.PortRegistry
  import Holumbus.Network.PortRegistry.Messages
  
  
  localLogger :: String
  localLogger = "Holumbus.Network.PortRegistry.PortRegistryPort"
  
  
  -- ----------------------------------------------------------------------------
  -- Datatypes
  -- ----------------------------------------------------------------------------
   
  -- | The datatype for the PortRegistry remote interface. 
  data PortRegistryPort = PortRegistryPort PortRegistryRequestPort
    deriving (Show)
  
  
  
  
  -- ----------------------------------------------------------------------------
  --  Creation
  -- ----------------------------------------------------------------------------
  
  
  -- | Creates a new PortRegistryPort from a port-object.
  newPortRegistryPort :: PortRegistryRequestPort -> PortRegistryPort
  newPortRegistryPort p = PortRegistryPort p
  
  
  -- | Creates a new PortRegistryPort from the StreamName and SocketId.
  newPortRegistryFromData :: StreamName -> SocketId -> IO PortRegistryPort
  newPortRegistryFromData sn soid
    = do
      p <- newPort sn (Just soid)
      return $ newPortRegistryPort p
  
  
  -- | Creates a new PortRegistryPort from a XML-File.
  newPortRegistryFromXmlFile :: FilePath -> IO PortRegistryPort
  newPortRegistryFromXmlFile fp
    = do
      p <- loadFromXmlFile fp
      return $ newPortRegistryPort p
  
  
  
  -- ----------------------------------------------------------------------------
  -- Typeclass instanciation for PortRegistryPort
  -- ----------------------------------------------------------------------------
  
  -- PortRegistry-typeclass instanciation for the PortRegistryPort.
  instance PortRegistry PortRegistryPort where
      
    registerPort sn soid (PortRegistryPort p)
      = do
        debugM localLogger "registerPort start"
        r <- withStream $
          \s -> performPortAction p s time30 (PRReqRegister sn soid) $
            \rsp ->
            do
            case rsp of
              (PRRspSuccess) -> return (Just $ ())
              _ -> return Nothing
        debugM localLogger "registerPort end"
        return r
  
  
    unregisterPort sn (PortRegistryPort p)
      = do
        debugM localLogger "unregisterPort start"
        r <- withStream $
          \s -> performPortAction p s time30 (PRReqUnregister sn) $
            \rsp ->
            do
            case rsp of
              (PRRspSuccess) -> return (Just $ ())
              _ -> return Nothing
        debugM localLogger "unregisterPort end"
        return r
    
    lookupPort sn (PortRegistryPort p)
      = do
        debugM localLogger "lookupPort start"
        r <- withStream $
          \s -> performPortAction p s time30 (PRReqLookup sn) $
            \rsp ->
            do
            case rsp of
              (PRRspLookup soid) -> return (Just $ soid)
              _ -> return Nothing
        debugM localLogger "lookupPort end"
        return r
    
  
    getPorts (PortRegistryPort p)
      = do
        debugM localLogger "getPorts start"
        r <- withStream $
          \s -> performPortAction p s time30 (PRReqGetPorts) $
            \rsp ->
            do
            case rsp of
              (PRRspGetPorts ls) -> return (Just $ ls)
              _ -> return Nothing
        debugM localLogger "getPorts end"
        return r
    
  