]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.9.x' of gitorious.org:statusnet/mainline into 1.0.x
authorBrion Vibber <brion@pobox.com>
Mon, 4 Oct 2010 19:54:36 +0000 (12:54 -0700)
committerBrion Vibber <brion@pobox.com>
Mon, 4 Oct 2010 19:54:36 +0000 (12:54 -0700)
Conflicts:
actions/hostmeta.php
actions/imsettings.php
classes/User.php
lib/adminpanelaction.php
lib/channel.php
lib/default.php
lib/router.php
lib/util.php

32 files changed:
1  2 
EVENTS.txt
actions/apiaccountupdatedeliverydevice.php
actions/shownotice.php
classes/File_redirection.php
classes/Memcached_DataObject.php
classes/Notice.php
classes/Profile.php
classes/User.php
lib/adminpanelaction.php
lib/apiaction.php
lib/cache.php
lib/channel.php
lib/command.php
lib/common.php
lib/connectsettingsaction.php
lib/default.php
lib/htmloutputter.php
lib/router.php
lib/util.php
lib/xrd.php
plugins/BitlyUrl/BitlyUrlPlugin.php
plugins/CasAuthentication/caslogin.php
plugins/ClientSideShorten/ClientSideShortenPlugin.php
plugins/Geonames/GeonamesPlugin.php
plugins/Imap/imapmanager.php
plugins/LdapCommon/LdapCommon.php
plugins/LilUrl/LilUrlPlugin.php
plugins/Minify/MinifyPlugin.php
plugins/Minify/minify.php
plugins/OStatus/OStatusPlugin.php
plugins/OpenID/OpenIDPlugin.php
plugins/Recaptcha/RecaptchaPlugin.php

diff --cc EVENTS.txt
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 230b3aa3a08683f14add72fd22d6eebe1f3766eb,3844077e629371adc7677131af778f10dbb12ca1..1d130c44adcac8a2ef08a1aca6194ac66ee3ad0c
@@@ -474,11 -473,46 +473,46 @@@ class Profile extends Memcached_DataObj
          return $cnt;
      }
  
 -        $cache = common_memcache();
+     function hasFave($notice)
+     {
++        $cache = Cache::instance();
+         // XXX: Kind of a hack.
+         if (!empty($cache)) {
+             // This is the stream of favorite notices, in rev chron
+             // order. This forces it into cache.
+             $ids = Fave::stream($this->id, 0, NOTICE_CACHE_WINDOW);
+             // If it's in the list, then it's a fave
+             if (in_array($notice->id, $ids)) {
+                 return true;
+             }
+             // If we're not past the end of the cache window,
+             // then the cache has all available faves, so this one
+             // is not a fave.
+             if (count($ids) < NOTICE_CACHE_WINDOW) {
+                 return false;
+             }
+             // Otherwise, cache doesn't have all faves;
+             // fall through to the default
+         }
+         $fave = Fave::pkeyGet(array('user_id' => $this->id,
+                                     'notice_id' => $notice->id));
+         return ((is_null($fave)) ? false : true);
+     }
      function faveCount()
      {
 -        $c = common_memcache();
 +        $c = Cache::instance();
          if (!empty($c)) {
 -            $cnt = $c->get(common_cache_key('profile:fave_count:'.$this->id));
 +            $cnt = $c->get(Cache::key('profile:fave_count:'.$this->id));
              if (is_integer($cnt)) {
                  return (int) $cnt;
              }
          return $cnt;
      }
  
+     function blowFavesCache()
+     {
+         $cache = common_memcache();
+         if ($cache) {
+             // Faves don't happen chronologically, so we need to blow
+             // ;last cache, too
+             $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id));
+             $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id.';last'));
+             $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id));
+             $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id.';last'));
+         }
+         $this->blowFaveCount();
+     }
      function blowSubscriberCount()
      {
 -        $c = common_memcache();
 +        $c = Cache::instance();
          if (!empty($c)) {
 -            $c->delete(common_cache_key('profile:subscriber_count:'.$this->id));
 +            $c->delete(Cache::key('profile:subscriber_count:'.$this->id));
          }
      }
  
