martin: doc/kolab-formats/kolab2 Contacts, NONE, 1.1 addressbook, NONE, 1.1
cvs at intevation.de
cvs at intevation.de
Sat May 29 12:29:13 CEST 2004
Author: martin
Update of /kolabrepository/doc/kolab-formats/kolab2
In directory doto:/tmp/cvs-serv24695
Added Files:
Contacts addressbook
Log Message:
Martin K.: very early definition of contact data based on the Outlook properties using the vcard syntax
--- NEW FILE: Contacts ---
This is an early _draft_ of the specification for handling contacts in a
common format for the KDE Kolab client, the Kolab web client and the Toltec
Kolab Connector for Outlook.
The format is basically derived from an reverse engineering effort of the
Outlook data structures using Outlook Spy.
In general we want a common format for
- calendars
- Todos
- Journal (secondary goal)
- Notes
- contacts
It has been discussed that defining a common format for contacts are the most
difficult part as the available standards are umbigious and the vcard
standard does unfortunately not guarantee interoperability between different
implementations.
I therefore chose the Outlook way of handling contact data because on one hand
it is a defacto standard, reasonable enough and on the other hand we value
interoperability with Outlook very much while changing the way how Outlook
handles contact data is beyond our current capabilities.
In addition I propose that the opensource clients (Kontact and Webclient)
adopt this standard and code appropriate forms to handle the data. From a
user interface point of view imho these clients can do better than Outlook
though.
In addition I plan to adapt our kInetOrgPerson objectclass to become more
compatible to the Outlook contacts.
This should allow to copy LDAP addressbook entries to a contacts folder which
is then compatible to all Kolab clients. Beeing able to share contacts
between clients is a very important feature for our users.
We use Unix linefeed convention (\n) and UTF-8 for the encoding of strings.
Binary data if required is encoded using the vcard compatible "B" encoding.
>
> CONTACT_FIELD (FULL_NAME, "full_name")
> CONTACT_FIELD (FAMILY_NAME, "family_name"),
> CONTACT_FIELD (GIVEN_NAME, "given_name"),
> CONTACT_FIELD (ADDITIONAL_NAME, "middle_name"),
> CONTACT_FIELD (NAME_SUFFIX, "name_suffix"),
> CONTACT_FIELD (TITLE, "title"),
> CONTACT_FIELD (ORG, "org"),
> CONTACT_FIELD (FILE_AS, "file_as"),
> CONTACT_FIELD (PHONE_CALLBACK, "callback_phone"),
> CONTACT_FIELD (PHONE_BUSINESS_FAX, "business_fax"),
> CONTACT_FIELD (PHONE_HOME_FAX, "home_fax"),
> CONTACT_FIELD (PHONE_HOME, "home_phone"),
> CONTACT_FIELD (PHONE_HOME_2, "home_phone_2"),
> CONTACT_FIELD (PHONE_ISDN, "isdn"),
> CONTACT_FIELD (PHONE_MOBILE, "mobile_phone"),
> CONTACT_FIELD (PHONE_COMPANY, "company_phone"),
> CONTACT_FIELD (PHONE_OTHER_FAX, "other_fax"),
> CONTACT_FIELD (PHONE_PAGER, "pager"),
> CONTACT_FIELD (PHONE_BUSINESS, "business_phone"),
> CONTACT_FIELD (PHONE_BUSINESS_2, "business_phone_2"),
> CONTACT_FIELD (PHONE_TELEX, "telex"),
> CONTACT_FIELD (PHONE_TTYTDD, "tty"),
> CONTACT_FIELD (PHONE_ASSISTANT, "assistant_phone"),
> CONTACT_FIELD (PHONE_CAR, "car_phone"),
> CONTACT_FIELD (PHONE_OTHER, "other_phone"),
> CONTACT_FIELD (URL, "url"),
> CONTACT_FIELD (ORG_UNIT, "org_unit"),
> MAPI_ID_FIELD (PHONE_RADIO, PR_RADIO_TELEPHONE_NUMBER, "radio"),
> CONTACT_FIELD (OFFICE, "office"),
> MAPI_ID_FIELD (PHONE_PRIMARY, PR_PRIMARY_TELEPHONE_NUMBER,
> "primary_phone"), CONTACT_FIELD (ROLE, "role"),
> CONTACT_FIELD (MANAGER, "manager"),
>
> CONTACT_FIELD (ASSISTANT, "assistant"),
> CONTACT_FIELD (NICKNAME, "nickname"),
> CONTACT_FIELD (SPOUSE, "spouse"),
>
> We allow exactly these three Email Addresses. Email type is always SMTP. We
> explicitly disallow Exchange type or X-400 addresses.
>
> EMAIL_FIELD (EMAIL, "email"),
> EMAIL_ENTRID, (only Outlook)
> EMAIL_ADDRESS,
> EMAIL_DISPLAY_NAME
> CONTACTS_EMAIL2
>
> EMAIL_FIELD (EMAIL_2, "email_2"),
> EMAIL_ENTRID, (only Outlook)
> EMAIL_ADDRESS,
> EMAIL_DISPLAY_NAME
> CONTACTS_EMAIL2
>
> EMAIL_FIELD (EMAIL_3, "email_3"),
> EMAIL_ENTRID, (only Outlook))
> EMAIL_ADDRESS,
> EMAIL_DISPLAY_NAME
> CONTACTS_EMAIL3
>
> ADDRESS_FIELD (ADDRESS_BUSINESS, "business_address"),
> CONTACTS_HOME_PO_BOX,
> CONTACTS_HOME_STREET,
> CONTACTS_HOME_CITY,
> CONTACTS_HOME_STATE,
> CONTACTS_HOME_ZIP,
> CONTACTS_HOME_COUNTRY,
>
> ADDRESS_FIELD (ADDRESS_HOME, "home_address"),
> CONTACTS_HOME_PO_BOX,
> CONTACTS_HOME_STREET,
> CONTACTS_HOME_CITY,
> CONTACTS_HOME_STATE,
> CONTACTS_HOME_ZIP,
> CONTACTS_HOME_COUNTRY,
>
> ADDRESS_FIELD (ADDRESS_OTHER, "other_address"),
> CONTACTS_HOME_PO_BOX,
> CONTACTS_HOME_STREET,
> CONTACTS_HOME_CITY,
> CONTACTS_HOME_STATE,
> CONTACTS_HOME_ZIP,
> CONTACTS_HOME_COUNTRY,
>
>
> DATE_FIELD (BIRTH_DATE, "birth_date"),
> DATE_FIELD (ANNIVERSARY, "anniversary"),
> CAL_FIELD (FBURL, "fburl"),
>
> HTTPMAIL_FIELD (NOTE, TEXT_DESCRIPTION, "note"),
> EXCHANGE_FIELD (CATEGORIES, KEYWORDS, "categories")
>
> The name of a contact in the address book is derived according to the
> following first match rule:
>
> FULL_NAME, FILE_AS, EMAIL, EMAIL1, EMAIL2, ORG, TITLE, NULL
>
> Synonyms:
> full_name displayName
> given_name givenName
> family_name sn
> email mail
> business_phone telephoneNumber
> business_phone_2 otherTelephone
> home_phone homePhone
> home_phone2_ otherHomePhone
> mobile_phone mobile
> business_fax facsimileTelephoneNumber
> other_fax otherFacsimileTelephoneNumber
> pager Pager
> org company
> org_unit department
> office physicalDeliveryOfficeName
> title Title
> manager Manager
> location l
> country c
> zip postalCode
> url wwwHomePage
> note info
> fburl msExchFBURL
Example:
Content-Type: text/directory; profile="vcard"; charset=iso-8859-15
Content-ID: <id3 at erfrakon.com>
Content-Transfer-Encoding: Quoted-Printable
begin:vcard
source:ldap://cn=Martin%20Konold,cn=erfrakon,cn=de
name:Martin Konold
fn: Martin Konold
n:Konold;Martin
bday;value=date:1967-10-13
o:erfrakon
title:Diplom Physiker
title;language=de;value=text:Gesellschafter
note:Founding member
email;internet:martin.konold at erfrakon.de
home.tel;type=fax,voice,msg:+49 711 674009-63
home.label:Nobelstrasse 15\n
70569 Stuttgart\n
Germany
key;type=X509;encoding=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQ
AwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zI
ENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0ZW1zMRwwGgYDVQQD
ExNyb290Y2EubmV0c2NhcGUuY29tMB4XDTk3MDYwNjE5NDc1OVoXDTk3MTIwMzE5NDc
1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYDVQQKEx1OZXRzY2FwZSBDb21tdW5pY2F0aW
9ucyBDb3JwLjEYMBYGA1UEAxMPVGltb3RoeSBBIEhvd2VzMSEwHwYJKoZIhvcNAQkBF
hJob3dlc0BuZXRzY2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3dlczBcMA0GCSqG
SIb3DQEBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyrdN2dXc
oX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MBEGCWCGSAGG+E
IBAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau+hUMbsQukjANBgkqhkiG9
w0BAQQFAAOBgQBexv7o7mi3PLXadkmNP9LcIPmx93HGp0Kgyx1jIVMyNgsemeAwBM+M
SlhMfcpbTrONwNjZYW8vJDSoi//yrZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8V
UMk1U7jt8LYpo4YULU7UZHPYVUaSgVttImOHZIKi4hlPXBOhcUQ==
end:vcard
--- NEW FILE: addressbook ---
include <e-util/e-sexp.h>
#include <e-util/e-xml-hash-utils.h>
#include <ebook/e-card-simple.h>
#include "e2k-connection.h"
#include "e2k-propnames.h"
#include "e2k-restriction.h"
#include "e2k-uri.h"
#include "e2k-utils.h"
#include "e2k-xml-utils.h"
#include "mapi.h"
#include "exchange-component.h"
#include "exchange-account.h"
#include "exchange-hierarchy.h"
#include "e-folder-exchange.h"
#include "pas-backend-exchange.h"
#include "pas/pas-book.h"
#include "pas/pas-card-cursor.h"
#include "pas/pas-backend-card-sexp.h"
#include "pas/pas-backend-summary.h"
#include <gal/util/e-util.h>
prop_mappings[] = {
CONTACT_FIELD (FULL_NAME, "full_name"),
CONTACT_FIELD (FAMILY_NAME, "family_name"),
CONTACT_FIELD (GIVEN_NAME, "given_name"),
CONTACT_FIELD (ADDITIONAL_NAME, "middle_name"),
CONTACT_FIELD (NAME_SUFFIX, "name_suffix"),
CONTACT_FIELD (TITLE, "title"),
CONTACT_FIELD (ORG, "org"),
CONTACT_FIELD (FILE_AS, "file_as"),
CONTACT_FIELD (PHONE_CALLBACK, "callback_phone"),
CONTACT_FIELD (PHONE_BUSINESS_FAX, "business_fax"),
CONTACT_FIELD (PHONE_HOME_FAX, "home_fax"),
CONTACT_FIELD (PHONE_HOME, "home_phone"),
CONTACT_FIELD (PHONE_HOME_2, "home_phone_2"),
CONTACT_FIELD (PHONE_ISDN, "isdn"),
CONTACT_FIELD (PHONE_MOBILE, "mobile_phone"),
CONTACT_FIELD (PHONE_COMPANY, "company_phone"),
CONTACT_FIELD (PHONE_OTHER_FAX, "other_fax"),
CONTACT_FIELD (PHONE_PAGER, "pager"),
CONTACT_FIELD (PHONE_BUSINESS, "business_phone"),
CONTACT_FIELD (PHONE_BUSINESS_2, "business_phone_2"),
CONTACT_FIELD (PHONE_TELEX, "telex"),
CONTACT_FIELD (PHONE_TTYTDD, "tty"),
CONTACT_FIELD (PHONE_ASSISTANT, "assistant_phone"),
CONTACT_FIELD (PHONE_CAR, "car_phone"),
CONTACT_FIELD (PHONE_OTHER, "other_phone"),
MAPI_ID_FIELD (PHONE_RADIO, PR_RADIO_TELEPHONE_NUMBER, "radio"),
MAPI_ID_FIELD (PHONE_PRIMARY, PR_PRIMARY_TELEPHONE_NUMBER, "primary_phone"),
EMAIL_FIELD (EMAIL, "email"),
EMAIL_FIELD (EMAIL_2, "email_2"),
EMAIL_FIELD (EMAIL_3, "email_3"),
ADDRESS_FIELD (ADDRESS_BUSINESS, "business_address"),
ADDRESS_FIELD (ADDRESS_HOME, "home_address"),
ADDRESS_FIELD (ADDRESS_OTHER, "other_address"),
CONTACT_FIELD (URL, "url"),
CONTACT_FIELD (ORG_UNIT, "org_unit"),
CONTACT_FIELD (OFFICE, "office"),
CONTACT_FIELD (ROLE, "role"),
CONTACT_FIELD (MANAGER, "manager"),
CONTACT_FIELD (ASSISTANT, "assistant"),
CONTACT_FIELD (NICKNAME, "nickname"),
CONTACT_FIELD (SPOUSE, "spouse"),
DATE_FIELD (BIRTH_DATE, "birth_date"),
DATE_FIELD (ANNIVERSARY, "anniversary"),
CAL_FIELD (FBURL, "fburl"),
HTTPMAIL_FIELD (NOTE, TEXT_DESCRIPTION, "note"),
#ifdef ENABLE_CATEGORIES
/* this doesn't work at the moment */
EXCHANGE_FIELD (CATEGORIES, KEYWORDS, "categories", proppatch_categories, populate_categories)
#endif
};
static void
get_email_field_from_props (ExchangeAccount *account, E2kConnection *conn,
PropMapping *prop_mapping, E2kResult *result,
ECardSimple *simple, char *data)
{
char *emailtype;
char *typeselector;
/* here's where we do the super involved
conversion from local email addresses to
internet addresses for display in
evolution. */
if (prop_mapping->simple_field == E_CARD_SIMPLE_FIELD_EMAIL)
typeselector = E2K_PR_MAPI_EMAIL_ADDRTYPE;
else if (prop_mapping->simple_field == E_CARD_SIMPLE_FIELD_EMAIL_2)
typeselector = E2K_PR_MAPI_EMAIL_2_ADDRTYPE;
else if (prop_mapping->simple_field == E_CARD_SIMPLE_FIELD_EMAIL_3)
typeselector = E2K_PR_MAPI_EMAIL_3_ADDRTYPE;
else {
g_warning ("invalid email field");
return;
}
emailtype = e2k_properties_get_prop (result->props, typeselector);
if (!emailtype) {
g_warning ("no email info for \"%s\"", data);
return;
}
if (!strcmp (emailtype, "SMTP")) {
/* it's a normal email address, just set the value as we usually would */
e_card_simple_set (simple, prop_mapping->simple_field,
data);
}
else if (!strcmp (emailtype, "EX")) {
E2kGlobalCatalog *gc;
E2kGlobalCatalogEntry *entry = NULL;
gc = exchange_account_get_global_catalog (account);
if (gc) {
e2k_global_catalog_lookup (
gc, E2K_GLOBAL_CATALOG_LOOKUP_BY_LEGACY_EXCHANGE_DN,
data, E2K_GLOBAL_CATALOG_LOOKUP_EMAIL,
&entry);
}
if (entry) {
e_card_simple_set (simple, prop_mapping->simple_field,
entry->email);
e2k_global_catalog_entry_free (gc, entry);
} else {
g_warning ("invalid EX address");
return;
}
}
else if (emailtype[0] == '\0') {
/* empty emailtype == no email address here */
return;
}
else {
g_warning ("email address type `%s' not handled, using the value as is", emailtype);
e_card_simple_set (simple, prop_mapping->simple_field,
data);
}
return;
}
/* Exchange uses \r in some strings and \r\n in others. ECard always
* wants just \n.
*/
put_request = g_strdup_printf ("content-class: urn:content-classes:person\r\n"
"MIME-Version: 1.0\r\n"
"Content-Type: text/plain;\r\n"
"\tcharset=\"utf-8\"\r\n"
"Content-Transfer-Encoding: 8bit\r\n"
"Subject: %s\r\n"
"\r\n%s",
subject ? subject : "",
put_body);
UTF8
static const ECardSimpleField email_fields[3] = {
E_CARD_SIMPLE_FIELD_EMAIL,
E_CARD_SIMPLE_FIELD_EMAIL_2,
E_CARD_SIMPLE_FIELD_EMAIL_3
};
static const char *email1_props[] = {
E2K_PR_MAPI_EMAIL_ENTRYID,
E2K_PR_MAPI_EMAIL_ADDRTYPE,
E2K_PR_MAPI_EMAIL_ADDRESS,
E2K_PR_MAPI_EMAIL_DISPLAY_NAME,
E2K_PR_CONTACTS_EMAIL1,
};
static const char *email2_props[] = {
E2K_PR_MAPI_EMAIL_2_ENTRYID,
E2K_PR_MAPI_EMAIL_2_ADDRTYPE,
E2K_PR_MAPI_EMAIL_2_ADDRESS,
E2K_PR_MAPI_EMAIL_2_DISPLAY_NAME,
E2K_PR_CONTACTS_EMAIL2,
};
static const char *email3_props[] = {
E2K_PR_MAPI_EMAIL_3_ENTRYID,
E2K_PR_MAPI_EMAIL_3_ADDRTYPE,
E2K_PR_MAPI_EMAIL_3_ADDRESS,
E2K_PR_MAPI_EMAIL_3_DISPLAY_NAME,
E2K_PR_CONTACTS_EMAIL3,
};
static const char **email_props[] = {
email1_props, email2_props, email3_props
};
EMAIL Type is SMTP
enum addressprop {
ADDRPROP_POSTOFFICEBOX,
ADDRPROP_STREET,
ADDRPROP_CITY,
ADDRPROP_STATE,
ADDRPROP_POSTALCODE,
ADDRPROP_COUNTRY,
ADDRPROP_LAST
};
static char *homeaddrpropnames[] = {
E2K_PR_CONTACTS_HOME_PO_BOX,
E2K_PR_CONTACTS_HOME_STREET,
E2K_PR_CONTACTS_HOME_CITY,
E2K_PR_CONTACTS_HOME_STATE,
E2K_PR_CONTACTS_HOME_ZIP,
E2K_PR_CONTACTS_HOME_COUNTRY,
};
static char *otheraddrpropnames[] = {
E2K_PR_CONTACTS_OTHER_PO_BOX,
E2K_PR_CONTACTS_OTHER_STREET,
E2K_PR_CONTACTS_OTHER_CITY,
E2K_PR_CONTACTS_OTHER_STATE,
E2K_PR_CONTACTS_OTHER_ZIP,
E2K_PR_CONTACTS_OTHER_COUNTRY,
};
static char *workaddrpropnames[] = {
E2K_PR_CONTACTS_WORK_PO_BOX,
E2K_PR_CONTACTS_WORK_STREET,
E2K_PR_CONTACTS_WORK_CITY,
E2K_PR_CONTACTS_WORK_STATE,
E2K_PR_CONTACTS_WORK_ZIP,
E2K_PR_CONTACTS_WORK_COUNTRY,
};
static const char *
contact_name (ECardSimple *card)
{
const char *contact_name;
contact_name = e_card_simple_get_const (card, E_CARD_SIMPLE_FIELD_FULL_NAME);
if (contact_name && *contact_name)
return contact_name;
contact_name = e_card_simple_get_const (card, E_CARD_SIMPLE_FIELD_FILE_AS);
if (contact_name && *contact_name)
return contact_name;
contact_name = e_card_simple_get_const (card, E_CARD_SIMPLE_FIELD_EMAIL);
if (contact_name && *contact_name)
return contact_name;
contact_name = e_card_simple_get_const (card, E_CARD_SIMPLE_FIELD_EMAIL_2);
if (contact_name && *contact_name)
return contact_name;
contact_name = e_card_simple_get_const (card, E_CARD_SIMPLE_FIELD_EMAIL_3);
if (contact_name && *contact_name)
return contact_name;
contact_name = e_card_simple_get_const (card, E_CARD_SIMPLE_FIELD_ORG);
if (contact_name && *contact_name)
return contact_name;
contact_name = e_card_simple_get_const (card, E_CARD_SIMPLE_FIELD_TITLE);
if (contact_name && *contact_name)
return contact_name;
return NULL;
}
==========================================
#include "e2k-utils.h"
#include "exchange-component.h"
#include "exchange-account.h"
#ifdef DEBUG
#define LDAP_DEBUG
#define LDAP_DEBUG_ADD
#endif
#include <ldap.h>
#ifdef DEBUG
#undef LDAP_DEBUG
#endif
#include <e-util/e-sexp.h>
#include <ebook/e-card-simple.h>
#include "pas-backend-ad.h"
#include "pas/pas-backend-card-sexp.h"
#include "pas/pas-book.h"
#include "pas/pas-card-cursor.h"
prop_info[] = {
#define COMPLEX_PROP(fid,q,a,ctor) {fid, q, a, PROP_TYPE_COMPLEX, ctor}
#define STRING_PROP(fid,q,a) {fid, q, a, PROP_TYPE_STRING}
/* name fields */
STRING_PROP (E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "displayName" ),
STRING_PROP (E_CARD_SIMPLE_FIELD_GIVEN_NAME, "given_name", "givenName" ),
STRING_PROP (E_CARD_SIMPLE_FIELD_FAMILY_NAME, "family_name", "sn" ),
/* email addresses */
STRING_PROP (E_CARD_SIMPLE_FIELD_EMAIL, "email", "mail"),
/* phone numbers */
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, "business_phone", "telephoneNumber"),
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2, "business_phone_2", "otherTelephone"),
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_HOME, "home_phone", "homePhone"),
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_HOME_2, "home_phone_2", "otherHomePhone"),
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_MOBILE, "mobile_phone", "mobile"),
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX, "business_fax", "facsimileTelephoneNumber"),
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_OTHER_FAX, "other_fax", "otherFacsimileTelephoneNumber"),
STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_PAGER, "pager", "pager"),
/* org information */
STRING_PROP (E_CARD_SIMPLE_FIELD_ORG, "org", "company"),
STRING_PROP (E_CARD_SIMPLE_FIELD_ORG_UNIT, "org_unit", "department"),
STRING_PROP (E_CARD_SIMPLE_FIELD_OFFICE, "office", "physicalDeliveryOfficeName"),
STRING_PROP (E_CARD_SIMPLE_FIELD_TITLE, "title", "title"),
COMPLEX_PROP(E_CARD_SIMPLE_FIELD_MANAGER, "manager", "manager", manager_populate),
/* FIXME: we should aggregate streetAddress, l, st, c, postalCode
* into business_address
*/
/* misc fields */
STRING_PROP (E_CARD_SIMPLE_FIELD_URL, "url", "wWWHomePage"),
STRING_PROP (E_CARD_SIMPLE_FIELD_NOTE, "note", "info"),
STRING_PROP (E_CARD_SIMPLE_FIELD_FBURL, "fburl", "msExchFBURL"),
#undef STRING_PROP
#undef COMPLEX_PROP
};
=====================================================
if (!strcmp (str, "high"))
priority = 3;
else if (!strcmp (str, "low"))
priority = 7;
else if (!strcmp (str, "normal"))
priority = 5;
else
priority = 0;
/* SUMMARY property */
/* DTSTAMP property */
/* ORGANIZER property */
/* DESCRIPTION property */
/* DUE property */
/* DTSTART property */
/* CLASSIFICATION property */
if ((str = e2k_properties_get_prop (res->props, E2K_PR_MAPI_SENSITIVITY))) {
if (!strcmp (str, "0"))
cal_component_set_classification (CAL_COMPONENT (comp),
CAL_COMPONENT_CLASS_PUBLIC);
else if (!strcmp (str, "1"))
cal_component_set_classification (CAL_COMPONENT (comp),
CAL_COMPONENT_CLASS_CONFIDENTIAL);
else if (!strcmp (str, "2"))
cal_component_set_classification (CAL_COMPONENT (comp),
CAL_COMPONENT_CLASS_PRIVATE);
}
/* % COMPLETED property */
/* STATUS property */
if ((str = e2k_properties_get_prop (res->props, E2K_PR_OUTLOOK_TASK_STATUS))) {
if (!strcmp (str, "0")) {
/* Not Started */
cal_component_set_status (CAL_COMPONENT (comp),
ICAL_STATUS_NEEDSACTION);
} else if (!strcmp (str, "1")) {
/* In Progress */
cal_component_set_status (CAL_COMPONENT (comp),
ICAL_STATUS_INPROCESS);
} else if (!strcmp (str, "2")) {
/* Completed */
cal_component_set_status (CAL_COMPONENT (comp),
ICAL_STATUS_COMPLETED);
} else if (!strcmp (str, "3")) {
/* Waiting on someone else */
cal_component_set_status (CAL_COMPONENT (comp),
ICAL_STATUS_INPROCESS);
} else if (!strcmp (str, "4")) {
/* Deferred */
cal_component_set_status (CAL_COMPONENT (comp),
ICAL_STATUS_CANCELLED);
}
}
/* DATE COMPLETED property */
/* LAST MODIFIED property */
/* CATEGORIES */
/* URL property */
start = g_strstr_len (body, len, "\nBEGIN:VCALENDAR");
end = g_strstr_len (start, len - (start - body), "\nEND:VCALENDAR");
switch (kind)
case ICAL_VTODO_COMPONENT:
case ICAL_VJOURNAL_COMPONENT:
case ICAL_VEVENT_COMPONENT:
case ICAL_VCALENDAR_COMPONENT:
switch (child_kind)
case ICAL_VEVENT_COMPONENT:
case ICAL_VJOURNAL_COMPONENT:
case ICAL_VTODO_COMPONENT:
case ICAL_VTIMEZONE_COMPONENT:
/* Exchange sets an ORGANIZER on all events. RFC2445 says
*
* This property MUST NOT be specified in an iCalendar
* object that specifies only a time zone definition or
* that defines calendar entities that are not group
* scheduled entities, but are entities only on a single
* user's calendar.
*/
cal_component_get_transparency (comp, &transp);
if (transp == CAL_COMPONENT_TRANSP_TRANSPARENT)
busystatus = "FREE";
else
busystatus = "BUSY";
if (cal_component_has_recurrences (comp))
insttype = "1";
else
insttype = "0";
cal_component_get_dtstart (comp, &dtstart);
if (dtstart.value->is_date)
allday = "TRUE";
else
allday = "FALSE";
cal_component_free_datetime (&dtstart);
cal_component_get_priority (comp, &priority);
if (priority) {
importance = *priority < 5 ? "2" : *priority > 5 ? "0" : "1";
cal_component_free_priority (priority);
} else
importance = "1";
msg = g_strdup_printf ("Subject: %s\r\n"
"Date: %s\r\n"
"MIME-Version: 1.0\r\n"
"Content-Type: text/calendar;\r\n"
"\tmethod=REQUEST;\r\n"
"\tcharset=\"utf-8\"\r\n"
"Content-Transfer-Encoding: 8bit\r\n"
"content-class: urn:content-classes:appointment\r\n"
"Importance: normal\r\n"
"Priority: normal\r\n"
"From: %s\r\n"
"\r\n%s", summary, date,
from ? from : "Evolution",
body_crlf);
TODO:
switch (ical_status) {
case ICAL_STATUS_NONE :
case ICAL_STATUS_NEEDSACTION :
/* Not Started */
status = 0;
break;
case ICAL_STATUS_INPROCESS :
/* In Progress */
status = 1;
break;
case ICAL_STATUS_COMPLETED :
/* Completed */
status = 2;
break;
case ICAL_STATUS_CANCELLED :
/* Deferred */
status = 4;
break;
default :
status = 0;
}
cal_component_get_priority (CAL_COMPONENT (comp), &priority);
if (!priority)
return "normal";
if (*priority == 0)
res = "normal";
else if (*priority <= 4)
res = "high";
else if (*priority == 5)
res = "normal";
else
res = "low";
static const char *task_props[] = {
E2K_PR_EXCHANGE_MESSAGE_CLASS,
E2K_PR_DAV_UID,
E2K_PR_CALENDAR_UID,
E2K_PR_DAV_LAST_MODIFIED,
E2K_PR_HTTPMAIL_SUBJECT,
E2K_PR_HTTPMAIL_TEXT_DESCRIPTION,
E2K_PR_HTTPMAIL_DATE,
E2K_PR_CALENDAR_LAST_MODIFIED,
E2K_PR_HTTPMAIL_FROM_EMAIL,
E2K_PR_HTTPMAIL_FROM_NAME,
E2K_PR_MAILHEADER_IMPORTANCE,
E2K_PR_MAPI_SENSITIVITY,
E2K_PR_MAPI_COMMON_START,
E2K_PR_MAPI_COMMON_END,
E2K_PR_OUTLOOK_TASK_STATUS,
E2K_PR_OUTLOOK_TASK_PERCENT,
E2K_PR_OUTLOOK_TASK_DONE_DT,
E2K_PR_EXCHANGE_KEYWORDS,
E2K_PR_CALENDAR_URL
};
#define E2K_NS_DAV "DAV:"
#define E2K_PR_DAV_CONTENT_CLASS "DAV:contentclass"
#define E2K_PR_DAV_CONTENT_LENGTH "DAV:getcontentlength"
#define E2K_PR_DAV_CONTENT_TYPE "DAV:getcontenttype"
#define E2K_PR_DAV_CREATION_DATE "DAV:creationdate"
#define E2K_PR_DAV_DISPLAY_NAME "DAV:displayname"
#define E2K_PR_DAV_LAST_MODIFIED "DAV:getlastmodified"
#define E2K_PR_DAV_HAS_SUBS "DAV:hassubs"
#define E2K_PR_DAV_HREF "DAV:href"
#define E2K_PR_DAV_IS_COLLECTION "DAV:iscollection"
#define E2K_PR_DAV_IS_HIDDEN "DAV:ishidden"
#define E2K_PR_DAV_LOCATION "DAV:location"
#define E2K_PR_DAV_UID "DAV:uid"
#define E2K_PR_DAV_VISIBLE_COUNT "DAV:visiblecount"
#define E2K_NS_CALENDAR "urn:schemas:calendar:"
#define E2K_PR_CALENDAR_BUSY_STATUS E2K_NS_CALENDAR "busystatus"
#define E2K_PR_CALENDAR_DTEND E2K_NS_CALENDAR "dtend"
#define E2K_PR_CALENDAR_DTSTART E2K_NS_CALENDAR "dtstart"
#define E2K_PR_CALENDAR_INSTANCE_TYPE E2K_NS_CALENDAR "instancetype"
#define E2K_PR_CALENDAR_LAST_MODIFIED E2K_NS_CALENDAR "lastmodifiedtime"
#define E2K_PR_CALENDAR_UID E2K_NS_CALENDAR "uid"
#define E2K_PR_CALENDAR_URL E2K_NS_CALENDAR "locationurl"
#define E2K_PR_CALENDAR_FBURL E2K_NS_CALENDAR "fburl"
#define E2K_NS_CONTACTS "urn:schemas:contacts:"
#define E2K_PR_CONTACTS_FULL_NAME E2K_NS_CONTACTS "cn"
#define E2K_PR_CONTACTS_FAMILY_NAME E2K_NS_CONTACTS "sn"
#define E2K_PR_CONTACTS_GIVEN_NAME E2K_NS_CONTACTS "givenName"
#define E2K_PR_CONTACTS_ADDITIONAL_NAME E2K_NS_CONTACTS "middlename"
#define E2K_PR_CONTACTS_NAME_SUFFIX E2K_NS_CONTACTS "namesuffix"
#define E2K_PR_CONTACTS_TITLE E2K_NS_CONTACTS "title"
#define E2K_PR_CONTACTS_ORG E2K_NS_CONTACTS "o"
#define E2K_PR_CONTACTS_FILE_AS E2K_NS_CONTACTS "fileas"
#define E2K_PR_CONTACTS_PHONE_CALLBACK E2K_NS_CONTACTS "callbackphone"
#define E2K_PR_CONTACTS_PHONE_BUSINESS_FAX E2K_NS_CONTACTS "facsimiletelephonenumber"
#define E2K_PR_CONTACTS_PHONE_HOME_FAX E2K_NS_CONTACTS "homefax"
#define E2K_PR_CONTACTS_PHONE_HOME E2K_NS_CONTACTS "homePhone"
#define E2K_PR_CONTACTS_PHONE_HOME_2 E2K_NS_CONTACTS "homephone2"
#define E2K_PR_CONTACTS_PHONE_ISDN E2K_NS_CONTACTS "internationalisdnnumber"
#define E2K_PR_CONTACTS_PHONE_MOBILE E2K_NS_CONTACTS "mobile"
#define E2K_PR_CONTACTS_PHONE_COMPANY E2K_NS_CONTACTS "organizationmainphone"
#define E2K_PR_CONTACTS_PHONE_OTHER_FAX E2K_NS_CONTACTS "otherfax"
#define E2K_PR_CONTACTS_PHONE_PAGER E2K_NS_CONTACTS "pager"
#define E2K_PR_CONTACTS_PHONE_BUSINESS E2K_NS_CONTACTS "telephoneNumber"
#define E2K_PR_CONTACTS_PHONE_BUSINESS_2 E2K_NS_CONTACTS "telephonenumber2"
#define E2K_PR_CONTACTS_PHONE_TELEX E2K_NS_CONTACTS "telexnumber"
#define E2K_PR_CONTACTS_PHONE_TTYTDD E2K_NS_CONTACTS "ttytddphone"
#define E2K_PR_CONTACTS_PHONE_ASSISTANT E2K_NS_CONTACTS "secretaryphone"
#define E2K_PR_CONTACTS_PHONE_CAR E2K_NS_CONTACTS "othermobile"
#define E2K_PR_CONTACTS_PHONE_OTHER E2K_NS_CONTACTS "otherTelephone"
#define E2K_PR_CONTACTS_EMAIL1 E2K_NS_CONTACTS "email1"
#define E2K_PR_CONTACTS_EMAIL2 E2K_NS_CONTACTS "email2"
#define E2K_PR_CONTACTS_EMAIL3 E2K_NS_CONTACTS "email3"
#define E2K_PR_CONTACTS_ADDRESS_BUSINESS E2K_NS_CONTACTS "workaddress"
#define E2K_PR_CONTACTS_WORK_STREET E2K_NS_CONTACTS "street"
#define E2K_PR_CONTACTS_WORK_PO_BOX E2K_NS_CONTACTS "postofficebox"
#define E2K_PR_CONTACTS_WORK_CITY E2K_NS_CONTACTS "l"
#define E2K_PR_CONTACTS_WORK_STATE E2K_NS_CONTACTS "st"
#define E2K_PR_CONTACTS_WORK_ZIP E2K_NS_CONTACTS "postalcode"
#define E2K_PR_CONTACTS_WORK_COUNTRY E2K_NS_CONTACTS "co"
#define E2K_PR_CONTACTS_ADDRESS_HOME E2K_NS_CONTACTS "homepostaladdress"
#define E2K_PR_CONTACTS_HOME_STREET E2K_NS_CONTACTS "homeStreet"
#define E2K_PR_CONTACTS_HOME_PO_BOX E2K_NS_CONTACTS "homePostOfficeBox"
#define E2K_PR_CONTACTS_HOME_CITY E2K_NS_CONTACTS "homeCity"
#define E2K_PR_CONTACTS_HOME_STATE E2K_NS_CONTACTS "homeState"
#define E2K_PR_CONTACTS_HOME_ZIP E2K_NS_CONTACTS "homePostalCode"
#define E2K_PR_CONTACTS_HOME_COUNTRY E2K_NS_CONTACTS "homeCountry"
#define E2K_PR_CONTACTS_ADDRESS_OTHER E2K_NS_CONTACTS "otherpostaladdress"
#define E2K_PR_CONTACTS_OTHER_STREET E2K_NS_CONTACTS "otherstreet"
#define E2K_PR_CONTACTS_OTHER_PO_BOX E2K_NS_CONTACTS "otherpostofficebox"
#define E2K_PR_CONTACTS_OTHER_CITY E2K_NS_CONTACTS "othercity"
#define E2K_PR_CONTACTS_OTHER_STATE E2K_NS_CONTACTS "otherstate"
#define E2K_PR_CONTACTS_OTHER_ZIP E2K_NS_CONTACTS "otherpostalcode"
#define E2K_PR_CONTACTS_OTHER_COUNTRY E2K_NS_CONTACTS "othercountry"
#define E2K_PR_CONTACTS_URL E2K_NS_CONTACTS "businesshomepage"
#define E2K_PR_CONTACTS_ORG_UNIT E2K_NS_CONTACTS "department"
#define E2K_PR_CONTACTS_OFFICE E2K_NS_CONTACTS "roomnumber"
#define E2K_PR_CONTACTS_ROLE E2K_NS_CONTACTS "profession"
#define E2K_PR_CONTACTS_MANAGER E2K_NS_CONTACTS "manager"
#define E2K_PR_CONTACTS_ASSISTANT E2K_NS_CONTACTS "secretarycn"
#define E2K_PR_CONTACTS_NICKNAME E2K_NS_CONTACTS "nickname"
#define E2K_PR_CONTACTS_SPOUSE E2K_NS_CONTACTS "spousecn"
#define E2K_PR_CONTACTS_BIRTH_DATE E2K_NS_CONTACTS "bday"
#define E2K_PR_CONTACTS_ANNIVERSARY E2K_NS_CONTACTS "weddinganniversary"
#define E2K_NS_HTTPMAIL "urn:schemas:httpmail:"
#define E2K_PR_HTTPMAIL_DATE E2K_NS_HTTPMAIL "date"
#define E2K_PR_HTTPMAIL_FROM_EMAIL E2K_NS_HTTPMAIL "fromemail"
#define E2K_PR_HTTPMAIL_FROM_NAME E2K_NS_HTTPMAIL "fromname"
#define E2K_PR_HTTPMAIL_HAS_ATTACHMENT E2K_NS_HTTPMAIL "hasattachment"
#define E2K_PR_HTTPMAIL_MESSAGE_FLAG E2K_NS_HTTPMAIL "messageflag"
#define E2K_PR_HTTPMAIL_READ E2K_NS_HTTPMAIL "read"
#define E2K_PR_HTTPMAIL_SUBJECT E2K_NS_HTTPMAIL "subject"
#define E2K_PR_HTTPMAIL_TEXT_DESCRIPTION E2K_NS_HTTPMAIL "textdescription"
#define E2K_PR_HTTPMAIL_THREAD_TOPIC E2K_NS_HTTPMAIL "thread-topic"
#define E2K_PR_HTTPMAIL_UNREAD_COUNT E2K_NS_HTTPMAIL "unreadcount"
#define E2K_NS_STD_FOLDER "urn:schemas:httpmail:"
#define E2K_PR_STD_FOLDER_CALENDAR E2K_NS_HTTPMAIL "calendar"
#define E2K_PR_STD_FOLDER_CONTACTS E2K_NS_HTTPMAIL "contacts"
#define E2K_PR_STD_FOLDER_DELETED_ITEMS E2K_NS_HTTPMAIL "deleteditems"
#define E2K_PR_STD_FOLDER_DRAFTS E2K_NS_HTTPMAIL "drafts"
#define E2K_PR_STD_FOLDER_INBOX E2K_NS_HTTPMAIL "inbox"
#define E2K_PR_STD_FOLDER_JOURNAL E2K_NS_HTTPMAIL "journal"
#define E2K_PR_STD_FOLDER_ROOT E2K_NS_HTTPMAIL "msgfolderroot"
#define E2K_PR_STD_FOLDER_NOTES E2K_NS_HTTPMAIL "notes"
#define E2K_PR_STD_FOLDER_OUTBOX E2K_NS_HTTPMAIL "outbox"
#define E2K_PR_STD_FOLDER_SENDMSG E2K_NS_HTTPMAIL "sendmsg"
#define E2K_PR_STD_FOLDER_SENT_ITEMS E2K_NS_HTTPMAIL "sentitems"
#define E2K_PR_STD_FOLDER_TASKS E2K_NS_HTTPMAIL "tasks"
#define E2K_NS_MAILHEADER "urn:schemas:mailheader:"
#define E2K_PR_MAILHEADER_CC E2K_NS_MAILHEADER "cc"
#define E2K_PR_MAILHEADER_DATE E2K_NS_MAILHEADER "date"
#define E2K_PR_MAILHEADER_FROM E2K_NS_MAILHEADER "from"
#define E2K_PR_MAILHEADER_IMPORTANCE E2K_NS_MAILHEADER "importance"
#define E2K_PR_MAILHEADER_IN_REPLY_TO E2K_NS_MAILHEADER "in-reply-to"
#define E2K_PR_MAILHEADER_MESSAGE_ID E2K_NS_MAILHEADER "message-id"
#define E2K_PR_MAILHEADER_RECEIVED E2K_NS_MAILHEADER "received"
#define E2K_PR_MAILHEADER_REFERENCES E2K_NS_MAILHEADER "references"
#define E2K_PR_MAILHEADER_REPLY_BY E2K_NS_MAILHEADER "reply-by"
#define E2K_PR_MAILHEADER_SUBJECT E2K_NS_MAILHEADER "subject"
#define E2K_PR_MAILHEADER_THREAD_INDEX E2K_NS_MAILHEADER "thread-index"
#define E2K_PR_MAILHEADER_TO E2K_NS_MAILHEADER "to"
#define E2K_PR_MAILHEADER_COMPLETED E2K_NS_MAILHEADER "x-message-completed"
#define E2K_NS_SUBSCRIPTION "http://schemas.microsoft.com/Exchange/"
#define E2K_PR_SUBSCRIPTION_ID E2K_NS_SUBSCRIPTION "subscriptionID"
#define E2K_NS_EXCHANGE "http://schemas.microsoft.com/exchange/"
#define E2K_PR_EXCHANGE_MESSAGE_CLASS E2K_NS_EXCHANGE "outlookmessageclass"
#define E2K_PR_EXCHANGE_FOLDER_CLASS E2K_NS_EXCHANGE "outlookfolderclass"
#define E2K_PR_EXCHANGE_KEYWORDS E2K_NS_EXCHANGE "keywords-utf8"
#define E2K_PR_EXCHANGE_SD_BINARY E2K_NS_EXCHANGE "ntsecuritydescriptor"
#define E2K_PR_EXCHANGE_SD_XML E2K_NS_EXCHANGE "security/descriptor"
#define E2K_PR_EXCHANGE_TIMEZONE E2K_NS_EXCHANGE "timezone"
#define E2K_NS_REPL "http://schemas.microsoft.com/repl/"
#define E2K_PR_REPL_UID E2K_NS_REPL "repl-uid"
#define E2K_NS_SECURITY "http://schemas.microsoft.com/security/"
#define E2K_NS_TYPE "urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"
#define E2K_NS_MAPI "http://schemas.microsoft.com/mapi/"
#define E2K_PR_MAPI_COMMON_START E2K_NS_MAPI "commonstart"
#define E2K_PR_MAPI_COMMON_END E2K_NS_MAPI "commonend"
#define E2K_PR_MAPI_NO_AUTOARCHIVE E2K_NS_MAPI "agingdontageme"
#define E2K_PR_MAPI_PRIORITY E2K_NS_MAPI "priority"
#define E2K_PR_MAPI_SENSITIVITY E2K_NS_MAPI "sensitivity"
#define E2K_PR_MAPI_SIDE_EFFECTS E2K_NS_MAPI "sideeffects"
#define E2K_PR_MAPI_EMAIL_ENTRYID E2K_NS_MAPI "email1originalentryid"
#define E2K_PR_MAPI_EMAIL_ADDRTYPE E2K_NS_MAPI "email1addrtype"
#define E2K_PR_MAPI_EMAIL_ADDRESS E2K_NS_MAPI "email1emailaddress"
#define E2K_PR_MAPI_EMAIL_DISPLAY_NAME E2K_NS_MAPI "email1originaldisplayname"
#define E2K_PR_MAPI_EMAIL_2_ENTRYID E2K_NS_MAPI "email2originalentryid"
#define E2K_PR_MAPI_EMAIL_2_ADDRTYPE E2K_NS_MAPI "email2addrtype"
#define E2K_PR_MAPI_EMAIL_2_ADDRESS E2K_NS_MAPI "email2emailaddress"
#define E2K_PR_MAPI_EMAIL_2_DISPLAY_NAME E2K_NS_MAPI "email2originaldisplayname"
#define E2K_PR_MAPI_EMAIL_3_ENTRYID E2K_NS_MAPI "email3originalentryid"
#define E2K_PR_MAPI_EMAIL_3_ADDRTYPE E2K_NS_MAPI "email3addrtype"
#define E2K_PR_MAPI_EMAIL_3_ADDRESS E2K_NS_MAPI "email3emailaddress"
#define E2K_PR_MAPI_EMAIL_3_DISPLAY_NAME E2K_NS_MAPI "email3originaldisplayname"
#define E2K_PR_MAPI_EMAIL_LIST_TYPE E2K_NS_MAPI "emaillisttype"
#define E2K_PR_MAPI_EMAIL_ADDRESS_LIST E2K_NS_MAPI "emailaddresslist"
#define E2K_NS_MAPI_ID "http://schemas.microsoft.com/mapi/id/"
#define E2K_NS_OUTLOOK_APPOINTMENT E2K_NS_MAPI_ID "{00062002-0000-0000-C000-000000000046}/"
#define E2K_NS_OUTLOOK_TASK E2K_NS_MAPI_ID "{00062003-0000-0000-C000-000000000046}/"
#define E2K_PR_OUTLOOK_TASK_STATUS E2K_NS_OUTLOOK_TASK "0x00008101"
#define E2K_PR_OUTLOOK_TASK_PERCENT E2K_NS_OUTLOOK_TASK "0x00008102"
#define E2K_PR_OUTLOOK_TASK_TEAM_TASK E2K_NS_OUTLOOK_TASK "0x00008103"
#define E2K_PR_OUTLOOK_TASK_START_DT E2K_NS_OUTLOOK_TASK "0x00008104"
#define E2K_PR_OUTLOOK_TASK_DUE_DT E2K_NS_OUTLOOK_TASK "0x00008105"
#define E2K_PR_OUTLOOK_TASK_DONE_DT E2K_NS_OUTLOOK_TASK "0x0000810f"
#define E2K_PR_OUTLOOK_TASK_ACTUAL_WORK E2K_NS_OUTLOOK_TASK "0x00008110"
#define E2K_PR_OUTLOOK_TASK_TOTAL_WORK E2K_NS_OUTLOOK_TASK "0x00008111"
#define E2K_PR_OUTLOOK_TASK_IS_DONE E2K_NS_OUTLOOK_TASK "0x0000811c"
#define E2K_PR_OUTLOOK_TASK_OWNER E2K_NS_OUTLOOK_TASK "0x0000811f"
#define E2K_PR_OUTLOOK_TASK_RECURRING E2K_NS_OUTLOOK_TASK "0x00008126"
#define E2K_PR_OUTLOOK_TASK_ASSIGNMENT E2K_NS_OUTLOOK_TASK "0x00008129"
#define E2K_NS_OUTLOOK_CONTACT E2K_NS_MAPI_ID "{00062004-0000-0000-C000-000000000046}/"
#define E2K_PR_OUTLOOK_CONTACT_JOURNAL E2K_NS_OUTLOOK_CONTACT "0x00008025"
#define E2K_NS_OUTLOOK_COMMON E2K_NS_MAPI_ID "{00062008-0000-0000-C000-000000000046}/"
#define E2K_PR_OUTLOOK_COMMON_CONTACTS E2K_NS_OUTLOOK_COMMON "0x00008586"
#define E2K_NS_OUTLOOK_JOURNAL E2K_NS_MAPI_ID "{0006200A-0000-0000-C000-000000000046}/"
#define E2K_NS_OUTLOOK_STICKYNOTE E2K_NS_MAPI_ID "{0006200E-0000-0000-C000-000000000046}/"
#define E2K_PR_OUTLOOK_STICKYNOTE_COLOR E2K_NS_OUTLOOK_STICKYNOTE "0x00008b00"
#define E2K_PR_OUTLOOK_STICKYNOTE_WIDTH E2K_NS_OUTLOOK_STICKYNOTE "0x00008b02"
#define E2K_PR_OUTLOOK_STICKYNOTE_HEIGHT E2K_NS_OUTLOOK_STICKYNOTE "0x00008b03"
static const char *public_freebusy_props[] = {
PR_FREEBUSY_START_RANGE,
PR_FREEBUSY_END_RANGE,
PR_FREEBUSY_ALL_MONTHS,
PR_FREEBUSY_ALL_EVENTS,
PR_FREEBUSY_TENTATIVE_MONTHS,
PR_FREEBUSY_TENTATIVE_EVENTS,
PR_FREEBUSY_BUSY_MONTHS,
PR_FREEBUSY_BUSY_EVENTS,
PR_FREEBUSY_OOF_MONTHS,
PR_FREEBUSY_OOF_EVENTS
};
More information about the commits
mailing list