/** * test getCountryNameByRegionCode */ public function testGetCountryNameByRegionCode() { Tinebase_Core::setupUserLocale('de_DE'); $this->assertEquals('Deutschland', Tinebase_Translation::getCountryNameByRegionCode('DE')); $this->assertEquals('Vereinigte Staaten', Tinebase_Translation::getCountryNameByRegionCode('US')); $this->assertNull(Tinebase_Translation::getCountryNameByRegionCode('XX')); Tinebase_Core::setupUserLocale('en_US'); $this->assertEquals('Germany', Tinebase_Translation::getCountryNameByRegionCode('DE')); $this->assertEquals('United States', Tinebase_Translation::getCountryNameByRegionCode('US')); }
/** * validate xml generation for all devices except IPhone */ public function testAppendXmlPalm() { $imp = new DOMImplementation(); $dtd = $imp->createDocumentType('AirSync', "-//AIRSYNC//DTD AirSync//EN", "http://www.microsoft.com/"); $testDom = $imp->createDocument('uri:AirSync', 'Sync', $dtd); $testDom->formatOutput = true; $testDom->encoding = 'utf-8'; $testDom->documentElement->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:Contacts', 'uri:Contacts'); $testNode = $testDom->documentElement->appendChild($testDom->createElementNS('uri:AirSync', 'TestAppendXml')); $controller = new ActiveSync_Controller_Contacts($this->objects['deviceWebOS'], new Tinebase_DateTime()); $controller->appendXML($testNode, null, $this->objects['contact']->getId(), array()); $controller->appendXML($testNode, null, $this->objects['contact']->getId(), array()); $this->assertEquals(Tinebase_Translation::getCountryNameByRegionCode('DE'), @$testDom->getElementsByTagNameNS('uri:Contacts', 'BusinessCountry')->item(0)->nodeValue, $testDom->saveXML()); $this->assertEquals('1975-01-02T03:00:00.000Z', @$testDom->getElementsByTagNameNS('uri:Contacts', 'Birthday')->item(0)->nodeValue, $testDom->saveXML()); }
/** * append contact data to xml element * * @param DOMElement $_domParrent the parrent xml node * @param string $_folderId the local folder id * @param string $_serverId the local entry id * @param boolean $_withBody retrieve body of entry */ public function appendXML(DOMElement $_domParrent, $_collectionData, $_serverId) { $_domParrent->ownerDocument->documentElement->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:Contacts', 'uri:Contacts'); $data = $_serverId instanceof Tinebase_Record_Abstract ? $_serverId : $this->_contentController->get($_serverId); foreach ($this->_mapping as $key => $value) { if (!empty($data->{$value}) || $data->{$value} == '0') { $nodeContent = null; switch ($value) { case 'bday': if ($data->{$value} instanceof DateTime) { $nodeContent = $data->bday->format("Y-m-d\\TH:i:s") . '.000Z'; } break; case 'jpegphoto': try { $image = Tinebase_Controller::getInstance()->getImage('Addressbook', $data->getId()); $jpegData = $image->getBlob('image/jpeg', 36000); $nodeContent = base64_encode($jpegData); } catch (Exception $e) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Image for contact {$data->getId()} not found or invalid"); } break; case 'adr_one_countryname': case 'adr_two_countryname': $nodeContent = Tinebase_Translation::getCountryNameByRegionCode($data->{$value}); break; default: $nodeContent = $data->{$value}; break; } // skip empty elements if ($nodeContent === null || $nodeContent == '') { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Value for {$key} is empty. Skip element."); continue; } // strip off any non printable control characters if (!ctype_print($nodeContent)) { $nodeContent = $this->removeControlChars($nodeContent); } $node = $_domParrent->ownerDocument->createElementNS('uri:Contacts', $key); $node->appendChild($_domParrent->ownerDocument->createTextNode($nodeContent)); $_domParrent->appendChild($node); } } if (!empty($data->note)) { if (version_compare($this->_device->acsversion, '12.0', '>=') === true) { $body = $_domParrent->appendChild(new DOMElement('Body', null, 'uri:AirSyncBase')); $body->appendChild(new DOMElement('Type', 1, 'uri:AirSyncBase')); // create a new DOMElement ... $dataTag = new DOMElement('Data', null, 'uri:AirSyncBase'); // ... append it to parent node aka append it to the document ... $body->appendChild($dataTag); // ... and now add the content (DomText takes care of special chars) $dataTag->appendChild(new DOMText($data->note)); } else { // create a new DOMElement ... $node = new DOMElement('Body', null, 'uri:Contacts'); // ... append it to parent node aka append it to the document ... $_domParrent->appendChild($node); // ... and now add the content (DomText takes care of special chars) $node->appendChild(new DOMText($data->note)); } } if (isset($data->tags) && count($data->tags) > 0) { $categories = $_domParrent->appendChild(new DOMElement('Categories', null, 'uri:Contacts')); foreach ($data->tags as $tag) { $categories->appendChild(new DOMElement('Category', $tag, 'uri:Contacts')); } } }
/** * (non-PHPdoc) * @see ActiveSync_Frontend_Abstract::toSyncrotonModel() */ public function toSyncrotonModel($entry, array $options = array()) { if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . " contact data " . print_r($entry->toArray(), TRUE)); } $syncrotonContact = new Syncroton_Model_Contact(); foreach ($this->_mapping as $syncrotonProperty => $tine20Property) { // skip empty values if (empty($entry->{$tine20Property}) && $entry->{$tine20Property} != '0' || count($entry->{$tine20Property}) === 0) { continue; } switch ($tine20Property) { case 'adr_one_countryname': case 'adr_two_countryname': $syncrotonContact->{$syncrotonProperty} = Tinebase_Translation::getCountryNameByRegionCode($entry->{$tine20Property}); break; case 'bday': $syncrotonContact->{$syncrotonProperty} = $entry->{$tine20Property}; if ($this->_device->devicetype == Syncroton_Model_Device::TYPE_BLACKBERRY && version_compare($this->_device->getMajorVersion(), '10', '>=')) { // BB 10+ expects birthday to be at noon $syncrotonContact->{$syncrotonProperty}->addHour(12); } break; case 'note': $syncrotonContact->{$syncrotonProperty} = new Syncroton_Model_EmailBody(array('type' => Syncroton_Model_EmailBody::TYPE_PLAINTEXT, 'data' => $entry->{$tine20Property})); break; case 'jpegphoto': try { $syncrotonContact->{$syncrotonProperty} = $entry->getSmallContactImage(); } catch (Exception $e) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Image for contact {$entry->getId()} not found or invalid"); } break; // @todo validate tags are working // @todo validate tags are working case 'tags': $syncrotonContact->{$syncrotonProperty} = $entry->{$tine20Property}->name; break; default: $syncrotonContact->{$syncrotonProperty} = $entry->{$tine20Property}; break; } } return $syncrotonContact; }