File: MiniHierarchy.chs

package info (click to toggle)
haskell-gstreamer 0.12.1-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 720 kB
  • sloc: haskell: 635; ansic: 116; makefile: 11; sh: 7
file content (167 lines) | stat: -rw-r--r-- 5,444 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
{-# OPTIONS_HADDOCK hide #-}
-- -*-haskell-*-
-- -------------------- automatically generated file - do not edit ----------
--  Object hierarchy for the GIMP Toolkit (GTK) Binding for Haskell
--
--  Author : Axel Simon
--
--  Copyright (C) 2001-2005 Axel Simon
--
--  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 2.1 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.
--
-- #hide

-- |
-- Maintainer  : gtk2hs-users@lists.sourceforge.net
-- Stability   : provisional
-- Portability : portable (depends on GHC)
--
-- This file reflects the Gtk+ object hierarchy in terms of Haskell classes.
--
-- Note: the mk... functions were originally meant to simply be an alias
-- for the constructor. However, in order to communicate the destructor
-- of an object to objectNew, the mk... functions are now a tuple containing
-- Haskell constructor and the destructor function pointer. This hack avoids
-- changing all modules that simply pass mk... to objectNew.
--
module Media.Streaming.GStreamer.Core.MiniHierarchy (

  module Media.Streaming.GStreamer.Core.MiniHierarchyBase,
  Buffer(Buffer), BufferClass,
  toBuffer, 
  mkBuffer, unBuffer,
  castToBuffer, gTypeBuffer,
  Event(Event), EventClass,
  toEvent, 
  mkEvent, unEvent,
  castToEvent, gTypeEvent,
  Message(Message), MessageClass,
  toMessage, 
  mkMessage, unMessage,
  castToMessage, gTypeMessage,
  Query(Query), QueryClass,
  toQuery, 
  mkQuery, unQuery,
  castToQuery, gTypeQuery
  ) where

import Foreign.ForeignPtr (ForeignPtr, castForeignPtr, unsafeForeignPtrToPtr)
import Foreign.C.Types    (CULong, CUInt)
import System.Glib.GType	(GType, typeInstanceIsA)
{#import Media.Streaming.GStreamer.Core.MiniHierarchyBase#}

{# context lib="gstreamer" prefix="gst" #}

-- The usage of foreignPtrToPtr should be safe as the evaluation will only be
-- forced if the object is used afterwards
--
castTo :: (MiniObjectClass obj, MiniObjectClass obj') => GType -> String
                                                -> (obj -> obj')
castTo gtype objTypeName obj =
  case toMiniObject obj of
    gobj@(MiniObject objFPtr)
      | typeInstanceIsA ((unsafeForeignPtrToPtr.castForeignPtr) objFPtr) gtype
                  -> unsafeCastMiniObject gobj
      | otherwise -> error $ "Cannot cast object to " ++ objTypeName


-- ********************************************************************* Buffer

{#pointer *Buffer foreign newtype #} deriving (Eq,Ord)

mkBuffer = (Buffer, miniObjectUnref)
unBuffer (Buffer o) = o

class MiniObjectClass o => BufferClass o
toBuffer :: BufferClass o => o -> Buffer
toBuffer = unsafeCastMiniObject . toMiniObject

instance BufferClass Buffer
instance MiniObjectClass Buffer where
  toMiniObject = MiniObject . castForeignPtr . unBuffer
  unsafeCastMiniObject = Buffer . castForeignPtr . unMiniObject

castToBuffer :: MiniObjectClass obj => obj -> Buffer
castToBuffer = castTo gTypeBuffer "Buffer"

gTypeBuffer :: GType
gTypeBuffer =
  {# call fun unsafe gst_buffer_get_type #}

-- ********************************************************************** Event

{#pointer *Event foreign newtype #} deriving (Eq,Ord)

mkEvent = (Event, miniObjectUnref)
unEvent (Event o) = o

class MiniObjectClass o => EventClass o
toEvent :: EventClass o => o -> Event
toEvent = unsafeCastMiniObject . toMiniObject

instance EventClass Event
instance MiniObjectClass Event where
  toMiniObject = MiniObject . castForeignPtr . unEvent
  unsafeCastMiniObject = Event . castForeignPtr . unMiniObject

castToEvent :: MiniObjectClass obj => obj -> Event
castToEvent = castTo gTypeEvent "Event"

gTypeEvent :: GType
gTypeEvent =
  {# call fun unsafe gst_event_get_type #}

-- ******************************************************************** Message

{#pointer *Message foreign newtype #} deriving (Eq,Ord)

mkMessage = (Message, miniObjectUnref)
unMessage (Message o) = o

class MiniObjectClass o => MessageClass o
toMessage :: MessageClass o => o -> Message
toMessage = unsafeCastMiniObject . toMiniObject

instance MessageClass Message
instance MiniObjectClass Message where
  toMiniObject = MiniObject . castForeignPtr . unMessage
  unsafeCastMiniObject = Message . castForeignPtr . unMiniObject

castToMessage :: MiniObjectClass obj => obj -> Message
castToMessage = castTo gTypeMessage "Message"

gTypeMessage :: GType
gTypeMessage =
  {# call fun unsafe gst_message_get_type #}

-- ********************************************************************** Query

{#pointer *Query foreign newtype #} deriving (Eq,Ord)

mkQuery = (Query, miniObjectUnref)
unQuery (Query o) = o

class MiniObjectClass o => QueryClass o
toQuery :: QueryClass o => o -> Query
toQuery = unsafeCastMiniObject . toMiniObject

instance QueryClass Query
instance MiniObjectClass Query where
  toMiniObject = MiniObject . castForeignPtr . unQuery
  unsafeCastMiniObject = Query . castForeignPtr . unMiniObject

castToQuery :: MiniObjectClass obj => obj -> Query
castToQuery = castTo gTypeQuery "Query"

gTypeQuery :: GType
gTypeQuery =
  {# call fun unsafe gst_query_get_type #}