Merge "fix some spacing"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 7 Mar 2013 17:13:27 +0000 (17:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 7 Mar 2013 17:13:27 +0000 (17:13 +0000)
13 files changed:
1  2 
includes/GlobalFunctions.php
includes/MimeMagic.php
includes/User.php
includes/WikiPage.php
includes/Xml.php
includes/db/Database.php
includes/media/BitmapMetadataHandler.php
includes/media/Exif.php
includes/media/FormatMetadata.php
includes/media/IPTC.php
includes/media/MediaHandler.php
includes/media/XMP.php
includes/media/XMPValidate.php

@@@ -94,7 -94,6 +94,6 @@@ if( !function_exists( 'mb_strrpos' ) ) 
        }
  }
  
  // Support for Wietse Venema's taint feature
  if ( !function_exists( 'istainted' ) ) {
        /**
@@@ -350,7 -349,7 +349,7 @@@ function wfRandomString( $length = 32 
   *
   * @param $s String:
   * @return string
 -*/
 + */
  function wfUrlencode( $s ) {
        static $needle;
        if ( is_null( $s ) ) {
@@@ -851,8 -850,6 +850,6 @@@ function wfExpandIRI_callback( $matche
        return urldecode( $matches[1] );
  }
  
  /**
   * Make URL indexes, appropriate for the el_index field of externallinks.
   *
@@@ -1965,10 -1962,8 +1962,8 @@@ function wfFormatStackFrame( $frame ) 
                $frame['function'];
  }
  
  /* Some generic result counters, pulled out of SearchEngine */
  
  /**
   * @todo document
   *
diff --combined includes/MimeMagic.php
@@@ -144,21 -144,21 +144,21 @@@ END_STRIN
  class MimeMagic {
  
        /**
 -      * Mapping of media types to arrays of mime types.
 -      * This is used by findMediaType and getMediaType, respectively
 -      */
 +       * Mapping of media types to arrays of mime types.
 +       * This is used by findMediaType and getMediaType, respectively
 +       */
        var $mMediaTypes = null;
  
        /** Map of mime type aliases
 -      */
 +       */
        var $mMimeTypeAliases = null;
  
        /** map of mime types to file extensions (as a space seprarated list)
 -      */
 +       */
        var $mMimeToExt = null;
  
        /** map of file extensions types to mime types (as a space seprarated list)
 -      */
 +       */
        var $mExtToMime = null;
  
        /** IEContentAnalyzer instance
         */
        function __construct() {
                /**
 -              *   --- load mime.types ---
 -              */
 +               *   --- load mime.types ---
 +               */
  
                global $wgMimeTypeFile, $IP, $wgLoadFileinfoExtension;
  
                return $m;
        }
  
        /**
         * Tests if the extension matches the given mime type. Returns true if a
         * match was found, null if the mime type is unknown, and false if the
                $ext = $this->getExtensionsForType( $mime );
  
                if ( !$ext ) {
-                       return null;  // Unknown mime type
+                       return null; // Unknown mime type
                }
  
                $ext = explode( ' ', $ext );
                        # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
                        if ( $ext !== true && $ext !== false ) {
                                /** This is the mode used by getPropsFromPath
 -                              * These mime's are stored in the database, where we don't really want
 -                              * x-opc+zip, because we use it only for internal purposes
 -                              */
 +                               * These mime's are stored in the database, where we don't really want
 +                               * x-opc+zip, because we use it only for internal purposes
 +                               */
                                if ( $this->isMatchingExtension( $ext, $mime) ) {
                                        /* A known file extension for an OPC file,
 -                                      * find the proper mime type for that file extension */
 +                                       * find the proper mime type for that file extension
 +                                       */
                                        $mime = $this->guessTypesForExtension( $ext );
                                } else {
                                        $mime = "application/zip";
diff --combined includes/User.php
@@@ -574,7 -574,6 +574,6 @@@ class User 
                        return false;
                }
  
                // Ensure that the name can't be misresolved as a different title,
                // such as with extra namespace keys at the start.
                $parsed = Title::newFromText( $name );
                }
        }
  
        /**
         * Get blocking information
         * @param $bFromSlave Bool Whether to check the slave database first. To
                // since it disables the parser cache, its value will always
                // be 0 when this function is called by parsercache.
  
-               $confstr =        $this->getOption( 'math' );
+               $confstr = $this->getOption( 'math' );
                $confstr .= '!' . $this->getStubThreshold();
                $confstr .= '!' . ( $this->getOption( 'numberheadings' ) ? '1' : '' );
                $confstr .= '!' . $wgLang->getCode();
        }
  
        /**
 -      * Return a URL the user can use to confirm their email address.
 +       * Return a URL the user can use to confirm their email address.
         * @param $token String Accepts the email confirmation token
         * @return String New token URL
         */
diff --combined includes/WikiPage.php
@@@ -386,11 -386,11 +386,11 @@@ class WikiPage implements Page, IDBAcce
                        // Old-fashioned restrictions
                        $this->mTitle->loadRestrictions( $data->page_restrictions );
  
-                       $this->mId          = intval( $data->page_id );
-                       $this->mCounter     = intval( $data->page_counter );
-                       $this->mTouched     = wfTimestamp( TS_MW, $data->page_touched );
-                       $this->mIsRedirect  = intval( $data->page_is_redirect );
-                       $this->mLatest      = intval( $data->page_latest );
+                       $this->mId = intval( $data->page_id );
+                       $this->mCounter = intval( $data->page_counter );
+                       $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+                       $this->mIsRedirect = intval( $data->page_is_redirect );
+                       $this->mLatest = intval( $data->page_latest );
                        // Bug 37225: $latest may no longer match the cached latest Revision object.
                        // Double-check the ID of any cached latest Revision object for consistency.
                        if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
                $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
                $serialized = $editInfo->pst;
                $content = $editInfo->pstContent;
-               $newsize =  $content->getSize();
+               $newsize = $content->getSize();
  
                $dbw = wfGetDB( DB_MASTER );
                $now = wfTimestampNow();
        }
  
        /**
 -      * Return an applicable autosummary if one exists for the given edit.
 -      * @param $oldtext String|null: the previous text of the page.
 -      * @param $newtext String|null: The submitted text of the page.
 -      * @param $flags Int bitmask: a bitmask of flags submitted for the edit.
 -      * @return string An appropriate autosummary, or an empty string.
 -      *
 -      * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
 -      */
 +       * Return an applicable autosummary if one exists for the given edit.
 +       * @param $oldtext String|null: the previous text of the page.
 +       * @param $newtext String|null: The submitted text of the page.
 +       * @param $flags Int bitmask: a bitmask of flags submitted for the edit.
 +       * @return string An appropriate autosummary, or an empty string.
 +       *
 +       * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
 +       */
        public static function getAutosummary( $oldtext, $newtext, $flags ) {
                // NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
  
                }
                $dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
  
