Merge branch 'master' of git://github.com/siana/SingularityViewer
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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*);
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 ¬ification, 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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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'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" />
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -108,6 +108,9 @@
|
||||
<action description="Allow 'Set Home to Here' on group land"
|
||||
longdescription="Members in a Role with this Ability can use World menu > Set Home to Here on a parcel deeded to this group."
|
||||
name="land allow set home" value="28" />
|
||||
<action description="Allow 'Event Hosting' 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."
|
||||
|
||||
468
indra/newview/slfloatermediafilter.cpp
Normal file
468
indra/newview/slfloatermediafilter.cpp
Normal 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();
|
||||
}
|
||||
72
indra/newview/slfloatermediafilter.h
Normal file
72
indra/newview/slfloatermediafilter.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user