packages feed

manatee-browser-0.0.3: Manatee/Extension/Browser/BrowserBuffer.hs

-- Author:     Andy Stewart <lazycat.manatee@gmail.com>
-- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
-- 
-- Copyright (C) 2010 Andy Stewart, all rights reserved.
-- 
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- any later version.
-- 
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
-- 
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

{-# LANGUAGE DeriveDataTypeable #-}
module Manatee.Extension.Browser.BrowserBuffer where

import Control.Applicative
import Control.Concurrent.STM 
import DBus.Client hiding (Signal)
import Data.Typeable
import Manatee.Core.DBus
import Manatee.Core.Types
import Manatee.Extension.Browser.PageMode
import Manatee.Toolkit.Gtk.Concurrent

data BrowserBuffer =
    BrowserBuffer {browserBufferUri              :: TVar String
                  ,browserBufferClient           :: Client
                  ,browserBufferPageId           :: PageId
                  ,browserBufferMode             :: PageMode
                  ,browserBufferBroadcastChannel :: TChan BrowserBufferSignal
                  } 
    deriving Typeable

data BrowserBufferSignal = SyncUri String
                         | SyncTitle String
                           deriving (Show, Eq, Ord)

-- | New browser buffer.
browserBufferNew :: String -> [String] -> Client -> PageId -> IO BrowserBuffer
browserBufferNew uri _ client pageId = do
  -- New buffer.
  buffer <- 
    BrowserBuffer <$> newTVarIO uri
                  <*> pure client
                  <*> pure pageId
                  <*> pure browserMode
                  <*> (newTChanIO :: IO (TChan BrowserBufferSignal))

  -- Listen broadcast channel.
  browserBufferListenChannel buffer

  return buffer

-- | Listen broadcast channel.
browserBufferListenChannel :: BrowserBuffer -> IO ()
browserBufferListenChannel BrowserBuffer {browserBufferClient           = client
                                         ,browserBufferPageId           = pageId
                                         ,browserBufferMode             = mode
                                         ,browserBufferBroadcastChannel = channel
                                         } = 
  listenBufferChannel channel $ \ signal -> 
    case signal of
      SyncUri uri -> 
          -- Synchronization url.
          mkDaemonSignal client SynchronizationPathName (SynchronizationPathNameArgs (pageModeName mode) pageId uri)
      SyncTitle title -> 
          -- Synchronization tab title.
          mkDaemonSignal client ChangeTabName (ChangeTabNameArgs (pageModeName mode) pageId title)