From ea2d01b1f6a9326e53fc85b7667841ebf02cd259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Wed, 22 Jul 2009 20:31:15 +0000 Subject: [PATCH] Reorganized the vCard parser to assign to datebase columns with to following priciples 1. Most qualified field matches EMAIL;INTERNET;WORK wins against EMAIL;INTERNET 2. First field wins (if vCard contains same field twice) --- .../inc/class.addressbook_vcal.inc.php | 116 ++++++++++-------- 1 file changed, 65 insertions(+), 51 deletions(-) diff --git a/addressbook/inc/class.addressbook_vcal.inc.php b/addressbook/inc/class.addressbook_vcal.inc.php index a8b52311b5..73c8d8f015 100644 --- a/addressbook/inc/class.addressbook_vcal.inc.php +++ b/addressbook/inc/class.addressbook_vcal.inc.php @@ -1043,8 +1043,10 @@ class addressbook_vcal extends addressbook_bo $pname = strtoupper($pname); $vcardRow['uparams'][$pname] = $params; } - ksort($vcardRow['uparams']); + + // expand 3.0 TYPE paramters to 2.1 qualifiers + $vcardRow['tparams'] = array(); foreach ($vcardRow['uparams'] as $pname => $params) { switch ($pname) @@ -1057,7 +1059,6 @@ class addressbook_vcal extends addressbook_bo { $rowTypes[] = strtoupper($param); } - sort($rowTypes); } else { @@ -1067,33 +1068,42 @@ class addressbook_vcal extends addressbook_bo { switch ($type) { + + case 'OTHER': + case 'WORK': + case 'HOME': + $vcardRow['tparams'][$type] = ''; + break; + case 'CELL': case 'PAGER': case 'FAX': case 'VOICE': - case 'OTHER': - case 'CELL': - case 'WORK': - case 'HOME': - $rowName .= ';' . $type; - break; + case 'CAR': case 'PREF': + case 'X-CUSTOMLABEL-CAR': if ($vcardRow['name'] == 'TEL') { - $pref_tel = $key; + $vcardRow['tparams'][$type] = ''; } - break; - case 'CAR': - case 'X-CUSTOMLABEL-CAR': - $rowName = 'TEL;CAR'; - break; default: break; } } break; - //case 'INTERNET': + default: + break; + } + } + + $vcardRow['uparams'] += $vcardRow['tparams']; + ksort($vcardRow['uparams']); + + foreach ($vcardRow['uparams'] as $pname => $params) + { + switch ($pname) + { case 'PREF': - if (strtoupper($vcardRow['name']) == 'TEL' && !$pref_tel) + if ($rowName == 'TEL' && !$pref_tel) { $pref_tel = $key; } @@ -1109,7 +1119,10 @@ class addressbook_vcal extends addressbook_bo break; case 'CAR': case 'X-CUSTOMLABEL-CAR': - $rowName = 'TEL;CAR'; + if ($rowName == 'TEL') + { + $rowName = 'TEL;CAR'; + } break; default: if (strpos($pname, 'X-FUNAMBOL-') === 0) @@ -1143,11 +1156,11 @@ class addressbook_vcal extends addressbook_bo $rowName = 'URL;X-egw-Ref' . $url++; } - $rowNames[$rowName] = $key; + $rowNames[$key] = $rowName; } - #error_log(print_r($rowNames, true)); + //error_log(print_r($rowNames, true)); // All rowNames of the vCard are now concatenated with their qualifiers. // If qualifiers are missing we apply a default strategy. @@ -1156,50 +1169,52 @@ class addressbook_vcal extends addressbook_bo $finalRowNames = array(); - foreach ($rowNames as $rowName => $vcardKey) + foreach ($rowNames as $vcardKey => $rowName) { switch($rowName) { + case 'VERSION': + break; case 'ADR': - if (!isset($rowNames[$rowName . ';WORK']) - && !isset($finalRowNames[$rowName . ';WORK'])) + if (!in_array('ADR;WORK', $rowNames) + && !isset($finalRowNames['ADR;WORK'])) { - $finalRowNames[$rowName . ';WORK'] = $vcardKey; + $finalRowNames['ADR;WORK'] = $vcardKey; } - elseif (!isset($rowNames[$rowName . ';HOME']) - && !isset($finalRowNames[$rowName . ';HOME'])) + elseif (!in_array('ADR;HOME', $rowNames) + && !isset($finalRowNames['ADR;HOME'])) { - $finalRowNames[$rowName . ';HOME'] = $vcardKey; + $finalRowNames['ADR;HOME'] = $vcardKey; } break; case 'TEL;FAX': - if (!isset($rowNames['TEL;FAX;WORK']) + if (!in_array('TEL;FAX;WORK', $rowNames) && !isset($finalRowNames['TEL;FAX;WORK'])) { $finalRowNames['TEL;FAX;WORK'] = $vcardKey; } - elseif (!isset($rowNames['TEL;FAX;HOME']) + elseif (!in_array('TEL;FAX;HOME', $rowNames) && !isset($finalRowNames['TEL;FAX;HOME'])) { $finalRowNames['TEL;FAX;HOME'] = $vcardKey; } break; case 'TEL;WORK': - if (!isset($rowNames['TEL;VOICE;WORK']) + if (!in_array('TEL;VOICE;WORK', $rowNames) && !isset($finalRowNames['TEL;VOICE;WORK'])) { $finalRowNames['TEL;VOICE;WORK'] = $vcardKey; } break; case 'TEL;HOME': - if (!isset($rowNames['TEL;HOME;VOICE']) + if (!in_array('TEL;HOME;VOICE', $rowNames) && !isset($finalRowNames['TEL;HOME;VOICE'])) { $finalRowNames['TEL;HOME;VOICE'] = $vcardKey; } break; case 'TEL;OTHER': - if (!isset($rowNames['TEL;OTHER;VOICE']) + if (!in_array('TEL;OTHER;VOICE', $rowNames) && !isset($finalRowNames['TEL;OTHER;VOICE'])) { $finalRowNames['TEL;OTHER;VOICE'] = $vcardKey; @@ -1214,77 +1229,78 @@ class addressbook_vcal extends addressbook_bo } break; case 'TEL;X-egw-Ref1': - if (!isset($rowNames['TEL;VOICE;WORK']) - && !isset($rowNames['TEL;WORK']) + if (!in_array('TEL;VOICE;WORK', $rowNames) + && !in_array('TEL;WORK', $rowNames) && !isset($finalRowNames['TEL;VOICE;WORK'])) { $finalRowNames['TEL;VOICE;WORK'] = $vcardKey; break; } case 'TEL;X-egw-Ref2': - if (!isset($rowNames['TEL;HOME;VOICE']) - && !isset($rowNames['TEL;HOME']) + if (!in_array('TEL;HOME;VOICE', $rowNames) + && !in_array('TEL;HOME', $rowNames) && !isset($finalRowNames['TEL;HOME;VOICE'])) { $finalRowNames['TEL;HOME;VOICE'] = $vcardKey; } break; case 'TEL;CELL;X-egw-Ref1': - if (!isset($rowNames['TEL;CELL;WORK']) + if (!in_array('TEL;CELL;WORK', $rowNames) && !isset($finalRowNames['TEL;CELL;WORK'])) { $finalRowNames['TEL;CELL;WORK'] = $vcardKey; break; } case 'TEL;CELL;X-egw-Ref2': - if (!isset($rowNames['TEL;CELL;HOME']) + if (!in_array('TEL;CELL;HOME', $rowNames) && !isset($finalRowNames['TEL;CELL;HOME'])) { $finalRowNames['TEL;CELL;HOME'] = $vcardKey; break; } case 'TEL;CELL;X-egw-Ref3': - if (!isset($rowNames['TEL;CAR']) - && !isset($rowNames['TEL;CAR;VOICE']) - && !isset($rowNames['TEL;CAR;CELL']) - && !isset($rowNames['TEL;CAR;CELL;VOICE']) + if (!in_array($rowNames['TEL;CAR']) + && !in_array('TEL;CAR;VOICE', $rowNames) + && !in_array('TEL;CAR;CELL', $rowNames) + && !in_array('TEL;CAR;CELL;VOICE', $rowNames) && !isset($finalRowNames['TEL;CAR'])) { $finalRowNames['TEL;CAR'] = $vcardKey; } break; case 'EMAIL;X-egw-Ref1': - if (!isset($rowNames['EMAIL;WORK']) && + if (!in_array('EMAIL;WORK', $rowNames) && !isset($finalRowNames['EMAIL;WORK'])) { $finalRowNames['EMAIL;WORK'] = $vcardKey; break; } case 'EMAIL;X-egw-Ref2': - if (!isset($rowNames['EMAIL;HOME']) && + if (!in_array('EMAIL;HOME', $rowNames) && !isset($finalRowNames['EMAIL;HOME'])) { $finalRowNames['EMAIL;HOME'] = $vcardKey; } break; case 'URL;X-egw-Ref1': - if (!isset($rowNames['URL;WORK']) && + if (!in_array('URL;WORK', $rowNames) && !isset($finalRowNames['URL;WORK'])) { $finalRowNames['URL;WORK'] = $vcardKey; break; } case 'URL;X-egw-Ref2': - if (!isset($rowNames['URL;HOME']) && + if (!in_array('URL;HOME', $rowNames) && !isset($finalRowNames['URL;HOME'])) { $finalRowNames['URL;HOME'] = $vcardKey; } break; - case 'VERSION': - break; case 'X-EVOLUTION-ASSISTANT': - $finalRowNames['X-ASSISTANT'] = $vcardKey; + if (!isset($finalRowNames['X-ASSISTANT'])) + { + $finalRowNames['X-ASSISTANT'] = $vcardKey; + } break; default: if (!isset($finalRowNames[$rowName])) @@ -1295,9 +1311,7 @@ class addressbook_vcal extends addressbook_bo } } - #error_log(print_r($finalRowNames, true)); - #Horde::logMessage("vCalAddressbook vcardtoegw finalRowNames: " . print_r($finalRowNames, true), __FILE__, __LINE__, PEAR_LOG_DEBUG); - + //error_log(print_r($finalRowNames, true)); $contact = array();