Merge branch 'master' of git://github.com/siana/SingularityViewer

This commit is contained in:
narv
2011-04-09 07:52:04 -07:00
35 changed files with 1384 additions and 187 deletions

View File

@@ -35,7 +35,7 @@
const S32 LL_VERSION_MAJOR = 1;
const S32 LL_VERSION_MINOR = 5;
const S32 LL_VERSION_PATCH = 5;
const S32 LL_VERSION_PATCH = 6;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Singularity";

View File

@@ -195,8 +195,6 @@ void LLParcel::init(const LLUUID &owner_id,
mMediaID.setNull();
mMediaAutoScale = 0;
mMediaLoop = TRUE;
mObscureMedia = 1;
mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
@@ -692,8 +690,8 @@ void LLParcel::packMessage(LLSD& msg)
msg["auto_scale"] = getMediaAutoScale();
msg["media_loop"] = getMediaLoop();
msg["media_current_url"] = getMediaCurrentURL();
msg["obscure_media"] = getObscureMedia();
msg["obscure_music"] = getObscureMusic();
msg["obscure_media"] = FALSE; // OBSOLETE - no longer used
msg["obscure_music"] = FALSE; // OBSOLETE - no longer used
msg["media_id"] = getMediaID();
msg["media_allow_navigate"] = getMediaAllowNavigate();
msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
@@ -757,16 +755,12 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getS32("MediaData", "MediaWidth", mMediaWidth);
msg->getS32("MediaData", "MediaHeight", mMediaHeight);
msg->getU8 ( "MediaData", "MediaLoop", mMediaLoop );
msg->getU8 ( "MediaData", "ObscureMedia", mObscureMedia );
msg->getU8 ( "MediaData", "ObscureMusic", mObscureMusic );
}
else
{
setMediaType(std::string("video/vnd.secondlife.qt.legacy"));
setMediaDesc(std::string("No Description available without Server Upgrade"));
mMediaLoop = true;
mObscureMedia = true;
mObscureMusic = true;
}
if(msg->getNumberOfBlocks("MediaLinkSharing") > 0)
@@ -1232,8 +1226,6 @@ void LLParcel::clearParcel()
setMediaDesc(LLStringUtil::null);
setMediaAutoScale(0);
setMediaLoop(TRUE);
mObscureMedia = 1;
mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);

View File

@@ -243,8 +243,6 @@ public:
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);
void setMediaCurrentURL(const std::string& url);
@@ -351,8 +349,6 @@ public:
U8 getMediaAutoScale() const { return mMediaAutoScale; }
U8 getMediaLoop() const { return mMediaLoop; }
const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
U8 getObscureMedia() const { return mObscureMedia; }
U8 getObscureMusic() const { return mObscureMusic; }
U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
@@ -644,8 +640,6 @@ protected:
U8 mMediaAutoScale;
U8 mMediaLoop;
std::string mMediaCurrentURL;
U8 mObscureMedia;
U8 mObscureMusic;
LLUUID mMediaID;
U8 mMediaURLFilterEnable;
LLSD mMediaURLFilterList;

View File

