2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001, 2002 Sun Microsystems Inc.,
6 * Copyright 2001, 2002 Ximian, Inc.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
24 /* streamablecontent.c : implements the StreamableContent interface */
28 #include <libspi/accessible.h>
29 #include <libspi/component.h>
30 #include <libspi/streamablecontent.h>
32 /* Our parent Gtk object type */
33 #define PARENT_TYPE SPI_TYPE_BASE
35 /* A pointer to our parent object class */
36 static GObjectClass *spi_streamable_parent_class;
38 #define SPI_CONTENT_STREAM_TYPE (spi_content_stream_get_type ())
39 #define SPI_CONTENT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SPI_CONTENT_STREAM_TYPE, SpiContentStream))
40 #define SPI_CONTENT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SPI_CONTENT_STREAM_TYPE, SpiContentStreamClass))
41 #define SPI_IS_CONTENT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SPI_CONTENT_STREAM_TYPE))
42 #define SPI_IS_CONTENT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SPI_CONTENT_STREAM_TYPE))
44 typedef struct _SpiContentStream SpiContentStream;
45 typedef struct _SpiContentStreamClass SpiContentStreamClass;
47 struct _SpiContentStream {
52 struct _SpiContentStreamClass {
53 BonoboObjectClass parent_class;
54 POA_Accessibility_ContentStream__epv epv;
57 GType spi_content_stream_get_type (void);
59 static SpiContentStream*
60 spi_content_stream_new (GIOChannel *gio)
62 SpiContentStream *new_stream = g_object_new (SPI_CONTENT_STREAM_TYPE, NULL);
63 new_stream->gio = gio;
68 spi_content_stream_dispose (GObject *o)
70 if (SPI_IS_CONTENT_STREAM (o))
72 SpiContentStream *stream = SPI_CONTENT_STREAM (o);
73 if (stream->gio) g_io_channel_unref (stream->gio);
78 impl_content_stream_seek (PortableServer_Servant servant,
79 const CORBA_long offset,
80 const Accessibility_ContentStream_SeekType whence,
81 CORBA_Environment *ev)
83 SpiContentStream *stream = SPI_CONTENT_STREAM (bonobo_object_from_servant(servant));
84 if (stream && stream->gio)
87 GSeekType seektype = G_SEEK_SET;
89 case Accessibility_ContentStream_SEEK_CURRENT:
90 seektype = G_SEEK_CUR;
92 case Accessibility_ContentStream_SEEK_END:
93 seektype = G_SEEK_END;
96 if (g_io_channel_seek_position (stream->gio, (gint64) offset,
97 seektype, &err) == G_IO_STATUS_NORMAL)
107 impl_content_stream_read (PortableServer_Servant servant,
108 const CORBA_long count,
109 Accessibility_ContentStream_iobuf** buffer,
110 CORBA_Environment *ev)
112 SpiContentStream *stream = SPI_CONTENT_STREAM (bonobo_object_from_servant(servant));
113 CORBA_long realcount = 0;
114 if (stream && stream->gio)
119 /* read the giochannel and determine the actual bytes read...*/
121 status = g_io_channel_read_chars (stream->gio, &gbuf, count, &realcount, &err);
123 status = g_io_channel_read_to_end (stream->gio, &gbuf, &realcount, &err);
125 if (status == G_IO_STATUS_NORMAL || status == G_IO_STATUS_EOF)
127 *buffer = Bonobo_Stream_iobuf__alloc ();
128 CORBA_sequence_set_release (*buffer, TRUE);
130 (*buffer)->_buffer = CORBA_sequence_CORBA_octet_allocbuf (realcount);
131 (*buffer)->_length = realcount;
133 memcpy ((*buffer)->_buffer, gbuf, realcount);
143 impl_content_stream_close (PortableServer_Servant servant,
144 CORBA_Environment *ev)
148 SpiContentStream *stream = SPI_CONTENT_STREAM (bonobo_object_from_servant(servant));
149 if (stream && stream->gio) status = g_io_channel_shutdown (stream->gio, TRUE, &err);
150 if (err) g_free (err);
154 spi_content_stream_class_init (SpiContentStreamClass *klass)
156 POA_Accessibility_ContentStream__epv *epv = &klass->epv;
157 GObjectClass * object_class = (GObjectClass *) klass;
159 epv->seek = impl_content_stream_seek;
160 epv->read = impl_content_stream_read;
161 epv->close = impl_content_stream_close;
163 object_class->dispose = spi_content_stream_dispose;
168 spi_content_stream_init (SpiContentStream *stream)
173 BONOBO_TYPE_FUNC_FULL (SpiContentStream,
174 Accessibility_ContentStream,
178 static AtkStreamableContent *
179 get_streamable_from_servant (PortableServer_Servant servant)
181 SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant));
182 g_return_val_if_fail (object != NULL, NULL);
183 g_return_val_if_fail (ATK_IS_STREAMABLE_CONTENT(object->gobj), NULL);
184 return ATK_STREAMABLE_CONTENT (object->gobj);
188 * CORBA Accessibility::StreamableContent::getContentTypes method implementation
190 static Accessibility_StringSeq*
191 impl_accessibility_streamable_get_content_types (PortableServer_Servant servant,
192 CORBA_Environment *ev)
194 Accessibility_StringSeq *typelist = Accessibility_StringSeq__alloc ();
195 AtkStreamableContent *streamable = get_streamable_from_servant (servant);
198 typelist->_length = 0;
199 g_return_val_if_fail (streamable != NULL, typelist);
201 n_types = atk_streamable_content_get_n_mime_types (streamable);
202 typelist->_length = n_types;
203 typelist->_buffer = Accessibility_StringSeq_allocbuf (n_types);
204 for (i = 0; i < n_types; ++i) {
205 const gchar *mimetype = atk_streamable_content_get_mime_type (streamable, i);
206 typelist->_buffer[i] = CORBA_string_dup (mimetype ? mimetype : "");
213 * CORBA Accessibility::StreamableContent::getContent method implementation
216 impl_accessibility_streamable_get_content (PortableServer_Servant servant,
217 const CORBA_char * content_type,
218 CORBA_Environment *ev)
220 Bonobo_Stream stream;
221 AtkStreamableContent *streamable = get_streamable_from_servant (servant);
224 g_return_val_if_fail (streamable != NULL, NULL);
226 gio = atk_streamable_content_get_stream (streamable, content_type);
228 stream = CORBA_OBJECT_NIL; /* FIXME! */
234 * CORBA Accessibility::StreamableContent::getStream method implementation
236 static Accessibility_ContentStream
237 impl_accessibility_streamable_get_stream (PortableServer_Servant servant,
238 const CORBA_char * content_type,
239 CORBA_Environment *ev)
241 SpiContentStream *stream;
242 AtkStreamableContent *streamable = get_streamable_from_servant (servant);
245 g_return_val_if_fail (streamable != NULL, NULL);
247 gio = atk_streamable_content_get_stream (streamable, content_type);
249 stream = spi_content_stream_new (gio);
251 return bonobo_object_dup_ref (BONOBO_OBJREF (stream), ev);
255 * CORBA Accessibility::StreamableContent::getURI method implementation
258 impl_accessibility_streamable_get_uri (PortableServer_Servant servant,
259 const CORBA_char * content_type,
260 CORBA_Environment *ev)
263 AtkStreamableContent *streamable = get_streamable_from_servant (servant);
265 g_return_val_if_fail (streamable != NULL, NULL);
267 uri = atk_streamable_content_get_uri (streamable, content_type);
269 return (uri != NULL ? CORBA_string_dup (uri) : CORBA_string_dup (""));
273 spi_streamable_class_init (SpiStreamableClass *klass)
275 POA_Accessibility_StreamableContent__epv *epv = &klass->epv;
276 spi_streamable_parent_class = g_type_class_peek_parent (klass);
278 epv->getContentTypes = impl_accessibility_streamable_get_content_types;
279 epv->getContent = impl_accessibility_streamable_get_content;
280 epv->getStream = impl_accessibility_streamable_get_stream;
281 epv->getURI = impl_accessibility_streamable_get_uri;
285 spi_streamable_init (SpiStreamable *streamable)
289 BONOBO_TYPE_FUNC_FULL (SpiStreamable,
290 Accessibility_StreamableContent,
295 spi_streamable_interface_new (AtkObject *o)
297 SpiStreamable *retval = g_object_new (SPI_STREAMABLE_TYPE, NULL);
299 spi_base_construct (SPI_BASE (retval), G_OBJECT(o));