This site has been retired. For up to date information, see handbook.gnome.org or gitlab.gnome.org.


[Home] [TitleIndex] [WordIndex

http://git.gnome.org/browse/evolution-kolab/plain/art/logo/evo-kolab-small.pnghttp://git.gnome.org/browse/evolution-kolab/plain/art/logo/evo-kolab-lettering.png

evolution-kolab is a project to provide connectivity to Kolab groupware servers for Evolution.

evolution-kolab main page


1. evolution-kolab - Known issues with Kolab XML format conversion


1.1. Common

Please note that when this page was created, Evolution was used with german labels, which will therefore appear sometimes in this document.

1.1.1. Product ID

Every program writes it's own product-id. Also the libekolabconv library writes an own identifier (Evolution/libekolabconv), which is set automatically when new XML data is created from an internal structure. When Evolution structures are read, the identifier is set to NULL. Hence there are 3 states (1. Any identifier from Kolab-Clients: Client specific, 2. From Evolution to internal: NULL 3. From internal to XML: "Evolution/libekolabconv").

1.1.2. Sensitivity mapping

 typedef enum icalproperty_class {
    ICAL_CLASS_X = 10011,
    ICAL_CLASS_PUBLIC = 10012,
    ICAL_CLASS_PRIVATE = 10013,
    ICAL_CLASS_CONFIDENTIAL = 10014,
    ICAL_CLASS_NONE = 10015
 } icalproperty_class;

 typedef enum {
        E_CAL_COMPONENT_CLASS_NONE,
        E_CAL_COMPONENT_CLASS_PUBLIC,
        E_CAL_COMPONENT_CLASS_PRIVATE,
        E_CAL_COMPONENT_CLASS_CONFIDENTIAL,
        E_CAL_COMPONENT_CLASS_UNKNOWN
 } ECalComponentClassification;

Mapping table:

Kontact

Kontact XML

iCal

Evolution

Öffentlich

public

E_CAL_COMPONENT_CLASS_PUBLIC

Öffentlich

Privat

private

E_CAL_COMPONENT_CLASS_PRIVATE

Privat

Vertraulich

confidential

E_CAL_COMPONENT_CLASS_CONFIDENTIAL

Vertraulich

Default is "public".

Link Attachments (only an url to the attachment is stored) are available in Kolab and the Evolution types: Event, task and notes. Link attachments are not offered in Evolution contacts. Evolution does not show manually created link attachments if they are not below a special user specific path. If a link attachment is added in Evolution, the file is copied below this folder and a link to this file is added to the iCalendar. It is therfore not possible to map link attachments between kolab and evolution. Kolab link attachments will be preserved by the kolab store.

1.1.4. Kolab Store

Unknown Kolab XML elements must be preserved by kolab clients according to the kolab specification (Kontact does not keep them). Due to technical restrictions of the Evolution API for the types EContact and ECalComponent, not all unknown Kolab XML elements could be preserved:

1.1.5. body

In one test case, there is a loss of some "\r" and "\n" after converting a base64 encoded Toltec contact. The appearance is not concerned. Carriage return between two words is lost, but has no effect on the appearance like the complete lost of carriage return and newline at the end of the text-field. Example: "Notizen\r\n123\r\n" to Notizen\n123"

Also if there is only one whitespace with carriage return and/or newline in the body field, the whitespace is getting lost, possibly due to Evolution, deleting this if nothing else is filled in the field.

1.2. Incidence

1.2.1. Alarm

 <alarm>111</alarm> (in minutes)
 =
 <advanced-alarms><alarm type="display">
  <display-text>NULL</display-text>
  <start-offset>111</start-offset>
  <end-offset>NULL</end-offset>
  <repeat-count>NULL</repeat-count>
  <repeat-interval>NULL</repeat-interval>
 </advanced-alarms></alarm>

If start-offset is set and any other attributes are not set, except of type, which has to be display, then the advanced alarm is converted back (only the first) to simple alarm when writing xml. The <alarm> attribute has to be in a row before <advanced-alarms>.

1.2.1.1. Advanced Alarm

1.2.1.1.1. AlarmType

additional Kolab advanced-alarms specification: http://www.kolab.org/pipermail/kolab-format/2008-September/000873.html

 typedef enum icalproperty_action {
    ICAL_ACTION_X = 10000,
    ICAL_ACTION_AUDIO = 10001,
    ICAL_ACTION_DISPLAY = 10002,
    ICAL_ACTION_EMAIL = 10003,
    ICAL_ACTION_PROCEDURE = 10004,
    ICAL_ACTION_NONE = 10005
 } icalproperty_action;

 typedef enum {
        E_CAL_COMPONENT_ALARM_NONE,
        E_CAL_COMPONENT_ALARM_AUDIO,
        E_CAL_COMPONENT_ALARM_DISPLAY,
        E_CAL_COMPONENT_ALARM_EMAIL,
        E_CAL_COMPONENT_ALARM_PROCEDURE,
        E_CAL_COMPONENT_ALARM_UNKNOWN
 } ECalComponentAlarmAction;

1.2.1.1.2. Alarm Trigger

The iCal specification defines an absolute alarm trigger, which starts the alarm on a specified time, independent to start or end date of the event.

1.2.1.2. Trigger

DURATION in iCal written in icaldurationtype

 struct icaldurationtype
 {
        int is_neg;
        unsigned int days;
        unsigned int weeks;
        unsigned int hours;
        unsigned int minutes;
        unsigned int seconds;
 };

=> conversion needed. conversion from evolution to kolab with icaldurationtype_as_int(trigger->u.rel_duration)/60 because function returns seconds, and kolab need minutes. Seconds from evolution get lost!

DATE-TIME written in iCal date-time - DATE-TIME:19980101T050000Z

1.2.2. Recurrence

1. Additionally to the recurrence examples in the kolab specification it is possible in outlook to define a daily recurring event which only happens on work days:

 <recurrence cycle="daily">
    <interval>1</interval>
    <day>monday</day>
    <day>tuesday</day>
    <day>wednesday</day>
    <day>thursday</day>
    <day>friday</day>
    <range type="none"/>
 </recurrence>

1.2.2.1. Recurrence-Cycle mapping

/*
 * Recurrance enumerations
 */

typedef enum icalrecurrencetype_frequency

    /* These enums are used to index an array, so don't change the
       order or the integers */

    ICAL_SECONDLY_RECURRENCE=0,
    ICAL_MINUTELY_RECURRENCE=1,
    ICAL_HOURLY_RECURRENCE=2,
    ICAL_DAILY_RECURRENCE=3,
    ICAL_WEEKLY_RECURRENCE=4,
    ICAL_MONTHLY_RECURRENCE=5,
    ICAL_YEARLY_RECURRENCE=6,
    ICAL_NO_RECURRENCE=7

} icalrecurrencetype_frequency;

