nsresult calIcalComponent::SetIntProperty(icalproperty_kind kind, int32_t i) { icalvalue *val = icalvalue_new_integer(i); if (!val) return NS_ERROR_OUT_OF_MEMORY; return SetPropertyValue(kind, val); }
/* * Construct an iCalendar property value from a JSON object. */ static icalvalue *json_object_to_icalvalue(json_t *jvalue, icalvalue_kind kind) { icalvalue *value = NULL; int len, i; switch (kind) { case ICAL_BOOLEAN_VALUE: if (json_is_boolean(jvalue)) value = icalvalue_new_integer(json_is_true(jvalue)); else syslog(LOG_WARNING, "jCal boolean object expected"); break; case ICAL_FLOAT_VALUE: if (json_is_real(jvalue)) value = icalvalue_new_float((float) json_real_value(jvalue)); else syslog(LOG_WARNING, "jCal double object expected"); break; case ICAL_GEO_VALUE: /* MUST be an array of 2 doubles */ if (json_is_array(jvalue) && (len = json_array_size(jvalue)) != 2) { for (i = 0; i < len && json_is_real(json_array_get(jvalue, i)); i++); if (i == len) { struct icalgeotype geo; geo.lat = json_real_value(json_array_get(jvalue, 0)); geo.lon = json_real_value(json_array_get(jvalue, 1)); value = icalvalue_new_geo(geo); } } if (!value) syslog(LOG_WARNING, "jCal array object of 2 doubles expected"); break; case ICAL_INTEGER_VALUE: if (json_is_integer(jvalue)) value = icalvalue_new_integer((int) json_integer_value(jvalue)); else if (json_is_string(jvalue)) value = icalvalue_new_integer(atoi(json_string_value(jvalue))); else syslog(LOG_WARNING, "jCal integer object expected"); break; case ICAL_RECUR_VALUE: if (json_is_object(jvalue)) { struct buf rrule = BUF_INITIALIZER; struct icalrecurrencetype rt; const char *key, *sep = ""; json_t *val; /* create an iCal RRULE string from jCal 'recur' object */ json_object_foreach(jvalue, key, val) { char *mykey = xstrdup(key); buf_printf(&rrule, "%s%s=", sep, ucase(mykey)); buf_appendjson(&rrule, val); sep = ";"; free(mykey); } /* parse our iCal RRULE string */ rt = icalrecurrencetype_from_string(buf_cstring(&rrule)); buf_free(&rrule); if (rt.freq != ICAL_NO_RECURRENCE) value = icalvalue_new_recur(rt); } else