@@ -64,6 +64,7 @@ include_directories(
)
set(viewer_SOURCE_FILES
slfloatermediafilter.cpp
floaterlocalassetbrowse.cpp
aoremotectrl.cpp
floaterao.cpp
@@ -536,6 +537,7 @@ set(viewer_HEADER_FILES
CMakeLists.txt
ViewerInstall.cmake
slfloatermediafilter.h
floaterlocalassetbrowse.h
aoremotectrl.h
floaterao.h

View File

@@ -10,6 +10,34 @@
</array>
<key>MediaEnableFilter</key>
<map>
<key>Comment</key>
<string>Enable media domain filtering</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>MediaFilterRect</key>
<map>
<key>Comment</key>
<string>Rectangle for Media Filter floater</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Rect</string>
<key>Value</key>
<array>
<integer>0</integer>
<integer>100</integer>
<integer>100</integer>
<integer>100</integer>
</array>
</map>
<key>UseServersideWindlightSettings</key>
<map>
<key>Comment</key>
@@ -12955,7 +12983,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>1</integer>
</map>
<key>VectorizePerfTest</key>
<map>

View File

@@ -53,9 +53,11 @@ WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
RenderTextureMemoryMultiple 1 1.0
RenderUseFBO 1 1
RenderDeferred 1 1
RenderFastAlpha 1 1
//
// Low Graphics Settings
@@ -63,10 +65,10 @@ RenderShaderLightingMaxLevel 1 3
list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
RenderAvatarLODFactor 1 0.25
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0.5
RenderFlexTimeFactor 1 0.1
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 0
RenderMaxPartCount 1 1024
@@ -74,13 +76,16 @@ RenderObjectBump 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTreeLODFactor 1 0.5
RenderTreeLODFactor 1 0.25
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
RenderVolumeLODFactor 1 0.5
RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
RenderUseFBO 0 0
RenderDeferred 0 0
RenderFastAlpha 0 0
//
// Mid Graphics Settings
@@ -91,7 +96,7 @@ RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderFlexTimeFactor 1 0.5
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 1
RenderMaxPartCount 1 2048
@@ -106,6 +111,10 @@ RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
RenderUseFBO 1 0
RenderDeferred 1 0
RenderFastAlpha 1 0
//
// High Graphics Settings (purty)
@@ -131,6 +140,10 @@ RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 48
RenderUseFBO 1 0
RenderDeferred 1 0
RenderFastAlpha 1 0
//
// Ultra graphics (REALLY PURTY!)
@@ -156,6 +169,9 @@ RenderWaterReflections 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderUseFBO 1 1
RenderDeferred 1 1
RenderFastAlpha 1 1
//
// Class Unknown Hardware (unknown)

View File

@@ -53,7 +53,11 @@ WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderShaderLightingMaxLevel 1 3
RenderTextureMemoryMultiple 1 1.0
RenderUseFBO 1 1
RenderDeferred 1 1
RenderFastAlpha 1 1
//
// Low Graphics Settings
@@ -61,10 +65,10 @@ RenderTextureMemoryMultiple 1 1.0
list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
RenderAvatarLODFactor 1 0.25
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0.5
RenderFlexTimeFactor 1 0.1
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 0
RenderMaxPartCount 1 1024
@@ -72,13 +76,16 @@ RenderObjectBump 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTreeLODFactor 1 0.5
RenderTreeLODFactor 1 0.25
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
RenderVolumeLODFactor 1 0.5
RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
RenderUseFBO 0 0
RenderDeferred 0 0
RenderFastAlpha 0 0
//
// Mid Graphics Settings
@@ -89,7 +96,7 @@ RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderFlexTimeFactor 1 0.5
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 1
RenderMaxPartCount 1 2048
@@ -104,6 +111,10 @@ RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
RenderUseFBO 1 0
RenderDeferred 1 0
RenderFastAlpha 1 0
//
// High Graphics Settings (purty)
@@ -129,6 +140,10 @@ RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 48
RenderUseFBO 1 0
RenderDeferred 1 0
RenderFastAlpha 1 0
//
// Ultra graphics (REALLY PURTY!)
@@ -154,6 +169,10 @@ RenderWaterReflections 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderUseFBO 1 1
RenderDeferred 1 1
RenderFastAlpha 1 1
//
// Class Unknown Hardware (unknown)
@@ -219,6 +238,9 @@ RenderUseImpostors 0 0
RenderVBOEnable 1 0
RenderWaterReflections 0 0
WindLightUseAtmosShaders 0 0
RenderUseFBO 1 0
RenderDeferred 1 0
//
// CPU based feature masks

View File

@@ -23,39 +23,41 @@ version 20
// NOTE: All settings are set to the MIN of applied values, including 'all'!
//
list all
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 0
RenderCubeMap 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
RenderLightingDetail 1 1
RenderMaxPartCount 1 8192
RenderNightBrightness 1 1.0
RenderObjectBump 1 1
RenderReflectionDetail 1 3
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVolumeLODFactor 1 2.0
RenderWaterReflections 1 1
UseOcclusion 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderUseCleverUI 1 1
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 0.5
RenderAnisotropic 1 0
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
RenderLightingDetail 1 1
RenderMaxPartCount 1 8192
RenderNightBrightness 1 1.0
RenderObjectBump 1 1
RenderReflectionDetail 1 3
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVolumeLODFactor 1 2.0
RenderWaterReflections 1 1
UseStartScreen 1 1
UseOcclusion 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderShaderLightingMaxLevel 1 3
RenderTextureMemoryMultiple 1 1.0
RenderUseFBO 1 1
RenderDeferred 1 1
RenderFastAlpha 1 1
//
// Low Graphics Settings
@@ -63,10 +65,10 @@ Disregard96DefaultDrawDistance 1 1
list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
RenderAvatarLODFactor 1 0.25
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0.5
RenderFlexTimeFactor 1 0.1
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 0
RenderMaxPartCount 1 1024
@@ -74,13 +76,16 @@ RenderObjectBump 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTreeLODFactor 1 0.5
RenderTreeLODFactor 1 0.25
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
RenderVolumeLODFactor 1 0.5
RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
RenderUseFBO 0 0
RenderDeferred 0 0
RenderFastAlpha 0 0
//
// Mid Graphics Settings
@@ -91,7 +96,7 @@ RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderFlexTimeFactor 1 0.5
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 1
RenderMaxPartCount 1 2048
@@ -106,6 +111,10 @@ RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
RenderUseFBO 1 0
RenderDeferred 1 0
RenderFastAlpha 1 0
//
// High Graphics Settings (purty)
@@ -131,6 +140,10 @@ RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 48
RenderUseFBO 1 0
RenderDeferred 1 0
RenderFastAlpha 1 0
//
// Ultra graphics (REALLY PURTY!)
@@ -156,6 +169,9 @@ RenderWaterReflections 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderUseFBO 1 1
RenderDeferred 1 1
RenderFastAlpha 1 1
//
// Class Unknown Hardware (unknown)

View File

@@ -997,6 +997,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
BOOL rebuild_binormal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_BINORMAL);
const LLTextureEntry *tep = mVObjp->getTE(f);
if (!tep) rebuild_color = FALSE; // can't get color when tep is NULL
U8 bump_code = tep ? tep->getBumpmap() : 0;
if (rebuild_pos)
@@ -1094,9 +1095,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
LLColor4U color = tep->getColor();
LLColor4U color = (tep ? LLColor4U(tep->getColor()) : LLColor4U::white);
if (rebuild_color)
if (rebuild_color) // FALSE if tep == NULL
{
if (tep)
{

View File

@@ -169,7 +169,7 @@ void LLMediaRemoteCtrl::enableMediaButtons()
{
// Set the tooltip
// Put this text into xui file
media_url = parcel->getObscureMedia() ? mControls->getString("media_hidden_label") : parcel->getMediaURL();
media_url = parcel->getMediaURL();
media_type = parcel->getMediaType();
play_media_enabled = true;

View File

@@ -477,6 +477,23 @@ void LLOverlayBar::setCancelTPButtonVisible(BOOL b, const std::string& label)
}
////////////////////////////////////////////////////////////////////////////////
void LLOverlayBar::audioFilterPlay()
{
if (gOverlayBar && gOverlayBar->mMusicState != PLAYING)
{
gOverlayBar->mMusicState = PLAYING;
}
}
void LLOverlayBar::audioFilterStop()
{
if (gOverlayBar && gOverlayBar->mMusicState != STOPPED)
{
gOverlayBar->mMusicState = STOPPED;
}
}
////////////////////////////////////////////////////////////////////////////////
// static media helpers
// *TODO: Move this into an audio manager abstraction

View File

@@ -78,6 +78,9 @@ public:
static void onClickResetView(void* data);
static void onClickFlycam(void* data);
static void audioFilterPlay();
static void audioFilterStop();
//static media helper functions
static void toggleMediaPlay(void*);
static void toggleMusicPlay(void*);

View File

@@ -254,7 +254,7 @@ BOOL LLPanelGroupGeneral::postBuild()
LLStringUtil::format_map_t args;
args["[GROUPCREATEFEE]"] = gHippoGridManager->getConnectedGrid()->getGroupCreationFee();
mIncompleteMemberDataStr = getString("incomplete_member_data_str");
mConfirmGroupCreateStr = getString("confirm_group_create_str");
mConfirmGroupCreateStr = getString("confirm_group_create_str", args);
// If the group_id is null, then we are creating a new group
if (mGroupID.isNull())

View File

@@ -74,8 +74,7 @@ LLPanelLandAudio::LLPanelLandAudio(LLParcelSelectionHandle& parcel)
mCheckSoundLocal(NULL),
mSoundHelpButton(NULL),
mRadioVoiceChat(NULL),
mMusicURLEdit(NULL),
mMusicUrlCheck(NULL)
mMusicURLEdit(NULL)
{
}
@@ -100,9 +99,6 @@ BOOL LLPanelLandAudio::postBuild()
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
mMusicUrlCheck = getChild<LLCheckBoxCtrl>("hide_music_url");
childSetCommitCallback("hide_music_url", onCommitAny, this);
return TRUE;
}
@@ -126,12 +122,6 @@ void LLPanelLandAudio::refresh()
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
mMusicUrlCheck->set( parcel->getObscureMusic() );
mMusicUrlCheck->setEnabled( can_change_media );
bool obscure_music = ! can_change_media && parcel->getObscureMusic();
mMusicURLEdit->setDrawAsterixes( obscure_music );
mCheckSoundLocal->set( parcel->getSoundLocal() );
mCheckSoundLocal->setEnabled( can_change_media );
@@ -166,8 +156,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
BOOL sound_local = self->mCheckSoundLocal->get();
int voice_setting = self->mRadioVoiceChat->getSelectedIndex();
std::string music_url = self->mMusicURLEdit->getText();
U8 obscure_music = self->mMusicUrlCheck->get();
BOOL voice_enabled;
BOOL voice_estate_chan;
@@ -197,7 +185,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
parcel->setMusicURL(music_url);
parcel->setObscureMusic(obscure_music);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );

View File

@@ -74,8 +74,7 @@ LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
mMediaSizeCtrlLabel(NULL),
mMediaTextureCtrl(NULL),
mMediaAutoScaleCheck(NULL),
mMediaLoopCheck(NULL),
mMediaUrlCheck(NULL)
mMediaLoopCheck(NULL)
{
}
@@ -101,9 +100,6 @@ BOOL LLPanelLandMedia::postBuild()
mMediaLoopCheck = getChild<LLCheckBoxCtrl>("media_loop");
childSetCommitCallback("media_loop", onCommitAny, this );
mMediaUrlCheck = getChild<LLCheckBoxCtrl>("hide_media_url");
childSetCommitCallback("hide_media_url", onCommitAny, this );
mMediaURLEdit = getChild<LLLineEditor>("media_url");
childSetCommitCallback("media_url", onCommitAny, this );
@@ -186,25 +182,6 @@ void LLPanelLandMedia::refresh()
mMediaTypeCombo->setEnabled( can_change_media );
childSetText("mime_type", mime_type);
mMediaUrlCheck->set( parcel->getObscureMedia() );
mMediaUrlCheck->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();
// Special code to disable asterixes for html type
if(mime_type == "text/html")
{
obscure_media = false;
mMediaUrlCheck->set( 0 );
mMediaUrlCheck->setEnabled( false );
}
mMediaURLEdit->setDrawAsterixes( obscure_media );
mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
mMediaAutoScaleCheck->setEnabled ( can_change_media );
@@ -369,7 +346,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
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();
F32 media_reset_time = (F32)self->mMediaResetCtrl->get();
S32 media_width = (S32)self->mMediaWidthCtrl->get();
S32 media_height = (S32)self->mMediaHeightCtrl->get();
@@ -392,7 +368,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
parcel->setMediaID(media_id);
parcel->setMediaAutoScale ( media_auto_scale );
parcel->setMediaLoop ( media_loop );
parcel->setObscureMedia( obscure_media );
parcel->setMediaURLFilterEnable(navigate_filter);
parcel->setMediaAllowNavigate(navigate_allow);
parcel->setMediaURLTimeout(media_reset_time);

View File

@@ -1497,7 +1497,7 @@ bool idle_startup()
}
else
{
emsg << "Unable to connect to " << LLAppViewer::instance()->getSecondLifeTitle() << ".\n";
emsg << "Unable to connect to " << gHippoGridManager->getCurrentGrid()->getGridName() << ".\n";
emsg << LLUserAuth::getInstance()->errorMessage();
}
break;
@@ -2846,6 +2846,8 @@ bool idle_startup()
{
set_startup_status(1.0, "", "");
LLViewerParcelMedia::loadDomainFilterList();
// Let the map know about the inventory.
if(gFloaterWorldMap)
{

View File

@@ -61,6 +61,7 @@
#include "llworld.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
#include "llviewerparcelmedia.h"
#include "llviewerparcelmgr.h"
#include "llparcel.h"
#include "llnotify.h"
@@ -313,7 +314,7 @@ static bool handleAudioStreamMusicChanged(const LLSD& newvalue)
// otherwise music will briefly stop
if ( !gAudiop->isInternetStreamPlaying() )
{
gAudiop->startInternetStream(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL());
LLViewerParcelMedia::playStreamingMusic(LLViewerParcelMgr::getInstance()->getAgentParcel());
}
}
}

