1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright (C) 2006-2007 Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Author: Alexander Larsson <alexl@redhat.com>
25 #include "gdataoutputstream.h"
26 #include "gioenumtypes.h"
31 * SECTION:gdataoutputstream
32 * @short_description: Data Output Stream
34 * @see_also: #GOutputStream
36 * Data output stream implements #GOutputStream and includes functions for
37 * writing data directly to an output stream.
43 struct _GDataOutputStreamPrivate {
44 GDataStreamByteOrder byte_order;
52 static void g_data_output_stream_set_property (GObject *object,
56 static void g_data_output_stream_get_property (GObject *object,
61 G_DEFINE_TYPE (GDataOutputStream,
63 G_TYPE_FILTER_OUTPUT_STREAM)
67 g_data_output_stream_class_init (GDataOutputStreamClass *klass)
69 GObjectClass *object_class;
71 g_type_class_add_private (klass, sizeof (GDataOutputStreamPrivate));
73 object_class = G_OBJECT_CLASS (klass);
74 object_class->get_property = g_data_output_stream_get_property;
75 object_class->set_property = g_data_output_stream_set_property;
78 * GDataOutputStream:byte-order:
80 * Determines the byte ordering that is used when writing
81 * multi-byte entities (such as integers) to the stream.
83 g_object_class_install_property (object_class,
85 g_param_spec_enum ("byte-order",
88 G_TYPE_DATA_STREAM_BYTE_ORDER,
89 G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN,
90 G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_BLURB));
95 g_data_output_stream_set_property (GObject *object,
100 GDataOutputStream *dstream;
102 dstream = G_DATA_OUTPUT_STREAM (object);
106 case PROP_BYTE_ORDER:
107 g_data_output_stream_set_byte_order (dstream, g_value_get_enum (value));
111 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
117 g_data_output_stream_get_property (GObject *object,
122 GDataOutputStreamPrivate *priv;
123 GDataOutputStream *dstream;
125 dstream = G_DATA_OUTPUT_STREAM (object);
126 priv = dstream->priv;
130 case PROP_BYTE_ORDER:
131 g_value_set_enum (value, priv->byte_order);
135 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
141 g_data_output_stream_init (GDataOutputStream *stream)
143 stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream,
144 G_TYPE_DATA_OUTPUT_STREAM,
145 GDataOutputStreamPrivate);
147 stream->priv->byte_order = G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN;
151 * g_data_output_stream_new:
152 * @base_stream: a #GOutputStream.
154 * Creates a new data output stream for @base_stream.
156 * Returns: #GDataOutputStream.
159 g_data_output_stream_new (GOutputStream *base_stream)
161 GDataOutputStream *stream;
163 g_return_val_if_fail (G_IS_OUTPUT_STREAM (base_stream), NULL);
165 stream = g_object_new (G_TYPE_DATA_OUTPUT_STREAM,
166 "base-stream", base_stream,
173 * g_data_output_stream_set_byte_order:
174 * @stream: a #GDataOutputStream.
175 * @order: a %GDataStreamByteOrder.
177 * Sets the byte order of the data output stream to @order.
180 g_data_output_stream_set_byte_order (GDataOutputStream *stream,
181 GDataStreamByteOrder order)
183 GDataOutputStreamPrivate *priv;
184 g_return_if_fail (G_IS_DATA_OUTPUT_STREAM (stream));
186 if (priv->byte_order != order)
188 priv->byte_order = order;
189 g_object_notify (G_OBJECT (stream), "byte-order");
194 * g_data_output_stream_get_byte_order:
195 * @stream: a #GDataOutputStream.
197 * Gets the byte order for the stream.
199 * Returns: the #GDataStreamByteOrder for the @stream.
202 g_data_output_stream_get_byte_order (GDataOutputStream *stream)
204 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN);
206 return stream->priv->byte_order;
210 * g_data_output_stream_put_byte:
211 * @stream: a #GDataOutputStream.
213 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
214 * @error: a #GError, %NULL to ignore.
216 * Puts a byte into the output stream.
218 * Returns: %TRUE if @data was successfully added to the @stream.
221 g_data_output_stream_put_byte (GDataOutputStream *stream,
223 GCancellable *cancellable,
228 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
230 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),
237 * g_data_output_stream_put_int16:
238 * @stream: a #GDataOutputStream.
240 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
241 * @error: a #GError, %NULL to ignore.
243 * Puts a signed 16-bit integer into the output stream.
245 * Returns: %TRUE if @data was successfully added to the @stream.
248 g_data_output_stream_put_int16 (GDataOutputStream *stream,
250 GCancellable *cancellable,
255 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
257 switch (stream->priv->byte_order)
259 case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN:
260 data = GINT16_TO_BE (data);
262 case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN:
263 data = GINT16_TO_LE (data);
265 case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN:
270 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),
277 * g_data_output_stream_put_uint16:
278 * @stream: a #GDataOutputStream.
280 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
281 * @error: a #GError, %NULL to ignore.
283 * Puts an unsigned 16-bit integer into the output stream.
285 * Returns: %TRUE if @data was successfully added to the @stream.
288 g_data_output_stream_put_uint16 (GDataOutputStream *stream,
290 GCancellable *cancellable,
295 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
297 switch (stream->priv->byte_order)
299 case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN:
300 data = GUINT16_TO_BE (data);
302 case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN:
303 data = GUINT16_TO_LE (data);
305 case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN:
310 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),
317 * g_data_output_stream_put_int32:
318 * @stream: a #GDataOutputStream.
320 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
321 * @error: a #GError, %NULL to ignore.
323 * Puts a signed 32-bit integer into the output stream.
325 * Returns: %TRUE if @data was successfully added to the @stream.
328 g_data_output_stream_put_int32 (GDataOutputStream *stream,
330 GCancellable *cancellable,
335 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
337 switch (stream->priv->byte_order)
339 case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN:
340 data = GINT32_TO_BE (data);
342 case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN:
343 data = GINT32_TO_LE (data);
345 case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN:
350 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),
357 * g_data_output_stream_put_uint32:
358 * @stream: a #GDataOutputStream.
360 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
361 * @error: a #GError, %NULL to ignore.
363 * Puts an unsigned 32-bit integer into the stream.
365 * Returns: %TRUE if @data was successfully added to the @stream.
368 g_data_output_stream_put_uint32 (GDataOutputStream *stream,
370 GCancellable *cancellable,
375 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
377 switch (stream->priv->byte_order)
379 case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN:
380 data = GUINT32_TO_BE (data);
382 case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN:
383 data = GUINT32_TO_LE (data);
385 case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN:
390 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),
397 * g_data_output_stream_put_int64:
398 * @stream: a #GDataOutputStream.
400 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
401 * @error: a #GError, %NULL to ignore.
403 * Puts a signed 64-bit integer into the stream.
405 * Returns: %TRUE if @data was successfully added to the @stream.
408 g_data_output_stream_put_int64 (GDataOutputStream *stream,
410 GCancellable *cancellable,
415 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
417 switch (stream->priv->byte_order)
419 case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN:
420 data = GINT64_TO_BE (data);
422 case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN:
423 data = GINT64_TO_LE (data);
425 case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN:
430 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),
437 * g_data_output_stream_put_uint64:
438 * @stream: a #GDataOutputStream.
440 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
441 * @error: a #GError, %NULL to ignore.
443 * Puts an unsigned 64-bit integer into the stream.
445 * Returns: %TRUE if @data was successfully added to the @stream.
448 g_data_output_stream_put_uint64 (GDataOutputStream *stream,
450 GCancellable *cancellable,
455 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
457 switch (stream->priv->byte_order)
459 case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN:
460 data = GUINT64_TO_BE (data);
462 case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN:
463 data = GUINT64_TO_LE (data);
465 case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN:
470 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),
477 * g_data_output_stream_put_string:
478 * @stream: a #GDataOutputStream.
480 * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
481 * @error: a #GError, %NULL to ignore.
483 * Puts a string into the output stream.
485 * Returns: %TRUE if @string was successfully added to the @stream.
488 g_data_output_stream_put_string (GDataOutputStream *stream,
490 GCancellable *cancellable,
495 g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE);
496 g_return_val_if_fail (str != NULL, FALSE);
498 return g_output_stream_write_all (G_OUTPUT_STREAM (stream),