web/lib/Zend/Gdata/Photos.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
equal deleted inserted replaced
63:5b37998e522e 64:162c1de6545a
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * Zend Framework
       
     5  *
       
     6  * LICENSE
       
     7  *
       
     8  * This source file is subject to the new BSD license that is bundled
       
     9  * with this package in the file LICENSE.txt.
       
    10  * It is also available through the world-wide-web at this URL:
       
    11  * http://framework.zend.com/license/new-bsd
       
    12  * If you did not receive a copy of the license and are unable to
       
    13  * obtain it through the world-wide-web, please send an email
       
    14  * to license@zend.com so we can send you a copy immediately.
       
    15  *
       
    16  * @category   Zend
       
    17  * @package    Zend_Gdata
       
    18  * @subpackage Photos
       
    19  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    20  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    21  * @version    $Id: Photos.php 20096 2010-01-06 02:05:09Z bkarwin $
       
    22  */
       
    23 
       
    24 /**
       
    25  * @see Zend_Gdata
       
    26  */
       
    27 require_once 'Zend/Gdata.php';
       
    28 
       
    29 /**
       
    30  * @see Zend_Gdata_Photos_UserFeed
       
    31  */
       
    32 require_once 'Zend/Gdata/Photos/UserFeed.php';
       
    33 
       
    34 /**
       
    35  * @see Zend_Gdata_Photos_AlbumFeed
       
    36  */
       
    37 require_once 'Zend/Gdata/Photos/AlbumFeed.php';
       
    38 
       
    39 /**
       
    40  * @see Zend_Gdata_Photos_PhotoFeed
       
    41  */
       
    42 require_once 'Zend/Gdata/Photos/PhotoFeed.php';
       
    43 
       
    44 /**
       
    45  * Service class for interacting with the Google Photos Data API.
       
    46  *
       
    47  * Like other service classes in this module, this class provides access via
       
    48  * an HTTP client to Google servers for working with entries and feeds.
       
    49  *
       
    50  * @link http://code.google.com/apis/picasaweb/gdata.html
       
    51  *
       
    52  * @category   Zend
       
    53  * @package    Zend_Gdata
       
    54  * @subpackage Photos
       
    55  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    56  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    57  */
       
    58 class Zend_Gdata_Photos extends Zend_Gdata
       
    59 {
       
    60 
       
    61     const PICASA_BASE_URI = 'http://picasaweb.google.com/data';
       
    62     const PICASA_BASE_FEED_URI = 'http://picasaweb.google.com/data/feed';
       
    63     const AUTH_SERVICE_NAME = 'lh2';
       
    64 
       
    65     /**
       
    66      * Default projection when interacting with the Picasa server.
       
    67      */
       
    68     const DEFAULT_PROJECTION = 'api';
       
    69 
       
    70     /**
       
    71      * The default visibility to filter events by.
       
    72      */
       
    73     const DEFAULT_VISIBILITY = 'all';
       
    74 
       
    75     /**
       
    76      * The default user to retrieve feeds for.
       
    77      */
       
    78     const DEFAULT_USER = 'default';
       
    79 
       
    80     /**
       
    81      * Path to the user feed on the Picasa server.
       
    82      */
       
    83     const USER_PATH = 'user';
       
    84 
       
    85     /**
       
    86      * Path to album feeds on the Picasa server.
       
    87      */
       
    88     const ALBUM_PATH = 'albumid';
       
    89 
       
    90     /**
       
    91      * Path to photo feeds on the Picasa server.
       
    92      */
       
    93     const PHOTO_PATH = 'photoid';
       
    94 
       
    95     /**
       
    96      * The path to the community search feed on the Picasa server.
       
    97      */
       
    98     const COMMUNITY_SEARCH_PATH = 'all';
       
    99 
       
   100     /**
       
   101      * The path to use for finding links to feeds within entries
       
   102      */
       
   103     const FEED_LINK_PATH = 'http://schemas.google.com/g/2005#feed';
       
   104 
       
   105     /**
       
   106      * The path to use for the determining type of an entry
       
   107      */
       
   108     const KIND_PATH = 'http://schemas.google.com/g/2005#kind';
       
   109 
       
   110     /**
       
   111      * Namespaces used for Zend_Gdata_Photos
       
   112      *
       
   113      * @var array
       
   114      */
       
   115     public static $namespaces = array(
       
   116         array('gphoto', 'http://schemas.google.com/photos/2007', 1, 0),
       
   117         array('photo', 'http://www.pheed.com/pheed/', 1, 0),
       
   118         array('exif', 'http://schemas.google.com/photos/exif/2007', 1, 0),
       
   119         array('georss', 'http://www.georss.org/georss', 1, 0),
       
   120         array('gml', 'http://www.opengis.net/gml', 1, 0),
       
   121         array('media', 'http://search.yahoo.com/mrss/', 1, 0)
       
   122     );
       
   123 
       
   124     /**
       
   125      * Create Zend_Gdata_Photos object
       
   126      *
       
   127      * @param Zend_Http_Client $client (optional) The HTTP client to use when
       
   128      *          when communicating with the servers.
       
   129      * @param string $applicationId The identity of the app in the form of Company-AppName-Version
       
   130      */
       
   131     public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0')
       
   132     {
       
   133         $this->registerPackage('Zend_Gdata_Photos');
       
   134         $this->registerPackage('Zend_Gdata_Photos_Extension');
       
   135         parent::__construct($client, $applicationId);
       
   136         $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME);
       
   137     }
       
   138 
       
   139     /**
       
   140      * Retrieve a UserFeed containing AlbumEntries, PhotoEntries and
       
   141      * TagEntries associated with a given user.
       
   142      *
       
   143      * @param string $userName The userName of interest
       
   144      * @param mixed $location (optional) The location for the feed, as a URL
       
   145      *          or Query. If not provided, a default URL will be used instead.
       
   146      * @return Zend_Gdata_Photos_UserFeed
       
   147      * @throws Zend_Gdata_App_Exception
       
   148      * @throws Zend_Gdata_App_HttpException
       
   149      */
       
   150     public function getUserFeed($userName = null, $location = null)
       
   151     {
       
   152         if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   153             $location->setType('feed');
       
   154             if ($userName !== null) {
       
   155                 $location->setUser($userName);
       
   156             }
       
   157             $uri = $location->getQueryUrl();
       
   158         } else if ($location instanceof Zend_Gdata_Query) {
       
   159             if ($userName !== null) {
       
   160                 $location->setUser($userName);
       
   161             }
       
   162             $uri = $location->getQueryUrl();
       
   163         } else if ($location !== null) {
       
   164             $uri = $location;
       
   165         } else if ($userName !== null) {
       
   166             $uri = self::PICASA_BASE_FEED_URI . '/' .
       
   167                 self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' .
       
   168                 $userName;
       
   169         } else {
       
   170             $uri = self::PICASA_BASE_FEED_URI . '/' .
       
   171                 self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' .
       
   172                 self::DEFAULT_USER;
       
   173         }
       
   174 
       
   175         return parent::getFeed($uri, 'Zend_Gdata_Photos_UserFeed');
       
   176     }
       
   177 
       
   178     /**
       
   179      * Retreive AlbumFeed object containing multiple PhotoEntry or TagEntry
       
   180      * objects.
       
   181      *
       
   182      * @param mixed $location (optional) The location for the feed, as a URL or Query.
       
   183      * @return Zend_Gdata_Photos_AlbumFeed
       
   184      * @throws Zend_Gdata_App_Exception
       
   185      * @throws Zend_Gdata_App_HttpException
       
   186      */
       
   187     public function getAlbumFeed($location = null)
       
   188     {
       
   189         if ($location === null) {
       
   190             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   191             throw new Zend_Gdata_App_InvalidArgumentException(
       
   192                     'Location must not be null');
       
   193         } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   194             $location->setType('feed');
       
   195             $uri = $location->getQueryUrl();
       
   196         } else if ($location instanceof Zend_Gdata_Query) {
       
   197             $uri = $location->getQueryUrl();
       
   198         } else {
       
   199             $uri = $location;
       
   200         }
       
   201         return parent::getFeed($uri, 'Zend_Gdata_Photos_AlbumFeed');
       
   202     }
       
   203 
       
   204     /**
       
   205      * Retreive PhotoFeed object containing comments and tags associated
       
   206      * with a given photo.
       
   207      *
       
   208      * @param mixed $location (optional) The location for the feed, as a URL
       
   209      *          or Query. If not specified, the community search feed will
       
   210      *          be returned instead.
       
   211      * @return Zend_Gdata_Photos_PhotoFeed
       
   212      * @throws Zend_Gdata_App_Exception
       
   213      * @throws Zend_Gdata_App_HttpException
       
   214      */
       
   215     public function getPhotoFeed($location = null)
       
   216     {
       
   217         if ($location === null) {
       
   218             $uri = self::PICASA_BASE_FEED_URI . '/' .
       
   219                 self::DEFAULT_PROJECTION . '/' .
       
   220                 self::COMMUNITY_SEARCH_PATH;
       
   221         } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   222             $location->setType('feed');
       
   223             $uri = $location->getQueryUrl();
       
   224         } else if ($location instanceof Zend_Gdata_Query) {
       
   225             $uri = $location->getQueryUrl();
       
   226         } else {
       
   227             $uri = $location;
       
   228         }
       
   229         return parent::getFeed($uri, 'Zend_Gdata_Photos_PhotoFeed');
       
   230     }
       
   231 
       
   232     /**
       
   233      * Retreive a single UserEntry object.
       
   234      *
       
   235      * @param mixed $location The location for the feed, as a URL or Query.
       
   236      * @return Zend_Gdata_Photos_UserEntry
       
   237      * @throws Zend_Gdata_App_Exception
       
   238      * @throws Zend_Gdata_App_HttpException
       
   239      */
       
   240     public function getUserEntry($location)
       
   241     {
       
   242         if ($location === null) {
       
   243             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   244             throw new Zend_Gdata_App_InvalidArgumentException(
       
   245                     'Location must not be null');
       
   246         } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   247             $location->setType('entry');
       
   248             $uri = $location->getQueryUrl();
       
   249         } else if ($location instanceof Zend_Gdata_Query) {
       
   250             $uri = $location->getQueryUrl();
       
   251         } else {
       
   252             $uri = $location;
       
   253         }
       
   254         return parent::getEntry($uri, 'Zend_Gdata_Photos_UserEntry');
       
   255     }
       
   256 
       
   257     /**
       
   258      * Retreive a single AlbumEntry object.
       
   259      *
       
   260      * @param mixed $location The location for the feed, as a URL or Query.
       
   261      * @return Zend_Gdata_Photos_AlbumEntry
       
   262      * @throws Zend_Gdata_App_Exception
       
   263      * @throws Zend_Gdata_App_HttpException
       
   264      */
       
   265     public function getAlbumEntry($location)
       
   266     {
       
   267         if ($location === null) {
       
   268             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   269             throw new Zend_Gdata_App_InvalidArgumentException(
       
   270                     'Location must not be null');
       
   271         } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   272             $location->setType('entry');
       
   273             $uri = $location->getQueryUrl();
       
   274         } else if ($location instanceof Zend_Gdata_Query) {
       
   275             $uri = $location->getQueryUrl();
       
   276         } else {
       
   277             $uri = $location;
       
   278         }
       
   279         return parent::getEntry($uri, 'Zend_Gdata_Photos_AlbumEntry');
       
   280     }
       
   281 
       
   282     /**
       
   283      * Retreive a single PhotoEntry object.
       
   284      *
       
   285      * @param mixed $location The location for the feed, as a URL or Query.
       
   286      * @return Zend_Gdata_Photos_PhotoEntry
       
   287      * @throws Zend_Gdata_App_Exception
       
   288      * @throws Zend_Gdata_App_HttpException
       
   289      */
       
   290     public function getPhotoEntry($location)
       
   291     {
       
   292         if ($location === null) {
       
   293             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   294             throw new Zend_Gdata_App_InvalidArgumentException(
       
   295                     'Location must not be null');
       
   296         } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   297             $location->setType('entry');
       
   298             $uri = $location->getQueryUrl();
       
   299         } else if ($location instanceof Zend_Gdata_Query) {
       
   300             $uri = $location->getQueryUrl();
       
   301         } else {
       
   302             $uri = $location;
       
   303         }
       
   304         return parent::getEntry($uri, 'Zend_Gdata_Photos_PhotoEntry');
       
   305     }
       
   306 
       
   307     /**
       
   308      * Retreive a single TagEntry object.
       
   309      *
       
   310      * @param mixed $location The location for the feed, as a URL or Query.
       
   311      * @return Zend_Gdata_Photos_TagEntry
       
   312      * @throws Zend_Gdata_App_Exception
       
   313      * @throws Zend_Gdata_App_HttpException
       
   314      */
       
   315     public function getTagEntry($location)
       
   316     {
       
   317         if ($location === null) {
       
   318             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   319             throw new Zend_Gdata_App_InvalidArgumentException(
       
   320                     'Location must not be null');
       
   321         } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   322             $location->setType('entry');
       
   323             $uri = $location->getQueryUrl();
       
   324         } else if ($location instanceof Zend_Gdata_Query) {
       
   325             $uri = $location->getQueryUrl();
       
   326         } else {
       
   327             $uri = $location;
       
   328         }
       
   329         return parent::getEntry($uri, 'Zend_Gdata_Photos_TagEntry');
       
   330     }
       
   331 
       
   332     /**
       
   333      * Retreive a single CommentEntry object.
       
   334      *
       
   335      * @param mixed $location The location for the feed, as a URL or Query.
       
   336      * @return Zend_Gdata_Photos_CommentEntry
       
   337      * @throws Zend_Gdata_App_Exception
       
   338      * @throws Zend_Gdata_App_HttpException
       
   339      */
       
   340     public function getCommentEntry($location)
       
   341     {
       
   342         if ($location === null) {
       
   343             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   344             throw new Zend_Gdata_App_InvalidArgumentException(
       
   345                     'Location must not be null');
       
   346         } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
       
   347             $location->setType('entry');
       
   348             $uri = $location->getQueryUrl();
       
   349         } else if ($location instanceof Zend_Gdata_Query) {
       
   350             $uri = $location->getQueryUrl();
       
   351         } else {
       
   352             $uri = $location;
       
   353         }
       
   354         return parent::getEntry($uri, 'Zend_Gdata_Photos_CommentEntry');
       
   355     }
       
   356 
       
   357     /**
       
   358      * Create a new album from a AlbumEntry.
       
   359      *
       
   360      * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to
       
   361      *          insert.
       
   362      * @param string $url (optional) The URI that the album should be
       
   363      *          uploaded to. If null, the default album creation URI for
       
   364      *          this domain will be used.
       
   365      * @return Zend_Gdata_Photos_AlbumEntry The inserted album entry as
       
   366      *          returned by the server.
       
   367      * @throws Zend_Gdata_App_Exception
       
   368      * @throws Zend_Gdata_App_HttpException
       
   369      */
       
   370     public function insertAlbumEntry($album, $uri = null)
       
   371     {
       
   372         if ($uri === null) {
       
   373             $uri = self::PICASA_BASE_FEED_URI . '/' .
       
   374                 self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' .
       
   375                 self::DEFAULT_USER;
       
   376         }
       
   377         $newEntry = $this->insertEntry($album, $uri, 'Zend_Gdata_Photos_AlbumEntry');
       
   378         return $newEntry;
       
   379     }
       
   380 
       
   381     /**
       
   382      * Create a new photo from a PhotoEntry.
       
   383      *
       
   384      * @param Zend_Gdata_Photos_PhotoEntry $photo The photo to insert.
       
   385      * @param string $url The URI that the photo should be uploaded
       
   386      *          to. Alternatively, an AlbumEntry can be provided and the
       
   387      *          photo will be added to that album.
       
   388      * @return Zend_Gdata_Photos_PhotoEntry The inserted photo entry
       
   389      *          as returned by the server.
       
   390      * @throws Zend_Gdata_App_Exception
       
   391      * @throws Zend_Gdata_App_HttpException
       
   392      */
       
   393     public function insertPhotoEntry($photo, $uri = null)
       
   394     {
       
   395         if ($uri instanceof Zend_Gdata_Photos_AlbumEntry) {
       
   396             $uri = $uri->getLink(self::FEED_LINK_PATH)->href;
       
   397         }
       
   398         if ($uri === null) {
       
   399             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   400             throw new Zend_Gdata_App_InvalidArgumentException(
       
   401                     'URI must not be null');
       
   402         }
       
   403         $newEntry = $this->insertEntry($photo, $uri, 'Zend_Gdata_Photos_PhotoEntry');
       
   404         return $newEntry;
       
   405     }
       
   406 
       
   407     /**
       
   408      * Create a new tag from a TagEntry.
       
   409      *
       
   410      * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to insert.
       
   411      * @param string $url The URI where the tag should be
       
   412      *          uploaded to. Alternatively, a PhotoEntry can be provided and
       
   413      *          the tag will be added to that photo.
       
   414      * @return Zend_Gdata_Photos_TagEntry The inserted tag entry as returned
       
   415      *          by the server.
       
   416      * @throws Zend_Gdata_App_Exception
       
   417      * @throws Zend_Gdata_App_HttpException
       
   418      */
       
   419     public function insertTagEntry($tag, $uri = null)
       
   420     {
       
   421         if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) {
       
   422             $uri = $uri->getLink(self::FEED_LINK_PATH)->href;
       
   423         }
       
   424         if ($uri === null) {
       
   425             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   426             throw new Zend_Gdata_App_InvalidArgumentException(
       
   427                     'URI must not be null');
       
   428         }
       
   429         $newEntry = $this->insertEntry($tag, $uri, 'Zend_Gdata_Photos_TagEntry');
       
   430         return $newEntry;
       
   431     }
       
   432 
       
   433     /**
       
   434      * Create a new comment from a CommentEntry.
       
   435      *
       
   436      * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to
       
   437      *          insert.
       
   438      * @param string $url The URI where the comment should be uploaded to.
       
   439      *          Alternatively, a PhotoEntry can be provided and
       
   440      *          the comment will be added to that photo.
       
   441      * @return Zend_Gdata_Photos_CommentEntry The inserted comment entry
       
   442      *          as returned by the server.
       
   443      * @throws Zend_Gdata_App_Exception
       
   444      * @throws Zend_Gdata_App_HttpException
       
   445      */
       
   446     public function insertCommentEntry($comment, $uri = null)
       
   447     {
       
   448         if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) {
       
   449             $uri = $uri->getLink(self::FEED_LINK_PATH)->href;
       
   450         }
       
   451         if ($uri === null) {
       
   452             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
       
   453             throw new Zend_Gdata_App_InvalidArgumentException(
       
   454                     'URI must not be null');
       
   455         }
       
   456         $newEntry = $this->insertEntry($comment, $uri, 'Zend_Gdata_Photos_CommentEntry');
       
   457         return $newEntry;
       
   458     }
       
   459 
       
   460     /**
       
   461      * Delete an AlbumEntry.
       
   462      *
       
   463      * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to
       
   464      *          delete.
       
   465      * @param boolean $catch Whether to catch an exception when
       
   466      *            modified and re-delete or throw
       
   467      * @return void.
       
   468      * @throws Zend_Gdata_App_Exception
       
   469      * @throws Zend_Gdata_App_HttpException
       
   470      */
       
   471     public function deleteAlbumEntry($album, $catch)
       
   472     {
       
   473         if ($catch) {
       
   474             try {
       
   475                 $this->delete($album);
       
   476             } catch (Zend_Gdata_App_HttpException $e) {
       
   477                 if ($e->getResponse()->getStatus() === 409) {
       
   478                     $entry = new Zend_Gdata_Photos_AlbumEntry($e->getResponse()->getBody());
       
   479                     $this->delete($entry->getLink('edit')->href);
       
   480                 } else {
       
   481                     throw $e;
       
   482                 }
       
   483             }
       
   484         } else {
       
   485             $this->delete($album);
       
   486         }
       
   487     }
       
   488 
       
   489     /**
       
   490      * Delete a PhotoEntry.
       
   491      *
       
   492      * @param Zend_Gdata_Photos_PhotoEntry $photo The photo entry to
       
   493      *          delete.
       
   494      * @param boolean $catch Whether to catch an exception when
       
   495      *            modified and re-delete or throw
       
   496      * @return void.
       
   497      * @throws Zend_Gdata_App_Exception
       
   498      * @throws Zend_Gdata_App_HttpException
       
   499      */
       
   500     public function deletePhotoEntry($photo, $catch)
       
   501     {
       
   502         if ($catch) {
       
   503             try {
       
   504                 $this->delete($photo);
       
   505             } catch (Zend_Gdata_App_HttpException $e) {
       
   506                 if ($e->getResponse()->getStatus() === 409) {
       
   507                     $entry = new Zend_Gdata_Photos_PhotoEntry($e->getResponse()->getBody());
       
   508                     $this->delete($entry->getLink('edit')->href);
       
   509                 } else {
       
   510                     throw $e;
       
   511                 }
       
   512             }
       
   513         } else {
       
   514             $this->delete($photo);
       
   515         }
       
   516     }
       
   517 
       
   518     /**
       
   519      * Delete a CommentEntry.
       
   520      *
       
   521      * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to
       
   522      *          delete.
       
   523      * @param boolean $catch Whether to catch an exception when
       
   524      *            modified and re-delete or throw
       
   525      * @return void.
       
   526      * @throws Zend_Gdata_App_Exception
       
   527      * @throws Zend_Gdata_App_HttpException
       
   528      */
       
   529     public function deleteCommentEntry($comment, $catch)
       
   530     {
       
   531         if ($catch) {
       
   532             try {
       
   533                 $this->delete($comment);
       
   534             } catch (Zend_Gdata_App_HttpException $e) {
       
   535                 if ($e->getResponse()->getStatus() === 409) {
       
   536                     $entry = new Zend_Gdata_Photos_CommentEntry($e->getResponse()->getBody());
       
   537                     $this->delete($entry->getLink('edit')->href);
       
   538                 } else {
       
   539                     throw $e;
       
   540                 }
       
   541             }
       
   542         } else {
       
   543             $this->delete($comment);
       
   544         }
       
   545     }
       
   546 
       
   547     /**
       
   548      * Delete a TagEntry.
       
   549      *
       
   550      * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to
       
   551      *          delete.
       
   552      * @param boolean $catch Whether to catch an exception when
       
   553      *            modified and re-delete or throw
       
   554      * @return void.
       
   555      * @throws Zend_Gdata_App_Exception
       
   556      * @throws Zend_Gdata_App_HttpException
       
   557      */
       
   558     public function deleteTagEntry($tag, $catch)
       
   559     {
       
   560         if ($catch) {
       
   561             try {
       
   562                 $this->delete($tag);
       
   563             } catch (Zend_Gdata_App_HttpException $e) {
       
   564                 if ($e->getResponse()->getStatus() === 409) {
       
   565                     $entry = new Zend_Gdata_Photos_TagEntry($e->getResponse()->getBody());
       
   566                     $this->delete($entry->getLink('edit')->href);
       
   567                 } else {
       
   568                     throw $e;
       
   569                 }
       
   570             }
       
   571         } else {
       
   572             $this->delete($tag);
       
   573         }
       
   574     }
       
   575 
       
   576 }