View File

@@ -189,9 +189,9 @@ void LLViewerInventoryItem::updateServer(BOOL is_new) const
if(!mIsComplete)
{
// *FIX: deal with this better.
// If we're crashing here then the UI is incorrectly enabled.
llwarns << "LLViewerInventoryItem::updateServer() - for incomplete item"
<< llendl;
LLNotifications::instance().add("IncompleteInventoryItem");
return;
}
LLInventoryModel::LLCategoryUpdate up(mParentUUID, is_new ? 1 : 0);

View File

@@ -114,7 +114,7 @@ void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
((LLV4Matrix3)blend_mat).multiply(normals[index], o_normals[index]);
}
//setBuffer(0) called in LLVOAvatar::renderSkinned
buffer->setBuffer(0);
}
bool LLViewerJointMesh::supportsSSE2()
{

View File

@@ -252,6 +252,7 @@
#include "llfloaterdisplayname.h"
#include "llavatarnamecache.h"
#include "floaterao.h"
#include "slfloatermediafilter.h"
#include "hippogridmanager.h"
@@ -6470,6 +6471,10 @@ class LLShowFloater : public view_listener_t
{
LLFloaterMute::toggleInstance();
}
else if (floater_name == "media filter")
{
SLFloaterMediaFilter::toggleInstance();
}
else if (floater_name == "camera controls")
{
LLFloaterCamera::toggleInstance();
@@ -6629,6 +6634,10 @@ class LLFloaterVisible : public view_listener_t
{
new_value = LLFloaterMute::instanceVisible();
}
else if (floater_name == "media filter")
{
new_value = SLFloaterMediaFilter::instanceVisible();
}
else if (floater_name == "camera controls")
{
new_value = LLFloaterCamera::instanceVisible();

View File

@@ -1092,6 +1092,9 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
gColors.getColor( "NetMapGroupOwnBelowWater" );
F32 max_radius = gSavedSettings.getF32("MiniMapPrimMaxRadius");
static const F32 MAX_ALTITUDE_ABOVE_SELF = 256.f;
F32 max_altitude = gAgent.getPositionGlobal()[VZ] + MAX_ALTITUDE_ABOVE_SELF;
for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
{
@@ -1104,11 +1107,12 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
continue;
}
const LLVector3& scale = objectp->getScale();
const LLVector3d pos = objectp->getPositionGlobal();
const F64 water_height = F64( objectp->getRegion()->getWaterHeight() );
// LLWorld::getInstance()->getWaterHeight();
F32 approx_radius = (scale.mV[VX] + scale.mV[VY]) * 0.5f * 0.5f * 1.3f; // 1.3 is a fudge
// Limit the size of megaprims so they don't blot out everything on the minimap.
@@ -1124,7 +1128,7 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
approx_radius = MIN_RADIUS_FOR_OWNED_OBJECTS;
}
if( pos.mdV[VZ] >= water_height )
{
if ( objectp->permGroupOwner() )
@@ -1133,8 +1137,8 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
}
else
{
color = you_own_above_water_color;
}
color = you_own_above_water_color;
}
}
else
{
@@ -1142,14 +1146,17 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
color = group_own_below_water_color;
}
else
{
color = you_own_below_water_color;
else
{
color = you_own_below_water_color;
}
}
}
else if ( pos[VZ] > max_altitude )
{
continue;
}
else
if( pos.mdV[VZ] < water_height )
else if ( pos.mdV[VZ] < water_height )
{
color = below_water_color;
}

View File

