219 lines
5.6 KiB
PHP
219 lines
5.6 KiB
PHP
<?php
|
|
|
|
namespace Sabre\CalDAV\Notifications\Notification;
|
|
|
|
use Sabre\CalDAV\SharingPlugin as SharingPlugin;
|
|
use Sabre\DAV;
|
|
use Sabre\CalDAV;
|
|
|
|
/**
|
|
* This class represents the cs:invite-reply notification element.
|
|
*
|
|
* @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/).
|
|
* @author Evert Pot (http://evertpot.com/)
|
|
* @license http://sabre.io/license/ Modified BSD License
|
|
*/
|
|
class InviteReply extends DAV\Property implements CalDAV\Notifications\INotificationType {
|
|
|
|
/**
|
|
* A unique id for the message
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $id;
|
|
|
|
/**
|
|
* Timestamp of the notification
|
|
*
|
|
* @var DateTime
|
|
*/
|
|
protected $dtStamp;
|
|
|
|
/**
|
|
* The unique id of the notification this was a reply to.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $inReplyTo;
|
|
|
|
/**
|
|
* A url to the recipient of the original (!) notification.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $href;
|
|
|
|
/**
|
|
* The type of message, see the SharingPlugin::STATUS_ constants.
|
|
*
|
|
* @var int
|
|
*/
|
|
protected $type;
|
|
|
|
/**
|
|
* A url to the shared calendar.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $hostUrl;
|
|
|
|
/**
|
|
* A description of the share request
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $summary;
|
|
|
|
/**
|
|
* Notification Etag
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $etag;
|
|
|
|
/**
|
|
* Creates the Invite Reply Notification.
|
|
*
|
|
* This constructor receives an array with the following elements:
|
|
*
|
|
* * id - A unique id
|
|
* * etag - The etag
|
|
* * dtStamp - A DateTime object with a timestamp for the notification.
|
|
* * inReplyTo - This should refer to the 'id' of the notification
|
|
* this is a reply to.
|
|
* * type - The type of notification, see SharingPlugin::STATUS_*
|
|
* constants for details.
|
|
* * hostUrl - A url to the shared calendar.
|
|
* * summary - Description of the share, can be the same as the
|
|
* calendar, but may also be modified (optional).
|
|
*/
|
|
public function __construct(array $values) {
|
|
|
|
$required = array(
|
|
'id',
|
|
'etag',
|
|
'href',
|
|
'dtStamp',
|
|
'inReplyTo',
|
|
'type',
|
|
'hostUrl',
|
|
);
|
|
foreach($required as $item) {
|
|
if (!isset($values[$item])) {
|
|
throw new \InvalidArgumentException($item . ' is a required constructor option');
|
|
}
|
|
}
|
|
|
|
foreach($values as $key=>$value) {
|
|
if (!property_exists($this, $key)) {
|
|
throw new \InvalidArgumentException('Unknown option: ' . $key);
|
|
}
|
|
$this->$key = $value;
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Serializes the notification as a single property.
|
|
*
|
|
* You should usually just encode the single top-level element of the
|
|
* notification.
|
|
*
|
|
* @param DAV\Server $server
|
|
* @param \DOMElement $node
|
|
* @return void
|
|
*/
|
|
public function serialize(DAV\Server $server, \DOMElement $node) {
|
|
|
|
$prop = $node->ownerDocument->createElement('cs:invite-reply');
|
|
$node->appendChild($prop);
|
|
|
|
}
|
|
|
|
/**
|
|
* This method serializes the entire notification, as it is used in the
|
|
* response body.
|
|
*
|
|
* @param DAV\Server $server
|
|
* @param \DOMElement $node
|
|
* @return void
|
|
*/
|
|
public function serializeBody(DAV\Server $server, \DOMElement $node) {
|
|
|
|
$doc = $node->ownerDocument;
|
|
|
|
$dt = $doc->createElement('cs:dtstamp');
|
|
$this->dtStamp->setTimezone(new \DateTimezone('GMT'));
|
|
$dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z')));
|
|
$node->appendChild($dt);
|
|
|
|
$prop = $doc->createElement('cs:invite-reply');
|
|
$node->appendChild($prop);
|
|
|
|
$uid = $doc->createElement('cs:uid');
|
|
$uid->appendChild($doc->createTextNode($this->id));
|
|
$prop->appendChild($uid);
|
|
|
|
$inReplyTo = $doc->createElement('cs:in-reply-to');
|
|
$inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) );
|
|
$prop->appendChild($inReplyTo);
|
|
|
|
$href = $doc->createElement('d:href');
|
|
$href->appendChild( $doc->createTextNode($this->href) );
|
|
$prop->appendChild($href);
|
|
|
|
$nodeName = null;
|
|
switch($this->type) {
|
|
|
|
case SharingPlugin::STATUS_ACCEPTED :
|
|
$nodeName = 'cs:invite-accepted';
|
|
break;
|
|
case SharingPlugin::STATUS_DECLINED :
|
|
$nodeName = 'cs:invite-declined';
|
|
break;
|
|
|
|
}
|
|
$prop->appendChild(
|
|
$doc->createElement($nodeName)
|
|
);
|
|
$hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl);
|
|
$hostUrl = $doc->createElement('cs:hosturl');
|
|
$hostUrl->appendChild($hostHref);
|
|
$prop->appendChild($hostUrl);
|
|
|
|
if ($this->summary) {
|
|
$summary = $doc->createElement('cs:summary');
|
|
$summary->appendChild($doc->createTextNode($this->summary));
|
|
$prop->appendChild($summary);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Returns a unique id for this notification
|
|
*
|
|
* This is just the base url. This should generally be some kind of unique
|
|
* id.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getId() {
|
|
|
|
return $this->id;
|
|
|
|
}
|
|
|
|
/**
|
|
* Returns the ETag for this notification.
|
|
*
|
|
* The ETag must be surrounded by literal double-quotes.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getETag() {
|
|
|
|
return $this->etag;
|
|
|
|
}
|
|
}
|