} else if ($entry->namespaceURI == Activity::RSS &&
$entry->localName == 'item') {
$this->_fromRssItem($entry, $feed);
+ } else if ($entry->namespaceURI == Activity::SPEC &&
+ $entry->localName == 'object') {
+ $this->_fromAtomEntry($entry, $feed);
} else {
// Low level exception. No need for i18n.
throw new Exception("Unknown DOM element: {$entry->namespaceURI} {$entry->localName}");
// XXX: do other implied stuff here
}
- $objectEls = $entry->getElementsByTagNameNS(self::SPEC, self::OBJECT);
+ // get immediate object children
+
+ $objectEls = ActivityUtils::children($entry, self::OBJECT, self::SPEC);
- if ($objectEls->length > 0) {
- for ($i = 0; $i < $objectEls->length; $i++) {
- $objectEl = $objectEls->item($i);
- $this->objects[] = new ActivityObject($objectEl);
+ if (count($objectEls) > 0) {
+ foreach ($objectEls as $objectEl) {
+ // Special case for embedded activities
+ $objectType = ActivityUtils::childContent($objectEl, self::OBJECTTYPE, self::SPEC);
+ if (!empty($objectType) && $objectType == ActivityObject::ACTIVITY) {
+ $this->objects[] = new Activity($objectEl);
+ } else {
+ $this->objects[] = new ActivityObject($objectEl);
+ }
}
} else {
+ // XXX: really?
$this->objects[] = new ActivityObject($entry);
}
} else {
$activity['object'] = array();
foreach($this->objects as $object) {
- $activity['object'][] = $object->asArray();
+ $oa = $object->asArray();
+ if ($object instanceof Activity) {
+ // throw in a type
+ // XXX: hackety-hack
+ $oa['objectType'] = 'activity';
+ }
+ $activity['object'][] = $oa;
}
}
return $xs->getString();
}
- function outputTo($xs, $namespace=false, $author=true, $source=false)
+ function outputTo($xs, $namespace=false, $author=true, $source=false, $tag='entry')
{
if ($namespace) {
$attrs = array('xmlns' => 'http://www.w3.org/2005/Atom',
$attrs = array();
}
- $xs->elementStart('entry', $attrs);
+ $xs->elementStart($tag, $attrs);
- if ($this->verb == ActivityVerb::POST && count($this->objects) == 1) {
+ if ($tag != 'entry') {
+ $xs->element('activity:object-type', null, ActivityObject::ACTIVITY);
+ }
+
+ if ($this->verb == ActivityVerb::POST && count($this->objects) == 1 && $tag == 'entry') {
$obj = $this->objects[0];
$obj->outputTo($xs, null);
$this->actor->outputTo($xs, 'activity:actor');
}
- if ($this->verb != ActivityVerb::POST || count($this->objects) != 1) {
+ if ($this->verb != ActivityVerb::POST || count($this->objects) != 1 || $tag != 'entry') {
foreach($this->objects as $object) {
- $object->outputTo($xs, 'activity:object');
+ if ($object instanceof Activity) {
+ $object->outputTo($xs, false, true, true, 'activity:object');
+ } else {
+ $object->outputTo($xs, 'activity:object');
+ }
}
}
$xs->element($tag, $attrs, $content);
}
- $xs->elementEnd('entry');
+ $xs->elementEnd($tag);
return;
}
return ActivityUtils::child($element, $tag, $namespace);
}
+ /**
+ * For consistency, we'll always output UTC rather than local time.
+ * Note that clients *should* accept any timezone we give them as long
+ * as it's properly formatted.
+ *
+ * @param int $tm Unix timestamp
+ * @return string
+ */
static function iso8601Date($tm)
{
$dateStr = date('d F Y H:i:s', $tm);
$d = new DateTime($dateStr, new DateTimeZone('UTC'));
- $d->setTimezone(new DateTimeZone(common_timezone()));
return $d->format('c');
}
}