@@ -46,17 +46,27 @@
#include "llviewerwindow.h"
#include "llfirstuse.h"
#include "llpluginclassmedia.h"
#include "llnotify.h"
#include "llsdserialize.h"
#include "llaudioengine.h"
#include "lloverlaybar.h"
#include "slfloatermediafilter.h"
// Static Variables
S32 LLViewerParcelMedia::sMediaParcelLocalID = 0;
LLUUID LLViewerParcelMedia::sMediaRegionID;
viewer_media_t LLViewerParcelMedia::sMediaImpl;
bool LLViewerParcelMedia::sIsUserAction = false;
bool LLViewerParcelMedia::sMediaFilterListLoaded = false;
LLSD LLViewerParcelMedia::sMediaFilterList;
std::set<std::string> LLViewerParcelMedia::sMediaQueries;
std::set<std::string> LLViewerParcelMedia::sAllowedMedia;
std::set<std::string> LLViewerParcelMedia::sDeniedMedia;
// Local functions
bool callback_play_media(const LLSD& notification, const LLSD& response, LLParcel* parcel);
void callback_media_alert(const LLSD& notification, const LLSD& response, LLParcel* parcel, U32 type, std::string domain);
// static
void LLViewerParcelMedia::initClass()
@@ -175,7 +185,7 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
}
// static
void LLViewerParcelMedia::play(LLParcel* parcel)
void LLViewerParcelMedia::play(LLParcel* parcel, bool filter)
{
lldebugs << "LLViewerParcelMedia::play" << llendl;
@@ -185,7 +195,17 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
return;
std::string media_url = parcel->getMediaURL();
std::string media_current_url = parcel->getMediaCurrentURL();
LLStringUtil::trim(media_url);
if (!media_url.empty() && gSavedSettings.getBOOL("MediaEnableFilter") && (filter || !allowedMedia(media_url)))
{
// If filtering is needed or in case media_url just changed
// to something we did not yet approve.
LLViewerParcelMediaAutoPlay::playStarted();
filterMedia(parcel, 0);
return;
}
std::string mime_type = parcel->getMediaType();
LLUUID placeholder_texture_id = parcel->getMediaID();
U8 media_auto_scale = parcel->getMediaAutoScale();
@@ -575,3 +595,421 @@ void LLViewerParcelMediaNavigationObserver::onNavigateComplete( const EventType&
}
*/
void LLViewerParcelMedia::playStreamingMusic(LLParcel* parcel, bool filter)
{
std::string music_url = parcel->getMusicURL();
LLStringUtil::trim(music_url);
if (!music_url.empty() && gSavedSettings.getBOOL("MediaEnableFilter") && (filter || !allowedMedia(music_url)))
{
// If filtering is needed or in case music_url just changed
// to something we did not yet approve.
filterMedia(parcel, 1);
}
else if (gAudiop)
{
LLStringUtil::trim(music_url);
gAudiop->startInternetStream(music_url);
if (music_url.empty())
{
LLOverlayBar::audioFilterStop();
}
else
{
LLOverlayBar::audioFilterPlay();
}
}
}
void LLViewerParcelMedia::stopStreamingMusic()
{
if (gAudiop)
{
gAudiop->stopInternetStream();
LLOverlayBar::audioFilterStop();
}
}
bool LLViewerParcelMedia::allowedMedia(std::string media_url)
{
LLStringUtil::trim(media_url);
std::string domain = extractDomain(media_url);
LLHost host;
host.setHostByName(domain);
std::string ip = host.getIPString();
if (sAllowedMedia.count(domain) || sAllowedMedia.count(ip))
{
return true;
}
std::string server;
for (S32 i = 0; i < (S32)sMediaFilterList.size(); i++)
{
server = sMediaFilterList[i]["domain"].asString();
if (server == domain || server == ip)
{
if (sMediaFilterList[i]["action"].asString() == "allow")
{
return true;
}
else
{
return false;
}
}
}
return false;
}
void LLViewerParcelMedia::filterMedia(LLParcel* parcel, U32 type)
{
std::string media_action;
std::string media_url;
std::string domain;
std::string ip;
if (parcel != LLViewerParcelMgr::getInstance()->getAgentParcel())
{
// The parcel just changed (may occur right out after a TP)
sIsUserAction = false;
return;
}
if (type == 0)
{
media_url = parcel->getMediaURL();
}
else
{
media_url = parcel->getMusicURL();
}
LLStringUtil::trim(media_url);
domain = extractDomain(media_url);
if (sMediaQueries.count(domain) > 0)
{
sIsUserAction = false;
return;
}
LLHost host;
host.setHostByName(domain);
ip = host.getIPString();
if (sIsUserAction)
{
// This was a user manual request to play this media, so give
// it another chance...
sIsUserAction = false;
bool dirty = false;
if (sDeniedMedia.count(domain))
{
sDeniedMedia.erase(domain);
dirty = true;
}
if (sDeniedMedia.count(ip))
{
sDeniedMedia.erase(ip);
dirty = true;
}
if (dirty)
{
SLFloaterMediaFilter::setDirty();
}
}
if (media_url.empty())
{
media_action == "allow";
}
else if (!sMediaFilterListLoaded || sDeniedMedia.count(domain) || sDeniedMedia.count(ip))
{
media_action = "ignore";
}
else if (sAllowedMedia.count(domain) || sAllowedMedia.count(ip))
{
media_action = "allow";
}
else
{
std::string server;
for (S32 i = 0; i < (S32)sMediaFilterList.size(); i++)
{
server = sMediaFilterList[i]["domain"].asString();
if (server == domain || server == ip)
{
media_action = sMediaFilterList[i]["action"].asString();
break;
}
}
}
if (media_action == "allow")
{
if (type == 0)
{
play(parcel, false);
}
else
{
playStreamingMusic(parcel, false);
}
return;
}
if (media_action == "ignore")
{
if (type == 1)
{
LLViewerParcelMedia::stopStreamingMusic();
}
return;
}
LLSD args;
if (ip != domain && domain.find('/') == std::string::npos)
{
args["DOMAIN"] = domain + " (" + ip + ")";
}
else
{
args["DOMAIN"] = domain;
}
if (media_action == "deny")
{
LLNotifications::instance().add("MediaBlocked", args);
if (type == 1)
{
LLViewerParcelMedia::stopStreamingMusic();
}
// So to avoid other "blocked" messages later in the session
// for this url should it be requested again by a script.
// We don't add the IP, on purpose (want to show different
// blocks for different domains pointing to the same IP).
sDeniedMedia.insert(domain);
}
else
{
sMediaQueries.insert(domain);
args["URL"] = media_url;
if (type == 0)
{
args["TYPE"] = "media";
}
else
{
args["TYPE"] = "audio";
}
LLNotifications::instance().add("MediaAlert", args, LLSD(), boost::bind(callback_media_alert, _1, _2, parcel, type, domain));
}
}
void callback_media_alert(const LLSD &notification, const LLSD &response, LLParcel* parcel, U32 type, std::string domain)
{
S32 option = LLNotification::getSelectedOption(notification, response);
LLHost host;
host.setHostByName(domain);
std::string ip = host.getIPString();
LLSD args;
if (ip != domain && domain.find('/') == std::string::npos)
{
args["DOMAIN"] = domain + " (" + ip + ")";
}
else
{
args["DOMAIN"] = domain;
}
if (option == 0 || option == 3) // Allow or Whitelist
{
LLViewerParcelMedia::sAllowedMedia.insert(domain);
if (option == 3) // Whitelist
{
LLSD newmedia;
newmedia["domain"] = domain;
newmedia["action"] = "allow";
LLViewerParcelMedia::sMediaFilterList.append(newmedia);
if (ip != domain && domain.find('/') == std::string::npos)
{
newmedia["domain"] = ip;
LLViewerParcelMedia::sMediaFilterList.append(newmedia);
}
LLViewerParcelMedia::saveDomainFilterList();
args["LISTED"] = "whitelisted";
LLNotifications::instance().add("MediaListed", args);
}
if (type == 0)
{
LLViewerParcelMedia::play(parcel, false);
}
else
{
LLViewerParcelMedia::playStreamingMusic(parcel, false);
}
}
else if (option == 1 || option == 2) // Deny or Blacklist
{
LLViewerParcelMedia::sDeniedMedia.insert(domain);
if (ip != domain && domain.find('/') == std::string::npos)
{
LLViewerParcelMedia::sDeniedMedia.insert(ip);
}
if (type == 1)
{
LLViewerParcelMedia::stopStreamingMusic();
}
if (option == 1) // Deny
{
LLNotifications::instance().add("MediaBlocked", args);
}
else // Blacklist
{
LLSD newmedia;
newmedia["domain"] = domain;
newmedia["action"] = "deny";
LLViewerParcelMedia::sMediaFilterList.append(newmedia);
if (ip != domain && domain.find('/') == std::string::npos)
{
newmedia["domain"] = ip;
LLViewerParcelMedia::sMediaFilterList.append(newmedia);
}
LLViewerParcelMedia::saveDomainFilterList();
args["LISTED"] = "blacklisted";
LLNotifications::instance().add("MediaListed", args);
}
}
LLViewerParcelMedia::sMediaQueries.erase(domain);
SLFloaterMediaFilter::setDirty();
}
void LLViewerParcelMedia::saveDomainFilterList()
{
std::string medialist_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "media_filter.xml");
llofstream medialistFile(medialist_filename);
LLSDSerialize::toPrettyXML(sMediaFilterList, medialistFile);
medialistFile.close();
}
bool LLViewerParcelMedia::loadDomainFilterList()
{
sMediaFilterListLoaded = true;
std::string medialist_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "media_filter.xml");
if (!LLFile::isfile(medialist_filename))
{
LLSD emptyllsd;
llofstream medialistFile(medialist_filename);
LLSDSerialize::toPrettyXML(emptyllsd, medialistFile);
medialistFile.close();
}
if (LLFile::isfile(medialist_filename))
{
llifstream medialistFile(medialist_filename);
LLSDSerialize::fromXML(sMediaFilterList, medialistFile);
medialistFile.close();
SLFloaterMediaFilter::setDirty();
return true;
}
else
{
return false;
}
}
void LLViewerParcelMedia::clearDomainFilterList()
{
sMediaFilterList.clear();
sAllowedMedia.clear();
sDeniedMedia.clear();
saveDomainFilterList();
LLNotifications::instance().add("MediaFiltersCleared");
SLFloaterMediaFilter::setDirty();
}
std::string LLViewerParcelMedia::extractDomain(std::string url)
{
static std::string last_region = "@";
if (url.empty())
{
return url;
}
LLStringUtil::toLower(url);
size_t pos = url.find("//");
if (pos != std::string::npos)
{
size_t count = url.size() - pos + 2;
url = url.substr(pos + 2, count);
}
// Check that there is at least one slash in the URL and add a trailing
// one if not (for media/audio URLs such as http://mydomain.net)
if (url.find('/') == std::string::npos)
{
url += '/';
}
// If there's a user:password@ part, remove it
pos = url.find('@');
if (pos != std::string::npos && pos < url.find('/')) // if '@' is not before the first '/', then it's not a user:password
{
size_t count = url.size() - pos + 1;
url = url.substr(pos + 1, count);
}
if (url.find(gAgent.getRegion()->getHost().getHostName()) == 0 || url.find(last_region) == 0)
{
// This must be a scripted object rezzed in the region:
// extend the concept of "domain" to encompass the
// scripted object server id and avoid blocking all other
// objects at once in this region...
// Get rid of any port number
pos = url.find('/'); // We earlier made sure that there's one
url = gAgent.getRegion()->getHost().getHostName() + url.substr(pos);
pos = url.find('?');
if (pos != std::string::npos)
{
// Get rid of any parameter
url = url.substr(0, pos);
}
pos = url.rfind('/');
if (pos != std::string::npos)
{
// Get rid of the filename, if any, keeping only the server + path
url = url.substr(0, pos);
}
}
else
{
pos = url.find(':');
if (pos != std::string::npos && pos < url.find('/'))
{
// Keep anything before the port number and strip the rest off
url = url.substr(0, pos);
}
else
{
pos = url.find('/'); // We earlier made sure that there's one
url = url.substr(0, pos);
}
}
// Remember this region, so to cope with requests occuring just after a
// TP out of it.
last_region = gAgent.getRegion()->getHost().getHostName();
return url;
}

