/*
* Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Colin Leroy <colin@colino.net> and
+ * Copyright (C) 1999-2015 Colin Leroy <colin@colino.net> and
* the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H
#include "mainwindow.h"
#include "statusbar.h"
#include "msgcache.h"
+#include "password.h"
#include "timing.h"
#include "messageview.h"
GSList *vcal_get_events_list(FolderItem *item)
{
- DIR *dp;
- struct dirent *d;
+ GDir *dp;
+ const gchar *d;
GSList *events = NULL;
+ GError *error = NULL;
if (item != item->folder->inbox) {
GSList *subs = vcal_folder_get_webcal_events_for_folder(item);
return events;
}
- dp = opendir(vcal_manager_get_event_path());
+ dp = g_dir_open(vcal_manager_get_event_path(), 0, &error);
if (!dp) {
- FILE_OP_ERROR(vcal_manager_get_event_path(), "opendir");
+ debug_print("couldn't open dir '%s': %s (%d)\n",
+ vcal_manager_get_event_path(), error->message, error->code);
+ g_error_free(error);
return 0;
}
- while ((d = readdir(dp)) != NULL) {
+ while ((d = g_dir_read_name(dp)) != NULL) {
VCalEvent *event = NULL;
- if (d->d_name[0] == '.' || strstr(d->d_name, ".bak")
- || !strcmp(d->d_name, "internal.ics")
- || !strcmp(d->d_name, "internal.ifb")
- || !strcmp(d->d_name, "multisync"))
+ if (d[0] == '.' || strstr(d, ".bak")
+ || !strcmp(d, "internal.ics")
+ || !strcmp(d, "internal.ifb")
+ || !strcmp(d, "multisync"))
continue;
- event = vcal_manager_load_event(d->d_name);
+ event = vcal_manager_load_event(d);
if (!event)
continue;
if (event->rec_occurence) {
vcal_manager_free_event(event);
- claws_unlink(d->d_name);
+ claws_unlink(d);
continue;
}
struct icaldurationtype ical_dur;
int i = 0;
- debug_print("dumping recurring events from main event %s\n", d->d_name);
+ debug_print("dumping recurring events from main event %s\n", d);
recur = icalrecurrencetype_from_string(event->recur);
dtstart = icaltime_from_string(event->dtstart);
vcal_manager_free_event(event);
}
}
- closedir(dp);
+ g_dir_close(dp);
return g_slist_reverse(events);
}
if (_item == folder->inbox)
vcal_remove_event(folder, msginfo);
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
return 0;
}
static gboolean vcal_scan_required(Folder *folder, FolderItem *item)
{
- struct stat s;
+ GStatBuf s;
VCalFolderItem *vitem = (VCalFolderItem *)item;
g_return_val_if_fail(item != NULL, FALSE);
static void vcal_set_mtime(Folder *folder, FolderItem *item)
{
- struct stat s;
+ GStatBuf s;
gchar *path = folder_item_get_path(item);
if (folder->inbox != item)
}
item->mtime = s.st_mtime;
- debug_print("VCAL: forced mtime of %s to %ld\n", item->name?item->name:"(null)", item->mtime);
+ debug_print("VCAL: forced mtime of %s to %lld\n",
+ item->name?item->name:"(null)", (long long)item->mtime);
g_free(path);
}
{
FolderItem *item = folder?folder->inbox:NULL;
gboolean need_scan = folder?vcal_scan_required(folder, item):TRUE;
+ gchar *export_pass = NULL;
+ gchar *export_freebusy_pass = NULL;
if (vcal_folder_lock_count) /* blocked */
return;
vcal_folder_lock_count++;
+
+ export_pass = password_decrypt(vcalprefs.export_pass, NULL);
+ export_freebusy_pass = password_decrypt(vcalprefs.export_freebusy_pass, NULL);
+
if (vcal_meeting_export_calendar(vcalprefs.export_path,
vcalprefs.export_user,
- vcalprefs.export_pass,
+ export_pass,
TRUE)) {
debug_print("exporting calendar\n");
if (vcalprefs.export_enable &&
execute_command_line(
vcalprefs.export_command, TRUE);
}
+ if (export_pass != NULL) {
+ memset(export_pass, 0, strlen(export_pass));
+ }
+ g_free(export_pass);
if (vcal_meeting_export_freebusy(vcalprefs.export_freebusy_path,
vcalprefs.export_freebusy_user,
- vcalprefs.export_freebusy_pass)) {
+ export_freebusy_pass)) {
debug_print("exporting freebusy\n");
if (vcalprefs.export_freebusy_enable &&
vcalprefs.export_freebusy_command &&
execute_command_line(
vcalprefs.export_freebusy_command, TRUE);
}
+ if (export_freebusy_pass != NULL) {
+ memset(export_freebusy_pass, 0, strlen(export_freebusy_pass));
+ }
+ g_free(export_freebusy_pass);
vcal_folder_lock_count--;
if (!need_scan && folder) {
vcal_set_mtime(folder, folder->inbox);
#endif
curl_easy_setopt(curl_ctx, CURLOPT_USERAGENT,
"Claws Mail vCalendar plugin "
- "(http://www.claws-mail.org/plugins.php)");
+ "(" PLUGINS_URI ")");
curl_easy_setopt(curl_ctx, CURLOPT_INFILESIZE, filesize);
res = curl_easy_perform(curl_ctx);
g_free(userpwd);
curl_easy_getinfo(curl_ctx, CURLINFO_RESPONSE_CODE, &response_code);
if (response_code < 200 || response_code >= 300) {
- g_warning("Can't export calendar, got code %ld\n", response_code);
+ g_warning("Can't export calendar, got code %ld", response_code);
res = FALSE;
}
curl_easy_cleanup(curl_ctx);
icalcomponent *cal = NULL;
if (root == NULL) {
- g_warning("can't get root folder\n");
+ g_warning("can't get root folder");
g_free(feed);
if (error)
g_free(error);
if (!folderview->selected) return;
- item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ item = folderview_get_selected_item(folderview);
g_return_if_fail(item != NULL);
g_return_if_fail(item->path != NULL);
g_return_if_fail(item->folder != NULL);
{
FolderView *folderview = (FolderView *)data;
gint action = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item = NULL, *oitem = NULL;
if (!folderview->selected) return;
if (setting_sensitivity) return;
- oitem = gtk_cmctree_node_get_row_data(ctree, folderview->opened);
- item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ oitem = folderview_get_opened_item(folderview);
+ item = folderview_get_selected_item(folderview);
if (!item)
return;
return email;
}
+static void adjust_for_local_time_zone(icalproperty *eventtime, icalproperty *tzoffsetto, int dtstart)
+{
+ int tzoffset;
+ int loctzoffset;
+ time_t loctime, gmttime, evttime;
+ struct icaltimetype icaltime;
+
+ /* calculate local UTC offset */
+ loctime = time(NULL);
+ loctime = mktime(localtime(&loctime));
+ gmttime = mktime(gmtime(&loctime));
+ loctzoffset = loctime - gmttime;
+
+ if (eventtime && tzoffsetto) {
+ tzoffset = icalproperty_get_tzoffsetto(tzoffsetto);
+ if (dtstart) {
+ evttime = icaltime_as_timet(icalproperty_get_dtstart(eventtime));
+ }
+ else {
+ evttime = icaltime_as_timet(icalproperty_get_dtend(eventtime));
+ }
+
+ /* convert to UTC */
+ evttime -= tzoffset;
+ /* and adjust for local time zone */
+ evttime += loctzoffset;
+ icaltime = icaltime_from_timet(evttime, 0);
+
+ if (dtstart) {
+ icalproperty_set_dtstart(eventtime, icaltime);
+ }
+ else {
+ icalproperty_set_dtend(eventtime, icaltime);
+ }
+ }
+}
+
#define GET_PROP(comp,prop,kind) { \
prop = NULL; \
if (!(prop = icalcomponent_get_first_property(comp, kind))) { \
gchar *int_ical = g_strdup(ical);
icalcomponent *comp = icalcomponent_new_from_string(int_ical);
icalcomponent *inner = NULL;
+ icalcomponent *tzcomp = NULL;
icalproperty *prop = NULL;
GSList *list = NULL, *cur = NULL;
gchar *uid = NULL;
TO_UTF8(summary);
icalproperty_free(prop);
}
+ tzcomp = icalcomponent_get_first_component(comp, ICAL_VTIMEZONE_COMPONENT);
+ if (tzcomp) {
+ icalproperty *evtstart = NULL;
+ icalproperty *evtend = NULL;
+ icalproperty *tzoffsetto = NULL;
+ icalcomponent *tzstd = NULL;
+
+ tzstd = icalcomponent_get_first_component(tzcomp, ICAL_XSTANDARD_COMPONENT);
+ tzoffsetto = icalcomponent_get_first_property(tzstd, ICAL_TZOFFSETTO_PROPERTY);
+
+ GET_PROP(comp, evtstart, ICAL_DTSTART_PROPERTY);
+ adjust_for_local_time_zone(evtstart, tzoffsetto, TRUE);
+
+ GET_PROP(comp, evtend, ICAL_DTEND_PROPERTY);
+ adjust_for_local_time_zone(evtend, tzoffsetto, FALSE);
+
+ if (tzoffsetto)
+ icalproperty_free(tzoffsetto);
+ if (evtstart)
+ icalproperty_free(evtstart);
+ if (evtend)
+ icalproperty_free(evtend);
+ if (tzstd)
+ icalcomponent_free(tzstd);
+ }
GET_PROP(comp, prop, ICAL_DTSTART_PROPERTY);
if (prop) {
dtstart = g_strdup(icaltime_as_ical_string(icalproperty_get_dtstart(prop)));
info = folder_item_get_msginfo_by_msgid(folder->inbox, id);
if (info != NULL) {
- procmsg_msginfo_free(info);
+ procmsg_msginfo_free(&info);
return TRUE;
}
return FALSE;
if (info != NULL) {
debug_print("removing event %s\n", id);
vcal_remove_event(folder, info);
- procmsg_msginfo_free(info);
+ procmsg_msginfo_free(&info);
folder_item_scan(folder->inbox);
return TRUE;
}