ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
Sabre\VObject\VCardConverter Class Reference

This utility converts vcards from one version to another. More...

+ Collaboration diagram for Sabre\VObject\VCardConverter:

Public Member Functions

 convert (Component\VCard $input, $targetVersion)
 Converts a vCard object to a new version. More...
 

Protected Member Functions

 convertProperty (Component\VCard $input, Component\VCard $output, Property $property, $targetVersion)
 Handles conversion of a single property. More...
 
 convertBinaryToUri (Component\VCard $output, Property\Binary $newProperty, array &$parameters)
 Converts a BINARY property to a URI property. More...
 
 convertUriToBinary (Component\VCard $output, Property\Uri $newProperty)
 Converts a URI property to a BINARY property. More...
 
 convertParameters40 (Property $newProperty, array $parameters)
 Adds parameters to a new property for vCard 4.0. More...
 
 convertParameters30 (Property $newProperty, array $parameters)
 Adds parameters to a new property for vCard 3.0. More...
 

Detailed Description

This utility converts vcards from one version to another.

Author
Evert Pot (http://evertpot.com/) @license http://sabre.io/license/ Modified BSD License

Definition at line 12 of file VCardConverter.php.

Member Function Documentation

◆ convert()

Sabre\VObject\VCardConverter::convert ( Component\VCard  $input,
  $targetVersion 
)

Converts a vCard object to a new version.

targetVersion must be one of: Document::VCARD21 Document::VCARD30 Document::VCARD40

Currently only 3.0 and 4.0 as input and output versions.

2.1 has some minor support for the input version, it's incomplete at the moment though.

If input and output version are identical, a clone is returned.

Parameters
Component\VCard$input
int$targetVersion

Definition at line 32 of file VCardConverter.php.

32 {
33
34 $inputVersion = $input->getDocumentType();
35 if ($inputVersion === $targetVersion) {
36 return clone $input;
37 }
38
39 if (!in_array($inputVersion, [Document::VCARD21, Document::VCARD30, Document::VCARD40])) {
40 throw new \InvalidArgumentException('Only vCard 2.1, 3.0 and 4.0 are supported for the input data');
41 }
42 if (!in_array($targetVersion, [Document::VCARD30, Document::VCARD40])) {
43 throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version');
44 }
45
46 $newVersion = $targetVersion === Document::VCARD40 ? '4.0' : '3.0';
47
48 $output = new Component\VCard([
49 'VERSION' => $newVersion,
50 ]);
51
52 // We might have generated a default UID. Remove it!
53 unset($output->UID);
54
55 foreach ($input->children() as $property) {
56
57 $this->convertProperty($input, $output, $property, $targetVersion);
58
59 }
60
61 return $output;
62
63 }
const VCARD30
vCard 3.0.
Definition: Document.php:44
const VCARD21
vCard 2.1.
Definition: Document.php:39
const VCARD40
vCard 4.0.
Definition: Document.php:49
convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion)
Handles conversion of a single property.
foreach($paths as $path) if($argc< 3) $input

References Sabre\VObject\$input, Sabre\VObject\$output, Sabre\VObject\VCardConverter\convertProperty(), Sabre\VObject\Document\VCARD21, Sabre\VObject\Document\VCARD30, and Sabre\VObject\Document\VCARD40.

+ Here is the call graph for this function:

◆ convertBinaryToUri()

Sabre\VObject\VCardConverter::convertBinaryToUri ( Component\VCard  $output,
Property\Binary  $newProperty,
array &  $parameters 
)
protected

Converts a BINARY property to a URI property.

vCard 4.0 no longer supports BINARY properties.

Parameters
Component\VCard$output
Property\Uri$propertyThe input property.
$parametersList of parameters that will eventually be added to the new property.
Returns
Property\Uri

Definition at line 276 of file VCardConverter.php.

276 {
277
278 $value = $newProperty->getValue();
279 $newProperty = $output->createProperty(
280 $newProperty->name,
281 null, // no value
282 [], // no parameters yet
283 'URI' // Forcing the BINARY type
284 );
285
286 $mimeType = 'application/octet-stream';
287
288 // See if we can find a better mimetype.
289 if (isset($parameters['TYPE'])) {
290
291 $newTypes = [];
292 foreach ($parameters['TYPE']->getParts() as $typePart) {
293 if (in_array(
294 strtoupper($typePart),
295 ['JPEG', 'PNG', 'GIF']
296 )) {
297 $mimeType = 'image/' . strtolower($typePart);
298 } else {
299 $newTypes[] = $typePart;
300 }
301 }
302
303 // If there were any parameters we're not converting to a
304 // mime-type, we need to keep them.
305 if ($newTypes) {
306 $parameters['TYPE']->setParts($newTypes);
307 } else {
308 unset($parameters['TYPE']);
309 }
310
311 }
312
313 $newProperty->setValue('data:' . $mimeType . ';base64,' . base64_encode($value));
314 return $newProperty;
315
316 }

