static GError* _check(GList *working_m1list) { GError *error = NULL; if ( working_m1list ) { working_m1list=g_list_sort(working_m1list,meta0_assign_sort_by_score); struct meta0_assign_meta1_s *hM1 = working_m1list->data; struct meta0_assign_meta1_s *lM1 = (g_list_last(working_m1list))->data; guint highscore = hM1->score; guint lowscore = lM1->score; GRID_TRACE("check delta highscore %d ,lowscore %d",highscore,lowscore); if ( (highscore - lowscore) < (context->avgscore * trigger_assignment )/ 100 ) { GRID_WARN("New assign not necessary, high score %d , low score %d, average %d", highscore, lowscore, context->avgscore); error = NEWERROR(0, "New assign not necessary"); return error; } } if ( context->lastAssignTime ) { GRID_TRACE("last time %s",g_date_time_format (context->lastAssignTime,"%Y-%m-%d %H:%M")); GDateTime *currentTime, *ltime; currentTime=g_date_time_new_now_local(); ltime = g_date_time_add_minutes(context->lastAssignTime,period_between_two_assign); GRID_TRACE("currentTime :%s , last time + %d min :%s, comp :%d",g_date_time_format (currentTime,"%Y-%m-%d %H:%M"),period_between_two_assign,g_date_time_format (ltime,"%Y-%m-%d %H:%M"), g_date_time_compare(ltime,currentTime)); if (g_date_time_compare(ltime,currentTime) > 0 ) { GRID_WARN("delay between two meta1 assign not respected. Try later. last date [%s]",g_date_time_format (context->lastAssignTime,"%Y-%m-%d %H:%M")); error = NEWERROR(0,"delay between two meta1 assign not respected. Try later."); return error; } } return NULL; }
static guint calculate_seconds_until_next_minute (void) { guint seconds; GTimeSpan diff; GDateTime * now; GDateTime * next; GDateTime * start_of_next; now = g_date_time_new_now_local (); next = g_date_time_add_minutes (now, 1); start_of_next = g_date_time_new_local (g_date_time_get_year (next), g_date_time_get_month (next), g_date_time_get_day_of_month (next), g_date_time_get_hour (next), g_date_time_get_minute (next), 1); diff = g_date_time_difference (start_of_next, now); seconds = (diff + (G_TIME_SPAN_SECOND - 1)) / G_TIME_SPAN_SECOND; /* cleanup */ g_date_time_unref (start_of_next); g_date_time_unref (next); g_date_time_unref (now); return seconds; }
static void create_header (MexEpgGrid *grid) { MexEpgGridPrivate *priv = grid->priv; GTimeSpan diff; GDateTime *time_, *old_time; gint n_headers, i; gchar *time_str; diff = g_date_time_difference (priv->last_date, priv->first_date); n_headers = (diff * 1e-6 / 60. / 30) + 1; /* number of 30mins slices */ if (MEX_DEBUG_ENABLED (EPG)) { gchar *first_str, *last_str; first_str = mex_date_to_string (priv->first_date); last_str = mex_date_to_string (priv->last_date); MEX_NOTE (EPG, "Creating header between %s and %s (%d columns)", first_str, last_str, n_headers); g_free (first_str); g_free (last_str); } g_ptr_array_set_size (priv->header, n_headers); time_ = g_date_time_ref (priv->first_date); for (i = 0; i < n_headers; i++) { ClutterActor *frame, *label; /* a Frame for 30 mins, each frame has a label in it */ frame = mx_frame_new (); clutter_actor_set_parent (frame, CLUTTER_ACTOR (grid)); mx_stylable_set_style_class (MX_STYLABLE (frame), "EpgHeader"); clutter_actor_set_size (frame, 6 * priv->pixels_for_5_mins, HEADER_HEIGHT); time_str = g_date_time_format (time_, "%H:%M"); label = mx_label_new_with_text (time_str); mx_bin_set_child (MX_BIN (frame), label); mx_bin_set_alignment (MX_BIN (frame), MX_ALIGN_START, MX_ALIGN_MIDDLE); g_ptr_array_index (priv->header, i) = frame; g_free (time_str); old_time = time_; time_ = g_date_time_add_minutes (time_, 30); g_date_time_unref (old_time); } g_date_time_unref (time_); }
/** * gst_video_time_code_to_date_time: * @tc: #GstVideoTimeCode to convert * * The @tc.config->latest_daily_jam is required to be non-NULL. * * Returns: the #GDateTime representation of @tc. * * Since: 1.10 */ GDateTime * gst_video_time_code_to_date_time (const GstVideoTimeCode * tc) { GDateTime *ret; GDateTime *ret2; gdouble add_us; g_return_val_if_fail (gst_video_time_code_is_valid (tc), NULL); g_return_val_if_fail (tc->config.latest_daily_jam != NULL, NULL); ret = g_date_time_ref (tc->config.latest_daily_jam); if (ret == NULL) { gchar *tc_str = gst_video_time_code_to_string (tc); GST_WARNING ("Asked to convert time code %s to GDateTime, but its latest daily jam is NULL", tc_str); g_free (tc_str); return NULL; } if (tc->config.fps_n == 0 && tc->config.fps_d == 1) { gchar *tc_str = gst_video_time_code_to_string (tc); GST_WARNING ("Asked to convert time code %s to GDateTime, but its framerate is unknown", tc_str); g_free (tc_str); return NULL; } gst_util_fraction_to_double (tc->frames * tc->config.fps_d, tc->config.fps_n, &add_us); if ((tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_INTERLACED) && tc->field_count == 1) { gdouble sub_us; gst_util_fraction_to_double (tc->config.fps_d, 2 * tc->config.fps_n, &sub_us); add_us -= sub_us; } ret2 = g_date_time_add_seconds (ret, add_us + tc->seconds); g_date_time_unref (ret); ret = g_date_time_add_minutes (ret2, tc->minutes); g_date_time_unref (ret2); ret2 = g_date_time_add_hours (ret, tc->hours); g_date_time_unref (ret); return ret2; }
static void change_time (GtkButton *button, CcDateTimePanel *panel) { CcDateTimePanelPrivate *priv = panel->priv; const gchar *widget_name; gint direction; GDateTime *old_date; old_date = priv->date; widget_name = gtk_buildable_get_name (GTK_BUILDABLE (button)); if (strstr (widget_name, "up")) direction = 1; else direction = -1; if (widget_name[0] == 'h') { priv->date = g_date_time_add_hours (old_date, direction); } else if (widget_name[0] == 'm') { priv->date = g_date_time_add_minutes (old_date, direction); } else { int hour; hour = g_date_time_get_hour (old_date); if (hour >= 12) priv->date = g_date_time_add_hours (old_date, -12); else priv->date = g_date_time_add_hours (old_date, 12); } g_date_time_unref (old_date); update_time (panel); queue_set_datetime (panel); }
/** * gst_date_time_new_from_iso8601_string: * @string: ISO 8601-formatted datetime string. * * Tries to parse common variants of ISO-8601 datetime strings into a * #GstDateTime. Possible input formats are (for example): * 2012-06-30T22:46:43Z, 2012, 2012-06, 2012-06-30, 2012-06-30T22:46:43-0430, * 2012-06-30T22:46Z, 2012-06-30T22:46-0430, 2012-06-30 22:46, * 2012-06-30 22:46:43, 2012-06-00, 2012-00-00, 2012-00-30, 22:46:43Z, 22:46Z, * 22:46:43-0430, 22:46-0430, 22:46:30, 22:46 * If no date is provided, it is assumed to be "today" in the timezone * provided (if any), otherwise UTC. * * Free-function: gst_date_time_unref * * Returns: (transfer full) (nullable): a newly created #GstDateTime, * or %NULL on error */ GstDateTime * gst_date_time_new_from_iso8601_string (const gchar * string) { gint year = -1, month = -1, day = -1, hour = -1, minute = -1; gint gmt_offset_hour = -99, gmt_offset_min = -99; gdouble second = -1.0; gfloat tzoffset = 0.0; guint64 usecs; gint len, ret; g_return_val_if_fail (string != NULL, NULL); GST_DEBUG ("Parsing '%s' into a datetime", string); len = strlen (string); /* The input string is expected to start either with a year (4 digits) or * with an hour (2 digits). Hour must be followed by minute. In any case, * the string must be at least 4 characters long and start with 2 digits */ if (len < 4 || !g_ascii_isdigit (string[0]) || !g_ascii_isdigit (string[1])) return NULL; if (g_ascii_isdigit (string[2]) && g_ascii_isdigit (string[3])) { ret = sscanf (string, "%04d-%02d-%02d", &year, &month, &day); if (ret == 0) return NULL; if (ret == 3 && day <= 0) { ret = 2; day = -1; } if (ret >= 2 && month <= 0) { ret = 1; month = day = -1; } if (ret >= 1 && (year <= 0 || year > 9999 || month > 12 || day > 31)) return NULL; else if (ret >= 1 && len < 16) /* YMD is 10 chars. XMD + HM will be 16 chars. if it is less, * it make no sense to continue. We will stay with YMD. */ goto ymd; string += 10; /* Exit if there is no expeceted value on this stage */ if (!(*string == 'T' || *string == '-' || *string == ' ')) goto ymd; string += 1; } /* if hour or minute fails, then we will use only ymd. */ hour = g_ascii_strtoull (string, (gchar **) & string, 10); if (hour > 24 || *string != ':') goto ymd; /* minute */ minute = g_ascii_strtoull (string + 1, (gchar **) & string, 10); if (minute > 59) goto ymd; /* second */ if (*string == ':') { second = g_ascii_strtoull (string + 1, (gchar **) & string, 10); /* if we fail here, we still can reuse hour and minute. We * will still attempt to parse any timezone information */ if (second > 59) { second = -1.0; } else { /* microseconds */ if (*string == '.' || *string == ',') { const gchar *usec_start = string + 1; guint digits; usecs = g_ascii_strtoull (string + 1, (gchar **) & string, 10); if (usecs != G_MAXUINT64 && string > usec_start) { digits = (guint) (string - usec_start); second += (gdouble) usecs / pow (10.0, digits); } } } } if (*string == 'Z') goto ymd_hms; else { /* reuse some code from gst-plugins-base/gst-libs/gst/tag/gstxmptag.c */ gint gmt_offset = -1; gchar *plus_pos = NULL; gchar *neg_pos = NULL; gchar *pos = NULL; GST_LOG ("Checking for timezone information"); /* check if there is timezone info */ plus_pos = strrchr (string, '+'); neg_pos = strrchr (string, '-'); if (plus_pos) pos = plus_pos + 1; else if (neg_pos) pos = neg_pos + 1; if (pos && strlen (pos) >= 3) { gint ret_tz; if (pos[2] == ':') ret_tz = sscanf (pos, "%d:%d", &gmt_offset_hour, &gmt_offset_min); else ret_tz = sscanf (pos, "%02d%02d", &gmt_offset_hour, &gmt_offset_min); GST_DEBUG ("Parsing timezone: %s", pos); if (ret_tz == 2) { if (neg_pos != NULL && neg_pos + 1 == pos) { gmt_offset_hour *= -1; gmt_offset_min *= -1; } gmt_offset = gmt_offset_hour * 60 + gmt_offset_min; tzoffset = gmt_offset / 60.0; GST_LOG ("Timezone offset: %f (%d minutes)", tzoffset, gmt_offset); } else GST_WARNING ("Failed to parse timezone information"); } } ymd_hms: if (year == -1 || month == -1 || day == -1) { GDateTime *now_utc, *now_in_given_tz; /* No date was supplied: make it today */ now_utc = g_date_time_new_now_utc (); if (tzoffset != 0.0) { /* If a timezone offset was supplied, get the date of that timezone */ g_assert (gmt_offset_min != -99); g_assert (gmt_offset_hour != -99); now_in_given_tz = g_date_time_add_minutes (now_utc, (60 * gmt_offset_hour) + gmt_offset_min); g_date_time_unref (now_utc); } else { now_in_given_tz = now_utc; } g_date_time_get_ymd (now_in_given_tz, &year, &month, &day); g_date_time_unref (now_in_given_tz); } return gst_date_time_new (tzoffset, year, month, day, hour, minute, second); ymd: if (year == -1) { /* No date was supplied and time failed to parse */ return NULL; } return gst_date_time_new_ymd (year, month, day); }