-rw-r--r-- | Makefile | 16 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmcal.c | 85 | ||||
-rw-r--r-- | kdepim-desktop.pro | 6 | ||||
-rw-r--r-- | kopi-desktop.pro | 6 | ||||
-rw-r--r-- | korganizer/calendarview.cpp | 2 | ||||
-rw-r--r-- | korganizer/korganizer.pro | 1 | ||||
-rw-r--r-- | libkcal/incidence.cpp | 5 | ||||
-rw-r--r-- | libkcal/incidence.h | 2 | ||||
-rw-r--r-- | libkcal/phoneformat.cpp | 1464 | ||||
-rw-r--r-- | libkcal/phoneformat.h | 14 | ||||
-rw-r--r-- | libkcal/vcalformat.cpp | 5 | ||||
-rw-r--r-- | libkcal/vcalformat.h | 5 |
12 files changed, 259 insertions, 1352 deletions
@@ -1,23 +1,24 @@ ############################################################################# # Makefile for building: kopi-desktop -# Generated by qmake (1.07a) (Qt 3.3.1) on: Sun Aug 29 13:39:55 2004 +# Generated by qmake (1.07a) (Qt 3.3.1) on: Sun Aug 29 18:50:00 2004 # Project: kopi-desktop.pro # Template: subdirs # Command: $(QMAKE) -o Makefile kopi-desktop.pro ############################################################################# MAKEFILE = Makefile QMAKE = qmake DEL_FILE = rm -f CHK_DIR_EXISTS= test -d MKDIR = mkdir -p SUBTARGETS = \ sub-gammu-emb-common \ + sub-gammu-emb-gammu \ sub-libical \ sub-libkcal \ sub-microkde \ sub-libkdepim \ sub-kabc \ sub-korganizer \ sub-kaddressbook \ sub-kabc-plugins-file \ @@ -28,16 +29,22 @@ first: all all: Makefile $(SUBTARGETS) gammu/emb/common/$(MAKEFILE): @$(CHK_DIR_EXISTS) "gammu/emb/common" || $(MKDIR) "gammu/emb/common" cd gammu/emb/common && $(QMAKE) common.pro -o $(MAKEFILE) sub-gammu-emb-common: gammu/emb/common/$(MAKEFILE) FORCE cd gammu/emb/common && $(MAKE) -f $(MAKEFILE) +gammu/emb/gammu/$(MAKEFILE): + @$(CHK_DIR_EXISTS) "gammu/emb/gammu" || $(MKDIR) "gammu/emb/gammu" + cd gammu/emb/gammu && $(QMAKE) gammu.pro -o $(MAKEFILE) +sub-gammu-emb-gammu: gammu/emb/gammu/$(MAKEFILE) FORCE + cd gammu/emb/gammu && $(MAKE) -f $(MAKEFILE) + libical/$(MAKEFILE): @$(CHK_DIR_EXISTS) "libical" || $(MKDIR) "libical" cd libical && $(QMAKE) libical.pro -o $(MAKEFILE) sub-libical: libical/$(MAKEFILE) FORCE cd libical && $(MAKE) -f $(MAKEFILE) libkcal/$(MAKEFILE): @$(CHK_DIR_EXISTS) "libkcal" || $(MKDIR) "libkcal" @@ -88,62 +95,67 @@ sub-kabc-plugins-dir: kabc/plugins/dir/$(MAKEFILE) FORCE cd kabc/plugins/dir && $(MAKE) -f $(MAKEFILE) Makefile: kopi-desktop.pro /usr/lib/qt3/mkspecs/default/qmake.conf $(QMAKE) -o Makefile kopi-desktop.pro qmake: qmake_all @$(QMAKE) -o Makefile kopi-desktop.pro all: $(SUBTARGETS) -qmake_all: gammu/emb/common/$(MAKEFILE) libical/$(MAKEFILE) libkcal/$(MAKEFILE) microkde/$(MAKEFILE) libkdepim/$(MAKEFILE) kabc/$(MAKEFILE) korganizer/$(MAKEFILE) kaddressbook/$(MAKEFILE) kabc/plugins/file/$(MAKEFILE) kabc/plugins/dir/$(MAKEFILE) +qmake_all: gammu/emb/common/$(MAKEFILE) gammu/emb/gammu/$(MAKEFILE) libical/$(MAKEFILE) libkcal/$(MAKEFILE) microkde/$(MAKEFILE) libkdepim/$(MAKEFILE) kabc/$(MAKEFILE) korganizer/$(MAKEFILE) kaddressbook/$(MAKEFILE) kabc/plugins/file/$(MAKEFILE) kabc/plugins/dir/$(MAKEFILE) ( [ -d gammu/emb/common ] && cd gammu/emb/common ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true + ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d libical ] && cd libical ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d libkcal ] && cd libkcal ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d microkde ] && cd microkde ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d libkdepim ] && cd libkdepim ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d kabc ] && cd kabc ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d korganizer ] && cd korganizer ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d kaddressbook ] && cd kaddressbook ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true clean uicables mocables uiclean mocclean lexclean yaccclean : qmake_all FORCE ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) $@; ) || true + ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) $@; ) || true ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; $(MAKE) -f $(MAKEFILE) $@; ) || true uninstall_subdirs: qmake_all FORCE ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true + ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true install_subdirs: qmake_all FORCE ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) install; ) || true + ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) install; ) || true ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; $(MAKE) -f $(MAKEFILE) install; ) || true distclean: qmake_all FORCE ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true + ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true diff --git a/gammu/emb/common/service/gsmcal.c b/gammu/emb/common/service/gsmcal.c index 950e35e..598292c 100644 --- a/gammu/emb/common/service/gsmcal.c +++ b/gammu/emb/common/service/gsmcal.c @@ -94,30 +94,30 @@ GSM_Error GSM_EncodeVCALENDAR(char *Buffer, int *Length, GSM_CalendarEntry *note *Length+=sprintf(Buffer+(*Length), "VERSION:1.0%c%c",13,10); } *Length+=sprintf(Buffer+(*Length), "BEGIN:VEVENT%c%c",13,10); if (Version == Nokia_VCalendar) { *Length+=sprintf(Buffer+(*Length), "CATEGORIES:"); switch (note->Type) { case GSM_CAL_REMINDER: - *Length+=sprintf(Buffer+(*Length), "REMINDER%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Reminder%c%c",13,10); break; case GSM_CAL_MEMO: - *Length+=sprintf(Buffer+(*Length), "MISCELLANEOUS%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Miscellaneous%c%c",13,10); break; case GSM_CAL_CALL: - *Length+=sprintf(Buffer+(*Length), "PHONE CALL%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Phone Call%c%c",13,10); break; case GSM_CAL_BIRTHDAY: - *Length+=sprintf(Buffer+(*Length), "SPECIAL OCCASION%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Special Occasion%c%c",13,10); break; case GSM_CAL_MEETING: default: - *Length+=sprintf(Buffer+(*Length), "MEETING%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "MeetingDEF%c%c",13,10); break; } if (note->Type == GSM_CAL_CALL) { buffer[0] = 0; buffer[1] = 0; if (Phone != -1) CopyUnicodeString(buffer,note->Entries[Phone].Text); if (Text != -1) { if (Phone != -1) EncodeUnicode(buffer+UnicodeLength(buffer)*2," ",1); @@ -154,27 +154,27 @@ GSM_Error GSM_EncodeVCALENDAR(char *Buffer, int *Length, GSM_CalendarEntry *note case 14 : *Length+=sprintf(Buffer+(*Length), "RRULE:W2 #0%c%c",13,10); break; case 365 : *Length+=sprintf(Buffer+(*Length), "RRULE:YD1 #0%c%c",13,10); break; } } } else if (Version == Siemens_VCalendar) { *Length+=sprintf(Buffer+(*Length), "CATEGORIES:"); switch (note->Type) { case GSM_CAL_MEETING: - *Length+=sprintf(Buffer+(*Length), "MEETING%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Meeting%c%c",13,10); break; case GSM_CAL_CALL: - *Length+=sprintf(Buffer+(*Length), "PHONE CALL%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Phone Call%c%c",13,10); break; case GSM_CAL_BIRTHDAY: - *Length+=sprintf(Buffer+(*Length), "ANNIVERSARY%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Anniversary%c%c",13,10); break; case GSM_CAL_MEMO: default: - *Length+=sprintf(Buffer+(*Length), "MISCELLANEOUS%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Miscellaneous%c%c",13,10); break; } if (Time == -1) return ERR_UNKNOWN; SaveVCALDateTime(Buffer, Length, ¬e->Entries[Time].Date, "DTSTART"); if (Alarm != -1) { SaveVCALDateTime(Buffer, Length, ¬e->Entries[Alarm].Date, "DALARM"); @@ -200,33 +200,33 @@ GSM_Error GSM_EncodeVCALENDAR(char *Buffer, int *Length, GSM_CalendarEntry *note SaveVCALText(Buffer, Length, buffer, "DESCRIPTION"); } else { SaveVCALText(Buffer, Length, note->Entries[Text].Text, "DESCRIPTION"); } } else if (Version == SonyEricsson_VCalendar) { *Length+=sprintf(Buffer+(*Length), "CATEGORIES:"); switch (note->Type) { case GSM_CAL_MEETING: - *Length+=sprintf(Buffer+(*Length), "MEETING%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Meeting%c%c",13,10); break; case GSM_CAL_REMINDER: - *Length+=sprintf(Buffer+(*Length), "DATE%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Date%c%c",13,10); break; case GSM_CAL_TRAVEL: - *Length+=sprintf(Buffer+(*Length), "TRAVEL%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Travel%c%c",13,10); break; case GSM_CAL_VACATION: - *Length+=sprintf(Buffer+(*Length), "VACATION%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Vacation%c%c",13,10); break; case GSM_CAL_BIRTHDAY: - *Length+=sprintf(Buffer+(*Length), "ANNIVERSARY%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Anninversary%c%c",13,10); break; case GSM_CAL_MEMO: default: - *Length+=sprintf(Buffer+(*Length), "MISCELLANEOUS%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "Miscellaneous%c%c",13,10); break; } if (Time == -1) return ERR_UNKNOWN; SaveVCALDateTime(Buffer, Length, ¬e->Entries[Time].Date, "DTSTART"); if (EndTime != -1) { SaveVCALDateTime(Buffer, Length, ¬e->Entries[EndTime].Date, "DTEND"); @@ -238,16 +238,17 @@ GSM_Error GSM_EncodeVCALENDAR(char *Buffer, int *Length, GSM_CalendarEntry *note SaveVCALText(Buffer, Length, note->Entries[Text].Text, "SUMMARY"); if (Location != -1) { SaveVCALText(Buffer, Length, note->Entries[Location].Text, "LOCATION"); } } + *Length+=sprintf(Buffer+(*Length), "X-PILOTID:%d%c%c",note->Location,13,10); *Length+=sprintf(Buffer+(*Length), "END:VEVENT%c%c",13,10); if (header) *Length+=sprintf(Buffer+(*Length), "END:VCALENDAR%c%c",13,10); return ERR_NONE; } void GSM_ToDoFindDefaultTextTimeAlarmCompleted(GSM_ToDoEntry *entry, int *Text, int *Alarm, int *Completed, int *EndTime, int *Phone) { @@ -295,25 +296,25 @@ GSM_Error GSM_EncodeVTODO(char *Buffer, int *Length, GSM_ToDoEntry *note, bool h *Length+=sprintf(Buffer+(*Length), "BEGIN:VTODO%c%c",13,10); if (Version == Nokia_VToDo) { if (Text == -1) return ERR_UNKNOWN; SaveVCALText(Buffer, Length, note->Entries[Text].Text, "SUMMARY"); if (Completed == -1) { - *Length+=sprintf(Buffer+(*Length), "STATUS:NEEDS ACTION%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "PERCENT-COMPLETE:0%c%c",13,10); } else { - *Length+=sprintf(Buffer+(*Length), "STATUS:COMPLETED%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "PERCENT-COMPLETE:100%c%c",13,10); } switch (note->Priority) { - case GSM_Priority_Low : *Length+=sprintf(Buffer+(*Length), "PRIORITY:1%c%c",13,10); break; - case GSM_Priority_Medium: *Length+=sprintf(Buffer+(*Length), "PRIORITY:2%c%c",13,10); break; - case GSM_Priority_High : *Length+=sprintf(Buffer+(*Length), "PRIORITY:3%c%c",13,10); break; + case GSM_Priority_Low : *Length+=sprintf(Buffer+(*Length), "PRIORITY:5%c%c",13,10); break; + case GSM_Priority_Medium: *Length+=sprintf(Buffer+(*Length), "PRIORITY:3%c%c",13,10); break; + case GSM_Priority_High : *Length+=sprintf(Buffer+(*Length), "PRIORITY:1%c%c",13,10); break; } if (EndTime != -1) { SaveVCALDateTime(Buffer, Length, ¬e->Entries[EndTime].Date, "DUE"); } if (Alarm != -1) { if (note->Entries[Alarm].EntryType == CAL_SILENT_ALARM_DATETIME) { @@ -322,32 +323,33 @@ GSM_Error GSM_EncodeVTODO(char *Buffer, int *Length, GSM_ToDoEntry *note, bool h SaveVCALDateTime(Buffer, Length, ¬e->Entries[Alarm].Date, "AALARM"); } } } else if (Version == SonyEricsson_VToDo) { if (Text == -1) return ERR_UNKNOWN; SaveVCALText(Buffer, Length, note->Entries[Text].Text, "SUMMARY"); if (Completed == -1) { - *Length+=sprintf(Buffer+(*Length), "STATUS:NEEDS ACTION%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "PERCENT-COMPLETE:0%c%c",13,10); } else { - *Length+=sprintf(Buffer+(*Length), "STATUS:COMPLETED%c%c",13,10); + *Length+=sprintf(Buffer+(*Length), "PERCENT-COMPLETE:100%c%c",13,10); } switch (note->Priority) { - case GSM_Priority_Low : *Length+=sprintf(Buffer+(*Length), "PRIORITY:3%c%c",13,10); break; - case GSM_Priority_Medium: *Length+=sprintf(Buffer+(*Length), "PRIORITY:2%c%c",13,10); break; + case GSM_Priority_Low : *Length+=sprintf(Buffer+(*Length), "PRIORITY:5%c%c",13,10); break; + case GSM_Priority_Medium: *Length+=sprintf(Buffer+(*Length), "PRIORITY:3%c%c",13,10); break; case GSM_Priority_High : *Length+=sprintf(Buffer+(*Length), "PRIORITY:1%c%c",13,10); break; } if (Alarm != -1) { SaveVCALDateTime(Buffer, Length, ¬e->Entries[Alarm].Date, "AALARM"); } } + *Length+=sprintf(Buffer+(*Length), "X-PILOTID:%d%c%c",note->Location,13,10); *Length+=sprintf(Buffer+(*Length), "END:VTODO%c%c",13,10); if (header) { *Length+=sprintf(Buffer+(*Length), "END:VCALENDAR%c%c",13,10); } return ERR_NONE; } @@ -364,35 +366,36 @@ GSM_Error GSM_DecodeVCALENDAR_VTODO(unsigned char *Buffer, int *Pos, GSM_Calenda if (strlen(Line) == 0) break; switch (Level) { case 0: if (strstr(Line,"BEGIN:VEVENT")) { Calendar->Type = GSM_CAL_MEMO; Level = 1; } if (strstr(Line,"BEGIN:VTODO")) { - ToDo->Priority = GSM_Priority_Low; + ToDo->Priority = GSM_Priority_Medium; Level = 2; } break; case 1: /* Calendar note */ if (strstr(Line,"END:VEVENT")) { if (Calendar->EntriesNum == 0) return ERR_EMPTY; return ERR_NONE; - } - if (strstr(Line,"CATEGORIES:REMINDER")) Calendar->Type = GSM_CAL_REMINDER; - if (strstr(Line,"CATEGORIES:DATE")) Calendar->Type = GSM_CAL_REMINDER;//SE - if (strstr(Line,"CATEGORIES:TRAVEL")) Calendar->Type = GSM_CAL_TRAVEL; //SE - if (strstr(Line,"CATEGORIES:VACATION")) Calendar->Type = GSM_CAL_VACATION;//SE - if (strstr(Line,"CATEGORIES:MISCELLANEOUS")) Calendar->Type = GSM_CAL_MEMO; - if (strstr(Line,"CATEGORIES:PHONE CALL")) Calendar->Type = GSM_CAL_CALL; - if (strstr(Line,"CATEGORIES:SPECIAL OCCASION")) Calendar->Type = GSM_CAL_BIRTHDAY; - if (strstr(Line,"CATEGORIES:ANNIVERSARY")) Calendar->Type = GSM_CAL_BIRTHDAY; - if (strstr(Line,"CATEGORIES:MEETING")) Calendar->Type = GSM_CAL_MEETING; - if (strstr(Line,"CATEGORIES:APPOINTMENT")) Calendar->Type = GSM_CAL_MEETING; + } + Calendar->Type = GSM_CAL_MEETING; + if (strstr(Line,"CATEGORIES:Reminder")) Calendar->Type = GSM_CAL_REMINDER; + if (strstr(Line,"CATEGORIES:Date")) Calendar->Type = GSM_CAL_REMINDER;//SE + if (strstr(Line,"CATEGORIES:Travel")) Calendar->Type = GSM_CAL_TRAVEL; //SE + if (strstr(Line,"CATEGORIES:Vacation")) Calendar->Type = GSM_CAL_VACATION;//SE + if (strstr(Line,"CATEGORIES:Miscellaneous")) Calendar->Type = GSM_CAL_MEMO; + if (strstr(Line,"CATEGORIES:Phone Call")) Calendar->Type = GSM_CAL_CALL; + if (strstr(Line,"CATEGORIES:Special Occasion")) Calendar->Type = GSM_CAL_BIRTHDAY; + if (strstr(Line,"CATEGORIES:Anniversary")) Calendar->Type = GSM_CAL_BIRTHDAY; + if (strstr(Line,"CATEGORIES:Meeting")) Calendar->Type = GSM_CAL_MEETING; + if (strstr(Line,"CATEGORIES:Appointment")) Calendar->Type = GSM_CAL_MEETING; if (strstr(Line,"RRULE:D1")) { Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_RECURRANCE; Calendar->Entries[Calendar->EntriesNum].Number = 1*24; Calendar->EntriesNum++; } if ((strstr(Line,"RRULE:W1")) || (strstr(Line,"RRULE:D7"))) { Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_RECURRANCE; Calendar->Entries[Calendar->EntriesNum].Number = 7*24; @@ -467,26 +470,26 @@ GSM_Error GSM_DecodeVCALENDAR_VTODO(unsigned char *Buffer, int *Pos, GSM_Calenda if (ReadVCALText(Line, "SUMMARY", Buff)) { ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_TEXT; CopyUnicodeString(ToDo->Entries[ToDo->EntriesNum].Text,Buff); ToDo->EntriesNum++; } if (ReadVCALText(Line, "PRIORITY", Buff)) { if (ToDoVer == SonyEricsson_VToDo) { ToDo->Priority = GSM_Priority_Low; - if (atoi(DecodeUnicodeString(Buff))==2) ToDo->Priority = GSM_Priority_Medium; - if (atoi(DecodeUnicodeString(Buff))==1) ToDo->Priority = GSM_Priority_High; + if (atoi(DecodeUnicodeString(Buff))>3) ToDo->Priority = GSM_Priority_Low; + if (atoi(DecodeUnicodeString(Buff))<3) ToDo->Priority = GSM_Priority_High; dbgprintf("atoi is %i %s\n",atoi(DecodeUnicodeString(Buff)),DecodeUnicodeString(Buff)); } else if (ToDoVer == Nokia_VToDo) { ToDo->Priority = GSM_Priority_Low; - if (atoi(DecodeUnicodeString(Buff))==2) ToDo->Priority = GSM_Priority_Medium; - if (atoi(DecodeUnicodeString(Buff))==3) ToDo->Priority = GSM_Priority_High; + if (atoi(DecodeUnicodeString(Buff))>3) ToDo->Priority = GSM_Priority_Low; + if (atoi(DecodeUnicodeString(Buff))<3) ToDo->Priority = GSM_Priority_High; } } - if (strstr(Line,"STATUS:COMPLETED")) { + if (strstr(Line,"PERCENT-COMPLETE:100")) { ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_COMPLETED; ToDo->Entries[ToDo->EntriesNum].Number = 1; ToDo->EntriesNum++; } break; } } diff --git a/kdepim-desktop.pro b/kdepim-desktop.pro new file mode 100644 index 0000000..7a3a96e --- a/dev/null +++ b/kdepim-desktop.pro @@ -0,0 +1,6 @@ + + +TEMPLATE = subdirs +SUBDIRS = gammu/emb/common gammu/emb/gammu libical libkcal microkde libkdepim kabc korganizer kaddressbook kabc/plugins/file kabc/plugins/dir +#kalarmd + diff --git a/kopi-desktop.pro b/kopi-desktop.pro deleted file mode 100644 index 69c874f..0000000 --- a/kopi-desktop.pro +++ b/dev/null @@ -1,6 +0,0 @@ - - -TEMPLATE = subdirs -SUBDIRS = gammu/emb/common libical libkcal microkde libkdepim kabc korganizer kaddressbook kabc/plugins/file kabc/plugins/dir -#kalarmd - diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index 7444bad..db07713 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -1870,17 +1870,17 @@ void CalendarView::eventDeleted() void CalendarView::changeTodoDisplay(Todo *which, int action) { changeIncidenceDisplay((Incidence *)which, action); mDateNavigator->updateView(); //mDialogManager->updateSearchDialog(); if (which) { mViewManager->currentView()->updateView(); - mTodoList->updateView(); + //mTodoList->updateView(); } } void CalendarView::changeIncidenceDisplay(Incidence *which, int action) { updateUnmanagedViews(); //qDebug(" CalendarView::changeIncidenceDisplay++++++++++++++++++++++++++ %d %d ",which, action ); diff --git a/korganizer/korganizer.pro b/korganizer/korganizer.pro index 9fdcd2f..543db86 100644 --- a/korganizer/korganizer.pro +++ b/korganizer/korganizer.pro @@ -14,17 +14,16 @@ DEFINES += KORG_NODCOP KORG_NOKALARMD KORG_NORESOURCEVIEW KORG_NOSPLITTER #KORG_NOPRINTER KORG_NOKABC DEFINES += KORG_NOLVALTERNATION DEFINES += DESKTOP_VERSION unix : { LIBS += ../bin/libmicrokdepim.so LIBS += ../bin/libmicrokcal.so LIBS += ../bin/libmicrokde.so LIBS += ../bin/libmicrokabc.so -LIBS += ../bin/libmicrogammu.so LIBS += -lbluetooth LIBS += -lsdp LIBS += -lldap OBJECTS_DIR = obj/unix MOC_DIR = moc/unix } win32: { diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp index d9bda64..56c9801 100644 --- a/libkcal/incidence.cpp +++ b/libkcal/incidence.cpp @@ -529,16 +529,21 @@ bool Incidence::isAlarmEnabled() const } return false; } Recurrence *Incidence::recurrence() const { return mRecurrence; } +void Incidence::setRecurrence( Recurrence * r) +{ + delete mRecurrence; + mRecurrence = r; +} void Incidence::setLocation(const QString &location) { if (mReadOnly) return; mLocation = location; updated(); } diff --git a/libkcal/incidence.h b/libkcal/incidence.h index d1972cb..7dc6f10 100644 --- a/libkcal/incidence.h +++ b/libkcal/incidence.h @@ -240,17 +240,17 @@ class Incidence : public IncidenceBase /** return whether any alarm associated with this incidence is enabled */ bool isAlarmEnabled() const; /** Return the recurrence rule associated with this incidence. If there is none, returns an appropriate (non-0) object. */ Recurrence *recurrence() const; - + void setRecurrence(Recurrence * r); /** Forward to Recurrence::doesRecur(). */ ushort doesRecur() const; /** set the event's/todo's location. Do _not_ use it with journal */ void setLocation(const QString &location); /** return the event's/todo's location. Do _not_ use it with journal */ diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp index 1769b37..0bc9125 100644 --- a/libkcal/phoneformat.cpp +++ b/libkcal/phoneformat.cpp @@ -1,12 +1,12 @@ /* This file is part of libkcal. - Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> + Copyright (c) 2004 Lutz Rogowski <rogowski@kde.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -40,477 +40,23 @@ #include "alarm.h" #include "recurrence.h" #include "calendarlocal.h" #include "phoneformat.h" #include "syncdefines.h" using namespace KCal; - class PhoneParser : public QObject { public: - PhoneParser( Calendar *calendar, QString profileName ) : mCalendar( calendar ), mProfileName ( profileName ) { + PhoneParser( ) { ; } - bool readTodo( Calendar *existingCalendar,GSM_ToDoEntry *ToDo, GSM_StateMachine* s) - { - - int id = ToDo->Location; - Todo *todo; - todo = existingCalendar->todo( mProfileName ,QString::number( id ) ); - if (todo ) - todo = (Todo *)todo->clone(); - else - todo = new Todo; - todo->setID( mProfileName,QString::number( id ) ); - todo->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); - int priority; - switch (ToDo->Priority) { - case GSM_Priority_Low : priority = 5; break; - case GSM_Priority_Medium : priority = 3; break; - case GSM_Priority_High : priority = 1; break; - default :priority = 3 ; break; - } - todo->setPriority( priority ); - GSM_Phone_Functions *Phone; - Phone=s->Phone.Functions; - int j; - GSM_DateTime* dtp; - bool alarm = false; - QDateTime alarmDt; - GSM_Category Category; - int error; - for (j=0;j<ToDo->EntriesNum;j++) { - - //qDebug(" for todo %d",ToDo->Location ); - switch (ToDo->Entries[j].EntryType) { - case TODO_END_DATETIME: - dtp = &ToDo->Entries[j].Date ; - todo->setDtDue (fromGSM ( dtp )); - break; - case TODO_COMPLETED: - if ( ToDo->Entries[j].Number == 1 ) { - todo->setCompleted( true ); - } - else { - todo->setCompleted( false ); - } - break; - case TODO_ALARM_DATETIME: - dtp = &ToDo->Entries[j].Date ; - alarm = true; - alarmDt = fromGSM ( dtp ); - break; - case TODO_SILENT_ALARM_DATETIME: - dtp = &ToDo->Entries[j].Date ; - alarm = true; - alarmDt = fromGSM ( dtp ); - break; - case TODO_TEXT: - //qDebug(" text *%s* ", (const char*) DecodeUnicodeConsole(ToDo->Entries[j].Text )); - todo->setSummary( QString::fromUtf8 ( (const char*)DecodeUnicodeConsole(ToDo->Entries[j].Text ))); - break; - case TODO_PRIVATE: - if ( ToDo->Entries[j].Number == 1 ) - todo->setSecrecy( Incidence::SecrecyPrivate ); - else - todo->setSecrecy( Incidence::SecrecyPublic ); - break; - case TODO_CATEGORY: - Category.Location = ToDo->Entries[j].Number; - Category.Type = Category_ToDo; - error=Phone->GetCategory(s, &Category); - if (error == ERR_NONE) { - QStringList cat = todo->categories(); - QString nCat = QString ( (const char*)Category.Name ); - if ( !nCat.isEmpty() ) - if ( !cat.contains( nCat )) { - cat << nCat; - todo->setCategories( cat ); - } - } - break; - case TODO_CONTACTID: -#if 0 - // not supported - entry.Location = ToDo->Entries[j].Number; - entry.MemoryType = MEM_ME; - error=Phone->GetMemory(s, &entry); - if (error == ERR_NONE) { - name = GSM_PhonebookGetEntryName(&entry); - if (name != NULL) { - printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), ToDo->Entries[j].Number); - } else { - printmsg("Contact ID : %d\n",ToDo->Entries[j].Number); - } - } else { - printmsg("Contact : %d\n",ToDo->Entries[j].Number); - } -#endif - break; - case TODO_PHONE: -#if 0 - // not supported - printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(ToDo->Entries[j].Text)); -#endif - break; - } - } - QString alarmString = "na"; - if ( alarm ) { - Alarm *alarm; - if ( todo->alarms().count() > 0 ) - alarm = todo->alarms().first(); - else { - alarm = new Alarm( todo ); - todo->addAlarm( alarm ); - } - alarm->setType( Alarm::Audio ); - alarm->setEnabled( true ); - int alarmOffset = alarmDt.secsTo( todo->dtStart() ); - alarm->setStartOffset( -alarmOffset ); - alarmString = QString::number( alarmOffset ); - } else { - Alarm *alarm; - if ( todo->alarms().count() > 0 ) { - alarm = todo->alarms().first(); - alarm->setType( Alarm::Audio ); - alarm->setStartOffset( -60*15 ); - alarm->setEnabled( false ); - } - } - // csum ***************************************** - uint cSum; - cSum = PhoneFormat::getCsumTodo( todo ); - todo->setCsum( mProfileName, QString::number( cSum )); - todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); - mCalendar->addTodo( todo); - - return true; - } - bool readEvent( Calendar *existingCalendar, GSM_CalendarEntry* Note) - { - - int id = Note->Location; - Event *event; - event = existingCalendar->event( mProfileName ,QString::number( id ) ); - if ( event ) - event = (Event*)event->clone(); - else - event = new Event; - event->setID( mProfileName,QString::number( id ) ); - event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); - - - int i = 0; - bool repeating = false; - int repeat_dayofweek = -1; - int repeat_day = -1; - int repeat_weekofmonth = -1; - int repeat_month = -1; - int repeat_frequency = -1; - int rec_type = -1; - GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0}; - GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0}; - GSM_DateTime* dtp; - bool alarm = false; - QDateTime alarmDt; - repeat_startdate.Day = 0; - repeat_stopdate.Day = 0; - for (i=0;i<Note->EntriesNum;i++) { - - //qDebug(" for ev"); - switch (Note->Entries[i].EntryType) { - case CAL_START_DATETIME: - dtp = &Note->Entries[i].Date ; - if ( dtp->Hour > 24 ) { - event->setFloats( true ); - event->setDtStart( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 ))); - } else { - event->setDtStart (fromGSM ( dtp )); - - } - //Note->Entries[i].Date.Hour = 5; - break; - case CAL_END_DATETIME: - dtp = &Note->Entries[i].Date ; - if ( dtp->Hour > 24 ) { - event->setFloats( true ); - event->setDtEnd( QDateTime (datefromGSM ( dtp ), QTime(0,0,0 ))); - } else { - event->setDtEnd (fromGSM ( dtp )); - } - break; - case CAL_ALARM_DATETIME: - dtp = &Note->Entries[i].Date ; - alarm = true; - alarmDt = fromGSM ( dtp ); - break; - case CAL_SILENT_ALARM_DATETIME: - dtp = &Note->Entries[i].Date ; - alarm = true; - alarmDt = fromGSM ( dtp ); - break; - case CAL_RECURRANCE: - rec_type = Note->Entries[i].Number; - //printmsg("Repeat : %d day%s\n",Note->Entries[i].Number/24,((Note->Entries[i].Number/24)>1) ? "s":"" ); - break; - case CAL_TEXT: - //qDebug(" ev text %s", DecodeUnicodeConsole(Note->Entries[i].Text) ); - event->setSummary( QString::fromUtf8 ( (const char*)DecodeUnicodeConsole( Note->Entries[i].Text ))); - break; - case CAL_LOCATION: - event->setLocation(QString::fromUtf8 ((const char*) DecodeUnicodeConsole(Note->Entries[i].Text) )); - break; - case CAL_PHONE: - //printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text)); - break; - case CAL_PRIVATE: - if ( Note->Entries[i].Number == 1 ) - event->setSecrecy( Incidence::SecrecyPrivate ); - else - event->setSecrecy( Incidence::SecrecyPublic ); - - break; - case CAL_CONTACTID: -#if 0 - entry.Location = Note->Entries[i].Number; - entry.MemoryType = MEM_ME; - error=Phone->GetMemory(&s, &entry); - if (error == ERR_NONE) { - name = GSM_PhonebookGetEntryName(&entry); - if (name != NULL) { - //printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), Note->Entries[i].Number); - } else { - //printmsg("Contact ID : %d\n",Note->Entries[i].Number); - } - } else { - //printmsg("Contact ID : %d\n",Note->Entries[i].Number); - } -#endif - break; - case CAL_REPEAT_DAYOFWEEK: - repeat_dayofweek = Note->Entries[i].Number; - repeating = true; - break; - case CAL_REPEAT_DAY: - repeat_day = Note->Entries[i].Number; - repeating = true; - break; - case CAL_REPEAT_WEEKOFMONTH: - repeat_weekofmonth = Note->Entries[i].Number; - repeating = true; - break; - case CAL_REPEAT_MONTH: - repeat_month = Note->Entries[i].Number; - repeating = true; - break; - case CAL_REPEAT_FREQUENCY: - repeat_frequency = Note->Entries[i].Number; - repeating = true; - break; - case CAL_REPEAT_STARTDATE: - repeat_startdate = Note->Entries[i].Date; - repeating = true; - break; - case CAL_REPEAT_STOPDATE: - repeat_stopdate = Note->Entries[i].Date; - repeating = true; - break; - } - } -#if 0 - event->setDescription( attList[4] ); - bool repeating = false; - int repeat_dayofweek = -1; - int repeat_day = -1; - int repeat_weekofmonth = -1; - int repeat_month = -1; - int repeat_frequency = -1; - GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0}; - GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0}; - -#endif - - QString recurString = "no"; - if ( repeating && repeat_frequency != -1) { - recurString = "y"; - if ( repeat_dayofweek >= 0 ) - recurString += "dow" + QString::number (repeat_dayofweek); - if ( repeat_day >= 0 ) - recurString += "d" + QString::number (repeat_day); - if ( repeat_weekofmonth >= 0 ) - recurString += "w" + QString::number (repeat_weekofmonth); - if ( repeat_month >= 0 ) - recurString += "m" + QString::number ( repeat_month ); - if ( repeat_frequency >= 0 ) - recurString += "f" + QString::number (repeat_frequency ); - - int rtype = 0; - // qDebug("recurs "); - QDate startDate, endDate; - if ( repeat_startdate.Day > 0 ) { - startDate = datefromGSM ( &repeat_startdate ); - event->setDtStart(QDateTime ( startDate, event->dtStart().time())); - } else { - startDate = event->dtStart().date(); - } - int freq = repeat_frequency; - bool hasEndDate = false; - if ( repeat_stopdate.Day > 0 ) { - endDate = datefromGSM ( &repeat_stopdate ); - hasEndDate = true; - } - - uint weekDaysNum = repeat_dayofweek ; - // 1 == monday, 7 == sunday - QBitArray weekDays( 7 ); - int i; - int bb = 1; - for( i = 1; i <= 7; ++i ) { - weekDays.setBit( i - 1, ( bb & weekDaysNum )); - bb = 2 << (i-1); - //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) ); - } - // qDebug("next "); - int pos = 0; - Recurrence *r = event->recurrence(); - /* - 0 daily; - 1 weekly;x - 2 monthpos;x - 3 monthlyday; - 4 rYearlyMont - bool repeating = false; - int repeat_dayofweek = -1; - int repeat_day = -1; - int repeat_weekofmonth = -1; - int repeat_month = -1; - int repeat_frequency = -1; - */ - int dayOfWeek = startDate.dayOfWeek(); - if ( repeat_weekofmonth >= 0 ) { - rtype = 2; // ************************ 2 MonthlyPos - pos = repeat_weekofmonth; - if ( repeat_dayofweek >= 0 ) - dayOfWeek = repeat_dayofweek; - if (repeat_month > 0) { - if ( repeat_month != event->dtStart().date().month() ) { - QDate date (event->dtStart().date().year(),repeat_month,event->dtStart().date().day() ); - event->setDtStart(QDateTime ( date , event->dtStart().time()) ); - } - if ( freq == 1 ) - freq = 12; - } - } else if ( repeat_dayofweek >= 0 ) { - rtype = 1;// ************************ 1 Weekly - } else if ( repeat_day >= 0 ) { - if ( repeat_month > 0) { - rtype = 4; - } else { - rtype = 3; - } - } else { - rtype = 0 ; - } - - if ( rtype == 0 ) { - if ( hasEndDate ) r->setDaily( freq, endDate ); - else r->setDaily( freq, -1 ); - } else if ( rtype == 1 ) { - if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate ); - else r->setWeekly( freq, weekDays, -1 ); - } else if ( rtype == 3 ) { - if ( hasEndDate ) - r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); - else - r->setMonthly( Recurrence::rMonthlyDay, freq, -1 ); - r->addMonthlyDay( startDate.day() ); - } else if ( rtype == 2 ) { - if ( hasEndDate ) - r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); - else - r->setMonthly( Recurrence::rMonthlyPos, freq, -1 ); - QBitArray days( 7 ); - days.fill( false ); - days.setBit( dayOfWeek - 1 ); - r->addMonthlyPos( pos, days ); - } else if ( rtype == 4 ) { - if ( hasEndDate ) - r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); - else - r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); - r->addYearlyNum( startDate.month() ); - } - } else { - event->recurrence()->unsetRecurs(); - } - - QStringList cat = event->categories(); - QString nCat = getCategory( Note ); - - if ( !nCat.isEmpty() ) - if ( !cat.contains( nCat )) { - cat << nCat; - event->setCategories( cat ); - } - - if ( alarm ) { - Alarm *alarm; - if ( event->alarms().count() > 0 ) - alarm = event->alarms().first(); - else { - alarm = new Alarm( event ); - event->addAlarm( alarm ); - } - alarm->setType( Alarm::Audio ); - alarm->setEnabled( true ); - int alarmOffset = alarmDt.secsTo( event->dtStart() ); - alarm->setStartOffset( -alarmOffset ); - } else { - Alarm *alarm; - if ( event->alarms().count() > 0 ) { - alarm = event->alarms().first(); - alarm->setType( Alarm::Audio ); - alarm->setStartOffset( -60*15 ); - alarm->setEnabled( false ); - } - } - // csum ***************************************** - - uint cSum; - cSum = PhoneFormat::getCsumEvent( event ); - event->setCsum( mProfileName, QString::number( cSum )); - event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); - mCalendar->addEvent( event); - - return true; - } - - - QDateTime fromGSM ( GSM_DateTime* dtp, bool useTz = false ) { - QDateTime dt; - int y,m,t,h,min,sec; - y = dtp->Year; - m = dtp->Month; - t = dtp->Day; - h = dtp->Hour; - min = dtp->Minute; - sec = dtp->Second; - dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); - // dtp->Timezone: offset in hours - int offset = KGlobal::locale()->localTimeOffset( dt ); - if ( useTz ) - dt = dt.addSecs ( offset*60); - return dt; - - } - + static QString dtToString( const QDateTime& dti, bool useTZ = false ) { QString datestr; QString timestr; int offset = KGlobal::locale()->localTimeOffset( dti ); QDateTime dt; if (useTZ) dt = dti.addSecs ( -(offset*60)); @@ -523,75 +69,34 @@ public: } if(dt.time().isValid()){ const QTime& time = dt.time(); timestr.sprintf("T%02d%02d%02d", time.hour(), time.minute(), time.second()); } return datestr + timestr; } - QDate datefromGSM ( GSM_DateTime* dtp ) { - return QDate ( dtp->Year, dtp->Month, dtp->Day ); - } - QString getCategory( GSM_CalendarEntry* Note) - { - QString CATEGORY; - switch (Note->Type) { - case GSM_CAL_REMINDER : CATEGORY = QString("Reminder"); break; - case GSM_CAL_CALL : CATEGORY = QString("Call"); break; - //case GSM_CAL_MEETING : CATEGORY = QString("Meeting"); break; - case GSM_CAL_BIRTHDAY : CATEGORY = QString("Birthday"); break; - case GSM_CAL_MEMO : CATEGORY = QString("Memo"); break; - case GSM_CAL_TRAVEL : CATEGORY = QString("Travel"); break; - case GSM_CAL_VACATION : CATEGORY = QString("Vacation"); break; - case GSM_CAL_ALARM : CATEGORY = QString("Alarm"); break; - case GSM_CAL_DAILY_ALARM : CATEGORY = QString("Daily alarm"); break; - case GSM_CAL_T_ATHL : CATEGORY = QString("Training/Athletism"); break; - case GSM_CAL_T_BALL : CATEGORY = QString("Training/Ball Games"); break; - case GSM_CAL_T_CYCL : CATEGORY = QString("Training/Cycling"); break; - case GSM_CAL_T_BUDO : CATEGORY = QString("Training/Budo"); break; - case GSM_CAL_T_DANC : CATEGORY = QString("Training/Dance"); break; - case GSM_CAL_T_EXTR : CATEGORY = QString("Training/Extreme Sports"); break; - case GSM_CAL_T_FOOT : CATEGORY = QString("Training/Football"); break; - case GSM_CAL_T_GOLF : CATEGORY = QString("Training/Golf"); break; - case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break; - case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break; - case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break; - case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break; - case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break; - case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break; - case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break; - case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break; - case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break; - case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break; - case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break; - default : CATEGORY = QString(""); - } - return CATEGORY; - } -protected: -private: - Calendar *mCalendar; - QString mProfileName ; }; + PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model ) { mProfileName = profileName; mDevice = device; mConnection = connection; mModel = model; } PhoneFormat::~PhoneFormat() { } +#if 0 int PhoneFormat::initDevice(GSM_StateMachine *s) { GSM_ReadConfig(NULL, &s->Config[0], 0); s->ConfigNum = 1; GSM_Config *cfg = &s->Config[0]; if ( ! mConnection.isEmpty() ) { cfg->Connection = strdup(mConnection.latin1()); cfg->DefaultConnection = false; @@ -607,16 +112,17 @@ int PhoneFormat::initDevice(GSM_StateMachine *s) if ( ! mModel.isEmpty() ) { strcpy(cfg->Model,mModel.latin1() ); cfg->DefaultModel = false; qDebug("Model set %s ",cfg->Model ); } int error=GSM_InitConnection(s,3); return error; } +#endif ulong PhoneFormat::getCsumTodo( Todo* todo ) { QStringList attList; if ( todo->hasDueDate() ) attList << PhoneParser::dtToString ( todo->dtDue() ); attList << todo->summary(); QString completedString = "no"; if ( todo->isCompleted() ) @@ -766,923 +272,307 @@ ulong PhoneFormat::getCsum( const QStringList & attList) return cSum; } //extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum); #include <stdlib.h> #define DEBUGMODE false bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal) { - GSM_StateMachine s; - qDebug(" load "); - s.opened = false; - s.msg = NULL; - s.ConfigNum = 0; - QLabel status ( i18n("Opening device ..."), 0 ); - int w = status.sizeHint().width()+20 ; - if ( w < 200 ) w = 230; - int h = status.sizeHint().height()+20 ; - int dw = QApplication::desktop()->width(); - int dh = QApplication::desktop()->height(); - status.setCaption(i18n("Reading phone...") ); - status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); - status.show(); - status.raise(); - qApp->processEvents(); - int error=initDevice(&s); - qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); - if ( error != ERR_NONE ) + QString fileName; +#ifdef _WIN32_ + fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs"; +#else + fileName = "/tmp/kdepimtemp.vcs"; +#endif + QString command ="./kammu --backup " + fileName + " -yes"; + int ret = system ( command.latin1() ); + if ( ret != 0 ) return false; - GSM_Phone_Functions *Phone; - GSM_CalendarEntry note; - bool start = true; - Phone=s.Phone.Functions; - bool gshutdown = false; - PhoneParser handler( calendar, mProfileName ); - int ccc = 0; - QString message = i18n(" Reading event # "); - int procCount = 0; - qDebug("Debug: only 10 calender items are downloaded "); - while (!gshutdown && ccc++ < 10) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - qDebug("readEvent %d ", ccc); - error=Phone->GetNextCalendar(&s,¬e,start); - if (error == ERR_EMPTY) break; - start = false; - handler.readEvent( existingCal, ¬e ); - qDebug("Org loc %d ",note.Location); - //note.Location = 0; - error=Phone->SetCalendar(&s,¬e); - qDebug("new loc %d ",note.Location); + VCalFormat vfload; + vfload.setLocalTime ( true ); + if ( ! vfload.load( calendar, fileName ) ) + return false; + QPtrList<Event> er = calendar->rawEvents(); + Event* ev = er.first(); + while ( ev ) { + int id = ev->pilotId(); + Event *event; + event = existingCal->event( mProfileName ,QString::number( id ) ); + if ( event ) { + event = (Event*)event->clone(); + copyEvent( event, ev ); + calendar->deleteEvent( ev ); + calendar->addEvent( event); + } + else + event = ev; + uint cSum; + cSum = PhoneFormat::getCsumEvent( event ); + event->setCsum( mProfileName, QString::number( cSum )); + event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); + event->setID( mProfileName,QString::number( id ) ); + ev = er.next(); + } + { + QPtrList<Todo> tr = calendar->rawTodos(); + Todo* ev = tr.first(); + while ( ev ) { + + QStringList cat = ev->categories(); + if ( cat.contains( "MeetingDEF" )) { + ev->setCategories( QStringList() ); + } + int id = ev->pilotId(); + Todo *event; + event = existingCal->todo( mProfileName ,QString::number( id ) ); + if ( event ) { + event = (Todo*)event->clone(); + copyTodo( event, ev ); + calendar->deleteTodo( ev ); + calendar->addTodo( event); + } + else + event = ev; + uint cSum; + cSum = PhoneFormat::getCsumTodo( event ); + event->setCsum( mProfileName, QString::number( cSum )); + event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); + event->setID( mProfileName,QString::number( id ) ); + ev = tr.next(); + } } - - start = true; - GSM_ToDoEntry ToDo; - ccc = 0; - message = i18n(" Reading todo # "); - procCount = 0; - while (!gshutdown && ccc++ < 10) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - error = Phone->GetNextToDo(&s, &ToDo, start); - if (error == ERR_EMPTY) break; - start = false; - qDebug("ReadTodo %d ", ccc); - handler.readTodo( existingCal, &ToDo, &s); - - } - - error=GSM_TerminateConnection(&s); - return true; } -#include <qcstring.h> -void PhoneFormat::event2GSM( Calendar *cal,Event* ev, GSM_CalendarEntry*Note ) +void PhoneFormat::copyEvent( Event* to, Event* from ) { - QString eText = vfconverter.eventToString( ev, cal ); - int pos = 0; - GSM_ToDoEntry dummy; - qDebug( "Convert event"); - QByteArray ba; - QDataStream s ( ba, IO_WriteOnly ); - s << eText.utf8(); - GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, Note , &dummy, Nokia_VCalendar, Nokia_VToDo ); - qDebug( "Convert event done"); - Note->Location = 0; - QString loc = ev->getID(mProfileName); - if ( !loc.isEmpty() ){ - Note->Location = loc.toInt(); + if ( from->dtStart().isValid() ) + to->setDtStart( from->dtStart() ); + if ( from->dtEnd().isValid() ) + to->setDtEnd( from->dtEnd() ); + if ( !from->location().isEmpty() ) + to->setLocation( from->location() ); + if ( !from->description().isEmpty() ) + to->setDescription( from->description() ); + if ( !from->summary().isEmpty() ) + to->setSummary( from->summary() ); + + QPtrListIterator<Alarm> it( from->alarms() ); + to->clearAlarms(); + const Alarm *a; + while( (a = it.current()) ) { + Alarm *b = new Alarm( *a ); + b->setParent( to ); + to->addAlarm( b ); + ++it; + } + QStringList cat = to->categories(); + QStringList catFrom = from->categories(); + QString nCat; + int iii; + for ( iii = 0; iii < catFrom.count();++iii ) { + nCat = catFrom[iii]; + if ( !nCat.isEmpty() ) + if ( !cat.contains( nCat )) { + cat << nCat; + } } + to->setCategories( cat ); + Recurrence * r = new Recurrence( *from->recurrence(),to); + to->setRecurrence( r ) ; + } -void PhoneFormat::todo2GSM( Calendar *cal, Todo* todo, GSM_ToDoEntry *gsmTodo ) +void PhoneFormat::copyTodo( Todo* to, Todo* from ) { - qDebug( "Convert todo1"); - QString tText = vfconverter.todoToString( todo, cal ); - int pos = 0; - GSM_CalendarEntry dummy; - QByteArray ba; - QDataStream s ( ba, IO_WriteOnly ); - s << tText.utf8(); - GSM_DecodeVCALENDAR_VTODO( (unsigned char*) ba.data(), &pos, &dummy, gsmTodo, Nokia_VCalendar, Nokia_VToDo ); - qDebug( "Convert todo done "); - gsmTodo->Location = 0; - QString loc = todo->getID(mProfileName); - if ( !loc.isEmpty() ){ - gsmTodo->Location = loc.toInt(); + if ( from->dtStart().isValid() ) + to->setDtStart( from->dtStart() ); + if ( from->dtDue().isValid() ) + to->setDtDue( from->dtDue() ); + if ( !from->location().isEmpty() ) + to->setLocation( from->location() ); + if ( !from->description().isEmpty() ) + to->setDescription( from->description() ); + if ( !from->summary().isEmpty() ) + to->setSummary( from->summary() ); + + QPtrListIterator<Alarm> it( from->alarms() ); + to->clearAlarms(); + const Alarm *a; + while( (a = it.current()) ) { + Alarm *b = new Alarm( *a ); + b->setParent( to ); + to->addAlarm( b ); + ++it; + } + QStringList cat = to->categories(); + QStringList catFrom = from->categories(); + QString nCat; + int iii; + for ( iii = 0; iii < catFrom.count();++iii ) { + nCat = catFrom[iii]; + if ( !nCat.isEmpty() ) + if ( !cat.contains( nCat )) { + cat << nCat; + } } - + to->setCategories( cat ); + if ( from->isCompleted() ) { + to->setCompleted( true ); + if( from->completed().isValid() ) + to->setCompleted( from->completed() ); + } else { + // set percentcomplete only, if to->isCompleted() + if ( to->isCompleted() ) + to->setPercentComplete(from->percentComplete()); + } + to->setPriority(from->priority()); + } +#include <qcstring.h> + void PhoneFormat::afterSave( Incidence* inc) { uint csum; inc->removeID( mProfileName ); if ( inc->type() == "Event") csum = PhoneFormat::getCsumEvent( (Event*) inc ); else csum = PhoneFormat::getCsumTodo( (Todo*) inc ); inc->setCsum( mProfileName, QString::number( csum )); inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); } bool PhoneFormat::save( Calendar *calendar) { - - GSM_StateMachine s; - qDebug(" save "); - s.opened = false; - s.msg = NULL; - s.ConfigNum = 0; QLabel status ( i18n(" Opening device ..."), 0 ); int w = status.sizeHint().width()+20 ; if ( w < 200 ) w = 230; int h = status.sizeHint().height()+20 ; int dw = QApplication::desktop()->width(); int dh = QApplication::desktop()->height(); status.setCaption(i18n("Writing to phone...") ); status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); status.show(); status.raise(); qApp->processEvents(); - - int error=initDevice(&s); - qDebug("GSM Init %d (no error is %d)", error, ERR_NONE); - if ( error != ERR_NONE ) - return false; - GSM_Phone_Functions *Phone; - GSM_CalendarEntry Note; - bool start = true; - Phone=s.Phone.Functions; - bool gshutdown = false; - QPtrList<Event> er = calendar->rawEvents(); - Event* ev = er.first(); - QString message = i18n(" Deleting event # "); - int procCount = 0; - int diffProc = 0; - bool setPossible = true; + QString message; #ifdef _WIN32_ QString fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs"; #else QString fileName = "/tmp/kdepimtemp.vcs"; #endif - //algo 1 delete event - while ( ev ) { - if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one - - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - qDebug("del event1 %d ", procCount); - //event2GSM( calendar, ev, &Note ); - if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete - QString loc = ev->getID(mProfileName); - if ( !loc.isEmpty() ){ - Note.Location = loc.toInt(); - } else { - qDebug("error: loc is empty "); - } - error = Phone->DeleteCalendar(&s, &Note); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - qDebug(" e error delete1 planB %d ", error); - break; - } - } - else if ( ev->getID(mProfileName).isEmpty() ) { // add new - // we have to do this later after deleting - - } - else { // change existing + // 1 remove events which should be deleted + QPtrList<Event> er = calendar->rawEvents(); + Event* ev = er.first(); + while ( ev ) { + if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { + calendar->deleteEvent( ev ); + } else { - QString loc = ev->getID(mProfileName); - if ( !loc.isEmpty() ){ - Note.Location = loc.toInt(); - } else { - qDebug("error3: loc is empty "); - } - error = Phone->DeleteCalendar(&s, &Note); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - qDebug(" e error delete2 planB %d ", error); - break; - } - ev->removeID( mProfileName ); - } - } + } ev = er.next(); } - //algo 1 delete todo - GSM_ToDoEntry ToDoEntry; + // 2 remove todos which should be deleted QPtrList<Todo> tl = calendar->rawTodos(); Todo* to = tl.first(); - message = i18n(" Deleting todo # "); - procCount = 0; while ( to ) { - if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { - qDebug("todo3 %d ", procCount); - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - qDebug("todo5 %d ", procCount); - // todo2GSM( calendar, to, &ToDoEntry ); - QString loc = to->getID(mProfileName); - if ( !loc.isEmpty() ){ - ToDoEntry.Location = loc.toInt(); - } else { - qDebug("error2: loc is empty "); - } - if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete - error=Phone->DeleteToDo(&s,&ToDoEntry); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - qDebug("delete planB %d ", error); - } - } - else if ( to->getID(mProfileName).isEmpty() ) { // add new - ; - } - else { // change existing - error=Phone->DeleteToDo(&s,&ToDoEntry); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - qDebug("set planB %d ", error); - } - to->removeID( mProfileName ); - } + if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { + calendar->deleteTodo( to ); } to = tl.next(); } - //algo 2 add event - ev = er.first(); - QString filec; - message = i18n(" Preparing event # "); - procCount = 0; - while ( ev ) { - if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { - if ( ev->getID(mProfileName).isEmpty() ) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - filec += vfconverter.eventToString( ev, calendar )+ "\n"; - afterSave ( ev ); - - } - } - ev = er.next(); - } - //algo 2 add todo - to = tl.first(); - procCount = 0; - message = i18n(" Preparing todo # "); - while ( to ) { - qDebug("todo2 %d ", procCount); - if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { - qDebug("todo4 %d ", procCount); - if ( to->getID(mProfileName).isEmpty() ) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - filec += vfconverter.todoToString( to, calendar )+ "\n"; - afterSave ( to ); - } - } - to = tl.next(); - } - if ( filec.isEmpty() ) { - qDebug("Nothing to write back.Finished. "); - error=GSM_TerminateConnection(&s); - return true; - } - //algo 3 saving file - message = i18n(" Saving temp file ... "); - status.setText ( message ); - qApp->processEvents(); - QFile file( fileName ); - if (!file.open( IO_WriteOnly ) ) { - qDebug("error open file "); - error=GSM_TerminateConnection(&s); + // 3 save file + VCalFormat vfsave; + vfsave.setLocalTime ( true ); + if ( ! vfsave.save( calendar, fileName ) ) return false; - } - QTextStream ts( &file ); - ts.setCodec( QTextCodec::codecForName("utf8") ); - ts << filec ; - file.close(); - - - message = i18n(" Parsing temp file ... "); - status.setText ( message ); - qApp->processEvents(); - GSM_Backup Backup; - error=GSM_ReadBackupFile( (char*) fileName.latin1() ,&Backup); - qDebug("Read file result %d ",error ); - //algo 4 writing event - int max, i; - procCount = 0; - message = i18n(" Writing event # "); - if (Backup.Calendar[0] != NULL) { - max = 0; - while (Backup.Calendar[max]!=NULL) max++; - - GSM_DateTime* dtp; - - for (i=0;i<max;i++) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - Note = *Backup.Calendar[i]; - -#if 0 - int j; - for (j=0;j<Note.EntriesNum;j++) { - //qDebug(" for ev"); - switch (Note.Entries[j].EntryType) { - case CAL_START_DATETIME: - //Note->Entries[i].Date.Hour = 5; - dtp = &Note.Entries[j].Date; - qDebug("start event %d %d %d - %d %d %d", dtp->Year, dtp->Month, dtp->Day, dtp->Hour, dtp->Minute, dtp->Second ); - break; - case CAL_END_DATETIME: - dtp = &Note.Entries[j].Date; - qDebug("end event %d %d %d - %d %d %d", dtp->Year, dtp->Month, dtp->Day, dtp->Hour, dtp->Minute, dtp->Second ); - break; - } - } - int type = Note.Type; - qDebug(" event type %d - %d %d - %d %d %d",type, GSM_CAL_CALL , GSM_CAL_MEETING ,GSM_CAL_BIRTHDAY, GSM_CAL_MEMO ,GSM_CAL_ALARM ); -#endif - - Note.Type = GSM_CAL_MEETING; - // pending: fix in gammu GSM_ReadBackupFile the type settings - int loc = Note.Location; - Note.Location = 0; - error=Phone->AddCalendar(&s,&Note); - qDebug("add event %d %d %d", error, Note.Location, loc ); - } - } - //algo 4 writing todo - procCount = 0; - message = i18n(" Writing todo # "); - if (Backup.ToDo[0] != NULL) { - max = 0; - while (Backup.ToDo[max]!=NULL) max++; - for (i=0;i<max;i++) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - ToDoEntry = *Backup.ToDo[i]; - error = Phone->AddToDo(&s,&ToDoEntry); - qDebug("add todo %d ", error); - } - } - //algo 5 reread + // 4 call kammu + QString command ="./kammu --restore " + fileName ; + int ret = system ( command.latin1() ); + if ( ret != 0 ) + return false; + // 5 reread data message = i18n(" Rereading all data ... "); status.setText ( message ); qApp->processEvents(); - error=GSM_TerminateConnection(&s); CalendarLocal* calendarTemp = new CalendarLocal(); calendarTemp->setTimeZoneId( calendar->timeZoneId()); if ( ! load( calendarTemp,calendar) ){ qDebug("error reloading calendar "); delete calendarTemp; return false; } + // 6 compare data - - //algo 6 compare event +//algo 6 compare event + er = calendar->rawEvents(); ev = er.first(); message = i18n(" Comparing event # "); QPtrList<Event> er1 = calendarTemp->rawEvents(); Event* ev1; - procCount = 0; + int procCount = 0; while ( ev ) { - if ( ev->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID) { qDebug("event new ID "); status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); QString cSum = ev->getCsum(mProfileName); ev1 = er1.first(); while ( ev1 ) { if ( ev1->getCsum( mProfileName ) == cSum ) { er1.remove( ev1 ); + afterSave( ev ); ev->setID(mProfileName, ev1->getID(mProfileName) ); break; } ev1 = er1.next(); } if ( ! ev1 ) { ev->removeID(mProfileName); qDebug("ERROR: No event found on phone for %s ", ev->summary().latin1()); - qDebug("Probably writing back of events not supported "); } - } + ev = er.next(); } //algo 6 compare todo to = tl.first(); procCount = 0; QPtrList<Todo> tl1 = calendarTemp->rawTodos(); Todo* to1 ; message = i18n(" Comparing todo # "); while ( to ) { qDebug("todo2 %d ", procCount); - if ( to->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID) { status.setText ( message + QString::number ( ++procCount ) ); qApp->processEvents(); QString cSum = to->getCsum(mProfileName); Todo* to1 = tl1.first(); while ( to1 ) { if ( to1->getCsum( mProfileName ) == cSum ) { tl1.remove( to1 ); + afterSave( to ); to->setID(mProfileName, to1->getID(mProfileName) ); break; } to1 = tl1.next(); } if ( ! to1 ) { to->removeID(mProfileName); qDebug("ERROR: No todo found on phone for %s ", to->summary().latin1()); - qDebug("Probably writing back of todos not supported "); } - } + to = tl.next(); } delete calendarTemp; return true; - // ******************************************************************* - // ******************************************************************* - // ******************************************************************* -#if 0 - while ( ev && ! planB) { - if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { // event was changed during sync or is a new one - - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - qDebug("event1 %d ", procCount); - event2GSM( calendar, ev, &Note ); - if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete - error = Phone->DeleteCalendar(&s, &Note); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - planB = true; - qDebug(" e delete1 planB %d ", error); - break; - } - } - else if ( ev->getID(mProfileName).isEmpty() ) { // add new - // we have to do this later after deleting - - } - else { // change existing - if ( setPossible ) { - error = Phone->SetCalendar(&s, &Note); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - setPossible = false; - ++diffProc; - qDebug("Set cal not supported %d ", error); - break; - } - } - if ( ! setPossible) { - ++diffProc; - error = Phone->DeleteCalendar(&s, &Note); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - planB = true; - qDebug(" e delete2 planB %d ", error); - break; - } - ev->removeID( mProfileName ); - } - qDebug("Change Calendar. Location %d status: %d",Note.Location, error ); - } - } - ev = er.next(); - } - ev = er.first(); - // pending get empty slots - int loc = 0; - procCount -= diffProc; - while ( ev && ! planB) { - if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && ev->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { - qDebug("event2 %d ", procCount); - if ( ev->getID(mProfileName).isEmpty() ) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - //int newID ;//= pending - //ev->setID(mProfileName, QString::number( newID )); - event2GSM( calendar, ev, &Note ); - ++loc; - Note.Location = loc; - error = Phone->AddCalendar(&s, &Note); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - planB = true; - qDebug(" e add planB %d ", error); - break; - } - ev->setID( mProfileName, QString::number( Note.Location ) ); - qDebug("New Calendar. Location %d stat %d %d",Note.Location ,error, ERR_UNKNOWN); - afterSave( ev ); - } else { - afterSave( ev ); // setting temp sync stat for changed items - } - } - ev = er.next(); - } - if ( planB ) { - qDebug("delete all calendar..."); - status.setText ( i18n("Deleting all calendar...")); - qApp->processEvents(); - error=Phone->DeleteAllCalendar(&s); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - message = i18n(" Deleting event # "); - procCount = 0; - while (1) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - qDebug("deleting event ... %d", procCount); - error = Phone->GetNextCalendar(&s,&Note,true); - if (error != ERR_NONE) break; - error = Phone->DeleteCalendar(&s,&Note); - } - qDebug("deleting calendar ... finished"); - } else { - status.setText ( i18n("All calendar deleted!")); - qDebug("all cal deleted"); - } - bool planC = false; - ev = er.first(); - procCount = 0; - message = i18n(" Writing event # "); - while ( ev && ! planC) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - event2GSM( calendar, ev, &Note ); - Note.Location = procCount; - error=Phone->AddCalendar(&s,&Note); - if (error != ERR_NONE ) { - // we have currently no planC :-( - // planC = true; - //qDebug("add planC %d ", error); - //break; - // we remove the ID such that this todo is not deleted after next sync - ev->removeID(mProfileName); - ev->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); - qDebug("error :cal adding loc %d planB stat %d ", Note.Location ,error); - } else { - qDebug("cal adding loc %d planB stat %d ", Note.Location ,error); - ev->setID(mProfileName, QString::number( Note.Location )); - afterSave( ev ); - } - ev = er.next(); - } - if ( planC ) { - qDebug("writing cal went wrong..."); - // we have currently no planC :-( - } - } - GSM_ToDoEntry ToDoEntry; - QPtrList<Todo> tl = calendar->rawTodos(); - Todo* to = tl.first(); - - message = i18n(" Processing todo # "); - procCount = 0; - planB = false; - while ( to && ! planB ) { - if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { - qDebug("todo3 %d ", procCount); - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - qDebug("todo5 %d ", procCount); - todo2GSM( calendar, to, &ToDoEntry ); - if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete - error=Phone->DeleteToDo(&s,&ToDoEntry); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - planB = true; - qDebug("delete planB %d ", error); - } - } - else if ( to->getID(mProfileName).isEmpty() ) { // add new - ; - } - else { // change existing - error=Phone->SetToDo(&s,&ToDoEntry); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - planB = true; - qDebug("set planB %d ", error); - } - qDebug("Old Todo. Location %d %d",ToDoEntry.Location , error ); - } - } - to = tl.next(); - } - - // pending get empty slots - to = tl.first(); - while ( to && ! planB ) { - qDebug("todo2 %d ", procCount); - if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL && to->tempSyncStat() != SYNC_TEMPSTATE_DELETE) { - qDebug("todo4 %d ", procCount); - if ( to->getID(mProfileName).isEmpty() ) { - status.setText ( message + QString::number ( ++procCount ) ); - qApp->processEvents(); - //int newID ;//= pending - //to->setID(mProfileName, QString::number( newID )); - todo2GSM( calendar,to, &ToDoEntry ); - ToDoEntry.Location = 0; - error=Phone->AddToDo(&s,&ToDoEntry); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - planB = true; - qDebug("new planB %d ", error); - } - to->setID(mProfileName, QString::number( ToDoEntry.Location )); - afterSave( to ); - qDebug("New Todo. Location %d %d",ToDoEntry.Location, error ); - } else { - afterSave( to ); - } - } - to = tl.next(); - } - if ( planB ) { - qDebug("delete all ..."); - error=Phone->DeleteAllToDo(&s); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - while (1) { - qDebug("deleting todo ..."); - error = Phone->GetNextToDo(&s,&ToDoEntry,true); - if (error != ERR_NONE) break; - error = Phone->DeleteToDo(&s,&ToDoEntry); - } - qDebug("deleting todo ... finished"); - } else { - qDebug("all todo deleted"); - } - bool planC = false; - to = tl.first(); - while ( to && ! planC ) { - todo2GSM( calendar,to, &ToDoEntry ); - ToDoEntry.Location = 0; - error=Phone->AddToDo(&s,&ToDoEntry); - if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) { - // we have currently no planC :-( - // planC = true; - //qDebug("add planC %d ", error); - //break; - // we remove the ID such that this todo is not deleted after next sync - to->removeID(mProfileName); - to->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); - } else { - qDebug("adding %d planB %d ", ToDoEntry.Location ,error); - to->setID(mProfileName, QString::number( ToDoEntry.Location )); - afterSave( to ); - } - to = tl.next(); - } - if ( planC ) { - // we have currently no planC :-( - } - } - return true; -#endif -} -QString PhoneFormat::dtToGSM( const QDateTime& dti, bool useTZ ) -{ - QString datestr; - QString timestr; - int offset = KGlobal::locale()->localTimeOffset( dti ); - QDateTime dt; - if (useTZ) - dt = dti.addSecs ( -(offset*60)); - else - dt = dti; - if(dt.date().isValid()){ - const QDate& date = dt.date(); - datestr.sprintf("%04d%02d%02d", - date.year(), date.month(), date.day()); - } - if(dt.time().isValid()){ - const QTime& time = dt.time(); - timestr.sprintf("T%02d%02d%02d", - time.hour(), time.minute(), time.second()); - } - return datestr + timestr; -} -QString PhoneFormat::getEventString( Event* event ) -{ -#if 0 - QStringList list; - list.append( QString::number(event->zaurusId() ) ); - list.append( event->categories().join(",") ); - if ( !event->summary().isEmpty() ) - list.append( event->summary() ); - else - list.append("" ); - if ( !event->location().isEmpty() ) - list.append( event->location() ); - else - list.append("" ); - if ( !event->description().isEmpty() ) - list.append( event->description() ); - else - list.append( "" ); - if ( event->doesFloat () ) { - list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); - list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 - list.append( "1" ); - - } - else { - list.append( dtToString( event->dtStart()) ); - list.append( dtToString( event->dtEnd()) ); //6 - list.append( "0" ); - } - bool noAlarm = true; - if ( event->alarms().count() > 0 ) { - Alarm * al = event->alarms().first(); - if ( al->enabled() ) { - noAlarm = false; - list.append( "0" ); // yes, 0 == alarm - list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); - if ( al->type() == Alarm::Audio ) - list.append( "1" ); // type audio - else - list.append( "0" ); // type silent - } - } - if ( noAlarm ) { - list.append( "1" ); // yes, 1 == no alarm - list.append( "0" ); // no alarm offset - list.append( "1" ); // type - } - // next is: 11 - // next is: 11-16 are recurrence - Recurrence* rec = event->recurrence(); - - bool writeEndDate = false; - switch ( rec->doesRecur() ) - { - case Recurrence::rDaily: // 0 - list.append( "0" ); - list.append( QString::number( rec->frequency() ));//12 - list.append( "0" ); - list.append( "0" ); - writeEndDate = true; - break; - case Recurrence::rWeekly:// 1 - list.append( "1" ); - list.append( QString::number( rec->frequency()) );//12 - list.append( "0" ); - { - int days = 0; - QBitArray weekDays = rec->days(); - int i; - for( i = 1; i <= 7; ++i ) { - if ( weekDays[i-1] ) { - days += 1 << (i-1); - } - } - list.append( QString::number( days ) ); - } - //pending weekdays - writeEndDate = true; - - break; - case Recurrence::rMonthlyPos:// 2 - list.append( "2" ); - list.append( QString::number( rec->frequency()) );//12 - - writeEndDate = true; - { - int count = 1; - QPtrList<Recurrence::rMonthPos> rmp; - rmp = rec->monthPositions(); - if ( rmp.first()->negative ) - count = 5 - rmp.first()->rPos - 1; - else - count = rmp.first()->rPos - 1; - list.append( QString::number( count ) ); - - } - - list.append( "0" ); - break; - case Recurrence::rMonthlyDay:// 3 - list.append( "3" ); - list.append( QString::number( rec->frequency()) );//12 - list.append( "0" ); - list.append( "0" ); - writeEndDate = true; - break; - case Recurrence::rYearlyMonth://4 - list.append( "4" ); - list.append( QString::number( rec->frequency()) );//12 - list.append( "0" ); - list.append( "0" ); - writeEndDate = true; - break; - - default: - list.append( "255" ); - list.append( QString() ); - list.append( "0" ); - list.append( QString() ); - list.append( "0" ); - list.append( "20991231T000000" ); - break; - } - if ( writeEndDate ) { - - if ( rec->endDate().isValid() ) { // 15 + 16 - list.append( "1" ); - list.append( dtToString( rec->endDate()) ); - } else { - list.append( "0" ); - list.append( "20991231T000000" ); - } - - } - if ( event->doesFloat () ) { - list.append( dtToString( event->dtStart(), false ).left( 8 )); - list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 - - } - else { - list.append( QString() ); - list.append( QString() ); - - } - if (event->dtStart().date() == event->dtEnd().date() ) - list.append( "0" ); - else - list.append( "1" ); - - - for(QStringList::Iterator it=list.begin(); - it!=list.end(); ++it){ - QString& s = (*it); - s.replace(QRegExp("\""), "\"\""); - if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ - s.prepend('\"'); - s.append('\"'); - } else if(s.isEmpty() && !s.isNull()){ - s = "\"\""; - } - } - return list.join(","); -#endif - return QString(); - -} -QString PhoneFormat::getTodoString( Todo* todo ) -{ -#if 0 - QStringList list; - list.append( QString::number( todo->zaurusId() ) ); - list.append( todo->categories().join(",") ); - - if ( todo->hasStartDate() ) { - list.append( dtToString( todo->dtStart()) ); - } else - list.append( QString() ); - - if ( todo->hasDueDate() ) { - QTime tim; - if ( todo->doesFloat()) { - list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; - } else { - list.append( dtToString(todo->dtDue() ) ); - } - } else - list.append( QString() ); - - if ( todo->isCompleted() ) { - list.append( dtToString( todo->completed()) ); - list.append( "0" ); // yes 0 == completed - } else { - list.append( dtToString( todo->completed()) ); - list.append( "1" ); - } - list.append( QString::number( todo->priority() )); - if( ! todo->summary().isEmpty() ) - list.append( todo->summary() ); - else - list.append( "" ); - if (! todo->description().isEmpty() ) - list.append( todo->description() ); - else - list.append( "" ); - for(QStringList::Iterator it=list.begin(); - it!=list.end(); ++it){ - QString& s = (*it); - s.replace(QRegExp("\""), "\"\""); - if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ - s.prepend('\"'); - s.append('\"'); - } else if(s.isEmpty() && !s.isNull()){ - s = "\"\""; - } - } - return list.join(","); -#endif - return QString(); } QString PhoneFormat::toString( Calendar * ) { return QString::null; } bool PhoneFormat::fromString( Calendar *calendar, const QString & text) diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h index 2c2e51c..8286098 100644 --- a/libkcal/phoneformat.h +++ b/libkcal/phoneformat.h @@ -22,19 +22,17 @@ #define PHONEFORMAT_H #include <qstring.h> #include "scheduler.h" #include "vcalformat.h" #include "calformat.h" -extern "C" { -#include "../gammu/emb/common/gammu.h" -} + namespace KCal { /** This class implements the calendar format used by Phone. */ class Event; class Todo; class PhoneFormat : public QObject { @@ -46,22 +44,18 @@ class PhoneFormat : public QObject { bool load( Calendar * ,Calendar * ); bool save( Calendar * ); bool fromString( Calendar *, const QString & ); QString toString( Calendar * ); static ulong getCsum( const QStringList & ); static ulong getCsumTodo( Todo* to ); static ulong getCsumEvent( Event* ev ); private: - VCalFormat vfconverter; - void event2GSM( Calendar *, Event* ev, GSM_CalendarEntry*Note ); - void todo2GSM( Calendar *, Todo* ev, GSM_ToDoEntry *ToDo ); - int initDevice(GSM_StateMachine *s); - QString getEventString( Event* ); - QString getTodoString( Todo* ); - QString dtToGSM( const QDateTime& dt, bool useTZ = true ); + void copyEvent( Event* to, Event* from ); + void copyTodo( Todo* to, Todo* from ); + //int initDevice(GSM_StateMachine *s); QString mProfileName, mDevice, mConnection, mModel; void afterSave( Incidence* ); }; } #endif diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp index 0ebd7d1..4727a7a 100644 --- a/libkcal/vcalformat.cpp +++ b/libkcal/vcalformat.cpp @@ -49,20 +49,23 @@ VCalFormat::VCalFormat() mCalendar = 0; useLocalTime = false; } VCalFormat::~VCalFormat() { } +void VCalFormat::setLocalTime ( bool b ) +{ + useLocalTime = b; +} bool VCalFormat::load(Calendar *calendar, const QString &fileName) { mCalendar = calendar; - clearException(); kdDebug(5800) << "VCalFormat::load() " << fileName << endl; VObject *vcal = 0; // this is not necessarily only 1 vcal. Could be many vcals, or include // a vcard... diff --git a/libkcal/vcalformat.h b/libkcal/vcalformat.h index 848be78..5bef7ed 100644 --- a/libkcal/vcalformat.h +++ b/libkcal/vcalformat.h @@ -42,30 +42,31 @@ class VCalFormat : public CalFormat { VCalFormat(); virtual ~VCalFormat(); /** loads a calendar on disk in vCalendar format into the current calendar. * any information already present is lost. Returns TRUE if successful, * else returns FALSE. * @param fileName the name of the calendar on disk. */ - bool load(Calendar *,const QString &fileName); + bool load(Calendar *,const QString &fileName ); /** writes out the calendar to disk in vCalendar format. Returns true if * successful and false on error. * @param fileName the name of the file */ - bool save(Calendar *,const QString &fileName); + bool save(Calendar *,const QString &fileName ); /** Parse string and populate calendar with that information. */ bool fromString( Calendar *, const QString & ); /** Return calendar information as string. */ + void setLocalTime ( bool ); QString toString( Calendar * ); QString eventToString( Event *, Calendar *calendar, bool useLocalTime = true ); QString todoToString( Todo * ,Calendar *calendar, bool useLocalTime = true ); protected: /** translates a VObject of the TODO type into a Event */ Todo *VTodoToEvent(VObject *vtodo); /** translates a VObject into a Event and returns a pointer to it. */ |