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 glib.TimeVal;
26 
27 private import glib.MemorySlice;
28 private import glib.Str;
29 private import glib.c.functions;
30 public  import glib.c.types;
31 public  import gtkc.glibtypes;
32 private import gtkd.Loader;
33 
34 
35 /**
36  * Represents a precise time, with seconds and microseconds.
37  * Similar to the struct timeval returned by the gettimeofday()
38  * UNIX system call.
39  * 
40  * GLib is attempting to unify around the use of 64-bit integers to
41  * represent microsecond-precision time. As such, this type will be
42  * removed from a future version of GLib. A consequence of using `glong` for
43  * `tv_sec` is that on 32-bit systems `GTimeVal` is subject to the year 2038
44  * problem.
45  * 
46  * Deprecated: Use #GDateTime or #guint64 instead.
47  */
48 public final class TimeVal
49 {
50 	/** the main Gtk struct */
51 	protected GTimeVal* gTimeVal;
52 	protected bool ownedRef;
53 
54 	/** Get the main Gtk struct */
55 	public GTimeVal* getTimeValStruct(bool transferOwnership = false)
56 	{
57 		if (transferOwnership)
58 			ownedRef = false;
59 		return gTimeVal;
60 	}
61 
62 	/** the main Gtk struct as a void* */
63 	protected void* getStruct()
64 	{
65 		return cast(void*)gTimeVal;
66 	}
67 
68 	/**
69 	 * Sets our main struct and passes it to the parent class.
70 	 */
71 	public this (GTimeVal* gTimeVal, bool ownedRef = false)
72 	{
73 		this.gTimeVal = gTimeVal;
74 		this.ownedRef = ownedRef;
75 	}
76 
77 	~this ()
78 	{
79 		if ( Linker.isLoaded(LIBRARY_GLIB) && ownedRef )
80 			sliceFree(gTimeVal);
81 	}
82 
83 
84 	/**
85 	 * seconds
86 	 */
87 	public @property glong tvSec()
88 	{
89 		return gTimeVal.tvSec;
90 	}
91 
92 	/** Ditto */
93 	public @property void tvSec(glong value)
94 	{
95 		gTimeVal.tvSec = value;
96 	}
97 
98 	/**
99 	 * microseconds
100 	 */
101 	public @property glong tvUsec()
102 	{
103 		return gTimeVal.tvUsec;
104 	}
105 
106 	/** Ditto */
107 	public @property void tvUsec(glong value)
108 	{
109 		gTimeVal.tvUsec = value;
110 	}
111 
112 	/**
113 	 * Adds the given number of microseconds to @time_. @microseconds can
114 	 * also be negative to decrease the value of @time_.
115 	 *
116 	 * Deprecated: #GTimeVal is not year-2038-safe. Use `guint64` for
117 	 * representing microseconds since the epoch, or use #GDateTime.
118 	 *
119 	 * Params:
120 	 *     microseconds = number of microseconds to add to @time
121 	 */
122 	public void add(glong microseconds)
123 	{
124 		g_time_val_add(gTimeVal, microseconds);
125 	}
126 
127 	/**
128 	 * Converts @time_ into an RFC 3339 encoded string, relative to the
129 	 * Coordinated Universal Time (UTC). This is one of the many formats
130 	 * allowed by ISO 8601.
131 	 *
132 	 * ISO 8601 allows a large number of date/time formats, with or without
133 	 * punctuation and optional elements. The format returned by this function
134 	 * is a complete date and time, with optional punctuation included, the
135 	 * UTC time zone represented as "Z", and the @tv_usec part included if
136 	 * and only if it is nonzero, i.e. either
137 	 * "YYYY-MM-DDTHH:MM:SSZ" or "YYYY-MM-DDTHH:MM:SS.fffffZ".
138 	 *
139 	 * This corresponds to the Internet date/time format defined by
140 	 * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt),
141 	 * and to either of the two most-precise formats defined by
142 	 * the W3C Note
143 	 * [Date and Time Formats](http://www.w3.org/TR/NOTE-datetime-19980827).
144 	 * Both of these documents are profiles of ISO 8601.
145 	 *
146 	 * Use g_date_time_format() or g_strdup_printf() if a different
147 	 * variation of ISO 8601 format is required.
148 	 *
149 	 * If @time_ represents a date which is too large to fit into a `struct tm`,
150 	 * %NULL will be returned. This is platform dependent. Note also that since
151 	 * `GTimeVal` stores the number of seconds as a `glong`, on 32-bit systems it
152 	 * is subject to the year 2038 problem. Accordingly, since GLib 2.62, this
153 	 * function has been deprecated. Equivalent functionality is available using:
154 	 * |[
155 	 * GDateTime *dt = g_date_time_new_from_unix_utc (time_val);
156 	 * iso8601_string = g_date_time_format_iso8601 (dt);
157 	 * g_date_time_unref (dt);
158 	 * ]|
159 	 *
160 	 * The return value of g_time_val_to_iso8601() has been nullable since GLib
161 	 * 2.54; before then, GLib would crash under the same conditions.
162 	 *
163 	 * Deprecated: #GTimeVal is not year-2038-safe. Use
164 	 * g_date_time_format_iso8601(dt) instead.
165 	 *
166 	 * Returns: a newly allocated string containing an ISO 8601 date,
167 	 *     or %NULL if @time_ was too large
168 	 *
169 	 * Since: 2.12
170 	 */
171 	public string toIso8601()
172 	{
173 		auto retStr = g_time_val_to_iso8601(gTimeVal);
174 
175 		scope(exit) Str.freeString(retStr);
176 		return Str.toString(retStr);
177 	}
178 
179 	/**
180 	 * Converts a string containing an ISO 8601 encoded date and time
181 	 * to a #GTimeVal and puts it into @time_.
182 	 *
183 	 * @iso_date must include year, month, day, hours, minutes, and
184 	 * seconds. It can optionally include fractions of a second and a time
185 	 * zone indicator. (In the absence of any time zone indication, the
186 	 * timestamp is assumed to be in local time.)
187 	 *
188 	 * Any leading or trailing space in @iso_date is ignored.
189 	 *
190 	 * This function was deprecated, along with #GTimeVal itself, in GLib 2.62.
191 	 * Equivalent functionality is available using code like:
192 	 * |[
193 	 * GDateTime *dt = g_date_time_new_from_iso8601 (iso8601_string, NULL);
194 	 * gint64 time_val = g_date_time_to_unix (dt);
195 	 * g_date_time_unref (dt);
196 	 * ]|
197 	 *
198 	 * Deprecated: #GTimeVal is not year-2038-safe. Use
199 	 * g_date_time_new_from_iso8601() instead.
200 	 *
201 	 * Params:
202 	 *     isoDate = an ISO 8601 encoded date string
203 	 *     time = a #GTimeVal
204 	 *
205 	 * Returns: %TRUE if the conversion was successful.
206 	 *
207 	 * Since: 2.12
208 	 */
209 	public static bool fromIso8601(string isoDate, out TimeVal time)
210 	{
211 		GTimeVal* outtime = sliceNew!GTimeVal();
212 
213 		auto __p = g_time_val_from_iso8601(Str.toStringz(isoDate), outtime) != 0;
214 
215 		time = new TimeVal(outtime, true);
216 
217 		return __p;
218 	}
219 
220 	/**
221 	 * Equivalent to the UNIX gettimeofday() function, but portable.
222 	 *
223 	 * You may find g_get_real_time() to be more convenient.
224 	 *
225 	 * Deprecated: #GTimeVal is not year-2038-safe. Use g_get_real_time()
226 	 * instead.
227 	 *
228 	 * Params:
229 	 *     result = #GTimeVal structure in which to store current time.
230 	 */
231 	public static void getCurrentTime(TimeVal result)
232 	{
233 		g_get_current_time((result is null) ? null : result.getTimeValStruct());
234 	}
235 
236 	/**
237 	 * Queries the system monotonic time.
238 	 *
239 	 * The monotonic clock will always increase and doesn't suffer
240 	 * discontinuities when the user (or NTP) changes the system time.  It
241 	 * may or may not continue to tick during times where the machine is
242 	 * suspended.
243 	 *
244 	 * We try to use the clock that corresponds as closely as possible to
245 	 * the passage of time as measured by system calls such as poll() but it
246 	 * may not always be possible to do this.
247 	 *
248 	 * Returns: the monotonic time, in microseconds
249 	 *
250 	 * Since: 2.28
251 	 */
252 	public static long getMonotonicTime()
253 	{
254 		return g_get_monotonic_time();
255 	}
256 
257 	/**
258 	 * Queries the system wall-clock time.
259 	 *
260 	 * This call is functionally equivalent to g_get_current_time() except
261 	 * that the return value is often more convenient than dealing with a
262 	 * #GTimeVal.
263 	 *
264 	 * You should only use this call if you are actually interested in the real
265 	 * wall-clock time.  g_get_monotonic_time() is probably more useful for
266 	 * measuring intervals.
267 	 *
268 	 * Returns: the number of microseconds since January 1, 1970 UTC.
269 	 *
270 	 * Since: 2.28
271 	 */
272 	public static long getRealTime()
273 	{
274 		return g_get_real_time();
275 	}
276 
277 	/**
278 	 * Pauses the current thread for the given number of microseconds.
279 	 *
280 	 * There are 1 million microseconds per second (represented by the
281 	 * #G_USEC_PER_SEC macro). g_usleep() may have limited precision,
282 	 * depending on hardware and operating system; don't rely on the exact
283 	 * length of the sleep.
284 	 *
285 	 * Params:
286 	 *     microseconds = number of microseconds to pause
287 	 */
288 	public static void usleep(gulong microseconds)
289 	{
290 		g_usleep(microseconds);
291 	}
292 }