/**
  * Breaks a path "s3://mybucket/foo/bar.gif" into a bucket name "mybucket"
  * and a key "bar.gif". If $populateProperties is true (or omitted),
  * various properties are populated on the current instance.
  *
  * @param string $path               a path including the stream wrapper
  *                                   prefix for this wrapper, e.g.
  *                                   s3://foo/bar.txt
  * @param bool   $populateProperties populate various properties on $this
  *
  * @return array   tuple containing (bucketName, key) - key may be false
  */
 private function _parsePath($path, $populateProperties = true)
 {
     if (!preg_match("@^([^:]+)://([^/]*)(/(.*))?\$@", $path, $matches)) {
         return array(false, false);
     }
     $wrapper = $matches[1];
     // the string used in stream_wrapper_register()
     $bucketName = $matches[2];
     $key = isset($matches[4]) ? $matches[4] : false;
     if ($populateProperties) {
         $this->_prefix = $key ? rtrim($key, '/') . '/' : '';
         // If stream wrapper was invoked with a specific stream context,
         // this is set in $this->context
         if (!$this->context) {
             $this->context = stream_context_get_default();
         }
         // Array of options for all stram wrappers
         $options = stream_context_get_options($this->context);
         $this->_options = isset($options[$wrapper]) ? $options[$wrapper] : array();
         if (isset($this->_options['access_key_id']) && isset($this->_options['secret_access_key'])) {
             $this->_s3 = Services_Amazon_S3::getAccount($this->_options['access_key_id'], $this->_options['secret_access_key']);
         } else {
             $this->_s3 = Services_Amazon_S3::getAnonymousAccount();
         }
         // Various options
         if (isset($this->_options['http_options'])) {
             $this->_s3->httpOptions = array_merge($this->_s3->httpOptions, $this->_options['http_options']);
         }
         if (isset($this->_options['use_ssl'])) {
             $this->_s3->useSSL = (bool) $this->_options['use_ssl'];
         }
         if (isset($this->_options['request_style'])) {
             $this->_s3->requestStyle = $this->_options['request_style'];
         }
         if (isset($this->_options['endpoint'])) {
             $this->_s3->endpoint = $this->_options['endpoint'];
         }
         if (isset($this->_options['strict'])) {
             $this->_strict = $this->_options['strict'];
         }
         if ($bucketName) {
             $this->_bucket = $this->_s3->getBucket($bucketName);
             // If $path ends with "/", it is a signal that this is a
             // directory
             if ($key && substr($key, -1) != '/') {
                 $this->_object = $this->_bucket->getObject($key);
             }
         }
     }
     return array($bucketName, $key);
 }