View File

@@ -35,6 +35,9 @@
#include "llviewermedia.h"
// For use by other patches so they know that media filtering is implemented.
#define MEDIA_FILTERING 1
class LLMessageSystem;
class LLParcel;
class LLViewerParcelMediaNavigationObserver;
@@ -54,8 +57,20 @@ class LLViewerParcelMedia : public LLViewerMediaObserver
// 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);
static void play(LLParcel* parcel, bool filter = true);
// user clicked play button in media transport controls
static void playStreamingMusic(LLParcel* parcel, bool filter = true);
// play the parcel music stream
static void stopStreamingMusic();
// stop the parcel music stream
static void filterMedia(LLParcel* parcel, U32 type); // type: 0 = media, 1 = streaming music
static bool allowedMedia(std::string media_url);
static bool loadDomainFilterList();
static void saveDomainFilterList();
static void clearDomainFilterList();
static std::string extractDomain(std::string url);
static void stop();
// user clicked stop button in media transport controls
@@ -85,6 +100,13 @@ class LLViewerParcelMedia : public LLViewerMediaObserver
static LLUUID sMediaRegionID;
// HACK: this will change with Media on a Prim
static viewer_media_t sMediaImpl;
static bool sIsUserAction;
static bool sMediaFilterListLoaded;
static LLSD sMediaFilterList;
static std::set<std::string> sMediaQueries;
static std::set<std::string> sAllowedMedia;
static std::set<std::string> sDeniedMedia;
};

View File

@@ -86,7 +86,7 @@ LLPointer<LLViewerImage> sBlockedImage;
LLPointer<LLViewerImage> sPassImage;
// Local functions
void optionally_start_music(const std::string& music_url);
void optionally_start_music(LLParcel* parcel);
void callback_start_music(S32 option, void* data);
void optionally_prepare_video(const LLParcel *parcelp);
void callback_prepare_video(S32 option, void* data);
@@ -1689,7 +1689,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
{
if (music_url.substr(0,7) == "http://")
{
optionally_start_music(music_url);
optionally_start_music(parcel);
}
else
{
@@ -1717,18 +1717,18 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
};
}
void optionally_start_music(const std::string& music_url)
void optionally_start_music(LLParcel* parcel)
{
if (gSavedSettings.getBOOL("AudioStreamingMusic"))
{
// Make the user click the start button on the overlay bar. JC
// llinfos << "Starting parcel music " << music_url << llendl;
// llinfos << "Starting parcel music " << parcel->getMusicURL() << llendl;
// now only play music when you enter a new parcel if the control is in PLAY state
// changed as part of SL-4878
if ( gOverlayBar && gOverlayBar->musicPlaying())
if (gOverlayBar && gOverlayBar->musicPlaying())
{
gAudiop->startInternetStream(music_url);
LLViewerParcelMedia::playStreamingMusic(parcel);
}
}
}

View File

@@ -146,21 +146,23 @@ const LLMatrix4* gGLLastMatrix = NULL;
std::string gPoolNames[] =
{
// Correspond to LLDrawpool enum render type
"NONE",
"POOL_SIMPLE",
"POOL_TERRAIN",
"POOL_TERRAIN",
"POOL_BUMP",
"POOL_TREE",
"POOL_SKY",
"POOL_WL_SKY",
"POOL_GROUND",
"POOL_INVISIBLE",
"POOL_AVATAR",
"POOL_WATER",
"POOL_GRASS",
"POOL_FULLBRIGHT",
"POOL_BUMP",
"POOL_INVISIBLE",
"POOL_AVATAR",
"POOL_VOIDWATER",
"POOL_WATER",
"POOL_GLOW",
"POOL_ALPHA",
"POOL_INVALID_OUCH_CATASTROPHE_ERROR"
};
U32 nhpo2(U32 v)

View File

@@ -918,32 +918,18 @@ Only large parcels can be listed in search.
right="-12"
scale_image="true"
width="70" />
<check_box
bottom_delta="-22"
enabled="true"
follows="left|top"
font="SansSerifSmall"
height="16"
initial_value="false"
label="Hide URL"
left="80"
mouse_opaque="true"
name="hide_media_url"
radio_style="false"
tool_tip="Checking this option will hide the media URL from any non-authorized viewers of this parcel information. Note this is not available for HTML types."
width="150" />
<text
bottom_delta="0"
bottom_delta="-22"
follows="right|top"
font="SansSerifSmall"
halign="right"
halign="left"
height="16"
length="1"
name="media_reset"
right="-164"
left="80"
tool_tip="Amount of time until parcel automatically reverts to default URL (0 for never return)"
type="string"
width="185">
width="120">
Return to Home URL in:
</text>
<spinner
@@ -951,14 +937,13 @@ Only large parcels can be listed in search.
decimal_digits="0"
enabled="false"
follows="right|top"
halign="right"
height="16"
increment="1"
initial_val="0"
max_val="1024"
min_val="0"
name="media_reset_time"
right="-90"
left_delta="126"
tool_tip="Amount of time until parcel reverts to default URL (0 for never return)"
width="64" />
<text
@@ -967,12 +952,11 @@ Only large parcels can be listed in search.
font="SansSerifSmall"
halign="left"
height="16"
left_delta="70"
left_delta="72"
length="1"
name="minutes"
right="-10"
type="string">
Minutes
minutes
</text>
<text
bottom_delta="-22"
@@ -1318,20 +1302,6 @@ Select the thumbnail to choose a different texture.
name="music_url"
right="-15"
select_on_focus="true" />
<check_box
bottom_delta="-25"
enabled="true"
follows="left|top"
font="SansSerifSmall"
height="16"
initial_value="false"
label="Hide URL"
left="80"
mouse_opaque="true"
name="hide_music_url"
radio_style="false"
tool_tip="Checking this option will hide the music URL from any non-authorized viewers of this parcel information."
width="150" />
<text
bottom_delta="-65"
follows="left|top"

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floatermediafilter" title="Media Filter" rect_control="MediaFilterRect"
can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true"
height="350" width="600" min_height="350" min_width="600">
<text name="info1" font="SansSerif" mouse_opaque="true" halign="center"
bottom_delta="-45" left="20" height="20" width="560" follows="left|right|top">
Domains in bold are in the persistent list (i.e. they are whitelisted or blacklisted).
</text>
<text name="info2" font="SansSerif" mouse_opaque="true" halign="center"
bottom_delta="-20" left="20" height="20" width="560" follows="left|right|top">
Domains in italics are in the session list (i.e. they are temporarily allowed or denied).
</text>
<scroll_list name="whitelist_list" follows="top|bottom|left"
background_visible="true" mouse_opaque="true"
multi_select="false" column_padding="5" draw_border="true" draw_heading="true"
bottom_delta="-205" left="15" height="200" width="280">
<column name="whitelist_col" label="Allowed domains or server objects" dynamicwidth="true" />
</scroll_list>
<scroll_list name="blacklist_list" follows="top|bottom|right"
background_visible="true" mouse_opaque="true"
multi_select="false" column_padding="5" draw_border="true" draw_heading="true"
bottom_delta="0" right="-15" height="200" width="280">
<column name="blacklist_col" label="Blocked domains or server objects" dynamicwidth="true" />
</scroll_list>
<button name="add_whitelist" font="SansSerif" label="Add..." halign="center"
tool_tip="Add a server to the whitelist"
enabled="true" mouse_opaque="true" follows="bottom|left"
bottom_delta="-25" left="15" height="20" width="80" />
<button name="remove_whitelist" font="SansSerif" label="Remove" halign="center"
tool_tip="Remove the selected server from the whitelist"
enabled="true" mouse_opaque="true" follows="bottom|left"
bottom_delta="0" left="100" height="20" width="80" />
<button name="clear_lists" font="SansSerif" label="Clear lists" halign="center"
tool_tip="Clear all lists"
enabled="true" mouse_opaque="true" follows="bottom|left"
bottom_delta="0" left="205" height="20" width="90" />
<button name="show_ips" font="SansSerif" label="Show IPs" halign="center"
tool_tip="Show the IP associated with each domain name (makes the viewer pause while the list is refreshed, because of DNS lookups)"
enabled="true" mouse_opaque="true" follows="bottom|right"
bottom_delta="0" right="-205" height="20" width="90" />
<button name="add_blacklist" font="SansSerif" label="Add..." halign="center"
tool_tip="Add a server to the blacklist"
enabled="true" mouse_opaque="true" follows="bottom|right"
bottom_delta="0" right="-100" height="20" width="80" />
<button name="remove_blacklist" font="SansSerif" label="Remove" halign="center"
tool_tip="Remove the selected server from the blacklist"
enabled="true" mouse_opaque="true" follows="bottom|right"
bottom_delta="0" right="-15" height="20" width="80" />
<text name="add_text" font="SansSerif" mouse_opaque="true"
bottom_delta="-25" left="20" height="20" width="450" follows="left|right|bottom">
New domain:
</text>
<check_box name="match_ip" label="Add/remove matching IP" initial_value="true"
tool_tip="Add or remove any IP associated with the added or removed domain name"
font="SansSerifSmall" mouse_opaque="true" radio_style="false"
bottom_delta="2" right="-95" height="16" width="70" follows="right|bottom" />
<line_editor name="input_domain" max_length="255" font="SansSerif" enabled="false"
tool_tip="Enter the new URL, domain name, IP or scripted object HTTP server path here"
select_all_on_focus_received="true" select_on_focus="true"
bevel_style="in" border_style="line" border_thickness="1"
bottom_delta="-22" right="-100" height="20" left="15" follows="left|bottom|right"/>
<button name="commit_domain" font="SansSerif" label="Add" halign="center" enabled="false"
tool_tip="Add to the list"
mouse_opaque="true" follows="bottom|right"
bottom_delta="0" right="-15" height="20" width="80"/>
</floater>