-               $addFields    = array( 'cat_pages = cat_pages + 1' );
+               $addFields = array( 'cat_pages = cat_pages + 1' );
                $removeFields = array( 'cat_pages = cat_pages - 1' );
  
                if ( $ns == NS_CATEGORY ) {
diff --combined includes/Xml.php
@@@ -39,7 -39,7 +39,7 @@@ class Xml 
        public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
                $out = '<' . $element;
                if( !is_null( $attribs ) ) {
-                       $out .=  self::expandAttributes( $attribs );
+                       $out .= self::expandAttributes( $attribs );
                }
                if( is_null( $contents ) ) {
                        $out .= '>';
        }
  
        /**
 -      * Generate a form (without the opening form element).
 -      * Output optionally includes a submit button.
 -      * @param $fields Array Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
 -      * @param $submitLabel String A message containing a label for the submit button.
 -      * @return string HTML form.
 -      */
 +       * Generate a form (without the opening form element).
 +       * Output optionally includes a submit button.
 +       * @param $fields Array Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
 +       * @param $submitLabel String A message containing a label for the submit button.
 +       * @return string HTML form.
 +       */
        public static function buildForm( $fields, $submitLabel = null ) {
                $form = '';
                $form .= "<table><tbody>";
diff --combined includes/db/Database.php
@@@ -282,7 -282,6 +282,6 @@@ abstract class DatabaseBase implements 
         */
        protected $fileHandle = null;
  
  # ------------------------------------------------------------------------------
  # Accessors
  # ------------------------------------------------------------------------------
         * Returns true if this database uses timestamps rather than integers
         *
         * @return bool
 -      */
 +       */
        public function realTimestamps() {
                return false;
        }
                                && in_array( $table, $wgSharedTables ) # A shared table is selected
                        ) {
                                $database = $wgSharedDB;
-                               $prefix   = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
+                               $prefix = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
                        } else {
                                $database = null;
                                $prefix = $this->mTablePrefix; # Default prefix
@@@ -47,13 -47,13 +47,13 @@@ class BitmapMetadataHandler 
        private $iptcType = 'iptc-no-hash';
  
        /**
 -      * This does the photoshop image resource app13 block
 -      * of interest, IPTC-IIM metadata is stored here.
 -      *
 -      * Mostly just calls doPSIR and doIPTC
 -      *
 -      * @param String $app13 String containing app13 block from jpeg file
 -      */
 +       * This does the photoshop image resource app13 block
 +       * of interest, IPTC-IIM metadata is stored here.
 +       *
 +       * Mostly just calls doPSIR and doIPTC
 +       *
 +       * @param String $app13 String containing app13 block from jpeg file
 +       */
        private function doApp13 ( $app13 ) {
                try {
                        $this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
@@@ -69,7 -69,6 +69,6 @@@
                $this->addMetadata( $iptc, $this->iptcType );
        }
  
        /**
         * Get exif info using exif class.
         * Basically what used to be in BitmapHandler::getMetadata().
                }
        }
        /** Add misc metadata. Warning: atm if the metadata category
 -      * doesn't have a priority, it will be silently discarded.
 -      *
 -      * @param Array $metaArray array of metadata values
 -      * @param string $type type. defaults to other. if two things have the same type they're merged
 -      */
 +       * doesn't have a priority, it will be silently discarded.
 +       *
 +       * @param Array $metaArray array of metadata values
 +       * @param string $type type. defaults to other. if two things have the same type they're merged
 +       */
        function addMetadata ( $metaArray, $type = 'other' ) {
                if ( isset( $this->metadata[$type] ) ) {
                        /* merge with old data */
        }
  
        /**
 -      * Merge together the various types of metadata
 -      * the different types have different priorites,
 -      * and are merged in order.
 -      *
 -      * This function is generally called by the media handlers' getMetadata()
 -      *
 -      * @return Array metadata array
 -      */
 +       * Merge together the various types of metadata
 +       * the different types have different priorites,
 +       * and are merged in order.
 +       *
 +       * This function is generally called by the media handlers' getMetadata()
 +       *
 +       * @return Array metadata array
 +       */
        function getMetadataArray () {
                // this seems a bit ugly... This is all so its merged in right order
                // based on the MWG recomendation.
  
                }
        }
  }
diff --combined includes/media/Exif.php
   */
  class Exif {
  
-       const BYTE      = 1;    //!< An 8-bit (1-byte) unsigned integer.
-       const ASCII     = 2;    //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
-       const SHORT     = 3;    //!< A 16-bit (2-byte) unsigned integer.
-       const LONG      = 4;    //!< A 32-bit (4-byte) unsigned integer.
-       const RATIONAL  = 5;    //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
-       const UNDEFINED = 7;    //!< An 8-bit byte that can take any value depending on the field definition
-       const SLONG     = 9;    //!< A 32-bit (4-byte) signed integer (2's complement notation),
-       const SRATIONAL = 10;   //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
-       const IGNORE    = -1;   // A fake value for things we don't want or don't support.
+       const BYTE = 1; //!< An 8-bit (1-byte) unsigned integer.
+       const ASCII = 2; //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
+       const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
+       const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
+       const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
+       const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
+       const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
+       const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
+       const IGNORE = -1; // A fake value for things we don't want or don't support.
  
        //@{
        /* @var array
        }
  
        /**
 -      * Collapse some fields together.
 -      * This converts some fields from exif form, to a more friendly form.
 -      * For example GPS latitude to a single number.
 -      *
 -      * The rationale behind this is that we're storing data, not presenting to the user
 -      * For example a longitude is a single number describing how far away you are from
 -      * the prime meridian. Well it might be nice to split it up into minutes and seconds
 -      * for the user, it doesn't really make sense to split a single number into 4 parts
 -      * for storage. (degrees, minutes, second, direction vs single floating point number).
 -      *
 -      * Other things this might do (not really sure if they make sense or not):
 -      * Dates -> mediawiki date format.
 -      * convert values that can be in different units to be in one standardized unit.
 -      *
 -      * As an alternative approach, some of this could be done in the validate phase
 -      * if we make up our own types like Exif::DATE.
 -      */
 +       * Collapse some fields together.
 +       * This converts some fields from exif form, to a more friendly form.
 +       * For example GPS latitude to a single number.
 +       *
 +       * The rationale behind this is that we're storing data, not presenting to the user
 +       * For example a longitude is a single number describing how far away you are from
 +       * the prime meridian. Well it might be nice to split it up into minutes and seconds
 +       * for the user, it doesn't really make sense to split a single number into 4 parts
 +       * for storage. (degrees, minutes, second, direction vs single floating point number).
 +       *
 +       * Other things this might do (not really sure if they make sense or not):
 +       * Dates -> mediawiki date format.
 +       * convert values that can be in different units to be in one standardized unit.
 +       *
 +       * As an alternative approach, some of this could be done in the validate phase
 +       * if we make up our own types like Exif::DATE.
 +       */
        function collapseData( ) {
  
                $this->exifGPStoNumber( 'GPSLatitude' );
  
        }
        /**
 -      * Do userComment tags and similar. See pg. 34 of exif standard.
 -      * basically first 8 bytes is charset, rest is value.
 -      * This has not been tested on any shift-JIS strings.
 -      * @param $prop String prop name.
 -      */
 +       * Do userComment tags and similar. See pg. 34 of exif standard.
 +       * basically first 8 bytes is charset, rest is value.
 +       * This has not been tested on any shift-JIS strings.
 +       * @param $prop String prop name.
 +       */
        private function charCodeString ( $prop ) {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
  
                }
        }
        /**
 -      * Convert an Exif::UNDEFINED from a raw binary string
 -      * to its value. This is sometimes needed depending on
 -      * the type of UNDEFINED field
 -      * @param $prop String name of property
 -      */
 +       * Convert an Exif::UNDEFINED from a raw binary string
 +       * to its value. This is sometimes needed depending on
 +       * the type of UNDEFINED field
 +       * @param $prop String name of property
 +       */
        private function exifPropToOrd ( $prop ) {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
                        $this->mFilteredExifData[$prop] = ord( $this->mFilteredExifData[$prop] );
                }
        }
        /**
 -      * Convert gps in exif form to a single floating point number
 -      * for example 10 degress 20`40`` S -> -10.34444
 -      * @param String $prop a gps coordinate exif tag name (like GPSLongitude)
 -      */
 +       * Convert gps in exif form to a single floating point number
 +       * for example 10 degress 20`40`` S -> -10.34444
 +       * @param String $prop a gps coordinate exif tag name (like GPSLongitude)
 +       */
        private function exifGPStoNumber ( $prop ) {
                $loc =& $this->mFilteredExifData[$prop];
                $dir =& $this->mFilteredExifData[$prop . 'Ref'];
@@@ -25,7 -25,6 +25,6 @@@
   * @file
   */
  
  /**
   * Format Image metadata values into a human readable form.
   *
@@@ -526,7 -525,6 +525,6 @@@ class FormatMetadata 
                                        }
                                        break;
  
                                case 'GPSTrackRef':
                                case 'GPSImgDirectionRef':
                                case 'GPSDestBearingRef':
        }
  
        /**
 -      * A function to collapse multivalued tags into a single value.
 -      * This turns an array of (for example) authors into a bulleted list.
 -      *
 -      * This is public on the basis it might be useful outside of this class.
 -      *
 -      * @param $vals Array array of values
 -      * @param $type String Type of array (either lang, ul, ol).
 -      * lang = language assoc array with keys being the lang code
 -      * ul = unordered list, ol = ordered list
 -      * type can also come from the '_type' member of $vals.
 -      * @param $noHtml Boolean If to avoid returning anything resembling
 -      * html. (Ugly hack for backwards compatibility with old mediawiki).
 -      * @return String single value (in wiki-syntax).
 -      */
 +       * A function to collapse multivalued tags into a single value.
 +       * This turns an array of (for example) authors into a bulleted list.
 +       *
 +       * This is public on the basis it might be useful outside of this class.
 +       *
 +       * @param $vals Array array of values
 +       * @param $type String Type of array (either lang, ul, ol).
 +       * lang = language assoc array with keys being the lang code
 +       * ul = unordered list, ol = ordered list
 +       * type can also come from the '_type' member of $vals.
 +       * @param $noHtml Boolean If to avoid returning anything resembling
 +       * html. (Ugly hack for backwards compatibility with old mediawiki).
 +       * @return String single value (in wiki-syntax).
 +       */
        public static function flattenArray( $vals, $type = 'ul', $noHtml = false ) {
                if ( isset( $vals['_type'] ) ) {
                        $type = $vals['_type'];
   *
   * @deprecated since 1.18
   *
 -**/
 + */
  class FormatExif {
        var $meta;
  
diff --combined includes/media/IPTC.php
  class IPTC {
  
        /**
 -      * This takes the results of iptcparse() and puts it into a
 -      * form that can be handled by mediawiki. Generally called from
 -      * BitmapMetadataHandler::doApp13.
 -      *
 -      * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
 -      *
 -      * @param $rawData String app13 block from jpeg containing iptc/iim data
 -      * @return Array iptc metadata array
 -      */
 +       * This takes the results of iptcparse() and puts it into a
 +       * form that can be handled by mediawiki. Generally called from
 +       * BitmapMetadataHandler::doApp13.
 +       *
 +       * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
 +       *
 +       * @param $rawData String app13 block from jpeg containing iptc/iim data
 +       * @return Array iptc metadata array
 +       */
        static function parse( $rawData ) {
                $parsed = iptcparse( $rawData );
                $data = Array();
                                        /* original transmission ref.
                                         * "A code representing the location of original transmission ac-
                                         * cording to practises of the provider."
 -                                      */
 +                                       */
                                        $data['OriginalTransmissionRef'] = self::convIPTC( $val, $c );
                                        break;
                                case '2#118': /*contact*/
        }
  
        /**
 -      * Convert an iptc date and time tags into the exif format
 -      *
 -      * @todo Potentially this should also capture the timezone offset.
 -      * @param Array $date The date tag
 -      * @param Array $time The time tag
 -      * @param $c
 -      * @return String Date in exif format.
 -      */
 +       * Convert an iptc date and time tags into the exif format
 +       *
 +       * @todo Potentially this should also capture the timezone offset.
 +       * @param Array $date The date tag
 +       * @param Array $time The time tag
 +       * @param $c
 +       * @return String Date in exif format.
 +       */
        private static function timeHelper( $date, $time, $c ) {
                if ( count( $date ) === 1 ) {
                        //the standard says this should always be 1
        }
  
        /**
 -      * Helper function to convert charset for iptc values.
 -      * @param $data string|array The iptc string
 -      * @param $charset String: The charset
 +       * Helper function to convert charset for iptc values.
 +       * @param $data string|array The iptc string
 +       * @param $charset String: The charset
         *
         * @return string|array
 -      */
 +       */
        private static function convIPTC ( $data, $charset ) {
                if ( is_array( $data ) ) {
                        foreach ( $data as &$val ) {
                return $data;
        }
        /**
 -      * Helper function of a helper function to convert charset for iptc values.
 -      * @param $data Mixed String or Array: The iptc string
 -      * @param $charset String: The charset
 -      *
 -      * @return string
 -      */
 +       * Helper function of a helper function to convert charset for iptc values.
 +       * @param $data Mixed String or Array: The iptc string
 +       * @param $charset String: The charset
 +       *
 +       * @return string
 +       */
        private static function convIPTCHelper ( $data, $charset ) {
                if ( $charset ) {
                        wfSuppressWarnings();
        }
  
        /**
 -      * take the value of 1:90 tag and returns a charset
 -      * @param String $tag 1:90 tag.
 -      * @return string charset name or "?"
 -      * Warning, this function does not (and is not intended to) detect
 -      * all iso 2022 escape codes. In practise, the code for utf-8 is the
 -      * only code that seems to have wide use. It does detect that code.
 -      */
 +       * take the value of 1:90 tag and returns a charset
 +       * @param String $tag 1:90 tag.
 +       * @return string charset name or "?"
 +       * Warning, this function does not (and is not intended to) detect
 +       * all iso 2022 escape codes. In practise, the code for utf-8 is the
 +       * only code that seems to have wide use. It does detect that code.
 +       */
        static function getCharset( $tag ) {
  
                //According to iim standard, charset is defined by the tag 1:90.
                        case "\x1b(K":
                                $c = "ISO646-DE";
                                break;
-                       case "\x1b(N":  //crylic
+                       case "\x1b(N": //crylic
                                $c = "ISO_5427";
                                break;
                        case "\x1b(`": //iso646-NO
@@@ -119,20 -119,20 +119,20 @@@ abstract class MediaHandler 
        function getMetadata( $image, $path ) { return ''; }
  
        /**
 -      * Get metadata version.
 -      *
 -      * This is not used for validating metadata, this is used for the api when returning
 -      * metadata, since api content formats should stay the same over time, and so things
 -      * using ForiegnApiRepo can keep backwards compatibility
 -      *
 -      * All core media handlers share a common version number, and extensions can
 -      * use the GetMetadataVersion hook to append to the array (they should append a unique
 -      * string so not to get confusing). If there was a media handler named 'foo' with metadata
 -      * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
 -      * version is 2, the end version string would look like '2;foo=3'.
 -      *
 -      * @return string version string
 -      */
 +       * Get metadata version.
 +       *
 +       * This is not used for validating metadata, this is used for the api when returning
 +       * metadata, since api content formats should stay the same over time, and so things
 +       * using ForiegnApiRepo can keep backwards compatibility
 +       *
 +       * All core media handlers share a common version number, and extensions can
 +       * use the GetMetadataVersion hook to append to the array (they should append a unique
 +       * string so not to get confusing). If there was a media handler named 'foo' with metadata
 +       * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
 +       * version is 2, the end version string would look like '2;foo=3'.
 +       *
 +       * @return string version string
 +       */
        static function getMetadataVersion () {
                $version = Array( '2' ); // core metadata version
                wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
        }
  
        /**
 -      * Convert metadata version.
 -      *
 -      * By default just returns $metadata, but can be used to allow
 -      * media handlers to convert between metadata versions.
 -      *
 -      * @param $metadata Mixed String or Array metadata array (serialized if string)
 -      * @param $version Integer target version
 -      * @return Array serialized metadata in specified version, or $metadata on fail.
 -      */
 +       * Convert metadata version.
 +       *
 +       * By default just returns $metadata, but can be used to allow
 +       * media handlers to convert between metadata versions.
 +       *
 +       * @param $metadata Mixed String or Array metadata array (serialized if string)
 +       * @param $version Integer target version
 +       * @return Array serialized metadata in specified version, or $metadata on fail.
 +       */
        function convertMetadataVersion( $metadata, $version = 1 ) {
                if ( !is_array( $metadata ) ) {
  
                return self::METADATA_GOOD;
        }
  
        /**
         * Get a MediaTransformOutput object representing an alternate of the transformed
         * output which will call an intermediary thumbnail assist script.
                return $fields;
        }
  
        /**
         * This is used to generate an array element for each metadata value
         * That array is then used to generate the table of metadata values
diff --combined includes/media/XMP.php
   */
  
  /**
 -* Class for reading xmp data containing properties relevant to
 -* images, and spitting out an array that FormatExif accepts.
 -*
 -* Note, this is not meant to recognize every possible thing you can
 -* encode in XMP. It should recognize all the properties we want.
 -* For example it doesn't have support for structures with multiple
 -* nesting levels, as none of the properties we're supporting use that
 -* feature. If it comes across properties it doesn't recognize, it should
 -* ignore them.
 -*
 -* The public methods one would call in this class are
 -* - parse( $content )
 -    Reads in xmp content.
 -    Can potentially be called multiple times with partial data each time.
 -* - parseExtended( $content )
 -    Reads XMPExtended blocks (jpeg files only).
 -* - getResults
 -    Outputs a results array.
 -*
 -* Note XMP kind of looks like rdf. They are not the same thing - XMP is
 -* encoded as a specific subset of rdf. This class can read XMP. It cannot
 -* read rdf.
 -*
 -*/
 + * Class for reading xmp data containing properties relevant to
 + * images, and spitting out an array that FormatExif accepts.
 + *
 + * Note, this is not meant to recognize every possible thing you can
 + * encode in XMP. It should recognize all the properties we want.
 + * For example it doesn't have support for structures with multiple
 + * nesting levels, as none of the properties we're supporting use that
 + * feature. If it comes across properties it doesn't recognize, it should
 + * ignore them.
 + *
 + * The public methods one would call in this class are
 + * - parse( $content )
 + *    Reads in xmp content.
 + *    Can potentially be called multiple times with partial data each time.
 + * - parseExtended( $content )
 + *    Reads XMPExtended blocks (jpeg files only).
 + * - getResults
 + *    Outputs a results array.
 + *
 + * Note XMP kind of looks like rdf. They are not the same thing - XMP is
 + * encoded as a specific subset of rdf. This class can read XMP. It cannot
 + * read rdf.
 + *
 + */
  class XMPReader {
  
        private $curItem = array();        // array to hold the current element (and previous element, and so on)
        protected $items;
  
        /**
 -      * These are various mode constants.
 -      * they are used to figure out what to do
 -      * with an element when its encountered.
 -      *
 -      * For example, MODE_IGNORE is used when processing
 -      * a property we're not interested in. So if a new
 -      * element pops up when we're in that mode, we ignore it.
 -      */
 +       * These are various mode constants.
 +       * they are used to figure out what to do
 +       * with an element when its encountered.
 +       *
 +       * For example, MODE_IGNORE is used when processing
 +       * a property we're not interested in. So if a new
 +       * element pops up when we're in that mode, we ignore it.
 +       */
        const MODE_INITIAL = 0;
-       const MODE_IGNORE  = 1;
-       const MODE_LI      = 2;
+       const MODE_IGNORE = 1;
+       const MODE_LI = 2;
        const MODE_LI_LANG = 3;
-       const MODE_QDESC   = 4;
+       const MODE_QDESC = 4;
  
        // The following MODE constants are also used in the
        // $items array to denote what type of property the item is.
-       const MODE_SIMPLE    = 10;
-       const MODE_STRUCT    = 11; // structure (associative array)
-       const MODE_SEQ       = 12; // ordered list
-       const MODE_BAG       = 13; // unordered list
-       const MODE_LANG      = 14;
-       const MODE_ALT       = 15; // non-language alt. Currently not implemented, and not needed atm.
+       const MODE_SIMPLE = 10;
+       const MODE_STRUCT = 11; // structure (associative array)
+       const MODE_SEQ = 12; // ordered list
+       const MODE_BAG = 13; // unordered list
+       const MODE_LANG = 14;
+       const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
        const MODE_BAGSTRUCT = 16; // A BAG of Structs.
  
        const NS_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
        const NS_XML = 'http://www.w3.org/XML/1998/namespace';
  
        /**
 -      * Constructor.
 -      *
 -      * Primary job is to initialize the XMLParser
 -      */
 +       * Constructor.
 +       *
 +       * Primary job is to initialize the XMLParser
 +       */
        function __construct() {
  
                if ( !function_exists( 'xml_parser_create_ns' ) ) {
  
        }
        /**
 -      * Main use is if a single item has multiple xmp documents describing it.
 -      * For example in jpeg's with extendedXMP
 -      */
 +       * Main use is if a single item has multiple xmp documents describing it.
 +       * For example in jpeg's with extendedXMP
 +       */
        private function resetXMLParser() {
  
                if ( $this->xmlParser ) {
        }
  
        /** Destroy the xml parser
 -      *
 -      * Not sure if this is actually needed.
 -      */
 +       *
 +       * Not sure if this is actually needed.
 +       */
        function __destruct() {
                // not sure if this is needed.
                xml_parser_free( $this->xmlParser );
        }
  
        /** Get the result array. Do some post-processing before returning
 -      * the array, and transform any metadata that is special-cased.
 -      *
 -      * @return Array array of results as an array of arrays suitable for
 -            FormatMetadata::getFormattedData().
 -      */
 +       * the array, and transform any metadata that is special-cased.
 +       *
 +       * @return Array array of results as an array of arrays suitable for
 +       *      FormatMetadata::getFormattedData().
 +       */
        public function getResults() {
                // xmp-special is for metadata that affects how stuff
                // is extracted. For example xmpNote:HasExtendedXMP.
                        }
                }
  
                // We don't want to return the special values, since they're
                // special and not info to be stored about the file.
                unset( $data['xmp-special'] );
                        return false;
                }
  
                // we're not very robust here. we should accept it in the wrong order. To quote
                // the xmp standard:
                // "A JPEG writer should write the ExtendedXMP marker segments in order, immediately following the
        }
  
        /**
 -      * Character data handler
 -      * Called whenever character data is found in the xmp document.
 -      *
 -      * does nothing if we're in MODE_IGNORE or if the data is whitespace
 -      * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
 -      * data in the other modes).
 -      *
 -      * As an example, this happens when we encounter XMP like:
 -      * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
 -      * and are processing the 0/10 bit.
 -      *
 -      * @param $parser XMLParser reference to the xml parser
 -      * @param $data String Character data
 -      * @throws MWException on invalid data
 -      */
 +       * Character data handler
 +       * Called whenever character data is found in the xmp document.
 +       *
 +       * does nothing if we're in MODE_IGNORE or if the data is whitespace
 +       * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
 +       * data in the other modes).
 +       *
 +       * As an example, this happens when we encounter XMP like:
 +       * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
 +       * and are processing the 0/10 bit.
 +       *
 +       * @param $parser XMLParser reference to the xml parser
 +       * @param $data String Character data
 +       * @throws MWException on invalid data
 +       */
        function char( $parser, $data ) {
  
                $data = trim( $data );
        }
  
        /** When we hit a closing element in MODE_IGNORE
 -      * Check to see if this is the element we started to ignore,
 -      * in which case we get out of MODE_IGNORE
 -      *
 -      * @param $elm String Namespace of element followed by a space and then tag name of element.
 -      */
 +       * Check to see if this is the element we started to ignore,
 +       * in which case we get out of MODE_IGNORE
 +       *
 +       * @param $elm String Namespace of element followed by a space and then tag name of element.
 +       */
        private function endElementModeIgnore ( $elm ) {
                if ( $this->curItem[0] === $elm ) {
                        array_shift( $this->curItem );
        }
  
        /**
 -      * Hit a closing element when in MODE_SIMPLE.
 -      * This generally means that we finished processing a
 -      * property value, and now have to save the result to the
 -      * results array
 -      *
 -      * For example, when processing:
 -      * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
 -      * this deals with when we hit </exif:DigitalZoomRatio>.
 -      *
 -      * Or it could be if we hit the end element of a property
 -      * of a compound data structure (like a member of an array).
 -      *
 -      * @param $elm String namespace, space, and tag name.
 -      */
 +       * Hit a closing element when in MODE_SIMPLE.
 +       * This generally means that we finished processing a
 +       * property value, and now have to save the result to the
 +       * results array
 +       *
 +       * For example, when processing:
 +       * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
 +       * this deals with when we hit </exif:DigitalZoomRatio>.
 +       *
 +       * Or it could be if we hit the end element of a property
 +       * of a compound data structure (like a member of an array).
 +       *
 +       * @param $elm String namespace, space, and tag name.
 +       */
        private function endElementModeSimple ( $elm ) {
                if ( $this->charContent !== false ) {
                        if ( $this->processingArray ) {
        }
  
        /**
 -      * End element while in MODE_QDESC
 -      * mostly when ending an element when we have a simple value
 -      * that has qualifiers.
 -      *
 -      * Qualifiers aren't all that common, and we don't do anything
 -      * with them.
 -      *
 -      * @param $elm String namespace and element
 -      */
 +       * End element while in MODE_QDESC
 +       * mostly when ending an element when we have a simple value
 +       * that has qualifiers.
 +       *
 +       * Qualifiers aren't all that common, and we don't do anything
 +       * with them.
 +       *
 +       * @param $elm String namespace and element
 +       */
        private function endElementModeQDesc( $elm ) {
  
                if ( $elm === self::NS_RDF . ' value' ) {
                        array_shift( $this->mode );
                        array_shift( $this->curItem );
                }
        }
  
        /**
        }
  
        /**
 -      * Hit an opening element while in MODE_IGNORE
 -      *
 -      * XMP is extensible, so ignore any tag we don't understand.
 -      *
 -      * Mostly ignores, unless we encounter the element that we are ignoring.
 -      * in which case we add it to the item stack, so we can ignore things
 -      * that are nested, correctly.
 -      *
 -      * @param $elm String namespace . ' ' . tag name
 -      */
 +       * Hit an opening element while in MODE_IGNORE
 +       *
 +       * XMP is extensible, so ignore any tag we don't understand.
 +       *
 +       * Mostly ignores, unless we encounter the element that we are ignoring.
 +       * in which case we add it to the item stack, so we can ignore things
 +       * that are nested, correctly.
 +       *
 +       * @param $elm String namespace . ' ' . tag name
 +       */
        private function startElementModeIgnore( $elm ) {
                if ( $elm === $this->curItem[0] ) {
                        array_unshift( $this->curItem, $elm );
        }
  
        /**
 -      *  Start element in MODE_BAG (unordered array)
 -      * this should always be <rdf:Bag>
 -      *
 -      * @param $elm String namespace . ' ' . tag
 -      * @throws MWException if we have an element that's not <rdf:Bag>
 -      */
 +       *  Start element in MODE_BAG (unordered array)
 +       * this should always be <rdf:Bag>
 +       *
 +       * @param $elm String namespace . ' ' . tag
 +       * @throws MWException if we have an element that's not <rdf:Bag>
 +       */
        private function startElementModeBag( $elm ) {
                if ( $elm === self::NS_RDF . ' Bag' ) {
                        array_unshift( $this->mode, self::MODE_LI );
        }
  
        /**
 -      * Start element in MODE_SEQ (ordered array)
 -      * this should always be <rdf:Seq>
 -      *
 -      * @param $elm String namespace . ' ' . tag
 -      * @throws MWException if we have an element that's not <rdf:Seq>
 -      */
 +       * Start element in MODE_SEQ (ordered array)
 +       * this should always be <rdf:Seq>
 +       *
 +       * @param $elm String namespace . ' ' . tag
 +       * @throws MWException if we have an element that's not <rdf:Seq>
 +       */
        private function startElementModeSeq( $elm ) {
                if ( $elm === self::NS_RDF . ' Seq' ) {
                        array_unshift( $this->mode, self::MODE_LI );
        }
  
        /**
 -      * Start element in MODE_LANG (language alternative)
 -      * this should always be <rdf:Alt>
 -      *
 -      * This tag tends to be used for metadata like describe this
 -      * picture, which can be translated into multiple languages.
 -      *
 -      * XMP supports non-linguistic alternative selections,
 -      * which are really only used for thumbnails, which
 -      * we don't care about.
 -      *
 -      * @param $elm String namespace . ' ' . tag
 -      * @throws MWException if we have an element that's not <rdf:Alt>
 -      */
 +       * Start element in MODE_LANG (language alternative)
 +       * this should always be <rdf:Alt>
 +       *
 +       * This tag tends to be used for metadata like describe this
 +       * picture, which can be translated into multiple languages.
 +       *
 +       * XMP supports non-linguistic alternative selections,
 +       * which are really only used for thumbnails, which
 +       * we don't care about.
 +       *
 +       * @param $elm String namespace . ' ' . tag
 +       * @throws MWException if we have an element that's not <rdf:Alt>
 +       */
        private function startElementModeLang( $elm ) {
                if ( $elm === self::NS_RDF . ' Alt' ) {
                        array_unshift( $this->mode, self::MODE_LI_LANG );
        }
  
        /**
 -      * Start an element when in MODE_QDESC.
 -      * This generally happens when a simple element has an inner
 -      * rdf:Description to hold qualifier elements.
 -      *
 -      * For example in:
 -      * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
 -      *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
 -      *   </exif:DigitalZoomRatio>
 -      * Called when processing the <rdf:value> or <foo:someQualifier>.
 -      *
 -      * @param $elm String namespace and tag name separated by a space.
 -      *
 -      */
 +       * Start an element when in MODE_QDESC.
 +       * This generally happens when a simple element has an inner
 +       * rdf:Description to hold qualifier elements.
 +       *
 +       * For example in:
 +       * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
 +       *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
 +       *   </exif:DigitalZoomRatio>
 +       * Called when processing the <rdf:value> or <foo:someQualifier>.
 +       *
 +       * @param $elm String namespace and tag name separated by a space.
 +       *
 +       */
        private function startElementModeQDesc( $elm ) {
                if ( $elm === self::NS_RDF . ' value' ) {
                        return; // do nothing
        }
  
        /**
 -      * opening element in MODE_LI
 -      * process elements of arrays.
 -      *
 -      * Example:
 -      * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
 -      *   </rdf:Seq> </exif:ISOSpeedRatings>
 -      * This method is called when we hit the <rdf:li> element.
 -      *
 -      * @param $elm String: namespace . ' ' . tagname
 -      * @param $attribs Array: Attributes. (needed for BAGSTRUCTS)
 -      * @throws MWException if gets a tag other than <rdf:li>
 -      */
 +       * opening element in MODE_LI
 +       * process elements of arrays.
 +       *
 +       * Example:
 +       * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
 +       *   </rdf:Seq> </exif:ISOSpeedRatings>
 +       * This method is called when we hit the <rdf:li> element.
 +       *
 +       * @param $elm String: namespace . ' ' . tagname
 +       * @param $attribs Array: Attributes. (needed for BAGSTRUCTS)
 +       * @throws MWException if gets a tag other than <rdf:li>
 +       */
        private function startElementModeLi( $elm, $attribs ) {
                if ( ( $elm ) !== self::NS_RDF . ' li' ) {
                        throw new MWException( "<rdf:li> expected but got $elm." );
        }
  
        /**
 -      * Opening element in MODE_LI_LANG.
 -      * process elements of language alternatives
 -      *
 -      * Example:
 -      * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
 -      *  </rdf:li> </rdf:Alt> </dc:title>
 -      *
 -      * This method is called when we hit the <rdf:li> element.
 -      *
 -      * @param $elm String namespace . ' ' . tag
 -      * @param $attribs array array of elements (most importantly xml:lang)
 -      * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
 -      */
 +       * Opening element in MODE_LI_LANG.
 +       * process elements of language alternatives
 +       *
 +       * Example:
 +       * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
 +       *  </rdf:li> </rdf:Alt> </dc:title>
 +       *
 +       * This method is called when we hit the <rdf:li> element.
 +       *
 +       * @param $elm String namespace . ' ' . tag
 +       * @param $attribs array array of elements (most importantly xml:lang)
 +       * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
 +       */
        private function startElementModeLiLang( $elm, $attribs ) {
                if ( $elm !== self::NS_RDF . ' li' ) {
                        throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
                        $this->mode[0] = self::MODE_QDESC;
                }
                foreach ( $attribs as $name => $val ) {
                        if ( strpos( $name, ' ' ) === false ) {
                                // This shouldn't happen, but so far some old software forgets namespace
                                // on rdf:about.
        }
  
        /**
 -      * Given an extracted value, save it to results array
 -      *
 -      * note also uses $this->ancestorStruct and
 -      * $this->processingArray to determine what name to
 -      * save the value under. (in addition to $tag).
 -      *
 -      * @param $ns String namespace of tag this is for
 -      * @param $tag String tag name
 -      * @param $val String value to save
 -      */
 +       * Given an extracted value, save it to results array
 +       *
 +       * note also uses $this->ancestorStruct and
 +       * $this->processingArray to determine what name to
 +       * save the value under. (in addition to $tag).
 +       *
 +       * @param $ns String namespace of tag this is for
 +       * @param $tag String tag name
 +       * @param $val String value to save
 +       */
        private function saveValue( $ns, $tag, $val ) {
  
                $info =& $this->items[$ns][$tag];
   */
  
  /**
 -* This contains some static methods for
 -* validating XMP properties. See XMPInfo and XMPReader classes.
 -*
 -* Each of these functions take the same parameters
 -* * an info array which is a subset of the XMPInfo::items array
 -* * A value (passed as reference) to validate. This can be either a
 -    simple value or an array
 -* * A boolean to determine if this is validating a simple or complex values
 -*
 -* It should be noted that when an array is being validated, typically the validation
 -* function is called once for each value, and then once at the end for the entire array.
 -*
 -* These validation functions can also be used to modify the data. See the gps and flash one's
 -* for example.
 -*
 -* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
 -* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
 -*/
 + * This contains some static methods for
 + * validating XMP properties. See XMPInfo and XMPReader classes.
 + *
 + * Each of these functions take the same parameters
 + * * an info array which is a subset of the XMPInfo::items array
 + * * A value (passed as reference) to validate. This can be either a
 + *    simple value or an array
 + * * A boolean to determine if this is validating a simple or complex values
 + *
 + * It should be noted that when an array is being validated, typically the validation
 + * function is called once for each value, and then once at the end for the entire array.
 + *
 + * These validation functions can also be used to modify the data. See the gps and flash one's
 + * for example.
 + *
 + * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
 + * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
 + */
  class XMPValidate {
        /**
 -      * function to validate boolean properties ( True or False )
 -      *
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate boolean properties ( True or False )
 +       *
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateBoolean( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
        }
  
        /**
 -      * function to validate rational properties ( 12/10 )
 -      *
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate rational properties ( 12/10 )
 +       *
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateRational( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
        }
  
        /**
 -      * function to validate rating properties -1, 0-5
 -      *
 -      * if its outside of range put it into range.
 -      *
 -      * @see MWG spec
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate rating properties -1, 0-5
 +       *
 +       * if its outside of range put it into range.
 +       *
 +       * @see MWG spec
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateRating( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
        }
  
        /**
 -      * function to validate integers
 -      *
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate integers
 +       *
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateInteger( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
        }
  
        /**
 -      * function to validate properties with a fixed number of allowed
 -      * choices. (closed choice)
 -      *
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate properties with a fixed number of allowed
 +       * choices. (closed choice)
 +       *
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateClosed( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
        }
  
        /**
 -      * function to validate and modify flash structure
 -      *
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate and modify flash structure
 +       *
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateFlash( $info, &$val, $standalone ) {
                if ( $standalone ) {
                        // this only validates flash structs, not individual properties
        }
  
        /**
 -      * function to validate LangCode properties ( en-GB, etc )
 -      *
 -      * This is just a naive check to make sure it somewhat looks like a lang code.
 -      *
 -      * @see rfc 3066
 -      * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
 -      *
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate LangCode properties ( en-GB, etc )
 +       *
 +       * This is just a naive check to make sure it somewhat looks like a lang code.
 +       *
 +       * @see rfc 3066
 +       * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
 +       *
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateLangCode( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
        }
  
        /**
 -      * function to validate date properties, and convert to (partial) Exif format.
 -      *
 -      * Dates can be one of the following formats:
 -      * YYYY
 -      * YYYY-MM
 -      * YYYY-MM-DD
 -      * YYYY-MM-DDThh:mmTZD
 -      * YYYY-MM-DDThh:mm:ssTZD
 -      * YYYY-MM-DDThh:mm:ss.sTZD
 -      *
 -      * @param $info Array information about current property
 -      * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
 -            in cases where there's only a partial date, it will give things like
 -            2011:04.
 -      * @param $standalone Boolean if this is a simple property or array
 -      */
 +       * function to validate date properties, and convert to (partial) Exif format.
 +       *
 +       * Dates can be one of the following formats:
 +       * YYYY
 +       * YYYY-MM
 +       * YYYY-MM-DD
 +       * YYYY-MM-DDThh:mmTZD
 +       * YYYY-MM-DDThh:mm:ssTZD
 +       * YYYY-MM-DDThh:mm:ss.sTZD
 +       *
 +       * @param $info Array information about current property
 +       * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
 +       *      in cases where there's only a partial date, it will give things like
 +       *      2011:04.
 +       * @param $standalone Boolean if this is a simple property or array
 +       */
        public static function validateDate( $info, &$val, $standalone ) {
                if ( !$standalone ) {
                        // this only validates standalone properties, not arrays, etc
                                return;
                        }
  
                        // Extra check for empty string necessary due to TZ but no second case.
                        $stripSeconds = false;
                        if ( !isset( $res[6] ) || $res[6] === '' ) {