Mapping table:

Kolab

iCal

<not available>

ICAL_SECONDLY_RECURRENCE=0

<not available>

ICAL_MINUTELY_RECURRENCE=1

<not available>

ICAL_HOURLY_RECURRENCE=2

daily

ICAL_DAILY_RECURRENCE=3

weekly

ICAL_WEEKLY_RECURRENCE=4

monthly

ICAL_MONTHLY_RECURRENCE=5

yearly

ICAL_YEARLY_RECURRENCE=6

1.2.2.1.1. Conversion problems:

Evolution can't handle events that recur yearly on the n-th day of the year. Recurrence settings will not be displayed and can't be edited. (cf. specification 6.4.3, Annotation 2)

Evolution can't handle events that recur yearly on the n-th weekday of a Month (recurrenceCycle == Yearly_Weekday, e.g. every 3rd Wednesday of March). Recurrence is converted to monthly every 12 months. (cf. specification 6.4.3, Annotation 2)

Recurrence on tasks is being ignored by Evolution. Yearly_Weekday recurrences are converted as described above. If no startDate is set for task, it is impossible to convert Recurrence back to Kolab, therefore the recurrence element is put in the kolab-store.

1.2.3. Attendee

Unknown kolab xml elements below the attendee element could not be preserved when mapping to evolution (attendee is a list field and ECalComponent does not offer the possibility to get the internal iCalendar property which belongs to a given object attribute).

1.3. Contact

1. Contact picture

2. Carriage return Characters

3. Trailing Newlines

4. Email Address

5. Address

6. Phone Numbers

7. Free Busy URL

8. GEO

1.3.1. Date

1.3.2. Phone list

Kontact Phone

VCARD

