public function compareValue(Property $a, Property $b)
 {
     // FIXME: unicode compare and take LANGUAGE into account.
     if ($a->getValue() == $b->getValue()) {
         return 0;
     } elseif ($a->getValue() < $b->getValue()) {
         return -1;
     } else {
         return 1;
     }
 }
示例#2
0
 public function testToString()
 {
     $property = new Property('propname', 'propvalue');
     $this->assertEquals('PROPNAME', $property->name);
     $this->assertEquals('propvalue', $property->value);
     $this->assertEquals('propvalue', $property->__toString());
     $this->assertEquals('propvalue', (string) $property);
     $this->assertEquals('propvalue', $property->getValue());
 }
示例#3
0
 /**
  * @param Property $property
  */
 public function merge(Property $property)
 {
     $value = $property->getValue();
     if ($this->isCollection()) {
         if (!is_array($value)) {
             $value = [$value];
         }
         $this->value = array_merge($this->value, $value);
     } else {
         $this->value = $value;
     }
     return $this;
 }
 /**
  * Handles conversion of a single property.
  *
  * @param Component\VCard $input
  * @param Component\VCard $output
  * @param Property $property
  * @param int $targetVersion
  * @return void
  */
 protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion)
 {
     // Skipping these, those are automatically added.
     if (in_array($property->name, array('VERSION', 'PRODID'))) {
         return;
     }
     $parameters = $property->parameters();
     $valueType = null;
     if (isset($parameters['VALUE'])) {
         $valueType = $parameters['VALUE']->getValue();
         unset($parameters['VALUE']);
     }
     if (!$valueType) {
         $valueType = $property->getValueType();
     }
     $newProperty = $output->createProperty($property->name, $property->getParts(), array(), $valueType);
     if ($targetVersion === Document::VCARD30) {
         if ($property instanceof Property\Uri && in_array($property->name, array('PHOTO', 'LOGO', 'SOUND'))) {
             $newProperty = $this->convertUriToBinary($output, $newProperty, $parameters);
         } elseif ($property instanceof Property\VCard\DateAndOrTime) {
             // In vCard 4, the birth year may be optional. This is not the
             // case for vCard 3. Apple has a workaround for this that
             // allows applications that support Apple's extension still
             // omit birthyears in vCard 3, but applications that do not
             // support this, will just use a random birthyear. We're
             // choosing 1604 for the birthyear, because that's what apple
             // uses.
             $parts = DateTimeParser::parseVCardDateTime($property->getValue());
             if (is_null($parts['year'])) {
                 $newValue = '1604-' . $parts['month'] . '-' . $parts['date'];
                 $newProperty->setValue($newValue);
                 $newProperty['X-APPLE-OMIT-YEAR'] = '1604';
             }
             if ($newProperty->name == 'ANNIVERSARY') {
                 // Microsoft non-standard anniversary
                 $newProperty->name = 'X-ANNIVERSARY';
                 // We also need to add a new apple property for the same
                 // purpose. This apple property needs a 'label' in the same
                 // group, so we first need to find a groupname that doesn't
                 // exist yet.
                 $x = 1;
                 while ($output->select('ITEM' . $x . '.')) {
                     $x++;
                 }
                 $output->add('ITEM' . $x . '.X-ABDATE', $newProperty->getValue(), array('VALUE' => 'DATE-AND-OR-TIME'));
                 $output->add('ITEM' . $x . '.X-ABLABEL', '_$!<Anniversary>!$_');
             }
         } elseif ($property->name === 'KIND') {
             switch (strtolower($property->getValue())) {
                 case 'org':
                     // vCard 3.0 does not have an equivalent to KIND:ORG,
                     // but apple has an extension that means the same
                     // thing.
                     $newProperty = $output->createProperty('X-ABSHOWAS', 'COMPANY');
                     break;
                 case 'individual':
                     // Individual is implicit, so we skip it.
                     return;
                 case 'group':
                     // OS X addressbook property
                     $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND', 'GROUP');
                     break;
             }
         }
     } elseif ($targetVersion === Document::VCARD40) {
         // These properties were removed in vCard 4.0
         if (in_array($property->name, array('NAME', 'MAILER', 'LABEL', 'CLASS'))) {
             return;
         }
         if ($property instanceof Property\Binary) {
             $newProperty = $this->convertBinaryToUri($output, $newProperty, $parameters);
         } elseif ($property instanceof Property\VCard\DateAndOrTime && isset($parameters['X-APPLE-OMIT-YEAR'])) {
             // If a property such as BDAY contained 'X-APPLE-OMIT-YEAR',
             // then we're stripping the year from the vcard 4 value.
             $parts = DateTimeParser::parseVCardDateTime($property->getValue());
             if ($parts['year'] === $property['X-APPLE-OMIT-YEAR']->getValue()) {
                 $newValue = '--' . $parts['month'] . '-' . $parts['date'];
                 $newProperty->setValue($newValue);
             }
             // Regardless if the year matched or not, we do need to strip
             // X-APPLE-OMIT-YEAR.
             unset($parameters['X-APPLE-OMIT-YEAR']);
         }
         switch ($property->name) {
             case 'X-ABSHOWAS':
                 if (strtoupper($property->getValue()) === 'COMPANY') {
                     $newProperty = $output->createProperty('KIND', 'ORG');
                 }
                 break;
             case 'X-ADDRESSBOOKSERVER-KIND':
                 if (strtoupper($property->getValue()) === 'GROUP') {
                     $newProperty = $output->createProperty('KIND', 'GROUP');
                 }
                 break;
             case 'X-ANNIVERSARY':
                 $newProperty->name = 'ANNIVERSARY';
                 // If we already have an anniversary property with the same
                 // value, ignore.
                 foreach ($output->select('ANNIVERSARY') as $anniversary) {
                     if ($anniversary->getValue() === $newProperty->getValue()) {
                         return;
                     }
                 }
                 break;
             case 'X-ABDATE':
                 // Find out what the label was, if it exists.
                 if (!$property->group) {
                     break;
                 }
                 $label = $input->{$property->group . '.X-ABLABEL'};
                 // We only support converting anniversaries.
                 if ($label->getValue() !== '_$!<Anniversary>!$_') {
                     break;
                 }
                 // If we already have an anniversary property with the same
                 // value, ignore.
                 foreach ($output->select('ANNIVERSARY') as $anniversary) {
                     if ($anniversary->getValue() === $newProperty->getValue()) {
                         return;
                     }
                 }
                 $newProperty->name = 'ANNIVERSARY';
                 break;
                 // Apple's per-property label system.
             // Apple's per-property label system.
             case 'X-ABLABEL':
                 if ($newProperty->getValue() === '_$!<Anniversary>!$_') {
                     // We can safely remove these, as they are converted to
                     // ANNIVERSARY properties.
                     return;
                 }
                 break;
         }
     }
     // set property group
     $newProperty->group = $property->group;
     if ($targetVersion === Document::VCARD40) {
         $this->convertParameters40($newProperty, $parameters);
     } else {
         $this->convertParameters30($newProperty, $parameters);
     }
     // Lastly, we need to see if there's a need for a VALUE parameter.
     //
     // We can do that by instantating a empty property with that name, and
     // seeing if the default valueType is identical to the current one.
     $tempProperty = $output->createProperty($newProperty->name);
     if ($tempProperty->getValueType() !== $newProperty->getValueType()) {
         $newProperty['VALUE'] = $newProperty->getValueType();
     }
     $output->add($newProperty);
 }
