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