+ /**
+ * @brief Adds the person object element to the XML document
+ *
+ * @param object $doc XML document
+ * @param array $owner Contact data of the poster
+ * @param array $contact Contact data of the target
+ *
+ * @return object author element
+ */
+ private function add_person_object($doc, $owner, $contact) {
+
+ $object = $doc->createElement("activity:object");
+ xml::add_element($doc, $object, "activity:object-type", ACTIVITY_OBJ_PERSON);
+
+ if ($contact['network'] == NETWORK_PHANTOM) {
+ xml::add_element($doc, $object, "id", $contact['url']);
+ return $object;
+ }
+
+ xml::add_element($doc, $object, "id", $contact["alias"]);
+ xml::add_element($doc, $object, "title", $contact["nick"]);
+
+ $attributes = array("rel" => "alternate", "type" => "text/html", "href" => $contact["url"]);
+ xml::add_element($doc, $object, "link", "", $attributes);
+
+ $attributes = array(
+ "rel" => "avatar",
+ "type" => "image/jpeg", // To-Do?
+ "media:width" => 175,
+ "media:height" => 175,
+ "href" => $contact["photo"]);
+ xml::add_element($doc, $object, "link", "", $attributes);
+
+ xml::add_element($doc, $object, "poco:preferredUsername", $contact["nick"]);
+ xml::add_element($doc, $object, "poco:displayName", $contact["name"]);
+
+ if (trim($contact["location"]) != "") {
+ $element = $doc->createElement("poco:address");
+ xml::add_element($doc, $element, "poco:formatted", $contact["location"]);
+ $object->appendChild($element);
+ }
+
+ return $object;
+ }
+
+ /**
+ * @brief Adds a follow/unfollow entry element
+ *
+ * @param object $doc XML document
+ * @param array $item Data of the follow/unfollow message
+ * @param array $owner Contact data of the poster
+ * @param bool $toplevel Is it for en entry element (false) or a feed entry (true)?
+ *
+ * @return object Entry element
+ */
+ private function follow_entry($doc, $item, $owner, $toplevel) {
+
+ $item["id"] = $item["parent"] = 0;
+ $item["created"] = $item["edited"] = date("c");
+ $item["private"] = true;
+
+ $contact = Probe::uri($item['follow']);
+
+ if ($contact['alias'] == '') {
+ $contact['alias'] = $contact["url"];
+ } else {
+ $item['follow'] = $contact['alias'];
+ }
+
+ $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s'",
+ intval($owner['uid']), dbesc(normalise_link($contact["url"])));
+
+ if (dbm::is_result($r)) {
+ $connect_id = $r[0]['id'];
+ } else {
+ $connect_id = 0;
+ }
+
+ if ($item['verb'] == ACTIVITY_FOLLOW) {
+ $message = t('%s is now following %s.');
+ $title = t('following');
+ $action = "subscription";
+ } else {
+ $message = t('%s stopped following %s.');
+ $title = t('stopped following');
+ $action = "unfollow";
+ }
+
+ $item["uri"] = $item['parent-uri'] = $item['thr-parent'] =
+ 'tag:'.get_app()->get_hostname().
+ ','.date('Y-m-d').':'.$action.':'.$owner['uid'].
+ ':person:'.$connect_id.':'.$item['created'];
+
+ $item["body"] = sprintf($message, $owner["nick"], $contact["nick"]);
+
+ self::entry_header($doc, $entry, $owner, $toplevel);
+
+ self::entry_content($doc, $entry, $item, $owner, $title);
+
+ $object = self::add_person_object($doc, $owner, $contact);
+ $entry->appendChild($object);
+
+ self::entry_footer($doc, $entry, $item, $owner);
+
+ return $entry;
+ }
+