示例#5
0
 /**
  * Store an xtended (unspecified, vendor extension) property.
  * @param Property $property The property to store.
  * @param string $uid The uid of the CONTACT to associate the new
  * record with.
  * @return integer The ID of the newly created record.
  */
 private function storeXtendedProperty(Property $property, $uid)
 {
     assert($this->connection !== null);
     assert(!empty($uid));
     assert(is_string($uid));
     $stmt = $this->prepareCannedQuery('store', 'xtended');
     $stmt->bindValue(':uid', $uid);
     $stmt->bindValue(':name', $property->getName());
     $stmt->bindValue(':value', $property->getValue());
     $stmt->bindValue(':valuetype', $property->getValueType(false));
     $stmt->bindValue('pref', $property->getPref(false), \PDO::PARAM_INT);
     $stmt->bindValue(':mediatype', $property->getMediaType());
     $stmt->bindValue(':propGroup', $property->getGroup());
     $stmt->execute();
     $propertyID = $this->connection->lastInsertId();
     $this->associateTypes($property, $propertyID, 'xtended');
     return $propertyID;
 }
示例#6
0
 /**
  * Добавляет новое свойство БД.
  * @global type $DB
  * @param \Property $property
  * @param string $tableName
  */
 static function insertProperty($property, $tableName)
 {
     global $DB;
     $sql = 'INSERT INTO ' . $tableName . ' (PARENT_ID, TYPE, VALUE) VALUES (' . $property->getParentId() . ', "' . $DB->EscapeString($property->getType()) . '", "' . $DB->EscapeString($property->getValue()) . '")';
     $DB->Query($sql);
     $property->setId($DB->LastID());
 }
