packages feed

xmms2-client-0.0.7.0: src/XMMS2/Client/Coll.hs

-- -*-haskell-*-
--  XMMS2 client library.
--
--  Author:  Oleg Belozeorov
--  Created: 15 Feb. 2010
--
--  Copyright (C) 2009-2010 Oleg Belozeorov
--
--  This library is free software; you can redistribute it and/or
--  modify it under the terms of the GNU Lesser General Public
--  License as published by the Free Software Foundation; either
--  version 3 of the License, or (at your option) any later version.
--
--  This library 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
--  Lesser General Public License for more details.
--

module XMMS2.Client.Coll
  ( CollectionChangedActions (..)
  , CollectionChange (..)
  , collGet
  , collList
  , collSave
  , collRemove
  , collRename
  , collIdlistFromPlaylistFile
  , collSync
  , collQueryIds
  , collQueryInfos
  , broadcastCollectionChanged
  ) where

import Control.Applicative

import XMMS2.Client.Types
import XMMS2.Client.Result

import XMMS2.Client.Bindings.Connection
import XMMS2.Client.Bindings.Coll (CollectionChangedActions (..))
import qualified XMMS2.Client.Bindings.Coll as B


data CollectionChange
  = CollectionAdd
    { namespace :: String
    , name      :: String }
  | CollectionUpdate
    { namespace :: String
    , name      :: String }
  | CollectionRename
    { namespace :: String
    , name      :: String
    , newName   :: String }
  | CollectionRemove
    { namespace :: String
    , name      :: String }
  deriving (Show)

instance ValueGet CollectionChange where
  valueGet v = do
    dict <- valueGet v
    maybe (fail "not a collection change notification") return $ do
      namespace <- lookupString "namespace" dict
      name      <- lookupString "name" dict
      action    <- (toEnum . fromIntegral) <$> lookupInt32 "type" dict
      case action of
        CollectionChangedAdd    ->
          return CollectionAdd { namespace = namespace
                               , name      = name }
        CollectionChangedUpdate ->
          return CollectionUpdate { namespace = namespace
                                  , name      = name }
        CollectionChangedRename -> do
          newName <- lookupString "newname" dict
          return CollectionRename { namespace = namespace
                                  , name      = name
                                  , newName   = newName }
        CollectionChangedRemove ->
          return CollectionRemove { namespace = namespace
                                  , name      = name }


collGet :: Connection -> String -> String -> IO (Result Default Coll)
collGet xmmsc name ns =
  liftResult $ B.collGet xmmsc name ns

collList :: Connection -> String -> IO (Result Default [String])
collList xmmsc ns =
  liftResult $ B.collList xmmsc ns

collSave :: Connection -> Coll -> String -> String -> IO (Result Default ())
collSave xmmsc coll name ns =
  liftResult $ B.collSave xmmsc coll name ns

collRemove :: Connection -> String -> String -> IO (Result Default ())
collRemove xmmsc name ns =
  liftResult $ B.collRemove xmmsc name ns

collRename :: Connection -> String -> String -> String -> IO (Result Default ())
collRename xmmsc from to ns =
  liftResult $ B.collRename xmmsc from to ns

collIdlistFromPlaylistFile :: Connection -> String -> IO (Result Default Coll)
collIdlistFromPlaylistFile xmmsc file =
  liftResult $ B.collIdlistFromPlaylistFile xmmsc file

collSync :: Connection -> IO (Result Default ())
collSync xmmsc =
  liftResult $ B.collSync xmmsc

collQueryIds ::
  Connection ->
  Coll       ->
  [String]   ->
  Int        ->
  Int        ->
  IO (Result Default [Int32])
collQueryIds xmmsc coll order start len = do
  order' <- valueNew order
  liftResult $ B.collQueryIds xmmsc coll order' start len

collQueryInfos ::
  Connection   ->
  Coll         ->
  [String]     ->
  Int          ->
  Int          ->
  [String]     ->
  [String]     ->
  IO (Result Default [Dict Property])
collQueryInfos xmmsc coll order start len fetch group = do
  order' <- valueNew order
  fetch' <- valueNew fetch
  group' <- valueNew group
  liftResult $ B.collQueryInfos xmmsc coll order' start len fetch' group'


broadcastCollectionChanged :: Connection -> IO (Result Broadcast CollectionChange)
broadcastCollectionChanged = liftResult . B.broadcastCollectionChanged