static function domnode_to_array($node) { $output = array(); switch ($node->nodeType) { case XML_CDATA_SECTION_NODE: case XML_TEXT_NODE: case XML_ELEMENT_NODE: if (!$node->childNodes) { return; } for ($i = 0, $m = $node->childNodes->length; $i < $m; $i++) { $child = $node->childNodes->item($i); $v = xml_utils::domnode_to_array($child); if (isset($child->tagName)) { $t = $child->tagName; if (!isset($output[$t])) { $output[$t] = array(); } $output[$t][] = $v; } elseif ($v) { $output = $v; } } if (is_array($output)) { if ($node->attributes->length) { $a = array(); foreach ($node->attributes as $attrName => $attrNode) { $a[$attrName] = (string) $attrNode->value; } $output['@attributes'] = $a; } if ($node->nodeType == XML_ELEMENT_NODE) { $output['@text'] = trim($node->textContent); } foreach ($output as $t => $v) { if (is_array($v) && count($v) == 1 && $t != '@attributes') { //$output[$t] = $v[0]; } } } break; } return $output; }
static function google_sync_contacts($user) { $rcmail = rcmail::get_instance(); $client = google_func::get_client(); $auth_res = google_func::google_authenticate($client, $user); if (!$auth_res['success']) { return $auth_res; } $feed = 'https://www.google.com/m8/feeds/groups/default/full' . '?v=3.0'; $val = $client->getAuth()->authenticatedRequest(new Google_Http_Request($feed)); if ($val->getResponseHttpCode() == 401) { return array('success' => false, 'message' => "Authentication failed."); } else { if ($val->getResponseHttpCode() == 403) { return array('success' => false, 'message' => $rcmail->gettext('googleforbidden', 'google_addressbook')); } else { if ($val->getResponseHttpCode() != 200) { return array('success' => false, 'message' => $rcmail->gettext('googleunreachable', 'google_addressbook')); } } } $xml = xml_utils::xmlstr_to_array($val->getResponseBody()); $gid = $xml['entry'][0]['id'][0]['@text']; $feed = 'https://www.google.com/m8/feeds/contacts/default/full' . '?max-results=9999' . '&v=3.0' . '&group=' . urlencode($gid); $val = $client->getAuth()->authenticatedRequest(new Google_Http_Request($feed)); if ($val->getResponseHttpCode() == 401) { return array('success' => false, 'message' => "Authentication failed."); } else { if ($val->getResponseHttpCode() == 403) { return array('success' => false, 'message' => $rcmail->gettext('googleforbidden', 'google_addressbook')); } else { if ($val->getResponseHttpCode() != 200) { return array('success' => false, 'message' => $rcmail->gettext('googleunreachable', 'google_addressbook')); } } } $xml = xml_utils::xmlstr_to_array($val->getResponseBody()); $backend = new google_addressbook_backend($rcmail->get_dbh(), $user->ID); $backend->delete_all(); $num_entries = 0; foreach ($xml['entry'] as $entry) { //write_log('google_addressbook', 'getting contact: '.$entry['title'][0]['@text']); $record = array(); $name = $entry['gd:name'][0]; $record['name'] = trim($name['gd:fullName'][0]['@text']); $record['firstname'] = trim($name['gd:givenName'][0]['@text']); $record['surname'] = trim($name['gd:familyName'][0]['@text']); $record['middlename'] = trim($name['gd:additionalName'][0]['@text']); $record['prefix'] = $name['gd:namePrefix'][0]['@text']; $record['suffix'] = $name['gd:nameSuffix'][0]['@text']; if (empty($record['name'])) { $record['name'] = $entry['title'][0]['@text']; } if (empty($record['name']) && empty($record['firstname']) && empty($record['surname']) && empty($record['middlename']) && !array_key_exists('gd:email', $entry)) { continue; } if (array_key_exists('gd:email', $entry)) { foreach ($entry['gd:email'] as $email) { list($rel, $type) = explode('#', $email['@attributes']['rel'], 2); $type = empty($type) ? '' : ':' . $type; $record['email' . $type][] = $email['@attributes']['address']; } } if (array_key_exists('gd:phoneNumber', $entry)) { foreach ($entry['gd:phoneNumber'] as $phone) { list($rel, $type) = explode('#', $phone['@attributes']['rel'], 2); $type = empty($type) ? '' : ':' . $type; $record['phone' . $type][] = $phone['@text']; } } if (array_key_exists('link', $entry)) { foreach ($entry['link'] as $link) { $rel = $link['@attributes']['rel']; $href = $link['@attributes']['href']; if ($rel == 'http://schemas.google.com/contacts/2008/rel#photo') { // etag is only set if image is available if (isset($link['@attributes']['etag'])) { $resp = $client->getAuth()->authenticatedRequest(new Google_Http_Request($href)); if ($resp->getResponseHttpCode() == 200) { $record['photo'] = $resp->getResponseBody(); } } break; } } } $num_entries++; $backend->insert($record, false); } return array('success' => true, 'message' => $num_entries . $rcmail->gettext('contactsfound', 'google_addressbook')); }