svn merge -r 79730:79944 svn+ssh://svn.lindenlab.com/svn/linden/branches/parcel_media/sl-parcelmedia-6 --> release
QAR-275 Parcel Media Sam made me do it.master
parent
89d938efe3
commit
98fd90ddd6
|
|
@ -357,6 +357,14 @@
|
|||
<key>trusted-sender</key>
|
||||
<boolean>true</boolean>
|
||||
</map>
|
||||
|
||||
<key>ParcelProperties</key>
|
||||
<map>
|
||||
<key>flavor</key>
|
||||
<string>llsd</string>
|
||||
<key>trusted-sender</key>
|
||||
<boolean>true</boolean>
|
||||
</map>
|
||||
|
||||
<key>avatarnotesrequest</key>
|
||||
<map>
|
||||
|
|
@ -514,7 +522,10 @@
|
|||
|
||||
<key>SearchStatTracking</key>
|
||||
<boolean>false</boolean>
|
||||
|
||||
|
||||
<key>ParcelPropertiesUpdate</key>
|
||||
<boolean>false</boolean>
|
||||
|
||||
</map>
|
||||
|
||||
<key>messageBans</key>
|
||||
|
|
|
|||
|
|
@ -323,6 +323,10 @@ const U32 PARCEL_MEDIA_COMMAND_TIME = 6;
|
|||
const U32 PARCEL_MEDIA_COMMAND_AGENT = 7;
|
||||
const U32 PARCEL_MEDIA_COMMAND_UNLOAD = 8;
|
||||
const U32 PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9;
|
||||
const U32 PARCEL_MEDIA_COMMAND_TYPE = 10;
|
||||
const U32 PARCEL_MEDIA_COMMAND_SIZE = 11;
|
||||
const U32 PARCEL_MEDIA_COMMAND_DESC = 12;
|
||||
const U32 PARCEL_MEDIA_COMMAND_LOOP_SET = 13;
|
||||
|
||||
// map item types
|
||||
const U32 MAP_ITEM_TELEHUB = 0x01;
|
||||
|
|
|
|||
|
|
@ -39,5 +39,7 @@ const U8 CLICK_ACTION_SIT = 1;
|
|||
const U8 CLICK_ACTION_BUY = 2;
|
||||
const U8 CLICK_ACTION_PAY = 3;
|
||||
const U8 CLICK_ACTION_OPEN = 4;
|
||||
const U8 CLICK_ACTION_PLAY = 5;
|
||||
const U8 CLICK_ACTION_OPEN_MEDIA = 6;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -52,33 +52,6 @@
|
|||
#define LL_FORCE_INLINE __forceinline
|
||||
#endif
|
||||
|
||||
// Per-OS feature switches.
|
||||
|
||||
#if LL_DARWIN
|
||||
#define LL_QUICKTIME_ENABLED 1
|
||||
#define LL_LIBXUL_ENABLED 1
|
||||
#elif LL_WINDOWS
|
||||
#define LL_QUICKTIME_ENABLED 1
|
||||
#define LL_LIBXUL_ENABLED 1
|
||||
#elif LL_LINUX
|
||||
#define LL_QUICKTIME_ENABLED 0
|
||||
#ifndef LL_LIBXUL_ENABLED
|
||||
#define LL_LIBXUL_ENABLED 1
|
||||
#endif // def LL_LIBXUL_ENABLED
|
||||
#elif LL_SOLARIS
|
||||
#define LL_QUICKTIME_ENABLED 0
|
||||
#ifndef LL_LIBXUL_ENABLED
|
||||
#define LL_LIBXUL_ENABLED 0
|
||||
#endif // def LL_LIBXUL_ENABLED
|
||||
#endif
|
||||
|
||||
#if LL_LIBXUL_ENABLED && !defined(MOZILLA_INTERNAL_API)
|
||||
// Without this, nsTAString.h errors out with:
|
||||
// "Cannot use internal string classes without MOZILLA_INTERNAL_API defined. Use the frozen header nsStringAPI.h instead."
|
||||
// It might be worth our while to figure out if we can use the frozen apis at some point...
|
||||
#define MOZILLA_INTERNAL_API 1
|
||||
#endif
|
||||
|
||||
// Figure out differences between compilers
|
||||
#if defined(__GNUC__)
|
||||
#define GCC_VERSION (__GNUC__ * 10000 \
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -211,8 +211,15 @@ public:
|
|||
void setDesc(const LLString& desc);
|
||||
void setMusicURL(const LLString& url);
|
||||
void setMediaURL(const LLString& url);
|
||||
void setMediaType(const char* type);
|
||||
void setMediaDesc(const char* desc);
|
||||
void setMediaID(const LLUUID& id) { mMediaID = id; }
|
||||
void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
|
||||
void setMediaLoop (U8 loop) { mMediaLoop = loop; }
|
||||
void setObscureMedia( U8 flagIn ) { mObscureMedia = flagIn; }
|
||||
void setObscureMusic( U8 flagIn ) { mObscureMusic = flagIn; }
|
||||
void setMediaWidth(S32 width);
|
||||
void setMediaHeight(S32 height);
|
||||
virtual void setLocalID(S32 local_id);
|
||||
|
||||
// blow away all the extra crap lurking in parcels, including urls, access lists, etc
|
||||
|
|
@ -268,6 +275,7 @@ public:
|
|||
BOOL exportStream(std::ostream& output_stream);
|
||||
|
||||
void packMessage(LLMessageSystem* msg);
|
||||
void packMessage(LLSD& msg);
|
||||
void unpackMessage(LLMessageSystem* msg);
|
||||
|
||||
void packAccessEntries(LLMessageSystem* msg,
|
||||
|
|
@ -299,8 +307,15 @@ public:
|
|||
const LLString& getDesc() const { return mDesc; }
|
||||
const LLString& getMusicURL() const { return mMusicURL; }
|
||||
const LLString& getMediaURL() const { return mMediaURL; }
|
||||
const char* getMediaDesc() const { return mMediaDesc.c_str(); }
|
||||
const char* getMediaType() const { return mMediaType.c_str(); }
|
||||
const LLUUID& getMediaID() const { return mMediaID; }
|
||||
S32 getMediaWidth() const { return mMediaWidth; }
|
||||
S32 getMediaHeight() const { return mMediaHeight; }
|
||||
U8 getMediaAutoScale() const { return mMediaAutoScale; }
|
||||
U8 getMediaLoop() const { return mMediaLoop; }
|
||||
U8 getObscureMedia() const { return mObscureMedia; }
|
||||
U8 getObscureMusic() const { return mObscureMusic; }
|
||||
S32 getLocalID() const { return mLocalID; }
|
||||
const LLUUID& getOwnerID() const { return mOwnerID; }
|
||||
const LLUUID& getGroupID() const { return mGroupID; }
|
||||
|
|
@ -576,7 +591,14 @@ protected:
|
|||
LLString mDesc;
|
||||
LLString mMusicURL;
|
||||
LLString mMediaURL;
|
||||
std::string mMediaDesc;
|
||||
std::string mMediaType;
|
||||
S32 mMediaWidth;
|
||||
S32 mMediaHeight;
|
||||
U8 mMediaAutoScale;
|
||||
U8 mMediaLoop;
|
||||
U8 mObscureMedia;
|
||||
U8 mObscureMusic;
|
||||
LLUUID mMediaID;
|
||||
S32 mPassPrice;
|
||||
F32 mPassHours;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include "llurlrequest.h"
|
||||
#include "llbufferstream.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llsdutil.h"
|
||||
#include "llvfile.h"
|
||||
#include "llvfs.h"
|
||||
#include "lluri.h"
|
||||
|
|
@ -112,7 +113,11 @@ void LLHTTPClient::Responder::completed(
|
|||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLHTTPClient::Responder::completedHeader(U32 status, const std::string& reason, const LLSD& content)
|
||||
{
|
||||
|
||||
}
|
||||
namespace
|
||||
{
|
||||
class LLHTTPClientURLAdaptor : public LLURLRequestComplete
|
||||
|
|
@ -140,13 +145,19 @@ namespace
|
|||
if (mResponder.get())
|
||||
{
|
||||
mResponder->completedRaw(mStatus, mReason, channels, buffer);
|
||||
mResponder->completedHeader(mStatus, mReason, mHeaderOutput);
|
||||
}
|
||||
}
|
||||
virtual void header(const std::string& header, const std::string& value)
|
||||
{
|
||||
mHeaderOutput[header] = value;
|
||||
}
|
||||
|
||||
private:
|
||||
LLHTTPClient::ResponderPtr mResponder;
|
||||
U32 mStatus;
|
||||
std::string mReason;
|
||||
LLSD mHeaderOutput;
|
||||
};
|
||||
|
||||
class Injector : public LLIOPipe
|
||||
|
|
@ -340,11 +351,18 @@ void LLHTTPClient::get(const std::string& url, ResponderPtr responder, const LLS
|
|||
{
|
||||
request(url, LLURLRequest::HTTP_GET, NULL, responder, headers, timeout);
|
||||
}
|
||||
|
||||
void LLHTTPClient::getHeaderOnly(const std::string& url, ResponderPtr responder, const LLSD& headers, const F32 timeout)
|
||||
{
|
||||
request(url, LLURLRequest::HTTP_HEAD, NULL, responder, headers, timeout);
|
||||
}
|
||||
void LLHTTPClient::get(const std::string& url, ResponderPtr responder, const F32 timeout)
|
||||
{
|
||||
get(url, responder, LLSD(), timeout);
|
||||
}
|
||||
void LLHTTPClient::getHeaderOnly(const std::string& url, ResponderPtr responder, const F32 timeout)
|
||||
{
|
||||
getHeaderOnly(url, responder, LLSD(), timeout);
|
||||
}
|
||||
|
||||
void LLHTTPClient::get(const std::string& url, const LLSD& query, ResponderPtr responder, const LLSD& headers, const F32 timeout)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -89,7 +89,11 @@ public:
|
|||
* result(), or
|
||||
* error()
|
||||
*/
|
||||
|
||||
|
||||
// Override to handle parsing of the header only. Note: this is the only place where the contents
|
||||
// of the header can be parsed. In the ::completed call above only the body is contained in the LLSD.
|
||||
virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content);
|
||||
|
||||
public: /* but not really -- don't touch this */
|
||||
U32 mReferenceCount;
|
||||
};
|
||||
|
|
@ -102,7 +106,10 @@ public:
|
|||
static void get(const std::string& url, const LLSD& query, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
static void get(const std::string& url, const LLSD& query, ResponderPtr, const LLSD& headers, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
static void put(const std::string& url, const LLSD& body, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
///< non-blocking
|
||||
static void getHeaderOnly(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
static void getHeaderOnly(const std::string& url, ResponderPtr, const LLSD& headers, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
|
||||
///< non-blocking
|
||||
static void post(const std::string& url, const LLSD& body, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
static void post(const std::string& url, const U8* data, S32 size, ResponderPtr responder, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
static void postFile(const std::string& url, const std::string& filename, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
|
||||
|
|
|
|||
|
|
@ -429,12 +429,10 @@ bool LLURLRequest::configure()
|
|||
switch(mAction)
|
||||
{
|
||||
case HTTP_HEAD:
|
||||
// These are in addition to the HTTP_GET options.
|
||||
curl_easy_setopt(mDetail->mCurl, CURLOPT_HEADER, 1);
|
||||
curl_easy_setopt(mDetail->mCurl, CURLOPT_NOBODY, 1);
|
||||
curl_easy_setopt(mDetail->mCurl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
rv = true;
|
||||
break;
|
||||
|
||||
|
||||
case HTTP_GET:
|
||||
curl_easy_setopt(mDetail->mCurl, CURLOPT_HTTPGET, 1);
|
||||
curl_easy_setopt(mDetail->mCurl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
|
|
|
|||
|
|
@ -686,7 +686,7 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (x_pos == 0 && y_pos == 0 && width == getWidth() && height == getHeight())
|
||||
if (x_pos == 0 && y_pos == 0 && width == getWidth() && height == getHeight() && data_width == width && data_height == height)
|
||||
{
|
||||
setImage(datap, FALSE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -640,12 +640,6 @@ void LLComboBox::showList()
|
|||
// NB: this call will trigger the focuslost callback which will hide the list, so do it first
|
||||
// before finally showing the list
|
||||
|
||||
if (!mList->getFirstSelected())
|
||||
{
|
||||
// if nothing is selected, select the first item
|
||||
// so that the callback is not immediately triggered on setFocus()
|
||||
mList->selectFirstItem();
|
||||
}
|
||||
mList->setFocus(TRUE);
|
||||
|
||||
// Show the list and push the button down
|
||||
|
|
@ -714,7 +708,7 @@ void LLComboBox::onButtonDown(void *userdata)
|
|||
else
|
||||
{
|
||||
self->hideList();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -737,30 +731,35 @@ void LLComboBox::onItemSelected(LLUICtrl* item, void *userdata)
|
|||
self->mTextEntry->selectAll();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// invalid selection, just restore existing value
|
||||
LLString orig_selection = self->mAllowTextEntry ? self->mTextEntry->getText() : self->mButton->getLabelSelected();
|
||||
|
||||
self->mList->selectItemByLabel(orig_selection);
|
||||
}
|
||||
self->onCommit();
|
||||
|
||||
// hiding the list reasserts the old value stored in the text editor/dropdown button
|
||||
self->hideList();
|
||||
|
||||
// commit does the reverse, asserting the value in the list
|
||||
self->onCommit();
|
||||
}
|
||||
|
||||
BOOL LLComboBox::handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect_screen)
|
||||
{
|
||||
LLString tool_tip;
|
||||
|
||||
if(LLUICtrl::handleToolTip(x, y, msg, sticky_rect_screen))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (LLUI::sShowXUINames)
|
||||
{
|
||||
tool_tip = getShowNamesToolTip();
|
||||
}
|
||||
else
|
||||
else if (!mToolTipMsg.empty())
|
||||
{
|
||||
tool_tip = mToolTipMsg;
|
||||
}
|
||||
else
|
||||
{
|
||||
tool_tip = getValue().asString();
|
||||
}
|
||||
|
||||
if( !tool_tip.empty() )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -245,7 +245,9 @@ void LLRadioGroup::draw()
|
|||
radio->setValue( selected );
|
||||
if (take_focus && selected && !gFocusMgr.childHasKeyboardFocus(radio))
|
||||
{
|
||||
radio->focusFirstItem();
|
||||
// don't flash keyboard focus when navigating via keyboard
|
||||
BOOL DONT_FLASH = FALSE;
|
||||
radio->focusFirstItem(FALSE, DONT_FLASH);
|
||||
}
|
||||
current_button++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1381,6 +1381,8 @@ LLScrollListItem* LLScrollListCtrl::addSeparator(EAddPosition pos)
|
|||
// Returns false if item not found.
|
||||
BOOL LLScrollListCtrl::selectItemByLabel(const LLString& label, BOOL case_sensitive)
|
||||
{
|
||||
// ensure that no stale items are selected, even if we don't find a match
|
||||
deselectAllItems(TRUE);
|
||||
//RN: assume no empty items
|
||||
if (label.empty())
|
||||
{
|
||||
|
|
@ -1762,10 +1764,9 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky
|
|||
{
|
||||
LLScrollListCell* hit_cell = hit_item->getColumn(column_index);
|
||||
if (!hit_cell) return FALSE;
|
||||
S32 cell_required_width = hit_cell->getContentWidth();
|
||||
//S32 cell_required_width = hit_cell->getContentWidth();
|
||||
if (hit_cell
|
||||
&& hit_cell->isText()
|
||||
&& cell_required_width > columnp->mWidth)
|
||||
&& hit_cell->isText())
|
||||
{
|
||||
|
||||
S32 rect_left = getColumnOffsetFromIndex(column_index) + mItemListRect.mLeft;
|
||||
|
|
@ -1781,8 +1782,8 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky
|
|||
&(sticky_rect_screen->mRight), &(sticky_rect_screen->mTop) );
|
||||
|
||||
msg = hit_cell->getValue().asString();
|
||||
handled = TRUE;
|
||||
}
|
||||
handled = TRUE;
|
||||
}
|
||||
|
||||
// otherwise, look for a tooltip associated with this column
|
||||
|
|
|
|||
|
|
@ -285,8 +285,6 @@ void LLUICtrl::setIsChrome(BOOL is_chrome)
|
|||
// virtual
|
||||
BOOL LLUICtrl::getIsChrome() const
|
||||
{
|
||||
// am I or any of my ancestors flagged as "chrome"?
|
||||
if (mIsChrome) return TRUE;
|
||||
|
||||
LLView* parent_ctrl = getParent();
|
||||
while(parent_ctrl)
|
||||
|
|
@ -300,11 +298,12 @@ BOOL LLUICtrl::getIsChrome() const
|
|||
|
||||
if(parent_ctrl)
|
||||
{
|
||||
// recurse into parent_ctrl and ask if it is in a chrome subtree
|
||||
return ((LLUICtrl*)parent_ctrl)->getIsChrome();
|
||||
return mIsChrome || ((LLUICtrl*)parent_ctrl)->getIsChrome();
|
||||
}
|
||||
else
|
||||
{
|
||||
return mIsChrome ;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// this comparator uses the crazy disambiguating logic of LLCompareByTabOrder,
|
||||
|
|
@ -341,7 +340,7 @@ public:
|
|||
};
|
||||
|
||||
|
||||
BOOL LLUICtrl::focusFirstItem(BOOL prefer_text_fields)
|
||||
BOOL LLUICtrl::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash)
|
||||
{
|
||||
// try to select default tab group child
|
||||
LLCtrlQuery query = LLView::getTabOrderQuery();
|
||||
|
|
@ -355,7 +354,10 @@ BOOL LLUICtrl::focusFirstItem(BOOL prefer_text_fields)
|
|||
{
|
||||
ctrl->setFocus(TRUE);
|
||||
ctrl->onTabInto();
|
||||
gFocusMgr.triggerFocusFlash();
|
||||
if(focus_flash)
|
||||
{
|
||||
gFocusMgr.triggerFocusFlash();
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ public:
|
|||
virtual void setMinValue(LLSD min_value);
|
||||
virtual void setMaxValue(LLSD max_value);
|
||||
|
||||
/*virtual*/ BOOL focusFirstItem(BOOL prefer_text_fields = FALSE );
|
||||
/*virtual*/ BOOL focusFirstItem(BOOL prefer_text_fields = FALSE, BOOL focus_flash = TRUE );
|
||||
|
||||
class LLTextInputFilter : public LLQueryFilter, public LLSingleton<LLTextInputFilter>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* @file lluifwd.h
|
||||
* @author James Cook
|
||||
* @brief Forward declarations of common LLUI widget types.
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#ifndef LLUIFWD_H
|
||||
#define LLUIFWD_H
|
||||
|
||||
class LLButton;
|
||||
class LLCheckBoxCtrl;
|
||||
class LLComboBox;
|
||||
class LLDragHandle;
|
||||
class LLFloater;
|
||||
class LLIconCtrl;
|
||||
class LLLineEditor;
|
||||
class LLMenuGL;
|
||||
class LLPanel;
|
||||
class LLRadioGroup;
|
||||
class LLResizeBar;
|
||||
class LLResizeHandle;
|
||||
class LLScrollbar;
|
||||
class LLScrollContainer;
|
||||
class LLScrollingPanelList;
|
||||
class LLScrollListCtrl;
|
||||
class LLSlider;
|
||||
class LLSliderCtrl;
|
||||
class LLSpinCtrl;
|
||||
class LLTabContainer;
|
||||
class LLTabContainerVertical;
|
||||
class LLTextBox;
|
||||
class LLTextEditor;
|
||||
class LLTextureCtrl;
|
||||
class LLUICtrl;
|
||||
class LLView;
|
||||
class LLViewBorder;
|
||||
|
||||
#endif
|
||||
|
|
@ -73,6 +73,9 @@ enum ECursorType {
|
|||
UI_CURSOR_TOOLBUY,
|
||||
UI_CURSOR_TOOLPAY,
|
||||
UI_CURSOR_TOOLOPEN,
|
||||
UI_CURSOR_TOOLPLAY,
|
||||
UI_CURSOR_TOOLPAUSE,
|
||||
UI_CURSOR_TOOLMEDIAOPEN,
|
||||
UI_CURSOR_PIPETTE,
|
||||
UI_CURSOR_COUNT // Number of elements in this enum (NOT a cursor)
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2738,6 +2738,9 @@ const char* cursorIDToName(int id)
|
|||
case UI_CURSOR_TOOLBUY: return "UI_CURSOR_TOOLBUY";
|
||||
case UI_CURSOR_TOOLPAY: return "UI_CURSOR_TOOLPAY";
|
||||
case UI_CURSOR_TOOLOPEN: return "UI_CURSOR_TOOLOPEN";
|
||||
case UI_CURSOR_TOOLPLAY: return "UI_CURSOR_TOOLPLAY";
|
||||
case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE";
|
||||
case UI_CURSOR_TOOLMEDIAOPEN: return "UI_CURSOR_TOOLMEDIAOPEN";
|
||||
case UI_CURSOR_PIPETTE: return "UI_CURSOR_PIPETTE";
|
||||
}
|
||||
|
||||
|
|
@ -2834,6 +2837,9 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
|
|||
case UI_CURSOR_TOOLBUY:
|
||||
case UI_CURSOR_TOOLPAY:
|
||||
case UI_CURSOR_TOOLOPEN:
|
||||
case UI_CURSOR_TOOLPLAY:
|
||||
case UI_CURSOR_TOOLPAUSE:
|
||||
case UI_CURSOR_TOOLMEDIAOPEN:
|
||||
result = setImageCursor(gCursors[cursor]);
|
||||
break;
|
||||
|
||||
|
|
@ -2876,6 +2882,9 @@ void LLWindowMacOSX::initCursors()
|
|||
initPixmapCursor(UI_CURSOR_TOOLBUY, 1, 1);
|
||||
initPixmapCursor(UI_CURSOR_TOOLPAY, 1, 1);
|
||||
initPixmapCursor(UI_CURSOR_TOOLOPEN, 1, 1);
|
||||
initPixmapCursor(UI_CURSOR_TOOLPLAY, 1, 1);
|
||||
initPixmapCursor(UI_CURSOR_TOOLPAUSE, 1, 1);
|
||||
initPixmapCursor(UI_CURSOR_TOOLMEDIAOPEN, 1, 1);
|
||||
|
||||
initPixmapCursor(UI_CURSOR_SIZENWSE, 10, 10);
|
||||
initPixmapCursor(UI_CURSOR_SIZENESW, 10, 10);
|
||||
|
|
|
|||
|
|
@ -116,7 +116,9 @@ BOOL ll_try_gtk_init(void)
|
|||
if (!tried_gtk_init)
|
||||
{
|
||||
tried_gtk_init = TRUE;
|
||||
#if LL_GSTREAMER_ENABLED
|
||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
||||
#endif // LL_GSTREAMER_ENABLED
|
||||
maybe_lock_display();
|
||||
gtk_is_good = gtk_init_check(NULL, NULL);
|
||||
maybe_unlock_display();
|
||||
|
|
@ -1985,7 +1987,7 @@ void LLWindowSDL::gatherInput()
|
|||
static Uint32 lastRightDown = 0;
|
||||
SDL_Event event;
|
||||
|
||||
#if LL_GTK && LL_LIBXUL_ENABLED
|
||||
#if LL_GTK && LL_LLMOZLIB_ENABLED
|
||||
// Pump GTK events so embedded Gecko doesn't starve.
|
||||
if (ll_try_gtk_init())
|
||||
{
|
||||
|
|
@ -2004,7 +2006,7 @@ void LLWindowSDL::gatherInput()
|
|||
|
||||
setlocale(LC_ALL, saved_locale.c_str() );
|
||||
}
|
||||
#endif // LL_GTK && LL_LIBXUL_ENABLED
|
||||
#endif // LL_GTK && LL_LLMOZLIB_ENABLED
|
||||
|
||||
// Handle all outstanding SDL events
|
||||
while (SDL_PollEvent(&event))
|
||||
|
|
@ -2358,6 +2360,9 @@ void LLWindowSDL::initCursors()
|
|||
mSDLCursors[UI_CURSOR_TOOLBUY] = makeSDLCursorFromBMP("toolbuy.BMP",0,0);
|
||||
mSDLCursors[UI_CURSOR_TOOLPAY] = makeSDLCursorFromBMP("toolpay.BMP",0,0);
|
||||
mSDLCursors[UI_CURSOR_TOOLOPEN] = makeSDLCursorFromBMP("toolopen.BMP",0,0);
|
||||
mSDLCursors[UI_CURSOR_TOOLPLAY] = makeSDLCursorFromBMP("toolplay.BMP",0,0);
|
||||
mSDLCursors[UI_CURSOR_TOOLPAUSE] = makeSDLCursorFromBMP("toolpause.BMP",0,0);
|
||||
mSDLCursors[UI_CURSOR_TOOLMEDIAOPEN] = makeSDLCursorFromBMP("toolmediaopen.BMP",0,0);
|
||||
mSDLCursors[UI_CURSOR_PIPETTE] = makeSDLCursorFromBMP("lltoolpipette.BMP",2,28);
|
||||
}
|
||||
|
||||
|
|
@ -2744,20 +2749,27 @@ void spawn_web_browser(const char* escaped_url)
|
|||
|
||||
void *LLWindowSDL::getPlatformWindow()
|
||||
{
|
||||
#if LL_GTK && LL_LIBXUL_ENABLED
|
||||
#if LL_GTK && LL_LLMOZLIB_ENABLED
|
||||
if (ll_try_gtk_init())
|
||||
{
|
||||
maybe_lock_display();
|
||||
GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
|
||||
// show the hidden-widget while debugging (needs mozlib change)
|
||||
//gtk_widget_show_all(GTK_WIDGET(win));
|
||||
|
||||
gtk_widget_realize(GTK_WIDGET(win));
|
||||
GtkWidget *owin = gtk_window_new(GTK_WINDOW_POPUP);
|
||||
// Why a layout widget? A MozContainer would be ideal, but
|
||||
// it involves exposing Mozilla headers to mozlib-using apps.
|
||||
// A layout widget with a GtkWindow parent has the desired
|
||||
// properties of being plain GTK, having a window, and being
|
||||
// derived from a GtkContainer.
|
||||
GtkWidget *rtnw = gtk_layout_new(NULL, NULL);
|
||||
gtk_container_add(GTK_CONTAINER(owin), rtnw);
|
||||
gtk_widget_realize(rtnw);
|
||||
GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(rtnw), GTK_NO_WINDOW);
|
||||
|
||||
maybe_unlock_display();
|
||||
return win;
|
||||
|
||||
return rtnw;
|
||||
}
|
||||
#endif // LL_GTK && LL_LIBXUL_ENABLED
|
||||
#endif // LL_GTK && LL_LLMOZLIB_ENABLED
|
||||
// Unixoid mozilla really needs GTK.
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1907,6 +1907,9 @@ void LLWindowWin32::initCursors()
|
|||
mCursor[UI_CURSOR_TOOLBUY] = loadColorCursor(TEXT("TOOLBUY"));
|
||||
mCursor[UI_CURSOR_TOOLPAY] = loadColorCursor(TEXT("TOOLPAY"));
|
||||
mCursor[UI_CURSOR_TOOLOPEN] = loadColorCursor(TEXT("TOOLOPEN"));
|
||||
mCursor[UI_CURSOR_TOOLPLAY] = loadColorCursor(TEXT("TOOLPLAY"));
|
||||
mCursor[UI_CURSOR_TOOLPAUSE] = loadColorCursor(TEXT("TOOLPAUSE"));
|
||||
mCursor[UI_CURSOR_TOOLMEDIAOPEN] = loadColorCursor(TEXT("TOOLMEDIAOPEN"));
|
||||
|
||||
// Note: custom cursors that are not found make LoadCursor() return NULL.
|
||||
for( S32 i = 0; i < UI_CURSOR_COUNT; i++ )
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ FS (f|F)
|
|||
#include "llparcelflags.h"
|
||||
#include "llregionflags.h"
|
||||
#include "lscript_http.h"
|
||||
#include "llclickaction.h"
|
||||
|
||||
void count();
|
||||
void comment();
|
||||
|
|
@ -522,6 +523,10 @@ extern "C" { int yyerror(const char *fmt, ...); }
|
|||
"PARCEL_MEDIA_COMMAND_AGENT" { count(); yylval.ival = PARCEL_MEDIA_COMMAND_AGENT; return(INTEGER_CONSTANT); }
|
||||
"PARCEL_MEDIA_COMMAND_UNLOAD" { count(); yylval.ival = PARCEL_MEDIA_COMMAND_UNLOAD; return(INTEGER_CONSTANT); }
|
||||
"PARCEL_MEDIA_COMMAND_AUTO_ALIGN" { count(); yylval.ival = PARCEL_MEDIA_COMMAND_AUTO_ALIGN; return(INTEGER_CONSTANT); }
|
||||
"PARCEL_MEDIA_COMMAND_TYPE" { count(); yylval.ival = PARCEL_MEDIA_COMMAND_TYPE; return(INTEGER_CONSTANT); }
|
||||
"PARCEL_MEDIA_COMMAND_SIZE" { count(); yylval.ival = PARCEL_MEDIA_COMMAND_SIZE; return(INTEGER_CONSTANT); }
|
||||
"PARCEL_MEDIA_COMMAND_DESC" { count(); yylval.ival = PARCEL_MEDIA_COMMAND_DESC; return(INTEGER_CONSTANT); }
|
||||
"PARCEL_MEDIA_COMMAND_LOOP_SET" { count(); yylval.ival = PARCEL_MEDIA_COMMAND_LOOP_SET; return(INTEGER_CONSTANT); }
|
||||
|
||||
"LIST_STAT_MAX" { count(); yylval.ival = LIST_STAT_MAX; return(INTEGER_CONSTANT); }
|
||||
"LIST_STAT_MIN" { count(); yylval.ival = LIST_STAT_MIN; return(INTEGER_CONSTANT); }
|
||||
|
|
@ -587,6 +592,15 @@ extern "C" { int yyerror(const char *fmt, ...); }
|
|||
"STRING_TRIM_TAIL" { count(); yylval.ival = STRING_TRIM_TAIL; return(INTEGER_CONSTANT); }
|
||||
"STRING_TRIM" { count(); yylval.ival = STRING_TRIM; return(INTEGER_CONSTANT); }
|
||||
|
||||
"CLICK_ACTION_NONE" { count(); yylval.ival = CLICK_ACTION_NONE; return(INTEGER_CONSTANT); }
|
||||
"CLICK_ACTION_TOUCH" { count(); yylval.ival = CLICK_ACTION_TOUCH; return(INTEGER_CONSTANT); }
|
||||
"CLICK_ACTION_SIT" { count(); yylval.ival = CLICK_ACTION_SIT; return(INTEGER_CONSTANT); }
|
||||
"CLICK_ACTION_BUY" { count(); yylval.ival = CLICK_ACTION_BUY; return(INTEGER_CONSTANT); }
|
||||
"CLICK_ACTION_PAY" { count(); yylval.ival = CLICK_ACTION_PAY; return(INTEGER_CONSTANT); }
|
||||
"CLICK_ACTION_OPEN" { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); }
|
||||
"CLICK_ACTION_PLAY" { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); }
|
||||
"CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); }
|
||||
|
||||
{L}({L}|{N})* { count(); yylval.sval = new char[strlen(yytext) + 1]; strcpy(yylval.sval, yytext); return(IDENTIFIER); }
|
||||
|
||||
{N}+{E} { count(); yylval.fval = (F32)atof(yytext); return(FP_CONSTANT); }
|
||||
|
|
|
|||
|
|
@ -29,7 +29,15 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
// *WARNING*
|
||||
|
||||
// ## ## ### ######## ## ## #### ## ## ###### #### ####
|
||||
// ## ## ## ## ## ## ## ### ## ## ### ## ## ## #### ####
|
||||
// ## ## ## ## ## ## ## #### ## ## #### ## ## #### ####
|
||||
// ## ## ## ## ## ######## ## ## ## ## ## ## ## ## #### ## ##
|
||||
// ## ## ## ######### ## ## ## #### ## ## #### ## ##
|
||||
// ## ## ## ## ## ## ## ## ### ## ## ### ## ## #### ####
|
||||
// ### ### ## ## ## ## ## ## #### ## ## ###### #### ####
|
||||
//
|
||||
// When adding functions, they <b>MUST</b> be appended to the end of
|
||||
// the init() method. The init() associates the name with a number,
|
||||
// which is then serialized into the bytecode. Inserting a new
|
||||
|
|
@ -431,6 +439,8 @@ void LLScriptLibrary::init()
|
|||
|
||||
addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llGetObjectDetails", "l", "kl", "list llGetObjectDetails(key id, list params)\nGets the object details specified in params for the object with key id.\nDetails are OBJECT_NAME, _DESC, _POS, _ROT, _VELOCITY, _OWNER, _GROUP, _CREATOR."));
|
||||
|
||||
addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llSetClickAction", NULL, "i", "llSetClickAction(integer action)\nSets the action performed when a prim is clicked upon."));
|
||||
|
||||
// energy, sleep, dummy_func, name, return type, parameters, help text, gods-only
|
||||
|
||||
// IF YOU ADD NEW SCRIPT CALLS, YOU MUST PUT THEM AT THE END OF THIS LIST.
|
||||
|
|
|
|||
|
|
@ -422,7 +422,10 @@ PARCEL_MEDIA_COMMAND_PLAY Play media stream
|
|||
PARCEL_MEDIA_COMMAND_LOOP Loop media stream
|
||||
PARCEL_MEDIA_COMMAND_TEXTURE Get or set the parcel's media texture
|
||||
PARCEL_MEDIA_COMMAND_URL Get or set the parcel's media url
|
||||
PARCEL_MEDIA_COMMAND_TYPE Get or set the parcel's media mimetype
|
||||
PARCEL_MEDIA_COMMAND_DESC Get or set the parcel's media description
|
||||
PARCEL_MEDIA_COMMAND_TIME Set media stream to specific time
|
||||
PARCEL_MEDIA_COMMAND_SIZE Get or set the parcel's media pixel resolution
|
||||
PARCEL_MEDIA_COMMAND_AGENT Allows media stream commands to apply to only one agent
|
||||
PARCEL_MEDIA_COMMAND_UNLOAD Unloads the media stream
|
||||
PARCEL_MEDIA_COMMAND_AUTO_ALIGN Auto aligns the media stream to the texture size. May cause a performance hit and loss of some visual quality.
|
||||
|
|
@ -492,6 +495,15 @@ STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string.
|
|||
STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string.
|
||||
STRING_TRIM Used with llStringTrim to trim both leading and trailing spaces from a string.
|
||||
|
||||
CLICK_ACTION_NONE Used with llSetClickAction to disable the click action
|
||||
CLICK_ACTION_TOUCH Used with llSetClickAction to set touch as the default action when object is clicked
|
||||
CLICK_ACTION_SIT Used with llSetClickAction to set sit as the default action when object is clicked
|
||||
CLICK_ACTION_BUY Used with llSetClickAction to set buy as the default action when object is clicked
|
||||
CLICK_ACTION_PAY Used with llSetClickAction to set pay as the default action when object is clicked
|
||||
CLICK_ACTION_OPEN Used with llSetClickAction to set open as the default action when object is clicked
|
||||
CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default action when object is clicked
|
||||
CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
|
||||
|
||||
# string constants
|
||||
[word .1, .3, .5]
|
||||
NULL_KEY Indicates an empty key
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -47,6 +47,7 @@
|
|||
#include "llpumpio.h"
|
||||
#include "llfloateractivespeakers.h"
|
||||
#include "llimpanel.h"
|
||||
#include "llmimetypes.h"
|
||||
#include "llstartup.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llviewerjoystick.h"
|
||||
|
|
@ -59,6 +60,7 @@
|
|||
#include "llworldmap.h"
|
||||
#include "llmutelist.h"
|
||||
#include "llurldispatcher.h"
|
||||
#include "llurlhistory.h"
|
||||
|
||||
#include "llweb.h"
|
||||
#include "llsecondlifeurls.h"
|
||||
|
|
@ -76,7 +78,6 @@
|
|||
|
||||
|
||||
#include "llnotify.h"
|
||||
#include "llmediaengine.h"
|
||||
#include "llviewerkeyboard.h"
|
||||
#include "lllfsthread.h"
|
||||
#include "llworkerthread.h"
|
||||
|
|
@ -97,7 +98,6 @@
|
|||
#include "llviewermenu.h"
|
||||
#include "llselectmgr.h"
|
||||
#include "lltracker.h"
|
||||
#include "llmozlib.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llworldmapview.h"
|
||||
|
||||
|
|
@ -169,21 +169,6 @@ static char** gTempArgV;
|
|||
#if LL_WINDOWS && LL_LCD_COMPILE
|
||||
#include "lllcd.h"
|
||||
#endif
|
||||
//
|
||||
#if LL_QUICKTIME_ENABLED
|
||||
#if LL_DARWIN
|
||||
#include <QuickTime/QuickTime.h>
|
||||
#else
|
||||
// quicktime specific includes
|
||||
#include "MacTypes.h"
|
||||
#include "QTML.h"
|
||||
#include "Movies.h"
|
||||
#include "FixMath.h"
|
||||
#endif
|
||||
#endif
|
||||
//
|
||||
//////
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// viewer.cpp - these are only used in viewer, should be easily moved.
|
||||
|
|
@ -228,10 +213,6 @@ extern BOOL gbCapturing;
|
|||
extern BOOL gRandomizeFramerate;
|
||||
extern BOOL gPeriodicSlowFrame;
|
||||
|
||||
#if LL_GSTREAMER_ENABLED
|
||||
void UnloadGStreamer();
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// All from the last globals push...
|
||||
bool gVerifySSLCert = true;
|
||||
|
|
@ -257,6 +238,7 @@ BOOL gShowObjectUpdates = FALSE;
|
|||
BOOL gLogMessages = FALSE;
|
||||
std::string gChannelName = LL_CHANNEL;
|
||||
BOOL gUseAudio = TRUE;
|
||||
BOOL gUseQuickTime = TRUE;
|
||||
LLString gCmdLineFirstName;
|
||||
LLString gCmdLineLastName;
|
||||
LLString gCmdLinePassword;
|
||||
|
|
@ -1174,6 +1156,9 @@ bool LLAppViewer::init()
|
|||
|
||||
LLAgent::parseTeleportMessages("teleport_strings.xml");
|
||||
|
||||
// load MIME type -> media impl mappings
|
||||
LLMIMETypes::parseMIMETypes( "mime_types.xml" );
|
||||
|
||||
mCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
|
||||
|
||||
LLVectorPerformanceOptions::initClass();
|
||||
|
|
@ -1574,32 +1559,6 @@ bool LLAppViewer::cleanup()
|
|||
llwarns << "Hack, skipping audio engine cleanup" << llendflush;
|
||||
#endif
|
||||
|
||||
|
||||
// moved to main application shutdown for now because it's non-trivial and only needs to be done once
|
||||
// (even though it goes against the media framework design)
|
||||
|
||||
LLMediaEngine::cleanupClass();
|
||||
|
||||
#if LL_QUICKTIME_ENABLED
|
||||
if (gQuickTimeInitialized)
|
||||
{
|
||||
// clean up media stuff
|
||||
llinfos << "Cleaning up QuickTime" << llendl;
|
||||
ExitMovies ();
|
||||
#if LL_WINDOWS
|
||||
// Only necessary/available on Windows.
|
||||
TerminateQTML ();
|
||||
#endif
|
||||
}
|
||||
llinfos << "Quicktime cleaned up" << llendflush;
|
||||
#endif
|
||||
|
||||
#if LL_GSTREAMER_ENABLED
|
||||
llinfos << "Cleaning up GStreamer" << llendl;
|
||||
UnloadGStreamer();
|
||||
llinfos << "GStreamer cleaned up" << llendflush;
|
||||
#endif
|
||||
|
||||
llinfos << "Cleaning up feature manager" << llendflush;
|
||||
delete gFeatureManagerp;
|
||||
gFeatureManagerp = NULL;
|
||||
|
|
@ -1661,18 +1620,12 @@ bool LLAppViewer::cleanup()
|
|||
|
||||
LLTracker::cleanupInstance();
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
// this must be done after floater cleanup (delete gViewerWindow) since
|
||||
// floaters potentially need the manager to destroy their contents.
|
||||
LLMozLib::getInstance()->reset();
|
||||
#endif
|
||||
|
||||
// *FIX: This is handled in LLAppViewerWin32::cleanup().
|
||||
// I'm keeping the comment to remember its order in cleanup,
|
||||
// in case of unforseen dependency.
|
||||
//#if LL_WINDOWS
|
||||
// gDXHardware.cleanup();
|
||||
//#endif // LL_WINDOWS
|
||||
//#if LL_WINDOWS
|
||||
// gDXHardware.cleanup();
|
||||
//#endif // LL_WINDOWS
|
||||
|
||||
#if LL_WINDOWS && LL_LCD_COMPILE
|
||||
// shut down the LCD window on a logitech keyboard, if there is one
|
||||
|
|
@ -1729,6 +1682,9 @@ bool LLAppViewer::cleanup()
|
|||
gColors.cleanup();
|
||||
gCrashSettings.cleanup();
|
||||
|
||||
// Save URL history file
|
||||
LLURLHistory::saveFile("url_history.xml");
|
||||
|
||||
if (gMuteListp)
|
||||
{
|
||||
// save mute list
|
||||
|
|
@ -2368,8 +2324,6 @@ bool LLAppViewer::initWindow()
|
|||
LLAlertDialog::parseAlerts("alerts.xml");
|
||||
LLNotifyBox::parseNotify("notify.xml");
|
||||
|
||||
LLMediaEngine::initClass();
|
||||
|
||||
//
|
||||
// Clean up the feature manager lookup table - settings were updated
|
||||
// in the LLViewerWindow constructor
|
||||
|
|
|
|||
|
|
@ -264,3 +264,14 @@ void LLFirstUse::useVoice()
|
|||
LLFloaterVoiceWizard::showInstance();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFirstUse::useMedia()
|
||||
{
|
||||
if (gSavedSettings.getWarning("FirstMedia"))
|
||||
{
|
||||
gSavedSettings.setWarning("FirstMedia", FALSE);
|
||||
|
||||
LLNotifyBox::showXml("FirstMedia");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -105,7 +105,8 @@ public:
|
|||
static void useDebugMenus();
|
||||
static void useSculptedPrim();
|
||||
static void useVoice();
|
||||
|
||||
static void useMedia();
|
||||
|
||||
protected:
|
||||
static std::set<LLString> sConfigVariables;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -48,12 +48,9 @@
|
|||
#include "llviewerbuild.h"
|
||||
#include "llvieweruictrlfactory.h"
|
||||
#include "llappviewer.h"
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
#include "llmozlib.h"
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
|
||||
#include "llglheaders.h"
|
||||
#include "llmediamanager.h"
|
||||
|
||||
|
||||
extern LLCPUInfo gSysCPU;
|
||||
extern LLMemoryInfo gSysMemory;
|
||||
|
|
@ -147,11 +144,18 @@ LLFloaterAbout::LLFloaterAbout()
|
|||
support.append( (const char*) glGetString(GL_VERSION) );
|
||||
support.append("\n");
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
support.append("LLMozLib Version: ");
|
||||
support.append( (const char*) LLMozLib::getInstance()->getVersion().c_str() );
|
||||
support.append("\n");
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
LLMediaManager *mgr = LLMediaManager::getInstance();
|
||||
if (mgr)
|
||||
{
|
||||
LLMediaBase *media_source = mgr->createSourceFromMimeType("http", "text/html");
|
||||
if (media_source)
|
||||
{
|
||||
support.append("LLMozLib Version: ");
|
||||
support.append((const char*) media_source->getVersion().c_str());
|
||||
support.append("\n");
|
||||
mgr->destroySource(media_source);
|
||||
}
|
||||
}
|
||||
|
||||
if (gViewerStats
|
||||
&& gPacketsIn > 0)
|
||||
|
|
|
|||
|
|
@ -31,8 +31,6 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include "llfloaterland.h"
|
||||
|
||||
#include "llcachename.h"
|
||||
|
|
@ -53,6 +51,7 @@
|
|||
#include "lllineeditor.h"
|
||||
#include "llnamelistctrl.h"
|
||||
#include "llnotify.h"
|
||||
#include "llpanellandmedia.h"
|
||||
#include "llradiogroup.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "llselectmgr.h"
|
||||
|
|
@ -68,10 +67,39 @@
|
|||
#include "llviewerstats.h"
|
||||
#include "llviewertexteditor.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llmediaengine.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "roles_constants.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <time.h>
|
||||
|
||||
static const S32 EDIT_HEIGHT = 16;
|
||||
static const S32 LEFT = HPAD;
|
||||
static const S32 BOTTOM = VPAD;
|
||||
static const S32 RULER0 = LEFT;
|
||||
static const S32 RULER05 = RULER0 + 24;
|
||||
static const S32 RULER1 = RULER05 + 16;
|
||||
static const S32 RULER15 = RULER1 + 20;
|
||||
static const S32 RULER2 = RULER1 + 32;
|
||||
static const S32 RULER205= RULER2 + 32;
|
||||
static const S32 RULER20 = RULER2 + 64;
|
||||
static const S32 RULER21 = RULER20 + 16;
|
||||
static const S32 RULER22 = RULER21 + 32;
|
||||
static const S32 RULER225 = RULER20 + 64;
|
||||
static const S32 RULER23 = RULER22 + 64;
|
||||
static const S32 RULER24 = RULER23 + 26;
|
||||
static const S32 RULER3 = RULER2 + 102;
|
||||
static const S32 RULER4 = RULER3 + 8;
|
||||
static const S32 RULER5 = RULER4 + 50;
|
||||
static const S32 RULER6 = RULER5 + 52;
|
||||
static const S32 RULER7 = RULER6 + 24;
|
||||
static const S32 RIGHT = LEFT + 278;
|
||||
static const S32 FAR_RIGHT = LEFT + 324 + 40;
|
||||
|
||||
static const char PRICE[] = "Price:";
|
||||
static const char NO_PRICE[] = "";
|
||||
static const char AREA[] = "Area:";
|
||||
|
||||
static const char OWNER_ONLINE[] = "0";
|
||||
static const char OWNER_OFFLINE[] = "1";
|
||||
static const char OWNER_GROUP[] = "2";
|
||||
|
|
@ -80,16 +108,7 @@ static const char OWNER_GROUP[] = "2";
|
|||
static const BOOL BUY_GROUP_LAND = TRUE;
|
||||
static const BOOL BUY_PERSONAL_LAND = FALSE;
|
||||
|
||||
// Values for the parcel voice settings radio group
|
||||
enum
|
||||
{
|
||||
kRadioVoiceChatEstate = 0,
|
||||
kRadioVoiceChatPrivate = 1,
|
||||
kRadioVoiceChatDisable = 2
|
||||
};
|
||||
|
||||
// Statics
|
||||
LLFloaterLand* LLFloaterLand::sInstance = NULL;
|
||||
LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL;
|
||||
S32 LLFloaterLand::sLastTab = 0;
|
||||
|
||||
|
|
@ -150,64 +169,42 @@ void send_parcel_select_objects(S32 parcel_local_id, S32 return_type,
|
|||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLFloaterLand::show()
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
sInstance = new LLFloaterLand();
|
||||
|
||||
// Select tab from last view
|
||||
sInstance->mTabLand->selectTab(sLastTab);
|
||||
|
||||
sObserver = new LLParcelSelectionObserver();
|
||||
gParcelMgr->addObserver( sObserver );
|
||||
}
|
||||
|
||||
sInstance->open(); /*Flawfinder: ignore*/
|
||||
|
||||
// Done automatically when the selected parcel's properties arrive
|
||||
// (and hence we have the local id).
|
||||
// gParcelMgr->sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_RENTER);
|
||||
|
||||
sInstance->mParcel = gParcelMgr->getFloatingParcelSelection();
|
||||
|
||||
// Refresh even if not over a region so we don't get an
|
||||
// uninitialized dialog. The dialog is 0-region aware.
|
||||
sInstance->refresh();
|
||||
}
|
||||
|
||||
//static
|
||||
LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects()
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return sInstance->mPanelObjects;
|
||||
return LLFloaterLand::getInstance()->mPanelObjects;
|
||||
}
|
||||
|
||||
//static
|
||||
LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant()
|
||||
{
|
||||
if (!sInstance)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return sInstance->mPanelCovenant;
|
||||
return LLFloaterLand::getInstance()->mPanelCovenant;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFloaterLand::refreshAll()
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
sInstance->refresh();
|
||||
}
|
||||
LLFloaterLand::getInstance()->refresh();
|
||||
}
|
||||
|
||||
void LLFloaterLand::onOpen()
|
||||
{
|
||||
// Select tab from last view
|
||||
mTabLand->selectTab(sLastTab);
|
||||
|
||||
|
||||
// Done automatically when the selected parcel's properties arrive
|
||||
// (and hence we have the local id).
|
||||
// gParcelMgr->sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_RENTER);
|
||||
|
||||
mParcel = gParcelMgr->getFloatingParcelSelection();
|
||||
|
||||
// Refresh even if not over a region so we don't get an
|
||||
// uninitialized dialog. The dialog is 0-region aware.
|
||||
refresh();
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
void LLFloaterLand::onClose(bool app_quitting)
|
||||
{
|
||||
|
|
@ -225,7 +222,7 @@ void LLFloaterLand::onClose(bool app_quitting)
|
|||
}
|
||||
|
||||
|
||||
LLFloaterLand::LLFloaterLand()
|
||||
LLFloaterLand::LLFloaterLand(const LLSD& seed)
|
||||
: LLFloater("floaterland", "FloaterLandRect5", "About Land")
|
||||
{
|
||||
|
||||
|
|
@ -242,7 +239,12 @@ LLFloaterLand::LLFloaterLand()
|
|||
|
||||
gUICtrlFactory->buildFloater(this, "floater_about_land.xml", &factory_map);
|
||||
|
||||
sObserver = new LLParcelSelectionObserver();
|
||||
gParcelMgr->addObserver( sObserver );
|
||||
}
|
||||
|
||||
BOOL LLFloaterLand::postBuild()
|
||||
{
|
||||
LLTabContainerCommon* tab = LLUICtrlFactory::getTabContainerByName(this, "landtab");
|
||||
|
||||
mTabLand = (LLTabContainer*) tab;
|
||||
|
|
@ -252,16 +254,16 @@ LLFloaterLand::LLFloaterLand()
|
|||
{
|
||||
tab->selectTab(sLastTab);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
LLFloaterLand::~LLFloaterLand()
|
||||
{
|
||||
sInstance = NULL;
|
||||
}
|
||||
|
||||
|
||||
// public
|
||||
void LLFloaterLand::refresh()
|
||||
{
|
||||
|
|
@ -2214,239 +2216,7 @@ void LLPanelLandOptions::onClickPublishHelp(void*)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// LLPanelLandMedia
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
|
||||
: LLPanel("land_media_panel"), mParcel(parcel)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BOOL LLPanelLandMedia::postBuild()
|
||||
{
|
||||
|
||||
mCheckSoundLocal = LLUICtrlFactory::getCheckBoxByName(this, "check sound local");
|
||||
childSetCommitCallback("check sound local", onCommitAny, this);
|
||||
|
||||
mRadioVoiceChat = LLUICtrlFactory::getRadioGroupByName(this, "parcel_voice_channel");
|
||||
childSetCommitCallback("parcel_voice_channel", onCommitAny, this);
|
||||
|
||||
mMusicURLEdit = LLUICtrlFactory::getLineEditorByName(this, "music_url");
|
||||
childSetCommitCallback("music_url", onCommitAny, this);
|
||||
|
||||
|
||||
mMediaTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this, "media texture");
|
||||
if (mMediaTextureCtrl)
|
||||
{
|
||||
mMediaTextureCtrl->setCommitCallback( onCommitAny );
|
||||
mMediaTextureCtrl->setCallbackUserData( this );
|
||||
mMediaTextureCtrl->setAllowNoTexture ( TRUE );
|
||||
mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
|
||||
mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'media texure'" << llendl;
|
||||
}
|
||||
|
||||
mMediaAutoScaleCheck = LLUICtrlFactory::getCheckBoxByName(this, "media_auto_scale");
|
||||
childSetCommitCallback("media_auto_scale", onCommitAny, this);
|
||||
|
||||
mMediaURLEdit = LLUICtrlFactory::getLineEditorByName(this, "media_url");
|
||||
childSetCommitCallback("media_url", onCommitAny, this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
LLPanelLandMedia::~LLPanelLandMedia()
|
||||
{ }
|
||||
|
||||
|
||||
// public
|
||||
void LLPanelLandMedia::refresh()
|
||||
{
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
|
||||
if (!parcel)
|
||||
{
|
||||
mCheckSoundLocal->set(FALSE);
|
||||
mCheckSoundLocal->setEnabled(FALSE);
|
||||
|
||||
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
|
||||
mRadioVoiceChat->setEnabled(FALSE);
|
||||
|
||||
mMusicURLEdit->setText(LLString::null);
|
||||
mMusicURLEdit->setEnabled(FALSE);
|
||||
|
||||
mMediaURLEdit->setText(LLString::null);
|
||||
mMediaURLEdit->setEnabled(FALSE);
|
||||
|
||||
mMediaAutoScaleCheck->set ( FALSE );
|
||||
mMediaAutoScaleCheck->setEnabled(FALSE);
|
||||
|
||||
mMediaTextureCtrl->clear();
|
||||
mMediaTextureCtrl->setEnabled(FALSE);
|
||||
|
||||
#if 0
|
||||
mMediaStopButton->setEnabled ( FALSE );
|
||||
mMediaStartButton->setEnabled ( FALSE );
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
// something selected, hooray!
|
||||
|
||||
// Display options
|
||||
BOOL can_change_media = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA);
|
||||
|
||||
mCheckSoundLocal->set( parcel->getSoundLocal() );
|
||||
mCheckSoundLocal->setEnabled( can_change_media );
|
||||
|
||||
LLViewerRegion* selection_region = gParcelMgr->getSelectionRegion();
|
||||
BOOL region_allows_voice = FALSE;
|
||||
if (selection_region)
|
||||
{
|
||||
region_allows_voice = selection_region->isVoiceEnabled();
|
||||
}
|
||||
|
||||
if(parcel->getVoiceEnabled())
|
||||
{
|
||||
if(parcel->getVoiceUseEstateChannel())
|
||||
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
|
||||
else
|
||||
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatPrivate);
|
||||
}
|
||||
else
|
||||
{
|
||||
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatDisable);
|
||||
}
|
||||
|
||||
mRadioVoiceChat->setEnabled( can_change_media && region_allows_voice );
|
||||
|
||||
// don't display urls if you're not able to change it
|
||||
// much requested change in forums so people can't 'steal' urls
|
||||
// NOTE: bug#2009 means this is still vunerable - however, bug
|
||||
// should be closed since this bug opens up major security issues elsewhere.
|
||||
if ( can_change_media )
|
||||
{
|
||||
mMusicURLEdit->setDrawAsterixes ( FALSE );
|
||||
mMediaURLEdit->setDrawAsterixes ( FALSE );
|
||||
}
|
||||
else
|
||||
{
|
||||
mMusicURLEdit->setDrawAsterixes ( TRUE );
|
||||
mMediaURLEdit->setDrawAsterixes ( TRUE );
|
||||
}
|
||||
|
||||
mMusicURLEdit->setText(parcel->getMusicURL());
|
||||
mMusicURLEdit->setEnabled( can_change_media );
|
||||
|
||||
mMediaURLEdit->setText(parcel->getMediaURL());
|
||||
mMediaURLEdit->setEnabled( can_change_media );
|
||||
|
||||
mMediaAutoScaleCheck->set ( parcel->getMediaAutoScale () );
|
||||
mMediaAutoScaleCheck->setEnabled ( can_change_media );
|
||||
|
||||
LLUUID tmp = parcel->getMediaID();
|
||||
mMediaTextureCtrl->setImageAssetID ( parcel->getMediaID() );
|
||||
mMediaTextureCtrl->setEnabled( can_change_media );
|
||||
|
||||
#if 0
|
||||
// there is a media url and a media texture selected
|
||||
if ( ( ! ( std::string ( parcel->getMediaURL() ).empty () ) ) && ( ! ( parcel->getMediaID ().isNull () ) ) )
|
||||
{
|
||||
// turn on transport controls if allowed for this parcel
|
||||
mMediaStopButton->setEnabled ( editable );
|
||||
mMediaStartButton->setEnabled ( editable );
|
||||
}
|
||||
else
|
||||
{
|
||||
// no media url or no media texture
|
||||
mMediaStopButton->setEnabled ( FALSE );
|
||||
mMediaStartButton->setEnabled ( FALSE );
|
||||
};
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLandMedia::onCommitAny(LLUICtrl *ctrl, void *userdata)
|
||||
{
|
||||
LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
|
||||
|
||||
LLParcel* parcel = self->mParcel->getParcel();
|
||||
if (!parcel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Extract data from UI
|
||||
BOOL sound_local = self->mCheckSoundLocal->get();
|
||||
int voice_setting = self->mRadioVoiceChat->getSelectedIndex();
|
||||
std::string music_url = self->mMusicURLEdit->getText();
|
||||
std::string media_url = self->mMediaURLEdit->getText();
|
||||
U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
|
||||
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
|
||||
|
||||
BOOL voice_enabled;
|
||||
BOOL voice_estate_chan;
|
||||
|
||||
switch(voice_setting)
|
||||
{
|
||||
default:
|
||||
case kRadioVoiceChatEstate:
|
||||
voice_enabled = TRUE;
|
||||
voice_estate_chan = TRUE;
|
||||
break;
|
||||
case kRadioVoiceChatPrivate:
|
||||
voice_enabled = TRUE;
|
||||
voice_estate_chan = FALSE;
|
||||
break;
|
||||
case kRadioVoiceChatDisable:
|
||||
voice_enabled = FALSE;
|
||||
voice_estate_chan = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Remove leading/trailing whitespace (common when copying/pasting)
|
||||
LLString::trim(music_url);
|
||||
LLString::trim(media_url);
|
||||
|
||||
// Push data into current parcel
|
||||
parcel->setParcelFlag(PF_ALLOW_VOICE_CHAT, voice_enabled);
|
||||
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
|
||||
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
|
||||
parcel->setMusicURL(music_url.c_str());
|
||||
parcel->setMediaURL(media_url.c_str());
|
||||
parcel->setMediaID(media_id);
|
||||
parcel->setMediaAutoScale ( media_auto_scale );
|
||||
|
||||
// Send current parcel data upstream to server
|
||||
gParcelMgr->sendParcelPropertiesUpdate( parcel );
|
||||
|
||||
// Might have changed properties, so let's redraw!
|
||||
self->refresh();
|
||||
}
|
||||
|
||||
void LLPanelLandMedia::onClickStopMedia ( void* data )
|
||||
{
|
||||
LLMediaEngine::getInstance ()->stop ();
|
||||
}
|
||||
|
||||
void LLPanelLandMedia::onClickStartMedia ( void* data )
|
||||
{
|
||||
// force a commit
|
||||
gFocusMgr.setKeyboardFocus ( NULL );
|
||||
|
||||
// force a reload
|
||||
LLMediaEngine::getInstance ()->convertImageAndLoadUrl ( true, false, std::string());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// LLPanelLandAccess
|
||||
|
|
|
|||
|
|
@ -68,13 +68,9 @@ class LLPanelLandRenters;
|
|||
class LLPanelLandCovenant;
|
||||
|
||||
class LLFloaterLand
|
||||
: public LLFloater
|
||||
: public LLFloater, public LLUISingleton<LLFloaterLand>
|
||||
{
|
||||
public:
|
||||
// Call show() to open a land floater.
|
||||
// Will query the viewer parcel manager to see what is selected.
|
||||
static void show();
|
||||
static BOOL floaterVisible() { return sInstance && sInstance->getVisible(); }
|
||||
static void refreshAll();
|
||||
|
||||
static LLPanelLandObjects* getCurrentPanelLandObjects();
|
||||
|
|
@ -82,11 +78,15 @@ public:
|
|||
|
||||
// Destroys itself on close.
|
||||
virtual void onClose(bool app_quitting);
|
||||
virtual void onOpen();
|
||||
virtual BOOL postBuild();
|
||||
|
||||
protected:
|
||||
friend class LLUISingleton<LLFloaterLand>;
|
||||
|
||||
// Does its own instance management, so clients not allowed
|
||||
// to allocate or destroy.
|
||||
LLFloaterLand();
|
||||
LLFloaterLand(const LLSD& seed);
|
||||
virtual ~LLFloaterLand();
|
||||
|
||||
void refresh();
|
||||
|
|
@ -102,7 +102,6 @@ protected:
|
|||
|
||||
|
||||
protected:
|
||||
static LLFloaterLand* sInstance;
|
||||
static LLParcelSelectionObserver* sObserver;
|
||||
static S32 sLastTab;
|
||||
|
||||
|
|
@ -344,35 +343,6 @@ protected:
|
|||
};
|
||||
|
||||
|
||||
class LLPanelLandMedia
|
||||
: public LLPanel
|
||||
{
|
||||
public:
|
||||
LLPanelLandMedia(LLHandle<LLParcelSelection>& parcelp);
|
||||
virtual ~LLPanelLandMedia();
|
||||
void refresh();
|
||||
|
||||
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
|
||||
static void onClickStopMedia ( void* data );
|
||||
static void onClickStartMedia ( void* data );
|
||||
|
||||
virtual BOOL postBuild();
|
||||
|
||||
protected:
|
||||
LLCheckBoxCtrl* mCheckSoundLocal;
|
||||
LLRadioGroup* mRadioVoiceChat;
|
||||
LLLineEditor* mMusicURLEdit;
|
||||
LLLineEditor* mMediaURLEdit;
|
||||
LLTextureCtrl* mMediaTextureCtrl;
|
||||
LLCheckBoxCtrl* mMediaAutoScaleCheck;
|
||||
//LLButton* mMediaStopButton;
|
||||
//LLButton* mMediaStartButton;
|
||||
|
||||
LLHandle<LLParcelSelection>& mParcel;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class LLPanelLandAccess
|
||||
: public LLPanel
|
||||
{
|
||||
|
|
|
|||
|
|
@ -150,11 +150,9 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainerCommon* tab_container, LLButton
|
|||
mTabContainer->addTabPanel(mNetworkPanel, mNetworkPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
|
||||
mNetworkPanel->setDefaultBtn(default_btn);
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
mWebPanel = new LLPanelWeb();
|
||||
mTabContainer->addTabPanel(mWebPanel, mWebPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
|
||||
mWebPanel->setDefaultBtn(default_btn);
|
||||
#endif
|
||||
|
||||
mDisplayPanel = new LLPanelDisplay();
|
||||
mTabContainer->addTabPanel(mDisplayPanel, mDisplayPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
|
||||
|
|
@ -257,13 +255,11 @@ LLPreferenceCore::~LLPreferenceCore()
|
|||
delete mMsgPanel;
|
||||
mMsgPanel = NULL;
|
||||
}
|
||||
#if LL_LIBXUL_ENABLED
|
||||
if (mWebPanel)
|
||||
{
|
||||
delete mWebPanel;
|
||||
mWebPanel = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -279,9 +275,7 @@ void LLPreferenceCore::apply()
|
|||
mPrefsVoice->apply();
|
||||
mPrefsIM->apply();
|
||||
mMsgPanel->apply();
|
||||
#if LL_LIBXUL_ENABLED
|
||||
mWebPanel->apply();
|
||||
#endif
|
||||
#if LL_WINDOWS && LL_LCD_COMPILE
|
||||
// only add this option if we actually have a logitech keyboard / speaker set
|
||||
if (gLcdScreen->Enabled())
|
||||
|
|
@ -306,9 +300,7 @@ void LLPreferenceCore::cancel()
|
|||
mPrefsVoice->cancel();
|
||||
mPrefsIM->cancel();
|
||||
mMsgPanel->cancel();
|
||||
#if LL_LIBXUL_ENABLED
|
||||
mWebPanel->cancel();
|
||||
#endif
|
||||
#if LL_WINDOWS && LL_LCD_COMPILE
|
||||
// only add this option if we actually have a logitech keyboard / speaker set
|
||||
if (gLcdScreen->Enabled())
|
||||
|
|
|
|||
|
|
@ -145,7 +145,6 @@ BOOL LLFloaterTOS::postBuild()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
// disable Agree to TOS radio button until the page has fully loaded
|
||||
LLRadioGroup* tos_agreement = LLUICtrlFactory::getRadioGroupByName(this, "tos_agreement");
|
||||
if ( tos_agreement )
|
||||
|
|
@ -172,18 +171,6 @@ BOOL LLFloaterTOS::postBuild()
|
|||
gResponsePtr = LLIamHere::build( this );
|
||||
LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr );
|
||||
};
|
||||
#else
|
||||
LLTextEditor *Editor = LLUICtrlFactory::getTextEditorByName(this, "tos_text");
|
||||
if (Editor)
|
||||
{
|
||||
Editor->setHandleEditKeysDirectly( TRUE );
|
||||
Editor->setEnabled( FALSE );
|
||||
Editor->setReadOnlyFgColor(LLColor4::white);
|
||||
Editor->setWordWrap(TRUE);
|
||||
Editor->setFocus(TRUE);
|
||||
}
|
||||
childSetValue("tos_text", LLSD(mMessage));
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -193,7 +180,6 @@ void LLFloaterTOS::setSiteIsAlive( bool alive )
|
|||
// only do this for TOS pages
|
||||
if ( mType == TOS_TOS )
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "tos_html");
|
||||
// if the contents of the site was retrieved
|
||||
if ( alive )
|
||||
|
|
@ -220,20 +206,17 @@ void LLFloaterTOS::setSiteIsAlive( bool alive )
|
|||
web_browser->setVisible( FALSE );
|
||||
};
|
||||
};
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
};
|
||||
}
|
||||
|
||||
LLFloaterTOS::~LLFloaterTOS()
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
// stop obsaerving events
|
||||
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "tos_html");
|
||||
if ( web_browser )
|
||||
{
|
||||
web_browser->addObserver( this );
|
||||
};
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
|
||||
// tell the responder we're not here anymore
|
||||
if ( gResponsePtr )
|
||||
|
|
|
|||
|
|
@ -0,0 +1,268 @@
|
|||
/**
|
||||
* @file llfloaterurlentry.cpp
|
||||
* @brief LLFloaterURLEntry class implementation
|
||||
*
|
||||
* Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llfloaterurlentry.h"
|
||||
|
||||
#include "llpanellandmedia.h"
|
||||
|
||||
// project includes
|
||||
#include "llcombobox.h"
|
||||
#include "llurlhistory.h"
|
||||
#include "llvieweruictrlfactory.h"
|
||||
#include "llwindow.h"
|
||||
#include "llviewerwindow.h"
|
||||
|
||||
static LLFloaterURLEntry* sInstance = NULL;
|
||||
|
||||
// Move this to its own file.
|
||||
// helper class that tries to download a URL from a web site and calls a method
|
||||
// on the Panel Land Media and to discover the MIME type
|
||||
class LLMediaTypeResponder : public LLHTTPClient::Responder
|
||||
{
|
||||
public:
|
||||
LLMediaTypeResponder( LLViewHandle parent ) :
|
||||
mParent( parent )
|
||||
{}
|
||||
|
||||
LLViewHandle mParent;
|
||||
|
||||
|
||||
virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)
|
||||
{
|
||||
std::string media_type = content["content-type"].asString();
|
||||
std::string::size_type idx1 = media_type.find_first_of(";");
|
||||
std::string mime_type = media_type.substr(0, idx1);
|
||||
completeAny(status, mime_type);
|
||||
}
|
||||
|
||||
virtual void error( U32 status, const std::string& reason )
|
||||
{
|
||||
completeAny(status, "none/none");
|
||||
}
|
||||
|
||||
void completeAny(U32 status, const std::string& mime_type)
|
||||
{
|
||||
LLFloaterURLEntry* floater_url_entry =
|
||||
(LLFloaterURLEntry*)LLFloater::getFloaterByHandle(mParent);
|
||||
if ( floater_url_entry )
|
||||
floater_url_entry->headerFetchComplete( status, mime_type );
|
||||
}
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLFloaterURLEntry()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLFloaterURLEntry::LLFloaterURLEntry(LLViewHandle parent)
|
||||
:
|
||||
LLFloater(),
|
||||
mPanelLandMediaHandle(parent)
|
||||
{
|
||||
gUICtrlFactory->buildFloater(this, "floater_url_entry.xml");
|
||||
|
||||
mMediaURLEdit = LLUICtrlFactory::getComboBoxByName(this, "media_entry");
|
||||
|
||||
// Cancel button
|
||||
childSetAction("cancel_btn", onBtnCancel, this);
|
||||
|
||||
// Cancel button
|
||||
childSetAction("clear_btn", onBtnClear, this);
|
||||
|
||||
// clear media list button
|
||||
LLSD parcel_history = LLURLHistory::getURLHistory("parcel");
|
||||
bool enable_clear_button = parcel_history.size() > 0 ? true : false;
|
||||
childSetEnabled( "clear_btn", enable_clear_button );
|
||||
|
||||
// OK button
|
||||
childSetAction("ok_btn", onBtnOK, this);
|
||||
|
||||
setDefaultBtn("ok_btn");
|
||||
buildURLHistory();
|
||||
|
||||
sInstance = this;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// ~LLFloaterURLEntry()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLFloaterURLEntry::~LLFloaterURLEntry()
|
||||
{
|
||||
sInstance = NULL;
|
||||
}
|
||||
|
||||
void LLFloaterURLEntry::buildURLHistory()
|
||||
{
|
||||
LLCtrlListInterface* url_list = childGetListInterface("media_entry");
|
||||
if (url_list)
|
||||
{
|
||||
url_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
|
||||
}
|
||||
|
||||
// Get all of the entries in the "parcel" collection
|
||||
LLSD parcel_history = LLURLHistory::getURLHistory("parcel");
|
||||
|
||||
LLSD::array_iterator iter_history =
|
||||
parcel_history.beginArray();
|
||||
LLSD::array_iterator end_history =
|
||||
parcel_history.endArray();
|
||||
for(; iter_history != end_history; ++iter_history)
|
||||
{
|
||||
url_list->addSimpleElement((*iter_history).asString());
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterURLEntry::headerFetchComplete(U32 status, const std::string& mime_type)
|
||||
{
|
||||
LLPanelLandMedia* panel_media = (LLPanelLandMedia*)LLPanel::getPanelByHandle(mPanelLandMediaHandle);
|
||||
if (panel_media)
|
||||
{
|
||||
// status is ignored for now -- error = "none/none"
|
||||
panel_media->setMediaType(mime_type);
|
||||
panel_media->setMediaURL(mMediaURLEdit->getValue().asString());
|
||||
}
|
||||
// Decrement the cursor
|
||||
getWindow()->decBusyCount();
|
||||
childSetVisible("loading_label", false);
|
||||
close();
|
||||
}
|
||||
|
||||
// static
|
||||
LLViewHandle LLFloaterURLEntry::show(LLViewHandle parent)
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
sInstance->open();
|
||||
}
|
||||
else
|
||||
{
|
||||
sInstance = new LLFloaterURLEntry(parent);
|
||||
}
|
||||
sInstance->updateFromLandMediaPanel();
|
||||
return sInstance->getHandle();
|
||||
}
|
||||
|
||||
void LLFloaterURLEntry::updateFromLandMediaPanel()
|
||||
{
|
||||
LLPanelLandMedia* panel_media = (LLPanelLandMedia*)LLPanel::getPanelByHandle(mPanelLandMediaHandle);
|
||||
if (panel_media)
|
||||
{
|
||||
std::string media_url = panel_media->getMediaURL();
|
||||
addURLToCombobox(media_url);
|
||||
}
|
||||
}
|
||||
|
||||
bool LLFloaterURLEntry::addURLToCombobox(const std::string& media_url)
|
||||
{
|
||||
if(! mMediaURLEdit->setSimple( media_url ) && ! media_url.empty())
|
||||
{
|
||||
mMediaURLEdit->add( media_url );
|
||||
mMediaURLEdit->setSimple( media_url );
|
||||
return true;
|
||||
}
|
||||
|
||||
// URL was not added for whatever reason (either it was empty or already existed)
|
||||
return false;
|
||||
}
|
||||
|
||||
// static
|
||||
//-----------------------------------------------------------------------------
|
||||
// onBtnOK()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLFloaterURLEntry::onBtnOK( void* userdata )
|
||||
{
|
||||
LLFloaterURLEntry *self =(LLFloaterURLEntry *)userdata;
|
||||
|
||||
std::string media_url = self->mMediaURLEdit->getValue().asString();
|
||||
self->mMediaURLEdit->remove(media_url);
|
||||
LLURLHistory::removeURL("parcel", media_url);
|
||||
if(self->addURLToCombobox(media_url))
|
||||
{
|
||||
// Add this url to the parcel collection
|
||||
LLURLHistory::addURL("parcel", media_url);
|
||||
}
|
||||
|
||||
// leading whitespace causes problems with the MIME-type detection so strip it
|
||||
LLString::trim( media_url );
|
||||
|
||||
// First check the URL scheme
|
||||
LLURI url(media_url);
|
||||
std::string scheme = url.scheme();
|
||||
|
||||
// We assume that an empty scheme is an http url, as this is how we will treat it.
|
||||
if(scheme == "")
|
||||
{
|
||||
scheme = "http";
|
||||
}
|
||||
|
||||
// Discover the MIME type only for "http" scheme.
|
||||
if(scheme == "http")
|
||||
{
|
||||
LLHTTPClient::getHeaderOnly( media_url,
|
||||
new LLMediaTypeResponder(self->getHandle()));
|
||||
}
|
||||
else
|
||||
{
|
||||
self->headerFetchComplete(0, scheme);
|
||||
}
|
||||
|
||||
// Grey the buttons until we get the header response
|
||||
self->childSetEnabled("ok_btn", false);
|
||||
self->childSetEnabled("cancel_btn", false);
|
||||
self->childSetEnabled("media_entry", false);
|
||||
|
||||
// show progress bar here?
|
||||
getWindow()->incBusyCount();
|
||||
self->childSetVisible("loading_label", true);
|
||||
}
|
||||
|
||||
// static
|
||||
//-----------------------------------------------------------------------------
|
||||
// onBtnCancel()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLFloaterURLEntry::onBtnCancel( void* userdata )
|
||||
{
|
||||
LLFloaterURLEntry *self =(LLFloaterURLEntry *)userdata;
|
||||
self->close();
|
||||
}
|
||||
|
||||
// static
|
||||
//-----------------------------------------------------------------------------
|
||||
// onBtnClear()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLFloaterURLEntry::onBtnClear( void* userdata )
|
||||
{
|
||||
gViewerWindow->alertXml( "ConfirmClearMediaUrlList", callback_clear_url_list, userdata );
|
||||
}
|
||||
|
||||
void LLFloaterURLEntry::callback_clear_url_list(S32 option, void* userdata)
|
||||
{
|
||||
if ( option == 0 ) // YES
|
||||
{
|
||||
LLFloaterURLEntry *self =(LLFloaterURLEntry *)userdata;
|
||||
|
||||
if ( self )
|
||||
{
|
||||
// clear saved list
|
||||
LLCtrlListInterface* url_list = self->childGetListInterface("media_entry");
|
||||
if ( url_list )
|
||||
{
|
||||
url_list->operateOnAll( LLCtrlListInterface::OP_DELETE );
|
||||
}
|
||||
|
||||
// clear current contents of combo box
|
||||
self->mMediaURLEdit->clear();
|
||||
|
||||
// clear stored version of list
|
||||
LLURLHistory::clear("parcel");
|
||||
|
||||
// cleared the list so disable Clear button
|
||||
self->childSetEnabled( "clear_btn", false );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/**
|
||||
* @file llfloaternamedesc.h
|
||||
* @brief LLFloaterNameDesc class definition
|
||||
*
|
||||
* Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLFLOATERURLENTRY_H
|
||||
#define LL_LLFLOATERURLENTRY_H
|
||||
|
||||
#include "llfloater.h"
|
||||
|
||||
class LLLineEditor;
|
||||
|
||||
class LLFloaterURLEntry : public LLFloater
|
||||
{
|
||||
public:
|
||||
// Can only be shown by LLPanelLandMedia, and pushes data back into
|
||||
// that panel via the handle.
|
||||
static LLViewHandle show(LLViewHandle panel_land_media_handle);
|
||||
|
||||
void updateFromLandMediaPanel();
|
||||
|
||||
void headerFetchComplete(U32 status, const std::string& mime_type);
|
||||
|
||||
bool addURLToCombobox(const std::string& media_url);
|
||||
|
||||
private:
|
||||
LLFloaterURLEntry(LLViewHandle parent);
|
||||
/*virtual*/ ~LLFloaterURLEntry();
|
||||
void buildURLHistory();
|
||||
|
||||
private:
|
||||
LLComboBox* mMediaURLEdit;
|
||||
LLViewHandle mPanelLandMediaHandle;
|
||||
|
||||
static void onBtnOK(void*);
|
||||
static void onBtnCancel(void*);
|
||||
static void onBtnClear(void*);
|
||||
static void callback_clear_url_list(S32 option, void* userdata);
|
||||
};
|
||||
|
||||
#endif // LL_LLFLOATERURLENTRY_H
|
||||
|
|
@ -851,11 +851,11 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
|
|||
|
||||
if (use_pass && (mCollisionBanned == BA_NOT_ON_LIST))
|
||||
{
|
||||
LLViewerImage::bindTexture(mPassImage);
|
||||
LLViewerImage::bindTexture( getPassImage() );
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerImage::bindTexture(mBlockedImage);
|
||||
LLViewerImage::bindTexture( getBlockedImage() );
|
||||
}
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,241 @@
|
|||
/**
|
||||
* @file llmimetypes.cpp
|
||||
* @author James Cook
|
||||
* @brief Translates a MIME type like "video/quicktime" into a
|
||||
* localizable user-friendly string like "QuickTime Movie"
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llmimetypes.h"
|
||||
|
||||
#include "llvieweruictrlfactory.h"
|
||||
|
||||
LLMIMETypes::mime_info_map_t LLMIMETypes::sMap;
|
||||
LLMIMETypes::mime_widget_set_map_t LLMIMETypes::sWidgetMap;
|
||||
|
||||
LLString sDefaultLabel;
|
||||
// Returned when we don't know what to do with the mime type
|
||||
LLString sDefaultWidgetType;
|
||||
// Returned when we don't know what widget set to use
|
||||
LLString sDefaultImpl;
|
||||
// Returned when we don't know what impl to use
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// static
|
||||
bool LLMIMETypes::parseMIMETypes(const LLString& xml_filename)
|
||||
{
|
||||
LLXMLNodePtr root;
|
||||
bool success = LLViewerUICtrlFactory::getLayeredXMLNode(xml_filename, root);
|
||||
if (!success || !root || !root->hasName("mimetypes"))
|
||||
{
|
||||
llwarns << "Unable to read MIME type file: "
|
||||
<< xml_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (LLXMLNode* node = root->getFirstChild();
|
||||
node != NULL;
|
||||
node = node->getNextSibling())
|
||||
{
|
||||
if (node->hasName("defaultlabel"))
|
||||
{
|
||||
sDefaultLabel = node->getTextContents();
|
||||
}
|
||||
else if (node->hasName("defaultwidget"))
|
||||
{
|
||||
sDefaultWidgetType = node->getTextContents();
|
||||
}
|
||||
else if (node->hasName("defaultimpl"))
|
||||
{
|
||||
sDefaultImpl = node->getTextContents();
|
||||
}
|
||||
else if (node->hasName("mimetype") || node->hasName("scheme"))
|
||||
{
|
||||
LLString mime_type;
|
||||
node->getAttributeString("name", mime_type);
|
||||
LLMIMEInfo info;
|
||||
for (LLXMLNode* child = node->getFirstChild();
|
||||
child != NULL;
|
||||
child = child->getNextSibling())
|
||||
{
|
||||
if (child->hasName("label"))
|
||||
{
|
||||
info.mLabel = child->getTextContents();
|
||||
}
|
||||
else if (child->hasName("widgettype"))
|
||||
{
|
||||
info.mWidgetType = child->getTextContents();
|
||||
}
|
||||
else if (child->hasName("impl"))
|
||||
{
|
||||
info.mImpl = child->getTextContents();
|
||||
}
|
||||
}
|
||||
sMap[mime_type] = info;
|
||||
}
|
||||
else if (node->hasName("widgetset"))
|
||||
{
|
||||
LLString set_name;
|
||||
node->getAttributeString("name", set_name);
|
||||
LLMIMEWidgetSet info;
|
||||
for (LLXMLNode* child = node->getFirstChild();
|
||||
child != NULL;
|
||||
child = child->getNextSibling())
|
||||
{
|
||||
if (child->hasName("label"))
|
||||
{
|
||||
info.mLabel = child->getTextContents();
|
||||
}
|
||||
if (child->hasName("icon"))
|
||||
{
|
||||
info.mIcon = child->getTextContents();
|
||||
}
|
||||
if (child->hasName("default_type"))
|
||||
{
|
||||
info.mDefaultMimeType = child->getTextContents();
|
||||
}
|
||||
if (child->hasName("tooltip"))
|
||||
{
|
||||
info.mToolTip = child->getTextContents();
|
||||
}
|
||||
if (child->hasName("playtip"))
|
||||
{
|
||||
info.mPlayTip = child->getTextContents();
|
||||
}
|
||||
if (child->hasName("allow_resize"))
|
||||
{
|
||||
child->getBoolValue( 1, (BOOL*)&( info.mAllowResize ) );
|
||||
}
|
||||
if (child->hasName("allow_looping"))
|
||||
{
|
||||
child->getBoolValue( 1, (BOOL*)&( info.mAllowLooping ) );
|
||||
}
|
||||
}
|
||||
sWidgetMap[set_name] = info;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// static
|
||||
LLString LLMIMETypes::translate(const LLString& mime_type)
|
||||
{
|
||||
mime_info_map_t::const_iterator it = sMap.find(mime_type);
|
||||
if (it != sMap.end())
|
||||
{
|
||||
return it->second.mLabel;
|
||||
}
|
||||
else
|
||||
{
|
||||
return sDefaultLabel;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
LLString LLMIMETypes::widgetType(const LLString& mime_type)
|
||||
{
|
||||
mime_info_map_t::const_iterator it = sMap.find(mime_type);
|
||||
if (it != sMap.end())
|
||||
{
|
||||
return it->second.mWidgetType;
|
||||
}
|
||||
else
|
||||
{
|
||||
return sDefaultWidgetType;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
LLString LLMIMETypes::implType(const LLString& mime_type)
|
||||
{
|
||||
mime_info_map_t::const_iterator it = sMap.find(mime_type);
|
||||
if (it != sMap.end())
|
||||
{
|
||||
return it->second.mImpl;
|
||||
}
|
||||
else
|
||||
{
|
||||
return sDefaultImpl;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
LLString LLMIMETypes::findIcon(const LLString& mime_type)
|
||||
{
|
||||
LLString icon = "";
|
||||
LLString widget_type = LLMIMETypes::widgetType(mime_type);
|
||||
mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type);
|
||||
if(it != sWidgetMap.end())
|
||||
{
|
||||
icon = it->second.mIcon;
|
||||
}
|
||||
return icon;
|
||||
}
|
||||
|
||||
// static
|
||||
LLString LLMIMETypes::findDefaultMimeType(const LLString& widget_type)
|
||||
{
|
||||
LLString mime_type = "none/none";
|
||||
mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type);
|
||||
if(it != sWidgetMap.end())
|
||||
{
|
||||
mime_type = it->second.mDefaultMimeType;
|
||||
}
|
||||
return mime_type;
|
||||
}
|
||||
|
||||
// static
|
||||
LLString LLMIMETypes::findToolTip(const LLString& mime_type)
|
||||
{
|
||||
LLString tool_tip = "";
|
||||
LLString widget_type = LLMIMETypes::widgetType(mime_type);
|
||||
mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type);
|
||||
if(it != sWidgetMap.end())
|
||||
{
|
||||
tool_tip = it->second.mToolTip;
|
||||
}
|
||||
return tool_tip;
|
||||
}
|
||||
|
||||
// static
|
||||
LLString LLMIMETypes::findPlayTip(const LLString& mime_type)
|
||||
{
|
||||
LLString play_tip = "";
|
||||
LLString widget_type = LLMIMETypes::widgetType(mime_type);
|
||||
mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type);
|
||||
if(it != sWidgetMap.end())
|
||||
{
|
||||
play_tip = it->second.mPlayTip;
|
||||
}
|
||||
return play_tip;
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLMIMETypes::findAllowResize(const LLString& mime_type)
|
||||
{
|
||||
bool allow_resize = false;
|
||||
LLString widget_type = LLMIMETypes::widgetType(mime_type);
|
||||
mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type);
|
||||
if(it != sWidgetMap.end())
|
||||
{
|
||||
allow_resize = it->second.mAllowResize;
|
||||
}
|
||||
return allow_resize;
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLMIMETypes::findAllowLooping(const LLString& mime_type)
|
||||
{
|
||||
bool allow_looping = false;
|
||||
LLString widget_type = LLMIMETypes::widgetType(mime_type);
|
||||
mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type);
|
||||
if(it != sWidgetMap.end())
|
||||
{
|
||||
allow_looping = it->second.mAllowLooping;
|
||||
}
|
||||
return allow_looping;
|
||||
}
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
/**
|
||||
* @file llmimetypes.h
|
||||
* @author James Cook
|
||||
* @brief Translates a MIME type like "video/quicktime" into a
|
||||
* localizable user-friendly string like "QuickTime Movie"
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#ifndef LLMIMETYPES_H
|
||||
#define LLMIMETYPES_H
|
||||
|
||||
#include "llstring.h" // because XML parsing lib uses LLString, ugh
|
||||
#include <map>
|
||||
|
||||
class LLMIMETypes
|
||||
{
|
||||
public:
|
||||
static bool parseMIMETypes(const LLString& xml_file_path);
|
||||
// Loads the MIME string definition XML file, usually
|
||||
// from the application skins directory
|
||||
|
||||
static LLString translate(const LLString& mime_type);
|
||||
// Returns "QuickTime Movie" from "video/quicktime"
|
||||
|
||||
static LLString widgetType(const LLString& mime_type);
|
||||
// Type of control widgets for this MIME type
|
||||
// Returns "movie" from "video/quicktime"
|
||||
|
||||
static LLString implType(const LLString& mime_type);
|
||||
// Type of Impl to use for decoding media.
|
||||
|
||||
static LLString findIcon(const LLString& mime_type);
|
||||
// Icon from control widget type for this MIME type
|
||||
|
||||
static LLString findToolTip(const LLString& mime_type);
|
||||
// Tool tip from control widget type for this MIME type
|
||||
|
||||
static LLString findPlayTip(const LLString& mime_type);
|
||||
// Play button tool tip from control widget type for this MIME type
|
||||
|
||||
static LLString findDefaultMimeType(const LLString& widget_type);
|
||||
// Canonical mime type associated with this widget set
|
||||
|
||||
static bool findAllowResize(const LLString& mime_type);
|
||||
// accessor for flag to enable/disable media size edit fields
|
||||
|
||||
static bool LLMIMETypes::findAllowLooping(const LLString& mime_type);
|
||||
// accessor for flag to enable/disable media looping checkbox
|
||||
|
||||
public:
|
||||
struct LLMIMEInfo
|
||||
{
|
||||
LLString mLabel;
|
||||
// friendly label like "QuickTime Movie"
|
||||
|
||||
LLString mWidgetType;
|
||||
// "web" means use web media UI widgets
|
||||
|
||||
LLString mImpl;
|
||||
// which impl to use with this mime type
|
||||
};
|
||||
struct LLMIMEWidgetSet
|
||||
{
|
||||
LLString mLabel;
|
||||
// friendly label like "QuickTime Movie"
|
||||
|
||||
LLString mIcon;
|
||||
// Name of icon asset to display in toolbar
|
||||
|
||||
LLString mDefaultMimeType;
|
||||
// Mime type string to use in absence of a specific one
|
||||
|
||||
LLString mToolTip;
|
||||
// custom tool tip for this mime type
|
||||
|
||||
LLString mPlayTip;
|
||||
// custom tool tip to display for Play button
|
||||
|
||||
bool mAllowResize;
|
||||
// enable/disable media size edit fields
|
||||
|
||||
bool mAllowLooping;
|
||||
// enable/disable media looping checkbox
|
||||
};
|
||||
typedef std::map< LLString, LLMIMEInfo > mime_info_map_t;
|
||||
typedef std::map< LLString, LLMIMEWidgetSet > mime_widget_set_map_t;
|
||||
|
||||
// Public so users can iterate over it
|
||||
static mime_info_map_t sMap;
|
||||
static mime_widget_set_map_t sWidgetMap;
|
||||
private:
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -42,7 +42,6 @@
|
|||
#include "llchatbar.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llimview.h"
|
||||
#include "llmediaengine.h"
|
||||
#include "llmediaremotectrl.h"
|
||||
#include "llpanelaudiovolume.h"
|
||||
#include "llparcel.h"
|
||||
|
|
@ -50,7 +49,10 @@
|
|||
#include "llui.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerimagelist.h"
|
||||
#include "llviewermedia.h"
|
||||
#include "llviewermenu.h" // handle_reset_view()
|
||||
#include "llviewermedia.h"
|
||||
#include "llviewerparcelmedia.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llvieweruictrlfactory.h"
|
||||
#include "llviewerwindow.h"
|
||||
|
|
@ -97,7 +99,6 @@ LLOverlayBar::LLOverlayBar()
|
|||
: LLPanel(),
|
||||
mMediaRemote(NULL),
|
||||
mVoiceRemote(NULL),
|
||||
mMediaState(STOPPED),
|
||||
mMusicState(STOPPED)
|
||||
{
|
||||
setMouseOpaque(FALSE);
|
||||
|
|
@ -220,7 +221,7 @@ void LLOverlayBar::refresh()
|
|||
|
||||
BOOL controls_grabbed = gAgent.anyControlGrabbed();
|
||||
button = LLUICtrlFactory::getButtonByName(this, "Release Keys");
|
||||
|
||||
|
||||
if (button && button->getVisible() != controls_grabbed)
|
||||
{
|
||||
button->setVisible(controls_grabbed);
|
||||
|
|
@ -231,7 +232,7 @@ void LLOverlayBar::refresh()
|
|||
|
||||
BOOL mouselook_grabbed;
|
||||
mouselook_grabbed = gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_DOWN_INDEX)
|
||||
|| gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX);
|
||||
|| gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX);
|
||||
button = LLUICtrlFactory::getButtonByName(this, "Mouselook");
|
||||
|
||||
if (button && button->getVisible() != mouselook_grabbed)
|
||||
|
|
@ -257,7 +258,6 @@ void LLOverlayBar::refresh()
|
|||
buttons_changed = TRUE;
|
||||
}
|
||||
|
||||
enableMediaButtons();
|
||||
|
||||
moveChildToBackOfTabGroup(mMediaRemote);
|
||||
moveChildToBackOfTabGroup(mVoiceRemote);
|
||||
|
|
@ -340,24 +340,40 @@ void LLOverlayBar::mediaPlay(void*)
|
|||
return;
|
||||
}
|
||||
|
||||
if (gOverlayBar->mMediaState != PLAYING)
|
||||
|
||||
if (LLViewerMedia::isMediaPaused())
|
||||
{
|
||||
gOverlayBar->mMediaState = PLAYING; // desired state
|
||||
LLParcel* parcel = gParcelMgr->getAgentParcel();
|
||||
if (parcel)
|
||||
{
|
||||
LLString path("");
|
||||
LLMediaEngine::getInstance()->convertImageAndLoadUrl( true, false, path );
|
||||
}
|
||||
LLViewerParcelMedia::start();
|
||||
}
|
||||
else if(LLViewerMedia::isMediaPlaying())
|
||||
{
|
||||
LLViewerParcelMedia::pause();
|
||||
}
|
||||
else
|
||||
{
|
||||
gOverlayBar->mMediaState = PAUSED; // desired state
|
||||
LLMediaEngine::getInstance()->pause();
|
||||
LLParcel* parcel = gParcelMgr->getAgentParcel();
|
||||
if (parcel)
|
||||
{
|
||||
LLViewerParcelMedia::play(parcel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//gOverlayBar->mMediaState = STOPPED; // desired state
|
||||
//LLMediaEngine::getInstance()->stop();
|
||||
//static
|
||||
void LLOverlayBar::mediaPause(void*)
|
||||
{
|
||||
|
||||
LLViewerParcelMedia::pause();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLOverlayBar::mediaStop(void*)
|
||||
{
|
||||
if (!gOverlayBar)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LLViewerParcelMedia::stop();
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
@ -403,39 +419,3 @@ void LLOverlayBar::musicPlay(void*)
|
|||
}
|
||||
}
|
||||
|
||||
void LLOverlayBar::enableMediaButtons()
|
||||
{
|
||||
if (mMediaRemote)
|
||||
{
|
||||
// Music
|
||||
LLParcel* parcel = gParcelMgr->getAgentParcel();
|
||||
if (parcel
|
||||
&& gAudiop
|
||||
&& !parcel->getMusicURL().empty()
|
||||
&& gSavedSettings.getBOOL("AudioStreamingMusic"))
|
||||
{
|
||||
mMediaRemote->childSetEnabled("music_play", TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
mMediaRemote->childSetEnabled("music_play", FALSE);
|
||||
}
|
||||
|
||||
// Media
|
||||
// if there is a url and a texture and media is enabled and available and media streaming is on... (phew!)
|
||||
if (LLMediaEngine::getInstance()
|
||||
&& LLMediaEngine::getInstance()->getUrl ().length ()
|
||||
&& LLMediaEngine::getInstance()->getImageUUID ().notNull ()
|
||||
&& LLMediaEngine::getInstance()->isEnabled ()
|
||||
&& LLMediaEngine::getInstance()->isAvailable ()
|
||||
&& gSavedSettings.getBOOL ( "AudioStreamingVideo" ) )
|
||||
{
|
||||
mMediaRemote->childSetEnabled("media_play", TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
mMediaRemote->childSetEnabled("media_play", FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@ public:
|
|||
void layoutButtons();
|
||||
|
||||
// helpers for returning desired state
|
||||
BOOL mediaPlaying() { return mMediaState == PLAYING; }
|
||||
BOOL musicPlaying() { return mMusicState == PLAYING; }
|
||||
|
||||
static void onClickIMReceived(void* data);
|
||||
|
|
@ -79,7 +78,14 @@ public:
|
|||
|
||||
//static media helper functions
|
||||
static void mediaPlay(void*);
|
||||
static void mediaPause(void*);
|
||||
static void mediaStop(void*);
|
||||
|
||||
static void musicPlay(void*);
|
||||
static void musicPause(void*);
|
||||
static void musicStop(void*);
|
||||
|
||||
static void toggleAudioVolumeFloater(void*);
|
||||
|
||||
protected:
|
||||
static void* createMediaRemote(void* userdata);
|
||||
|
|
@ -93,8 +99,7 @@ protected:
|
|||
LLVoiceRemoteCtrl* mVoiceRemote;
|
||||
bool mBuilt; // dialog constructed yet?
|
||||
enum { STOPPED=0, PLAYING=1, PAUSED=2 };
|
||||
BOOL mMediaState;
|
||||
BOOL mMusicState;
|
||||
S32 mMusicState;
|
||||
};
|
||||
|
||||
extern LLOverlayBar* gOverlayBar;
|
||||
|
|
|
|||
|
|
@ -495,7 +495,6 @@ BOOL LLPanelAvatarWeb::postBuild(void)
|
|||
|
||||
childSetControlName("auto_load","AutoLoadWebProfiles");
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
mWebBrowser = (LLWebBrowserCtrl*)getChildByName("profile_html");
|
||||
|
||||
// links open in internally
|
||||
|
|
@ -503,7 +502,6 @@ BOOL LLPanelAvatarWeb::postBuild(void)
|
|||
|
||||
// observe browser events
|
||||
mWebBrowser->addObserver( this );
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -563,13 +561,11 @@ LLPanelAvatarWeb::LLPanelAvatarWeb(const std::string& name, const LLRect& rect,
|
|||
|
||||
LLPanelAvatarWeb::~LLPanelAvatarWeb()
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
// stop observing browser events
|
||||
if ( mWebBrowser )
|
||||
{
|
||||
mWebBrowser->remObserver( this );
|
||||
};
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLPanelAvatarWeb::enableControls(BOOL self)
|
||||
|
|
@ -606,12 +602,6 @@ void LLPanelAvatarWeb::setWebURL(std::string url)
|
|||
childSetVisible("profile_html",false);
|
||||
}
|
||||
|
||||
#if !LL_LIBXUL_ENABLED
|
||||
childSetVisible("load",false);
|
||||
childSetVisible("profile_html",false);
|
||||
childSetVisible("status_text",false);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
@ -627,18 +617,13 @@ void LLPanelAvatarWeb::onCommitURL(LLUICtrl* ctrl, void* data)
|
|||
// static
|
||||
void LLPanelAvatarWeb::onClickWebProfileHelp(void *)
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
gViewerWindow->alertXml("ClickWebProfileHelpAvatar");
|
||||
#else
|
||||
gViewerWindow->alertXml("ClickWebProfileNoWebHelpAvatar");
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLPanelAvatarWeb::load(std::string url)
|
||||
{
|
||||
bool have_url = (!url.empty());
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
if (have_url)
|
||||
{
|
||||
llinfos << "Loading " << url << llendl;
|
||||
|
|
@ -658,9 +643,6 @@ void LLPanelAvatarWeb::load(std::string url)
|
|||
childSetEnabled("home",use_home);
|
||||
childSetEnabled("open",have_url);
|
||||
|
||||
#else
|
||||
childSetEnabled("open",have_url);
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLPanelAvatarWeb::load()
|
||||
|
|
@ -692,7 +674,6 @@ void LLPanelAvatarWeb::onClickOpen(void* data)
|
|||
}
|
||||
}
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
void LLPanelAvatarWeb::onStatusTextChange( const EventType& eventIn )
|
||||
{
|
||||
childSetText("status_text", eventIn.getStringValue() );
|
||||
|
|
@ -702,7 +683,6 @@ void LLPanelAvatarWeb::onLocationChange( const EventType& eventIn )
|
|||
{
|
||||
childSetText("url_edit", eventIn.getStringValue() );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -137,9 +137,7 @@ private:
|
|||
// WARNING! The order of the inheritance here matters!! Do not change. - KLW
|
||||
class LLPanelAvatarWeb :
|
||||
public LLPanelAvatarTab
|
||||
#if LL_LIBXUL_ENABLED
|
||||
, public LLWebBrowserCtrlObserver
|
||||
#endif
|
||||
{
|
||||
public:
|
||||
LLPanelAvatarWeb(const std::string& name, const LLRect& rect, LLPanelAvatar* panel_avatar);
|
||||
|
|
@ -157,11 +155,9 @@ public:
|
|||
static void onCommitURL(LLUICtrl* ctrl, void* data);
|
||||
static void onClickWebProfileHelp(void *);
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
// browser observer impls
|
||||
virtual void onStatusTextChange( const EventType& eventIn );
|
||||
virtual void onLocationChange( const EventType& eventIn );
|
||||
#endif
|
||||
|
||||
private:
|
||||
std::string mURL;
|
||||
|
|
|
|||
|
|
@ -57,10 +57,9 @@
|
|||
#include "lltooldraganddrop.h"
|
||||
#include "llui.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewermedia.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerstats.h"
|
||||
#include "llmediaengine.h"
|
||||
|
||||
#include "llvieweruictrlfactory.h"
|
||||
|
||||
//
|
||||
|
|
@ -374,14 +373,19 @@ void LLPanelFace::getState()
|
|||
childSetEnabled("button align",FALSE);
|
||||
//mBtnAutoFix->setEnabled ( FALSE );
|
||||
|
||||
if ( LLMediaEngine::getInstance()->getMediaRenderer () )
|
||||
if ( LLMediaEngine::getInstance()->getMediaRenderer ()->isLoaded () )
|
||||
{
|
||||
childSetEnabled("textbox autofix",editable);
|
||||
//mLabelTexAutoFix->setEnabled ( editable );
|
||||
childSetEnabled("button align",editable);
|
||||
//mBtnAutoFix->setEnabled ( editable );
|
||||
}
|
||||
if(LLViewerMedia::hasMedia())
|
||||
{
|
||||
childSetEnabled("textbox autofix",editable);
|
||||
childSetEnabled("button align",editable);
|
||||
}
|
||||
//if ( LLMediaEngine::getInstance()->getMediaRenderer () )
|
||||
// if ( LLMediaEngine::getInstance()->getMediaRenderer ()->isLoaded () )
|
||||
// {
|
||||
//
|
||||
// //mLabelTexAutoFix->setEnabled ( editable );
|
||||
//
|
||||
// //mBtnAutoFix->setEnabled ( editable );
|
||||
// }
|
||||
childSetEnabled("button apply",editable);
|
||||
|
||||
bool identical;
|
||||
|
|
@ -884,27 +888,25 @@ struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
|
|||
virtual bool apply(LLViewerObject* object, S32 te)
|
||||
{
|
||||
// only do this if it's a media texture
|
||||
if ( object->getTE ( te )->getID() == LLMediaEngine::getInstance()->getImageUUID () )
|
||||
if ( object->getTE ( te )->getID() == LLViewerMedia::getMediaTextureID() )
|
||||
{
|
||||
// make sure we're valid
|
||||
if ( LLMediaEngine::getInstance()->getMediaRenderer() )
|
||||
S32 media_width, media_height;
|
||||
S32 texture_width, texture_height;
|
||||
if ( LLViewerMedia::getMediaSize( &media_width, &media_height )
|
||||
&& LLViewerMedia::getTextureSize( &texture_width, &texture_height ) )
|
||||
{
|
||||
// calculate correct scaling based on media dimensions and next-power-of-2 texture dimensions
|
||||
F32 scaleS = (F32)LLMediaEngine::getInstance()->getMediaRenderer()->getMediaWidth() /
|
||||
(F32)LLMediaEngine::getInstance()->getMediaRenderer()->getTextureWidth();
|
||||
|
||||
F32 scaleT = (F32)LLMediaEngine::getInstance()->getMediaRenderer()->getMediaHeight() /
|
||||
(F32)LLMediaEngine::getInstance()->getMediaRenderer()->getTextureHeight();
|
||||
F32 scale_s = (F32)media_width / (F32)texture_width;
|
||||
F32 scale_t = (F32)media_height / (F32)texture_height;
|
||||
|
||||
// set scale and adjust offset
|
||||
object->setTEScaleS( te, scaleS );
|
||||
object->setTEScaleT( te, scaleT ); // don't need to flip Y anymore since QT does this for us now.
|
||||
object->setTEOffsetS( te, -( 1.0f - scaleS ) / 2.0f );
|
||||
object->setTEOffsetT( te, -( 1.0f - scaleT ) / 2.0f );
|
||||
object->setTEScaleS( te, scale_s );
|
||||
object->setTEScaleT( te, scale_t ); // don't need to flip Y anymore since QT does this for us now.
|
||||
object->setTEOffsetS( te, -( 1.0f - scale_s ) / 2.0f );
|
||||
object->setTEOffsetT( te, -( 1.0f - scale_t ) / 2.0f );
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void LLPanelFace::onClickAutoFix(void* userdata)
|
||||
|
|
|
|||
|
|
@ -253,5 +253,5 @@ void LLPanelLandInfo::onClickAbout(void*)
|
|||
gParcelMgr->selectParcelInRectangle();
|
||||
}
|
||||
|
||||
LLFloaterLand::show();
|
||||
LLFloaterLand::showInstance();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,378 @@
|
|||
/**
|
||||
* @file llpanellandmedia.cpp
|
||||
* @author Callum Prentice, Sam Kolb, James Cook
|
||||
* @brief Allows configuration of "media" for a land parcel,
|
||||
* for example movies, web pages, and audio.
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llpanellandmedia.h"
|
||||
|
||||
// viewer includes
|
||||
#include "llmimetypes.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llvieweruictrlfactory.h"
|
||||
|
||||
// library includes
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
#include "llfloaterurlentry.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "llparcel.h"
|
||||
#include "lltextbox.h"
|
||||
#include "llradiogroup.h"
|
||||
#include "llspinctrl.h"
|
||||
#include "llsdutil.h"
|
||||
#include "lltexturectrl.h"
|
||||
#include "roles_constants.h"
|
||||
|
||||
// Values for the parcel voice settings radio group
|
||||
enum
|
||||
{
|
||||
kRadioVoiceChatEstate = 0,
|
||||
kRadioVoiceChatPrivate = 1,
|
||||
kRadioVoiceChatDisable = 2
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// LLPanelLandMedia
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
|
||||
: LLPanel("land_media_panel"), mParcel(parcel)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
LLPanelLandMedia::~LLPanelLandMedia()
|
||||
{
|
||||
// close LLFloaterURLEntry?
|
||||
}
|
||||
|
||||
|
||||
BOOL LLPanelLandMedia::postBuild()
|
||||
{
|
||||
mCheckSoundLocal = LLUICtrlFactory::getCheckBoxByName(this, "check sound local");
|
||||
childSetCommitCallback("check sound local", onCommitAny, this);
|
||||
|
||||
mRadioVoiceChat = LLUICtrlFactory::getRadioGroupByName(this, "parcel_voice_channel");
|
||||
childSetCommitCallback("parcel_voice_channel", onCommitAny, this);
|
||||
|
||||
mMusicURLEdit = LLUICtrlFactory::getLineEditorByName(this, "music_url");
|
||||
childSetCommitCallback("music_url", onCommitAny, this);
|
||||
|
||||
mMediaTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this, "media texture");
|
||||
if (mMediaTextureCtrl)
|
||||
{
|
||||
mMediaTextureCtrl->setCommitCallback( onCommitAny );
|
||||
mMediaTextureCtrl->setCallbackUserData( this );
|
||||
mMediaTextureCtrl->setAllowNoTexture ( TRUE );
|
||||
mMediaTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
|
||||
mMediaTextureCtrl->setNonImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "LLUICtrlFactory::getTexturePickerByName() returned NULL for 'media texure'" << llendl;
|
||||
}
|
||||
|
||||
mMediaAutoScaleCheck = LLUICtrlFactory::getCheckBoxByName(this, "media_auto_scale");
|
||||
childSetCommitCallback("media_auto_scale", onCommitAny, this);
|
||||
|
||||
mMediaLoopCheck = LLUICtrlFactory::getCheckBoxByName(this, "media_loop");
|
||||
childSetCommitCallback("media_loop", onCommitAny, this);
|
||||
|
||||
mMediaUrlCheck = LLUICtrlFactory::getCheckBoxByName(this, "hide_media_url");
|
||||
childSetCommitCallback("hide_media_url", onCommitAny, this);
|
||||
|
||||
mMusicUrlCheck = LLUICtrlFactory::getCheckBoxByName(this, "hide_music_url");
|
||||
childSetCommitCallback("hide_music_url", onCommitAny, this);
|
||||
|
||||
mMediaURLEdit = LLUICtrlFactory::getLineEditorByName(this, "media_url");
|
||||
childSetCommitCallback("media_url", onCommitAny, this);
|
||||
|
||||
mMediaDescEdit = LLUICtrlFactory::getLineEditorByName(this, "url_description");
|
||||
childSetCommitCallback("url_description", onCommitAny, this);
|
||||
|
||||
mMediaTypeCombo = LLUICtrlFactory::getComboBoxByName(this, "media type");
|
||||
childSetCommitCallback("media type", onCommitType, this);
|
||||
populateMIMECombo();
|
||||
mMediaTypeCombo->sortByName();
|
||||
|
||||
mMediaWidthCtrl = LLUICtrlFactory::getSpinnerByName(this, "media_size_width");
|
||||
childSetCommitCallback("media_size_width", onCommitAny, this);
|
||||
mMediaHeightCtrl = LLUICtrlFactory::getSpinnerByName(this, "media_size_height");
|
||||
childSetCommitCallback("media_size_height", onCommitAny, this);
|
||||
mMediaSizeCtrlLabel = LLUICtrlFactory::getTextBoxByName(this, "media_size");
|
||||
|
||||
mSetURLButton = LLUICtrlFactory::getButtonByName(this, "set_media_url");
|
||||
childSetAction("set_media_url", onSetBtn, this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
// public
|
||||
void LLPanelLandMedia::refresh()
|
||||
{
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
|
||||
if (!parcel)
|
||||
{
|
||||
clearCtrls();
|
||||
}
|
||||
else
|
||||
{
|
||||
// something selected, hooray!
|
||||
|
||||
// Display options
|
||||
BOOL can_change_media = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA);
|
||||
|
||||
mCheckSoundLocal->set( parcel->getSoundLocal() );
|
||||
mCheckSoundLocal->setEnabled( can_change_media );
|
||||
|
||||
if(parcel->getVoiceEnabled())
|
||||
{
|
||||
if(parcel->getVoiceUseEstateChannel())
|
||||
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
|
||||
else
|
||||
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatPrivate);
|
||||
}
|
||||
else
|
||||
{
|
||||
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatDisable);
|
||||
}
|
||||
|
||||
mRadioVoiceChat->setEnabled( can_change_media );
|
||||
|
||||
mMusicURLEdit->setText(parcel->getMusicURL());
|
||||
mMusicURLEdit->setEnabled( can_change_media );
|
||||
|
||||
mMediaURLEdit->setText(parcel->getMediaURL());
|
||||
mMediaURLEdit->setEnabled( FALSE );
|
||||
|
||||
mMediaDescEdit->setText(LLString(parcel->getMediaDesc()));
|
||||
mMediaDescEdit->setEnabled( can_change_media );
|
||||
|
||||
std::string mime_type = parcel->getMediaType();
|
||||
if (mime_type.empty())
|
||||
{
|
||||
mime_type = "none/none";
|
||||
}
|
||||
setMediaType(mime_type);
|
||||
mMediaTypeCombo->setEnabled( can_change_media );
|
||||
childSetText("mime_type", mime_type);
|
||||
|
||||
mMediaUrlCheck->set( parcel->getObscureMedia() );
|
||||
mMediaUrlCheck->setEnabled( can_change_media );
|
||||
|
||||
mMusicUrlCheck->set( parcel->getObscureMusic() );
|
||||
mMusicUrlCheck->setEnabled( can_change_media );
|
||||
|
||||
// don't display urls if you're not able to change it
|
||||
// much requested change in forums so people can't 'steal' urls
|
||||
// NOTE: bug#2009 means this is still vunerable - however, bug
|
||||
// should be closed since this bug opens up major security issues elsewhere.
|
||||
bool obscure_media = ! can_change_media && parcel->getObscureMedia();
|
||||
bool obscure_music = ! can_change_media && parcel->getObscureMusic();
|
||||
|
||||
// Special code to disable asterixes for html type
|
||||
if(mime_type == "text/html")
|
||||
{
|
||||
obscure_media = false;
|
||||
mMediaUrlCheck->set( 0 );
|
||||
mMediaUrlCheck->setEnabled( false );
|
||||
}
|
||||
|
||||
mMusicURLEdit->setDrawAsterixes( obscure_music );
|
||||
mMediaURLEdit->setDrawAsterixes( obscure_media );
|
||||
|
||||
mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
|
||||
mMediaAutoScaleCheck->setEnabled ( can_change_media );
|
||||
|
||||
// Special code to disable looping checkbox for HTML MIME type
|
||||
// (DEV-10042 -- Parcel Media: "Loop Media" should be disabled for static media types)
|
||||
bool allow_looping = LLMIMETypes::findAllowLooping( mime_type );
|
||||
if ( allow_looping )
|
||||
mMediaLoopCheck->set( parcel->getMediaLoop () );
|
||||
else
|
||||
mMediaLoopCheck->set( false );
|
||||
mMediaLoopCheck->setEnabled ( can_change_media && allow_looping );
|
||||
|
||||
// disallow media size change for mime types that don't allow it
|
||||
bool allow_resize = LLMIMETypes::findAllowResize( mime_type );
|
||||
if ( allow_resize )
|
||||
mMediaWidthCtrl->setValue( parcel->getMediaWidth() );
|
||||
else
|
||||
mMediaWidthCtrl->setValue( 0 );
|
||||
mMediaWidthCtrl->setEnabled ( can_change_media && allow_resize );
|
||||
|
||||
if ( allow_resize )
|
||||
mMediaHeightCtrl->setValue( parcel->getMediaHeight() );
|
||||
else
|
||||
mMediaHeightCtrl->setValue( 0 );
|
||||
mMediaHeightCtrl->setEnabled ( can_change_media && allow_resize );
|
||||
|
||||
// enable/disable for text label for completeness
|
||||
mMediaSizeCtrlLabel->setEnabled( can_change_media && allow_resize );
|
||||
|
||||
LLUUID tmp = parcel->getMediaID();
|
||||
mMediaTextureCtrl->setImageAssetID ( parcel->getMediaID() );
|
||||
mMediaTextureCtrl->setEnabled( can_change_media );
|
||||
|
||||
mSetURLButton->setEnabled( can_change_media );
|
||||
|
||||
#if 0
|
||||
// there is a media url and a media texture selected
|
||||
if ( ( ! ( std::string ( parcel->getMediaURL() ).empty () ) ) && ( ! ( parcel->getMediaID ().isNull () ) ) )
|
||||
{
|
||||
// turn on transport controls if allowed for this parcel
|
||||
mMediaStopButton->setEnabled ( editable );
|
||||
mMediaStartButton->setEnabled ( editable );
|
||||
}
|
||||
else
|
||||
{
|
||||
// no media url or no media texture
|
||||
mMediaStopButton->setEnabled ( FALSE );
|
||||
mMediaStartButton->setEnabled ( FALSE );
|
||||
};
|
||||
#endif
|
||||
|
||||
LLFloaterURLEntry* floater_url_entry = (LLFloaterURLEntry*)LLFloater::getFloaterByHandle(mURLEntryFloater);
|
||||
if (floater_url_entry)
|
||||
{
|
||||
floater_url_entry->updateFromLandMediaPanel();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelLandMedia::populateMIMECombo()
|
||||
{
|
||||
LLMIMETypes::mime_widget_set_map_t::const_iterator it;
|
||||
for (it = LLMIMETypes::sWidgetMap.begin(); it != LLMIMETypes::sWidgetMap.end(); ++it)
|
||||
{
|
||||
const LLString& mime_type = it->first;
|
||||
const LLMIMETypes::LLMIMEWidgetSet& info = it->second;
|
||||
mMediaTypeCombo->add(info.mLabel, mime_type);
|
||||
}
|
||||
}
|
||||
void LLPanelLandMedia::setMediaType(const LLString& mime_type)
|
||||
{
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
if(parcel)
|
||||
parcel->setMediaType(mime_type.c_str());
|
||||
|
||||
LLString media_key = LLMIMETypes::widgetType(mime_type);
|
||||
mMediaTypeCombo->setValue(media_key);
|
||||
childSetText("mime_type", mime_type);
|
||||
}
|
||||
|
||||
void LLPanelLandMedia::setMediaURL(const LLString& media_url)
|
||||
{
|
||||
mMediaURLEdit->setText(media_url);
|
||||
mMediaURLEdit->onCommit();
|
||||
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLandMedia::onCommitType(LLUICtrl *ctrl, void *userdata)
|
||||
{
|
||||
LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
|
||||
std::string current_type = LLMIMETypes::widgetType(self->childGetText("mime_type"));
|
||||
std::string new_type = self->mMediaTypeCombo->getValue();
|
||||
if(current_type != new_type)
|
||||
{
|
||||
self->childSetText("mime_type", LLMIMETypes::findDefaultMimeType(new_type));
|
||||
}
|
||||
onCommitAny(ctrl, userdata);
|
||||
|
||||
}
|
||||
// static
|
||||
void LLPanelLandMedia::onCommitAny(LLUICtrl *ctrl, void *userdata)
|
||||
{
|
||||
LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
|
||||
|
||||
LLParcel* parcel = self->mParcel->getParcel();
|
||||
if (!parcel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Extract data from UI
|
||||
BOOL sound_local = self->mCheckSoundLocal->get();
|
||||
int voice_setting = self->mRadioVoiceChat->getSelectedIndex();
|
||||
std::string music_url = self->mMusicURLEdit->getText();
|
||||
std::string media_url = self->mMediaURLEdit->getText();
|
||||
std::string media_desc = self->mMediaDescEdit->getText();
|
||||
std::string mime_type = self->childGetText("mime_type");
|
||||
U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
|
||||
U8 media_loop = self->mMediaLoopCheck->get();
|
||||
U8 obscure_media = self->mMediaUrlCheck->get();
|
||||
U8 obscure_music = self->mMusicUrlCheck->get();
|
||||
S32 media_width = (S32)self->mMediaWidthCtrl->get();
|
||||
S32 media_height = (S32)self->mMediaHeightCtrl->get();
|
||||
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
|
||||
|
||||
self->childSetText("mime_type", mime_type);
|
||||
|
||||
BOOL voice_enabled;
|
||||
BOOL voice_estate_chan;
|
||||
|
||||
switch(voice_setting)
|
||||
{
|
||||
default:
|
||||
case kRadioVoiceChatEstate:
|
||||
voice_enabled = TRUE;
|
||||
voice_estate_chan = TRUE;
|
||||
break;
|
||||
case kRadioVoiceChatPrivate:
|
||||
voice_enabled = TRUE;
|
||||
voice_estate_chan = FALSE;
|
||||
break;
|
||||
case kRadioVoiceChatDisable:
|
||||
voice_enabled = FALSE;
|
||||
voice_estate_chan = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
// Remove leading/trailing whitespace (common when copying/pasting)
|
||||
LLString::trim(music_url);
|
||||
LLString::trim(media_url);
|
||||
|
||||
// Push data into current parcel
|
||||
parcel->setParcelFlag(PF_ALLOW_VOICE_CHAT, voice_enabled);
|
||||
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
|
||||
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
|
||||
parcel->setMusicURL(music_url.c_str());
|
||||
parcel->setMediaURL(media_url.c_str());
|
||||
parcel->setMediaType(mime_type.c_str());
|
||||
parcel->setMediaDesc(media_desc.c_str());
|
||||
parcel->setMediaWidth(media_width);
|
||||
parcel->setMediaHeight(media_height);
|
||||
parcel->setMediaID(media_id);
|
||||
parcel->setMediaAutoScale ( media_auto_scale );
|
||||
parcel->setMediaLoop ( media_loop );
|
||||
parcel->setObscureMedia( obscure_media );
|
||||
parcel->setObscureMusic( obscure_music );
|
||||
|
||||
// Send current parcel data upstream to server
|
||||
gParcelMgr->sendParcelPropertiesUpdate( parcel );
|
||||
|
||||
// Might have changed properties, so let's redraw!
|
||||
self->refresh();
|
||||
}
|
||||
// static
|
||||
void LLPanelLandMedia::onSetBtn(void *userdata)
|
||||
{
|
||||
LLPanelLandMedia *self = (LLPanelLandMedia *)userdata;
|
||||
self->mURLEntryFloater = LLFloaterURLEntry::show( self->getHandle() );
|
||||
LLFloater* parent_floater = gFloaterView->getParentFloater(self);
|
||||
if (parent_floater)
|
||||
{
|
||||
parent_floater->addDependentFloater(LLFloater::getFloaterByHandle(self->mURLEntryFloater));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* @file llpanellandmedia.h
|
||||
* @author Callum Prentice, Sam Kolb, James Cook
|
||||
* @brief Allows configuration of "media" for a land parcel,
|
||||
* for example movies, web pages, and audio.
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#ifndef LLPANELLANDMEDIA_H
|
||||
#define LLPANELLANDMEDIA_H
|
||||
|
||||
#include "lllineeditor.h"
|
||||
#include "llmemory.h" // LLHandle<>
|
||||
#include "llpanel.h"
|
||||
#include "llparcelselection.h"
|
||||
#include "lluifwd.h" // widget pointer types
|
||||
|
||||
class LLPanelLandMedia
|
||||
: public LLPanel
|
||||
{
|
||||
public:
|
||||
LLPanelLandMedia(LLHandle<LLParcelSelection>& parcelp);
|
||||
/*virtual*/ ~LLPanelLandMedia();
|
||||
/*virtual*/ BOOL postBuild();
|
||||
void refresh();
|
||||
void setMediaType(const LLString& media_type);
|
||||
void setMediaURL(const LLString& media_type);
|
||||
const LLString& getMediaURL() { return mMediaURLEdit->getText(); }
|
||||
|
||||
private:
|
||||
void populateMIMECombo();
|
||||
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
|
||||
static void onCommitType(LLUICtrl* ctrl, void *userdata);
|
||||
static void onSetBtn(void* userdata);
|
||||
|
||||
private:
|
||||
LLCheckBoxCtrl* mCheckSoundLocal;
|
||||
LLRadioGroup* mRadioVoiceChat;
|
||||
LLLineEditor* mMusicURLEdit;
|
||||
LLLineEditor* mMediaURLEdit;
|
||||
LLLineEditor* mMediaDescEdit;
|
||||
LLComboBox* mMediaTypeCombo;
|
||||
LLButton* mSetURLButton;
|
||||
LLSpinCtrl* mMediaHeightCtrl;
|
||||
LLSpinCtrl* mMediaWidthCtrl;
|
||||
LLTextBox* mMediaSizeCtrlLabel;
|
||||
LLTextureCtrl* mMediaTextureCtrl;
|
||||
LLCheckBoxCtrl* mMediaAutoScaleCheck;
|
||||
LLCheckBoxCtrl* mMediaLoopCheck;
|
||||
LLCheckBoxCtrl* mMediaUrlCheck;
|
||||
LLCheckBoxCtrl* mMusicUrlCheck;
|
||||
LLViewHandle mURLEntryFloater;
|
||||
|
||||
LLHandle<LLParcelSelection>& mParcel;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -71,7 +71,8 @@
|
|||
#include "llwebbrowserctrl.h"
|
||||
|
||||
#include "llfloaterhtml.h"
|
||||
//#include "llfloaterhtmlhelp.h"
|
||||
|
||||
#include "llfloaterhtmlhelp.h"
|
||||
#include "llfloatertos.h"
|
||||
|
||||
#include "llglheaders.h"
|
||||
|
|
@ -95,12 +96,10 @@ public:
|
|||
LLLoginRefreshHandler() : LLCommandHandler("login_refresh", false) { }
|
||||
bool handle(const LLSD& tokens, const LLSD& queryMap)
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
|
||||
{
|
||||
LLPanelLogin::loadLoginPage();
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
|
@ -438,7 +437,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
#endif
|
||||
|
||||
// get the web browser control
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html");
|
||||
if ( web_browser )
|
||||
{
|
||||
|
|
@ -475,9 +473,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
}
|
||||
LLHTTPClient::head( login_page, gResponsePtr );
|
||||
};
|
||||
#else
|
||||
mHtmlAvailable = FALSE;
|
||||
#endif
|
||||
|
||||
#if !USE_VIEWER_AUTH
|
||||
// Initialize visibility (and don't force visibility - use prefs)
|
||||
|
|
@ -487,7 +482,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
|
||||
void LLPanelLogin::setSiteIsAlive( bool alive )
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html");
|
||||
// if the contents of the site was retrieved
|
||||
if ( alive )
|
||||
|
|
@ -523,10 +517,6 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
|
|||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
mHtmlAvailable = FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data)
|
||||
|
|
@ -620,7 +610,6 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
if ( KEY_F1 == key )
|
||||
{
|
||||
llinfos << "Spawning HTML help window" << llendl;
|
||||
|
|
@ -636,7 +625,6 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)
|
|||
tos_dialog->startModal();
|
||||
return TRUE;
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
if (!called_from_parent)
|
||||
|
|
@ -917,14 +905,12 @@ void LLPanelLogin::setAlwaysRefresh(bool refresh)
|
|||
{
|
||||
if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return;
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
|
||||
|
||||
if (web_browser)
|
||||
{
|
||||
web_browser->setAlwaysRefresh(refresh);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1050,15 +1036,12 @@ void LLPanelLogin::loadLoginPage()
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
|
||||
|
||||
// navigate to the "real" page
|
||||
web_browser->navigateTo( oStr.str() );
|
||||
#endif
|
||||
}
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
void LLPanelLogin::onNavigateComplete( const EventType& eventIn )
|
||||
{
|
||||
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
|
||||
|
|
@ -1074,7 +1057,6 @@ void LLPanelLogin::onNavigateComplete( const EventType& eventIn )
|
|||
//web_browser->handleKey(KEY_TAB, MASK_NONE, false);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Protected methods
|
||||
|
|
|
|||
|
|
@ -64,11 +64,9 @@ class LLLoginHandler : public LLCommandHandler
|
|||
|
||||
extern LLLoginHandler gLoginHandler;
|
||||
|
||||
class LLPanelLogin
|
||||
: public LLPanel
|
||||
#if LL_LIBXUL_ENABLED
|
||||
, public LLWebBrowserCtrlObserver
|
||||
#endif
|
||||
class LLPanelLogin:
|
||||
public LLPanel,
|
||||
public LLWebBrowserCtrlObserver
|
||||
{
|
||||
public:
|
||||
LLPanelLogin(const LLRect &rect, BOOL show_server,
|
||||
|
|
@ -111,11 +109,7 @@ private:
|
|||
static void newAccountAlertCallback(S32 option, void*);
|
||||
static void onClickQuit(void*);
|
||||
static void onClickVersion(void*);
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
// browser observer impls
|
||||
virtual void onNavigateComplete( const EventType& eventIn );
|
||||
#endif
|
||||
static void onClickForgotPassword(void*);
|
||||
static void onPassKey(LLLineEditor* caller, void* user_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,83 @@
|
|||
/**
|
||||
* @file llparcelselection.cpp
|
||||
* @brief Information about the currently selected parcel
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llparcelselection.h"
|
||||
|
||||
#include "llparcel.h"
|
||||
|
||||
|
||||
// static
|
||||
LLPointer<LLParcelSelection> LLParcelSelection::sNullSelection;
|
||||
|
||||
template<>
|
||||
const LLHandle<LLParcelSelection>::NullFunc
|
||||
LLHandle<LLParcelSelection>::sNullFunc =
|
||||
LLParcelSelection::getNullParcelSelection;
|
||||
|
||||
//
|
||||
// LLParcelSelection
|
||||
//
|
||||
LLParcelSelection::LLParcelSelection() :
|
||||
mParcel(NULL),
|
||||
mSelectedMultipleOwners(FALSE),
|
||||
mWholeParcelSelected(FALSE),
|
||||
mSelectedSelfCount(0),
|
||||
mSelectedOtherCount(0),
|
||||
mSelectedPublicCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
LLParcelSelection::LLParcelSelection(LLParcel* parcel) :
|
||||
mParcel(parcel),
|
||||
mSelectedMultipleOwners(FALSE),
|
||||
mWholeParcelSelected(FALSE),
|
||||
mSelectedSelfCount(0),
|
||||
mSelectedOtherCount(0),
|
||||
mSelectedPublicCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
LLParcelSelection::~LLParcelSelection()
|
||||
{
|
||||
}
|
||||
|
||||
BOOL LLParcelSelection::getMultipleOwners() const
|
||||
{
|
||||
return mSelectedMultipleOwners;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLParcelSelection::getWholeParcelSelected() const
|
||||
{
|
||||
return mWholeParcelSelected;
|
||||
}
|
||||
|
||||
|
||||
S32 LLParcelSelection::getClaimableArea() const
|
||||
{
|
||||
const S32 UNIT_AREA = S32( PARCEL_GRID_STEP_METERS * PARCEL_GRID_STEP_METERS );
|
||||
return mSelectedPublicCount * UNIT_AREA;
|
||||
}
|
||||
|
||||
bool LLParcelSelection::hasOthersSelected() const
|
||||
{
|
||||
return mSelectedOtherCount != 0;
|
||||
}
|
||||
|
||||
// static
|
||||
LLParcelSelection* LLParcelSelection::getNullParcelSelection()
|
||||
{
|
||||
if (sNullSelection.isNull())
|
||||
{
|
||||
sNullSelection = new LLParcelSelection;
|
||||
}
|
||||
|
||||
return sNullSelection;
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
/**
|
||||
* @file llparcelselection.h
|
||||
* @brief Information about the currently selected parcel
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
#ifndef LLPARCELSELECTION_H
|
||||
#define LLPARCELSELECTION_H
|
||||
|
||||
#include "llmemory.h"
|
||||
|
||||
class LLParcel;
|
||||
|
||||
class LLParcelSelection : public LLRefCount
|
||||
{
|
||||
friend class LLViewerParcelMgr;
|
||||
|
||||
protected:
|
||||
~LLParcelSelection();
|
||||
|
||||
public:
|
||||
LLParcelSelection(LLParcel* parcel);
|
||||
LLParcelSelection();
|
||||
|
||||
// this can return NULL at any time, as parcel selection
|
||||
// might have been invalidated.
|
||||
LLParcel* getParcel() { return mParcel; }
|
||||
|
||||
// Return the number of grid units that are owned by you within
|
||||
// the selection (computed by server).
|
||||
S32 getSelfCount() const { return mSelectedSelfCount; }
|
||||
|
||||
// Returns area that will actually be claimed in meters squared.
|
||||
S32 getClaimableArea() const;
|
||||
bool hasOthersSelected() const;
|
||||
|
||||
// Does the selection have multiple land owners in it?
|
||||
BOOL getMultipleOwners() const;
|
||||
|
||||
// Is the entire parcel selected, or just a part?
|
||||
BOOL getWholeParcelSelected() const;
|
||||
|
||||
static LLParcelSelection* getNullParcelSelection();
|
||||
|
||||
private:
|
||||
void setParcel(LLParcel* parcel) { mParcel = parcel; }
|
||||
|
||||
private:
|
||||
LLParcel* mParcel;
|
||||
BOOL mSelectedMultipleOwners;
|
||||
BOOL mWholeParcelSelected;
|
||||
S32 mSelectedSelfCount;
|
||||
S32 mSelectedOtherCount;
|
||||
S32 mSelectedPublicCount;
|
||||
|
||||
static LLPointer<LLParcelSelection> sNullSelection;
|
||||
};
|
||||
|
||||
typedef LLHandle<LLParcelSelection> LLParcelSelectionHandle;
|
||||
|
||||
#endif
|
||||
|
|
@ -471,14 +471,12 @@ void LLScriptEdCore::updateDynamicHelp(BOOL immediate)
|
|||
LLFloater* help_floater = LLFloater::getFloaterByHandle(mLiveHelpHandle);
|
||||
if (!help_floater) return;
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
// update back and forward buttons
|
||||
LLButton* fwd_button = LLUICtrlFactory::getButtonByName(help_floater, "fwd_btn");
|
||||
LLButton* back_button = LLUICtrlFactory::getButtonByName(help_floater, "back_btn");
|
||||
LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(help_floater, "lsl_guide_html");
|
||||
back_button->setEnabled(browser->canNavigateBack());
|
||||
fwd_button->setEnabled(browser->canNavigateForward());
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
|
||||
if (!immediate && !gSavedSettings.getBOOL("ScriptHelpFollowsCursor"))
|
||||
{
|
||||
|
|
@ -546,9 +544,9 @@ void LLScriptEdCore::setHelpPage(const LLString& help_string)
|
|||
url_string.setArg("[LSL_STRING]", help_string);
|
||||
|
||||
addHelpItemToHistory(help_string);
|
||||
#if LL_LIBXUL_ENABLED
|
||||
|
||||
web_browser->navigateTo(url_string);
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
|
||||
}
|
||||
|
||||
void LLScriptEdCore::addHelpItemToHistory(const LLString& help_string)
|
||||
|
|
@ -680,10 +678,8 @@ void LLScriptEdCore::onBtnDynamicHelp(void* userdata)
|
|||
live_help_floater->childSetAction("back_btn", onClickBack, userdata);
|
||||
live_help_floater->childSetAction("fwd_btn", onClickForward, userdata);
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLWebBrowserCtrl* browser = LLUICtrlFactory::getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html");
|
||||
browser->setAlwaysRefresh(TRUE);
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
|
||||
LLComboBox* help_combo = LLUICtrlFactory::getComboBoxByName(live_help_floater, "history_combo");
|
||||
LLKeywordToken *token;
|
||||
|
|
@ -707,7 +703,6 @@ void LLScriptEdCore::onBtnDynamicHelp(void* userdata)
|
|||
//static
|
||||
void LLScriptEdCore::onClickBack(void* userdata)
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLScriptEdCore* corep = (LLScriptEdCore*)userdata;
|
||||
LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle);
|
||||
if (live_help_floater)
|
||||
|
|
@ -718,13 +713,11 @@ void LLScriptEdCore::onClickBack(void* userdata)
|
|||
browserp->navigateBack();
|
||||
}
|
||||
}
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
}
|
||||
|
||||
//static
|
||||
void LLScriptEdCore::onClickForward(void* userdata)
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLScriptEdCore* corep = (LLScriptEdCore*)userdata;
|
||||
LLFloater* live_help_floater = LLFloater::getFloaterByHandle(corep->mLiveHelpHandle);
|
||||
if (live_help_floater)
|
||||
|
|
@ -735,7 +728,6 @@ void LLScriptEdCore::onClickForward(void* userdata)
|
|||
browserp->navigateForward();
|
||||
}
|
||||
}
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
@ -772,13 +764,11 @@ void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata)
|
|||
|
||||
corep->addHelpItemToHistory(help_string);
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
LLWebBrowserCtrl* web_browser = gUICtrlFactory->getWebBrowserCtrlByName(live_help_floater, "lsl_guide_html");
|
||||
LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
|
||||
url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
|
||||
url_string.setArg("[LSL_STRING]", help_string);
|
||||
web_browser->navigateTo(url_string);
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -134,6 +134,7 @@
|
|||
#include "llui.h"
|
||||
#include "llurldispatcher.h"
|
||||
#include "llurlsimstring.h"
|
||||
#include "llurlhistory.h"
|
||||
#include "llurlwhitelist.h"
|
||||
#include "lluserauth.h"
|
||||
#include "llvieweraudio.h"
|
||||
|
|
@ -143,10 +144,12 @@
|
|||
#include "llviewergenericmessage.h"
|
||||
#include "llviewergesture.h"
|
||||
#include "llviewerimagelist.h"
|
||||
#include "llviewermedia.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewermessage.h"
|
||||
#include "llviewernetwork.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerparcelmedia.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerstats.h"
|
||||
|
|
@ -160,7 +163,6 @@
|
|||
#include "llxfermanager.h"
|
||||
#include "pipeline.h"
|
||||
#include "llappviewer.h"
|
||||
#include "llmediaengine.h"
|
||||
#include "llfasttimerview.h"
|
||||
#include "llfloatermap.h"
|
||||
#include "llweb.h"
|
||||
|
|
@ -169,27 +171,11 @@
|
|||
#include "llnamebox.h"
|
||||
#include "llnameeditor.h"
|
||||
|
||||
#if LL_LIBXUL_ENABLED
|
||||
#include "llmozlib.h"
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
|
||||
#if LL_WINDOWS
|
||||
#include "llwindebug.h"
|
||||
#include "lldxhardware.h"
|
||||
#endif
|
||||
|
||||
#if LL_QUICKTIME_ENABLED
|
||||
#if LL_DARWIN
|
||||
#include <QuickTime/QuickTime.h>
|
||||
#else
|
||||
// quicktime specific includes
|
||||
#include "MacTypes.h"
|
||||
#include "QTML.h"
|
||||
#include "Movies.h"
|
||||
#include "FixMath.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//
|
||||
// exported globals
|
||||
//
|
||||
|
|
@ -213,8 +199,6 @@ LLPointer<LLImageGL> gStartImageGL;
|
|||
static LLHost gAgentSimHost;
|
||||
static BOOL gSkipOptionalUpdate = FALSE;
|
||||
|
||||
bool gUseQuickTime = true;
|
||||
bool gQuickTimeInitialized = false;
|
||||
static bool gGotUseCircuitCodeAck = false;
|
||||
LLString gInitialOutfit;
|
||||
LLString gInitialOutfitGender; // "male" or "female"
|
||||
|
|
@ -545,59 +529,7 @@ BOOL idle_startup()
|
|||
// initialize the economy
|
||||
gGlobalEconomy = new LLGlobalEconomy();
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// LibXUL (Mozilla) initialization
|
||||
//---------------------------------------------------------------------
|
||||
#if LL_LIBXUL_ENABLED
|
||||
set_startup_status(0.58f, "Initializing embedded web browser...", gAgent.mMOTD.c_str());
|
||||
display_startup();
|
||||
llinfos << "Initializing embedded web browser..." << llendl;
|
||||
|
||||
#if LL_DARWIN
|
||||
// For Mac OS, we store both the shared libraries and the runtime files (chrome/, plugins/, etc) in
|
||||
// Second Life.app/Contents/MacOS/. This matches the way Firefox is distributed on the Mac.
|
||||
std::string componentDir(gDirUtilp->getExecutableDir());
|
||||
#elif LL_WINDOWS
|
||||
std::string componentDir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
|
||||
componentDir += gDirUtilp->getDirDelimiter();
|
||||
#ifdef LL_DEBUG
|
||||
componentDir += "mozilla_debug";
|
||||
#else
|
||||
componentDir += "mozilla";
|
||||
#endif
|
||||
#elif LL_LINUX
|
||||
std::string componentDir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
|
||||
componentDir += gDirUtilp->getDirDelimiter();
|
||||
componentDir += "mozilla-runtime-linux-i686";
|
||||
#else
|
||||
std::string componentDir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
|
||||
componentDir += gDirUtilp->getDirDelimiter();
|
||||
componentDir += "mozilla";
|
||||
#endif
|
||||
|
||||
#if LL_LINUX
|
||||
// Yuck, Mozilla init plays with the locale - push/pop
|
||||
// the locale to protect it, as exotic/non-C locales
|
||||
// causes our code lots of general critical weirdness
|
||||
// and crashness. (SL-35450)
|
||||
std::string saved_locale = setlocale(LC_ALL, NULL);
|
||||
#endif // LL_LINUX
|
||||
|
||||
// initialize Mozilla - pass in executable dir, location of extra dirs (chrome/, greprefs/, plugins/ etc.) and path to profile dir)
|
||||
LLMozLib::getInstance()->init( gDirUtilp->getExecutableDir(), componentDir, gDirUtilp->getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) );
|
||||
|
||||
#if LL_LINUX
|
||||
setlocale(LC_ALL, saved_locale.c_str() );
|
||||
#endif // LL_LINUX
|
||||
|
||||
std::ostringstream codec;
|
||||
codec << "[Second Life ";
|
||||
codec << "(" << gChannelName << ")";
|
||||
codec << " - " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
|
||||
codec << "]";
|
||||
LLMozLib::getInstance()->setBrowserAgentId( codec.str() );
|
||||
LLMozLib::getInstance()->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort") );
|
||||
#endif
|
||||
|
||||
//-------------------------------------------------
|
||||
// Init audio, which may be needed for prefs dialog
|
||||
|
|
@ -694,7 +626,29 @@ BOOL idle_startup()
|
|||
show_connect_box = TRUE;
|
||||
}
|
||||
|
||||
|
||||
// Go to the next startup state
|
||||
LLStartUp::setStartupState( STATE_MEDIA_INIT );
|
||||
return do_normal_idle;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// LLMediaEngine Init
|
||||
//---------------------------------------------------------------------
|
||||
if (STATE_MEDIA_INIT == LLStartUp::getStartupState())
|
||||
{
|
||||
llinfos << "Initializing Multimedia...." << llendl;
|
||||
set_startup_status(0.03f, "Initializing Multimedia...", gAgent.mMOTD.c_str());
|
||||
display_startup();
|
||||
LLViewerMedia::initClass();
|
||||
LLViewerParcelMedia::initClass();
|
||||
|
||||
if (gViewerWindow)
|
||||
{
|
||||
audio_update_volume(true);
|
||||
}
|
||||
|
||||
LLStartUp::setStartupState( STATE_LOGIN_SHOW );
|
||||
return do_normal_idle;
|
||||
}
|
||||
|
|
@ -892,6 +846,9 @@ BOOL idle_startup()
|
|||
&LLURLDispatcher::dispatchFromTextEditor,
|
||||
&LLURLDispatcher::dispatchFromTextEditor );
|
||||
|
||||
// Load URL History File
|
||||
LLURLHistory::loadFile("url_history.xml");
|
||||
|
||||
//-------------------------------------------------
|
||||
// Handle startup progress screen
|
||||
//-------------------------------------------------
|
||||
|
|
@ -934,7 +891,7 @@ BOOL idle_startup()
|
|||
|
||||
// Poke the VFS, which could potentially block for a while if
|
||||
// Windows XP is acting up
|
||||
set_startup_status(0.05f, "Verifying cache files (can take 60-90 seconds)...", NULL);
|
||||
set_startup_status(0.07f, "Verifying cache files (can take 60-90 seconds)...", NULL);
|
||||
display_startup();
|
||||
|
||||
gVFS->pokeFiles();
|
||||
|
|
@ -1774,7 +1731,7 @@ BOOL idle_startup()
|
|||
display_startup();
|
||||
gImageList.decodeAllImages(1.f);
|
||||
}
|
||||
LLStartUp::setStartupState( STATE_QUICKTIME_INIT );
|
||||
LLStartUp::setStartupState( STATE_WORLD_WAIT );
|
||||
|
||||
// JC - Do this as late as possible to increase likelihood Purify
|
||||
// will run.
|
||||
|
|
@ -1808,79 +1765,8 @@ BOOL idle_startup()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// LLMediaEngine Init
|
||||
//---------------------------------------------------------------------
|
||||
if (STATE_QUICKTIME_INIT == LLStartUp::getStartupState())
|
||||
{
|
||||
if (gViewerWindow)
|
||||
{
|
||||
audio_update_volume(true);
|
||||
}
|
||||
|
||||
#if LL_QUICKTIME_ENABLED // windows only right now but will be ported to mac
|
||||
if (gUseQuickTime)
|
||||
{
|
||||
if(!gQuickTimeInitialized)
|
||||
{
|
||||
// initialize quicktime libraries (fails gracefully if quicktime not installed ($QUICKTIME)
|
||||
llinfos << "Initializing QuickTime...." << llendl;
|
||||
set_startup_status(0.57f, "Initializing QuickTime...", gAgent.mMOTD.c_str());
|
||||
display_startup();
|
||||
#if LL_WINDOWS
|
||||
// Only necessary/available on Windows.
|
||||
if ( InitializeQTML ( 0L ) != noErr )
|
||||
{
|
||||
// quicktime init failed - turn off media engine support
|
||||
LLMediaEngine::getInstance ()->setAvailable ( FALSE );
|
||||
llinfos << "...not found - unable to initialize." << llendl;
|
||||
set_startup_status(0.57f, "QuickTime not found - unable to initialize.", gAgent.mMOTD.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "QUICKTIME> QuickTime version (hex) is " << std::hex << LLMediaEngine::getInstance()->getQuickTimeVersion() << llendl;
|
||||
llinfos << "QUICKTIME> QuickTime version is " << std::dec << LLMediaEngine::getInstance()->getQuickTimeVersion() << llendl;
|
||||
if ( LLMediaEngine::getInstance()->getQuickTimeVersion() < LL_MIN_QUICKTIME_VERSION )
|
||||
{
|
||||
// turn off QuickTime if version is less than required
|
||||
LLMediaEngine::getInstance ()->setAvailable ( FALSE );
|
||||
|
||||
// display a message here explaining why we disabled QuickTime
|
||||
gViewerWindow->alertXml("QuickTimeOutOfDate");
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << ".. initialized successfully." << llendl;
|
||||
set_startup_status(0.57f, "QuickTime initialized successfully.", gAgent.mMOTD.c_str());
|
||||
};
|
||||
};
|
||||
#elif LL_DARWIN
|
||||
llinfos << "QUICKTIME> QuickTime version (hex) is " << std::hex << LLMediaEngine::getInstance()->getQuickTimeVersion() << llendl;
|
||||
llinfos << "QUICKTIME> QuickTime version is " << std::dec << LLMediaEngine::getInstance()->getQuickTimeVersion() << llendl;
|
||||
if ( LLMediaEngine::getInstance()->getQuickTimeVersion() < LL_MIN_QUICKTIME_VERSION )
|
||||
{
|
||||
// turn off QuickTime if version is less than required
|
||||
LLMediaEngine::getInstance ()->setAvailable ( FALSE );
|
||||
|
||||
// display a message here explaining why we disabled QuickTime
|
||||
gViewerWindow->alertXml("QuickTimeOutOfDate");
|
||||
}
|
||||
#endif
|
||||
|
||||
EnterMovies ();
|
||||
gQuickTimeInitialized = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMediaEngine::getInstance()->setAvailable( FALSE );
|
||||
}
|
||||
#endif
|
||||
|
||||
LLStartUp::setStartupState( STATE_WORLD_WAIT );
|
||||
return do_normal_idle;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Agent Send
|
||||
//---------------------------------------------------------------------
|
||||
if(STATE_WORLD_WAIT == LLStartUp::getStartupState())
|
||||
|
|
@ -3126,18 +3012,6 @@ void register_viewer_callbacks(LLMessageSystem* msg)
|
|||
|
||||
msg->setHandlerFunc("ParcelObjectOwnersReply", LLPanelLandObjects::processParcelObjectOwnersReply);
|
||||
|
||||
// Reponse to the "Refresh" button on land objects floater.
|
||||
if (gSavedSettings.getBOOL("AudioStreamingVideo"))
|
||||
{
|
||||
msg->setHandlerFunc("ParcelMediaCommandMessage", LLMediaEngine::process_parcel_media);
|
||||
msg->setHandlerFunc ( "ParcelMediaUpdate", LLMediaEngine::process_parcel_media_update );
|
||||
}
|
||||
else
|
||||
{
|
||||
msg->setHandlerFunc("ParcelMediaCommandMessage", null_message_callback);
|
||||
gMessageSystem->setHandlerFunc ( "ParcelMediaUpdate", null_message_callback );
|
||||
}
|
||||
|
||||
msg->setHandlerFunc("InitiateDownload", process_initiate_download);
|
||||
msg->setHandlerFunc("LandStatReply", LLFloaterTopObjects::handle_land_reply);
|
||||
msg->setHandlerFunc("GenericMessage", process_generic_message);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ extern const char* SCREEN_LAST_FILENAME;
|
|||
|
||||
enum EStartupState{
|
||||
STATE_FIRST, // Initial startup
|
||||
STATE_MEDIA_INIT, // Initialzie media library
|
||||
STATE_LOGIN_SHOW, // Show login screen
|
||||
STATE_LOGIN_WAIT, // Wait for user input at login screen
|
||||
STATE_LOGIN_CLEANUP, // Get rid of login screen and start login
|
||||
|
|
@ -58,7 +59,6 @@ enum EStartupState{
|
|||
STATE_WORLD_INIT, // Start building the world
|
||||
STATE_SEED_GRANTED_WAIT, // Wait for seed cap grant
|
||||
STATE_SEED_CAP_GRANTED, // Have seed cap grant
|
||||
STATE_QUICKTIME_INIT, // Initialzie QT
|
||||
STATE_WORLD_WAIT, // Waiting for simulator
|
||||
STATE_AGENT_SEND, // Connect to a region
|
||||
STATE_AGENT_WAIT, // Wait for region
|
||||
|
|
@ -72,8 +72,6 @@ enum EStartupState{
|
|||
|
||||
// exported symbols
|
||||
extern BOOL gAgentMovementCompleted;
|
||||
extern bool gUseQuickTime;
|
||||
extern bool gQuickTimeInitialized;
|
||||
extern LLPointer<LLImageGL> gStartImageGL;
|
||||
|
||||
class LLStartUp
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@
|
|||
#include "llfloaterbuycurrency.h"
|
||||
#include "llfloaterchat.h"
|
||||
#include "llfloaterdirectory.h" // to spawn search
|
||||
#include "llfloaterlagmeter.h"
|
||||
#include "llfloaterland.h"
|
||||
#include "llfloaterregioninfo.h"
|
||||
#include "llfloaterscriptdebug.h"
|
||||
|
|
@ -163,8 +164,49 @@ LLStatusBar::LLStatusBar(const std::string& name, const LLRect& rect)
|
|||
childSetCommitCallback("search_editor", onCommitSearch, this);
|
||||
childSetAction("search_btn", onClickSearch, this);
|
||||
|
||||
childSetVisible("search_editor", gSavedSettings.getBOOL("ShowSearchBar"));
|
||||
childSetVisible("search_btn", gSavedSettings.getBOOL("ShowSearchBar"));
|
||||
|
||||
childSetActionTextbox("ParcelNameText", onClickParcelInfo );
|
||||
childSetActionTextbox("BalanceText", onClickBalance );
|
||||
|
||||
// Adding Net Stat Graph
|
||||
S32 x = mRect.getWidth() - 2;
|
||||
S32 y = 0;
|
||||
LLRect r;
|
||||
r.set( x-SIM_STAT_WIDTH, y+MENU_BAR_HEIGHT-1, x, y+1);
|
||||
mSGBandwidth = new LLStatGraph("BandwidthGraph", r);
|
||||
mSGBandwidth->setFollows(FOLLOWS_BOTTOM | FOLLOWS_RIGHT);
|
||||
mSGBandwidth->setStat(&gViewerStats->mKBitStat);
|
||||
LLString text = childGetText("bandwidth_tooltip") + " ";
|
||||
LLUIString bandwidth_tooltip = text; // get the text from XML until this widget is XML driven
|
||||
mSGBandwidth->setLabel(bandwidth_tooltip.getString().c_str());
|
||||
mSGBandwidth->setUnits("Kbps");
|
||||
mSGBandwidth->setPrecision(0);
|
||||
mSGBandwidth->setMouseOpaque(FALSE);
|
||||
addChild(mSGBandwidth);
|
||||
x -= SIM_STAT_WIDTH + 2;
|
||||
|
||||
r.set( x-SIM_STAT_WIDTH, y+MENU_BAR_HEIGHT-1, x, y+1);
|
||||
mSGPacketLoss = new LLStatGraph("PacketLossPercent", r);
|
||||
mSGPacketLoss->setFollows(FOLLOWS_BOTTOM | FOLLOWS_RIGHT);
|
||||
mSGPacketLoss->setStat(&gViewerStats->mPacketsLostPercentStat);
|
||||
text = childGetText("packet_loss_tooltip") + " ";
|
||||
LLUIString packet_loss_tooltip = text; // get the text from XML until this widget is XML driven
|
||||
mSGPacketLoss->setLabel(packet_loss_tooltip.getString().c_str());
|
||||
mSGPacketLoss->setUnits("%");
|
||||
mSGPacketLoss->setMin(0.f);
|
||||
mSGPacketLoss->setMax(5.f);
|
||||
mSGPacketLoss->setThreshold(0, 0.5f);
|
||||
mSGPacketLoss->setThreshold(1, 1.f);
|
||||
mSGPacketLoss->setThreshold(2, 3.f);
|
||||
mSGPacketLoss->setPrecision(1);
|
||||
mSGPacketLoss->setMouseOpaque(FALSE);
|
||||
mSGPacketLoss->mPerSec = FALSE;
|
||||
addChild(mSGPacketLoss);
|
||||
|
||||
childSetActionTextbox("stat_btn", onClickStatGraph);
|
||||
|
||||
}
|
||||
|
||||
LLStatusBar::~LLStatusBar()
|
||||
|
|
@ -212,6 +254,14 @@ void LLStatusBar::draw()
|
|||
// Per-frame updates of visibility
|
||||
void LLStatusBar::refresh()
|
||||
{
|
||||
// Adding Net Stat Meter back in
|
||||
F32 bwtotal = gViewerThrottle.getMaxBandwidth() / 1000.f;
|
||||
mSGBandwidth->setMin(0.f);
|
||||
mSGBandwidth->setMax(bwtotal*1.25f);
|
||||
mSGBandwidth->setThreshold(0, bwtotal*0.75f);
|
||||
mSGBandwidth->setThreshold(1, bwtotal);
|
||||
mSGBandwidth->setThreshold(2, bwtotal);
|
||||
|
||||
// *TODO: Localize / translate time
|
||||
|
||||
// Get current UTC time, adjusted for the user's clock
|
||||
|
|
@ -262,6 +312,8 @@ void LLStatusBar::refresh()
|
|||
S32 x = MENU_RIGHT + MENU_PARCEL_SPACING;
|
||||
S32 y = 0;
|
||||
|
||||
bool search_visible = gSavedSettings.getBOOL("ShowSearchBar");
|
||||
|
||||
// reshape menu bar to its content's width
|
||||
if (MENU_RIGHT != gMenuBarView->getRect().getWidth())
|
||||
{
|
||||
|
|
@ -534,14 +586,69 @@ void LLStatusBar::refresh()
|
|||
snprintf(mRegionDetails.mOwner, MAX_STRING, "Unknown");
|
||||
mRegionDetails.mTraffic = 0.0f;
|
||||
}
|
||||
|
||||
mTextParcelName->setText(location_name);
|
||||
|
||||
|
||||
|
||||
// x = right edge
|
||||
// loop through: stat graphs, search btn, search text editor, money, buy money, clock
|
||||
// adjust rect
|
||||
// finally adjust parcel name rect
|
||||
|
||||
S32 new_right = getRect().getWidth();
|
||||
if (search_visible)
|
||||
{
|
||||
childGetRect("search_btn", r);
|
||||
r.translate( new_right - r.mRight, 0);
|
||||
childSetRect("search_btn", r);
|
||||
new_right -= r.getWidth();
|
||||
|
||||
childGetRect("search_editor", r);
|
||||
r.translate( new_right - r.mRight, 0);
|
||||
childSetRect("search_editor", r);
|
||||
new_right -= r.getWidth() + 6;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
childGetRect("stat_btn", r);
|
||||
r.translate( new_right - r.mRight, 0);
|
||||
childSetRect("stat_btn", r);
|
||||
new_right -= r.getWidth() + 6;
|
||||
}
|
||||
|
||||
// Set rects of money, buy money, time
|
||||
childGetRect("BalanceText", r);
|
||||
r.translate( new_right - r.mRight, 0);
|
||||
childSetRect("BalanceText", r);
|
||||
new_right -= r.getWidth() - 18;
|
||||
|
||||
childGetRect("buycurrency", r);
|
||||
r.translate( new_right - r.mRight, 0);
|
||||
childSetRect("buycurrency", r);
|
||||
new_right -= r.getWidth() + 6;
|
||||
|
||||
childGetRect("TimeText", r);
|
||||
// mTextTime->getTextPixelWidth();
|
||||
r.translate( new_right - r.mRight, 0);
|
||||
childSetRect("TimeText", r);
|
||||
// new_right -= r.getWidth() + MENU_PARCEL_SPACING;
|
||||
|
||||
|
||||
// Adjust region name and parcel name
|
||||
x += 8;
|
||||
|
||||
const S32 PARCEL_RIGHT = llmin(mTextTime->getRect().mLeft, mTextParcelName->getTextPixelWidth() + x + 5);
|
||||
r.set(x+4, mRect.getHeight() - 2, PARCEL_RIGHT, 0);
|
||||
mTextParcelName->setRect(r);
|
||||
|
||||
// Set search bar visibility
|
||||
childSetVisible("search_editor", search_visible);
|
||||
childSetVisible("search_btn", search_visible);
|
||||
mSGBandwidth->setVisible(! search_visible);
|
||||
mSGPacketLoss->setVisible(! search_visible);
|
||||
childSetEnabled("stat_btn", ! search_visible);
|
||||
}
|
||||
|
||||
void LLStatusBar::setVisibleForMouselook(bool visible)
|
||||
|
|
@ -551,6 +658,8 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
|
|||
childSetVisible("buycurrency", visible);
|
||||
childSetVisible("search_editor", visible);
|
||||
childSetVisible("search_btn", visible);
|
||||
mSGBandwidth->setVisible(visible);
|
||||
mSGPacketLoss->setVisible(visible);
|
||||
setBackgroundVisible(visible);
|
||||
}
|
||||
|
||||
|
|
@ -662,7 +771,7 @@ static void onClickParcelInfo(void* data)
|
|||
{
|
||||
gParcelMgr->selectParcelAt(gAgent.getPositionGlobal());
|
||||
|
||||
LLFloaterLand::show();
|
||||
LLFloaterLand::showInstance();
|
||||
}
|
||||
|
||||
static void onClickBalance(void* data)
|
||||
|
|
@ -806,6 +915,12 @@ void LLStatusBar::onClickSearch(void* data)
|
|||
LLFloaterDirectory::showFindAll(search_text);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLStatusBar::onClickStatGraph(void* data)
|
||||
{
|
||||
LLFloaterLagMeter::show(data);
|
||||
}
|
||||
|
||||
BOOL can_afford_transaction(S32 cost)
|
||||
{
|
||||
return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ private:
|
|||
|
||||
static void onCommitSearch(LLUICtrl*, void* data);
|
||||
static void onClickSearch(void* data);
|
||||
static void onClickStatGraph(void* data);
|
||||
|
||||
private:
|
||||
LLTextBox *mTextBalance;
|
||||
|
|
@ -128,6 +129,9 @@ private:
|
|||
|
||||
LLTextBox* mTextParcelName;
|
||||
|
||||
LLStatGraph *mSGBandwidth;
|
||||
LLStatGraph *mSGPacketLoss;
|
||||
|
||||
LLButton *mBtnBuyCurrency;
|
||||
|
||||
S32 mBalance;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#include "indra_constants.h"
|
||||
#include "llclickaction.h"
|
||||
#include "llmediabase.h" // for status codes
|
||||
#include "llparcel.h"
|
||||
|
||||
#include "llagent.h"
|
||||
|
|
@ -54,14 +55,17 @@
|
|||
#include "lltoolmgr.h"
|
||||
#include "lltoolselect.h"
|
||||
#include "llviewercamera.h"
|
||||
#include "llviewerparcelmedia.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llviewermedia.h"
|
||||
#include "llvoavatar.h"
|
||||
#include "llworld.h"
|
||||
#include "llui.h"
|
||||
#include "llweb.h"
|
||||
|
||||
LLToolPie *gToolPie = NULL;
|
||||
|
||||
|
|
@ -73,6 +77,11 @@ extern void handle_buy(void*);
|
|||
|
||||
extern BOOL gDebugClicks;
|
||||
|
||||
static void handle_click_action_play();
|
||||
static void handle_click_action_open_media(LLPointer<LLViewerObject> objectp);
|
||||
static ECursorType cursor_from_parcel_media(U8 click_action);
|
||||
|
||||
|
||||
LLToolPie::LLToolPie()
|
||||
: LLTool("Select"),
|
||||
mPieMouseButtonDown( FALSE ),
|
||||
|
|
@ -87,6 +96,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
{
|
||||
if (!gCamera) return FALSE;
|
||||
|
||||
gPickFaces = TRUE;
|
||||
//left mouse down always picks transparent
|
||||
gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback,
|
||||
TRUE, TRUE);
|
||||
|
|
@ -137,7 +147,7 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)
|
|||
else
|
||||
{
|
||||
// not selling passes, get info
|
||||
LLFloaterLand::show();
|
||||
LLFloaterLand::showInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -211,6 +221,13 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)
|
|||
sLeftClickSelection = LLToolSelect::handleObjectSelection(parent, MASK_NONE, FALSE, TRUE);
|
||||
}
|
||||
return TRUE;
|
||||
case CLICK_ACTION_PLAY:
|
||||
handle_click_action_play();
|
||||
return TRUE;
|
||||
case CLICK_ACTION_OPEN_MEDIA:
|
||||
// sClickActionObject = object;
|
||||
handle_click_action_open_media(object);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -411,6 +428,47 @@ U8 final_click_action(LLViewerObject* obj)
|
|||
return click_action;
|
||||
}
|
||||
|
||||
ECursorType cursor_from_object(LLViewerObject* object)
|
||||
{
|
||||
LLViewerObject* parent = NULL;
|
||||
if (object)
|
||||
{
|
||||
parent = object->getRootEdit();
|
||||
}
|
||||
U8 click_action = final_click_action(object);
|
||||
ECursorType cursor = UI_CURSOR_ARROW;
|
||||
switch(click_action)
|
||||
{
|
||||
case CLICK_ACTION_SIT:
|
||||
cursor = UI_CURSOR_TOOLSIT;
|
||||
break;
|
||||
case CLICK_ACTION_BUY:
|
||||
cursor = UI_CURSOR_TOOLBUY;
|
||||
break;
|
||||
case CLICK_ACTION_OPEN:
|
||||
// Open always opens the parent.
|
||||
if (parent && parent->allowOpen())
|
||||
{
|
||||
cursor = UI_CURSOR_TOOLOPEN;
|
||||
}
|
||||
break;
|
||||
case CLICK_ACTION_PAY:
|
||||
if ((object && object->flagTakesMoney())
|
||||
|| (parent && parent->flagTakesMoney()))
|
||||
{
|
||||
cursor = UI_CURSOR_TOOLPAY;
|
||||
}
|
||||
break;
|
||||
case CLICK_ACTION_PLAY:
|
||||
case CLICK_ACTION_OPEN_MEDIA:
|
||||
cursor = cursor_from_parcel_media(click_action);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return cursor;
|
||||
}
|
||||
|
||||
// When we get object properties after left-clicking on an object
|
||||
// with left-click = buy, if it's the same object, do the buy.
|
||||
// static
|
||||
|
|
@ -486,28 +544,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
|
|||
|
||||
if (object && useClickAction(FALSE, mask, object, parent))
|
||||
{
|
||||
U8 click_action = final_click_action(object);
|
||||
ECursorType cursor = UI_CURSOR_ARROW;
|
||||
switch(click_action)
|
||||
{
|
||||
default: break;
|
||||
case CLICK_ACTION_SIT: cursor = UI_CURSOR_TOOLSIT; break;
|
||||
case CLICK_ACTION_BUY: cursor = UI_CURSOR_TOOLBUY; break;
|
||||
case CLICK_ACTION_OPEN:
|
||||
// Open always opens the parent.
|
||||
if (parent && parent->allowOpen())
|
||||
{
|
||||
cursor = UI_CURSOR_TOOLOPEN;
|
||||
}
|
||||
break;
|
||||
case CLICK_ACTION_PAY:
|
||||
if ((object && object->flagTakesMoney())
|
||||
|| (parent && parent->flagTakesMoney()))
|
||||
{
|
||||
cursor = UI_CURSOR_TOOLPAY;
|
||||
}
|
||||
break;
|
||||
}
|
||||
ECursorType cursor = cursor_from_object(object);
|
||||
gViewerWindow->getWindow()->setCursor(cursor);
|
||||
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
|
||||
}
|
||||
|
|
@ -677,4 +714,95 @@ void LLToolPie::render()
|
|||
return;
|
||||
}
|
||||
|
||||
static void handle_click_action_play()
|
||||
{
|
||||
LLParcel* parcel = gParcelMgr->getAgentParcel();
|
||||
if (!parcel) return;
|
||||
|
||||
LLMediaBase::EStatus status = LLViewerParcelMedia::getStatus();
|
||||
switch(status)
|
||||
{
|
||||
case LLMediaBase::STATUS_STARTED:
|
||||
LLViewerParcelMedia::pause();
|
||||
break;
|
||||
|
||||
case LLMediaBase::STATUS_PAUSED:
|
||||
LLViewerParcelMedia::start();
|
||||
break;
|
||||
|
||||
default:
|
||||
LLViewerParcelMedia::play(parcel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_click_action_open_media(LLPointer<LLViewerObject> objectp)
|
||||
{
|
||||
//FIXME: how do we handle object in different parcel than us?
|
||||
LLParcel* parcel = gParcelMgr->getAgentParcel();
|
||||
if (!parcel) return;
|
||||
|
||||
// did we hit an object?
|
||||
if (objectp.isNull()) return;
|
||||
|
||||
// did we hit a valid face on the object?
|
||||
if( gLastHitObjectFace < 0 || gLastHitObjectFace >= objectp->getNumTEs() ) return;
|
||||
|
||||
// is media playing on this face?
|
||||
if (!LLViewerMedia::isActiveMediaTexture(objectp->getTE(gLastHitObjectFace)->getID()))
|
||||
{
|
||||
handle_click_action_play();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string media_url = std::string ( parcel->getMediaURL () );
|
||||
std::string media_type = std::string ( parcel->getMediaType() );
|
||||
LLString::trim(media_url);
|
||||
|
||||
// Get the scheme, see if that is handled as well.
|
||||
LLURI uri(media_url);
|
||||
std::string media_scheme = uri.scheme() != "" ? uri.scheme() : "http";
|
||||
|
||||
// HACK: This is directly referencing an impl name. BAD!
|
||||
// This can be removed when we have a truly generic media browser that only
|
||||
// builds an impl based on the type of url it is passed.
|
||||
|
||||
if( LLMediaManager::getInstance()->supportsMediaType( "LLMediaImplLLMozLib", media_scheme, media_type ) )
|
||||
{
|
||||
LLWeb::loadURL(media_url);
|
||||
}
|
||||
}
|
||||
|
||||
static ECursorType cursor_from_parcel_media(U8 click_action)
|
||||
{
|
||||
// HACK: This is directly referencing an impl name. BAD!
|
||||
// This can be removed when we have a truly generic media browser that only
|
||||
// builds an impl based on the type of url it is passed.
|
||||
|
||||
//FIXME: how do we handle object in different parcel than us?
|
||||
ECursorType open_cursor = UI_CURSOR_ARROW;
|
||||
LLParcel* parcel = gParcelMgr->getAgentParcel();
|
||||
if (!parcel) return open_cursor;
|
||||
|
||||
std::string media_url = std::string ( parcel->getMediaURL () );
|
||||
std::string media_type = std::string ( parcel->getMediaType() );
|
||||
LLString::trim(media_url);
|
||||
|
||||
// Get the scheme, see if that is handled as well.
|
||||
LLURI uri(media_url);
|
||||
std::string media_scheme = uri.scheme() != "" ? uri.scheme() : "http";
|
||||
|
||||
if( LLMediaManager::getInstance()->supportsMediaType( "LLMediaImplLLMozLib", media_scheme, media_type ) )
|
||||
{
|
||||
open_cursor = UI_CURSOR_TOOLMEDIAOPEN;
|
||||
}
|
||||
|
||||
LLMediaBase::EStatus status = LLViewerParcelMedia::getStatus();
|
||||
switch(status)
|
||||
{
|
||||
case LLMediaBase::STATUS_STARTED:
|
||||
return click_action == CLICK_ACTION_PLAY ? UI_CURSOR_TOOLPAUSE : open_cursor;
|
||||
default:
|
||||
return UI_CURSOR_TOOLPLAY;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#include "llfloaterdirectory.h"
|
||||
#include "llfloaterhtml.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "llfloaterhtmlhelp.h"
|
||||
#include "llpanellogin.h"
|
||||
#include "llstartup.h" // gStartupState
|
||||
#include "llurlsimstring.h"
|
||||
|
|
@ -159,9 +160,7 @@ bool LLURLDispatcherImpl::dispatchHelp(const std::string& url, BOOL right_mouse)
|
|||
{
|
||||
if (matchPrefix(url, SLURL_SL_HELP_PREFIX))
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
gViewerHtmlHelp.show();
|
||||
#endif // LL_LIBXUL_ENABLED
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,110 @@
|
|||
/**
|
||||
* @file llurlhistory.cpp
|
||||
* @author Sam Kolb
|
||||
* @brief Manages a list of recent URLs
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llurlhistory.h"
|
||||
|
||||
#include "lldir.h"
|
||||
#include "llsdserialize.h"
|
||||
|
||||
LLSD LLURLHistory::sHistorySD;
|
||||
|
||||
const int MAX_URL_COUNT = 10;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// static
|
||||
bool LLURLHistory::loadFile(const LLString& filename)
|
||||
{
|
||||
LLSD data;
|
||||
{
|
||||
LLString temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter();
|
||||
|
||||
llifstream file((temp_str + filename).c_str());
|
||||
|
||||
if (file.is_open())
|
||||
{
|
||||
llinfos << "Loading history.xml file at " << filename << llendl;
|
||||
LLSDSerialize::fromXML(data, file);
|
||||
}
|
||||
|
||||
if (data.isUndefined())
|
||||
{
|
||||
llinfos << "file missing, ill-formed, "
|
||||
"or simply undefined; not changing the"
|
||||
" file" << llendl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
sHistorySD = data;
|
||||
return true;
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLURLHistory::saveFile(const LLString& filename)
|
||||
{
|
||||
LLString temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter();
|
||||
llofstream out((temp_str + filename).c_str());
|
||||
if (!out.good())
|
||||
{
|
||||
llwarns << "Unable to open " << filename << " for output." << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLSDSerialize::toXML(sHistorySD, out);
|
||||
|
||||
out.close();
|
||||
return true;
|
||||
}
|
||||
// static
|
||||
// This function returns a portion of the history llsd that contains the collected
|
||||
// url history
|
||||
LLSD LLURLHistory::getURLHistory(const std::string& collection)
|
||||
{
|
||||
if(sHistorySD.has(collection))
|
||||
{
|
||||
return sHistorySD[collection];
|
||||
}
|
||||
return LLSD();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLURLHistory::addURL(const std::string& collection, const std::string& url)
|
||||
{
|
||||
sHistorySD[collection].insert(0, url);
|
||||
LLURLHistory::limitSize(collection);
|
||||
}
|
||||
// static
|
||||
void LLURLHistory::removeURL(const std::string& collection, const std::string& url)
|
||||
{
|
||||
LLSD::array_iterator iter = sHistorySD[collection].beginArray();
|
||||
LLSD::array_iterator end = sHistorySD[collection].endArray();
|
||||
for(int index = 0; index < sHistorySD[collection].size(); index++)
|
||||
{
|
||||
if(sHistorySD[collection].get(index).asString() == url)
|
||||
{
|
||||
sHistorySD[collection].erase(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLURLHistory::clear(const std::string& collection)
|
||||
{
|
||||
sHistorySD[ collection ] = LLSD();
|
||||
}
|
||||
|
||||
void LLURLHistory::limitSize(const std::string& collection)
|
||||
{
|
||||
while(sHistorySD[collection].size() > MAX_URL_COUNT)
|
||||
{
|
||||
sHistorySD[collection].erase(MAX_URL_COUNT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
/**
|
||||
* @file llurlhistory.h
|
||||
* @author Sam Kolb
|
||||
* @brief Manages a list of recent URLs
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#ifndef LLURLHISTORY_H
|
||||
#define LLURLHISTORY_H
|
||||
|
||||
#include "llstring.h"
|
||||
|
||||
class LLSD;
|
||||
|
||||
class LLURLHistory
|
||||
{
|
||||
public:
|
||||
// Loads an xml file of URLs. Currently only supports Parcel URL history
|
||||
static bool loadFile(const LLString& filename);
|
||||
|
||||
// Saves the current history to XML
|
||||
static bool saveFile(const LLString& filename);
|
||||
|
||||
static LLSD getURLHistory(const std::string& collection);
|
||||
|
||||
static void addURL(const std::string& collection, const std::string& url);
|
||||
static void removeURL(const std::string& collection, const std::string& url);
|
||||
static void clear(const std::string& collection);
|
||||
|
||||
static void limitSize(const std::string& collection);
|
||||
|
||||
private:
|
||||
static LLSD sHistorySD;
|
||||
};
|
||||
|
||||
#endif // LLURLHISTORY_H
|
||||
|
|
@ -35,12 +35,12 @@
|
|||
#include "audiosettings.h"
|
||||
#include "llagent.h"
|
||||
#include "llappviewer.h"
|
||||
#include "llmediaengine.h"
|
||||
#include "llvieweraudio.h"
|
||||
#include "llviewercamera.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llvoiceclient.h"
|
||||
#include "llviewermedia.h"
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
|
||||
|
|
@ -153,13 +153,10 @@ void audio_update_volume(bool force_update)
|
|||
}
|
||||
|
||||
// Streaming Media
|
||||
if(LLMediaEngine::getInstance())
|
||||
{
|
||||
F32 media_volume = gSavedSettings.getF32("AudioLevelMedia");
|
||||
media_volume = mute_volume * master_volume * (media_volume*media_volume);
|
||||
BOOL media_muted = gSavedSettings.getBOOL("MuteMedia");
|
||||
LLMediaEngine::getInstance()->setVolume(media_muted ? 0.f : media_volume);
|
||||
}
|
||||
F32 media_volume = gSavedSettings.getF32("AudioLevelMedia");
|
||||
BOOL media_muted = gSavedSettings.getBOOL("MuteMedia");
|
||||
media_volume = mute_volume * master_volume * (media_volume*media_volume);
|
||||
LLViewerMedia::setVolume( media_muted ? 0.0f : media_volume );
|
||||
|
||||
// Voice
|
||||
if (gVoiceClient)
|
||||
|
|
|
|||
|
|
@ -261,7 +261,6 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
spinner4->setVisible(FALSE);
|
||||
color_swatch->setVisible(FALSE);
|
||||
childSetVisible("val_text", FALSE);
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
mComment->setText(LLString::null);
|
||||
|
||||
if (controlp)
|
||||
|
|
@ -299,6 +298,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
case TYPE_U32:
|
||||
spinner1->setVisible(TRUE);
|
||||
spinner1->setLabel(LLString("value")); // Debug, don't translate
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
if (!spinner1->hasFocus())
|
||||
{
|
||||
spinner1->setValue(sd);
|
||||
|
|
@ -311,6 +311,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
case TYPE_S32:
|
||||
spinner1->setVisible(TRUE);
|
||||
spinner1->setLabel(LLString("value")); // Debug, don't translate
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
if (!spinner1->hasFocus())
|
||||
{
|
||||
spinner1->setValue(sd);
|
||||
|
|
@ -323,6 +324,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
case TYPE_F32:
|
||||
spinner1->setVisible(TRUE);
|
||||
spinner1->setLabel(LLString("value")); // Debug, don't translate
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
if (!spinner1->hasFocus())
|
||||
{
|
||||
spinner1->setPrecision(3);
|
||||
|
|
@ -346,6 +348,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
break;
|
||||
case TYPE_STRING:
|
||||
childSetVisible("val_text", TRUE);
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
if (!childHasFocus("val_text"))
|
||||
{
|
||||
childSetValue("val_text", sd);
|
||||
|
|
@ -353,6 +356,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
break;
|
||||
case TYPE_VEC3:
|
||||
{
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
LLVector3 v;
|
||||
v.setValue(sd);
|
||||
spinner1->setVisible(TRUE);
|
||||
|
|
@ -380,6 +384,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
}
|
||||
case TYPE_VEC3D:
|
||||
{
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
LLVector3d v;
|
||||
v.setValue(sd);
|
||||
spinner1->setVisible(TRUE);
|
||||
|
|
@ -407,6 +412,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
}
|
||||
case TYPE_RECT:
|
||||
{
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
LLRect r;
|
||||
r.setValue(sd);
|
||||
spinner1->setVisible(TRUE);
|
||||
|
|
@ -457,6 +463,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
}
|
||||
case TYPE_COL4:
|
||||
{
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
LLColor4 clr;
|
||||
clr.setValue(sd);
|
||||
color_swatch->setVisible(TRUE);
|
||||
|
|
@ -478,6 +485,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
}
|
||||
case TYPE_COL3:
|
||||
{
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
LLColor3 clr;
|
||||
clr.setValue(sd);
|
||||
color_swatch->setVisible(TRUE);
|
||||
|
|
@ -486,6 +494,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
|
|||
}
|
||||
case TYPE_COL4U:
|
||||
{
|
||||
childSetVisible("boolean_combo", FALSE);
|
||||
LLColor4U clr;
|
||||
clr.setValue(sd);
|
||||
color_swatch->setVisible(TRUE);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,608 @@
|
|||
/**
|
||||
* @file llviewermedia.cpp
|
||||
* @author Callum Prentice & James Cook
|
||||
* @brief Client interface to the media engine
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llviewermedia.h"
|
||||
|
||||
#include "llmimetypes.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerimage.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llversionviewer.h"
|
||||
#include "llviewerimagelist.h"
|
||||
|
||||
#include "llevent.h" // LLSimpleListener
|
||||
#include "llmediamanager.h"
|
||||
#include "lluuid.h"
|
||||
|
||||
// don't want to include llappviewer.h
|
||||
extern std::string gChannelName;
|
||||
|
||||
// Implementation functions not exported into header file
|
||||
class LLViewerMediaImpl
|
||||
: public LLMediaObserver
|
||||
{
|
||||
public:
|
||||
LLViewerMediaImpl()
|
||||
: mMediaSource( NULL ),
|
||||
mMovieImageID(),
|
||||
mMovieImageHasMips(false)
|
||||
{ }
|
||||
|
||||
void initControlListeners();
|
||||
|
||||
void destroyMediaSource();
|
||||
|
||||
void play(const std::string& media_url,
|
||||
const std::string& mime_type,
|
||||
const LLUUID& placeholder_texture_id,
|
||||
S32 media_width, S32 media_height, U8 media_auto_scale,
|
||||
U8 media_loop);
|
||||
|
||||
void stop();
|
||||
void pause();
|
||||
void start();
|
||||
void seek(F32 time);
|
||||
void setVolume(F32 volume);
|
||||
LLMediaBase::EStatus getStatus();
|
||||
|
||||
/*virtual*/ void onMediaSizeChange(const EventType& event_in);
|
||||
/*virtual*/ void onMediaContentsChange(const EventType& event_in);
|
||||
|
||||
void updateMovieImage(const LLUUID& image_id, BOOL active);
|
||||
void updateImagesMediaStreams();
|
||||
LLUUID getMediaTextureID();
|
||||
|
||||
public:
|
||||
|
||||
// a single media url with some data and an impl.
|
||||
LLMediaBase* mMediaSource;
|
||||
LLUUID mMovieImageID;
|
||||
bool mMovieImageHasMips;
|
||||
std::string mMediaURL;
|
||||
std::string mMimeType;
|
||||
private:
|
||||
void initializePlaceholderImage(LLViewerImage *placeholder_image, LLMediaBase *media_source);
|
||||
};
|
||||
|
||||
static LLViewerMediaImpl sViewerMediaImpl;
|
||||
|
||||
void LLViewerMediaImpl::destroyMediaSource()
|
||||
{
|
||||
LLMediaManager* mgr = LLMediaManager::getInstance();
|
||||
if ( mMediaSource )
|
||||
{
|
||||
bool was_playing = LLViewerMedia::isMediaPlaying();
|
||||
mMediaSource->remObserver(this);
|
||||
mgr->destroySource( mMediaSource );
|
||||
|
||||
// Restore the texture
|
||||
updateMovieImage(LLUUID::null, was_playing);
|
||||
|
||||
}
|
||||
mMediaSource = NULL;
|
||||
}
|
||||
|
||||
void LLViewerMediaImpl::play(const std::string& media_url,
|
||||
const std::string& mime_type,
|
||||
const LLUUID& placeholder_texture_id,
|
||||
S32 media_width, S32 media_height, U8 media_auto_scale,
|
||||
U8 media_loop)
|
||||
{
|
||||
// first stop any previously playing media
|
||||
stop();
|
||||
|
||||
// Save this first, as init/load below may fire events
|
||||
mMovieImageID = placeholder_texture_id;
|
||||
|
||||
// If the mime_type passed in is different than the cached one, and
|
||||
// Auto-discovery is turned OFF, replace the cached mime_type with the new one.
|
||||
if(mime_type != mMimeType &&
|
||||
! gSavedSettings.getBOOL("AutoMimeDiscovery"))
|
||||
{
|
||||
mMimeType = mime_type;
|
||||
}
|
||||
LLURI url(media_url);
|
||||
std::string scheme = url.scheme() != "" ? url.scheme() : "http";
|
||||
|
||||
LLMediaManager* mgr = LLMediaManager::getInstance();
|
||||
mMediaSource = mgr->createSourceFromMimeType(scheme, mMimeType );
|
||||
if ( !mMediaSource )
|
||||
{
|
||||
llwarns << "media source create failed " << media_url
|
||||
<< " type " << mMimeType
|
||||
<< llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((media_width != 0) && (media_height != 0))
|
||||
{
|
||||
mMediaSource->setRequestedMediaSize(media_width, media_height);
|
||||
}
|
||||
|
||||
mMediaSource->setLooping(media_loop);
|
||||
mMediaSource->setAutoScaled(media_auto_scale);
|
||||
mMediaSource->addObserver( this );
|
||||
mMediaSource->navigateTo( media_url );
|
||||
mMediaSource->addCommand(LLMediaBase::COMMAND_START);
|
||||
|
||||
// Store the URL and Mime Type
|
||||
mMediaURL = media_url;
|
||||
|
||||
}
|
||||
|
||||
void LLViewerMediaImpl::stop()
|
||||
{
|
||||
destroyMediaSource();
|
||||
}
|
||||
|
||||
void LLViewerMediaImpl::pause()
|
||||
{
|
||||
if(mMediaSource)
|
||||
{
|
||||
mMediaSource->addCommand(LLMediaBase::COMMAND_PAUSE);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerMediaImpl::start()
|
||||
{
|
||||
if(mMediaSource)
|
||||
{
|
||||
mMediaSource->addCommand(LLMediaBase::COMMAND_START);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerMediaImpl::seek(F32 time)
|
||||
{
|
||||
if(mMediaSource)
|
||||
{
|
||||
mMediaSource->seek(time);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerMediaImpl::setVolume(F32 volume)
|
||||
{
|
||||
if(mMediaSource)
|
||||
{
|
||||
mMediaSource->setVolume( volume);
|
||||
}
|
||||
}
|
||||
|
||||
LLMediaBase::EStatus LLViewerMediaImpl::getStatus()
|
||||
{
|
||||
if (mMediaSource)
|
||||
{
|
||||
return mMediaSource->getStatus();
|
||||
}
|
||||
else
|
||||
{
|
||||
return LLMediaBase::STATUS_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerMediaImpl::updateMovieImage(const LLUUID& uuid, BOOL active)
|
||||
{
|
||||
// IF the media image hasn't changed, do nothing
|
||||
if (mMovieImageID == uuid)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// If we have changed media uuid, restore the old one
|
||||
if (!mMovieImageID.isNull())
|
||||
{
|
||||
LLViewerImage* oldImage = LLViewerImage::getImage( mMovieImageID );
|
||||
if (oldImage)
|
||||
{
|
||||
oldImage->reinit(mMovieImageHasMips);
|
||||
oldImage->mIsMediaTexture = FALSE;
|
||||
}
|
||||
mMovieImageID.setNull();
|
||||
}
|
||||
// If the movie is playing, set the new media image
|
||||
if (active && !uuid.isNull())
|
||||
{
|
||||
LLViewerImage* viewerImage = LLViewerImage::getImage( uuid );
|
||||
if( viewerImage )
|
||||
{
|
||||
mMovieImageID = uuid;
|
||||
// Can't use mipmaps for movies because they don't update the full image
|
||||
mMovieImageHasMips = viewerImage->getUseMipMaps();
|
||||
viewerImage->reinit(FALSE);
|
||||
viewerImage->mIsMediaTexture = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerMediaImpl::updateImagesMediaStreams()
|
||||
{
|
||||
LLMediaManager::updateClass();
|
||||
}
|
||||
|
||||
void LLViewerMediaImpl::initializePlaceholderImage(LLViewerImage *placeholder_image, LLMediaBase *media_source)
|
||||
{
|
||||
int media_width = media_source->getMediaWidth();
|
||||
int media_height = media_source->getMediaHeight();
|
||||
//int media_rowspan = media_source->getMediaRowSpan();
|
||||
|
||||
// if width & height are invalid, don't bother doing anything
|
||||
if ( media_width < 1 || media_height < 1 )
|
||||
return;
|
||||
|
||||
llinfos << "initializing media placeholder" << llendl;
|
||||
llinfos << "movie image id " << mMovieImageID << llendl;
|
||||
|
||||
int texture_width = LLMediaManager::textureWidthFromMediaWidth( media_width );
|
||||
int texture_height = LLMediaManager::textureHeightFromMediaHeight( media_height );
|
||||
int texture_depth = media_source->getMediaDepth();
|
||||
|
||||
// MEDIAOPT: check to see if size actually changed before doing work
|
||||
placeholder_image->destroyGLTexture();
|
||||
// MEDIAOPT: apparently just calling setUseMipMaps(FALSE) doesn't work?
|
||||
placeholder_image->reinit(FALSE); // probably not needed
|
||||
|
||||
// MEDIAOPT: seems insane that we actually have to make an imageraw then
|
||||
// immediately discard it
|
||||
LLPointer<LLImageRaw> raw = new LLImageRaw(texture_width, texture_height, texture_depth);
|
||||
raw->clear(0x0f, 0x0f, 0x0f, 0xff);
|
||||
int discard_level = 0;
|
||||
|
||||
// ask media source for correct GL image format constants
|
||||
placeholder_image->setExplicitFormat(media_source->getTextureFormatInternal(),
|
||||
media_source->getTextureFormatPrimary(),
|
||||
media_source->getTextureFormatType());
|
||||
|
||||
placeholder_image->createGLTexture(discard_level, raw);
|
||||
|
||||
// placeholder_image->setExplicitFormat()
|
||||
placeholder_image->setUseMipMaps(FALSE);
|
||||
|
||||
// MEDIAOPT: set this dynamically on play/stop
|
||||
placeholder_image->mIsMediaTexture = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// virtual
|
||||
void LLViewerMediaImpl::onMediaContentsChange(const EventType& event_in)
|
||||
{
|
||||
LLMediaBase* media_source = event_in.getSubject();
|
||||
LLViewerImage* placeholder_image = gImageList.getImage( mMovieImageID );
|
||||
if ((placeholder_image) && (placeholder_image->getHasGLTexture()))
|
||||
{
|
||||
if (placeholder_image->getUseMipMaps())
|
||||
{
|
||||
// bad image! NO MIPMAPS!
|
||||
initializePlaceholderImage(placeholder_image, media_source);
|
||||
}
|
||||
|
||||
U8* data = media_source->getMediaData();
|
||||
S32 x_pos = 0;
|
||||
S32 y_pos = 0;
|
||||
S32 width = media_source->getMediaWidth();
|
||||
S32 height = media_source->getMediaHeight();
|
||||
S32 data_width = media_source->getMediaDataWidth();
|
||||
S32 data_height = media_source->getMediaDataHeight();
|
||||
placeholder_image->setSubImage(data, data_width, data_height,
|
||||
x_pos, y_pos, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
void LLViewerMediaImpl::onMediaSizeChange(const EventType& event_in)
|
||||
{
|
||||
LLMediaBase* media_source = event_in.getSubject();
|
||||
LLViewerImage* placeholder_image = gImageList.getImage( mMovieImageID );
|
||||
if (placeholder_image)
|
||||
{
|
||||
initializePlaceholderImage(placeholder_image, media_source);
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "no placeholder image" << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Get the image we're using
|
||||
|
||||
/*
|
||||
// update media stream if required
|
||||
LLMediaEngine* media_engine = LLMediaEngine::getInstance();
|
||||
if (media_engine)
|
||||
{
|
||||
if ( media_engine->update() )
|
||||
{
|
||||
LLUUID media_uuid = media_engine->getImageUUID();
|
||||
updateMovieImage(media_uuid, TRUE);
|
||||
if (!media_uuid.isNull())
|
||||
{
|
||||
LLViewerImage* viewerImage = getImage( media_uuid );
|
||||
if( viewerImage )
|
||||
{
|
||||
LLMediaBase* renderer = media_engine->getMediaRenderer();
|
||||
if ((renderer->getTextureWidth() != viewerImage->getWidth()) ||
|
||||
(renderer->getTextureHeight() != viewerImage->getHeight()) ||
|
||||
(renderer->getTextureDepth() != viewerImage->getComponents()) ||
|
||||
(viewerImage->getHasGLTexture() == FALSE))
|
||||
{
|
||||
// destroy existing GL image
|
||||
viewerImage->destroyGLTexture();
|
||||
|
||||
// set new size
|
||||
viewerImage->setSize( renderer->getTextureWidth(),
|
||||
renderer->getTextureHeight(),
|
||||
renderer->getTextureDepth() );
|
||||
|
||||
LLPointer<LLImageRaw> raw = new LLImageRaw(renderer->getTextureWidth(),
|
||||
renderer->getTextureHeight(),
|
||||
renderer->getTextureDepth());
|
||||
raw->clear(0x7f,0x7f,0x7f,0xff);
|
||||
viewerImage->createGLTexture(0, raw);
|
||||
}
|
||||
|
||||
// Set the explicit format the instance wants
|
||||
viewerImage->setExplicitFormat(renderer->getTextureFormatInternal(),
|
||||
renderer->getTextureFormatPrimary(),
|
||||
renderer->getTextureFormatType(),
|
||||
renderer->getTextureFormatSwapBytes());
|
||||
// This should be redundant, but just in case:
|
||||
viewerImage->setUseMipMaps(FALSE);
|
||||
|
||||
LLImageRaw* rawImage = media_engine->getImageRaw();
|
||||
if ( rawImage )
|
||||
{
|
||||
viewerImage->setSubImage(rawImage, 0, 0,
|
||||
renderer->getMediaWidth(),
|
||||
renderer->getMediaHeight());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "MediaEngine update unable to get viewer image for GL texture" << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LLUUID media_uuid = media_engine->getImageUUID();
|
||||
updateMovieImage(media_uuid, FALSE);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
LLUUID LLViewerMediaImpl::getMediaTextureID()
|
||||
{
|
||||
return mMovieImageID;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Wrapper class
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerMedia::initClass()
|
||||
{
|
||||
LLMediaManagerData* init_data = new LLMediaManagerData;
|
||||
|
||||
// std::string executable_dir = std::string( arg0 ).substr( 0, std::string( arg0 ).find_last_of("\\/") );
|
||||
// std::string component_dir = std::string( executable_dir ).substr( 0, std::string( executable_dir ).find_last_of("\\/") );
|
||||
// component_dir = std::string( component_dir ).substr( 0, std::string( component_dir ).find_last_of("\\/") );
|
||||
// component_dir = std::string( component_dir ).substr( 0, std::string( component_dir ).find_last_of("\\/") );
|
||||
// component_dir += "\\newview\\app_settings\\mozilla";
|
||||
|
||||
|
||||
#if LL_DARWIN
|
||||
// For Mac OS, we store both the shared libraries and the runtime files (chrome/, plugins/, etc) in
|
||||
// Second Life.app/Contents/MacOS/. This matches the way Firefox is distributed on the Mac.
|
||||
std::string component_dir(gDirUtilp->getExecutableDir());
|
||||
#elif LL_WINDOWS
|
||||
std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
|
||||
component_dir += gDirUtilp->getDirDelimiter();
|
||||
#ifdef LL_DEBUG
|
||||
component_dir += "mozilla_debug";
|
||||
#else // LL_DEBUG
|
||||
component_dir += "mozilla";
|
||||
#endif // LL_DEBUG
|
||||
#elif LL_LINUX
|
||||
std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
|
||||
component_dir += gDirUtilp->getDirDelimiter();
|
||||
component_dir += "mozilla-runtime-linux-i686";
|
||||
#else
|
||||
std::string component_dir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) );
|
||||
component_dir += gDirUtilp->getDirDelimiter();
|
||||
component_dir += "mozilla";
|
||||
#endif
|
||||
|
||||
// append our magic version number string to the browser user agent id
|
||||
std::ostringstream codec;
|
||||
codec << "[Second Life ";
|
||||
codec << "(" << gChannelName << ")";
|
||||
codec << " - " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
|
||||
codec << "]";
|
||||
init_data->setBrowserUserAgentId( codec.str() );
|
||||
|
||||
std::string application_dir = gDirUtilp->getExecutableDir();
|
||||
|
||||
init_data->setBrowserApplicationDir( application_dir );
|
||||
std::string profile_dir = gDirUtilp->getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" );
|
||||
init_data->setBrowserProfileDir( profile_dir );
|
||||
init_data->setBrowserComponentDir( component_dir );
|
||||
std::string profile_name("Second Life");
|
||||
init_data->setBrowserProfileName( profile_name );
|
||||
init_data->setBrowserParentWindow( gViewerWindow->getPlatformWindow() );
|
||||
|
||||
LLMediaManager::initClass( init_data );
|
||||
|
||||
LLMediaManager* mm = LLMediaManager::getInstance();
|
||||
LLMIMETypes::mime_info_map_t::const_iterator it;
|
||||
for (it = LLMIMETypes::sMap.begin(); it != LLMIMETypes::sMap.end(); ++it)
|
||||
{
|
||||
const LLString& mime_type = it->first;
|
||||
const LLMIMETypes::LLMIMEInfo& info = it->second;
|
||||
mm->addMimeTypeImplNameMap( mime_type, info.mImpl );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerMedia::cleanupClass()
|
||||
{
|
||||
LLMediaManager::cleanupClass();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerMedia::play(const std::string& media_url,
|
||||
const std::string& mime_type,
|
||||
const LLUUID& placeholder_texture_id,
|
||||
S32 media_width, S32 media_height, U8 media_auto_scale,
|
||||
U8 media_loop)
|
||||
{
|
||||
sViewerMediaImpl.play(media_url, mime_type, placeholder_texture_id,
|
||||
media_width, media_height, media_auto_scale, media_loop);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerMedia::stop()
|
||||
{
|
||||
sViewerMediaImpl.stop();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerMedia::pause()
|
||||
{
|
||||
sViewerMediaImpl.pause();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerMedia::start()
|
||||
{
|
||||
sViewerMediaImpl.start();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerMedia::seek(F32 time)
|
||||
{
|
||||
sViewerMediaImpl.seek(time);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerMedia::setVolume(F32 volume)
|
||||
{
|
||||
sViewerMediaImpl.setVolume(volume);
|
||||
}
|
||||
|
||||
// static
|
||||
LLMediaBase::EStatus LLViewerMedia::getStatus()
|
||||
{
|
||||
return sViewerMediaImpl.getStatus();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
LLUUID LLViewerMedia::getMediaTextureID()
|
||||
{
|
||||
return sViewerMediaImpl.getMediaTextureID();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
bool LLViewerMedia::getMediaSize(S32 *media_width, S32 *media_height)
|
||||
{
|
||||
// make sure we're valid
|
||||
|
||||
if ( sViewerMediaImpl.mMediaSource != NULL )
|
||||
{
|
||||
*media_width = sViewerMediaImpl.mMediaSource->getMediaWidth();
|
||||
*media_height = sViewerMediaImpl.mMediaSource->getMediaHeight();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
bool LLViewerMedia::getTextureSize(S32 *texture_width, S32 *texture_height)
|
||||
{
|
||||
if ( sViewerMediaImpl.mMediaSource != NULL )
|
||||
{
|
||||
S32 media_width = sViewerMediaImpl.mMediaSource->getMediaWidth();
|
||||
S32 media_height = sViewerMediaImpl.mMediaSource->getMediaHeight();
|
||||
*texture_width = LLMediaManager::textureWidthFromMediaWidth( media_width );
|
||||
*texture_height = LLMediaManager::textureHeightFromMediaHeight( media_height );
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerMedia::updateImagesMediaStreams()
|
||||
{
|
||||
sViewerMediaImpl.updateImagesMediaStreams();
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
bool LLViewerMedia::isMediaPlaying()
|
||||
{
|
||||
LLMediaBase::EStatus status = sViewerMediaImpl.getStatus();
|
||||
return (status == LLMediaBase::STATUS_STARTED );
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
bool LLViewerMedia::isMediaPaused()
|
||||
{
|
||||
LLMediaBase::EStatus status = sViewerMediaImpl.getStatus();
|
||||
return (status == LLMediaBase::STATUS_PAUSED);
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
bool LLViewerMedia::hasMedia()
|
||||
{
|
||||
return sViewerMediaImpl.mMediaSource != NULL;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
//static
|
||||
bool LLViewerMedia::isActiveMediaTexture(const LLUUID& id)
|
||||
{
|
||||
return (id.notNull()
|
||||
&& id == getMediaTextureID()
|
||||
&& isMediaPlaying());
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
std::string LLViewerMedia::getMediaURL()
|
||||
{
|
||||
return sViewerMediaImpl.mMediaURL;
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
std::string LLViewerMedia::getMimeType()
|
||||
{
|
||||
return sViewerMediaImpl.mMimeType;
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerMedia::setMimeType(std::string mime_type)
|
||||
{
|
||||
sViewerMediaImpl.mMimeType = mime_type;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* @file llviewermedia.h
|
||||
* @author Callum Prentice & James Cook
|
||||
* @brief Client interface to the media engine
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#ifndef LLVIEWERMEDIA_H
|
||||
#define LLVIEWERMEDIA_H
|
||||
|
||||
#include "llmediabase.h" // for status codes
|
||||
|
||||
class LLUUID;
|
||||
|
||||
class LLViewerMedia
|
||||
{
|
||||
public:
|
||||
static void initClass();
|
||||
static void cleanupClass();
|
||||
|
||||
static void play(const std::string& media_url,
|
||||
const std::string& mime_type,
|
||||
const LLUUID& placeholder_texture_id,
|
||||
S32 media_width, S32 media_height, U8 media_auto_scale,
|
||||
U8 media_loop);
|
||||
static void stop();
|
||||
static void pause();
|
||||
static void start();
|
||||
static void seek(F32 time);
|
||||
static void setVolume(F32 volume);
|
||||
static LLMediaBase::EStatus getStatus();
|
||||
|
||||
static LLUUID getMediaTextureID();
|
||||
static bool getMediaSize(S32 *media_width, S32 *media_height);
|
||||
static bool getTextureSize(S32 *texture_width, S32 *texture_height);
|
||||
static bool isMediaPlaying();
|
||||
static bool isMediaPaused();
|
||||
static bool hasMedia();
|
||||
static bool isActiveMediaTexture(const LLUUID& id);
|
||||
|
||||
static std::string getMediaURL();
|
||||
static std::string getMimeType();
|
||||
static void setMimeType(std::string mime_type);
|
||||
|
||||
static void updateImagesMediaStreams();
|
||||
};
|
||||
|
||||
#endif // LLVIEWERMEDIA_H
|
||||
|
|
@ -104,6 +104,7 @@
|
|||
#include "llfloatergroupinvite.h"
|
||||
#include "llfloatergroups.h"
|
||||
#include "llfloaterhtml.h"
|
||||
#include "llfloaterhtmlhelp.h"
|
||||
#include "llfloaterinspect.h"
|
||||
#include "llfloaterlagmeter.h"
|
||||
#include "llfloaterland.h"
|
||||
|
|
@ -5340,7 +5341,7 @@ class LLShowFloater : public view_listener_t
|
|||
gParcelMgr->selectParcelAt(gAgent.getPositionGlobal());
|
||||
}
|
||||
|
||||
LLFloaterLand::show();
|
||||
LLFloaterLand::showInstance();
|
||||
}
|
||||
else if (floater_name == "buy land")
|
||||
{
|
||||
|
|
@ -5365,25 +5366,19 @@ class LLShowFloater : public view_listener_t
|
|||
}
|
||||
else if (floater_name == "help f1")
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
gViewerHtmlHelp.show( gSavedSettings.getString("HelpHomeURL") );
|
||||
#endif
|
||||
}
|
||||
else if (floater_name == "help in-world")
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
const bool open_app_slurls = true;
|
||||
LLFloaterHtml::getInstance()->show(
|
||||
"in-world_help", open_app_slurls );
|
||||
#endif
|
||||
}
|
||||
else if (floater_name == "help additional")
|
||||
{
|
||||
#if LL_LIBXUL_ENABLED
|
||||
const bool open_app_slurls = true;
|
||||
LLFloaterHtml::getInstance()->show(
|
||||
"additional_help", open_app_slurls );
|
||||
#endif
|
||||
}
|
||||
else if (floater_name == "complaint reporter")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5039,7 +5039,7 @@ void callback_load_url(S32 option, void* data)
|
|||
|
||||
if (0 == option)
|
||||
{
|
||||
LLWeb::loadURL(infop->mUrl);
|
||||
LLWeb::loadURL(infop->mUrl);
|
||||
}
|
||||
|
||||
delete infop;
|
||||
|
|
|
|||
|
|
@ -156,8 +156,6 @@ public:
|
|||
// Return codes for processUpdateMessage
|
||||
enum { MEDIA_URL_REMOVED = 0x1, MEDIA_URL_ADDED = 0x2, MEDIA_URL_UPDATED = 0x4 };
|
||||
|
||||
enum { CLICK_ACTION_TOUCH = 0, CLICK_ACTION_SIT = 1, CLICK_ACTION_BUY = 2 };
|
||||
|
||||
virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
|
||||
void **user_data,
|
||||
U32 block_num,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,340 @@
|
|||
/**
|
||||
* @file llviewerparcelmedia.cpp
|
||||
* @author Callum Prentice & James Cook
|
||||
* @brief Handlers for multimedia on a per-parcel basis
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llviewerparcelmedia.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewermedia.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llparcel.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "lluuid.h"
|
||||
#include "message.h"
|
||||
#include "llviewerparcelmediaautoplay.h"
|
||||
#include "llfirstuse.h"
|
||||
|
||||
// Static Variables
|
||||
|
||||
S32 LLViewerParcelMedia::sMediaParcelLocalID = 0;
|
||||
LLUUID LLViewerParcelMedia::sMediaRegionID;
|
||||
|
||||
// Move this to its own file.
|
||||
// helper class that tries to download a URL from a web site and calls a method
|
||||
// on the Panel Land Media and to discover the MIME type
|
||||
class LLMimeDiscoveryResponder : public LLHTTPClient::Responder
|
||||
{
|
||||
public:
|
||||
LLMimeDiscoveryResponder( )
|
||||
{}
|
||||
|
||||
|
||||
|
||||
virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)
|
||||
{
|
||||
std::string media_type = content["content-type"].asString();
|
||||
std::string::size_type idx1 = media_type.find_first_of(";");
|
||||
std::string mime_type = media_type.substr(0, idx1);
|
||||
completeAny(status, mime_type);
|
||||
}
|
||||
|
||||
virtual void error( U32 status, const std::string& reason )
|
||||
{
|
||||
completeAny(status, "none/none");
|
||||
}
|
||||
|
||||
void completeAny(U32 status, const std::string& mime_type)
|
||||
{
|
||||
LLViewerMedia::setMimeType(mime_type);
|
||||
}
|
||||
};
|
||||
|
||||
// static
|
||||
void LLViewerParcelMedia::initClass()
|
||||
{
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
msg->setHandlerFunc("ParcelMediaCommandMessage", processParcelMediaCommandMessage );
|
||||
msg->setHandlerFunc("ParcelMediaUpdate", processParcelMediaUpdate );
|
||||
LLViewerParcelMediaAutoPlay::initClass();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerParcelMedia::update(LLParcel* parcel)
|
||||
{
|
||||
if (/*LLViewerMedia::hasMedia()*/ true)
|
||||
{
|
||||
// we have a player
|
||||
if (parcel)
|
||||
{
|
||||
// we're in a parcel
|
||||
bool new_parcel = false;
|
||||
S32 parcelid = parcel->getLocalID();
|
||||
LLUUID regionid = gAgent.getRegion()->getRegionID();
|
||||
if (parcelid != sMediaParcelLocalID || regionid != sMediaRegionID)
|
||||
{
|
||||
sMediaParcelLocalID = parcelid;
|
||||
sMediaRegionID = regionid;
|
||||
new_parcel = true;
|
||||
}
|
||||
|
||||
std::string mediaUrl = std::string ( parcel->getMediaURL () );
|
||||
LLString::trim(mediaUrl);
|
||||
|
||||
// has something changed?
|
||||
if ( ( LLViewerMedia::getMediaURL() != mediaUrl )
|
||||
|| ( LLViewerMedia::getMediaTextureID() != parcel->getMediaID () ) )
|
||||
{
|
||||
bool video_was_playing = FALSE;
|
||||
bool same_media_id = LLViewerMedia::getMediaTextureID() == parcel->getMediaID ();
|
||||
|
||||
if (LLViewerMedia::isMediaPlaying())
|
||||
{
|
||||
video_was_playing = TRUE;
|
||||
}
|
||||
|
||||
if ( !mediaUrl.empty() && same_media_id && ! new_parcel)
|
||||
{
|
||||
// Someone has "changed the channel", changing the URL of a video
|
||||
// you were already watching. Automatically play provided the texture ID is the same
|
||||
if (video_was_playing)
|
||||
{
|
||||
// Poke the mime type in before calling play.
|
||||
// This is necessary because in this instance we are not waiting
|
||||
// for the results of a header curl. In order to change the channel
|
||||
// a mime type MUST be provided.
|
||||
LLViewerMedia::setMimeType(parcel->getMediaType());
|
||||
play(parcel);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stop();
|
||||
}
|
||||
|
||||
// Discover the MIME type
|
||||
// Disabled for the time being. Get the mime type from the parcel.
|
||||
if(gSavedSettings.getBOOL("AutoMimeDiscovery"))
|
||||
{
|
||||
LLHTTPClient::getHeaderOnly( mediaUrl, new LLMimeDiscoveryResponder());
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerMedia::setMimeType(parcel->getMediaType());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stop();
|
||||
}
|
||||
}
|
||||
/*
|
||||
else
|
||||
{
|
||||
// no audio player, do a first use dialog if their is media here
|
||||
if (parcel)
|
||||
{
|
||||
std::string mediaUrl = std::string ( parcel->getMediaURL () );
|
||||
if (!mediaUrl.empty ())
|
||||
{
|
||||
if (gSavedSettings.getWarning("QuickTimeInstalled"))
|
||||
{
|
||||
gSavedSettings.setWarning("QuickTimeInstalled", FALSE);
|
||||
|
||||
LLNotifyBox::showXml("NoQuickTime" );
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMedia::play(LLParcel* parcel)
|
||||
{
|
||||
llinfos << "play" << llendl;
|
||||
|
||||
if (!parcel) return;
|
||||
|
||||
if (!gSavedSettings.getBOOL("AudioStreamingVideo"))
|
||||
return;
|
||||
|
||||
std::string media_url = parcel->getMediaURL();
|
||||
std::string mime_type = parcel->getMediaType();
|
||||
LLUUID placeholder_texture_id = parcel->getMediaID();
|
||||
U8 media_auto_scale = parcel->getMediaAutoScale();
|
||||
U8 media_loop = parcel->getMediaLoop();
|
||||
S32 media_width = parcel->getMediaWidth();
|
||||
S32 media_height = parcel->getMediaHeight();
|
||||
LLViewerMedia::play(media_url, mime_type, placeholder_texture_id,
|
||||
media_width, media_height, media_auto_scale,
|
||||
media_loop);
|
||||
LLFirstUse::useMedia();
|
||||
|
||||
LLViewerParcelMediaAutoPlay::playStarted();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMedia::stop()
|
||||
{
|
||||
|
||||
LLViewerMedia::stop();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMedia::pause()
|
||||
{
|
||||
LLViewerMedia::pause();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMedia::start()
|
||||
{
|
||||
LLViewerMedia::start();
|
||||
LLFirstUse::useMedia();
|
||||
|
||||
LLViewerParcelMediaAutoPlay::playStarted();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMedia::seek(F32 time)
|
||||
{
|
||||
LLViewerMedia::seek(time);
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
LLMediaBase::EStatus LLViewerParcelMedia::getStatus()
|
||||
{
|
||||
return LLViewerMedia::getStatus();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** )
|
||||
{
|
||||
// extract the agent id
|
||||
// LLUUID agent_id;
|
||||
// msg->getUUID( agent_id );
|
||||
|
||||
U32 flags;
|
||||
U32 command;
|
||||
F32 time;
|
||||
msg->getU32( "CommandBlock", "Flags", flags );
|
||||
msg->getU32( "CommandBlock", "Command", command);
|
||||
msg->getF32( "CommandBlock", "Time", time );
|
||||
|
||||
if (flags &( (1<<PARCEL_MEDIA_COMMAND_STOP)
|
||||
| (1<<PARCEL_MEDIA_COMMAND_PAUSE)
|
||||
| (1<<PARCEL_MEDIA_COMMAND_PLAY)
|
||||
| (1<<PARCEL_MEDIA_COMMAND_LOOP)
|
||||
| (1<<PARCEL_MEDIA_COMMAND_UNLOAD) ))
|
||||
{
|
||||
// stop
|
||||
if( command == PARCEL_MEDIA_COMMAND_STOP )
|
||||
{
|
||||
stop();
|
||||
}
|
||||
else
|
||||
// pause
|
||||
if( command == PARCEL_MEDIA_COMMAND_PAUSE )
|
||||
{
|
||||
pause();
|
||||
}
|
||||
else
|
||||
// play
|
||||
if( command == PARCEL_MEDIA_COMMAND_PLAY )
|
||||
{
|
||||
if (LLViewerMedia::isMediaPaused())
|
||||
{
|
||||
start();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLParcel *parcel = gParcelMgr->getAgentParcel();
|
||||
play(parcel);
|
||||
}
|
||||
}
|
||||
else
|
||||
// loop
|
||||
if( command == PARCEL_MEDIA_COMMAND_LOOP )
|
||||
{
|
||||
//llinfos << ">>> LLMediaEngine::process_parcel_media with command = " <<( '0' + command ) << llendl;
|
||||
|
||||
// huh? what is play?
|
||||
//convertImageAndLoadUrl( play );
|
||||
//convertImageAndLoadUrl( true, false, std::string() );
|
||||
}
|
||||
else
|
||||
// unload
|
||||
if( command == PARCEL_MEDIA_COMMAND_UNLOAD )
|
||||
{
|
||||
stop();
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & (1<<PARCEL_MEDIA_COMMAND_TIME))
|
||||
{
|
||||
if(! LLViewerMedia::hasMedia())
|
||||
{
|
||||
LLParcel *parcel = gParcelMgr->getAgentParcel();
|
||||
play(parcel);
|
||||
}
|
||||
seek(time);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// static
|
||||
void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void ** )
|
||||
{
|
||||
LLUUID media_id;
|
||||
std::string media_url;
|
||||
std::string media_type;
|
||||
S32 media_width = 0;
|
||||
S32 media_height = 0;
|
||||
U8 media_auto_scale = FALSE;
|
||||
U8 media_loop = FALSE;
|
||||
|
||||
msg->getUUID( "DataBlock", "MediaID", media_id );
|
||||
char media_url_buffer[257];
|
||||
msg->getString( "DataBlock", "MediaURL", 255, media_url_buffer );
|
||||
media_url = media_url_buffer;
|
||||
msg->getU8("DataBlock", "MediaAutoScale", media_auto_scale);
|
||||
|
||||
if (msg->getNumberOfBlocks("DataBlockExtended")) // do we have the extended data?
|
||||
{
|
||||
char media_type_buffer[257];
|
||||
msg->getString("DataBlockExtended", "MediaType", 255, media_type_buffer);
|
||||
media_type = media_type_buffer;
|
||||
msg->getU8("DataBlockExtended", "MediaLoop", media_loop);
|
||||
msg->getS32("DataBlockExtended", "MediaWidth", media_width);
|
||||
msg->getS32("DataBlockExtended", "MediaHeight", media_height);
|
||||
}
|
||||
|
||||
LLParcel *parcel = gParcelMgr->getAgentParcel();
|
||||
BOOL same = FALSE;
|
||||
if (parcel)
|
||||
{
|
||||
same = ((parcel->getMediaURL() == media_url) &&
|
||||
(parcel->getMediaType() == media_type) &&
|
||||
(parcel->getMediaID() == media_id) &&
|
||||
(parcel->getMediaWidth() == media_width) &&
|
||||
(parcel->getMediaHeight() == media_height) &&
|
||||
(parcel->getMediaAutoScale() == media_auto_scale) &&
|
||||
(parcel->getMediaLoop() == media_loop));
|
||||
}
|
||||
|
||||
if (!same)
|
||||
LLViewerMedia::play(media_url, media_type, media_id,
|
||||
media_auto_scale, media_width, media_height,
|
||||
media_loop);
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* @file llviewerparcelmedia.h
|
||||
* @author Callum Prentice & James Cook
|
||||
* @brief Handlers for multimedia on a per-parcel basis
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#ifndef LLVIEWERPARCELMEDIA_H
|
||||
#define LLVIEWERPARCELMEDIA_H
|
||||
|
||||
#include "llmediabase.h"
|
||||
|
||||
class LLMessageSystem;
|
||||
class LLParcel;
|
||||
|
||||
// This class understands land parcels, network traffic, LSL media
|
||||
// transport commands, and talks to the LLViewerMedia class to actually
|
||||
// do playback. It allows us to remove code from LLViewerParcelMgr.
|
||||
class LLViewerParcelMedia
|
||||
{
|
||||
public:
|
||||
static void initClass();
|
||||
|
||||
static void update(LLParcel* parcel);
|
||||
// called when the agent's parcel has a new URL, or the agent has
|
||||
// walked on to a new parcel with media
|
||||
|
||||
static void play(LLParcel* parcel);
|
||||
// user clicked play button in media transport controls
|
||||
|
||||
static void stop();
|
||||
// user clicked stop button in media transport controls
|
||||
|
||||
static void pause();
|
||||
static void start();
|
||||
// restart after pause - no need for all the setup
|
||||
|
||||
static void seek(F32 time);
|
||||
// jump to timecode time
|
||||
|
||||
static LLMediaBase::EStatus getStatus();
|
||||
|
||||
static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** );
|
||||
static void processParcelMediaUpdate( LLMessageSystem *msg, void ** );
|
||||
|
||||
public:
|
||||
static S32 sMediaParcelLocalID;
|
||||
static LLUUID sMediaRegionID;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
/**
|
||||
* @file llviewerparcelmediaautoplay.cpp
|
||||
* @author Karl Stiefvater
|
||||
* @brief timer to automatically play media in a parcel
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llviewerparcelmediaautoplay.h"
|
||||
#include "llviewerparcelmedia.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewermedia.h"
|
||||
#include "llparcel.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "lluuid.h"
|
||||
#include "message.h"
|
||||
#include "llviewerimagelist.h" // for texture stats
|
||||
#include "llagent.h"
|
||||
|
||||
const F32 AUTOPLAY_TIME = 5; // how many seconds before we autoplay
|
||||
const F32 AUTOPLAY_SIZE = 24*24; // how big the texture must be (pixel area) before we autoplay
|
||||
const F32 AUTOPLAY_SPEED = 0.1f; // how slow should the agent be moving to autoplay
|
||||
|
||||
LLViewerParcelMediaAutoPlay::LLViewerParcelMediaAutoPlay() :
|
||||
LLEventTimer(1),
|
||||
mPlayed(FALSE),
|
||||
mTimeInParcel(0)
|
||||
{
|
||||
}
|
||||
|
||||
static LLViewerParcelMediaAutoPlay *sAutoPlay = NULL;
|
||||
|
||||
// static
|
||||
void LLViewerParcelMediaAutoPlay::initClass()
|
||||
{
|
||||
if (!sAutoPlay)
|
||||
sAutoPlay = new LLViewerParcelMediaAutoPlay;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMediaAutoPlay::cleanupClass()
|
||||
{
|
||||
if (sAutoPlay)
|
||||
delete sAutoPlay;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMediaAutoPlay::playStarted()
|
||||
{
|
||||
if (sAutoPlay)
|
||||
{
|
||||
sAutoPlay->mPlayed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLViewerParcelMediaAutoPlay::tick()
|
||||
{
|
||||
LLParcel *this_parcel = NULL;
|
||||
std::string this_media_url;
|
||||
LLUUID this_media_texture_id;
|
||||
S32 this_parcel_id = 0;
|
||||
|
||||
if (gParcelMgr)
|
||||
{
|
||||
this_parcel = gParcelMgr->getAgentParcel();
|
||||
}
|
||||
|
||||
if (this_parcel)
|
||||
{
|
||||
this_media_url = std::string(this_parcel->getMediaURL());
|
||||
|
||||
this_media_texture_id = this_parcel->getMediaID();
|
||||
|
||||
this_parcel_id = this_parcel->getLocalID();
|
||||
}
|
||||
|
||||
if (this_parcel_id != mLastParcelID)
|
||||
{
|
||||
// we've entered a new parcel
|
||||
mPlayed = FALSE; // we haven't autoplayed yet
|
||||
mTimeInParcel = 0; // reset our timer
|
||||
mLastParcelID = this_parcel_id;
|
||||
}
|
||||
|
||||
mTimeInParcel += mPeriod; // increase mTimeInParcel by the amount of time between ticks
|
||||
|
||||
if ((!mPlayed) && // if we've never played
|
||||
(mTimeInParcel > AUTOPLAY_TIME) && // and if we've been here for so many seconds
|
||||
(this_media_url.size() != 0) && // and if the parcel has media
|
||||
(!LLViewerMedia::isMediaPlaying())) // and if the media is not already playing
|
||||
{
|
||||
if (this_media_texture_id.notNull()) // and if the media texture is good
|
||||
{
|
||||
LLViewerImage *image = gImageList.getImage(this_media_texture_id, FALSE);
|
||||
|
||||
F32 image_size = 0;
|
||||
|
||||
if (image)
|
||||
{
|
||||
image_size = image->mMaxVirtualSize;
|
||||
}
|
||||
|
||||
if (gAgent.getVelocity().magVec() < AUTOPLAY_SPEED) // and if the agent is stopped (slow enough)
|
||||
{
|
||||
if (image_size > AUTOPLAY_SIZE) // and if the target texture is big enough on screen
|
||||
{
|
||||
if (this_parcel)
|
||||
{
|
||||
if (gSavedSettings.getBOOL("ParcelMediaAutoPlayEnable"))
|
||||
{
|
||||
// and last but not least, only play when autoplay is enabled
|
||||
LLViewerParcelMedia::play(this_parcel);
|
||||
}
|
||||
}
|
||||
|
||||
mPlayed = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return FALSE; // continue ticking forever please.
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* @file llviewerparcelmediaautoplay.h
|
||||
* @author Karl Stiefvater
|
||||
* @brief timer to automatically play media in a parcel
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
#ifndef LLVIEWERPARCELMEDIAAUTOPLAY_H
|
||||
#define LLVIEWERPARCELMEDIAAUTOPLAY_H
|
||||
|
||||
#include "llmediabase.h"
|
||||
#include "lltimer.h"
|
||||
|
||||
// timer to automatically play media
|
||||
class LLViewerParcelMediaAutoPlay : LLEventTimer
|
||||
{
|
||||
public:
|
||||
LLViewerParcelMediaAutoPlay();
|
||||
virtual BOOL tick();
|
||||
static void initClass();
|
||||
static void cleanupClass();
|
||||
static void playStarted();
|
||||
|
||||
private:
|
||||
S32 mLastParcelID;
|
||||
BOOL mPlayed;
|
||||
F32 mTimeInParcel;
|
||||
};
|
||||
|
||||
|
||||
#endif // LLVIEWERPARCELMEDIAAUTOPLAY_H
|
||||
|
|
@ -38,7 +38,6 @@
|
|||
#include "indra_constants.h"
|
||||
#include "llcachename.h"
|
||||
#include "llgl.h"
|
||||
#include "llmediaengine.h"
|
||||
#include "llparcel.h"
|
||||
#include "llsecondlifeurls.h"
|
||||
#include "message.h"
|
||||
|
|
@ -55,14 +54,16 @@
|
|||
#include "llfloatersellland.h"
|
||||
#include "llfloatertools.h"
|
||||
#include "llnotify.h"
|
||||
#include "llparcelselection.h"
|
||||
#include "llresmgr.h"
|
||||
#include "llstatusbar.h"
|
||||
#include "llui.h"
|
||||
#include "llviewerimage.h"
|
||||
#include "llviewerimagelist.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerparcelmedia.h"
|
||||
#include "llviewerparceloverlay.h"
|
||||
#include "llviewerregion.h"
|
||||
//#include "llwebbrowserctrl.h"
|
||||
#include "llworld.h"
|
||||
#include "lloverlaybar.h"
|
||||
#include "roles_constants.h"
|
||||
|
|
@ -78,11 +79,8 @@ U8* LLViewerParcelMgr::sPackedOverlay = NULL;
|
|||
|
||||
LLUUID gCurrentMovieID = LLUUID::null;
|
||||
|
||||
static LLParcelSelection* get_null_parcel_selection();
|
||||
template<>
|
||||
const LLHandle<LLParcelSelection>::NullFunc
|
||||
LLHandle<LLParcelSelection>::sNullFunc = get_null_parcel_selection;
|
||||
|
||||
LLPointer<LLViewerImage> sBlockedImage;
|
||||
LLPointer<LLViewerImage> sPassImage;
|
||||
|
||||
// Local functions
|
||||
void optionally_start_music(const LLString& music_url);
|
||||
|
|
@ -141,10 +139,10 @@ LLViewerParcelMgr::LLViewerParcelMgr()
|
|||
resetSegments(mCollisionSegments);
|
||||
|
||||
mBlockedImageID.set(gViewerArt.getString("noentrylines.tga"));
|
||||
mBlockedImage = gImageList.getImage(mBlockedImageID, TRUE, TRUE);
|
||||
sBlockedImage = gImageList.getImage(mBlockedImageID, TRUE, TRUE);
|
||||
|
||||
mPassImageID.set(gViewerArt.getString("noentrypasslines.tga"));
|
||||
mPassImage = gImageList.getImage(mPassImageID, TRUE, TRUE);
|
||||
sPassImage = gImageList.getImage(mPassImageID, TRUE, TRUE);
|
||||
|
||||
S32 overlay_size = mParcelsPerEdge * mParcelsPerEdge / PARCEL_OVERLAY_CHUNKS;
|
||||
sPackedOverlay = new U8[overlay_size];
|
||||
|
|
@ -189,6 +187,9 @@ LLViewerParcelMgr::~LLViewerParcelMgr()
|
|||
|
||||
delete[] mAgentParcelOverlay;
|
||||
mAgentParcelOverlay = NULL;
|
||||
|
||||
sBlockedImage = NULL;
|
||||
sPassImage = NULL;
|
||||
}
|
||||
|
||||
void LLViewerParcelMgr::dump()
|
||||
|
|
@ -1255,30 +1256,45 @@ const LLString& LLViewerParcelMgr::getAgentParcelName() const
|
|||
}
|
||||
|
||||
|
||||
void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel)
|
||||
void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region)
|
||||
{
|
||||
if (!parcel) return;
|
||||
if(!gWorldp) return;
|
||||
LLViewerRegion *region = gWorldp->getRegionFromPosGlobal( mWestSouth );
|
||||
LLViewerRegion *region = use_agent_region ? gAgent.getRegion() : gWorldp->getRegionFromPosGlobal( mWestSouth );
|
||||
if (!region) return;
|
||||
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
LLSD body;
|
||||
std::string url = gAgent.getRegion()->getCapability("ParcelPropertiesUpdate");
|
||||
if (!url.empty())
|
||||
{
|
||||
parcel->packMessage(body);
|
||||
|
||||
msg->newMessageFast(_PREHASH_ParcelPropertiesUpdate);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_ParcelData);
|
||||
msg->addS32Fast(_PREHASH_LocalID, parcel->getLocalID() );
|
||||
llinfos << "Sending parcel properties update via capability to:" << url << llendl;
|
||||
|
||||
U32 flags = 0x0;
|
||||
// request new properties update from simulator
|
||||
flags |= 0x01;
|
||||
msg->addU32("Flags", flags);
|
||||
LLHTTPClient::post(url, body, new LLHTTPClient::Responder());
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
|
||||
msg->newMessageFast(_PREHASH_ParcelPropertiesUpdate);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_ParcelData);
|
||||
msg->addS32Fast(_PREHASH_LocalID, parcel->getLocalID() );
|
||||
|
||||
U32 flags = 0x0;
|
||||
// request new properties update from simulator
|
||||
flags |= 0x01;
|
||||
msg->addU32("Flags", flags);
|
||||
|
||||
parcel->packMessage(msg);
|
||||
|
||||
msg->sendReliable( region->getHost() );
|
||||
}
|
||||
|
||||
parcel->packMessage(msg);
|
||||
|
||||
msg->sendReliable( region->getHost() );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1363,7 +1379,6 @@ void LLViewerParcelMgr::processParcelOverlay(LLMessageSystem *msg, void **user)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **user)
|
||||
{
|
||||
|
|
@ -1657,19 +1672,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||
}
|
||||
else
|
||||
{
|
||||
// It's the agent parcel
|
||||
BOOL new_parcel = parcel ? FALSE : TRUE;
|
||||
if (parcel)
|
||||
{
|
||||
S32 parcelid = parcel->getLocalID();
|
||||
U64 regionid = gAgent.getRegion()->getHandle();
|
||||
if (parcelid != gParcelMgr->mMediaParcelId || regionid != gParcelMgr->mMediaRegionId)
|
||||
{
|
||||
gParcelMgr->mMediaParcelId = parcelid;
|
||||
gParcelMgr->mMediaRegionId = regionid;
|
||||
new_parcel = TRUE;
|
||||
}
|
||||
}
|
||||
// look for music.
|
||||
if (gAudiop)
|
||||
{
|
||||
|
|
@ -1714,75 +1716,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||
}//if gAudiop
|
||||
|
||||
// now check for video
|
||||
if (LLMediaEngine::getInstance ()->isAvailable ())
|
||||
{
|
||||
// we have a player
|
||||
if (parcel)
|
||||
{
|
||||
// we're in a parcel
|
||||
std::string mediaUrl = std::string ( parcel->getMediaURL () );
|
||||
LLString::trim(mediaUrl);
|
||||
|
||||
// clean spaces and whatnot
|
||||
mediaUrl = LLWeb::escapeURL(mediaUrl);
|
||||
|
||||
|
||||
// something changed
|
||||
LLMediaEngine* me = LLMediaEngine::getInstance();
|
||||
if ( ( me->getUrl () != mediaUrl )
|
||||
|| ( me->getImageUUID () != parcel->getMediaID () )
|
||||
|| ( me->isAutoScaled () != parcel->getMediaAutoScale () ) )
|
||||
{
|
||||
BOOL video_was_playing = FALSE;
|
||||
LLMediaBase* renderer = me->getMediaRenderer();
|
||||
if (renderer && (renderer->isPlaying() || renderer->isLooping()))
|
||||
{
|
||||
video_was_playing = TRUE;
|
||||
}
|
||||
|
||||
stop_video();
|
||||
|
||||
if ( !mediaUrl.empty () )
|
||||
{
|
||||
// Someone has "changed the channel", changing the URL of a video
|
||||
// you were already watching. Do we want to automatically start playing? JC
|
||||
if (!new_parcel
|
||||
&& gSavedSettings.getBOOL("AudioStreamingVideo")
|
||||
&& video_was_playing)
|
||||
{
|
||||
start_video(parcel);
|
||||
}
|
||||
else
|
||||
{
|
||||
// "Prepare" the media engine, but don't auto-play. JC
|
||||
optionally_prepare_video(parcel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stop_video();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// no audio player, do a first use dialog if their is media here
|
||||
if (parcel)
|
||||
{
|
||||
std::string mediaUrl = std::string ( parcel->getMediaURL () );
|
||||
if (!mediaUrl.empty ())
|
||||
{
|
||||
if (gSavedSettings.getWarning("QuickTimeInstalled"))
|
||||
{
|
||||
gSavedSettings.setWarning("QuickTimeInstalled", FALSE);
|
||||
|
||||
LLNotifyBox::showXml("NoQuickTime" );
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLViewerParcelMedia::update( parcel );
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -1832,94 +1766,6 @@ void callback_start_music(S32 option, void* data)
|
|||
music_url = NULL;
|
||||
}
|
||||
|
||||
void prepare_video(const LLParcel *parcel)
|
||||
{
|
||||
std::string mediaUrl;
|
||||
if (parcel->getParcelFlag(PF_URL_RAW_HTML))
|
||||
{
|
||||
mediaUrl = std::string("data:");
|
||||
mediaUrl.append(parcel->getMediaURL());
|
||||
}
|
||||
else
|
||||
{
|
||||
mediaUrl = std::string ( parcel->getMediaURL () );
|
||||
}
|
||||
|
||||
// clean spaces and whatnot
|
||||
mediaUrl = LLWeb::escapeURL(mediaUrl);
|
||||
|
||||
LLMediaEngine::getInstance ()->setUrl ( mediaUrl );
|
||||
LLMediaEngine::getInstance ()->setImageUUID ( parcel->getMediaID () );
|
||||
LLMediaEngine::getInstance ()->setAutoScaled ( parcel->getMediaAutoScale () ? TRUE : FALSE ); // (U8 instead of BOOL for future expansion)
|
||||
}
|
||||
|
||||
void start_video(const LLParcel *parcel)
|
||||
{
|
||||
prepare_video(parcel);
|
||||
std::string path( "" );
|
||||
LLMediaEngine::getInstance ()->convertImageAndLoadUrl ( true, false, path);
|
||||
}
|
||||
|
||||
void stop_video()
|
||||
{
|
||||
// set up remote control so stop is selected
|
||||
LLMediaEngine::getInstance ()->stop ();
|
||||
if (gOverlayBar)
|
||||
{
|
||||
gOverlayBar->refresh ();
|
||||
}
|
||||
|
||||
if (LLMediaEngine::getInstance ()->isLoaded())
|
||||
{
|
||||
LLMediaEngine::getInstance ()->unload ();
|
||||
|
||||
gImageList.updateMovieImage(LLUUID::null, FALSE);
|
||||
gCurrentMovieID.setNull();
|
||||
}
|
||||
|
||||
LLMediaEngine::getInstance ()->setUrl ( "" );
|
||||
LLMediaEngine::getInstance ()->setImageUUID ( LLUUID::null );
|
||||
|
||||
}
|
||||
|
||||
void optionally_prepare_video(const LLParcel *parcelp)
|
||||
{
|
||||
if (gSavedSettings.getWarning("FirstStreamingVideo"))
|
||||
{
|
||||
gViewerWindow->alertXml("ParcelCanPlayMedia",
|
||||
callback_prepare_video,
|
||||
(void*)parcelp);
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "Entering parcel " << parcelp->getLocalID() << " with video " << parcelp->getMediaURL() << llendl;
|
||||
prepare_video(parcelp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void callback_prepare_video(S32 option, void* data)
|
||||
{
|
||||
const LLParcel *parcelp = (const LLParcel *)data;
|
||||
|
||||
if (0 == option)
|
||||
{
|
||||
gSavedSettings.setBOOL("AudioStreamingVideo", TRUE);
|
||||
llinfos << "Starting parcel video " << parcelp->getMediaURL() << " on parcel " << parcelp->getLocalID() << llendl;
|
||||
gMessageSystem->setHandlerFunc("ParcelMediaCommandMessage", LLMediaEngine::process_parcel_media);
|
||||
gMessageSystem->setHandlerFunc ( "ParcelMediaUpdate", LLMediaEngine::process_parcel_media_update );
|
||||
prepare_video(parcelp);
|
||||
}
|
||||
else
|
||||
{
|
||||
gMessageSystem->setHandlerFunc("ParcelMediaCommandMessage", null_message_callback);
|
||||
gMessageSystem->setHandlerFunc ( "ParcelMediaUpdate", null_message_callback );
|
||||
gSavedSettings.setBOOL("AudioStreamingVideo", FALSE);
|
||||
}
|
||||
|
||||
gSavedSettings.setWarning("FirstStreamingVideo", FALSE);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void **user)
|
||||
{
|
||||
|
|
@ -2548,71 +2394,20 @@ void sanitize_corners(const LLVector3d &corner1,
|
|||
east_north_top.mdV[VZ] = llmax( corner1.mdV[VZ], corner2.mdV[VZ] );
|
||||
}
|
||||
|
||||
//
|
||||
// LLParcelSelection
|
||||
//
|
||||
LLParcelSelection::LLParcelSelection() :
|
||||
mParcel(NULL),
|
||||
mSelectedMultipleOwners(FALSE),
|
||||
mWholeParcelSelected(FALSE),
|
||||
mSelectedSelfCount(0),
|
||||
mSelectedOtherCount(0),
|
||||
mSelectedPublicCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
LLParcelSelection::LLParcelSelection(LLParcel* parcel) :
|
||||
mParcel(parcel),
|
||||
mSelectedMultipleOwners(FALSE),
|
||||
mWholeParcelSelected(FALSE),
|
||||
mSelectedSelfCount(0),
|
||||
mSelectedOtherCount(0),
|
||||
mSelectedPublicCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
LLParcelSelection::~LLParcelSelection()
|
||||
{
|
||||
}
|
||||
|
||||
BOOL LLParcelSelection::getMultipleOwners() const
|
||||
{
|
||||
return mSelectedMultipleOwners;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLParcelSelection::getWholeParcelSelected() const
|
||||
{
|
||||
return mWholeParcelSelected;
|
||||
}
|
||||
|
||||
|
||||
S32 LLParcelSelection::getClaimableArea() const
|
||||
{
|
||||
const S32 UNIT_AREA = S32( PARCEL_GRID_STEP_METERS * PARCEL_GRID_STEP_METERS );
|
||||
return mSelectedPublicCount * UNIT_AREA;
|
||||
}
|
||||
|
||||
bool LLParcelSelection::hasOthersSelected() const
|
||||
{
|
||||
return mSelectedOtherCount != 0;
|
||||
}
|
||||
|
||||
static LLPointer<LLParcelSelection> sNullSelection;
|
||||
|
||||
LLParcelSelection* get_null_parcel_selection()
|
||||
{
|
||||
if (sNullSelection.isNull())
|
||||
{
|
||||
sNullSelection = new LLParcelSelection;
|
||||
}
|
||||
|
||||
return sNullSelection;
|
||||
}
|
||||
|
||||
void LLViewerParcelMgr::cleanupGlobals()
|
||||
{
|
||||
delete gParcelMgr;
|
||||
gParcelMgr = NULL;
|
||||
sNullSelection = NULL;
|
||||
LLParcelSelection::sNullSelection = NULL;
|
||||
}
|
||||
|
||||
LLViewerImage* LLViewerParcelMgr::getBlockedImage() const
|
||||
{
|
||||
return sBlockedImage;
|
||||
}
|
||||
|
||||
LLViewerImage* LLViewerParcelMgr::getPassImage() const
|
||||
{
|
||||
return sPassImage;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,11 +36,12 @@
|
|||
#include "lldarray.h"
|
||||
#include "llframetimer.h"
|
||||
#include "llmemory.h"
|
||||
#include "llviewerimage.h"
|
||||
#include "llparcelselection.h"
|
||||
|
||||
class LLUUID;
|
||||
class LLMessageSystem;
|
||||
class LLParcel;
|
||||
class LLViewerImage;
|
||||
class LLViewerRegion;
|
||||
|
||||
// Constants for sendLandOwner
|
||||
|
|
@ -72,49 +73,6 @@ public:
|
|||
virtual void changed() = 0;
|
||||
};
|
||||
|
||||
class LLParcelSelection : public LLRefCount
|
||||
{
|
||||
friend class LLViewerParcelMgr;
|
||||
|
||||
protected:
|
||||
~LLParcelSelection();
|
||||
|
||||
public:
|
||||
LLParcelSelection(LLParcel* parcel);
|
||||
LLParcelSelection();
|
||||
|
||||
// this can return NULL at any time, as parcel selection
|
||||
// might have been invalidated.
|
||||
LLParcel* getParcel() { return mParcel; }
|
||||
|
||||
// Return the number of grid units that are owned by you within
|
||||
// the selection (computed by server).
|
||||
S32 getSelfCount() const { return mSelectedSelfCount; }
|
||||
|
||||
// Returns area that will actually be claimed in meters squared.
|
||||
S32 getClaimableArea() const;
|
||||
bool hasOthersSelected() const;
|
||||
|
||||
// Does the selection have multiple land owners in it?
|
||||
BOOL getMultipleOwners() const;
|
||||
|
||||
// Is the entire parcel selected, or just a part?
|
||||
BOOL getWholeParcelSelected() const;
|
||||
|
||||
protected:
|
||||
void setParcel(LLParcel* parcel) { mParcel = parcel; }
|
||||
|
||||
protected:
|
||||
|
||||
LLParcel* mParcel;
|
||||
BOOL mSelectedMultipleOwners;
|
||||
BOOL mWholeParcelSelected;
|
||||
S32 mSelectedSelfCount;
|
||||
S32 mSelectedOtherCount;
|
||||
S32 mSelectedPublicCount;
|
||||
};
|
||||
|
||||
typedef LLHandle<LLParcelSelection> LLParcelSelectionHandle;
|
||||
|
||||
class LLViewerParcelMgr
|
||||
{
|
||||
|
|
@ -231,7 +189,7 @@ public:
|
|||
// containing the southwest corner of the selection.
|
||||
// If want_reply_to_update, simulator will send back a ParcelProperties
|
||||
// message.
|
||||
void sendParcelPropertiesUpdate(LLParcel* parcel);
|
||||
void sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region = false);
|
||||
|
||||
// Takes an Access List flag, like AL_ACCESS or AL_BAN
|
||||
void sendParcelAccessListUpdate(U32 which);
|
||||
|
|
@ -300,7 +258,7 @@ public:
|
|||
static BOOL isParcelOwnedByAgent(const LLParcel* parcelp, U64 group_proxy_power);
|
||||
static BOOL isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power);
|
||||
|
||||
protected:
|
||||
private:
|
||||
static void releaseAlertCB(S32 option, void *data);
|
||||
|
||||
// If the user is claiming land and the current selection
|
||||
|
|
@ -322,6 +280,8 @@ protected:
|
|||
static void callbackJoinLand(S32 option, void* data);
|
||||
|
||||
//void finishClaim(BOOL user_to_user_sale, U32 join);
|
||||
LLViewerImage* getBlockedImage() const;
|
||||
LLViewerImage* getPassImage() const;
|
||||
|
||||
private:
|
||||
BOOL mSelected;
|
||||
|
|
@ -367,8 +327,6 @@ private:
|
|||
LLFrameTimer mCollisionTimer;
|
||||
LLUUID mBlockedImageID;
|
||||
LLUUID mPassImageID;
|
||||
LLPointer<LLViewerImage> mBlockedImage;
|
||||
LLPointer<LLViewerImage> mPassImage;
|
||||
|
||||
// Media
|
||||
S32 mMediaParcelId;
|
||||
|
|
|
|||
|
|
@ -1360,6 +1360,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
|
|||
capabilityNames.append("MapLayerGod");
|
||||
capabilityNames.append("NewFileAgentInventory");
|
||||
capabilityNames.append("ParcelGodReserveForNewbie");
|
||||
capabilityNames.append("ParcelPropertiesUpdate");
|
||||
capabilityNames.append("ParcelVoiceInfoRequest");
|
||||
capabilityNames.append("ProvisionVoiceAccountRequest");
|
||||
capabilityNames.append("RemoteParcelRequest");
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@
|
|||
#include "linked_lists.h"
|
||||
#include "llassetstorage.h"
|
||||
#include "llfontgl.h"
|
||||
#include "llmediaengine.h" // mute on minimize
|
||||
#include "llrect.h"
|
||||
#include "llsky.h"
|
||||
#include "llstring.h"
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@
|
|||
|
||||
#include "llwindow.h"
|
||||
|
||||
//#include "llfloaterhtml.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llfloaterhtmlhelp.h"
|
||||
|
||||
// static
|
||||
void LLWeb::initClass()
|
||||
|
|
@ -48,7 +48,14 @@ void LLWeb::initClass()
|
|||
// static
|
||||
void LLWeb::loadURL(const std::string& url)
|
||||
{
|
||||
loadURLExternal(url);
|
||||
if (gSavedSettings.getBOOL("UseExternalBrowser"))
|
||||
{
|
||||
loadURLExternal(url);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterMediaBrowser::showInstance(url);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -56,9 +63,7 @@ void LLWeb::loadURL(const std::string& url)
|
|||
void LLWeb::loadURLExternal(const std::string& url)
|
||||
{
|
||||
std::string escaped_url = escapeURL(url);
|
||||
#if LL_LIBXUL_ENABLED
|
||||
spawn_web_browser(escaped_url.c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -638,7 +638,7 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerImage* image
|
|||
bool alpha = te->getColor().mV[3] < 0.999f;
|
||||
if (imagep)
|
||||
{
|
||||
alpha = alpha || (imagep->getComponents() == 4) || (imagep->getComponents() == 2);
|
||||
alpha = alpha || (imagep->getComponents() == 4 && ! imagep->mIsMediaTexture) || (imagep->getComponents() == 2);
|
||||
}
|
||||
|
||||
if (alpha)
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
|
|
@ -50,6 +50,7 @@
|
|||
#define IDC_CURSOR4 153
|
||||
#define IDC_CURSOR5 154
|
||||
#define IDI_LCD_LL_ICON 157
|
||||
#define IDC_CURSOR6 158
|
||||
#define IDC_RADIO_56 1000
|
||||
#define IDC_RADIO_128 1001
|
||||
#define IDC_RADIO_256 1002
|
||||
|
|
@ -182,6 +183,7 @@
|
|||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 159
|
||||
#define _APS_NEXT_RESOURCE_VALUE 167
|
||||
#define _APS_NEXT_COMMAND_VALUE 40002
|
||||
#define _APS_NEXT_CONTROL_VALUE 1139
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
|
|
@ -116,7 +116,7 @@ namespace tut
|
|||
LLTimer timer;
|
||||
timer.setTimerExpirySec(timeout);
|
||||
|
||||
while(!mSawCompleted && !timer.hasExpired())
|
||||
while(!mSawCompleted && !mSawCompletedHeader && !timer.hasExpired())
|
||||
{
|
||||
if (mServerPump)
|
||||
{
|
||||
|
|
@ -167,13 +167,19 @@ namespace tut
|
|||
{
|
||||
return mResult;
|
||||
}
|
||||
LLSD getHeader()
|
||||
{
|
||||
return mHeader;
|
||||
}
|
||||
|
||||
protected:
|
||||
bool mSawError;
|
||||
U32 mStatus;
|
||||
std::string mReason;
|
||||
bool mSawCompleted;
|
||||
bool mSawCompletedHeader;
|
||||
LLSD mResult;
|
||||
LLSD mHeader;
|
||||
bool mResultDeleted;
|
||||
|
||||
class Result : public LLHTTPClient::Responder
|
||||
|
|
@ -216,6 +222,14 @@ namespace tut
|
|||
mClient.mSawCompleted = true;
|
||||
}
|
||||
|
||||
virtual void completedHeader(
|
||||
U32 status, const std::string& reason,
|
||||
const LLSD& content)
|
||||
{
|
||||
mClient.mHeader = content;
|
||||
mClient.mSawCompletedHeader = true;
|
||||
}
|
||||
|
||||
private:
|
||||
HTTPClientTestData& mClient;
|
||||
};
|
||||
|
|
@ -228,7 +242,9 @@ namespace tut
|
|||
mSawError = false;
|
||||
mStatus = 0;
|
||||
mSawCompleted = false;
|
||||
mSawCompletedHeader = false;
|
||||
mResult.clear();
|
||||
mHeader.clear();
|
||||
mResultDeleted = false;
|
||||
|
||||
return Result::build(*this);
|
||||
|
|
@ -344,9 +360,19 @@ namespace tut
|
|||
LLSD body = result["body"];
|
||||
ensure_equals("echoed result matches", body.size(), expected.size());
|
||||
}
|
||||
|
||||
template<> template<>
|
||||
void HTTPClientTestObject::test<8>()
|
||||
void HTTPClientTestObject::test<8>()
|
||||
{
|
||||
// This is testing for the presence of the Header in the returned results
|
||||
// from an HTTP::get call.
|
||||
LLHTTPClient::get("http://www.secondlife.com/", newResult());
|
||||
runThePump();
|
||||
ensureStatusOK();
|
||||
LLSD header = getHeader();
|
||||
ensure_equals("got a header", header.emptyMap().asBoolean(), FALSE);
|
||||
}
|
||||
template<> template<>
|
||||
void HTTPClientTestObject::test<9>()
|
||||
{
|
||||
LLHTTPClient::head("http://www.secondlife.com/", newResult());
|
||||
runThePump();
|
||||
|
|
|
|||
|
|
@ -8714,6 +8714,14 @@ version 2.0
|
|||
{ MediaID LLUUID }
|
||||
{ MediaAutoScale U8 }
|
||||
}
|
||||
{
|
||||
DataBlockExtended Single
|
||||
{ MediaType Variable 1 }
|
||||
{ MediaDesc Variable 1 }
|
||||
{ MediaWidth S32 }
|
||||
{ MediaHeight S32 }
|
||||
{ MediaLoop U8 }
|
||||
}
|
||||
}
|
||||
|
||||
// LandStatRequest
|
||||
|
|
|
|||
Loading…
Reference in New Issue