示例#7
0
<?php

include dirname(__FILE__) . '/../../bootstrap/Doctrine.php';
$t = new lime_test(7, new lime_output_color());
include dirname(__FILE__) . '/../../testTools.php';
// begin testing
$t->comment('Property class test');
$p = new Property();
$p->hydrate(array('keey' => 'testKey', 'value' => '{"a":1,"b":"geo"}'));
$t->comment('getRawValue()');
$t->is($p->getRawValue(), $p->rawGet('value'), 'getRawValue is really raw');
$t->comment('->getValue()');
$t->is($p->getValue(), array('a' => 1, 'b' => 'geo'), 'json conversion works');
$p->hydrate(array('value' => '{"a":1,"b":"g€e\'ñ"}'));
$t->is($p->getValue(), array('a' => 1, 'b' => "g€e'ñ"), 'json works with weird chars');
$p->hydrate(array('value' => '{"abcd ñep\\"ab\\"":1}'));
$t->is($p->getValue(), array('abcd ñep"ab"' => 1), 'Special chars untouched');
$t->comment('->setValue()');
$arr = array('a' => 1, 'b' => 2);
$p->setValue($arr);
$t->is($p->getValue(), $arr, 'json conversion works fine both ways');
$t->comment('test that changing the currency_decimals property changes the view');
PropertyTable::set('currency_decimals', 2);
$test_invoice->setAmounts();
$t->is($test_invoice->getGrossAmount(), 238.35, 'checking 2 decimals');
PropertyTable::set('currency_decimals', 3);
$test_invoice->setAmounts();
$t->is($test_invoice->getGrossAmount(), 238.354, 'checking 3 decimals');
PropertyTable::set('currency_decimals', 2);
 /**
  * @brief transform finds the ldif entries associated with the property
  * @param Property $property
  * @return array|false
  */
 public function getLdifProperty($property)
 {
     $ldifReturn = array();
     // Only one value per property, so we loop into types
     // then for each one, look into config xml if there are ldif entries matching
     $ldifEntries = self::getLdifEntry($property->name, $property['TYPE']);
     // If one is found, create a tab entry like tab['ldif_entry']
     if ($ldifEntries != null && count($ldifEntries) > 0) {
         foreach ($ldifEntries as $ldifEntry) {
             if (isset($ldifEntry['unassigned'])) {
                 if (strcasecmp($property->name, "REV") != 0 && strcasecmp($property->name, "VERSION") != 0 && strcasecmp($property->name, "X-LDAP-DN") != 0) {
                     // The unassigned properties are set in the ldap unassignedVCardProperty
                     $ldifReturn[(string) $this->getUnassignedVCardProperty()] = array($property->serialize());
                 }
             } else {
                 // Last, if the ldif entry has a vcard_position set, take only the value in the position index
                 $value = $property->getValue();
                 if (isset($ldifEntry['vcard_position'])) {
                     //\OC_Log::write('ldapconnector', __METHOD__." position set ".$ldifEntry['vcard_position'], \OC_Log::DEBUG);
                     $tmpValues = explode(";", $property->getValue());
                     $value = $tmpValues[$ldifEntry['vcard_position']];
                 }
                 //\OC_Log::write('ldapconnector', __METHOD__.__METHOD__." entry : ".$ldifEntry['name']." - value : $value", \OC_Log::DEBUG);
                 // finally, sets tab['ldif_entry'][] with the value
                 if (strcmp($value, "") != 0) {
                     if ($ldifEntry['image']) {
                         $ldifReturn[(string) $ldifEntry['name']] = array(base64_decode($value));
                     } else {
                         $ldifReturn[(string) $ldifEntry['name']] = array($value);
                     }
                 }
             }
         }
     }
     return $ldifReturn;
 }