]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/activity.php
define Reply::pkeyGet()
[quix0rs-gnu-social.git] / lib / activity.php
index b781e498467f0331dbf9dd10db41d015b0cf1faa..1582a2019e45f0460df21eaa44d09e82e350806f 100644 (file)
@@ -135,6 +135,9 @@ class Activity
         } 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}");
@@ -168,14 +171,22 @@ class Activity
             // 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);
         }
 
@@ -431,7 +442,13 @@ class Activity
         } 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;
             }
         }
 
@@ -495,7 +512,7 @@ class Activity
         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',
@@ -510,9 +527,13 @@ class Activity
             $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);
@@ -558,9 +579,13 @@ class Activity
             $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');
+                }
             }
         }
 
@@ -694,7 +719,7 @@ class Activity
             $xs->element($tag, $attrs, $content);
         }
 
-        $xs->elementEnd('entry');
+        $xs->elementEnd($tag);
 
         return;
     }
@@ -704,11 +729,18 @@ class Activity
         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');
     }
 }