/** * get parameters from the icalendar property and store them in the internal * struct if the parameter describes a hidden or inline attachment. */ static void add_e_attachment_parameters(icalproperty *prop, I_common *i_common, gboolean inln) { gboolean binary = FALSE; gchar* mime_type = NULL; gchar* label = NULL; /* iterate over all parameters of the attachment property */ int i, pc = icalproperty_count_parameters(prop); icalparameter *para; for (i = 0; i < pc; i++) { icalparameter_kind kind; icalparameter_value xvalue; para = i == 0 ? icalproperty_get_first_parameter(prop, ICAL_ANY_PARAMETER) : icalproperty_get_next_parameter(prop, ICAL_ANY_PARAMETER); kind = icalparameter_isa(para); xvalue = icalparameter_get_value(para); if (kind == ICAL_VALUE_PARAMETER && xvalue == ICAL_VALUE_BINARY) binary = TRUE; /* not a link attachment */ else if (kind == ICAL_FMTTYPE_PARAMETER) /* found mime type */ mime_type = (gchar*) icalparameter_get_xvalue(para); else if (xvalue == ICAL_VALUE_X) { /* found attachment name */ const char* name = icalparameter_get_xname(para); const char* value = icalparameter_get_xvalue(para); if (name && strcmp(name, ICONTACT_KOLAB_STORE_ATTACHMENT_NAME) == 0) label = (gchar*) value; } } if (binary) { /* if not a linked attachment add data to struct */ Kolab_conv_mail_part *mpart = g_new0(Kolab_conv_mail_part, 1); gchar* pname = NULL; if (label != NULL) { if (inln) i_common->inline_attachment_names = g_list_append( i_common->inline_attachment_names, strdup(label)); mpart->name = strdup(label); } if (mime_type != NULL) mpart->mime_type = strdup(mime_type); /* add data and length */ pname = (gchar*) icalproperty_get_value_as_string(prop); if (pname) { gsize outlen; mpart->data = (gchar*) g_base64_decode (pname, &outlen); mpart->length = outlen; /* add created mail part to the attachment list */ i_common->kolab_attachment_store = g_list_append(i_common->kolab_attachment_store, mpart); } } }
void Todo::convertIcalToString(std::string & refString, icalproperty * ptrProperty) { refString = std::string(icalproperty_get_value_as_string(ptrProperty)); // TODO check if libical has a function to remove escaped characters while (true) { std::string::size_type pos = refString.find("\\n"); if (pos == std::string::npos) break; refString.replace(pos, 2, "\n"); } while (true) { std::string::size_type pos = refString.find("\\t"); if (pos == std::string::npos) break; refString.replace(pos, 2, "\t"); } while (true) { std::string::size_type pos = refString.find("\\"); if (pos == std::string::npos) break; refString.replace(pos, 1, ""); } }
NS_IMETHODIMP calIcalProperty::GetValue(nsACString &str) { icalvalue *value = icalproperty_get_value(mProperty); icalvalue_kind valuekind = icalvalue_isa(value); const char *icalstr; if (valuekind == ICAL_TEXT_VALUE) { icalstr = icalvalue_get_text(value); } else if (valuekind == ICAL_X_VALUE) { icalstr = icalvalue_get_x(value); } else if (valuekind == ICAL_ATTACH_VALUE) { icalattach *attach = icalvalue_get_attach(value); if (icalattach_get_is_url(attach)) { icalstr = icalattach_get_url(attach); } else { icalstr = (const char *)icalattach_get_data(attach); } } else { icalstr = icalproperty_get_value_as_string(mProperty); } if (!icalstr) { if (icalerrno == ICAL_BADARG_ERROR) { str.Truncate(); // Set string to null, because we don't have a value // (which is something different then an empty value) str.SetIsVoid(true); return NS_OK; } #ifdef DEBUG fprintf(stderr, "Error getting string value: %d (%s)\n", icalerrno, icalerror_strerror(icalerrno)); #endif return NS_ERROR_FAILURE; } str.Assign(icalstr); return NS_OK; }
/** Get X-* property value from icalcomponent object. * * @param comp iCal component. * @param key Property name (i.e. X-EEE-WHATEVER). * * @return Property value or NULL. */ static const char *icomp_x_prop_get(icalcomponent *comp, const char *key) { icalproperty *iter; g_return_val_if_fail(comp != NULL, NULL); g_return_val_if_fail(key != NULL, NULL); for (iter = icalcomponent_get_first_property(comp, ICAL_X_PROPERTY); iter; iter = icalcomponent_get_next_property(comp, ICAL_X_PROPERTY)) { const char *str = icalproperty_get_x_name(iter); if (str && !g_strcmp0(str, key)) { return icalproperty_get_value_as_string(iter); } } return NULL; }
NS_IMETHODIMP calIcalProperty::GetValueAsIcalString(nsACString &str) { const char *icalstr = icalproperty_get_value_as_string(mProperty); if (!icalstr) { if (icalerrno == ICAL_BADARG_ERROR) { str.Truncate(); // Set string to null, because we don't have a value // (which is something different then an empty value) str.SetIsVoid(true); return NS_OK; } #ifdef DEBUG fprintf(stderr, "Error getting string value: %d (%s)\n", icalerrno, icalerror_strerror(icalerrno)); #endif return NS_ERROR_FAILURE; } str.Assign(icalstr); return NS_OK; }
/* Add all ZONEs and LINKs in the given directory to the hash table */ void do_zonedir(const char *dir, struct hash_table *tzentries, struct zoneinfo *info) { DIR *dirp; struct dirent *dirent; signals_poll(); if (verbose) printf("Rebuilding %s\n", dir); dirp = opendir(dir); if (!dirp) { fprintf(stderr, "can't open zoneinfo directory %s\n", dir); } while ((dirent = readdir(dirp))) { char path[2048], *tzid; int plen; struct stat sbuf; struct zoneinfo *zi; if (*dirent->d_name == '.') continue; plen = snprintf(path, sizeof(path), "%s/%s", dir, dirent->d_name); lstat(path, &sbuf); if (S_ISDIR(sbuf.st_mode)) { /* Path is a directory (region) */ do_zonedir(path, tzentries, info); } else if (S_ISLNK(sbuf.st_mode)) { /* Path is a symlink (alias) */ char link[1024], *alias; ssize_t llen; /* Isolate tzid in path */ if ((llen = readlink(path, link, sizeof(link))) < 0) continue; link[llen-4] = '\0'; /* Trim ".ics" */ for (tzid = link; !strncmp(tzid, "../", 3); tzid += 3); /* Isolate alias in path */ path[plen-4] = '\0'; /* Trim ".ics" */ alias = path + strlen(config_dir) + strlen("zoneinfo") + 2; if (verbose) printf("\tLINK: %s -> %s\n", alias, tzid); /* Create hash entry for alias */ if (!(zi = hash_lookup(alias, tzentries))) { zi = xzmalloc(sizeof(struct zoneinfo)); hash_insert(alias, zi, tzentries); } zi->type = ZI_LINK; appendstrlist(&zi->data, tzid); /* Create/update hash entry for tzid */ if (!(zi = hash_lookup(tzid, tzentries))) { zi = xzmalloc(sizeof(struct zoneinfo)); hash_insert(tzid, zi, tzentries); } zi->type = ZI_ZONE; appendstrlist(&zi->data, alias); } else if (S_ISREG(sbuf.st_mode)) { /* Path is a regular file (zone) */ int fd; const char *base = NULL; size_t len = 0; icalcomponent *ical, *comp; icalproperty *prop; /* Parse the iCalendar file for important properties */ if ((fd = open(path, O_RDONLY)) == -1) continue; map_refresh(fd, 1, &base, &len, MAP_UNKNOWN_LEN, path, NULL); close(fd); ical = icalparser_parse_string(base); map_free(&base, &len); if (!ical) continue; /* skip non-iCalendar files */ comp = icalcomponent_get_first_component(ical, ICAL_VTIMEZONE_COMPONENT); prop = icalcomponent_get_first_property(comp, ICAL_TZID_PROPERTY); tzid = (char *) icalproperty_get_value_as_string(prop); if (verbose) printf("\tZONE: %s\n", tzid); /* Create/update hash entry for tzid */ if (!(zi = hash_lookup(tzid, tzentries))) { zi = xzmalloc(sizeof(struct zoneinfo)); hash_insert(tzid, zi, tzentries); } zi->type = ZI_ZONE; prop = icalcomponent_get_first_property(comp, ICAL_LASTMODIFIED_PROPERTY); zi->dtstamp = icaltime_as_timet(icalproperty_get_lastmodified(prop)); icalcomponent_free(ical); /* Check overall lastmod */ if (zi->dtstamp > info->dtstamp) info->dtstamp = zi->dtstamp; } else { fprintf(stderr, "unknown path type %s\n", path); } } closedir(dirp); }
gint ics_parse_file (struct ics_file *file_entry, gchar *name, gchar *filename, gboolean desc_flag, gboolean count_only, GUI *appGUI) { FILE *ics_stream; icalparser *ics_parser; icalcomponent *ics_component; icalcomponent *h, *l; icalproperty *p, *r; struct icaltimetype tt; struct ics_entry *item; gint n = 0; ics_parser = icalparser_new (); g_return_val_if_fail (ics_parser != NULL, n); ics_stream = fopen (filename, "r"); if (ics_stream == NULL) { icalparser_free (ics_parser); return n; } icalparser_set_gen_data (ics_parser, ics_stream); ics_component = icalparser_parse (ics_parser, ics_read_stream); if (ics_component == NULL) { fclose (ics_stream); icalparser_free (ics_parser); return n; } /* FIXME */ if (icalcomponent_get_first_component (ics_component, ICAL_VEVENT_COMPONENT) != NULL) { for (h = icalcomponent_get_first_component (ics_component, ICAL_VEVENT_COMPONENT); h; h = icalcomponent_get_next_component (ics_component, ICAL_VEVENT_COMPONENT)) { p = icalcomponent_get_first_property (h, ICAL_DTSTART_PROPERTY); tt = icaltime_from_string (icalproperty_get_value_as_string (p)); p = icalcomponent_get_first_property (h, ICAL_SUMMARY_PROPERTY); if (p != NULL && count_only == FALSE) { r = icalcomponent_get_first_property (h, ICAL_DESCRIPTION_PROPERTY); item = g_malloc (sizeof (struct ics_entry)); if (item != NULL) { item->date.day = tt.day; item->date.month = tt.month; item->date.year = tt.year; item->summary = g_strdup (icalproperty_get_value_as_string (p)); if (r != NULL) { item->description = g_strdup (icalproperty_get_value_as_string (r)); } else { item->description = NULL; } file_entry->entries_list = g_slist_append (file_entry->entries_list, item); } } n++; } } else if (icalcomponent_get_first_component (ics_component, ICAL_VCALENDAR_COMPONENT) != NULL) { for (l = icalcomponent_get_first_component (ics_component, ICAL_VCALENDAR_COMPONENT); l; l = icalcomponent_get_next_component (ics_component, ICAL_VCALENDAR_COMPONENT)) { h = icalcomponent_get_first_component (l, ICAL_VEVENT_COMPONENT); p = icalcomponent_get_first_property (h, ICAL_DTSTART_PROPERTY); tt = icaltime_from_string (icalproperty_get_value_as_string (p)); p = icalcomponent_get_first_property (h, ICAL_SUMMARY_PROPERTY); if (p != NULL && count_only == FALSE) { r = icalcomponent_get_first_property (h, ICAL_DESCRIPTION_PROPERTY); item = g_malloc (sizeof (struct ics_entry)); if (item != NULL) { item->date.day = tt.day; item->date.month = tt.month; item->date.year = tt.year; item->summary = g_strdup (icalproperty_get_value_as_string(p)); if (r != NULL) { item->description = g_strdup (icalproperty_get_value_as_string (r)); } else { item->description = NULL; } file_entry->entries_list = g_slist_append (file_entry->entries_list, item); } } n++; } } icalcomponent_free (ics_component); fclose (ics_stream); icalparser_free (ics_parser); return n; }