Evolution Phone

Type

bevorzugte
Nummer

Kontact XML

TYPE

iCal Format

Phone Type

<no value saved>

<not available>

<not available>

X

primary

PREF

E_CONTACT_PHONE_PRIMARY

Telefon, primär

PCS

assistant

X-EVOLUTION-ASSISTANT

E_CONTACT_PHONE_ASSISTANT

Telefon des Assistenten

X

assistant

X-EVOLUTION-ASSISTANT

E_CONTACT_PHONE_ASSISTANT

primary

PREF

E_CONTACT_PHONE_PRIMARY

Geschäftlich

business1

WORK,VOICE

E_CONTACT_PHONE_BUSINESS / E_CONTACT_PHONE_BUSINESS_2

Telefon, geschäftlich

X

business2

WORK,VOICE

E_CONTACT_PHONE_BUSINESS / E_CONTACT_PHONE_BUSINESS_2

PREF

E_CONTACT_PHONE_PRIMARY

Fax

businessfax

WORK,FAX

E_CONTACT_PHONE_BUSINESS_FAX

Fax, geschäftlich

X

businessfax

WORK,FAX

E_CONTACT_PHONE_BUSINESS_FAX

primary

PREF

E_CONTACT_PHONE_PRIMARY

Voice

callback

X-EVOLUTION-CALLBACK

E_CONTACT_PHONE_CALLBACK

Rückruf-Telefon

X

callback

X-EVOLUTION-CALLBACK

E_CONTACT_PHONE_CALLBACK

primary

PREF

E_CONTACT_PHONE_PRIMARY

Auto

car

CAR

E_CONTACT_PHONE_CAR

Autotelefon

X

car

CAR

E_CONTACT_PHONE_CAR

primary

PREF

E_CONTACT_PHONE_PRIMARY

Messenger

company

X-EVOLUTION-COMPANY

E_CONTACT_PHONE_COMPANY

Firmentelefon

X

company

X-EVOLUTION-COMPANY

E_CONTACT_PHONE_COMPANY

primary

PREF

E_CONTACT_PHONE_PRIMARY

Privat

home1

HOME,VOICE

E_CONTACT_PHONE_HOME / E_CONTACT_PHONE_HOME_2

Telefon, privat

X

home2

HOME,VOICE

E_CONTACT_PHONE_HOME / E_CONTACT_PHONE_HOME_2

PREF

E_CONTACT_PHONE_PRIMARY

Privat & Fax

homefax

HOME,FAX

E_CONTACT_PHONE_HOME_FAX

Fax, privat

X

homefax

HOME,FAX

E_CONTACT_PHONE_HOME_FAX

primary

PREF

E_CONTACT_PHONE_PRIMARY

ISDN

isdn

ISDN

E_CONTACT_PHONE_ISDN

ISDN

X

isdn

ISDN

E_CONTACT_PHONE_ISDN

primary

PREF

E_CONTACT_PHONE_PRIMARY

Mobil

mobile

CELL

E_CONTACT_PHONE_MOBILE

Mobiltelefon

X

mobile

CELL

E_CONTACT_PHONE_MOBILE

primary

PREF

E_CONTACT_PHONE_PRIMARY

Pager

pager

PAGER

E_CONTACT_PHONE_PAGER

Pager

X

pager

PAGER

E_CONTACT_PHONE_PAGER

primary

PREF

E_CONTACT_PHONE_PRIMARY

Video

radio

X-EVOLUTION-RADIO

E_CONTACT_PHONE_RADIO

Funk

X

radio

X-EVOLUTION-RADIO

E_CONTACT_PHONE_RADIO

primary

PREF

E_CONTACT_PHONE_PRIMARY

Modem

telex

X-EVOLUTION-TELEX

E_CONTACT_PHONE_TELEX

Telex

X

telex

X-EVOLUTION-TELEX

E_CONTACT_PHONE_TELEX

primary

PREF

E_CONTACT_PHONE_PRIMARY

Mailbox

ttytdd

X-EVOLUTION-TTYTDD

E_CONTACT_PHONE_TTYTDD

TTY

X

ttytdd

X-EVOLUTION-TTYTDD

E_CONTACT_PHONE_TTYTDD

primary

PREF

E_CONTACT_PHONE_PRIMARY

<not available>

<not available>

