{-# LANGUAGE CPP #-}
-- | Types for Haskell 1.2 dialogue I/O
module P_IO_data {-(module XStuff, module P_IO_data)-} where
import XStuff
import ShowFun()
import Prelude hiding (IOError)
import System.Directory(XdgDirectory)
#ifdef VERSION_bytestring
import qualified Data.ByteString.Lazy as BS
#endif
#ifdef VERSION_old_time
import System.Time(ClockTime,CalendarTime)
#endif
#ifdef VERSION_time
import Data.Time(UTCTime,ZonedTime)
#endif

data Request =	-- file system requests:
			  ReadFile      String         
			| WriteFile     String String
			| AppendFile    String String
			| ReadBinFile   String 
			| WriteBinFile  String Bin
			| AppendBinFile String Bin
			| DeleteFile    String
			| StatusFile    String
                 -- useful for IO with GHC >=6.12
 			| ReadBinaryFile  String         
 			| WriteBinaryFile String String
                -- Files at standard locations for application data
                        | ReadXdgFile XdgDirectory String
                        | WriteXdgFile XdgDirectory String String
		-- channel system requests:
			| ReadChan	String 
			| AppendChan    String String
			| ReadBinChan   String 
			| AppendBinChan String Bin
			| StatusChan    String
		-- environment requests:
			| Echo          Bool
			| GetArgs
			| GetEnv        String
			| SetEnv        String String
		-- optional
			| ReadChannels	[String]
			| ReadBinChannels [String]
			| CreateProcess	Dialogue
			| CreateDirectory String String
			| OpenFile	String Bool
			| OpenBinFile	String Bool
			| CloseFile	File
			| ReadVal	File
			| ReadBinVal	File
			| WriteVal	File Char
			| WriteBinVal	File Bin
		-- hbc bonus
			| Sleep		Double
			| ChangeDirectory String
			| GetTime -- returns ClockTime -- /TH 2002-04-14
			| DeleteDirectory String
			| System	String
	                | ReadDirectory String
	                | XCommand    (XDisplay,XWId,XCommand)
	                | GetAsyncInput
			| GetCpuTime
			| GetProgName
                        | GetLocalTime -- return CalendarTime
#ifdef VERSION_old_time
                        | ToCalendarTime ClockTime -- returns CalendarTime
#endif
			| SigAction Int SigAct
			| Exit Int
			| ReadFileScattered String [Int]
			| Select       [Descriptor]
			| SocketRequest SocketRequest
			| XRequest     (XDisplay,XWId,XRequest)
			| ReadFileFast String         
			| RenameFile String String
			| GetCurrentDirectory

		        | GetModificationTime FilePath -- returns ClockTime
                        | GetCurrentTime               -- returns UTCTime
                        | GetZonedTime                 -- returns ZonedTime
{-
			-- Haskell 1.3 I/O
			| H_OpenFile String Int		-- return Fil
			| H_Close File			-- return Success
			| H_FileSize File		-- return IntResp
			| H_IsEOF File			-- return IntResp
			| H_SetBuffering File Int	-- return Success
			| H_GetBuffering File		-- return IntResp
			| H_Flush File			-- return Success
			| H_Seek File Int Int		-- return IntResp
			| H_GetFlags File		-- return IntResp
			| H_GetChar File		-- return IntResp
			| H_UnGetChar File Int		-- return Success
			| H_PutChar File Int		-- return Success
			| H_PutString File String	-- return Success
			| H_GetFile File		-- return Str
			| H_Select ([File], [File], [Double]) -- return SelectResp, last list is a Maybe
			| H_CCall _CPointer [_CUnion] _CUnion -- return CCallResp
			| __RunAnswer __Answer		-- never returns
			| H_GetTime			-- returns GetTimeResp
			| H_GetErrno			-- returns IntResp
-}
                      deriving (Int -> Request -> ShowS
[Request] -> ShowS
Request -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Request] -> ShowS
$cshowList :: [Request] -> ShowS
show :: Request -> String
$cshow :: Request -> String
showsPrec :: Int -> Request -> ShowS
$cshowsPrec :: Int -> Request -> ShowS
Show,ReadPrec [Request]
ReadPrec Request
Int -> ReadS Request
ReadS [Request]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Request]
$creadListPrec :: ReadPrec [Request]
readPrec :: ReadPrec Request
$creadPrec :: ReadPrec Request
readList :: ReadS [Request]
$creadList :: ReadS [Request]
readsPrec :: Int -> ReadS Request
$creadsPrec :: Int -> ReadS Request
Read)

