module Manatee.Extension.ImageViewer.ImageBuffer where
import Control.Applicative
import Control.Concurrent
import Control.Concurrent.STM
import DBus.Client hiding (Signal)
import Data.ByteString.UTF8
import Data.List
import Data.Typeable
import Manatee.Core.DBus
import Manatee.Core.Types
import Manatee.Extension.ImageViewer.PageMode
import Manatee.Toolkit.General.STM
import Manatee.Toolkit.Gtk.Concurrent
import System.FilePath
import System.GIO
import System.Glib.MainLoop (HandlerId)
import Text.Regex.TDFA
data ImageBuffer =
ImageBuffer {imageBufferPath :: TVar String
,imageBufferClient :: Client
,imageBufferPageId :: PageId
,imageBufferMode :: PageMode
,imageBufferFiles :: TVar [FilePath]
,imageBufferBroadcastChannel :: TChan String
,imageBufferSlideShowHanlderId :: TVar (Maybe HandlerId)
}
deriving Typeable
imageBufferNew :: String -> Client -> PageId -> IO ImageBuffer
imageBufferNew path client pageId = do
buffer <- ImageBuffer <$> newTVarIO path
<*> pure client
<*> pure pageId
<*> pure imageMode
<*> newTVarIO []
<*> (newTChanIO :: IO (TChan String))
<*> newTVarIO Nothing
forkIO $ imageBufferScanFiles buffer
imageBufferListenChannel buffer
return buffer
imageBufferListenChannel :: ImageBuffer -> IO ()
imageBufferListenChannel ImageBuffer {imageBufferClient = client
,imageBufferPageId = pageId
,imageBufferMode = mode
,imageBufferBroadcastChannel = channel} =
listenBufferChannel channel $ \path ->
mkDaemonSignal client SynchronizationPathName (SynchronizationPathNameArgs (pageModeName mode) pageId path)
imageBufferScanFiles :: ImageBuffer -> IO ()
imageBufferScanFiles ImageBuffer {imageBufferPath = path
,imageBufferFiles = files} = do
filePath <- readTVarIO path
let currentDir = takeDirectory filePath
dir = fileFromPath (fromString currentDir)
scan enum = do
fileInfo <- fileEnumeratorNextFile enum Nothing
case fileInfo of
Just info ->
case fileInfoGetContentType info of
Just typ ->
if typ =~ ("^image/*" :: String)
then do
case fileInfoGetName info of
Just name -> modifyTVarIO files (\list -> (currentDir </> (toString name)) : list)
Nothing -> return ()
scan enum
else
scan enum
Nothing ->
scan enum
Nothing ->
modifyTVarIO files sort
enum <- fileEnumerateChildren dir "*" [] Nothing
scan enum