other

VOICE

E_CONTACT_PHONE_OTHER

Weiteres Telefon

<not available>

<not available>

businessfax

FAX

E_CONTACT_PHONE_OTHER_FAX

Weiteres Fax

legend (phone list):

color

meaning

Normal case. When primary option is choosen, a second number field with type primary will be written.

Normal primary type.

Special case, own tag for type in combination with primary option.

Special case, own tag for combination of two types.

Specified in Kolab, but no possibillity to select in Kontact. Can produce unwanted stages, if not mapped to another value.

1.3.3. Addresses

All GString fields in Address (pobox, locality, region, postal_code, street, country) struct of contact have due to libecal functions empty String as value instead of NULL if they are not set. It has no effect on the appearance in Kontact or Evolution.

1.3.4. Instant Messenger Fields

Kolab: Provides or defines one text field for instant messenger.

Standard im field is set by first added messenger field value if contains no text. Text is not updated when changing im value. VCard: Provides 3 im fields for each of the three address types (home, private, other).

Mapping:

Kontact

Kolab XML Attribute

VCard Format

Evolution

AIM

app="messaging/aim"

X-AIM

AIM

Jabber

app="messaging/xmpp"

X-JABBER

Jabber

Yahoo!

app="messaging/yahoo"

X-YAHOO

Yahoo

Gadu-Gadu

app="messaging/gadu"

X-GADUGADU

Gadu-Gadu

MSN Messenger

app="messaging/msn"

X-MSN

MSN

ICQ

app="messaging/icq"

X-ICQ

ICQ

Groupwise

app="messaging/groupwise"

X-GROUPWISE

GroupWise

Skype

app="messaging/skype"

X-SKYPE

Skype

IRC

app="messaging/irc"

<kolab store>

Meanwhile

app="messaging/meanwhile"

<kolab store>

SMS

app="messaging/sms"

<kolab store>

 <x-custom value="AIM-Address" app="messaging/aim" name="All" />
 <x-custom value="Gadu Gadu-Address" app="messaging/gadu" name="All" />
 <x-custom value="GroupWise-Address" app="messaging/groupwise" name="All" />
 <x-custom value="ICQ-Address" app="messaging/icq" name="All" />
 <x-custom value="IRC2-Address&#57632;IRC2-NetworkIRC-Address&#57632;IRC-Network" app="messaging/irc" name="All" />
 <x-custom value="Jabber-Address" app="messaging/xmpp" name="All" />
 <x-custom value="MSN-Address" app="messaging/msn" name="All" />
 <x-custom value="Meanwhile-Address" app="messaging/meanwhile" name="All" />
 <x-custom value="SMS-Address" app="messaging/sms" name="All" />
 <x-custom value="Skype-Address" app="messaging/skype" name="All" />

1.4. Event

1.4.1. Event Attendee-Status mapping

 typedef enum icalparameter_partstat {
    ICAL_PARTSTAT_X = 20029,
    ICAL_PARTSTAT_NEEDSACTION = 20030,
    ICAL_PARTSTAT_ACCEPTED = 20031,
    ICAL_PARTSTAT_DECLINED = 20032,
    ICAL_PARTSTAT_TENTATIVE = 20033,
    ICAL_PARTSTAT_DELEGATED = 20034,
    ICAL_PARTSTAT_COMPLETED = 20035,
    ICAL_PARTSTAT_INPROCESS = 20036,
    ICAL_PARTSTAT_NONE = 20037
 } icalparameter_partstat;

Result is the following mapping:

Kontact

Kontact XML

iCal Format

Evolution

Erwarte Reaktion

none

ICAL_PARTSTAT_NEEDSACTION

Erfordert Maßnahme

Vorläufig

tentative

ICAL_PARTSTAT_TENTATIVE

Vorläufig

Akzeptiert

accepted

ICAL_PARTSTAT_ACCEPTED

Angenommen

Abgelehnt

declined

ICAL_PARTSTAT_DECLINED

Abgelehnt

Delegiert

delegated

ICAL_PARTSTAT_DELEGATED

Delegiert

Fertiggestellt

accepted[1]

<not available>

<not available>

In Bearbeitung

accepted[1]

<not available>

<not available>

[1] Value is saved wrong by Kontact.

Default will be none/ICAL_PARTSTAT_NEEDSACTION! It is set on any other case.

