summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-04-02 15:48:39 -0700
committerBrion Vibber <brion@pobox.com>2010-04-02 15:48:39 -0700
commite4d934827bd7b2162e870611662549a5df759b57 (patch)
treeb786d0fec05446fd6e1eec9cde463fc62e872beb
parentd844e6bde511595ae05c60406a58b864d2607d8b (diff)
parentb42e044f6e5111fe6cb7d4a7b7431cd9b9b67ccb (diff)
Merge branch 'testing' into 0.9.x
-rw-r--r--actions/newnotice.php24
-rw-r--r--classes/Inbox.php39
-rw-r--r--lib/noticelist.php5
3 files changed, 55 insertions, 13 deletions
diff --git a/actions/newnotice.php b/actions/newnotice.php
index ed0fa1b2b..748d104ff 100644
--- a/actions/newnotice.php
+++ b/actions/newnotice.php
@@ -184,13 +184,21 @@ class NewnoticeAction extends Action
$options = array('reply_to' => ($replyto == 'false') ? null : $replyto);
- if ($user->shareLocation() && $this->arg('notice_data-geo')) {
-
- $locOptions = Notice::locationOptions($this->trimmed('lat'),
- $this->trimmed('lon'),
- $this->trimmed('location_id'),
- $this->trimmed('location_ns'),
- $user->getProfile());
+ if ($user->shareLocation()) {
+ // use browser data if checked; otherwise profile data
+ if ($this->arg('notice_data-geo')) {
+ $locOptions = Notice::locationOptions($this->trimmed('lat'),
+ $this->trimmed('lon'),
+ $this->trimmed('location_id'),
+ $this->trimmed('location_ns'),
+ $user->getProfile());
+ } else {
+ $locOptions = Notice::locationOptions(null,
+ null,
+ null,
+ null,
+ $user->getProfile());
+ }
$options = array_merge($options, $locOptions);
}
@@ -201,8 +209,6 @@ class NewnoticeAction extends Action
$upload->attachToNotice($notice);
}
-
-
if ($this->boolean('ajax')) {
header('Content-Type: text/xml;charset=utf-8');
$this->xw->startDocument('1.0', 'UTF-8');
diff --git a/classes/Inbox.php b/classes/Inbox.php
index 014ba3d82..2533210b7 100644
--- a/classes/Inbox.php
+++ b/classes/Inbox.php
@@ -96,12 +96,23 @@ class Inbox extends Memcached_DataObject
$inbox = new Inbox();
$inbox->user_id = $user_id;
- $inbox->notice_ids = call_user_func_array('pack', array_merge(array('N*'), $ids));
+ $inbox->pack($ids);
$inbox->fake = true;
return $inbox;
}
+ /**
+ * Append the given notice to the given user's inbox.
+ * Caching updates are managed for the inbox itself.
+ *
+ * If the notice is already in this inbox, the second
+ * add will be silently dropped.
+ *
+ * @param int @user_id
+ * @param int $notice_id
+ * @return boolean success
+ */
static function insertNotice($user_id, $notice_id)
{
$inbox = DB_DataObject::staticGet('inbox', 'user_id', $user_id);
@@ -114,6 +125,13 @@ class Inbox extends Memcached_DataObject
return false;
}
+ $ids = $inbox->unpack();
+ if (in_array(intval($notice_id), $ids)) {
+ // Already in there, we probably re-ran some inbox adds
+ // due to an error. Skip the dupe silently.
+ return true;
+ }
+
$result = $inbox->query(sprintf('UPDATE inbox '.
'set notice_ids = concat(cast(0x%08x as binary(4)), '.
'substr(notice_ids, 1, %d)) '.
@@ -150,7 +168,7 @@ class Inbox extends Memcached_DataObject
}
}
- $ids = unpack('N*', $inbox->notice_ids);
+ $ids = $inbox->unpack();
if (!empty($since_id)) {
$newids = array();
@@ -229,4 +247,21 @@ class Inbox extends Memcached_DataObject
}
return new ArrayWrapper($items);
}
+
+ /**
+ * Saves a list of integer notice_ids into a packed blob in this object.
+ * @param array $ids list of integer notice_ids
+ */
+ protected function pack(array $ids)
+ {
+ $this->notice_ids = call_user_func_array('pack', array_merge(array('N*'), $ids));
+ }
+
+ /**
+ * @return array of integer notice_ids
+ */
+ protected function unpack()
+ {
+ return unpack('N*', $this->notice_ids);
+ }
}
diff --git a/lib/noticelist.php b/lib/noticelist.php
index 0d4cd4dd9..83c8de9f6 100644
--- a/lib/noticelist.php
+++ b/lib/noticelist.php
@@ -340,8 +340,9 @@ class NoticeListItem extends Widget
function showNickname()
{
- $this->out->element('span', array('class' => 'nickname fn'),
- $this->profile->nickname);
+ $this->out->raw('<span class="nickname fn">' .
+ htmlspecialchars($this->profile->nickname) .
+ '</span>');
}
/**