View File

@@ -312,6 +312,11 @@
<on_click function="ShowFloater" userdata="teleport history" />
<on_check function="FloaterVisible" userdata="teleport history" />
</menu_item_check>
<menu_item_check bottom="-192" enabled="true" height="19" label="Media Filter" left="0"
mouse_opaque="true" name="Media Filter" width="211">
<on_click function="ShowFloater" userdata="media filter" />
<on_check function="FloaterVisible" userdata="media filter" />
</menu_item_check>
<menu_item_separator bottom="-197" enabled="true" height="8" label="-----------" left="0"
mouse_opaque="true" name="separator2" width="211" />
<menu_item_check bottom="-216" enabled="true" height="19" label="Camera Controls" left="0"

View File

@@ -120,6 +120,60 @@
</form>
</template>
<notification
icon="alert.tga"
name="MediaAlert"
type="alert">
The owner of this parcel has requested the following [TYPE] URL to be loaded by your viewer:
[URL]
You may choose to allow or deny the corresponding domain or in-world scripted object server:
[DOMAIN]
"Allow" and "Deny" apply only for this session, while "Blacklist" and "Whitelist" apply forever.
<form name="form">
<button
index="0"
name="Allow"
text="Allow"/>
<button
index="1"
name="Deny"
text="Deny"/>
<button
index="2"
name="Blacklist"
text="Blacklist"/>
<button
index="3"
name="Whitelist"
text="Whitelist"/>
</form>
</notification>
<notification
icon="alert.tga"
name="MediaListed"
type="alert">
Media/audio URLs for [DOMAIN] now [LISTED]
</notification>
<notification
icon="notifytip.tga"
name="MediaBlocked"
type="notifytip">
Media/audio URL blocked for [DOMAIN]
</notification>
<notification
icon="alertmodal.tga"
name="MediaFiltersCleared"
type="alertmodal">
The media filters have been cleared
</notification>
<notification
functor="GenericAcknowledge"
icon="alertmodal.tga"
@@ -5375,6 +5429,13 @@ Unable to load script. Please try again.
The complete contents you are offering are not yet locally available. Please try offering those items again in a minute.
</notification>
<notification
icon="notifytip.tga"
name="IncompleteInventoryItem"
type="notifytip">
The item you are accessing is not yet locally available. Please try again in a minute.
</notification>
<notification
icon="notifytip.tga"
name="CannotModifyProtectedCategories"

View File

@@ -7,7 +7,7 @@
follows="left|top|bottom|right" left="10" multi_select="true"
name="friend_list" right="-100" search_column="1"
tool_tip="Hold shift or control while clicking to select multiple friends"
top="-60">
top="-40">
<column image="ff_online_status_button.tga" name="icon_online_status"
tool_tip="Online status" width="20" />
<column dynamicwidth="true" label="Name" name="friend_name" tool_tip="Name" />
@@ -25,31 +25,31 @@
tool_tip="You can edit this friend&apos;s objects" width="20" />
<column name="friend_last_update_generation" width="0" />
</scroll_list>
<text bottom_delta="-40" follows="left|top" font="SansSerifSmall" height="16" left_delta="0"
<!--text bottom_delta="-40" follows="left|top" font="SansSerifSmall" height="16" left_delta="0"
name="friends" width="110">
Contact Group:
</text>
<text bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" left_delta="0"
</text-->
<text bottom_delta="-40" follows="left|top" font="SansSerifSmall" height="16" left_delta="0"
name="friends" width="110">
Contact Search:
</text>
<combo_box allow_text_entry="false" enabled="true" follows="right|top"
<!--combo_box allow_text_entry="false" enabled="true" follows="right|top"
bottom_delta="20" height="18" hidden="false" left="-255" max_chars="20" mouse_opaque="true"
tool_tip="Buddy group" name="buddy_group_combobox" width="130">
<combo_item type="string" length="20" enabled="true" name="All" value="All">
All
</combo_item>
</combo_box>
<line_editor bottom_delta="-20" enabled="true" follows="right|top" font="SansSerif"
height="18" left_delta="0" name="buddy_search_lineedit"
</combo_box-->
<line_editor bottom_delta="0" enabled="true" follows="right|top" font="SansSerif"
height="18" left="-255" name="buddy_search_lineedit"
tool_tip="The friend name you want to search for" width="130" />
<button bottom_delta="-3" follows="top|right" height="22" label="0"
left_delta="132" name="expand_collapse_btn" tool_tip="Expand/Collapse extra info"
width="22" />
<pad bottom="-7" height="0" left="-90" width="1" />
<button bottom_delta="-25" follows="top|right" height="22" label="Set Contact"
<!--button bottom_delta="-25" follows="top|right" height="22" label="Set Contact"
left_delta="0" name="assign_btn" tool_tip="Assign a friend to a Contact Group"
width="80" />-->
width="80" /-->
<button bottom_delta="-25" follows="top|right" height="22" label="IM/Call"
left_delta="0" name="im_btn" tool_tip="Open Instant Message session"
width="80" />

View File