Simple merge
index 9e0b2d041b422ea9c5c8ba220f50c1c1e952a47b,fae9f4fa57a83a9b4a4f6542862013209c82be58..8dd16e9d0ce6a2b1d1e8b2abdd6f712257c1561c
@@@ -409,14 -396,14 +396,22 @@@ class AdminPanelNav extends Widge
                                       $menu_title, $action_name == 'snapshotadminpanel', 'nav_snapshot_admin_panel');
              }
  
+             if (AdminPanelAction::canAdmin('license')) {
+                 // TRANS: Menu item title/tooltip
+                 $menu_title = _('Set site license');
+                 // TRANS: Menu item for site administration
+                 $this->out->menuItem(common_local_url('licenseadminpanel'), _('License'),
+                                      $menu_title, $action_name == 'licenseadminpanel', 'nav_license_admin_panel');
+             }
 +            if (AdminPanelAction::canAdmin('plugins')) {
 +                // TRANS: Menu item title/tooltip
 +                $menu_title = _('Plugins configuration');
 +                // TRANS: Menu item for site administration
 +                $this->out->menuItem(common_local_url('pluginsadminpanel'), _('Plugins'),
 +                                     $menu_title, $action_name == 'pluginsadminpanel', 'nav_design_admin_panel');
 +            }
 +
              Event::handle('EndAdminPanelNav', array($this));
          }
          $this->action->elementEnd('ul');
Simple merge
diff --cc lib/cache.php
Simple merge
diff --cc lib/channel.php
Simple merge
diff --cc lib/command.php
Simple merge
diff --cc lib/common.php
Simple merge
index 5d62fc56b3e9e868a2ff6f6d1dfa9d4a87e72588,bb2e86176aa3ec44e2c1e19e6278ba1503f9839a..c2e759f0f38e7cd92b11305c3814a716861f6a21
@@@ -105,11 -100,11 +100,13 @@@ class ConnectSettingsNav extends Widge
  
              # action => array('prompt', 'title')
              $menu = array();
 -            if (common_config('xmpp', 'enabled')) {
 +            $transports = array();
 +            Event::handle('GetImTransports', array(&$transports));
 +            if ($transports) {
                  $menu['imsettings'] =
-                   array(_('IM'),
+                   // TRANS: Menu item for Instant Messaging settings.
+                   array(_m('MENU','IM'),
+                         // TRANS: Tooltip for Instant Messaging menu item.
                          _('Updates by instant messenger (IM)'));
              }
              if (common_config('sms', 'enabled')) {
diff --cc lib/default.php
index 76e4e44cf2b17a43e57c86a68eae916f6353a98b,45e35e83d380c8326e1008ccf2a6fb59fee1fa1f..79b54fc3bddb8e216a2efd8a62d2de847fc2d1c5
@@@ -297,12 -297,11 +297,13 @@@ $default 
                                   'OStatus' => null,
                                   'WikiHashtags' => null,
                                   'RSSCloud' => null,
 +                                 'ClientSideShorten' => null,
                                   'OpenID' => null),
+               'locale_path' => false, // Set to a path to use *instead of* each plugin's own locale subdirectories
                ),
 +        'pluginlist' => array(),
          'admin' =>
-         array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'plugins')),
 -        array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license')),
++        array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license', 'plugins')),
          'singleuser' =>
          array('enabled' => false,
                'nickname' => null),
Simple merge
diff --cc lib/router.php
index 86dd116c8d49d8a49db73b70a3a3a96dedb66624,00b2993734fe90a647b34f639ab603c51f256fce..3bbb4a044e5009c22a2ab8d00b8a92703788f4d9
@@@ -698,13 -690,8 +698,14 @@@ class Route
              $m->connect('admin/sessions', array('action' => 'sessionsadminpanel'));
              $m->connect('admin/sitenotice', array('action' => 'sitenoticeadminpanel'));
              $m->connect('admin/snapshot', array('action' => 'snapshotadminpanel'));
 -
