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