@@ -15,7 +15,7 @@
Streaming Preferences:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-280" drop_shadow_visible="true" enabled="true" follows="left|top"
bottom="-300" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
mouse_opaque="true" name="audio_prefs_text" v_pad="0" width="128">
Audio Preferences:
@@ -38,6 +38,11 @@
initial_value="true" label="Automatically play media" left="162"
mouse_opaque="true" name="auto_streaming_video" radio_style="false"
width="338" />
<check_box bottom_delta="-20" control_name="MediaEnableFilter" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Ask for permission (enables filtering)"
left="162" mouse_opaque="true" name="streaming_video" radio_style="false"
width="338" />
<check_box bottom_delta="-25" control_name="MuteWhenMinimized" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Mute Audio When Window Minimized" left="142" mouse_opaque="true"

View File

@@ -108,6 +108,9 @@
<action description="Allow &apos;Set Home to Here&apos; on group land"
longdescription="Members in a Role with this Ability can use World menu &gt; Set Home to Here on a parcel deeded to this group."
name="land allow set home" value="28" />
<action description="Allow &apos;Event Hosting&apos; on group land"
longdescription="Members in a Role with this Ability can select group owned parcels as venus when hosting an event."
name="land allow host event" value="41" />
</action_set>
<action_set
description="These Abilities include powers to allow or restrict access to group-owned parcels, including freezing and ejecting Residents."

View File