1.4.2. Event Attendee-Role mapping

 typedef enum icalparameter_role {
    ICAL_ROLE_X = 20051,
    ICAL_ROLE_CHAIR = 20052,
    ICAL_ROLE_REQPARTICIPANT = 20053,
    ICAL_ROLE_OPTPARTICIPANT = 20054,
    ICAL_ROLE_NONPARTICIPANT = 20055,
    ICAL_ROLE_NONE = 20056
 } icalparameter_role;

Result is the following mapping table: (If there is no role attribute in iCal or it is ICAL_ROLE_CHAIR it will be mapped as a generalization to normal participant "required".)

Kontact

Kontact XML

iCal Format

Evolution

Teilnehmer

required

ICAL_ROLE_REQPARTICIPANT

benötigter Teilnehmer

freiwilliger Teilnehmer

optional

" ↔

ICAL_ROLE_OPTPARTICIPANT

optionaler Teilnehmer

Beobachter

resource

ICAL_ROLE_NONPARTICIPANT

Nicht Teilnehmer

Leiter

required[1]

ICAL_ROLE_CHAIR

Vorsitzender

<not available>

<not available>

<not saved>[2]

Unbekannt

[1] Value is saved wrong by Kontact.

[2] No role tag is saved by Evolution in iCal.

Default will be required/ICAL_ROLE_REQPARTICIPANT! It is set on any other case.

1.4.3. Event ShowTimeAs mapping

 typedef enum icalparameter_fbtype {
    ICAL_FBTYPE_X = 20019,
    ICAL_FBTYPE_FREE = 20020,
    ICAL_FBTYPE_BUSY = 20021,
    ICAL_FBTYPE_BUSYUNAVAILABLE = 20022,
    ICAL_FBTYPE_BUSYTENTATIVE = 20023,
    ICAL_FBTYPE_NONE = 20024
 } icalparameter_fbtype;

 typedef enum icalproperty_transp {
    ICAL_TRANSP_X = 10061,
    ICAL_TRANSP_OPAQUE = 10062,
    ICAL_TRANSP_OPAQUENOCONFLICT = 10063,
    ICAL_TRANSP_TRANSPARENT = 10064,
    ICAL_TRANSP_TRANSPARENTNOCONFLICT = 10065,
    ICAL_TRANSP_NONE = 10066
 } icalproperty_transp;

Mapping table:

Kontact

Kontact XML

Toltec

Toltec XML

iCal Format

Evolution

Zeit anzeigen als: Beschäftigt

busy

Beschäftigt

busy

ICAL_TRANSP_OPAQUE

Zeit als beschäftigt anzeigen (X)

Zeit anzeigen als: Frei

free

Frei

free

ICAL_TRANSP_TRANSPARENT

Zeit als beschäftigt anzeigen ( )

<not available>

<not available>

Mit Vorbehalt

tentative

<not available>

<not available>

<not available>

<not available>

Abwesend

outofoffice

<not available>

<not available>

1.5. Task

1.5.1. Task Attendee-Status mapping

Additional information: Toltec Tasks have no possibility to save Attendees to them. Different to Events where they are saved, but not in Kolab-XML, here they are not saved at all.

1.5.2. Task Attendee-Role mapping

Additional information: Toltec Tasks have no possibility to save Attendees to them. Different to Events where they are saved, but not in Kolab-XML, here they are not saved at all.

1.5.3. Task Status mapping

 typedef enum icalproperty_status {
    ICAL_STATUS_X = 10051,
    ICAL_STATUS_TENTATIVE = 10052,
    ICAL_STATUS_CONFIRMED = 10053,
    ICAL_STATUS_COMPLETED = 10054,
    ICAL_STATUS_NEEDSACTION = 10055,
    ICAL_STATUS_CANCELLED = 10056,
    ICAL_STATUS_INPROCESS = 10057,
    ICAL_STATUS_DRAFT = 10058,
    ICAL_STATUS_FINAL = 10059,
    ICAL_STATUS_NONE = 10060
 } icalproperty_status;

Result is the following mapping table:

Kontact

Kontact XML

Toltec

Toltec XML

iCal Format

Evolution

<set as default>[1]

not-started

Nicht begonnen

not-started

<not saved>[2]

Nicht begonnen

