|
1
|
|
|
<?php |
|
2
|
|
|
/** |
|
3
|
|
|
* @author Bart Visscher |
|
4
|
|
|
* @copyright 2012 Bart Visscher <[email protected]> |
|
5
|
|
|
* @copyright 2013-2014 Thomas Tanghus ([email protected]) |
|
6
|
|
|
* |
|
7
|
|
|
* This file is licensed under the Affero General Public License version 3 or |
|
8
|
|
|
* later. |
|
9
|
|
|
* See the COPYING-README file. |
|
10
|
|
|
*/ |
|
11
|
|
|
|
|
12
|
|
|
namespace OCA\Contacts\Share; |
|
13
|
|
|
use OCA\Contacts\App; |
|
14
|
|
|
|
|
15
|
|
|
class Addressbook implements \OCP\Share_Backend_Collection { |
|
16
|
|
|
const FORMAT_ADDRESSBOOKS = 1; |
|
17
|
|
|
const FORMAT_COLLECTION = 2; |
|
18
|
|
|
|
|
19
|
|
|
/** |
|
20
|
|
|
* @var \OCA\Contacts\App; |
|
21
|
|
|
*/ |
|
22
|
|
|
public $app; |
|
23
|
|
|
|
|
24
|
|
|
public function __construct() { |
|
25
|
|
|
$this->app = new App(\OC::$server->getUserSession()->getUser()->getUId()); |
|
26
|
|
|
} |
|
27
|
|
|
|
|
28
|
|
|
/** |
|
29
|
|
|
* @brief Get the source of the item to be stored in the database |
|
30
|
|
|
* @param string Item |
|
31
|
|
|
* @param string Owner of the item |
|
32
|
|
|
* @return boolean Source |
|
33
|
|
|
* |
|
34
|
|
|
* Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' |
|
35
|
|
|
* Return false if the item does not exist for the user |
|
36
|
|
|
* |
|
37
|
|
|
* The formatItems() function will translate the source returned back into the item |
|
38
|
|
|
*/ |
|
39
|
|
|
public function isValidSource($itemSource, $uidOwner) { |
|
40
|
|
|
$app = new App($uidOwner); |
|
41
|
|
|
|
|
42
|
|
|
try { |
|
43
|
|
|
$app->getAddressBook('local', $itemSource); |
|
44
|
|
|
} catch(\Exception $e) { |
|
45
|
|
|
return false; |
|
46
|
|
|
} |
|
47
|
|
|
return true; |
|
48
|
|
|
} |
|
49
|
|
|
|
|
50
|
|
|
/** |
|
51
|
|
|
* @brief Get a unique name of the item for the specified user |
|
52
|
|
|
* @param string Item |
|
53
|
|
|
* @param string|false User the item is being shared with |
|
54
|
|
|
* @param array|null List of similar item names already existing as shared items |
|
55
|
|
|
* @return string Target name |
|
56
|
|
|
* |
|
57
|
|
|
* This function needs to verify that the user does not already have an item with this name. |
|
58
|
|
|
* If it does generate a new name e.g. name_# |
|
59
|
|
|
*/ |
|
60
|
|
|
public function generateTarget($itemSource, $shareWith, $exclude = null) { |
|
61
|
|
|
// Get app for the sharee |
|
62
|
|
|
$app = new App($shareWith); |
|
63
|
|
|
$backend = $app->getBackend('local'); |
|
64
|
|
|
|
|
65
|
|
|
// Get address book for the owner |
|
66
|
|
|
$addressBook = $this->app->getBackend('local')->getAddressBook($itemSource); |
|
67
|
|
|
|
|
68
|
|
|
$userAddressBooks = array(); |
|
69
|
|
|
|
|
70
|
|
|
foreach($backend->getAddressBooksForUser() as $userAddressBook) { |
|
71
|
|
|
$userAddressBooks[] = $userAddressBook['displayname']; |
|
72
|
|
|
} |
|
73
|
|
|
$name = $addressBook['displayname'] . '(' . $addressBook['owner'] . ')'; |
|
74
|
|
|
$suffix = ''; |
|
75
|
|
|
while (in_array($name.$suffix, $userAddressBooks)) { |
|
76
|
|
|
$suffix++; |
|
77
|
|
|
} |
|
78
|
|
|
|
|
79
|
|
|
$suffix = $suffix ? ' ' . $suffix : ''; |
|
80
|
|
|
return $name.$suffix; |
|
81
|
|
|
} |
|
82
|
|
|
|
|
83
|
|
|
/** |
|
84
|
|
|
* @brief Converts the shared item sources back into the item in the specified format |
|
85
|
|
|
* @param array Shared items |
|
86
|
|
|
* @param int Format |
|
87
|
|
|
* @return ? |
|
|
|
|
|
|
88
|
|
|
* |
|
89
|
|
|
* The items array is a 3-dimensional array with the item_source as the first key and the share id as the second key to an array with the share info. |
|
90
|
|
|
* The key/value pairs included in the share info depend on the function originally called: |
|
91
|
|
|
* If called by getItem(s)Shared: id, item_type, item, item_source, share_type, share_with, permissions, stime, file_source |
|
92
|
|
|
* If called by getItem(s)SharedWith: id, item_type, item, item_source, item_target, share_type, share_with, permissions, stime, file_source, file_target |
|
93
|
|
|
* This function allows the backend to control the output of shared items with custom formats. |
|
94
|
|
|
* It is only called through calls to the public getItem(s)Shared(With) functions. |
|
95
|
|
|
*/ |
|
96
|
|
|
public function formatItems($items, $format, $parameters = null, $include = false) { |
|
97
|
|
|
//\OCP\Util::writeLog('contacts', __METHOD__ |
|
98
|
|
|
// . ' ' . $include . ' ' . print_r($items, true), \OCP\Util::DEBUG); |
|
99
|
|
|
$addressBooks = array(); |
|
100
|
|
|
$backend = $this->app->getBackend('local'); |
|
101
|
|
|
|
|
102
|
|
|
if ($format === self::FORMAT_ADDRESSBOOKS) { |
|
103
|
|
|
foreach ($items as $item) { |
|
104
|
|
|
//\OCP\Util::writeLog('contacts', __METHOD__.' item_source: ' . $item['item_source'] . ' include: ' |
|
105
|
|
|
// . (int)$include, \OCP\Util::DEBUG); |
|
106
|
|
|
$addressBook = $backend->getAddressBook($item['item_source'], array('shared_by' => $item['uid_owner'])); |
|
107
|
|
|
if ($addressBook) { |
|
108
|
|
|
$addressBook['displayname'] = $addressBook['displayname'] . ' (' . $addressBook['owner'] . ')'; |
|
109
|
|
|
$addressBook['permissions'] = $item['permissions']; |
|
110
|
|
|
$addressBooks[] = $addressBook; |
|
111
|
|
|
} |
|
112
|
|
|
} |
|
113
|
|
|
} elseif ($format === self::FORMAT_COLLECTION) { |
|
114
|
|
|
foreach ($items as $item) { |
|
|
|
|
|
|
115
|
|
|
} |
|
116
|
|
|
} |
|
117
|
|
|
return $addressBooks; |
|
118
|
|
|
} |
|
119
|
|
|
|
|
120
|
|
|
public function getChildren($itemSource) { |
|
121
|
|
|
\OCP\Util::writeLog('contacts', __METHOD__.' item_source: ' . $itemSource, \OCP\Util::DEBUG); |
|
122
|
|
|
$contacts = $this->app->getBackend('local')->getContacts($itemSource); |
|
123
|
|
|
$children = array(); |
|
124
|
|
|
foreach($contacts as $contact) { |
|
125
|
|
|
$children[] = array('source' => $contact['id'], 'target' => $contact['displayname']); |
|
126
|
|
|
} |
|
127
|
|
|
return $children; |
|
128
|
|
|
} |
|
129
|
|
|
|
|
130
|
|
|
public function isShareTypeAllowed($shareType) { |
|
131
|
|
|
return true; |
|
132
|
|
|
} |
|
133
|
|
|
|
|
134
|
|
|
} |
|
135
|
|
|
|
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.