GDate DateSet::from_string(const string& str) const { GDate dt; g_date_set_parse(&dt, str.c_str()); return dt; }
/* ** parse the gtkentry and store the GDate */ static void gtk_dateentry_entry_new(GtkWidget *gtkentry, gpointer user_data) { GtkDateEntry *dateentry = user_data; const gchar *str; DB( g_print(" (dateentry) entry validation\n") ); str = gtk_entry_get_text (GTK_ENTRY (dateentry->entry)); //1) we parse the string according to the locale g_date_set_parse (dateentry->date, str); if(g_date_valid(dateentry->date) == FALSE) { //2) give a try to tokens: day, day/month, month/day gtk_dateentry_tokens(gtkentry, user_data); } //3) at last if date still invalid, put today's dateentry_signals // we should consider just warn the user here if(g_date_valid(dateentry->date) == FALSE) { /* today's date */ g_date_set_time_t(dateentry->date, time(NULL)); } gtk_dateentry_datetoentry(dateentry); }
gchar* property_format_value (Property *property, const gchar *value) { gchar *ret; GDate *d; struct tm tm; GRegex *subject_format; gboolean subject_already_formatted; ret = NULL; switch (property_get_datatype (property)) { case PROPERTY_TYPE_STRING: ret = g_strdup_printf ("\"%s\"", value); break; case PROPERTY_TYPE_DATETIME: d = g_date_new (); g_date_set_parse (d, value); if (g_date_valid (d) == TRUE) { g_date_to_struct_tm (d, &tm); ret = g_strdup_printf ("\"%04d-%02d-%02dT%02d:%02d:%02dZ\"", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); } g_date_free (d); break; case PROPERTY_TYPE_RESOURCE: subject_format = g_regex_new ("<.*>", 0, 0, NULL); subject_already_formatted = g_regex_match(subject_format, value, 0, NULL); if(!subject_already_formatted) ret = g_strdup_printf ("<%s>", value); else ret = g_strdup (value); g_regex_unref (subject_format); break; case PROPERTY_TYPE_BOOLEAN: case PROPERTY_TYPE_INTEGER: case PROPERTY_TYPE_DOUBLE: default: ret = g_strdup (value); break; } return ret; }
static void gtk_dateentry_popup_display (GtkDateEntry * dateentry) { const char *str; int month; //gint height, width, x, y; gint old_width, old_height; DB( g_print(" (dateentry) popup_display\n****\n\n") ); old_width = dateentry->popwin->allocation.width; old_height = dateentry->popwin->allocation.height; /* update */ str = gtk_entry_get_text (GTK_ENTRY (dateentry->entry)); g_date_set_parse (dateentry->date, str); if(g_date_valid(dateentry->date) == TRUE) { /* GtkCalendar expects month to be in 0-11 range (inclusive) */ month = g_date_get_month (dateentry->date) - 1; gtk_calendar_select_month (GTK_CALENDAR (dateentry->calendar), CLAMP (month, 0, 11), g_date_get_year (dateentry->date)); gtk_calendar_select_day (GTK_CALENDAR (dateentry->calendar), g_date_get_day (dateentry->date)); } position_popup(dateentry); gtk_widget_show (dateentry->popwin); gtk_grab_add (dateentry->popwin); // this close the popup */ gdk_pointer_grab (dateentry->popwin->window, TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME); }
static void on_calendar_entry_activated(GtkWidget *widget, GtkWidget *calendar) { GDate *date; const gchar *text; date = g_date_new(); text = gtk_entry_get_text(GTK_ENTRY(widget)); g_date_set_parse(date, text); if (g_date_valid(date)) { gtk_calendar_freeze(GTK_CALENDAR(calendar)); gtk_calendar_select_month(GTK_CALENDAR(calendar), g_date_get_month(date) - 1, g_date_get_year(date)); gtk_calendar_select_day(GTK_CALENDAR(calendar), g_date_get_day(date)); gtk_calendar_thaw(GTK_CALENDAR(calendar)); } g_date_free(date); }
int main (int argc, char **argv) { WeatherInfo info; GOptionContext* context; GError* error = NULL; gdouble latitude, longitude; WeatherLocation location; gchar* gtime = NULL; GDate gdate; struct tm tm; gboolean bsun, bmoon; time_t phases[4]; const GOptionEntry entries[] = { { "latitude", 0, 0, G_OPTION_ARG_DOUBLE, &latitude, "observer's latitude in degrees north", NULL }, { "longitude", 0, 0, G_OPTION_ARG_DOUBLE, &longitude, "observer's longitude in degrees east", NULL }, { "time", 0, 0, G_OPTION_ARG_STRING, >ime, "time in seconds from Unix epoch", NULL }, { NULL } }; memset(&location, 0, sizeof(WeatherLocation)); memset(&info, 0, sizeof(WeatherInfo)); context = g_option_context_new ("- test libmateweather sun/moon calculations"); g_option_context_add_main_entries (context, entries, NULL); g_option_context_parse (context, &argc, &argv, &error); if (error) { perror (error->message); return error->code; } else if (latitude < -90. || latitude > 90.) { perror ("invalid latitude: should be [-90 .. 90]"); return -1; } else if (longitude < -180. || longitude > 180.) { perror ("invalid longitude: should be [-180 .. 180]"); return -1; } location.latitude = DEGREES_TO_RADIANS(latitude); location.longitude = DEGREES_TO_RADIANS(longitude); location.latlon_valid = TRUE; info.location = &location; info.valid = TRUE; if (gtime != NULL) { // printf(" gtime=%s\n", gtime); g_date_set_parse(&gdate, gtime); g_date_to_struct_tm(&gdate, &tm); info.update = mktime(&tm); } else { info.update = time(NULL); } bsun = calc_sun_time(&info, info.update); bmoon = calc_moon(&info); printf (" Latitude %7.3f %c Longitude %7.3f %c for %s All times UTC\n", fabs(latitude), (latitude >= 0. ? 'N' : 'S'), fabs(longitude), (longitude >= 0. ? 'E' : 'W'), asctime(gmtime(&info.update))); printf("sunrise: %s", (info.sunriseValid ? ctime(&info.sunrise) : "(invalid)\n")); printf("sunset: %s", (info.sunsetValid ? ctime(&info.sunset) : "(invalid)\n")); if (bmoon) { printf("moonphase: %g\n", info.moonphase); printf("moonlat: %g\n", info.moonlatitude); if (calc_moon_phases(&info, phases)) { printf(" New: %s", asctime(gmtime(&phases[0]))); printf(" 1stQ: %s", asctime(gmtime(&phases[1]))); printf(" Full: %s", asctime(gmtime(&phases[2]))); printf(" 3rdQ: %s", asctime(gmtime(&phases[3]))); } } return 0; }
int main(int argc, char** argv) { GDate* d; guint32 j; GDateMonth m; GDateYear y, prev_y; GDateDay day; gchar buf[101]; gchar* loc; /* Try to get all the leap year cases. */ GDateYear check_years[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 98, 99, 100, 101, 102, 103, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 1598, 1599, 1600, 1601, 1602, 1650, 1651, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1961, 1962, 1963, 1964, 1965, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 3000, 3001, 3002, 3998, 3999, 4000, 4001, 4002, 4003 }; guint n_check_years = sizeof(check_years)/sizeof(GDateYear); guint i; gboolean discontinuity; g_print("checking GDate..."); TEST("sizeof(GDate) is not more than 8 bytes on this platform", sizeof(GDate) < 9); d = g_date_new(); TEST("Empty constructor produces invalid date", !g_date_valid(d)); g_date_free(d); d = g_date_new_dmy(1,1,1); TEST("January 1, Year 1 created and valid", g_date_valid(d)); j = g_date_get_julian(d); TEST("January 1, Year 1 is Julian date 1", j == 1); TEST("Returned month is January", g_date_get_month(d) == G_DATE_JANUARY); TEST("Returned day is 1", g_date_get_day(d) == 1); TEST("Returned year is 1", g_date_get_year(d) == 1); TEST("Bad month is invalid", !g_date_valid_month(G_DATE_BAD_MONTH)); TEST("Month 13 is invalid", !g_date_valid_month(13)); TEST("Bad day is invalid", !g_date_valid_day(G_DATE_BAD_DAY)); TEST("Day 32 is invalid", !g_date_valid_day(32)); TEST("Bad year is invalid", !g_date_valid_year(G_DATE_BAD_YEAR)); TEST("Bad julian is invalid", !g_date_valid_julian(G_DATE_BAD_JULIAN)); TEST("Bad weekday is invalid", !g_date_valid_weekday(G_DATE_BAD_WEEKDAY)); TEST("Year 2000 is a leap year", g_date_is_leap_year(2000)); TEST("Year 1999 is not a leap year", !g_date_is_leap_year(1999)); TEST("Year 1996 is a leap year", g_date_is_leap_year(1996)); TEST("Year 1600 is a leap year", g_date_is_leap_year(1600)); TEST("Year 2100 is not a leap year", !g_date_is_leap_year(2100)); TEST("Year 1800 is not a leap year", !g_date_is_leap_year(1800)); g_date_free(d); loc = setlocale(LC_ALL,""); if (loc) g_print("\nLocale set to %s\n", loc); else g_print("\nLocale unchanged\n"); d = g_date_new(); g_date_set_time(d, time(NULL)); TEST("Today is valid", g_date_valid(d)); g_date_strftime(buf,100,"Today is a %A, %x\n", d); g_print("%s", buf); g_date_set_time(d, 1); TEST("Beginning of Unix epoch is valid", g_date_valid(d)); g_date_strftime(buf,100,"1 second into the Unix epoch it was a %A, in the month of %B, %x\n", d); g_print("%s", buf); g_date_set_julian(d, 1); TEST("GDate's \"Julian\" epoch's first day is valid", g_date_valid(d)); g_date_strftime(buf,100,"Our \"Julian\" epoch begins on a %A, in the month of %B, %x\n", d); g_print("%s", buf); g_date_set_dmy(d, 10, 1, 2000); g_date_strftime(buf,100,"%x", d); g_date_set_parse(d, buf); /* Note: this test will hopefully work, but no promises. */ TEST("Successfully parsed a %x-formatted string", g_date_valid(d) && g_date_get_month(d) == 1 && g_date_get_day(d) == 10 && g_date_get_year(d) == 2000); if (failed) g_date_debug_print(d); g_date_free(d); j = G_DATE_BAD_JULIAN; i = 0; discontinuity = TRUE; y = check_years[0]; prev_y = G_DATE_BAD_YEAR; while (i < n_check_years) { guint32 first_day_of_year = G_DATE_BAD_JULIAN; guint16 days_in_year = g_date_is_leap_year(y) ? 366 : 365; guint sunday_week_of_year = 0; guint sunday_weeks_in_year = g_date_get_sunday_weeks_in_year(y); guint monday_week_of_year = 0; guint monday_weeks_in_year = g_date_get_monday_weeks_in_year(y); guint iso8601_week_of_year = 0; if (discontinuity) g_print(" (Break in sequence of requested years to check)\n"); g_print("Checking year %u", y); TEST("Year is valid", g_date_valid_year(y)); TEST("Number of Sunday weeks in year is 52 or 53", sunday_weeks_in_year == 52 || sunday_weeks_in_year == 53); TEST("Number of Monday weeks in year is 52 or 53", monday_weeks_in_year == 52 || monday_weeks_in_year == 53); m = 1; while (m < 13) { guint8 dim = g_date_get_days_in_month(m,y); GDate days[31]; /* This is the fast way, no allocation */ TEST("Sensible number of days in month", (dim > 0 && dim < 32)); TEST("Month between 1 and 12 is valid", g_date_valid_month(m)); day = 1; g_date_clear(days, 31); while (day <= dim) { guint i; GDate tmp; TEST("DMY triplet is valid", g_date_valid_dmy(day,m,y)); /* Create GDate with triplet */ d = &days[day-1]; TEST("Cleared day is invalid", !g_date_valid(d)); g_date_set_dmy(d,day,m,y); TEST("Set day is valid", g_date_valid(d)); if (m == G_DATE_JANUARY && day == 1) { first_day_of_year = g_date_get_julian(d); } g_assert(first_day_of_year != G_DATE_BAD_JULIAN); TEST("Date with DMY triplet is valid", g_date_valid(d)); TEST("Month accessor works", g_date_get_month(d) == m); TEST("Year accessor works", g_date_get_year(d) == y); TEST("Day of month accessor works", g_date_get_day(d) == day); TEST("Day of year is consistent with Julian dates", ((g_date_get_julian(d) + 1 - first_day_of_year) == (g_date_get_day_of_year(d)))); if (failed) { g_print("first day: %u this day: %u day of year: %u\n", first_day_of_year, g_date_get_julian(d), g_date_get_day_of_year(d)); } if (m == G_DATE_DECEMBER && day == 31) { TEST("Last day of year equals number of days in year", g_date_get_day_of_year(d) == days_in_year); if (failed) { g_print("last day: %u days in year: %u\n", g_date_get_day_of_year(d), days_in_year); } } TEST("Day of year is not more than number of days in the year", g_date_get_day_of_year(d) <= days_in_year); TEST("Monday week of year is not more than number of weeks in the year", g_date_get_monday_week_of_year(d) <= monday_weeks_in_year); if (failed) { g_print("Weeks in year: %u\n", monday_weeks_in_year); g_date_debug_print(d); } TEST("Monday week of year is >= than last week of year", g_date_get_monday_week_of_year(d) >= monday_week_of_year); if (g_date_get_weekday(d) == G_DATE_MONDAY) { TEST("Monday week of year on Monday 1 more than previous day's week of year", (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 1); if ((m == G_DATE_JANUARY && day <= 4) || (m == G_DATE_DECEMBER && day >= 29)) { TEST("ISO 8601 week of year on Monday Dec 29 - Jan 4 is 1", (g_date_get_iso8601_week_of_year(d) == 1)); } else { TEST("ISO 8601 week of year on Monday 1 more than previous day's week of year", (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 1); } } else { TEST("Monday week of year on non-Monday 0 more than previous day's week of year", (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 0); if (!(day == 1 && m == G_DATE_JANUARY)) { TEST("ISO 8601 week of year on non-Monday 0 more than previous day's week of year (", (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 0); } } monday_week_of_year = g_date_get_monday_week_of_year(d); iso8601_week_of_year = g_date_get_iso8601_week_of_year(d); TEST("Sunday week of year is not more than number of weeks in the year", g_date_get_sunday_week_of_year(d) <= sunday_weeks_in_year); if (failed) { g_date_debug_print(d); } TEST("Sunday week of year is >= than last week of year", g_date_get_sunday_week_of_year(d) >= sunday_week_of_year); if (g_date_get_weekday(d) == G_DATE_SUNDAY) { TEST("Sunday week of year on Sunday 1 more than previous day's week of year", (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 1); } else { TEST("Sunday week of year on non-Sunday 0 more than previous day's week of year", (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 0); } sunday_week_of_year = g_date_get_sunday_week_of_year(d); TEST("Date is equal to itself", g_date_compare(d,d) == 0); /*************** Increments ***********/ i = 1; while (i < 402) /* Need to get 400 year increments in */ { /***** Days ******/ tmp = *d; g_date_add_days(d, i); TEST("Adding days gives a value greater than previous", g_date_compare(d, &tmp) > 0); g_date_subtract_days(d, i); TEST("Forward days then backward days returns us to current day", g_date_get_day(d) == day); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } TEST("Forward days then backward days returns us to current month", g_date_get_month(d) == m); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } TEST("Forward days then backward days returns us to current year", g_date_get_year(d) == y); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } /******* Months ********/ tmp = *d; g_date_add_months(d, i); TEST("Adding months gives a larger value", g_date_compare(d, &tmp) > 0); g_date_subtract_months(d, i); TEST("Forward months then backward months returns us to current month", g_date_get_month(d) == m); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } TEST("Forward months then backward months returns us to current year", g_date_get_year(d) == y); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } if (day < 29) { /* Day should be unchanged */ TEST("Forward months then backward months returns us to current day", g_date_get_day(d) == day); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } } else { /* reset the day for later tests */ g_date_set_day(d, day); } /******* Years ********/ tmp = *d; g_date_add_years(d, i); TEST("Adding years gives a larger value", g_date_compare(d,&tmp) > 0); g_date_subtract_years(d, i); TEST("Forward years then backward years returns us to current month", g_date_get_month(d) == m); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } TEST("Forward years then backward years returns us to current year", g_date_get_year(d) == y); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } if (m != 2 && day != 29) { TEST("Forward years then backward years returns us to current day", g_date_get_day(d) == day); if (failed) { g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); g_date_debug_print(d); } } else { g_date_set_day(d, day); /* reset */ } i += 10; } /***** increment test relative to our local Julian count */ if (!discontinuity) { /* We can only run sequence tests between sequential years */ TEST("Julians are sequential with increment 1", j+1 == g_date_get_julian(d)); if (failed) { g_print("Out of sequence, prev: %u expected: %u got: %u\n", j, j+1, g_date_get_julian(d)); } g_date_add_days(d,1); TEST("Next day has julian 1 higher", g_date_get_julian(d) == j + 2); g_date_subtract_days(d, 1); if (j != G_DATE_BAD_JULIAN) { g_date_subtract_days(d, 1); TEST("Previous day has julian 1 lower", g_date_get_julian(d) == j); g_date_add_days(d, 1); /* back to original */ } } discontinuity = FALSE; /* goes away now */ fflush(stdout); fflush(stderr); j = g_date_get_julian(d); /* inc current julian */ ++day; } ++m; } g_print(" done\n"); ++i; prev_y = y; y = check_years[i]; if (prev_y == G_DATE_BAD_YEAR || (prev_y + 1) != y) discontinuity = TRUE; } g_print("\n%u tests passed, %u failed\n",passed, notpassed); return 0; }
/** * Parse XML transaction node and fill a ImportTransaction with results. * * \param transaction_node XML transaction node to parse. */ void recuperation_donnees_gnucash_transaction ( xmlNodePtr transaction_node ) { struct ImportTransaction * transaction; struct ImportAccount * account = NULL; struct gnucash_split * split; gchar * date_string, *space, *tiers; GDate * date; xmlNodePtr splits, split_node, date_node; GSList * split_list = NULL; GsbReal total = { 0 , 0 }; /* Transaction amount, category, account, etc.. */ splits = get_child ( transaction_node, "splits" ); split_node = splits -> children; while ( split_node ) { struct ImportAccount * split_account = NULL; struct gnucash_category * categ = NULL; gint p_r = OPERATION_NORMALE; GsbReal amount; /** * Gnucash transactions are in fact "splits", much like grisbi's * splits of transactions. We need to parse all splits and * see whether they are transfers to real accounts or transfers * to category accounts. In that case, we only create one * transactions. The other is discarded as grisbi is not a * double part financial engine. */ if ( node_strcmp ( split_node, "split" ) ) { gchar * account_name = NULL, * categ_name = NULL; split_account = find_imported_account_by_uid ( child_content ( split_node, "account" ) ); categ = find_imported_categ_by_uid ( child_content ( split_node, "account" ) ); amount = gnucash_value ( child_content(split_node, "value") ); if ( categ ) categ_name = categ -> name; if ( split_account ) { /* All of this stuff is here since we are dealing with the account split, not the category one */ account_name = split_account -> nom_de_compte; total = gsb_real_add ( total, amount ); if ( strcmp(child_content(split_node, "reconciled-state"), "n") ) p_r = OPERATION_RAPPROCHEE; } split = find_split ( split_list, amount, split_account, categ ); if ( split ) { update_split ( split, amount, account_name, categ_name ); } else { split = new_split ( amount, account_name, categ_name ); split_list = g_slist_append ( split_list, split ); split -> notes = child_content(split_node, "memo"); } if ( p_r != OPERATION_NORMALE ) split -> p_r = p_r; } split_node = split_node -> next; } if ( ! split_list ) return; /* Transaction date */ date_node = get_child ( transaction_node, "date-posted" ); date_string = child_content (date_node, "date"); space = strchr ( date_string, ' ' ); if ( space ) *space = 0; date = g_date_new (); g_date_set_parse ( date, date_string ); if ( !g_date_valid ( date )) fprintf ( stderr, "grisbi: Can't parse date %s\n", date_string ); /* Tiers */ tiers = child_content ( transaction_node, "description" ); /* Create transaction */ split = split_list -> data; transaction = new_transaction_from_split ( split, tiers, date ); transaction -> operation_ventilee = 0; transaction -> ope_de_ventilation = 0; account = find_imported_account_by_name ( split -> account ); if ( account ) account -> operations_importees = g_slist_append ( account -> operations_importees, transaction ); /** Splits of transactions are handled the same way, we process them if we find more than one split in transaction node. */ if ( g_slist_length ( split_list ) > 1 ) { transaction -> operation_ventilee = 1; transaction -> montant = total; while ( split_list ) { split = split_list -> data; account = NULL; transaction = new_transaction_from_split ( split, tiers, date ); transaction -> ope_de_ventilation = 1; account = find_imported_account_by_name ( split -> account ); if ( account ) account -> operations_importees = g_slist_append ( account -> operations_importees, transaction ); split_list = split_list -> next; } } }
static guint fill_contact_info_grid (TpawUserInfo *self) { TpConnection *connection; TpContact *contact; GList *specs, *l; guint n_rows = 0; GList *info; const char **field_names = tpaw_contact_info_get_field_names (NULL); guint i; g_assert (self->priv->details_to_set == NULL); connection = tp_account_get_connection (self->priv->account); contact = tp_connection_get_self_contact (connection); specs = tp_connection_dup_contact_info_supported_fields (connection); info = tp_contact_dup_contact_info (contact); /* Look at the fields set in our vCard */ for (l = info; l != NULL; l = l->next) { TpContactInfoField *field = l->data; /* For some reason it can happen that the vCard contains fields the CM * claims to be not supported. This is a workaround for gabble bug * https://bugs.freedesktop.org/show_bug.cgi?id=64319. But we shouldn't * crash on buggy CM anyway. */ if (get_spec_from_list (specs, field->field_name) == NULL) { DEBUG ("Buggy CM: self's vCard contains %s field but it is not in " "Connection' supported fields", field->field_name); continue; } /* make a copy for the details_to_set list */ field = tp_contact_info_field_copy (field); DEBUG ("Field %s is in our vCard", field->field_name); self->priv->details_to_set = g_list_prepend (self->priv->details_to_set, field); } /* Add fields which are supported but not in the vCard */ for (i = 0; field_names[i] != NULL; i++) { TpContactInfoFieldSpec *spec; TpContactInfoField *field; /* Check if the field was in the vCard */ if (field_name_in_field_list (self->priv->details_to_set, field_names[i])) continue; /* Check if the CM supports the field */ spec = get_spec_from_list (specs, field_names[i]); if (spec == NULL) continue; /* add an empty field so user can set a value */ field = tp_contact_info_field_new (spec->name, spec->parameters, NULL); self->priv->details_to_set = g_list_prepend (self->priv->details_to_set, field); } /* Add widgets for supported fields */ self->priv->details_to_set = g_list_sort (self->priv->details_to_set, (GCompareFunc) tpaw_contact_info_field_spec_cmp); for (l = self->priv->details_to_set; l != NULL; l= g_list_next (l)) { TpContactInfoField *field = l->data; GtkWidget *label, *w; TpContactInfoFieldSpec *spec; gboolean has_field; char *title; has_field = tpaw_contact_info_lookup_field (field->field_name, NULL, NULL); if (!has_field) { /* We don't display this field so we can't change it. * But we put it in the details_to_set list so it won't be erased * when calling SetContactInfo (bgo #630427) */ DEBUG ("Unhandled ContactInfo field spec: %s", field->field_name); continue; } spec = get_spec_from_list (specs, field->field_name); /* We shouldn't have added the field to details_to_set if it's not * supported by the CM */ g_assert (spec != NULL); if (spec->flags & TP_CONTACT_INFO_FIELD_FLAG_OVERWRITTEN_BY_NICKNAME) { DEBUG ("Ignoring field '%s' due it to having the " "Overwritten_By_Nickname flag", field->field_name); continue; } /* Add Title */ title = tpaw_contact_info_field_label (field->field_name, field->parameters, (spec->flags & TP_CONTACT_INFO_FIELD_FLAG_PARAMETERS_EXACT)); label = gtk_label_new (title); g_free (title); /* TODO: if TP_CONTACT_INFO_FIELD_FLAG_PARAMETERS_EXACT is not set we * should allow user to tag the vCard fields (bgo#672034) */ /* Add Value */ if (!tp_strdiff (field->field_name, "bday")) { w = tpaw_calendar_button_new (); if (field->field_value[0]) { GDate date; g_date_set_parse (&date, field->field_value[0]); if (g_date_valid (&date)) { tpaw_calendar_button_set_date (TPAW_CALENDAR_BUTTON (w), &date); } } g_signal_connect (w, "date-changed", G_CALLBACK (bday_changed_cb), self); } else { w = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (w), field->field_value[0] ? field->field_value[0] : ""); g_signal_connect (w, "changed", G_CALLBACK (contact_info_changed_cb), self); } add_row (GTK_GRID (self), label, w, TRUE); g_object_set_data ((GObject *) w, DATA_FIELD, field); n_rows++; } tp_contact_info_spec_list_free (specs); tp_contact_info_list_free (info); return n_rows; }