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