module Codec.Archive.Tar.Types where

import Data.ByteString.Lazy (ByteString)
import Data.Int (Int64)
import System.PosixCompat.Types (FileMode, UserID, GroupID, EpochTime)
import System.PosixCompat.Extensions (CMajor, CMinor)

-- | A TAR archive.
newtype TarArchive = TarArchive { archiveEntries :: [TarEntry] }
  deriving Show

-- | A TAR archive entry for a file or directory.
data TarEntry = TarEntry { 
                          -- | Entry meta-data.
                          entryHeader :: TarHeader,
                          -- | Entry contents. For entries other than normal 
                          -- files, this should be an empty string.
                          entryData :: ByteString
                         }
  deriving Show

-- | TAR archive entry meta-data.
data TarHeader = TarHeader 
    {
     -- | Path of the file or directory. The path separator should be @/@ 
     -- for portable TAR archives.
     tarFileName :: FilePath,
     -- | UNIX file mode.
     tarFileMode :: FileMode,
     -- | Numeric owner user id. Should be set to @0@ if unknown.
     tarOwnerID :: UserID,
     -- | Numeric owner group id. Should be set to @0@ if unknown.
     tarGroupID :: GroupID,
     -- | File size in bytes. Should be 0 for entries other than normal files.
     tarFileSize :: Int64,
     -- | Last modification time, expressed as the number of seconds
     -- since the UNIX epoch.
     tarModTime :: EpochTime,
     -- | Type of this entry.
     tarFileType :: TarFileType,
     -- | If the entry is a hard link or a symbolic link, this is the path of
     -- the link target. For all other entry types this should be @\"\"@.
     tarLinkTarget :: FilePath,
     -- | The owner user name. Should be set to @\"\"@ if unknown.
     tarOwnerName :: String,
     -- | The owner group name. Should be set to @\"\"@ if unknown.
     tarGroupName :: String,
     -- | For character and block device entries, this is the 
     -- major number of the device. For all other entry types, it
     -- should be set to @0@.
     tarDeviceMajor :: CMajor,
     -- | For character and block device entries, this is the 
     -- minor number of the device. For all other entry types, it
     -- should be set to @0@.
     tarDeviceMinor :: CMinor
    } 
  deriving Show

-- | TAR archive entry types.
data TarFileType = 
   TarNormalFile
 | TarHardLink
 | TarSymbolicLink
 | TarCharacterDevice
 | TarBlockDevice
 | TarDirectory
 | TarFIFO
 | TarOther Char
  deriving (Eq,Show)