{-
data __Answer = __Answer EXISTVAR

instance Text __Answer where
    showsType _ = showString "__Answer"


data _CUnion  =		  _CUInt Int
			| _CUDouble Double 
			| _CUString String 
			| _CUPointer _CPointer
#ifdef P_IO_data
			| _CUByteVector _ByteVector._ByteVector
#endif
		deriving (Eq, Text)

ISO(_CPointer , _CPointer , Int) deriving (Eq, Text)
-}
data SigAct   =		  SAIgnore
			| SADefault
			| SACatch (String -> Dialogue)
		deriving (Int -> SigAct -> ShowS
[SigAct] -> ShowS
SigAct -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SigAct] -> ShowS
$cshowList :: [SigAct] -> ShowS
show :: SigAct -> String
$cshow :: SigAct -> String
showsPrec :: Int -> SigAct -> ShowS
$cshowsPrec :: Int -> SigAct -> ShowS
Show,ReadPrec [SigAct]
ReadPrec SigAct
Int -> ReadS SigAct
ReadS [SigAct]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SigAct]
$creadListPrec :: ReadPrec [SigAct]
readPrec :: ReadPrec SigAct
$creadPrec :: ReadPrec SigAct
readList :: ReadS [SigAct]
$creadList :: ReadS [SigAct]
readsPrec :: Int -> ReadS SigAct
$creadsPrec :: Int -> ReadS SigAct
Read)

data Response =		  Success
			| Str String 
			| Bn  Bin
			| Failure IOError
			| Tag [(String, Char)]
			| BinTag [(String, Bin)]
	                | StrList [String]
			| Fil File
			| Dbl Double
	                | AsyncInput AsyncInput
			| SocketResponse SocketResponse
			| XResponse XResponse
			| IntResp Int
			| SelectResp [([File], [File], [Double])]
			| SigActResp SigAct
--			| CCallResp _CUnion
--			| GetTimeResp Double Bool String Int
#ifdef VERSION_old_time
			| ClockTime ClockTime -- response to GetTime --
			| CalendarTime CalendarTime -- response to GetLocalTime
#endif
#ifdef VERSION_time
                        | UTCTime UTCTime         -- response to GetCurrentTime
                        | ZonedTime ZonedTime     -- response to GetZonedTime
#endif
		deriving (Int -> Response -> ShowS
[Response] -> ShowS
Response -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Response] -> ShowS
$cshowList :: [Response] -> ShowS
show :: Response -> String
$cshow :: Response -> String
showsPrec :: Int -> Response -> ShowS
$cshowsPrec :: Int -> Response -> ShowS
Show,ReadPrec [Response]
ReadPrec Response
Int -> ReadS Response
ReadS [Response]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Response]
$creadListPrec :: ReadPrec [Response]
readPrec :: ReadPrec Response
$creadPrec :: ReadPrec Response
readList :: ReadS [Response]
$creadList :: ReadS [Response]
readsPrec :: Int -> ReadS Response
$creadsPrec :: Int -> ReadS Response
Read)

data IOError =		  WriteError   String
			| ReadError    String
			| SearchError  String
			| FormatError  String
			| OtherError   String
		deriving (Int -> IOError -> ShowS
[IOError] -> ShowS
IOError -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IOError] -> ShowS
$cshowList :: [IOError] -> ShowS
show :: IOError -> String
$cshow :: IOError -> String
showsPrec :: Int -> IOError -> ShowS
$cshowsPrec :: Int -> IOError -> ShowS
Show,ReadPrec [IOError]
ReadPrec IOError
Int -> ReadS IOError
ReadS [IOError]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [IOError]
$creadListPrec :: ReadPrec [IOError]
readPrec :: ReadPrec IOError
$creadPrec :: ReadPrec IOError
readList :: ReadS [IOError]
$creadList :: ReadS [IOError]
readsPrec :: Int -> ReadS IOError
$creadsPrec :: Int -> ReadS IOError
Read)


#ifdef VERSION_bytestring
type Bin = BS.ByteString
#else
type Bin = Unused
#endif
type Dialogue = [Response] -> [Request] -- not useful anymore
--type _CUnion = Unused
type File = Unused

type Unused = ()

#ifdef VERSION_old_time
instance Read ClockTime -- !!!
#endif