llmediaentry.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:18k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmediaentry.cpp
  3.  * @brief This is a single instance of media data related to the face of a prim
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "linden_common.h"
  33. #include "llmediaentry.h"
  34. #include "lllslconstants.h"
  35. #include <boost/regex.hpp>
  36. // LLSD key defines
  37. // DO NOT REORDER OR REMOVE THESE!
  38. // Some LLSD keys.  Do not change!
  39. #define MEDIA_ALT_IMAGE_ENABLE_KEY_STR   "alt_image_enable"
  40. #define MEDIA_CONTROLS_KEY_STR           "controls"
  41. #define MEDIA_CURRENT_URL_KEY_STR        "current_url"
  42. #define MEDIA_HOME_URL_KEY_STR           "home_url"
  43. #define MEDIA_AUTO_LOOP_KEY_STR          "auto_loop"
  44. #define MEDIA_AUTO_PLAY_KEY_STR          "auto_play"
  45. #define MEDIA_AUTO_SCALE_KEY_STR         "auto_scale"
  46. #define MEDIA_AUTO_ZOOM_KEY_STR          "auto_zoom"
  47. #define MEDIA_FIRST_CLICK_INTERACT_KEY_STR  "first_click_interact"
  48. #define MEDIA_WIDTH_PIXELS_KEY_STR       "width_pixels"
  49. #define MEDIA_HEIGHT_PIXELS_KEY_STR      "height_pixels"
  50. // "security" fields
  51. #define MEDIA_WHITELIST_ENABLE_KEY_STR   "whitelist_enable"
  52. #define MEDIA_WHITELIST_KEY_STR          "whitelist"
  53. // "permissions" fields
  54. #define MEDIA_PERMS_INTERACT_KEY_STR     "perms_interact"
  55. #define MEDIA_PERMS_CONTROL_KEY_STR      "perms_control"
  56. // "general" fields
  57. const char* LLMediaEntry::ALT_IMAGE_ENABLE_KEY  = MEDIA_ALT_IMAGE_ENABLE_KEY_STR;
  58. const char* LLMediaEntry::CONTROLS_KEY          = MEDIA_CONTROLS_KEY_STR;
  59. const char* LLMediaEntry::CURRENT_URL_KEY       = MEDIA_CURRENT_URL_KEY_STR;
  60. const char* LLMediaEntry::HOME_URL_KEY          = MEDIA_HOME_URL_KEY_STR;
  61. const char* LLMediaEntry::AUTO_LOOP_KEY         = MEDIA_AUTO_LOOP_KEY_STR;
  62. const char* LLMediaEntry::AUTO_PLAY_KEY         = MEDIA_AUTO_PLAY_KEY_STR;
  63. const char* LLMediaEntry::AUTO_SCALE_KEY        = MEDIA_AUTO_SCALE_KEY_STR;
  64. const char* LLMediaEntry::AUTO_ZOOM_KEY         = MEDIA_AUTO_ZOOM_KEY_STR;
  65. const char* LLMediaEntry::FIRST_CLICK_INTERACT_KEY = MEDIA_FIRST_CLICK_INTERACT_KEY_STR;
  66. const char* LLMediaEntry::WIDTH_PIXELS_KEY      = MEDIA_WIDTH_PIXELS_KEY_STR;
  67. const char* LLMediaEntry::HEIGHT_PIXELS_KEY     = MEDIA_HEIGHT_PIXELS_KEY_STR;
  68. // "security" fields
  69. const char* LLMediaEntry::WHITELIST_ENABLE_KEY  = MEDIA_WHITELIST_ENABLE_KEY_STR;
  70. const char* LLMediaEntry::WHITELIST_KEY         = MEDIA_WHITELIST_KEY_STR;
  71. // "permissions" fields
  72. const char* LLMediaEntry::PERMS_INTERACT_KEY    = MEDIA_PERMS_INTERACT_KEY_STR;
  73. const char* LLMediaEntry::PERMS_CONTROL_KEY     = MEDIA_PERMS_CONTROL_KEY_STR;
  74. #define DEFAULT_URL_PREFIX  "http://"
  75. // Constructor(s)
  76. LLMediaEntry::LLMediaEntry() :
  77.     mAltImageEnable(false),
  78.     mControls(STANDARD),
  79.     mCurrentURL(""),
  80.     mHomeURL(""),
  81.     mAutoLoop(false),
  82.     mAutoPlay(false),
  83.     mAutoScale(false),
  84.     mAutoZoom(false),
  85.     mFirstClickInteract(false),
  86.     mWidthPixels(0),
  87.     mHeightPixels(0),
  88.     mWhiteListEnable(false),
  89.     // mWhiteList
  90.     mPermsInteract(PERM_ALL),
  91.     mPermsControl(PERM_ALL),
  92.     mMediaIDp(NULL)
  93. {
  94. }
  95. LLMediaEntry::LLMediaEntry(const LLMediaEntry &rhs) :
  96.     mMediaIDp(NULL)
  97. {
  98.     // "general" fields
  99.     mAltImageEnable = rhs.mAltImageEnable;
  100.     mControls = rhs.mControls;
  101.     mCurrentURL = rhs.mCurrentURL;
  102.     mHomeURL = rhs.mHomeURL;
  103.     mAutoLoop = rhs.mAutoLoop;
  104.     mAutoPlay = rhs.mAutoPlay;
  105.     mAutoScale = rhs.mAutoScale;
  106.     mAutoZoom = rhs.mAutoZoom;
  107.     mFirstClickInteract = rhs.mFirstClickInteract;
  108.     mWidthPixels = rhs.mWidthPixels;
  109.     mHeightPixels = rhs.mHeightPixels;
  110.     // "security" fields
  111.     mWhiteListEnable = rhs.mWhiteListEnable;
  112.     mWhiteList = rhs.mWhiteList;
  113.     // "permissions" fields
  114.     mPermsInteract = rhs.mPermsInteract;
  115.     mPermsControl = rhs.mPermsControl;
  116. }
  117. LLMediaEntry::~LLMediaEntry()
  118. {
  119.     if (NULL != mMediaIDp)
  120.     {
  121.         delete mMediaIDp;
  122.     }
  123. }
  124. LLSD LLMediaEntry::asLLSD() const
  125. {
  126.     LLSD sd;
  127.     asLLSD(sd);
  128.     return sd;
  129. }
  130. //
  131. // LLSD functions
  132. //
  133. void LLMediaEntry::asLLSD(LLSD& sd) const
  134. {
  135.     // "general" fields
  136.     sd[ALT_IMAGE_ENABLE_KEY] = mAltImageEnable;
  137.     sd[CONTROLS_KEY] = (LLSD::Integer)mControls;
  138.     sd[CURRENT_URL_KEY] = mCurrentURL;
  139.     sd[HOME_URL_KEY] = mHomeURL;
  140.     sd[AUTO_LOOP_KEY] = mAutoLoop;
  141.     sd[AUTO_PLAY_KEY] = mAutoPlay;
  142.     sd[AUTO_SCALE_KEY] = mAutoScale;
  143.     sd[AUTO_ZOOM_KEY] = mAutoZoom;
  144.     sd[FIRST_CLICK_INTERACT_KEY] = mFirstClickInteract;
  145.     sd[WIDTH_PIXELS_KEY] = mWidthPixels;
  146.     sd[HEIGHT_PIXELS_KEY] = mHeightPixels;
  147.     // "security" fields
  148.     sd[WHITELIST_ENABLE_KEY] = mWhiteListEnable;
  149. sd.erase(WHITELIST_KEY);
  150.     for (U32 i=0; i<mWhiteList.size(); i++) 
  151. {
  152.         sd[WHITELIST_KEY].append(mWhiteList[i]);
  153.     }
  154.     // "permissions" fields
  155.     sd[PERMS_INTERACT_KEY] = mPermsInteract;
  156.     sd[PERMS_CONTROL_KEY] = mPermsControl;
  157. }
  158. // static
  159. bool LLMediaEntry::checkLLSD(const LLSD& sd)
  160. {
  161.     if (sd.isUndefined()) return true;
  162.     LLMediaEntry temp;
  163.     return temp.fromLLSDInternal(sd, true);
  164. }
  165. void LLMediaEntry::fromLLSD(const LLSD& sd)
  166. {
  167.     (void)fromLLSDInternal(sd, true);
  168. }
  169. void LLMediaEntry::mergeFromLLSD(const LLSD& sd)
  170. {
  171.     (void)fromLLSDInternal(sd, false);
  172. }
  173. // *NOTE: returns true if NO failures to set occurred, false otherwise.
  174. //        However, be aware that if a failure to set does occur, it does
  175. //        not stop setting fields from the LLSD!
  176. bool LLMediaEntry::fromLLSDInternal(const LLSD& sd, bool overwrite)
  177. {
  178.     // *HACK: we sort of cheat here and assume that status is a
  179.     // bit field.  We "or" into status and instead of returning
  180.     // it, we return whether it finishes off as LSL_STATUS_OK or not.
  181.     U32 status = LSL_STATUS_OK;
  182.     
  183.     // "general" fields
  184.     if ( overwrite || sd.has(ALT_IMAGE_ENABLE_KEY) )
  185.     {
  186.         status |= setAltImageEnable( sd[ALT_IMAGE_ENABLE_KEY] );
  187.     }
  188.     if ( overwrite || sd.has(CONTROLS_KEY) )
  189.     {
  190.         status |= setControls( (MediaControls)(LLSD::Integer)sd[CONTROLS_KEY] );
  191.     }
  192.     if ( overwrite || sd.has(CURRENT_URL_KEY) )
  193.     {
  194.         // Don't check whitelist
  195.         status |= setCurrentURLInternal( sd[CURRENT_URL_KEY], false );
  196.     }
  197.     if ( overwrite || sd.has(HOME_URL_KEY) )
  198.     {
  199.         status |= setHomeURL( sd[HOME_URL_KEY] );
  200.     }
  201.     if ( overwrite || sd.has(AUTO_LOOP_KEY) )
  202.     {
  203.         status |= setAutoLoop( sd[AUTO_LOOP_KEY] );
  204.     }
  205.     if ( overwrite || sd.has(AUTO_PLAY_KEY) )
  206.     {
  207.         status |= setAutoPlay( sd[AUTO_PLAY_KEY] );
  208.     }
  209.     if ( overwrite || sd.has(AUTO_SCALE_KEY) )
  210.     {
  211.         status |= setAutoScale( sd[AUTO_SCALE_KEY] );
  212.     }
  213.     if ( overwrite || sd.has(AUTO_ZOOM_KEY) )
  214.     {
  215.         status |= setAutoZoom( sd[AUTO_ZOOM_KEY] );
  216.     }
  217.     if ( overwrite || sd.has(FIRST_CLICK_INTERACT_KEY) )
  218.     {
  219.         status |= setFirstClickInteract( sd[FIRST_CLICK_INTERACT_KEY] );
  220.     }
  221.     if ( overwrite || sd.has(WIDTH_PIXELS_KEY) )
  222.     {
  223.         status |= setWidthPixels( (LLSD::Integer)sd[WIDTH_PIXELS_KEY] );
  224.     }
  225.     if ( overwrite || sd.has(HEIGHT_PIXELS_KEY) )
  226.     {
  227.         status |= setHeightPixels( (LLSD::Integer)sd[HEIGHT_PIXELS_KEY] );
  228.     }
  229.     // "security" fields
  230.     if ( overwrite || sd.has(WHITELIST_ENABLE_KEY) )
  231.     {
  232.         status |= setWhiteListEnable( sd[WHITELIST_ENABLE_KEY] );
  233.     }
  234.     if ( overwrite || sd.has(WHITELIST_KEY) )
  235.     {
  236.         status |= setWhiteList( sd[WHITELIST_KEY] );
  237.     }
  238.     // "permissions" fields
  239.     if ( overwrite || sd.has(PERMS_INTERACT_KEY) )
  240.     {
  241.         status |= setPermsInteract( 0xff & (LLSD::Integer)sd[PERMS_INTERACT_KEY] );
  242.     }
  243.     if ( overwrite || sd.has(PERMS_CONTROL_KEY) )
  244.     {
  245.         status |= setPermsControl( 0xff & (LLSD::Integer)sd[PERMS_CONTROL_KEY] );
  246.     }
  247.     
  248.     return LSL_STATUS_OK == status;
  249. }
  250. LLMediaEntry& LLMediaEntry::operator=(const LLMediaEntry &rhs)
  251. {
  252.     if (this != &rhs)
  253.     {
  254.         // "general" fields
  255.         mAltImageEnable = rhs.mAltImageEnable;
  256.         mControls = rhs.mControls;
  257.         mCurrentURL = rhs.mCurrentURL;
  258.         mHomeURL = rhs.mHomeURL;
  259.         mAutoLoop = rhs.mAutoLoop;
  260.         mAutoPlay = rhs.mAutoPlay;
  261.         mAutoScale = rhs.mAutoScale;
  262.         mAutoZoom = rhs.mAutoZoom;
  263.         mFirstClickInteract = rhs.mFirstClickInteract;
  264.         mWidthPixels = rhs.mWidthPixels;
  265.         mHeightPixels = rhs.mHeightPixels;
  266.         // "security" fields
  267.         mWhiteListEnable = rhs.mWhiteListEnable;
  268.         mWhiteList = rhs.mWhiteList;
  269.         // "permissions" fields
  270.         mPermsInteract = rhs.mPermsInteract;
  271.         mPermsControl = rhs.mPermsControl;
  272.     }
  273.     return *this;
  274. }
  275. bool LLMediaEntry::operator==(const LLMediaEntry &rhs) const
  276. {
  277.     return (
  278.         // "general" fields
  279.         mAltImageEnable == rhs.mAltImageEnable &&
  280.         mControls == rhs.mControls &&
  281.         mCurrentURL == rhs.mCurrentURL &&
  282.         mHomeURL == rhs.mHomeURL &&
  283.         mAutoLoop == rhs.mAutoLoop &&
  284.         mAutoPlay == rhs.mAutoPlay &&
  285.         mAutoScale == rhs.mAutoScale &&
  286.         mAutoZoom == rhs.mAutoZoom &&
  287.         mFirstClickInteract == rhs.mFirstClickInteract &&
  288.         mWidthPixels == rhs.mWidthPixels &&
  289.         mHeightPixels == rhs.mHeightPixels &&
  290.         // "security" fields
  291.         mWhiteListEnable == rhs.mWhiteListEnable &&
  292.         mWhiteList == rhs.mWhiteList &&
  293.         // "permissions" fields
  294.         mPermsInteract == rhs.mPermsInteract &&
  295.         mPermsControl == rhs.mPermsControl
  296.         );
  297. }
  298.  
  299. bool LLMediaEntry::operator!=(const LLMediaEntry &rhs) const
  300. {
  301.     return (
  302.         // "general" fields
  303.         mAltImageEnable != rhs.mAltImageEnable ||
  304.         mControls != rhs.mControls ||
  305.         mCurrentURL != rhs.mCurrentURL ||
  306.         mHomeURL != rhs.mHomeURL ||
  307.         mAutoLoop != rhs.mAutoLoop ||
  308.         mAutoPlay != rhs.mAutoPlay ||
  309.         mAutoScale != rhs.mAutoScale ||
  310.         mAutoZoom != rhs.mAutoZoom ||
  311.         mFirstClickInteract != rhs.mFirstClickInteract ||
  312.         mWidthPixels != rhs.mWidthPixels ||
  313.         mHeightPixels != rhs.mHeightPixels ||
  314.         // "security" fields
  315.         mWhiteListEnable != rhs.mWhiteListEnable ||
  316.         mWhiteList != rhs.mWhiteList ||
  317.         // "permissions" fields
  318.         mPermsInteract != rhs.mPermsInteract ||
  319.         mPermsControl != rhs.mPermsControl 
  320.         
  321.         );
  322. }
  323. U32 LLMediaEntry::setWhiteList( const std::vector<std::string> &whitelist )
  324. {
  325.     // *NOTE: This code is VERY similar to the setWhitelist below.
  326.     // IF YOU CHANGE THIS IMPLEMENTATION, BE SURE TO CHANGE THE OTHER!
  327.     U32 size = 0;
  328.     U32 count = 0;
  329.     // First count to make sure the size constraint is not violated
  330.     std::vector<std::string>::const_iterator iter = whitelist.begin();
  331.     std::vector<std::string>::const_iterator end = whitelist.end();
  332.     for ( ; iter < end; ++iter) 
  333.     {
  334.         const std::string &entry = (*iter);
  335.         size += entry.length() + 1; // Include one for 
  336.         count ++;
  337.         if (size > MAX_WHITELIST_SIZE || count > MAX_WHITELIST_COUNT) 
  338. {
  339.             return LSL_STATUS_BOUNDS_ERROR;
  340.         }
  341.     }
  342.     // Next clear the vector
  343.     mWhiteList.clear();
  344.     // Then re-iterate and copy entries
  345.     iter = whitelist.begin();
  346.     for ( ; iter < end; ++iter)
  347.     {
  348.         const std::string &entry = (*iter);
  349.         mWhiteList.push_back(entry);
  350.     }
  351.     return LSL_STATUS_OK;
  352. }
  353. U32 LLMediaEntry::setWhiteList( const LLSD &whitelist )
  354. {
  355.     // If whitelist is undef, the whitelist is cleared
  356.     if (whitelist.isUndefined()) 
  357. {
  358. mWhiteList.clear();
  359. return LSL_STATUS_OK;
  360. }
  361.     // However, if the whitelist is an empty array, erase it.
  362.     if (whitelist.isArray()) 
  363.     {
  364.         // *NOTE: This code is VERY similar to the setWhitelist above.
  365.         // IF YOU CHANGE THIS IMPLEMENTATION, BE SURE TO CHANGE THE OTHER!
  366.         U32 size = 0;
  367.         U32 count = 0;
  368.         // First check to make sure the size and count constraints are not violated
  369.         LLSD::array_const_iterator iter = whitelist.beginArray();
  370.         LLSD::array_const_iterator end = whitelist.endArray();
  371.         for ( ; iter < end; ++iter) 
  372.         {
  373.             const std::string &entry = (*iter).asString();
  374.             size += entry.length() + 1; // Include one for 
  375.             count ++;
  376.             if (size > MAX_WHITELIST_SIZE || count > MAX_WHITELIST_COUNT) 
  377. {
  378.                 return LSL_STATUS_BOUNDS_ERROR;
  379.             }
  380.         }
  381.         // Next clear the vector
  382.         mWhiteList.clear();
  383.         // Then re-iterate and copy entries
  384.         iter = whitelist.beginArray();
  385.         for ( ; iter < end; ++iter)
  386.         {
  387.             const std::string &entry = (*iter).asString();
  388.             mWhiteList.push_back(entry);
  389.         }
  390.         return LSL_STATUS_OK;
  391.     }
  392.     else 
  393. {
  394.         return LSL_STATUS_MALFORMED_PARAMS;
  395.     }
  396. }
  397. static void prefix_with(std::string &str, const char *chars, const char *prefix)
  398. {
  399.     // Given string 'str', prefix all instances of any character in 'chars'
  400.     // with 'prefix'
  401.     size_t found = str.find_first_of(chars);
  402.     size_t prefix_len = strlen(prefix);
  403.     while (found != std::string::npos)
  404.     {
  405.         str.insert(found, prefix, prefix_len);
  406.         found = str.find_first_of(chars, found+prefix_len+1);
  407.     }
  408. }
  409. static bool pattern_match(const std::string &candidate_str, const std::string &pattern)
  410. {
  411.     // If the pattern is empty, it matches
  412.     if (pattern.empty()) return true;
  413.     
  414.     // 'pattern' is a glob pattern, we only accept '*' chars
  415.     // copy it
  416.     std::string expression = pattern;
  417.     
  418.     // Escape perl's regexp chars with a backslash, except all "*" chars
  419.     prefix_with(expression, ".[{()\+?|^$", "\");
  420.     prefix_with(expression, "*", ".");
  421.                     
  422.     // case-insensitive matching:
  423.     boost::regex regexp(expression, boost::regex::perl|boost::regex::icase);
  424.     return boost::regex_match(candidate_str, regexp);
  425. }
  426. bool LLMediaEntry::checkCandidateUrl(const std::string& url) const
  427. {
  428.     if (getWhiteListEnable()) 
  429.     {
  430.         return checkUrlAgainstWhitelist(url, getWhiteList());
  431.     }
  432.     else 
  433. {
  434.         return true;
  435.     }
  436. }
  437. // static
  438. bool LLMediaEntry::checkUrlAgainstWhitelist(const std::string& url, 
  439.                                             const std::vector<std::string> &whitelist)
  440. {
  441.     bool passes = true;
  442.     // *NOTE: no entries?  Don't check
  443.     if (whitelist.size() > 0) 
  444.     {
  445.         passes = false;
  446.             
  447.         // Case insensitive: the reason why we toUpper both this and the
  448.         // filter
  449.         std::string candidate_url = url;
  450.         // Use lluri to see if there is a path part in the candidate URL.  No path?  Assume "/"
  451.         LLURI candidate_uri(candidate_url);
  452.         std::vector<std::string>::const_iterator iter = whitelist.begin();
  453.         std::vector<std::string>::const_iterator end = whitelist.end();
  454.         for ( ; iter < end; ++iter )
  455.         {
  456.             std::string filter = *iter;
  457.                 
  458.             LLURI filter_uri(filter);
  459.             bool scheme_passes = pattern_match( candidate_uri.scheme(), filter_uri.scheme() );
  460.             if (filter_uri.scheme().empty()) 
  461.             {
  462.                 filter_uri = LLURI(DEFAULT_URL_PREFIX + filter);
  463.             }
  464.             bool authority_passes = pattern_match( candidate_uri.authority(), filter_uri.authority() );
  465.             bool path_passes = pattern_match( candidate_uri.escapedPath(), filter_uri.escapedPath() );
  466.             if (scheme_passes && authority_passes && path_passes)
  467.             {
  468.                 passes = true;
  469.                 break;
  470.             }
  471.         }
  472.     }
  473.     return passes;
  474. }
  475. U32 LLMediaEntry::setStringFieldWithLimit( std::string &field, const std::string &value, U32 limit )
  476. {
  477.     if ( value.length() > limit ) 
  478. {
  479.         return LSL_STATUS_BOUNDS_ERROR;
  480.     }
  481.     else 
  482. {
  483.         field = value;
  484.         return LSL_STATUS_OK;
  485.     }
  486. }
  487. U32 LLMediaEntry::setControls(LLMediaEntry::MediaControls controls)
  488. {
  489.     if (controls == STANDARD ||
  490.         controls == MINI)
  491.     {
  492.         mControls = controls;
  493.         return LSL_STATUS_OK;
  494.     }
  495.     return LSL_STATUS_BOUNDS_ERROR;
  496. }
  497. U32 LLMediaEntry::setPermsInteract( U8 val )
  498. {
  499.     mPermsInteract = val & PERM_MASK;
  500.     return LSL_STATUS_OK;
  501. }
  502. U32 LLMediaEntry::setPermsControl( U8 val )
  503. {
  504.     mPermsControl = val & PERM_MASK;
  505.     return LSL_STATUS_OK;
  506. }
  507. U32 LLMediaEntry::setCurrentURL(const std::string& current_url)
  508. {
  509.     return setCurrentURLInternal( current_url, true );
  510. }
  511. U32 LLMediaEntry::setCurrentURLInternal(const std::string& current_url, bool check_whitelist)
  512. {
  513.     if ( ! check_whitelist || checkCandidateUrl(current_url)) 
  514.     {
  515.         return setStringFieldWithLimit( mCurrentURL, current_url, MAX_URL_LENGTH );
  516.     }
  517.     else 
  518. {
  519.         return LSL_STATUS_WHITELIST_FAILED;
  520.     }
  521. }
  522. U32 LLMediaEntry::setHomeURL(const std::string& home_url)
  523. {
  524.     return setStringFieldWithLimit( mHomeURL, home_url, MAX_URL_LENGTH );
  525. }
  526. U32 LLMediaEntry::setWidthPixels(U16 width)
  527. {
  528.     if (width > MAX_WIDTH_PIXELS) return LSL_STATUS_BOUNDS_ERROR;
  529.     mWidthPixels = width;
  530.     return LSL_STATUS_OK; 
  531. }
  532. U32 LLMediaEntry::setHeightPixels(U16 height)
  533. {
  534.     if (height > MAX_HEIGHT_PIXELS) return LSL_STATUS_BOUNDS_ERROR;
  535.     mHeightPixels = height;
  536.     return LSL_STATUS_OK; 
  537. }
  538. const LLUUID &LLMediaEntry::getMediaID() const
  539. {
  540.     // Lazily generate media ID
  541.     if (NULL == mMediaIDp)
  542.     {
  543.         mMediaIDp = new LLUUID();
  544.         mMediaIDp->generate();
  545.     }
  546.     return *mMediaIDp;
  547. }