References Sabre\VObject\$output.

Referenced by Sabre\VObject\VCardConverter\convertProperty().

+ Here is the caller graph for this function:

◆ convertParameters30()

Sabre\VObject\VCardConverter::convertParameters30 ( Property  $newProperty,
array  $parameters 
)
protected

Adds parameters to a new property for vCard 3.0.

Parameters
Property$newProperty
array$parameters
Returns
void

Definition at line 429 of file VCardConverter.php.

429 {
430
431 // Adding all parameters.
432 foreach ($parameters as $param) {
433
434 // vCard 2.1 allowed parameters with no name
435 if ($param->noName) $param->noName = false;
436
437 switch ($param->name) {
438
439 case 'ENCODING' :
440 // This value only existed in vCard 2.1, and should be
441 // removed for anything else.
442 if (strtoupper($param->getValue()) !== 'QUOTED-PRINTABLE') {
443 $newProperty->add($param->name, $param->getParts());
444 }
445 break;
446
447 /*
448 * Converting PREF=1 to TYPE=PREF.
449 *
450 * Any other PREF numbers we'll drop.
451 */
452 case 'PREF' :
453 if ($param->getValue() == '1') {
454 $newProperty->add('TYPE', 'PREF');
455 }
456 break;
457
458 default :
459 $newProperty->add($param->name, $param->getParts());
460 break;
461
462 }
463
464 }
465
466 }

References Sabre\VObject\Property\add().

+ Here is the call graph for this function:

◆ convertParameters40()

Sabre\VObject\VCardConverter::convertParameters40 ( Property  $newProperty,
array  $parameters 
)
protected

Adds parameters to a new property for vCard 4.0.

Parameters
Property$newProperty
array$parameters
Returns
void

Definition at line 383 of file VCardConverter.php.

383 {
384
385 // Adding all parameters.
386 foreach ($parameters as $param) {
387
388 // vCard 2.1 allowed parameters with no name
389 if ($param->noName) $param->noName = false;
390
391 switch ($param->name) {
392
393 // We need to see if there's any TYPE=PREF, because in vCard 4
394 // that's now PREF=1.
395 case 'TYPE' :
396 foreach ($param->getParts() as $paramPart) {
397
398 if (strtoupper($paramPart) === 'PREF') {
399 $newProperty->add('PREF', '1');
400 } else {
401 $newProperty->add($param->name, $paramPart);
402 }
403
404 }
405 break;
406 // These no longer exist in vCard 4
407 case 'ENCODING' :
408 case 'CHARSET' :
409 break;
410
411 default :
412 $newProperty->add($param->name, $param->getParts());
413 break;
414
415 }
416
417 }
418
419 }

References Sabre\VObject\Property\add().

+ Here is the call graph for this function:

◆ convertProperty()

Sabre\VObject\VCardConverter::convertProperty ( Component\VCard  $input,
Component\VCard  $output,
Property  $property,
  $targetVersion 
)
protected

Handles conversion of a single property.

Parameters
Component\VCard$input
Component\VCard$output
Property$property
int$targetVersion
Returns
void

Definition at line 75 of file VCardConverter.php.