@@ -0,0 +1,468 @@
/**
* @file slfloatermediafilter.cpp
* @brief The SLFloaterMediaFilter class definitions
*
* $LicenseInfo:firstyear=2011&license=viewergpl$
*
* Copyright (c) 2011, Sione Lomu
* with debugging and improvements by Henri Beauchamp
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "lllineeditor.h"
#include "llscrolllistctrl.h"
#include "lluictrlfactory.h"
#include "slfloatermediafilter.h"
#include "llviewercontrol.h"
#include "llviewerparcelmedia.h"
SLFloaterMediaFilter* SLFloaterMediaFilter::sInstance = NULL;
bool SLFloaterMediaFilter::sIsWhitelist = false;
bool SLFloaterMediaFilter::sShowIPs = false;
SLFloaterMediaFilter::SLFloaterMediaFilter() : LLFloater(std::string("media filter")), mIsDirty(false)
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_filter.xml");
}
SLFloaterMediaFilter::~SLFloaterMediaFilter()
{
sInstance = NULL;
}
BOOL SLFloaterMediaFilter::postBuild()
{
mWhitelistSLC = getChild<LLScrollListCtrl>("whitelist_list");
mBlacklistSLC = getChild<LLScrollListCtrl>("blacklist_list");
if (mWhitelistSLC && mBlacklistSLC)
{
childSetAction("clear_lists", onClearLists, this);
childSetAction("show_ips", onShowIPs, this);
childSetAction("add_whitelist", onWhitelistAdd, this);
childSetAction("remove_whitelist", onWhitelistRemove, this);
childSetAction("add_blacklist", onBlacklistAdd, this);
childSetAction("remove_blacklist", onBlacklistRemove, this);
childSetAction("commit_domain", onCommitDomain, this);
childSetUserData("whitelist_list", this);
childSetUserData("blacklist_list", this);
mIsDirty = true;
}
return TRUE;
}
void SLFloaterMediaFilter::draw()
{
if (mIsDirty && mWhitelistSLC && mBlacklistSLC)
{
S32 whitescrollpos = mWhitelistSLC->getScrollPos();
S32 blackscrollpos = mBlacklistSLC->getScrollPos();
mWhitelistSLC->deleteAllItems();
mBlacklistSLC->deleteAllItems();
std::set<std::string> listed;
LLHost host;
std::string ip;
std::string domain;
std::string action;
LLSD element;
element["columns"][0]["font"] = "SANSSERIF";
element["columns"][0]["font-style"] = "BOLD";
for (S32 i = 0; i < (S32)LLViewerParcelMedia::sMediaFilterList.size(); i++)
{
domain = LLViewerParcelMedia::sMediaFilterList[i]["domain"].asString();
if (sShowIPs)
{
host.setHostByName(domain);
ip = host.getIPString();
if (ip != domain && domain.find('/') == std::string::npos)
{
domain += " (" + ip + ")";
}
}
action = LLViewerParcelMedia::sMediaFilterList[i]["action"].asString();
if (!domain.empty() && action == "allow")
{
element["columns"][0]["column"] = "whitelist_col";
element["columns"][0]["value"] = domain;
//element["columns"][0]["color"] = LLColor4::green3.getValue();
mWhitelistSLC->addElement(element, ADD_BOTTOM);
listed.insert(domain);
}
else if (!domain.empty() && action == "deny")
{
element["columns"][0]["column"] = "blacklist_col";
element["columns"][0]["value"] = domain;
//element["columns"][0]["color"] = LLColor4::red2.getValue();
mBlacklistSLC->addElement(element, ADD_BOTTOM);
listed.insert(domain);
}
else
{
LL_WARNS("MediaFilter") << "Bad media filter list: removing corrupted entry for \"" << domain << "\"" << LL_ENDL;
LLViewerParcelMedia::sMediaFilterList.erase(i--);
}
}
std::set<std::string>::iterator it;
element["columns"][0]["font"] = "SANSSERIF";
element["columns"][0]["font-style"] = "ITALIC";
//element["columns"][0]["color"] = LLColor4::green3.getValue();
element["columns"][0]["column"] = "whitelist_col";
for (it = LLViewerParcelMedia::sAllowedMedia.begin(); it != LLViewerParcelMedia::sAllowedMedia.end(); it++)
{
domain = *it;
if (sShowIPs)
{
host.setHostByName(domain);
ip = host.getIPString();
if (ip != domain && domain.find('/') == std::string::npos)
{
domain += " (" + ip + ")";
}
}
if (listed.count(domain) == 0)
{
element["columns"][0]["value"] = domain;
mWhitelistSLC->addElement(element, ADD_BOTTOM);
}
}
element["columns"][0]["column"] = "blacklist_col";
for (it = LLViewerParcelMedia::sDeniedMedia.begin(); it != LLViewerParcelMedia::sDeniedMedia.end(); it++)
{
domain = *it;
if (sShowIPs)
{
host.setHostByName(domain);
ip = host.getIPString();
if (ip != domain && domain.find('/') == std::string::npos)
{
domain += " (" + ip + ")";
}
}
if (listed.count(domain) == 0)
{
element["columns"][0]["value"] = domain;
mBlacklistSLC->addElement(element, ADD_BOTTOM);
}
}
mWhitelistSLC->setScrollPos(whitescrollpos);
mBlacklistSLC->setScrollPos(blackscrollpos);
if (!gSavedSettings.getBOOL("MediaEnableFilter"))
{
childDisable("clear_lists");
childDisable("show_ips");
childDisable("blacklist_list");
childDisable("whitelist_list");
childDisable("remove_whitelist");
childDisable("add_whitelist");
childDisable("remove_blacklist");
childDisable("add_blacklist");
childDisable("match_ip");
childDisable("input_domain");
childDisable("commit_domain");
childSetText("add_text", std::string("****** WARNING: media filtering is currently DISABLED ******"));
}
mIsDirty = false;
sShowIPs = false;
}
LLFloater::draw();
}
void SLFloaterMediaFilter::setDirty()
{
if (sInstance)
{
sInstance->mIsDirty = true;
sInstance->draw();
}
}
BOOL SLFloaterMediaFilter::instanceVisible()
{
if (sInstance)
{
return sInstance->getVisible();
}
else
{
return FALSE;
}
}
void SLFloaterMediaFilter::toggleInstance()
{
if (sInstance)
{
if (sInstance->getVisible())
{
sInstance->destroy();
}
else
{
sInstance->open();
}
}
else
{
sInstance = new SLFloaterMediaFilter();
sInstance->open();
}
}
void SLFloaterMediaFilter::onClearLists(void* data)
{
LLViewerParcelMedia::clearDomainFilterList();
}
void SLFloaterMediaFilter::onShowIPs(void* data)
{
sShowIPs = true;
setDirty();
}
void SLFloaterMediaFilter::onWhitelistAdd(void* data)
{
if (!sInstance)
{
return;
}
sInstance->childDisable("clear_lists");
sInstance->childDisable("show_ips");
sInstance->childDisable("blacklist_list");
sInstance->childDisable("whitelist_list");
sInstance->childDisable("remove_whitelist");
sInstance->childDisable("add_whitelist");
sInstance->childDisable("remove_blacklist");
sInstance->childDisable("add_blacklist");
sInstance->childEnable("input_domain");
sInstance->childEnable("commit_domain");
sInstance->childSetText("add_text", std::string("Enter the domain/url to add to the white list:"));
sIsWhitelist = true;
}
void SLFloaterMediaFilter::onWhitelistRemove(void* data)
{
if (!sInstance)
{
return;
}
LLScrollListItem* selected = sInstance->mWhitelistSLC->getFirstSelected();
if (selected)
{
std::string domain = sInstance->mWhitelistSLC->getSelectedItemLabel();
size_t pos = domain.find(' ');
if (pos != std::string::npos)
{
domain = domain.substr(0, pos);
}
LLViewerParcelMedia::sAllowedMedia.erase(domain);
for (S32 i = 0; i < (S32)LLViewerParcelMedia::sMediaFilterList.size(); i++)
{
if (LLViewerParcelMedia::sMediaFilterList[i]["domain"].asString() == domain)
{
LLViewerParcelMedia::sMediaFilterList.erase(i);
break;
}
}
if (sInstance->childGetValue("match_ip") && domain.find('/') == std::string::npos)
{
LLHost host;
host.setHostByName(domain);
std::string ip = host.getIPString();
if (ip != domain)
{
LLViewerParcelMedia::sAllowedMedia.erase(ip);
for (S32 i = 0; i < (S32)LLViewerParcelMedia::sMediaFilterList.size(); i++)
{
if (LLViewerParcelMedia::sMediaFilterList[i]["domain"].asString() == ip)
{
LLViewerParcelMedia::sMediaFilterList.erase(i);
break;
}
}
}
}
LLViewerParcelMedia::saveDomainFilterList();
setDirty();
}
}
void SLFloaterMediaFilter::onBlacklistAdd(void* data)
{
if (!sInstance)
{
return;
}
sInstance->childDisable("clear_lists");
sInstance->childDisable("show_ips");
sInstance->childDisable("blacklist_list");
sInstance->childDisable("whitelist_list");
sInstance->childDisable("remove_whitelist");
sInstance->childDisable("add_whitelist");
sInstance->childDisable("remove_blacklist");
sInstance->childDisable("add_blacklist");
sInstance->childEnable("input_domain");
sInstance->childEnable("commit_domain");
sInstance->childSetText("add_text", std::string("Enter the domain/url to add to the black list:"));
sIsWhitelist = false;
}
void SLFloaterMediaFilter::onBlacklistRemove(void* data)
{
if (!sInstance)
{
return;
}
LLScrollListItem* selected = sInstance->mBlacklistSLC->getFirstSelected();
if (selected)
{
std::string domain = sInstance->mBlacklistSLC->getSelectedItemLabel();
size_t pos = domain.find(' ');
if (pos != std::string::npos)
{
domain = domain.substr(0, pos);
}
LLViewerParcelMedia::sDeniedMedia.erase(domain);
for (S32 i = 0; i < (S32)LLViewerParcelMedia::sMediaFilterList.size(); i++)
{
if (LLViewerParcelMedia::sMediaFilterList[i]["domain"].asString() == domain)
{
LLViewerParcelMedia::sMediaFilterList.erase(i);
break;
}
}
if (sInstance->childGetValue("match_ip") && domain.find('/') == std::string::npos)
{
LLHost host;
host.setHostByName(domain);
std::string ip = host.getIPString();
if (ip != domain)
{
LLViewerParcelMedia::sDeniedMedia.erase(ip);
for (S32 i = 0; i < (S32)LLViewerParcelMedia::sMediaFilterList.size(); i++)
{
if (LLViewerParcelMedia::sMediaFilterList[i]["domain"].asString() == ip)
{
LLViewerParcelMedia::sMediaFilterList.erase(i);
break;
}
}
}
}
LLViewerParcelMedia::saveDomainFilterList();
setDirty();
}
}
void SLFloaterMediaFilter::onCommitDomain(void* data)
{
if (!sInstance)
{
return;
}
std::string domain = sInstance->childGetText("input_domain");
domain = LLViewerParcelMedia::extractDomain(domain);
LLHost host;
host.setHostByName(domain);
std::string ip = host.getIPString();
bool match_ip = (sInstance->childGetValue("match_ip") && ip != domain && domain.find('/') == std::string::npos);
if (!domain.empty())
{
LLViewerParcelMedia::sDeniedMedia.erase(domain);
LLViewerParcelMedia::sAllowedMedia.erase(domain);
for (S32 i = 0; i < (S32)LLViewerParcelMedia::sMediaFilterList.size(); i++)
{
if (LLViewerParcelMedia::sMediaFilterList[i]["domain"].asString() == domain)
{
LLViewerParcelMedia::sMediaFilterList.erase(i);
}
}
if (match_ip)
{
LLViewerParcelMedia::sDeniedMedia.erase(ip);
LLViewerParcelMedia::sAllowedMedia.erase(ip);
for (S32 i = 0; i < (S32)LLViewerParcelMedia::sMediaFilterList.size(); i++)
{
if (LLViewerParcelMedia::sMediaFilterList[i]["domain"].asString() == ip)
{
LLViewerParcelMedia::sMediaFilterList.erase(i);
}
}
}
LLSD newmedia;
newmedia["domain"] = domain;
if (sIsWhitelist)
{
newmedia["action"] = "allow";
}
else
{
newmedia["action"] = "deny";
}
LLViewerParcelMedia::sMediaFilterList.append(newmedia);
if (match_ip)
{
newmedia["domain"] = ip;
LLViewerParcelMedia::sMediaFilterList.append(newmedia);
}
LLViewerParcelMedia::saveDomainFilterList();
}
sInstance->childEnable("clear_lists");
sInstance->childEnable("show_ips");
sInstance->childEnable("blacklist_list");
sInstance->childEnable("whitelist_list");
sInstance->childEnable("remove_whitelist");
sInstance->childEnable("add_whitelist");
sInstance->childEnable("remove_blacklist");
sInstance->childEnable("add_blacklist");
sInstance->childDisable("input_domain");
sInstance->childDisable("commit_domain");
sInstance->childSetText("add_text", std::string("New domain:"));
sInstance->childSetText("input_domain", std::string(""));
setDirty();
}

View File

@@ -0,0 +1,72 @@
/**
* @file slfloatermediafilter.h
* @brief The SLFloaterMediaFilter class declaration
*
* $LicenseInfo:firstyear=2011&license=viewergpl$
*
* Copyright (c) 2011, Sione Lomu
* with debugging and improvements by Henri Beauchamp
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_SLFLOATERMEDIAFILTER_H
#define LL_SLFLOATERMEDIAFILTER_H
#include "llfloater.h"
class LLScrollListCtrl;
class LLButton;
class SLFloaterMediaFilter : public LLFloater
{
public:
SLFloaterMediaFilter();
BOOL postBuild();
virtual void draw();
virtual ~SLFloaterMediaFilter();
static void setDirty();
static BOOL instanceVisible();
static void toggleInstance();
static void onClearLists(void*);
static void onShowIPs(void*);
static void onWhitelistAdd(void*);
static void onWhitelistRemove(void*);
static void onBlacklistAdd(void*);
static void onBlacklistRemove(void*);
static void onCommitDomain(void*);
private:
static bool sIsWhitelist;
static bool sShowIPs;
LLScrollListCtrl* mWhitelistSLC;
LLScrollListCtrl* mBlacklistSLC;
bool mIsDirty;
static SLFloaterMediaFilter* sInstance;
};
#endif

View File

@@ -274,6 +274,7 @@ class WindowsManifest(ViewerManifest):
try:
if self.prefix("../../libraries/i686-win32/lib/release/msvcrt", dst=""):
self.path("*.dll")
self.path("*.manifest")
self.end_prefix()
except:
pass