<not available>

<not available>

In Bearbeitung

in-progress

ICAL_STATUS_INPROCESS

In Bearbeitung

<not available>

<not available>

Erledigt

completed

ICAL_STATUS_COMPLETED

Abgeschlossen

<not available>

<not available>

<not available>

<not available>

ICAL_STATUS_CANCELLED

Abgebrochen

<not available>

<not available>

Wartet auf jemand anderen

waiting-on-someone-else

<not available>

<not available>

<not available>

<not available>

Zurückgestellt

deferred

<not available>

<not available>

[1] No possibility to choose status in Kontact, always set to default on new tasks.

[2] No status tag is saved by Evolution in iCal.

Default will be not-started/<not saved>! It is set on any other case.

1.5.4. Task Priority mapping

Evolution

0 not specified

3 high

5 medium

7 low

Kolab

0 not specified

1 (highest)

... to ...

5 (lowest)

Kontact

0 not specified

1 (highest)

... to ...

9 (lowest)

Toltec

---

5 high

3 medium

1 low

Priority mapping done by Evolution:

Kontact

<priority>

<x-kcal-priority>

PRIORITY

Evolution

undefiniert

3

0

0

nicht angegeben

1 (höchste)

1

1

1

Hoch (nicht wählbar)

2

1

2

2

Hoch (nicht wählbar)

3

2

3

3

Hoch

4

2

4

4

Hoch (nicht wählbar)

5 (mittel)

3

5

5

Mittel

6

3

6

6

Niedrig (nicht wählbar)

7

4

7

7

Niedrig

8

4

8

8

Niedrig (nicht wählbar)

9 (niedrigste)

5

9

9

Niedrig (nicht wählbar)

Handling and mapping in libekolabconv:

1.5.5. Parent Task

In Kolab you can create subtasks, which become a parent tag with the id of his parent. Evolution does not provide those subtasks, hence the parent id is written into kolab store. Notice, that some connection between tasks can get lost if for example parent is deleted in Evolution.

1.6. Note

1.6.1. body / HTML

In body text of notes, Kontact writes text as HTML as soon as some formatting is done. It's the <body> tag of common, but only in notes you have the possibility to format your text in Kontact. Evolution does not provide formatting text in any field. To prevent unexpected conditions, HTML, if exists, will be parsed out of the body text before saving to Evolution. Faormatting will get lost, but newslines will be still there.

1.7. Appendix

1.7.1. mapping table legend

mapping table legend

equivalence: This column contains the important mapping information. The arrow shows in which direction the value aside is mapped, the color shows the row in which the result mapping value is written.

real equivalence: Both values in the same row are consistent to each other. Appears only in the same row with the same color as the values beside.

mapping to value on the right: No real equivalence, value on the left is mapped to the value on the right, which has the same background color as the arrow cell.

mapping to value on the left: No real equivalence, value on the right is mapped to the value on the left, which has the same background color as the arrow cell.

mapping to value on top right: Double definition, value is mapped in this direction to the lower one.

<row>

equivalence row: The options to choose in the programs, which are logically equivalent to each other are in the same row. The notation can differ in some ways.

<color>

background color: For each logically unique value a new background color is used. There is always just one color in one row, except the equivalence column and wrong saved values, like Kontact does. Kontact sometimes writes same value for 2 or more different options.

<option>

Program named columns: Columns named by programs (Kontact, Toltec, Evolution), show the real text values that can be chosen from the select lists. Programs on the left of the equivalence sign in the table, have their value column aside on the right. Programs on the right of the equivalence sign, have their value column aside on the left. Table equivalence assignment is set by there options.

<value>

Value named columns: Columns named by format values (Kontact XML, Toltec XML, iCal Format), show the node- or iCal-values that are set by the chosen option in the program.

<bugs>

Reading bugs/errors: Sometimes logically wrong values are saved, for example by Kontact. For two different options it saves the same value! Normally the same color should not appear again in one value column, because logically every value is unique. If it happens anyway, just jump up to the first appearance of this color/value and read the table from this point.

1.7.2. used program versions

program name

program version

Evolution

2.30.3

Kontact

Version 1.2.9 (enterprise35 20100115.1075236 / enterprise35 20110321.6842210)

Toltec

2.3.2

Outlook

2007


2024-10-23 10:58