75 {
76
77 // Skipping these, those are automatically added.
78 if (in_array($property->name, ['VERSION', 'PRODID'])) {
79 return;
80 }
81
82 $parameters = $property->parameters();
83 $valueType = null;
84 if (isset($parameters['VALUE'])) {
85 $valueType = $parameters['VALUE']->getValue();
86 unset($parameters['VALUE']);
87 }
88 if (!$valueType) {
89 $valueType = $property->getValueType();
90 }
91 $newProperty = $output->createProperty(
92 $property->name,
93 $property->getParts(),
94 [], // parameters will get added a bit later.
95 $valueType
96 );
97
98
99 if ($targetVersion === Document::VCARD30) {
100
101 if ($property instanceof Property\Uri && in_array($property->name, ['PHOTO', 'LOGO', 'SOUND'])) {
102
103 $newProperty = $this->convertUriToBinary($output, $newProperty);
104
105 } elseif ($property instanceof Property\VCard\DateAndOrTime) {
106
107 // In vCard 4, the birth year may be optional. This is not the
108 // case for vCard 3. Apple has a workaround for this that
109 // allows applications that support Apple's extension still
110 // omit birthyears in vCard 3, but applications that do not
111 // support this, will just use a random birthyear. We're
112 // choosing 1604 for the birthyear, because that's what apple
113 // uses.
114 $parts = DateTimeParser::parseVCardDateTime($property->getValue());
115 if (is_null($parts['year'])) {
116 $newValue = '1604-' . $parts['month'] . '-' . $parts['date'];
117 $newProperty->setValue($newValue);
118 $newProperty['X-APPLE-OMIT-YEAR'] = '1604';
119 }
120
121 if ($newProperty->name == 'ANNIVERSARY') {
122 // Microsoft non-standard anniversary
123 $newProperty->name = 'X-ANNIVERSARY';
124
125 // We also need to add a new apple property for the same
126 // purpose. This apple property needs a 'label' in the same
127 // group, so we first need to find a groupname that doesn't
128 // exist yet.
129 $x = 1;
130 while ($output->select('ITEM' . $x . '.')) {
131 $x++;
132 }
133 $output->add('ITEM' . $x . '.X-ABDATE', $newProperty->getValue(), ['VALUE' => 'DATE-AND-OR-TIME']);
134 $output->add('ITEM' . $x . '.X-ABLABEL', '_$!<Anniversary>!$_');
135 }
136
137 } elseif ($property->name === 'KIND') {
138
139 switch (strtolower($property->getValue())) {
140 case 'org' :
141 // vCard 3.0 does not have an equivalent to KIND:ORG,
142 // but apple has an extension that means the same
143 // thing.
144 $newProperty = $output->createProperty('X-ABSHOWAS', 'COMPANY');
145 break;
146
147 case 'individual' :
148 // Individual is implicit, so we skip it.
149 return;
150
151 case 'group' :
152 // OS X addressbook property
153 $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND', 'GROUP');
154 break;
155 }
156
157
158 }
159
160 } elseif ($targetVersion === Document::VCARD40) {
161
162 // These properties were removed in vCard 4.0
163 if (in_array($property->name, ['NAME', 'MAILER', 'LABEL', 'CLASS'])) {
164 return;
165 }
166
167 if ($property instanceof Property\Binary) {
168
169 $newProperty = $this->convertBinaryToUri($output, $newProperty, $parameters);
170
171 } elseif ($property instanceof Property\VCard\DateAndOrTime && isset($parameters['X-APPLE-OMIT-YEAR'])) {
172
173 // If a property such as BDAY contained 'X-APPLE-OMIT-YEAR',
174 // then we're stripping the year from the vcard 4 value.
175 $parts = DateTimeParser::parseVCardDateTime($property->getValue());
176 if ($parts['year'] === $property['X-APPLE-OMIT-YEAR']->getValue()) {
177 $newValue = '--' . $parts['month'] . '-' . $parts['date'];
178 $newProperty->setValue($newValue);
179 }
180
181 // Regardless if the year matched or not, we do need to strip
182 // X-APPLE-OMIT-YEAR.
183 unset($parameters['X-APPLE-OMIT-YEAR']);
184
185 }
186 switch ($property->name) {
187 case 'X-ABSHOWAS' :
188 if (strtoupper($property->getValue()) === 'COMPANY') {
189 $newProperty = $output->createProperty('KIND', 'ORG');
190 }
191 break;
192 case 'X-ADDRESSBOOKSERVER-KIND' :
193 if (strtoupper($property->getValue()) === 'GROUP') {
194 $newProperty = $output->createProperty('KIND', 'GROUP');
195 }
196 break;
197 case 'X-ANNIVERSARY' :
198 $newProperty->name = 'ANNIVERSARY';
199 // If we already have an anniversary property with the same
200 // value, ignore.
201 foreach ($output->select('ANNIVERSARY') as $anniversary) {
202 if ($anniversary->getValue() === $newProperty->getValue()) {
203 return;
204 }
205 }
206 break;
207 case 'X-ABDATE' :
208 // Find out what the label was, if it exists.
209 if (!$property->group) {
210 break;
211 }
212 $label = $input->{$property->group . '.X-ABLABEL'};
213
214 // We only support converting anniversaries.
215 if (!$label || $label->getValue() !== '_$!<Anniversary>!$_') {
216 break;
217 }
218
219 // If we already have an anniversary property with the same
220 // value, ignore.
221 foreach ($output->select('ANNIVERSARY') as $anniversary) {
222 if ($anniversary->getValue() === $newProperty->getValue()) {
223 return;
224 }
225 }
226 $newProperty->name = 'ANNIVERSARY';
227 break;
228 // Apple's per-property label system.
229 case 'X-ABLABEL' :
230 if ($newProperty->getValue() === '_$!<Anniversary>!$_') {
231 // We can safely remove these, as they are converted to
232 // ANNIVERSARY properties.
233 return;
234 }
235 break;
236
237 }
238
239 }
240
241 // set property group
242 $newProperty->group = $property->group;
243
244 if ($targetVersion === Document::VCARD40) {
245 $this->convertParameters40($newProperty, $parameters);
246 } else {
247 $this->convertParameters30($newProperty, $parameters);
248 }
249
250 // Lastly, we need to see if there's a need for a VALUE parameter.
251 //
252 // We can do that by instantating a empty property with that name, and
253 // seeing if the default valueType is identical to the current one.
254 $tempProperty = $output->createProperty($newProperty->name);
255 if ($tempProperty->getValueType() !== $newProperty->getValueType()) {
256 $newProperty['VALUE'] = $newProperty->getValueType();
257 }
258
259 $output->add($newProperty);
260
261
262 }
static parseVCardDateTime($date)
This method parses a vCard date and or time value.
convertUriToBinary(Component\VCard $output, Property\Uri $newProperty)
Converts a URI property to a BINARY property.
convertParameters40(Property $newProperty, array $parameters)
Adds parameters to a new property for vCard 4.0.
convertBinaryToUri(Component\VCard $output, Property\Binary $newProperty, array &$parameters)
Converts a BINARY property to a URI property.
convertParameters30(Property $newProperty, array $parameters)
Adds parameters to a new property for vCard 3.0.
$x
Definition: complexTest.php:9

