2011-08-06 22:32:06 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* ownCloud - Addressbook
|
|
|
|
*
|
2013-03-12 09:15:40 +01:00
|
|
|
* @author Thomas Tanghus
|
|
|
|
* @copyright 2013 Thomas Tanghus (thomas@tanghus.net)
|
2011-08-06 22:32:06 +02:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 3 of the License, or any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Affero General Public
|
|
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
2012-10-25 03:34:12 +02:00
|
|
|
|
|
|
|
namespace OCA\Contacts;
|
|
|
|
|
2011-08-06 22:32:06 +02:00
|
|
|
/**
|
|
|
|
* This class manages our addressbooks.
|
|
|
|
*/
|
2013-04-25 01:03:05 +02:00
|
|
|
class Addressbook extends AbstractPIMCollection {
|
2013-03-12 09:15:40 +01:00
|
|
|
|
2013-03-28 17:33:30 +01:00
|
|
|
protected $_count;
|
|
|
|
/**
|
|
|
|
* @var Backend\AbstractBackend
|
|
|
|
*/
|
2013-03-16 15:59:23 +01:00
|
|
|
protected $backend;
|
|
|
|
|
2013-03-12 09:15:40 +01:00
|
|
|
/**
|
|
|
|
* An array containing the mandatory:
|
|
|
|
* 'displayname'
|
|
|
|
* 'discription'
|
|
|
|
* 'permissions'
|
|
|
|
*
|
|
|
|
* And the optional:
|
|
|
|
* 'Etag'
|
|
|
|
* 'lastModified'
|
|
|
|
*
|
2013-03-28 17:33:30 +01:00
|
|
|
* @var array
|
2013-03-12 09:15:40 +01:00
|
|
|
*/
|
|
|
|
protected $addressBookInfo;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param AbstractBackend $backend The storage backend
|
|
|
|
* @param array $addressBookInfo
|
|
|
|
*/
|
2013-03-16 15:59:23 +01:00
|
|
|
public function __construct(Backend\AbstractBackend $backend, array $addressBookInfo) {
|
2013-03-12 09:15:40 +01:00
|
|
|
$this->backend = $backend;
|
|
|
|
$this->addressBookInfo = $addressBookInfo;
|
2013-03-20 11:22:53 +01:00
|
|
|
if(is_null($this->getId())) {
|
|
|
|
$id = $this->backend->createAddressBook($addressBookInfo);
|
|
|
|
if($id === false) {
|
|
|
|
throw new \Exception('Error creating address book.');
|
|
|
|
}
|
|
|
|
$this->addressBookInfo = $this->backend->getAddressBook($id);
|
|
|
|
//print(__METHOD__. ' '. __LINE__ . ' addressBookInfo: ' . print_r($this->backend->getAddressBook($id), true));
|
2013-03-17 23:06:14 +01:00
|
|
|
}
|
2013-03-16 15:59:23 +01:00
|
|
|
//\OCP\Util::writeLog('contacts', __METHOD__.' backend: ' . print_r($this->backend, true), \OCP\Util::DEBUG);
|
2013-03-12 09:15:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-03-17 21:32:53 +01:00
|
|
|
* @return string|null
|
2013-03-12 09:15:40 +01:00
|
|
|
*/
|
|
|
|
public function getId() {
|
2013-03-17 21:32:53 +01:00
|
|
|
return isset($this->addressBookInfo['id'])
|
|
|
|
? $this->addressBookInfo['id']
|
|
|
|
: null;
|
2013-03-12 09:15:40 +01:00
|
|
|
}
|
|
|
|
|
2013-03-16 15:59:23 +01:00
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getMetaData() {
|
|
|
|
$metadata = $this->addressBookInfo;
|
|
|
|
$metadata['lastmodified'] = $this->lastModified();
|
2013-03-25 17:10:21 +01:00
|
|
|
$metadata['backend'] = $this->getBackend()->name;
|
2013-03-16 15:59:23 +01:00
|
|
|
return $metadata;
|
|
|
|
}
|
|
|
|
|
2013-03-12 09:15:40 +01:00
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getDisplayName() {
|
|
|
|
return $this->addressBookInfo['displayname'];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getURI() {
|
|
|
|
return $this->addressBookInfo['uri'];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getOwner() {
|
2013-03-20 11:22:53 +01:00
|
|
|
return $this->addressBookInfo['owner'];
|
2013-03-12 09:15:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-04-26 23:57:32 +02:00
|
|
|
* Returns the lowest permission of what the backend allows and what it supports.
|
|
|
|
* @return int
|
2013-03-12 09:15:40 +01:00
|
|
|
*/
|
|
|
|
public function getPermissions() {
|
2013-04-26 23:57:32 +02:00
|
|
|
return min($this->addressBookInfo['permissions'], $this->backend->getAddressBookPermissions());
|
2013-03-12 09:15:40 +01:00
|
|
|
}
|
|
|
|
|
2013-03-25 17:10:21 +01:00
|
|
|
function getBackend() {
|
|
|
|
return $this->backend;
|
|
|
|
}
|
|
|
|
|
2013-03-12 09:15:40 +01:00
|
|
|
/**
|
|
|
|
* Returns a specific child node, referenced by its id
|
|
|
|
*
|
|
|
|
* @param string $id
|
2013-03-17 21:32:53 +01:00
|
|
|
* @return Contact|null
|
2013-03-12 09:15:40 +01:00
|
|
|
*/
|
|
|
|
function getChild($id) {
|
2013-03-28 05:00:51 +01:00
|
|
|
//\OCP\Util::writeLog('contacts', __METHOD__.' id: '.$id, \OCP\Util::DEBUG);
|
2013-04-26 23:57:32 +02:00
|
|
|
if(!$this->hasPermission(\OCP\PERMISSION_READ)) {
|
|
|
|
throw new \Exception('Access denied');
|
|
|
|
}
|
2013-03-12 09:15:40 +01:00
|
|
|
if(!isset($this->objects[$id])) {
|
2013-03-22 15:02:08 +01:00
|
|
|
$contact = $this->backend->getContact($this->getId(), $id);
|
2013-03-12 09:15:40 +01:00
|
|
|
if($contact) {
|
|
|
|
$this->objects[$id] = new Contact($this, $this->backend, $contact);
|
|
|
|
}
|
|
|
|
}
|
2013-03-17 21:32:53 +01:00
|
|
|
// When requesting a single contact we preparse it
|
|
|
|
if(isset($this->objects[$id])) {
|
|
|
|
$this->objects[$id]->retrieve();
|
|
|
|
return $this->objects[$id];
|
|
|
|
}
|
2013-03-12 09:15:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if a child-node with the specified id exists
|
|
|
|
*
|
|
|
|
* @param string $id
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
function childExists($id) {
|
|
|
|
return ($this->getChild($id) !== null);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns an array with all the child nodes
|
|
|
|
*
|
2013-03-16 15:59:23 +01:00
|
|
|
* @return Contact[]
|
2013-03-12 09:15:40 +01:00
|
|
|
*/
|
|
|
|
function getChildren($limit = null, $offset = null, $omitdata = false) {
|
2013-04-26 23:57:32 +02:00
|
|
|
if(!$this->hasPermission(\OCP\PERMISSION_READ)) {
|
|
|
|
throw new \Exception('Access denied');
|
|
|
|
}
|
2013-04-25 01:03:05 +02:00
|
|
|
//\OCP\Util::writeLog('contacts', __METHOD__.' backend: ' . print_r($this->backend, true), \OCP\Util::DEBUG);
|
2013-03-12 09:15:40 +01:00
|
|
|
$contacts = array();
|
|
|
|
|
|
|
|
foreach($this->backend->getContacts($this->getId(), $limit, $offset, $omitdata) as $contact) {
|
2013-03-16 15:59:23 +01:00
|
|
|
//\OCP\Util::writeLog('contacts', __METHOD__.' id: '.$contact['id'], \OCP\Util::DEBUG);
|
2013-03-12 20:00:22 +01:00
|
|
|
if(!isset($this->objects[$contact['id']])) {
|
|
|
|
$this->objects[$contact['id']] = new Contact($this, $this->backend, $contact);
|
|
|
|
}
|
|
|
|
$contacts[] = $this->objects[$contact['id']];
|
2013-03-12 09:15:40 +01:00
|
|
|
}
|
2013-04-25 01:03:05 +02:00
|
|
|
//\OCP\Util::writeLog('contacts', __METHOD__.' children: '.count($contacts), \OCP\Util::DEBUG);
|
2013-03-12 09:15:40 +01:00
|
|
|
return $contacts;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-03-17 21:32:53 +01:00
|
|
|
* Add a contact to the address book
|
2013-03-20 11:22:53 +01:00
|
|
|
* This takes an array or a VCard|Contact and return
|
|
|
|
* the ID or false.
|
2013-03-17 21:32:53 +01:00
|
|
|
*
|
|
|
|
* @param array|VObject\VCard $data
|
2013-03-20 11:22:53 +01:00
|
|
|
* @return int|bool
|
2013-03-17 21:32:53 +01:00
|
|
|
*/
|
2013-03-25 17:10:21 +01:00
|
|
|
public function addChild($data = null) {
|
2013-04-26 23:57:32 +02:00
|
|
|
if(!$this->hasPermission(\OCP\PERMISSION_CREATE)) {
|
|
|
|
throw new \Exception('Access denied');
|
|
|
|
}
|
2013-03-28 05:00:51 +01:00
|
|
|
$contact = new Contact($this, $this->backend, $data);
|
|
|
|
if($contact->save() === false) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$id = $contact->getId();
|
2013-03-28 17:32:36 +01:00
|
|
|
if($this->count() !== null) {
|
|
|
|
$this->_count += 1;
|
|
|
|
}
|
2013-03-28 05:00:51 +01:00
|
|
|
\OCP\Util::writeLog('contacts', __METHOD__.' id: '.$id, \OCP\Util::DEBUG);
|
|
|
|
return $id;
|
2013-03-20 11:22:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete a contact from the address book
|
|
|
|
*
|
|
|
|
* @param string $id
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function deleteChild($id) {
|
2013-05-03 04:22:20 +02:00
|
|
|
if(!$this->hasPermission(\OCP\PERMISSION_DELETE)) {
|
2013-04-26 23:57:32 +02:00
|
|
|
throw new \Exception('Access denied');
|
|
|
|
}
|
2013-03-20 11:22:53 +01:00
|
|
|
if($this->backend->deleteContact($this->getId(), $id)) {
|
|
|
|
if(isset($this->objects[$id])) {
|
|
|
|
unset($this->objects[$id]);
|
|
|
|
}
|
2013-03-28 17:32:36 +01:00
|
|
|
if($this->count() !== null) {
|
|
|
|
$this->_count -= 1;
|
|
|
|
}
|
2013-03-20 11:22:53 +01:00
|
|
|
return true;
|
2013-03-17 21:32:53 +01:00
|
|
|
}
|
2013-03-20 11:22:53 +01:00
|
|
|
return false;
|
2013-03-17 21:32:53 +01:00
|
|
|
}
|
|
|
|
|
2013-03-28 17:32:36 +01:00
|
|
|
/**
|
|
|
|
* @internal implements Countable
|
|
|
|
* @return int|null
|
|
|
|
*/
|
|
|
|
public function count() {
|
|
|
|
if(!isset($this->_count)) {
|
|
|
|
$this->_count = $this->backend->numContacts($this->getId());
|
|
|
|
}
|
|
|
|
return $this->_count;
|
|
|
|
}
|
|
|
|
|
2013-03-17 21:32:53 +01:00
|
|
|
/**
|
|
|
|
* Update and save the address book data to backend
|
2013-03-17 23:06:14 +01:00
|
|
|
* NOTE: @see IPIMObject::update for consistency considerations.
|
2013-03-12 09:15:40 +01:00
|
|
|
*
|
|
|
|
* @param array $data
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function update(array $data) {
|
2013-05-03 04:22:20 +02:00
|
|
|
if(!$this->hasPermission(\OCP\PERMISSION_UPDATE)) {
|
|
|
|
throw new \Exception('Access denied');
|
|
|
|
}
|
2013-03-17 23:06:14 +01:00
|
|
|
if(count($data) === 0) {
|
|
|
|
return false;
|
|
|
|
}
|
2013-03-12 09:15:40 +01:00
|
|
|
foreach($data as $key => $value) {
|
|
|
|
switch($key) {
|
|
|
|
case 'displayname':
|
|
|
|
$this->addressBookInfo['displayname'] = $value;
|
|
|
|
break;
|
|
|
|
case 'description':
|
|
|
|
$this->addressBookInfo['description'] = $value;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2013-03-17 23:06:14 +01:00
|
|
|
return $this->backend->updateAddressBook($this->getId(), $data);
|
2013-03-12 09:15:40 +01:00
|
|
|
}
|
|
|
|
|
2013-03-17 21:32:53 +01:00
|
|
|
/**
|
|
|
|
* Save the address book data to backend
|
|
|
|
* NOTE: @see IPIMObject::update for consistency considerations.
|
|
|
|
*
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function save() {
|
2013-03-20 11:22:53 +01:00
|
|
|
if(!$this->hasPermission(OCP\PERMISSION_UPDATE)) {
|
|
|
|
throw new Exception('You don\'t have permissions to update the address book.');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete the address book from backend
|
|
|
|
*
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public function delete() {
|
|
|
|
if(!$this->hasPermission(OCP\PERMISSION_DELETE)) {
|
|
|
|
throw new Exception('You don\'t have permissions to delete the address book.');
|
|
|
|
}
|
|
|
|
return $this->backend->deleteAddressBook($this->getId());
|
2013-03-17 21:32:53 +01:00
|
|
|
}
|
|
|
|
|
2013-03-12 09:15:40 +01:00
|
|
|
/**
|
|
|
|
* @brief Get the last modification time for the object.
|
|
|
|
*
|
|
|
|
* Must return a UNIX time stamp or null if the backend
|
|
|
|
* doesn't support it.
|
|
|
|
*
|
|
|
|
* @returns int | null
|
|
|
|
*/
|
|
|
|
public function lastModified() {
|
|
|
|
return $this->backend->lastModifiedAddressBook($this->getId());
|
|
|
|
}
|
|
|
|
|
2011-08-06 22:32:06 +02:00
|
|
|
}
|