+             $m->connect('admin/license', array('action' => 'licenseadminpanel'));
 +            $m->connect('admin/plugins', array('action' => 'pluginsadminpanel'));
 +            $m->connect('admin/plugins/enable/:plugin',
 +                        array('action' => 'pluginenable'),
 +                        array('plugin' => '[A-Za-z0-9_]+'));
 +            $m->connect('admin/plugins/disable/:plugin',
 +                        array('action' => 'plugindisable'),
 +                        array('plugin' => '[A-Za-z0-9_]+'));
  
              $m->connect('getfile/:filename',
                          array('action' => 'getfile'),
diff --cc lib/util.php
Simple merge
diff --cc lib/xrd.php
index 145cd64cb4e92ddb42d5fd77b8e8b6a81c1ab562,0000000000000000000000000000000000000000..c8cffed9cde255fd14decbb0d68c2353fcfee748
mode 100644,000000..100644
--- /dev/null
@@@ -1,171 -1,0 +1,172 @@@
 +<?php
 +/**
 + * StatusNet - the distributed open-source microblogging tool
 + * Copyright (C) 2010, StatusNet, Inc.
 + *
 + * A sample module to show best practices for StatusNet plugins
 + *
 + * PHP version 5
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU Affero General Public License as published by
 + * the Free Software Foundation, either version 3 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU Affero General Public License for more details.
 + *
 + * You should have received a copy of the GNU Affero General Public License
 + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 + *
 + * @package   StatusNet
 + * @author    James Walker <james@status.net>
 + * @copyright 2010 StatusNet, Inc.
 + * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 + * @link      http://status.net/
 + */
 +
-             throw new Exception("Invalid XML.");
 +class XRD
 +{
 +    const XML_NS = 'http://www.w3.org/2000/xmlns/';
 +
 +    const XRD_NS = 'http://docs.oasis-open.org/ns/xri/xrd-1.0';
 +
 +    const HOST_META_NS = 'http://host-meta.net/xrd/1.0';
 +
 +    public $expires;
 +
 +    public $subject;
 +
 +    public $host;
 +
 +    public $alias = array();
 +
 +    public $types = array();
 +
 +    public $links = array();
 +
 +    public static function parse($xml)
 +    {
 +        $xrd = new XRD();
 +
 +        $dom = new DOMDocument();
 +
 +        // Don't spew XML warnings to output
 +        $old = error_reporting();
 +        error_reporting($old & ~E_WARNING);
 +        $ok = $dom->loadXML($xml);
 +        error_reporting($old);
 +
 +        if (!$ok) {
-             throw new Exception("Invalid XML, missing XRD root.");
++            // TRANS: Exception.
++            throw new Exception(_m('Invalid XML.'));
 +        }
 +        $xrd_element = $dom->getElementsByTagName('XRD')->item(0);
 +        if (!$xrd_element) {
++            // TRANS: Exception.
++            throw new Exception(_m('Invalid XML, missing XRD root.'));
 +        }
 +
 +        // Check for host-meta host
 +        $host = $xrd_element->getElementsByTagName('Host')->item(0);
 +        if ($host) {
 +            $xrd->host = $host->nodeValue;
 +        }
 +
 +        // Loop through other elements
 +        foreach ($xrd_element->childNodes as $node) {
 +            if (!($node instanceof DOMElement)) {
 +                continue;
 +            }
 +            switch ($node->tagName) {
 +            case 'Expires':
 +                $xrd->expires = $node->nodeValue;
 +                break;
 +            case 'Subject':
 +                $xrd->subject = $node->nodeValue;
 +                break;
 +
 +            case 'Alias':
 +                $xrd->alias[] = $node->nodeValue;
 +                break;
 +
 +            case 'Link':
 +                $xrd->links[] = $xrd->parseLink($node);
 +                break;
 +
 +            case 'Type':
 +                $xrd->types[] = $xrd->parseType($node);
 +                break;
 +
 +            }
 +        }
 +        return $xrd;
 +    }
 +
 +    public function toXML()
 +    {
 +        $xs = new XMLStringer();
 +
 +        $xs->startXML();
 +        $xs->elementStart('XRD', array('xmlns' => XRD::XRD_NS));
 +
 +        if ($this->host) {
 +            $xs->element('hm:Host', array('xmlns:hm' => XRD::HOST_META_NS), $this->host);
 +        }
 +
 +        if ($this->expires) {
 +            $xs->element('Expires', null, $this->expires);
 +        }
 +
 +        if ($this->subject) {
 +            $xs->element('Subject', null, $this->subject);
 +        }
 +
 +        foreach ($this->alias as $alias) {
 +            $xs->element('Alias', null, $alias);
 +        }
 +
 +        foreach ($this->links as $link) {
 +            $titles = array();
 +            if (isset($link['title'])) {
 +                $titles = $link['title'];
 +                unset($link['title']);
 +            }
 +            $xs->elementStart('Link', $link);
 +            foreach ($titles as $title) {
 +                $xs->element('Title', null, $title);
 +            }
 +            $xs->elementEnd('Link');
 +        }
 +
 +        $xs->elementEnd('XRD');
 +
 +        return $xs->getString();
 +    }
 +
 +    function parseType($element)
 +    {
 +        return array();
 +    }
 +
 +    function parseLink($element)
 +    {
 +        $link = array();
 +        $link['rel'] = $element->getAttribute('rel');
 +        $link['type'] = $element->getAttribute('type');
 +        $link['href'] = $element->getAttribute('href');
 +        $link['template'] = $element->getAttribute('template');
 +        foreach ($element->childNodes as $node) {
 +            if ($node instanceof DOMElement) {
 +                switch($node->tagName) {
 +                case 'Title':
 +                    $link['title'][] = $node->nodeValue;
 +                }
 +            }
 +        }
 +
 +        return $link;
 +    }
 +}
Simple merge
index 0000000000000000000000000000000000000000,310641ce6027dfac967f17b1b625c2f57e6ea0c6..d88014bb8070b57d614063dcb7a091d815a3ab6d
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,503 +1,503 @@@
 -        $c = common_memcache();
+ <?php
+ /**
+  * StatusNet, the distributed open-source microblogging tool
+  *
+  * Plugin to convert string locations to Geonames IDs and vice versa
+  *
+  * PHP version 5
+  *
+  * LICENCE: This program is free software: you can redistribute it and/or modify
+  * it under the terms of the GNU Affero General Public License as published by
+  * the Free Software Foundation, either version 3 of the License, or
+  * (at your option) any later version.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU Affero General Public License for more details.
+  *
+  * You should have received a copy of the GNU Affero General Public License
+  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  *
+  * @category  Action
+  * @package   StatusNet
+  * @author    Evan Prodromou <evan@status.net>
+  * @copyright 2009 StatusNet Inc.
+  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+  * @link      http://status.net/
+  */
+ if (!defined('STATUSNET')) {
+     exit(1);
+ }
+ /**
+  * Plugin to convert string locations to Geonames IDs and vice versa
+  *
+  * This handles most of the events that Location class emits. It uses
+  * the geonames.org Web service to convert names like 'Montreal, Quebec, Canada'
+  * into IDs and lat/lon pairs.
+  *
+  * @category Plugin
+  * @package  StatusNet
+  * @author   Evan Prodromou <evan@status.net>
+  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+  * @link     http://status.net/
+  *
+  * @seeAlso  Location
+  */
+ class GeonamesPlugin extends Plugin
+ {
+     const LOCATION_NS = 1;
+     public $host     = 'ws.geonames.org';
+     public $username = null;
+     public $token    = null;
+     public $expiry   = 7776000; // 90-day expiry
+     public $timeout  = 2;       // Web service timeout in seconds.
+     public $timeoutWindow = 60; // Further lookups in this process will be disabled for N seconds after a timeout.
+     public $cachePrefix = null; // Optional shared memcache prefix override
+                                 // to share lookups between local instances.
+     protected $lastTimeout = null; // timestamp of last web service timeout
+     /**
+      * convert a name into a Location object
+      *
+      * @param string   $name      Name to convert
+      * @param string   $language  ISO code for anguage the name is in
+      * @param Location &$location Location object (may be null)
+      *
+      * @return boolean whether to continue (results in $location)
+      */
+     function onLocationFromName($name, $language, &$location)
+     {
+         $loc = $this->getCache(array('name' => $name,
+                                      'language' => $language));
+         if ($loc !== false) {
+             $location = $loc;
+             return false;
+         }
+         try {
+             $geonames = $this->getGeonames('search',
+                                            array('maxRows' => 1,
+                                                  'q' => $name,
+                                                  'lang' => $language,
+                                                  'type' => 'xml'));
+         } catch (Exception $e) {
+             $this->log(LOG_WARNING, "Error for $name: " . $e->getMessage());
+             return true;
+         }
+         if (count($geonames) == 0) {
+             // no results
+             $this->setCache(array('name' => $name,
+                                   'language' => $language),
+                             null);
+             return true;
+         }
+         $n = $geonames[0];
+         $location = new Location();
+         $location->lat              = $this->canonical($n->lat);
+         $location->lon              = $this->canonical($n->lng);
+         $location->names[$language] = (string)$n->name;
+         $location->location_id      = (string)$n->geonameId;
+         $location->location_ns      = self::LOCATION_NS;
+         $this->setCache(array('name' => $name,
+                               'language' => $language),
+                         $location);
+         // handled, don't continue processing!
+         return false;
+     }
+     /**
+      * convert an id into a Location object
+      *
+      * @param string   $id        Name to convert
+      * @param string   $ns        Name to convert
+      * @param string   $language  ISO code for language for results
+      * @param Location &$location Location object (may be null)
+      *
+      * @return boolean whether to continue (results in $location)
+      */
+     function onLocationFromId($id, $ns, $language, &$location)
+     {
+         if ($ns != self::LOCATION_NS) {
+             // It's not one of our IDs... keep processing
+             return true;
+         }
+         $loc = $this->getCache(array('id' => $id));
+         if ($loc !== false) {
+             $location = $loc;
+             return false;
+         }
+         try {
+             $geonames = $this->getGeonames('hierarchy',
+                                            array('geonameId' => $id,
+                                                  'lang' => $language));
+         } catch (Exception $e) {
+             $this->log(LOG_WARNING, "Error for ID $id: " . $e->getMessage());
+             return false;
+         }
+         $parts = array();
+         foreach ($geonames as $level) {
+             if (in_array($level->fcode, array('PCLI', 'ADM1', 'PPL'))) {
+                 $parts[] = (string)$level->name;
+             }
+         }
+         $last = $geonames[count($geonames)-1];
+         if (!in_array($level->fcode, array('PCLI', 'ADM1', 'PPL'))) {
+             $parts[] = (string)$last->name;
+         }
+         $location = new Location();
+         $location->location_id      = (string)$last->geonameId;
+         $location->location_ns      = self::LOCATION_NS;
+         $location->lat              = $this->canonical($last->lat);
+         $location->lon              = $this->canonical($last->lng);
+         $location->names[$language] = implode(', ', array_reverse($parts));
+         $this->setCache(array('id' => (string)$last->geonameId),
+                         $location);
+         // We're responsible for this namespace; nobody else
+         // can resolve it
+         return false;
+     }
+     /**
+      * convert a lat/lon pair into a Location object
+      *
+      * Given a lat/lon, we try to find a Location that's around
+      * it or nearby. We prefer populated places (cities, towns, villages).
+      *
+      * @param string   $lat       Latitude
+      * @param string   $lon       Longitude
+      * @param string   $language  ISO code for language for results
+      * @param Location &$location Location object (may be null)
+      *
+      * @return boolean whether to continue (results in $location)
+      */
+     function onLocationFromLatLon($lat, $lon, $language, &$location)
+     {
+         // Make sure they're canonical
+         $lat = $this->canonical($lat);
+         $lon = $this->canonical($lon);
+         $loc = $this->getCache(array('lat' => $lat,
+                                      'lon' => $lon));
+         if ($loc !== false) {
+             $location = $loc;
+             return false;
+         }
+         try {
+           $geonames = $this->getGeonames('findNearbyPlaceName',
+                                          array('lat' => $lat,
+                                                'lng' => $lon,
+                                                'lang' => $language));
+         } catch (Exception $e) {
+             $this->log(LOG_WARNING, "Error for coords $lat, $lon: " . $e->getMessage());
+             return true;
+         }
+         if (count($geonames) == 0) {
+             // no results
+             $this->setCache(array('lat' => $lat,
+                                   'lon' => $lon),
+                             null);
+             return true;
+         }
+         $n = $geonames[0];
+         $parts = array();
+         $location = new Location();
+         $parts[] = (string)$n->name;
+         if (!empty($n->adminName1)) {
+             $parts[] = (string)$n->adminName1;
+         }
+         if (!empty($n->countryName)) {
+             $parts[] = (string)$n->countryName;
+         }
+         $location->location_id = (string)$n->geonameId;
+         $location->location_ns = self::LOCATION_NS;
+         $location->lat         = $this->canonical($n->lat);
+         $location->lon         = $this->canonical($n->lng);
+         $location->names[$language] = implode(', ', $parts);
+         $this->setCache(array('lat' => $lat,
+                               'lon' => $lon),
+                         $location);
+         // Success! We handled it, so no further processing
+         return false;
+     }
+     /**
+      * Human-readable name for a location
+      *
+      * Given a location, we try to retrieve a human-readable name
+      * in the target language.
+      *
+      * @param Location $location Location to get the name for
+      * @param string   $language ISO code for language to find name in
+      * @param string   &$name    Place to put the name
+      *
+      * @return boolean whether to continue
+      */
+     function onLocationNameLanguage($location, $language, &$name)
+     {
+         if ($location->location_ns != self::LOCATION_NS) {
+             // It's not one of our IDs... keep processing
+             return true;
+         }
+         $id = $location->location_id;
+         $n = $this->getCache(array('id' => $id,
+                                    'language' => $language));
+         if ($n !== false) {
+             $name = $n;
+             return false;
+         }
+         try {
+             $geonames = $this->getGeonames('hierarchy',
+                                            array('geonameId' => $id,
+                                                  'lang' => $language));
+         } catch (Exception $e) {
+             $this->log(LOG_WARNING, "Error for ID $id: " . $e->getMessage());
+             return false;
+         }
+         if (count($geonames) == 0) {
+             $this->setCache(array('id' => $id,
+                                   'language' => $language),
+                             null);
+             return false;
+         }
+         $parts = array();
+         foreach ($geonames as $level) {
+             if (in_array($level->fcode, array('PCLI', 'ADM1', 'PPL'))) {
+                 $parts[] = (string)$level->name;
+             }
+         }
+         $last = $geonames[count($geonames)-1];
+         if (!in_array($level->fcode, array('PCLI', 'ADM1', 'PPL'))) {
+             $parts[] = (string)$last->name;
+         }
+         if (count($parts)) {
+             $name = implode(', ', array_reverse($parts));
+             $this->setCache(array('id' => $id,
+                                   'language' => $language),
+                             $name);
+         }
+         return false;
+     }
+     /**
+      * Human-readable URL for a location
+      *
+      * Given a location, we try to retrieve a geonames.org URL.
+      *
+      * @param Location $location Location to get the url for
+      * @param string   &$url     Place to put the url
+      *
+      * @return boolean whether to continue
+      */
+     function onLocationUrl($location, &$url)
+     {
+         if ($location->location_ns != self::LOCATION_NS) {
+             // It's not one of our IDs... keep processing
+             return true;
+         }
+         $url = 'http://www.geonames.org/' . $location->location_id;
+         // it's been filled, so don't process further.
+         return false;
+     }
+     /**
+      * Machine-readable name for a location
+      *
+      * Given a location, we try to retrieve a geonames.org URL.
+      *
+      * @param Location $location Location to get the url for
+      * @param string   &$url     Place to put the url
+      *
+      * @return boolean whether to continue
+      */
+     function onLocationRdfUrl($location, &$url)
+     {
+         if ($location->location_ns != self::LOCATION_NS) {
+             // It's not one of our IDs... keep processing
+             return true;
+         }
+         $url = 'http://sws.geonames.org/' . $location->location_id . '/';
+         // it's been filled, so don't process further.
+         return false;
+     }
+     function getCache($attrs)
+     {
 -        $c = common_memcache();
++        $c = Cache::instance();
+         if (empty($c)) {
+             return null;
+         }
+         $key = $this->cacheKey($attrs);
+         $value = $c->get($key);
+         return $value;
+     }
+     function setCache($attrs, $loc)
+     {
 -               common_keyize(implode(',', array_values($attrs)));
++        $c = Cache::instance();
+         if (empty($c)) {
+             return null;
+         }
+         $key = $this->cacheKey($attrs);
+         $result = $c->set($key, $loc, 0, time() + $this->expiry);
+         return $result;
+     }
+     function cacheKey($attrs)
+     {
+         $key = 'geonames:' .
+                implode(',', array_keys($attrs)) . ':'.
 -            return common_cache_key($key);
++               Cache::keyize(implode(',', array_values($attrs)));
+         if ($this->cachePrefix) {
+             return $this->cachePrefix . ':' . $key;
+         } else {
++            return Cache::key($key);
+         }
+     }
+     function wsUrl($method, $params)
+     {
+         if (!empty($this->username)) {
+             $params['username'] = $this->username;
+         }
+         if (!empty($this->token)) {
+             $params['token'] = $this->token;
+         }
+         $str = http_build_query($params, null, '&');
+         return 'http://'.$this->host.'/'.$method.'?'.$str;
+     }
+     function getGeonames($method, $params)
+     {
+         if ($this->lastTimeout && (time() - $this->lastTimeout < $this->timeoutWindow)) {
+             throw new Exception("skipping due to recent web service timeout");
+         }
+         $client = HTTPClient::start();
+         $client->setConfig('connect_timeout', $this->timeout);
+         $client->setConfig('timeout', $this->timeout);
+         try {
+             $result = $client->get($this->wsUrl($method, $params));
+         } catch (Exception $e) {
+             common_log(LOG_ERR, __METHOD__ . ": " . $e->getMessage());
+             $this->lastTimeout = time();
+             throw $e;
+         }
+         if (!$result->isOk()) {
+             throw new Exception("HTTP error code " . $result->getStatus());
+         }
+         $body = $result->getBody();
+         if (empty($body)) {
+             throw new Exception("Empty HTTP body in response");
+         }
+         // This will throw an exception if the XML is mal-formed
+         $document = new SimpleXMLElement($body);
+         // No children, usually no results
+         $children = $document->children();
+         if (count($children) == 0) {
+             return array();
+         }
+         if (isset($document->status)) {
+             throw new Exception("Error #".$document->status['value']." ('".$document->status['message']."')");
+         }
+         // Array of elements, >0 elements
+         return $document->geoname;
+     }
+     function onPluginVersion(&$versions)
+     {
+         $versions[] = array('name' => 'Geonames',
+                             'version' => STATUSNET_VERSION,
+                             'author' => 'Evan Prodromou',
+                             'homepage' => 'http://status.net/wiki/Plugin:Geonames',
+                             'rawdescription' =>
+                             _m('Uses <a href="http://geonames.org/">Geonames</a> service to get human-readable '.
+                                'names for locations based on user-provided lat/long pairs.'));
+         return true;
+     }
+     function canonical($coord)
+     {
+         $coord = rtrim($coord, "0");
+         $coord = rtrim($coord, ".");
+         return $coord;
+     }
+ }
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge