{- | Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte License : LGPL-2.1 Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc) An opaque structure representing an opened directory. -} #define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \ && !defined(__HADDOCK_VERSION__)) module GI.GLib.Structs.Dir ( -- * Exported types Dir(..) , noDir , -- * Methods -- ** close #method:close# #if ENABLE_OVERLOADING DirCloseMethodInfo , #endif dirClose , -- ** makeTmp #method:makeTmp# dirMakeTmp , -- ** readName #method:readName# #if ENABLE_OVERLOADING DirReadNameMethodInfo , #endif dirReadName , -- ** rewind #method:rewind# #if ENABLE_OVERLOADING DirRewindMethodInfo , #endif dirRewind , ) where import Data.GI.Base.ShortPrelude import qualified Data.GI.Base.ShortPrelude as SP import qualified Data.GI.Base.Overloading as O import qualified Prelude as P import qualified Data.GI.Base.Attributes as GI.Attributes import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr import qualified Data.GI.Base.GClosure as B.GClosure import qualified Data.GI.Base.GError as B.GError import qualified Data.GI.Base.GVariant as B.GVariant import qualified Data.GI.Base.GValue as B.GValue import qualified Data.GI.Base.GParamSpec as B.GParamSpec import qualified Data.GI.Base.CallStack as B.CallStack import qualified Data.GI.Base.Properties as B.Properties import qualified Data.Text as T import qualified Data.ByteString.Char8 as B import qualified Data.Map as Map import qualified Foreign.Ptr as FP import qualified GHC.OverloadedLabels as OL -- | Memory-managed wrapper type. newtype Dir = Dir (ManagedPtr Dir) -- XXX Wrapping a foreign struct/union with no known destructor or size, leak? instance WrappedPtr Dir where wrappedPtrCalloc = return nullPtr wrappedPtrCopy = return wrappedPtrFree = Nothing -- | A convenience alias for `Nothing` :: `Maybe` `Dir`. noDir :: Maybe Dir noDir = Nothing #if ENABLE_OVERLOADING instance O.HasAttributeList Dir type instance O.AttributeList Dir = DirAttributeList type DirAttributeList = ('[ ] :: [(Symbol, *)]) #endif -- method Dir::close -- method type : OrdinaryMethod -- Args : [Arg {argCName = "dir", argType = TInterface (Name {namespace = "GLib", name = "Dir"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GDir* created by g_dir_open()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "g_dir_close" g_dir_close :: Ptr Dir -> -- dir : TInterface (Name {namespace = "GLib", name = "Dir"}) IO () {- | Closes the directory and deallocates all related resources. -} dirClose :: (B.CallStack.HasCallStack, MonadIO m) => Dir {- ^ /@dir@/: a 'GI.GLib.Structs.Dir.Dir'* created by @/g_dir_open()/@ -} -> m () dirClose dir = liftIO $ do dir' <- unsafeManagedPtrGetPtr dir g_dir_close dir' touchManagedPtr dir return () #if ENABLE_OVERLOADING data DirCloseMethodInfo instance (signature ~ (m ()), MonadIO m) => O.MethodInfo DirCloseMethodInfo Dir signature where overloadedMethod _ = dirClose #endif -- method Dir::read_name -- method type : OrdinaryMethod -- Args : [Arg {argCName = "dir", argType = TInterface (Name {namespace = "GLib", name = "Dir"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GDir* created by g_dir_open()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TBasicType TFileName) -- throws : False -- Skip return : False foreign import ccall "g_dir_read_name" g_dir_read_name :: Ptr Dir -> -- dir : TInterface (Name {namespace = "GLib", name = "Dir"}) IO CString {- | Retrieves the name of another entry in the directory, or 'Nothing'. The order of entries returned from this function is not defined, and may vary by file system or other operating-system dependent factors. 'Nothing' may also be returned in case of errors. On Unix, you can check @errno@ to find out if 'Nothing' was returned because of an error. On Unix, the \'.\' and \'..\' entries are omitted, and the returned name is in the on-disk encoding. On Windows, as is true of all GLib functions which operate on filenames, the returned name is in UTF-8. -} dirReadName :: (B.CallStack.HasCallStack, MonadIO m) => Dir {- ^ /@dir@/: a 'GI.GLib.Structs.Dir.Dir'* created by @/g_dir_open()/@ -} -> m [Char] {- ^ __Returns:__ The entry\'s name or 'Nothing' if there are no more entries. The return value is owned by GLib and must not be modified or freed. -} dirReadName dir = liftIO $ do dir' <- unsafeManagedPtrGetPtr dir result <- g_dir_read_name dir' checkUnexpectedReturnNULL "dirReadName" result result' <- cstringToString result touchManagedPtr dir return result' #if ENABLE_OVERLOADING data DirReadNameMethodInfo instance (signature ~ (m [Char]), MonadIO m) => O.MethodInfo DirReadNameMethodInfo Dir signature where overloadedMethod _ = dirReadName #endif -- method Dir::rewind -- method type : OrdinaryMethod -- Args : [Arg {argCName = "dir", argType = TInterface (Name {namespace = "GLib", name = "Dir"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GDir* created by g_dir_open()", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Nothing -- throws : False -- Skip return : False foreign import ccall "g_dir_rewind" g_dir_rewind :: Ptr Dir -> -- dir : TInterface (Name {namespace = "GLib", name = "Dir"}) IO () {- | Resets the given directory. The next call to 'GI.GLib.Structs.Dir.dirReadName' will return the first entry again. -} dirRewind :: (B.CallStack.HasCallStack, MonadIO m) => Dir {- ^ /@dir@/: a 'GI.GLib.Structs.Dir.Dir'* created by @/g_dir_open()/@ -} -> m () dirRewind dir = liftIO $ do dir' <- unsafeManagedPtrGetPtr dir g_dir_rewind dir' touchManagedPtr dir return () #if ENABLE_OVERLOADING data DirRewindMethodInfo instance (signature ~ (m ()), MonadIO m) => O.MethodInfo DirRewindMethodInfo Dir signature where overloadedMethod _ = dirRewind #endif -- method Dir::make_tmp -- method type : MemberFunction -- Args : [Arg {argCName = "tmpl", argType = TBasicType TFileName, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "Template for directory name,\n as in g_mkdtemp(), basename only, or %NULL for a default template", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}] -- Lengths : [] -- returnType : Just (TBasicType TFileName) -- throws : True -- Skip return : False foreign import ccall "g_dir_make_tmp" g_dir_make_tmp :: CString -> -- tmpl : TBasicType TFileName Ptr (Ptr GError) -> -- error IO CString {- | Creates a subdirectory in the preferred directory for temporary files (as returned by 'GI.GLib.Functions.getTmpDir'). /@tmpl@/ should be a string in the GLib file name encoding containing a sequence of six \'X\' characters, as the parameter to @/g_mkstemp()/@. However, unlike these functions, the template should only be a basename, no directory components are allowed. If template is 'Nothing', a default template is used. Note that in contrast to @/g_mkdtemp()/@ (and @/mkdtemp()/@) /@tmpl@/ is not modified, and might thus be a read-only literal string. /Since: 2.30/ -} dirMakeTmp :: (B.CallStack.HasCallStack, MonadIO m) => Maybe ([Char]) {- ^ /@tmpl@/: Template for directory name, as in @/g_mkdtemp()/@, basename only, or 'Nothing' for a default template -} -> m [Char] {- ^ __Returns:__ The actual name used. This string should be freed with 'GI.GLib.Functions.free' when not needed any longer and is is in the GLib file name encoding. In case of errors, 'Nothing' is returned and /@error@/ will be set. /(Can throw 'Data.GI.Base.GError.GError')/ -} dirMakeTmp tmpl = liftIO $ do maybeTmpl <- case tmpl of Nothing -> return nullPtr Just jTmpl -> do jTmpl' <- stringToCString jTmpl return jTmpl' onException (do result <- propagateGError $ g_dir_make_tmp maybeTmpl checkUnexpectedReturnNULL "dirMakeTmp" result result' <- cstringToString result freeMem result freeMem maybeTmpl return result' ) (do freeMem maybeTmpl ) #if ENABLE_OVERLOADING #endif #if ENABLE_OVERLOADING type family ResolveDirMethod (t :: Symbol) (o :: *) :: * where ResolveDirMethod "close" o = DirCloseMethodInfo ResolveDirMethod "readName" o = DirReadNameMethodInfo ResolveDirMethod "rewind" o = DirRewindMethodInfo ResolveDirMethod l o = O.MethodResolutionFailed l o instance (info ~ ResolveDirMethod t Dir, O.MethodInfo info Dir p) => OL.IsLabel t (Dir -> p) where #if MIN_VERSION_base(4,10,0) fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #else fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #endif #endif