References Sabre\VObject\$input, Sabre\VObject\$output, $x, Sabre\VObject\VCardConverter\convertBinaryToUri(), Sabre\VObject\VCardConverter\convertUriToBinary(), Sabre\VObject\Property\getParts(), Sabre\VObject\Property\getValue(), Sabre\VObject\Property\getValueType(), Sabre\VObject\Property\parameters(), Sabre\VObject\DateTimeParser\parseVCardDateTime(), Sabre\VObject\Document\VCARD30, and Sabre\VObject\Document\VCARD40.

Referenced by Sabre\VObject\VCardConverter\convert().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ convertUriToBinary()

Sabre\VObject\VCardConverter::convertUriToBinary ( Component\VCard  $output,
Property\Uri  $newProperty 
)
protected

Converts a URI property to a BINARY property.

In vCard 4.0 attachments are encoded as data: uri. Even though these may be valid in vCard 3.0 as well, we should convert those to BINARY if possible, to improve compatibility.

Parameters
Component\VCard$output
Property\Uri$propertyThe input property.
Returns
Property\Binary|null

Definition at line 330 of file VCardConverter.php.

330 {
331
332 $value = $newProperty->getValue();
333
334 // Only converting data: uris
335 if (substr($value, 0, 5) !== 'data:') {
336 return $newProperty;
337 }
338
339 $newProperty = $output->createProperty(
340 $newProperty->name,
341 null, // no value
342 [], // no parameters yet
343 'BINARY'
344 );
345
346 $mimeType = substr($value, 5, strpos($value, ',') - 5);
347 if (strpos($mimeType, ';')) {
348 $mimeType = substr($mimeType, 0, strpos($mimeType, ';'));
349 $newProperty->setValue(base64_decode(substr($value, strpos($value, ',') + 1)));
350 } else {
351 $newProperty->setValue(substr($value, strpos($value, ',') + 1));
352 }
353 unset($value);
354
355 $newProperty['ENCODING'] = 'b';
356 switch ($mimeType) {
357
358 case 'image/jpeg' :
359 $newProperty['TYPE'] = 'JPEG';
360 break;
361 case 'image/png' :
362 $newProperty['TYPE'] = 'PNG';
363 break;
364 case 'image/gif' :
365 $newProperty['TYPE'] = 'GIF';
366 break;
367
368 }
369
370
371 return $newProperty;
372
373 }

References Sabre\VObject\$output.

Referenced by Sabre\VObject\VCardConverter\convertProperty().

+ Here is the caller graph for this function:

The documentation for this class was generated from the following file: