jmap | M. Loffredo |
Internet-Draft | IIT-CNR/Registro.it |
Intended status: Informational | R. Stepanek |
Expires: December 24, 2020 | FastMail |
June 22, 2020 |
JSContact: Converting from and to vCard
draft-loffredo-jmap-jscontact-vcard-03
This document provides informational guidance for converting the contact card defined by JSContact specification, namely JSCard, from and to vCard.
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."
This Internet-Draft will expire on December 24, 2020.
Copyright (c) 2020 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
The JSContact specification [draft-ietf-jmap-jscontact] has been defined to represent contact card information as a more efficient alternative to vCard [RFC6350] and its JSON-based version named jCard [RFC7095].
While new applications might adopt JSContact as their main format to exchange contact card data, they are likely to interoperate with services and clients that just support vCard/jCard. Similarly, existing contact data providers and consumers already using vCard/jCard might want to represent their data also according to the JSContact specification.
To facilitate this use cases, this document provides informational guidance about how to convert the card defined in JSContact, namely JSCard, from and to vCard.
JSContact and vCard have a lot of semantics in common, however some differences must be outlined:
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].
This section contains the mapping between vCard and JSCard. The vCard properties are grouped according to the categories defined by [RFC6350].
Where it is needed, the JCardGroup is taken into account.
In the following of this document, the vCard features, namely properties and parameters, are written in uppercase while the JSCard features are written in camel case.
The BEGIN and END properties don't have a direct match with a JSCard feature.
A SOURCE element is represented as a "Resource" object in the "online" array (Figure 1) whose "type" member is set to "uri" and "labels" map contains the entry <"source",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... SOURCE:http://directory.example.com/addressbooks/jdoe/Jean%20Dupont.vcf ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "source": true }, "value": "http://directory.example.com/addressbooks/jdoe/Jean%20Dupont.vcf" }, ... ], ... }
Figure 1: SOURCE mapping example
The KIND element is mapped onto the "kind" member (Figure 2). Allowed values are those, except "group", described in section 6.1.4 of [RFC6350] and extended with the values declared in [RFC6473] and [RFC6869]. A group of cards is represented through a JSCardGroup.
BEGIN:VCARD VERSION:4.0 ... KIND:individual ... END:VCARD { ... "kind": "individual", ... }
Figure 2: KIND mapping example
The XML property doesn't have a direct match with a JSCard feature.
All the FN elements are globally represented through the "fullName" member. The presence of more than one name is implicitly associated with the full name translations in various languages regardless of the presence of the ALTID parameter. Each translation corresponds to a different entry of the "localizations" map (Figure 3).
Both the N and NICKNAME elements are converted into equivalent items of the "name" array (Figure 3):
N component | "type" value |
---|---|
Honorific Prefixes | prefix |
Given Names | personal |
Family Names | surname |
Additional Names | additional |
Honorific Suffixes | suffix |
BEGIN:VCARD VERSION:4.0 ... FN:Mr. John Q. Public\, Esq. N:Public;John;Quinlan;Mr.;Esq. NICKNAME:Johnny ... END:VCARD { ... "fullName":{ "value": "Mr. John Q. Public, Esq." }, "name":[ { "value":"Mr.", "type": "prefix" }, { "value":"John", "type": "personal" }, { "value":"Public", "type": "surname" }, { "value":"Quinlan", "type": "additional" }, { "value":"Esq.", "type": "suffix" }, { "value":"Johnny", "type": "nickname" } ], ... }
Figure 3: FN, N, NICKNAME mapping example
A PHOTO element is represented as a "Resource" object in the "online" array (Figure 4) whose "type" member is set to "uri" and "labels" map contains the entry <"photo",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... PHOTO:http://www.example.com/pub/photos/jqpublic.gif ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "photo": true }, "value": "http://www.example.com/pub/photos/jqpublic.gif" }, ... ], ... }
Figure 4: PHOTO mapping example
The BDAY and ANNIVERSARY elements and the extensions BIRTHPLACE, DEATHDATE, DEATHPLACE described in [RFC6350] are represented as "Anniversary" objects included in the "anniversaries" array (Figure 5):
Both birth and death places are represented as instances of the "Address" object. The LANGUAGE parameter values of both BIRTHPLACE and DEATHPLACE elements are represented as corresponding entries of the "fullAddress.localizations" map.
BEGIN:VCARD VERSION:4.0 ... BDAY:19531015T231000Z BIRTHPLACE:Mail Drop: TNE QB\n123 Main Street\nAny Town, CA 91921-1234\nU.S.A. DEATHDATE:19960415 DEATHPLACE:4445 Courtright Street\nNew England, ND 58647\nU.S.A. ANNIVERSARY:19860201 ... END:VCARD { ... "anniversaries":[ { "type": "birth", "date": "19531015T231000Z", "place": { "fullAddress": { "value": "Mail Drop: TNE QB\n123 Main Street\nAny Town, CA 91921-1234\nU.S.A." } } }, { "type": "birth", "date": "19531015T231000Z", "place": { "fullAddress": { "value": "4445 Courtright Street\nNew England, ND 58647\nU.S.A." } } }, { "type": "other", "label": "marriage date", "date": "19860201" } ], ... }
Figure 5: BDAY, BIRTHPLACE, DEATHDATE, DEATHPLACE, ANNIVERSARY mapping example
TBD
An ADR element is represented as an "Address" object in the "addresses" array (Figure 6).
The ADR components are transformed into the "Address" members as reported in Table 2.
ADR component | Address member |
---|---|
p.o. box | postOfficeBox |
extended address | extension |
street address | street |
locality | locality |
region | region |
postal code | postcode |
country name | country |
The LABEL parameter is converted into the "fullAddress" member.
The PREF parameter is converted into the "isPreferred" member.
The GEO parameter is converted into the "coordinates" member.
The TZ parameter is converted into by the "timeZone" member.
The TYPE parameter is converted into the "context" member. The "home" value is replaced with the "private" value.
The LANGUAGE parameter values are represented as different entries of the "fullAddress.localizations" map.
The CC parameter defined by [RFC8605] is converted into the "countryCode" member.
BEGIN:VCARD VERSION:4.0 ... ADR;TYPE=work;CC=US:;;54321 Oak St;Reston;VA;20190;USA ADR;TYPE=home;CC=US:;;12345 Elm St;Reston;VA;20190;USA ... END:VCARD { ... "addresses": [ { "context": "work", "fullAddress": { "value": "54321 Oak St\nReston\nVA\n20190\nUSA" }, "street": "54321 Oak St", "locality": "Reston", "region": "VA", "country": "USA", "postcode": "20190", "countryCode": "US" }, { "context": "private", "fullAddress": { "value": "12345 Elm St\nReston\nVA\n20190\nUSA" }, "street": "12345 Elm St", "locality": "Reston", "region": "VA", "country": "USA", "postcode": "20190", "countryCode": "US" } ] ... }
Figure 6: ADR mapping example
A TEL element is represented as a "Resource" object in the "phones" array (Figure 7). The vCard "type-param-tel" values are mapped onto the "type" member values. Those vCard "type-param-tel" values that don't have a counterpart among the "type" member values are represented as entry keys of the "labels" map with the corresponding entry value set to true. The "type-param" values are are mapped onto the "context" member values. The "home" value is replaced with the "private" value.
The PREF parameter is mapped onto the "isPreferred" member.
BEGIN:VCARD VERSION:4.0 ... TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+1-555-555-5555;ext=5555 TEL;VALUE=uri;TYPE=home:tel:+33-01-23-45-67 ... END:VCARD { ... "phones":[ { "context": "private", "type": "voice", "value": "tel:+1-555-555-5555;ext=5555", "isPreferred": true }, { "context": "private", "value": "tel:+33-01-23-45-67" } ], ... }
Figure 7: TEL mapping example
An EMAIL element is represented as a "Resource" object in the "emails" array (Figure 8). The vCard "type-param" values are mapped onto the "context" member values. The "home" value is replaced with the "private" value.
The PREF parameter is mapped onto the "isPreferred" member.
BEGIN:VCARD VERSION:4.0 ... EMAIL;TYPE=work:jqpublic@xyz.example.com EMAIL;PREF=1:jane_doe@example.com ... END:VCARD { ... "emails":[ { "context": "work", "value": "jqpublic@xyz.example.com", }, { "context": "private", "value": "jane_doe@example.com" "isPreferred": true } ], ... }
Figure 8: EMAIL mapping example
An IMPP element is represented as a "Resource" object in the "online" array (Figure 9) whose "type" member is set to "username" and "labels" map contains the entry <"XMPP",true>.
In case of a contact card related to an acconunt on another online service, the entry key SHOULD be the canonical service name, including capitalisation (e.g. "Twitter", "Facebook", "Skype", "GitHub")
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... IMPP;PREF=1:xmpp:alice@example.com ... END:VCARD { ... "online":[ ... { "type": "username", "labels": { "XMPP": true }, "value": "alice@example.com" }, ... ], ... }
Figure 9: IMPP mapping example
A LANG element is represented through the "preferredContactLanguages" map (Figure 10): an entry for each language that may be used for contacting the entity associated with the JSCard. The entry keys correspond to the language tags, the corresponding entry values are arrays of "ContactLanguage" objects.
The TYPE and PREF parameters are mapped onto the "ContactLanguage" members "type" and "preference" respectively.
If both PREF and TYPE parameters are missing, the array of "ContactLanguage" objects MUST be empty.
BEGIN:VCARD VERSION:4.0 ... LANG;TYPE=work;PREF=1:en LANG;TYPE=work;PREF=2:fr LANG;TYPE=home:fr ... END:VCARD { ... "preferredContactLanguages" : { "en": [ { "type": "work", "preference": 1 } ], "fr": [ { "type": "work", "preference": 2 }, { "type": "home", } ] }, ... }
Figure 10: LANG mapping example
The GEO and TZ elements are not directly mapped into equivalent topmost JSCard members because the same information is represented through equivalent "Address" members.
The ALTID parameter is used for associating both GEO and TZ elements with the related address information. When the ALTID parameter is missing, the element should be associated with the first contact address.
A TITLE element is mapped onto a "LocalizedString" object included in the "jobTitle" array (Figure 11).
The ALTID parameter is used for for associating the language-dependent alternatives with a given element.
The LANGUAGE parameter values are represented as corresponding entries of the "localizations" map.
BEGIN:VCARD VERSION:4.0 ... TITLE:Research Scientist ... END:VCARD { ... "jobTitle":[ { "value": "Research Scientist" } ], ... }
Figure 11: TITLE mapping example
A ROLE element is mapped onto a "LocalizedString" object included in the "role" array (Figure 12).
The ALTID parameter is used for for associating the language-dependent alternatives with a given element.
The LANGUAGE parameter values are represented as corresponding entries of the "localizations" map.
BEGIN:VCARD VERSION:4.0 ... ROLE:Project Leader ... END:VCARD { ... "role":[ { "value": "Project Leader" } ], ... }
Figure 12: ROLE mapping example
A LOGO element is represented as a "Resource" object in the "online" array (Figure 13) whose "type" member is set to "uri" and "labels" map contains the entry <"logo",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... LOGO:http://www.example.com/pub/logos/abccorp.jpg ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "logo": true }, "value": "http://www.example.com/pub/logos/abccorp.jpg" }, ... ], ... }
Figure 13: LOGO mapping example
An ORG element is mapped onto a "LocalizedString" object included in the "organization" array (Figure 14). The organization name includes the organizational units if any.
The ALTID parameter is used for for associating the language-dependent alternatives with a given element.
The LANGUAGE parameter values are represented as corresponding entries of the "localizations" map.
BEGIN:VCARD VERSION:4.0 ... ORG:ABC\, Inc.;North American Division;Marketing ... END:VCARD { ... "organization":[ { "value": "ABC, Inc.;North American Division;Marketing" } ], ... }
Figure 14: ORG mapping example
According to the JSContact specification, a group of contact cards is represented through a JSCardGroup (Figure 15). The contact cards composing the group are included in the "cards" array. Therefore, the MEMBER element doesn't have a direct match with a JSCard feature.
BEGIN:VCARD VERSION:4.0 KIND:group FN:The Doe family MEMBER:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519 END:VCARD BEGIN:VCARD VERSION:4.0 FN:John Doe UID:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af END:VCARD BEGIN:VCARD VERSION:4.0 FN:Jane Doe UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519 END:VCARD { "uid": "urn:uuid:ab4310aa-fa43-11e9-8f0b-362b9e155667", "name": "The Doe family", "cards": [ { "name": { "fullName": { "value": "John Doe" } }, "uid": "urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af" }, { "name": { "fullName": { "value": "Jane Doe" } }, "uid": "urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519f" } ] }
Figure 15: Group example
All the RELATED elements are globally converted into the "relatedTo" map (Figure 16): an entry for each entity the entity described by the JSCard is associated with. The map keys are the "uid" values of the associated cards.
Each map value is a "Relation" object including only the "relation" member represented as a set of relation types described in section 6.6.6 of [RFC6350].
If the relation type is unspecified, the "relation" is empty.
BEGIN:VCARD VERSION:4.0 ... RELATED;TYPE=friend:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 RELATED;TYPE=contact:http://example.com/directory/jdoe.vcf RELATED;VALUE=text:Please contact my assistant Jane Doe for any inquiries. ... END:VCARD { ... "relatedTo":{ { "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6": { "relation": { "friend": true } } }, { "http://example.com/directory/jdoe.vcf": { "relation": { "contact": true } } }, { "Please contact my assistant Jane Doe for any inquiries.": { "relation": { } } } } ... }
Figure 16: RELATED mapping example
A CONTACT-URI element defined by [RFC8605] is represented as a "Resource" object of the "online" array (Figure 17) whose "type" member is set to "uri" and "labels" map contains the entry <"contact-uri",true>.
The PREF parameter is mapped onto the "isPreferred" member.
BEGIN:VCARD VERSION:4.0 ... CONTACT-URI;PREF=1:mailto:contact@example.com ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "contact-uri": true }, "value": "mailto:contact@example.com", "isPreferred": true }, ... ], ... }
Figure 17: CONTACT-URI mapping example
An EXPERTISE element defined by [RFC6715] is represented as a "PersonalInformation" object in the "personalInfo" array (Figure 18). The "type" member is set to "expertise".
The LEVEL parameter is mapped onto the "level" member with following mapping:
The INDEX parameter is represented as the index of the expertise among the declared expertises.
BEGIN:VCARD VERSION:4.0 ... EXPERTISE;LEVEL=beginner;INDEX=2:chinese literature EXPERTISE;INDEX=1;LEVEL=expert:chemistry ... END:VCARD { ... "personalInfo":[ ... { "type": "expertise", "value": "chemistry", "level": "high" }, { "type": "expertise", "value": "chinese literature", "level": "low" } ... ] ... }
Figure 18: EXPERTISE mapping example
An HOBBY element defined by [RFC6715] is represented as a "PersonalInformation" object in the "personalInfo" array (Figure 19). The "type" member is set to "hobby".
The LEVEL parameter is mapped onto the "level" member with a direct mapping.
The INDEX parameter is represented as the index of the hobby among the declared hobbies.
BEGIN:VCARD VERSION:4.0 ... HOBBY;INDEX=1;LEVEL=high:reading HOBBY;INDEX=2;LEVEL=high:sewing ... END:VCARD { ... "personalInfo":[ ... { "type": "hobby", "value": "reading", "level": "high" }, { "type": "hobby", "value": "sewing", "level": "high" } ... ] ... }
Figure 19: HOBBY mapping example
An INTEREST element defined by [RFC6715] is represented as a "PersonalInformation" object in the "personalInfo" array (Figure 20). The "type" member is set to "interest".
The LEVEL parameter is mapped onto the "level" member with a direct mapping.
The INDEX parameter is represented as the index of the interest among the declared interests.
BEGIN:VCARD VERSION:4.0 ... INTEREST;INDEX=1;LEVEL=medium:r&b music INTEREST;INDEX=2;LEVEL=high:rock ’n’ roll music ... END:VCARD { ... "personalInfo":[ ... { "type": "interest", "value": "r&b music", "level": "medium" }, { "type": "interest", "value": "rock ’n’ roll music", "level": "high" } ... ] ... }
Figure 20: INTEREST mapping example
An ORG-DIRECTORY element is represented as a "Resource" object in the "online" array (Figure 21) whose "type" member is set to "uri" and "labels" map contains the entry <"org-directory",true>.
The PREF parameter is mapped onto the "isPreferred" member.
The INDEX parameter is represented as the index of the directory among the online resources with the "org-directory" key in the "labels" map.
BEGIN:VCARD VERSION:4.0 ... ORG-DIRECTORY;INDEX=1:http://directory.mycompany.example.com ORG-DIRECTORY;PREF=1:ldap://ldap.tech.example/o=Example%20Tech,ou=Engineering ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "org-directory": true }, "value": "http://directory.mycompany.example.com" }, { "type": "uri", "labels": { "org-directory": true }, "value": "ldap://ldap.tech.example/o=Example%20Tech,ou=Engineering", "isPreferred": true }, ... ], ... }
Figure 21: ORG-DIRECTORY mapping example
A CATEGORIES element is converted into an object in the "categories" array (Figure 22).
BEGIN:VCARD VERSION:4.0 ... CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY ... END:VCARD { ... "categories":[ "INTERNET", "IETF", "INDUSTRY", "INFORMATION TECHNOLOGY" ] ... }
Figure 22: CATEGORIES mapping example
A NOTE element is mapped onto a "LocalizedString" object included in the "notes" array (Figure 23).
The ALTID parameter is used for associating the language-dependent alternatives with a given element.
The LANGUAGE parameter values are represented as corresponding entries of the "localizations" map.
BEGIN:VCARD VERSION:4.0 ... NOTE:This fax number is operational 0800 to 1715 EST\, Mon-Fri. ... END:VCARD { ... "notes":[ { "value": "This fax number is operational 0800 to 1715 EST, Mon-Fri." } ] ... }
Figure 23: NOTE mapping example
The PRODID element is converted into the "prodId" member (Figure 24).
BEGIN:VCARD VERSION:4.0 ... PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN ... END:VCARD { ... "prodId": "-//ONLINE DIRECTORY//NONSGML Version 1//EN" ... }
Figure 24: PRODID mapping example
The REV element is transformed into the "updated" member (Figure 25).
BEGIN:VCARD VERSION:4.0 ... REV:19951031T222710Z ... END:VCARD { ... "updated": "19951031T222710Z" ... }
Figure 25: REV mapping example
A SOUND element is represented as a "Resource" object in the "online" array (Figure 26) whose "type" member is set to "uri" and "labels" map contains the entry <"sound",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... SOUND:CID:JOHNQPUBLIC.part8.19960229T080000.xyzMail@example.com ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "sound": true }, "value": "CID:JOHNQPUBLIC.part8.19960229T080000.xyzMail@example.com" }, ... ], ... }
Figure 26: SOUND mapping example
The UID element corresponds to the "uid" member (Figure 27).
BEGIN:VCARD VERSION:4.0 ... UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 ... END:VCARD { ... "uid": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6" ... }
Figure 27: UID mapping example
TBD
An URL element is represented as a "Resource" object in the "online" array (Figure 28) whose "type" member is set to "uri" and "labels" map contains the entry <"url",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... URL:http://example.org/restaurant.french/~chezchic.html ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "url": true }, "value": "http://example.org/restaurant.french/~chezchic.html" }, ... ], ... }
Figure 28: URL mapping example
The VERSION property doesn't have a direct match with a JSCard feature.
A KEY element is represented as a "Resource" object in the "online" array (Figure 29) whose "type" member is set to "uri" and "labels" map contains the entry <"key",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... KEY:http://www.example.com/keys/jdoe.cer ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "key": true }, "value": "http://www.example.com/keys/jdoe.cer" }, ... ], ... }
Figure 29: KEY mapping example
A FBURL element is represented as a "Resource" object of the "online" array (Figure 30) whose "type" member is set to "uri" and "labels" map contains the entry <"fburl",true>.
The PREF and MEDIATYPE parameters are mapped ontoy the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... FBURL;PREF=1:http://www.example.com/busy/janedoe FBURL;MEDIATYPE=text/calendar:ftp://example.com/busy/project-a.ifb ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "fburl": true }, "value": "http://www.example.com/busy/janedoe", "isPreferred": true }, { "type": "uri", "labels": { "fburl": true }, "value": "ftp://example.com/busy/project-a.ifb", "mediaType": "text/calendar" }, ... ], ... }
Figure 30: FBURL mapping example
A CALADRURI element is represented as a "Resource" object of the "online" array (Figure 31) whose "type" member is set to "uri" and "labels" map contains the entry <"caladruri",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... CALADRURI;PREF=1:mailto:janedoe@example.com CALADRURI:http://example.com/calendar/jdoe ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "caladruri": true }, "value": "mailto:janedoe@example.com", "isPreferred": true }, { "type": "uri", "labels": { "caladruri": true }, "value": "http://example.com/calendar/jdoe" }, ... ], ... }
Figure 31: CALADRURI mapping example
A CALURI element is represented as a "Resource" object of the "online" array (Figure 32) whose "type" member is set to "uri" and "labels" map contains the entry <"caluri",true>.
The PREF and MEDIATYPE parameters are mapped onto the "isPreferred" and "mediaType" members respectively.
BEGIN:VCARD VERSION:4.0 ... CALURI;PREF=1:http://cal.example.com/calA CALURI;MEDIATYPE=text/calendar:ftp://ftp.example.com/calA.ics ... END:VCARD { ... "online":[ ... { "type": "uri", "labels": { "caluri": true }, "value": "http://cal.example.com/calA", "isPreferred": true }, { "type": "uri", "labels": { "caluri": true }, "value": "ftp://ftp.example.com/calA.ics", "mediaType": "text/calendar" }, ... ], ... }
Figure 32: CALURI mapping example
If an extended property is a resource, JSCard already allows to represent it by setting the "type" member to "other" and specifying a value for the "labels" map.
Any other property supporting a custom feature MAY be added and its name MUST be prefixed with a specific domain name to avoid conflict, e.g. "example.com/customprop".
While converting a vCard into a JSCard, only the topmost "uid" member is required.
The "preferredContactMethod" member doesn't match any vCard element.
This document has no actions for IANA.
This document doesn't report any security consideration.
[draft-ietf-jmap-jscontact] | "JSContact: A JSON representation of contact data" |