1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD 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
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module gio.IOStream;
26 
27 private import gio.AsyncResultIF;
28 private import gio.Cancellable;
29 private import gio.InputStream;
30 private import gio.OutputStream;
31 private import gio.c.functions;
32 public  import gio.c.types;
33 private import glib.ErrorG;
34 private import glib.GException;
35 private import gobject.ObjectG;
36 public  import gtkc.giotypes;
37 
38 
39 /**
40  * GIOStream represents an object that has both read and write streams.
41  * Generally the two streams act as separate input and output streams,
42  * but they share some common resources and state. For instance, for
43  * seekable streams, both streams may use the same position.
44  * 
45  * Examples of #GIOStream objects are #GSocketConnection, which represents
46  * a two-way network connection; and #GFileIOStream, which represents a
47  * file handle opened in read-write mode.
48  * 
49  * To do the actual reading and writing you need to get the substreams
50  * with g_io_stream_get_input_stream() and g_io_stream_get_output_stream().
51  * 
52  * The #GIOStream object owns the input and the output streams, not the other
53  * way around, so keeping the substreams alive will not keep the #GIOStream
54  * object alive. If the #GIOStream object is freed it will be closed, thus
55  * closing the substreams, so even if the substreams stay alive they will
56  * always return %G_IO_ERROR_CLOSED for all operations.
57  * 
58  * To close a stream use g_io_stream_close() which will close the common
59  * stream object and also the individual substreams. You can also close
60  * the substreams themselves. In most cases this only marks the
61  * substream as closed, so further I/O on it fails but common state in the
62  * #GIOStream may still be open. However, some streams may support
63  * "half-closed" states where one direction of the stream is actually shut down.
64  * 
65  * Operations on #GIOStreams cannot be started while another operation on the
66  * #GIOStream or its substreams is in progress. Specifically, an application can
67  * read from the #GInputStream and write to the #GOutputStream simultaneously
68  * (either in separate threads, or as asynchronous operations in the same
69  * thread), but an application cannot start any #GIOStream operation while there
70  * is a #GIOStream, #GInputStream or #GOutputStream operation in progress, and
71  * an application can’t start any #GInputStream or #GOutputStream operation
72  * while there is a #GIOStream operation in progress.
73  * 
74  * This is a product of individual stream operations being associated with a
75  * given #GMainContext (the thread-default context at the time the operation was
76  * started), rather than entire streams being associated with a single
77  * #GMainContext.
78  * 
79  * GIO may run operations on #GIOStreams from other (worker) threads, and this
80  * may be exposed to application code in the behaviour of wrapper streams, such
81  * as #GBufferedInputStream or #GTlsConnection. With such wrapper APIs,
82  * application code may only run operations on the base (wrapped) stream when
83  * the wrapper stream is idle. Note that the semantics of such operations may
84  * not be well-defined due to the state the wrapper stream leaves the base
85  * stream in (though they are guaranteed not to crash).
86  */
87 public class IOStream : ObjectG
88 {
89 	/** the main Gtk struct */
90 	protected GIOStream* gIOStream;
91 
92 	/** Get the main Gtk struct */
93 	public GIOStream* getIOStreamStruct(bool transferOwnership = false)
94 	{
95 		if (transferOwnership)
96 			ownedRef = false;
97 		return gIOStream;
98 	}
99 
100 	/** the main Gtk struct as a void* */
101 	protected override void* getStruct()
102 	{
103 		return cast(void*)gIOStream;
104 	}
105 
106 	/**
107 	 * Sets our main struct and passes it to the parent class.
108 	 */
109 	public this (GIOStream* gIOStream, bool ownedRef = false)
110 	{
111 		this.gIOStream = gIOStream;
112 		super(cast(GObject*)gIOStream, ownedRef);
113 	}
114 
115 
116 	/** */
117 	public static GType getType()
118 	{
119 		return g_io_stream_get_type();
120 	}
121 
122 	/**
123 	 * Finishes an asynchronous io stream splice operation.
124 	 *
125 	 * Params:
126 	 *     result = a #GAsyncResult.
127 	 *
128 	 * Returns: %TRUE on success, %FALSE otherwise.
129 	 *
130 	 * Since: 2.28
131 	 *
132 	 * Throws: GException on failure.
133 	 */
134 	public static bool spliceFinish(AsyncResultIF result)
135 	{
136 		GError* err = null;
137 
138 		auto p = g_io_stream_splice_finish((result is null) ? null : result.getAsyncResultStruct(), &err) != 0;
139 
140 		if (err !is null)
141 		{
142 			throw new GException( new ErrorG(err) );
143 		}
144 
145 		return p;
146 	}
147 
148 	/**
149 	 * Clears the pending flag on @stream.
150 	 *
151 	 * Since: 2.22
152 	 */
153 	public void clearPending()
154 	{
155 		g_io_stream_clear_pending(gIOStream);
156 	}
157 
158 	/**
159 	 * Closes the stream, releasing resources related to it. This will also
160 	 * close the individual input and output streams, if they are not already
161 	 * closed.
162 	 *
163 	 * Once the stream is closed, all other operations will return
164 	 * %G_IO_ERROR_CLOSED. Closing a stream multiple times will not
165 	 * return an error.
166 	 *
167 	 * Closing a stream will automatically flush any outstanding buffers
168 	 * in the stream.
169 	 *
170 	 * Streams will be automatically closed when the last reference
171 	 * is dropped, but you might want to call this function to make sure
172 	 * resources are released as early as possible.
173 	 *
174 	 * Some streams might keep the backing store of the stream (e.g. a file
175 	 * descriptor) open after the stream is closed. See the documentation for
176 	 * the individual stream for details.
177 	 *
178 	 * On failure the first error that happened will be reported, but the
179 	 * close operation will finish as much as possible. A stream that failed
180 	 * to close will still return %G_IO_ERROR_CLOSED for all operations.
181 	 * Still, it is important to check and report the error to the user,
182 	 * otherwise there might be a loss of data as all data might not be written.
183 	 *
184 	 * If @cancellable is not NULL, then the operation can be cancelled by
185 	 * triggering the cancellable object from another thread. If the operation
186 	 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
187 	 * Cancelling a close will still leave the stream closed, but some streams
188 	 * can use a faster close that doesn't block to e.g. check errors.
189 	 *
190 	 * The default implementation of this method just calls close on the
191 	 * individual input/output streams.
192 	 *
193 	 * Params:
194 	 *     cancellable = optional #GCancellable object, %NULL to ignore
195 	 *
196 	 * Returns: %TRUE on success, %FALSE on failure
197 	 *
198 	 * Since: 2.22
199 	 *
200 	 * Throws: GException on failure.
201 	 */
202 	public bool close(Cancellable cancellable)
203 	{
204 		GError* err = null;
205 
206 		auto p = g_io_stream_close(gIOStream, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err) != 0;
207 
208 		if (err !is null)
209 		{
210 			throw new GException( new ErrorG(err) );
211 		}
212 
213 		return p;
214 	}
215 
216 	/**
217 	 * Requests an asynchronous close of the stream, releasing resources
218 	 * related to it. When the operation is finished @callback will be
219 	 * called. You can then call g_io_stream_close_finish() to get
220 	 * the result of the operation.
221 	 *
222 	 * For behaviour details see g_io_stream_close().
223 	 *
224 	 * The asynchronous methods have a default fallback that uses threads
225 	 * to implement asynchronicity, so they are optional for inheriting
226 	 * classes. However, if you override one you must override all.
227 	 *
228 	 * Params:
229 	 *     ioPriority = the io priority of the request
230 	 *     cancellable = optional cancellable object
231 	 *     callback = callback to call when the request is satisfied
232 	 *     userData = the data to pass to callback function
233 	 *
234 	 * Since: 2.22
235 	 */
236 	public void closeAsync(int ioPriority, Cancellable cancellable, GAsyncReadyCallback callback, void* userData)
237 	{
238 		g_io_stream_close_async(gIOStream, ioPriority, (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData);
239 	}
240 
241 	/**
242 	 * Closes a stream.
243 	 *
244 	 * Params:
245 	 *     result = a #GAsyncResult
246 	 *
247 	 * Returns: %TRUE if stream was successfully closed, %FALSE otherwise.
248 	 *
249 	 * Since: 2.22
250 	 *
251 	 * Throws: GException on failure.
252 	 */
253 	public bool closeFinish(AsyncResultIF result)
254 	{
255 		GError* err = null;
256 
257 		auto p = g_io_stream_close_finish(gIOStream, (result is null) ? null : result.getAsyncResultStruct(), &err) != 0;
258 
259 		if (err !is null)
260 		{
261 			throw new GException( new ErrorG(err) );
262 		}
263 
264 		return p;
265 	}
266 
267 	/**
268 	 * Gets the input stream for this object. This is used
269 	 * for reading.
270 	 *
271 	 * Returns: a #GInputStream, owned by the #GIOStream.
272 	 *     Do not free.
273 	 *
274 	 * Since: 2.22
275 	 */
276 	public InputStream getInputStream()
277 	{
278 		auto p = g_io_stream_get_input_stream(gIOStream);
279 
280 		if(p is null)
281 		{
282 			return null;
283 		}
284 
285 		return ObjectG.getDObject!(InputStream)(cast(GInputStream*) p);
286 	}
287 
288 	/**
289 	 * Gets the output stream for this object. This is used for
290 	 * writing.
291 	 *
292 	 * Returns: a #GOutputStream, owned by the #GIOStream.
293 	 *     Do not free.
294 	 *
295 	 * Since: 2.22
296 	 */
297 	public OutputStream getOutputStream()
298 	{
299 		auto p = g_io_stream_get_output_stream(gIOStream);
300 
301 		if(p is null)
302 		{
303 			return null;
304 		}
305 
306 		return ObjectG.getDObject!(OutputStream)(cast(GOutputStream*) p);
307 	}
308 
309 	/**
310 	 * Checks if a stream has pending actions.
311 	 *
312 	 * Returns: %TRUE if @stream has pending actions.
313 	 *
314 	 * Since: 2.22
315 	 */
316 	public bool hasPending()
317 	{
318 		return g_io_stream_has_pending(gIOStream) != 0;
319 	}
320 
321 	/**
322 	 * Checks if a stream is closed.
323 	 *
324 	 * Returns: %TRUE if the stream is closed.
325 	 *
326 	 * Since: 2.22
327 	 */
328 	public bool isClosed()
329 	{
330 		return g_io_stream_is_closed(gIOStream) != 0;
331 	}
332 
333 	/**
334 	 * Sets @stream to have actions pending. If the pending flag is
335 	 * already set or @stream is closed, it will return %FALSE and set
336 	 * @error.
337 	 *
338 	 * Returns: %TRUE if pending was previously unset and is now set.
339 	 *
340 	 * Since: 2.22
341 	 *
342 	 * Throws: GException on failure.
343 	 */
344 	public bool setPending()
345 	{
346 		GError* err = null;
347 
348 		auto p = g_io_stream_set_pending(gIOStream, &err) != 0;
349 
350 		if (err !is null)
351 		{
352 			throw new GException( new ErrorG(err) );
353 		}
354 
355 		return p;
356 	}
357 
358 	/**
359 	 * Asyncronously splice the output stream of @stream1 to the input stream of
360 	 * @stream2, and splice the output stream of @stream2 to the input stream of
361 	 * @stream1.
362 	 *
363 	 * When the operation is finished @callback will be called.
364 	 * You can then call g_io_stream_splice_finish() to get the
365 	 * result of the operation.
366 	 *
367 	 * Params:
368 	 *     stream2 = a #GIOStream.
369 	 *     flags = a set of #GIOStreamSpliceFlags.
370 	 *     ioPriority = the io priority of the request.
371 	 *     cancellable = optional #GCancellable object, %NULL to ignore.
372 	 *     callback = a #GAsyncReadyCallback.
373 	 *     userData = user data passed to @callback.
374 	 *
375 	 * Since: 2.28
376 	 */
377 	public void spliceAsync(IOStream stream2, GIOStreamSpliceFlags flags, int ioPriority, Cancellable cancellable, GAsyncReadyCallback callback, void* userData)
378 	{
379 		g_io_stream_splice_async(gIOStream, (stream2 is null) ? null : stream2.getIOStreamStruct(), flags, ioPriority, (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData);
380 	}
381 }