summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rwxr-xr-xindra/llcommon/llinitparam.h32
-rwxr-xr-xindra/llmessage/llregionflags.h2
-rwxr-xr-xindra/llui/llfolderview.cpp14
-rwxr-xr-xindra/llui/llfolderviewmodel.h33
-rw-r--r--indra/llwindow/llopenglview-objc.h3
-rw-r--r--indra/llwindow/llopenglview-objc.mm21
-rwxr-xr-xindra/llwindow/llwindow.h2
-rwxr-xr-xindra/llwindow/llwindowmacosx-objc.h1
-rwxr-xr-xindra/llwindow/llwindowmacosx-objc.mm7
-rwxr-xr-xindra/llwindow/llwindowmacosx.h5
-rwxr-xr-xindra/lscript/lscript_compile/indra.l3
-rwxr-xr-xindra/newview/CMakeLists.txt2
-rwxr-xr-xindra/newview/app_settings/keywords.ini1
-rwxr-xr-xindra/newview/app_settings/settings.xml22
-rwxr-xr-xindra/newview/llappviewer.cpp7
-rw-r--r--indra/newview/llconversationmodel.h3
-rwxr-xr-xindra/newview/llfilepicker.cpp2
-rwxr-xr-xindra/newview/llfloaterconversationpreview.cpp104
-rwxr-xr-xindra/newview/llfloaterconversationpreview.h11
-rwxr-xr-xindra/newview/llfloaterimsession.cpp2
-rwxr-xr-xindra/newview/llfloaterland.cpp43
-rwxr-xr-xindra/newview/llfloaterland.h1
-rwxr-xr-xindra/newview/llfloaterregioninfo.cpp10
-rwxr-xr-xindra/newview/llfloaterregioninfo.h1
-rwxr-xr-xindra/newview/llfloatersnapshot.cpp11
-rwxr-xr-xindra/newview/llfolderviewmodelinventory.h4
-rwxr-xr-xindra/newview/llgiveinventory.cpp2
-rwxr-xr-xindra/newview/llglsandbox.cpp3
-rwxr-xr-xindra/newview/llgroupmgr.cpp5
-rwxr-xr-xindra/newview/llgroupmgr.h2
-rwxr-xr-xindra/newview/llinventorypanel.cpp3
-rwxr-xr-xindra/newview/lllogchat.cpp483
-rwxr-xr-xindra/newview/lllogchat.h64
-rwxr-xr-xindra/newview/llpanelgroup.cpp18
-rwxr-xr-xindra/newview/llpanelobjectinventory.cpp3
-rwxr-xr-xindra/newview/llpreviewscript.cpp4
-rwxr-xr-xindra/newview/llpreviewtexture.cpp68
-rwxr-xr-xindra/newview/llpreviewtexture.h2
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp28
-rw-r--r--indra/newview/llsnapshotlivepreview.h4
-rwxr-xr-xindra/newview/lltooldraganddrop.cpp23
-rwxr-xr-xindra/newview/llviewermedia.cpp4
-rwxr-xr-xindra/newview/llviewerregion.h2
-rwxr-xr-xindra/newview/llwebsharing.cpp603
-rwxr-xr-xindra/newview/llwebsharing.h224
-rwxr-xr-xindra/newview/skins/default/xui/da/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/de/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_preview_texture.xml24
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_viewer.xml12
-rwxr-xr-xindra/newview/skins/default/xui/en/notifications.xml14
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_region_debug.xml10
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_region_general.xml27
-rwxr-xr-xindra/newview/skins/default/xui/en/strings.xml1
-rwxr-xr-xindra/newview/skins/default/xui/es/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/fr/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/it/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/ja/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/pl/strings.xml1
-rwxr-xr-xindra/newview/skins/default/xui/pt/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/ru/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/tr/strings.xml3
61 files changed, 794 insertions, 1214 deletions
diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h
index 03ab0fb67f..4bad0062a7 100755
--- a/indra/llcommon/llinitparam.h
+++ b/indra/llcommon/llinitparam.h
@@ -497,25 +497,25 @@ namespace LLInitParam
virtual ~Parser();
template <typename T> bool readValue(T& param, typename boost::disable_if<boost::is_enum<T> >::type* dummy = 0)
- {
+ {
parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));
if (found_it != mParserReadFuncs->end())
- {
+ {
return found_it->second(*this, (void*)&param);
- }
-
- return false;
}
-
+
+ return false;
+ }
+
template <typename T> bool readValue(T& param, typename boost::enable_if<boost::is_enum<T> >::type* dummy = 0)
- {
+ {
parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));
if (found_it != mParserReadFuncs->end())
- {
+ {
return found_it->second(*this, (void*)&param);
- }
+ }
else
- {
+ {
found_it = mParserReadFuncs->find(&typeid(S32));
if (found_it != mParserReadFuncs->end())
{
@@ -523,20 +523,20 @@ namespace LLInitParam
bool parsed = found_it->second(*this, (void*)&int_value);
param = (T)int_value;
return parsed;
- }
}
- return false;
}
+ return false;
+ }
template <typename T> bool writeValue(const T& param, name_stack_t& name_stack)
- {
+ {
parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));
if (found_it != mParserWriteFuncs->end())
- {
+ {
return found_it->second(*this, (const void*)&param, name_stack);
- }
- return false;
}
+ return false;
+ }
// dispatch inspection to registered inspection functions, for each parameter in a param block
template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values)
diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index 1cf940918b..40d7b04a90 100755
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -76,6 +76,8 @@ const U64 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23);
const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26);
+const U64 REGION_FLAGS_BLOCK_FLYOVER = (1 << 27);
+
const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29);
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index f32a52e6c6..13d231d712 100755
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -629,6 +629,8 @@ bool LLFolderView::startDrag()
void LLFolderView::commitRename( const LLSD& data )
{
finishRenamingItem();
+ arrange( NULL, NULL );
+
}
void LLFolderView::draw()
@@ -1599,19 +1601,21 @@ void LLFolderView::update()
// until that inventory is loaded up.
LLFastTimer t2(FTM_INVENTORY);
- if (getFolderViewModel()->getFilter().isModified() && getFolderViewModel()->getFilter().isNotDefault())
+ LLFolderViewFilter& filter_object = getFolderViewModel()->getFilter();
+
+ if (filter_object.isModified() && filter_object.isNotDefault())
{
mNeedsAutoSelect = TRUE;
}
// Filter to determine visibility before arranging
- filter(getFolderViewModel()->getFilter());
+ filter(filter_object);
// Clear the modified setting on the filter only if the filter finished after running the filter process
// Note: if the filter count has timed out, that means the filter halted before completing the entire set of items
- if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut()))
+ if (filter_object.isModified() && (!filter_object.isTimedOut()))
{
- getFolderViewModel()->getFilter().clearModified();
+ filter_object.clearModified();
}
// automatically show matching items, and select first one if we had a selection
@@ -1630,7 +1634,7 @@ void LLFolderView::update()
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
// Used by LLPlacesFolderView.
- if (getFolderViewModel()->getFilter().showAllResults())
+ if (filter_object.showAllResults())
{
// these are named variables to get around gcc not binding non-const references to rvalues
// and functor application is inherently non-const to allow for stateful functors
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index b1bcc8bbb4..a909d13f97 100755
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -386,27 +386,36 @@ template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename
class LLFolderViewModel : public LLFolderViewModelCommon
{
public:
- LLFolderViewModel(){}
- virtual ~LLFolderViewModel() {}
-
typedef SORT_TYPE SortType;
typedef ITEM_TYPE ItemType;
typedef FOLDER_TYPE FolderType;
typedef FILTER_TYPE FilterType;
- virtual SortType& getSorter() { return mSorter; }
- virtual const SortType& getSorter() const { return mSorter; }
- virtual void setSorter(const SortType& sorter) { mSorter = sorter; requestSortAll(); }
+ LLFolderViewModel(SortType* sorter, FilterType* filter)
+ : mSorter(sorter),
+ mFilter(filter)
+ {}
- virtual FilterType& getFilter() { return mFilter; }
- virtual const FilterType& getFilter() const { return mFilter; }
- virtual void setFilter(const FilterType& filter) { mFilter = filter; }
+ virtual ~LLFolderViewModel()
+ {
+ delete mSorter;
+ mSorter = NULL;
+ delete mFilter;
+ mFilter = NULL;
+ }
+
+ virtual SortType& getSorter() { return *mSorter; }
+ virtual const SortType& getSorter() const { return *mSorter; }
+ virtual void setSorter(const SortType& sorter) { mSorter = new SortType(sorter); requestSortAll(); }
+
+ virtual FilterType& getFilter() { return *mFilter; }
+ virtual const FilterType& getFilter() const { return *mFilter; }
+ virtual void setFilter(const FilterType& filter) { mFilter = new FilterType(filter); }
// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,
// this method needs to be overloaded and return the relevant fetch status.
virtual bool contentsReady() { return true; }
-
struct ViewModelCompare
{
ViewModelCompare(const SortType& sorter)
@@ -438,8 +447,8 @@ public:
}
protected:
- SortType mSorter;
- FilterType mFilter;
+ SortType* mSorter;
+ FilterType* mFilter;
};
#endif // LLFOLDERVIEWMODEL_H
diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h
index 1e0e47cd02..f1fab3b2c6 100644
--- a/indra/llwindow/llopenglview-objc.h
+++ b/indra/llwindow/llopenglview-objc.h
@@ -42,6 +42,7 @@
unsigned int mMarkedTextLength;
bool mMarkedTextAllowed;
bool mSimulatedRightClick;
+ bool mOldResize;
}
- (id) initWithSamples:(NSUInteger)samples;
- (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync;
@@ -49,6 +50,8 @@
- (void)commitCurrentPreedit;
+- (void) setOldResize:(bool)oldresize;
+
// rebuildContext
// Destroys and recreates a context with the view's internal format set via setPixelFormat;
// Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format.
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 7415c9d8dc..82ee5ccce4 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -94,8 +94,11 @@ attributedStringInfo getSegments(NSAttributedString *str)
// Force a high quality update after live resizing
- (void) viewDidEndLiveResize
{
- NSSize size = [self frame].size;
- callResize(size.width, size.height);
+ if (mOldResize) //Maint-3135
+ {
+ NSSize size = [self frame].size;
+ callResize(size.width, size.height);
+ }
}
- (unsigned long)getVramSize
@@ -124,10 +127,18 @@ attributedStringInfo getSegments(NSAttributedString *str)
object:[self window]];
}
+- (void)setOldResize:(bool)oldresize
+{
+ mOldResize = oldresize;
+}
+
- (void)windowResized:(NSNotification *)notification;
{
- //NSSize size = [self frame].size;
- //callResize(size.width, size.height);
+ if (!mOldResize) //Maint-3288
+ {
+ NSSize size = [self frame].size;
+ callResize(size.width, size.height);
+ }
}
- (void)dealloc
@@ -204,6 +215,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
[glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval];
}
+ mOldResize = false;
+
return self;
}
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 78186004b8..50ea614634 100755
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -123,7 +123,7 @@ public:
virtual void swapBuffers() = 0;
virtual void bringToFront() = 0;
virtual void focusClient() { }; // this may not have meaning or be required on other platforms, therefore, it's not abstract
-
+ virtual void setOldResize(bool oldresize) { };
// handy coordinate space conversion routines
// NB: screen to window and vice verse won't work on width/height coordinate pairs,
// as the conversion must take into account left AND right border widths, etc.
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index 81b25601a9..d64525fbdd 100755
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -74,6 +74,7 @@ void showNSCursor();
void hideNSCursorTillMove(bool hide);
void requestUserAttention();
long showAlert(std::string title, std::string text, int type);
+void setResizeMode(bool oldresize, void* glview);
NSWindowRef createNSWindow(int x, int y, int width, int height);
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 0768d0352e..1a21bf8430 100755
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -91,7 +91,7 @@ const unsigned short *copyFromPBoard()
NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];
str = [objToPaste objectAtIndex:0];
}
- unichar* temp = (unichar*)calloc([str length], sizeof(unichar));
+ unichar* temp = (unichar*)calloc([str length]+1, sizeof(unichar));
[str getCharacters:temp];
[pool release];
return temp;
@@ -222,6 +222,11 @@ GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)
return glview;
}
+void setResizeMode(bool oldresize, void* glview)
+{
+ [(LLOpenGLView *)glview setOldResize:oldresize];
+}
+
void glSwapBuffers(void* context)
{
[(NSOpenGLContext*)context flushBuffer];
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 6a6b39e674..825fd05c5f 100755
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -152,7 +152,10 @@ protected:
BOOL resetDisplayResolution();
BOOL shouldPostQuit() { return mPostQuit; }
-
+
+ //Satisfy MAINT-3135 and MAINT-3288 with a flag.
+ /*virtual */ void setOldResize(bool oldresize) {setResizeMode(oldresize, mGLView); }
+
protected:
//
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 88dfc2e9f3..05db551227 100755
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -648,7 +648,8 @@ int yyerror(const char *fmt, ...);
"REGION_FLAG_SANDBOX" { count(); yylval.ival = REGION_FLAGS_SANDBOX; return(INTEGER_CONSTANT); }
"REGION_FLAG_DISABLE_COLLISIONS" { count(); yylval.ival = REGION_FLAGS_SKIP_COLLISIONS; return(INTEGER_CONSTANT); }
"REGION_FLAG_DISABLE_PHYSICS" { count(); yylval.ival = REGION_FLAGS_SKIP_PHYSICS; return(INTEGER_CONSTANT); }
-"REGION_FLAG_BLOCK_FLY" { count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); }
+"REGION_FLAG_BLOCK_FLY" { count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); }
+"REGION_FLAG_BLOCK_FLYOVER" { count(); yylval.ival = REGION_FLAGS_BLOCK_FLYOVER; return(INTEGER_CONSTANT); }
"REGION_FLAG_ALLOW_DIRECT_TELEPORT" { count(); yylval.ival = REGION_FLAGS_ALLOW_DIRECT_TELEPORT; return(INTEGER_CONSTANT); }
"REGION_FLAG_RESTRICT_PUSHOBJECT" { count(); yylval.ival = REGION_FLAGS_RESTRICT_PUSHOBJECT; return(INTEGER_CONSTANT); }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index c5e1cde4e6..e044524131 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -659,7 +659,6 @@ set(viewer_SOURCE_FILES
llwearablelist.cpp
llweb.cpp
llwebprofile.cpp
- llwebsharing.cpp
llwind.cpp
llwindowlistener.cpp
llwlanimator.cpp
@@ -1238,7 +1237,6 @@ set(viewer_HEADER_FILES
llwearablelist.h
llweb.h
llwebprofile.h
- llwebsharing.h
llwind.h
llwindowlistener.h
llwlanimator.h
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index ad843bca14..17c70ef1c5 100755
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -526,6 +526,7 @@ REGION_FLAG_SANDBOX Used with llGetRegionFlags to find if a region is a sand
REGION_FLAG_DISABLE_COLLISIONS Used with llGetRegionFlags to find if a region has disabled collisions
REGION_FLAG_DISABLE_PHYSICS Used with llGetRegionFlags to find if a region has disabled physics
REGION_FLAG_BLOCK_FLY Used with llGetRegionFlags to find if a region blocks flying
+REGION_FLAG_BLOCK_FLYOVER Used with llGetRegionFlags to find if a region enforces higher altitude parcel access rules
REGION_FLAG_ALLOW_DIRECT_TELEPORT Used with llGetRegionFlags to find if a region allows direct teleports
REGION_FLAG_RESTRICT_PUSHOBJECT Used with llGetRegionFlags to find if a region restricts llPushObject() calls
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index fe6622f1e3..a220e810c4 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11301,28 +11301,6 @@
<key>Value</key>
<integer>75</integer>
</map>
- <key>SnapshotSharingEnabled</key>
- <map>
- <key>Comment</key>
- <string>Enable uploading of snapshots to a web service.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SnapshotConfigURL</key>
- <map>
- <key>Comment</key>
- <string>URL to fetch Snapshot Sharing configuration data from.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://photos.apps.staging.avatarsunited.com/viewer_config</string>
- </map>
<key>SpeedTest</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index e3c89f1a5f..b7a8194b4d 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3190,6 +3190,13 @@ bool LLAppViewer::initWindow()
LLNotificationsUI::LLNotificationManager::getInstance();
+
+#ifdef LL_DARWIN
+ //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
+ if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7)
+ gViewerWindow->getWindow()->setOldResize(true);
+#endif
+
if (gSavedSettings.getBOOL("WindowMaximized"))
{
gViewerWindow->getWindow()->maximize();
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index d8cdcdfc97..dc74506c53 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -291,6 +291,9 @@ class LLConversationViewModel
{
public:
typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t;
+ LLConversationViewModel()
+ : base_t(new LLConversationSort(), new LLConversationFilter())
+ {}
void sort(LLFolderViewFolder* folder);
bool contentsReady() { return true; } // *TODO : we need to check that participants names are available somewhat
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 16eacc9392..7fa3e176b0 100755
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -779,7 +779,7 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
if(filter == FFLOAD_ALL) // allow application bundles etc. to be traversed; important for DEV-16869, but generally useful
{
- mPickOptions &= F_NAV_SUPPORT;
+ mPickOptions |= F_NAV_SUPPORT;
}
if (blocking)
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index a303c2c6b3..a358b7c10b 100755
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -32,6 +32,7 @@
#include "llfloaterimnearbychat.h"
#include "llspinctrl.h"
#include "lltrans.h"
+#include "llnotificationsutil.h"
const std::string LL_FCP_COMPLETE_NAME("complete_name");
const std::string LL_FCP_ACCOUNT_NAME("user_name");
@@ -45,14 +46,20 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),
mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),
mMutex(NULL),
- mShowHistory(false)
+ mShowHistory(false),
+ mMessages(NULL),
+ mHistoryThreadsBusy(false),
+ mOpened(false)
+{
+}
+
+LLFloaterConversationPreview::~LLFloaterConversationPreview()
{
}
BOOL LLFloaterConversationPreview::postBuild()
{
mChatHistory = getChild<LLChatHistory>("chat_history");
- LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
std::string name;
@@ -79,31 +86,21 @@ BOOL LLFloaterConversationPreview::postBuild()
std::string title = getString("Title", args);
setTitle(title);
- LLSD load_params;
- load_params["load_all_history"] = true;
- load_params["cut_off_todays_date"] = false;
-
-
- LLSD loading;
- loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs");
- mMessages.push_back(loading);
- mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
- mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
- mPageSpinner->setMinValue(1);
- mPageSpinner->set(1);
- mPageSpinner->setEnabled(false);
- LLLogChat::startChatHistoryThread(file, load_params);
return LLFloater::postBuild();
}
-void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name)
+void LLFloaterConversationPreview::setPages(std::list<LLSD>* messages, const std::string& file_name)
{
- if(file_name == mChatHistoryFileName)
+ if(file_name == mChatHistoryFileName && messages)
{
// additional protection to avoid changes of mMessages in setPages()
LLMutexLock lock(&mMutex);
+ if (mMessages)
+ {
+ delete mMessages; // Clean up temporary message list with "Loading..." text
+ }
mMessages = messages;
- mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0);
+ mCurrentPage = (mMessages->size() ? (mMessages->size() - 1) / mPageSize : 0);
mPageSpinner->setEnabled(true);
mPageSpinner->setMaxValue(mCurrentPage+1);
@@ -113,6 +110,11 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std:
getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
mShowHistory = true;
}
+ LLLoadHistoryThread* loadThread = LLLogChat::getLoadHistoryThread(mSessionID);
+ if (loadThread)
+ {
+ loadThread->removeLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
+ }
}
void LLFloaterConversationPreview::draw()
@@ -127,24 +129,82 @@ void LLFloaterConversationPreview::draw()
void LLFloaterConversationPreview::onOpen(const LLSD& key)
{
+ if (mOpened)
+ {
+ return;
+ }
+ mOpened = true;
+ if (!LLLogChat::historyThreadsFinished(mSessionID))
+ {
+ LLNotificationsUtil::add("ChatHistoryIsBusyAlert");
+ mHistoryThreadsBusy = true;
+ closeFloater();
+ return;
+ }
+ LLSD load_params;
+ load_params["load_all_history"] = true;
+ load_params["cut_off_todays_date"] = false;
+
+ // The temporary message list with "Loading..." text
+ // Will be deleted upon loading completion in setPages() method
+ mMessages = new std::list<LLSD>();
+
+
+ LLSD loading;
+ loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs");
+ mMessages->push_back(loading);
+ mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
+ mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
+ mPageSpinner->setMinValue(1);
+ mPageSpinner->set(1);
+ mPageSpinner->setEnabled(false);
+
+ // The actual message list to load from file
+ // Will be deleted in a separate thread LLDeleteHistoryThread not to freeze UI
+ // LLDeleteHistoryThread is started in destructor
+ std::list<LLSD>* messages = new std::list<LLSD>();
+
+ LLLogChat::cleanupHistoryThreads();
+
+ LLLoadHistoryThread* loadThread = new LLLoadHistoryThread(mChatHistoryFileName, messages, load_params);
+ loadThread->setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
+ loadThread->start();
+ LLLogChat::addLoadHistoryThread(mSessionID, loadThread);
+
+ LLDeleteHistoryThread* deleteThread = new LLDeleteHistoryThread(messages, loadThread);
+ LLLogChat::addDeleteHistoryThread(mSessionID, deleteThread);
+
mShowHistory = true;
}
+void LLFloaterConversationPreview::onClose(bool app_quitting)
+{
+ mOpened = false;
+ if (!mHistoryThreadsBusy)
+ {
+ LLDeleteHistoryThread* deleteThread = LLLogChat::getDeleteHistoryThread(mSessionID);
+ if (deleteThread)
+ {
+ deleteThread->start();
+ }
+ }
+}
+
void LLFloaterConversationPreview::showHistory()
{
// additional protection to avoid changes of mMessages in setPages
LLMutexLock lock(&mMutex);
- if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size())
+ if(mMessages == NULL || !mMessages->size() || mCurrentPage * mPageSize >= mMessages->size())
{
return;
}
mChatHistory->clear();
std::ostringstream message;
- std::list<LLSD>::const_iterator iter = mMessages.begin();
+ std::list<LLSD>::const_iterator iter = mMessages->begin();
std::advance(iter, mCurrentPage * mPageSize);
- for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num)
+ for (int msg_num = 0; iter != mMessages->end() && msg_num < mPageSize; ++iter, ++msg_num)
{
LLSD msg = *iter;
diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h
index b0488f4ff1..a8dbbc9ffe 100755
--- a/indra/newview/llfloaterconversationpreview.h
+++ b/indra/newview/llfloaterconversationpreview.h
@@ -39,13 +39,14 @@ class LLFloaterConversationPreview : public LLFloater
public:
LLFloaterConversationPreview(const LLSD& session_id);
- virtual ~LLFloaterConversationPreview(){};
+ virtual ~LLFloaterConversationPreview();
virtual BOOL postBuild();
- void setPages(std::list<LLSD>& messages,const std::string& file_name);
+ void setPages(std::list<LLSD>* messages,const std::string& file_name);
virtual void draw();
virtual void onOpen(const LLSD& key);
+ virtual void onClose(bool app_quitting);
private:
void onMoreHistoryBtnClick();
@@ -58,11 +59,13 @@ private:
int mCurrentPage;
int mPageSize;
- std::list<LLSD> mMessages;
+ std::list<LLSD>* mMessages;
std::string mAccountName;
std::string mCompleteName;
- std::string mChatHistoryFileName;
+ std::string mChatHistoryFileName;
bool mShowHistory;
+ bool mHistoryThreadsBusy;
+ bool mOpened;
};
#endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index 14e1a486d3..9a21c59c9d 100755
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -690,7 +690,7 @@ void LLFloaterIMSession::setVisible(BOOL visible)
if (visible && isInVisibleChain())
{
sIMFloaterShowedSignal(mSessionID);
-
+ updateMessages();
}
}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 6c8e81e563..9250ae9ae9 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2331,7 +2331,7 @@ BOOL LLPanelLandAccess::postBuild()
childSetCommitCallback("public_access", onCommitPublicAccess, this);
childSetCommitCallback("limit_payment", onCommitAny, this);
childSetCommitCallback("limit_age_verified", onCommitAny, this);
- childSetCommitCallback("GroupCheck", onCommitAny, this);
+ childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);
childSetCommitCallback("PassCheck", onCommitAny, this);
childSetCommitCallback("pass_combo", onCommitAny, this);
childSetCommitCallback("PriceSpin", onCommitAny, this);
@@ -2496,11 +2496,11 @@ void LLPanelLandAccess::refresh()
}
BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
- getChild<LLUICtrl>("PassCheck")->setValue(use_pass );
+ getChild<LLUICtrl>("PassCheck")->setValue(use_pass);
LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");
if (passcombo)
{
- if (public_access || !use_pass || !use_group)
+ if (public_access || !use_pass)
{
passcombo->selectByValue("anyone");
}
@@ -2593,12 +2593,11 @@ void LLPanelLandAccess::refresh_ui()
getChildView("limit_age_verified")->setEnabled(FALSE);
- BOOL group_access = getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
BOOL sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
getChildView("PassCheck")->setEnabled(can_manage_allowed);
if (sell_passes)
{
- getChildView("pass_combo")->setEnabled(group_access && can_manage_allowed);
+ getChildView("pass_combo")->setEnabled(can_manage_allowed);
getChildView("PriceSpin")->setEnabled(can_manage_allowed);
getChildView("HoursSpin")->setEnabled(can_manage_allowed);
}
@@ -2657,6 +2656,32 @@ void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)
onCommitAny(ctrl, userdata);
}
+void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata)
+{
+ LLPanelLandAccess *self = (LLPanelLandAccess *)userdata;
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ BOOL use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean();
+ BOOL use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
+ LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ if (passcombo)
+ {
+ if (use_access_group && use_pass_list)
+ {
+ if (passcombo->getSelectedValue().asString() == "group")
+ {
+ passcombo->selectByValue("anyone");
+ }
+ }
+ }
+
+ onCommitAny(ctrl, userdata);
+}
+
// static
void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
{
@@ -2694,14 +2719,14 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
{
use_access_list = TRUE;
use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
- if (use_access_group && use_pass_list)
+ LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ if (passcombo)
{
- LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
- if (passcombo)
+ if (use_access_group && use_pass_list)
{
if (passcombo->getSelectedValue().asString() == "group")
{
- use_access_list = FALSE;
+ use_access_group = FALSE;
}
}
}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 4f1c10274a..95612fcb4a 100755
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -366,6 +366,7 @@ public:
static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
+ static void onCommitGroupCheck(LLUICtrl* ctrl, void *userdata);
static void onClickRemoveAccess(void*);
static void onClickRemoveBanned(void*);
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 66bf49331b..98ec0d489a 100755
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -365,6 +365,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
panel->getChild<LLUICtrl>("block_terraform_check")->setValue((region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("block_fly_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE );
+ panel->getChild<LLUICtrl>("block_fly_over_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLYOVER) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("allow_damage_check")->setValue((region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("restrict_pushobject")->setValue((region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue((region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE );
@@ -634,6 +635,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
// Enable the "Apply" button if something is changed. JC
initCtrl("block_terraform_check");
initCtrl("block_fly_check");
+ initCtrl("block_fly_over_check");
initCtrl("allow_damage_check");
initCtrl("allow_land_resell_check");
initCtrl("allow_parcel_changes_check");
@@ -815,6 +817,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
{
body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();
body["block_fly"] = getChild<LLUICtrl>("block_fly_check")->getValue();
+ body["block_fly_over"] = getChild<LLUICtrl>("block_fly_over_check")->getValue();
body["allow_damage"] = getChild<LLUICtrl>("allow_damage_check")->getValue();
body["allow_land_resell"] = getChild<LLUICtrl>("allow_land_resell_check")->getValue();
body["agent_limit"] = getChild<LLUICtrl>("agent_limit_spin")->getValue();
@@ -890,6 +893,7 @@ BOOL LLPanelRegionDebugInfo::postBuild()
childSetAction("top_scripts_btn", onClickTopScripts, this);
childSetAction("restart_btn", onClickRestart, this);
childSetAction("cancel_restart_btn", onClickCancelRestart, this);
+ childSetAction("region_debug_console_btn", onClickDebugConsole, this);
return TRUE;
}
@@ -911,6 +915,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)
getChildView("top_scripts_btn")->setEnabled(allow_modify);
getChildView("restart_btn")->setEnabled(allow_modify);
getChildView("cancel_restart_btn")->setEnabled(allow_modify);
+ getChildView("region_debug_console_btn")->setEnabled(allow_modify);
return LLPanelRegionInfo::refreshFromRegion(region);
}
@@ -1073,6 +1078,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);
}
+// static
+void LLPanelRegionDebugInfo::onClickDebugConsole(void* data)
+{
+ LLFloaterReg::showInstance("region_debug_console");
+}
BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
{
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index f0499f1903..bf174f3700 100755
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -209,6 +209,7 @@ protected:
static void onClickRestart(void* data);
bool callbackRestart(const LLSD& notification, const LLSD& response);
static void onClickCancelRestart(void* data);
+ static void onClickDebugConsole(void* data);
private:
LLUUID mTargetAvatar;
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index ea385d7baf..a416765157 100755
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -44,7 +44,6 @@
#include "lltoolfocus.h"
#include "lltoolmgr.h"
#include "llwebprofile.h"
-#include "llwebsharing.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -360,10 +359,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");
LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
-#if 0
- floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled"));
-#endif
-
floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);
setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
@@ -1032,12 +1027,6 @@ LLFloaterSnapshot::~LLFloaterSnapshot()
BOOL LLFloaterSnapshot::postBuild()
{
- // Kick start Web Sharing, to fetch its config data if it needs to.
- if (gSavedSettings.getBOOL("SnapshotSharingEnabled"))
- {
- LLWebSharing::instance().init();
- }
-
mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");
childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
mRefreshLabel = getChild<LLUICtrl>("refresh_lbl");
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 9dcfdfa185..8772185ad0 100755
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -105,6 +105,10 @@ class LLFolderViewModelInventory
public:
typedef LLFolderViewModel<LLInventorySort, LLFolderViewModelItemInventory, LLFolderViewModelItemInventory, LLInventoryFilter> base_t;
+ LLFolderViewModelInventory(const std::string& name)
+ : base_t(new LLInventorySort(), new LLInventoryFilter(LLInventoryFilter::Params().name(name)))
+ {}
+
void setTaskID(const LLUUID& id) {mTaskID = id;}
void sort(LLFolderViewFolder* folder);
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index 72bea8db10..0dd84b6073 100755
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -139,7 +139,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)
BOOL copyable = false;
if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true;
- if (!copyable && get_is_item_worn(item->getUUID()))
+ if (!copyable || get_is_item_worn(item->getUUID()))
{
acceptable = false;
}
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index c4c1827266..cf550e5eff 100755
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -624,7 +624,8 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
- if (mCollisionBanned == BA_BANNED)
+ if (mCollisionBanned == BA_BANNED ||
+ regionp->getRegionFlag(REGION_FLAGS_BLOCK_FLYOVER))
{
collision_height = BAN_HEIGHT;
}
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index cbd844cdac..3dcf7cd8aa 100755
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -608,6 +608,11 @@ void LLGroupMgrGroupData::recalcAgentPowers(const LLUUID& agent_id)
}
}
+bool LLGroupMgrGroupData::isSingleMemberNotOwner()
+{
+ return mMembers.size() == 1 && !mMembers.begin()->second->isOwner();
+}
+
bool packRoleUpdateMessageBlock(LLMessageSystem* msg,
const LLUUID& group_id,
const LLUUID& role_id,
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index d8c1ab7ef5..1750551395 100755
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -232,6 +232,8 @@ public:
BOOL isRoleDataComplete() { return mRoleDataComplete; }
BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
+
+ bool isSingleMemberNotOwner();
F32 getAccessTime() const { return mAccessTime; }
void setAccessed();
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index e5b9e11d48..d27f7d2527 100755
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -146,7 +146,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mShowItemLinkOverlays(p.show_item_link_overlays),
mShowEmptyMessage(p.show_empty_message),
mViewsInitialized(false),
- mInvFVBridgeBuilder(NULL)
+ mInvFVBridgeBuilder(NULL),
+ mInventoryViewModel(p.name)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 90b169ecd3..d0ecf80706 100755
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -206,7 +206,11 @@ private:
};
LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
-LLLoadHistoryThread::load_end_signal_t * LLLoadHistoryThread::mLoadEndSignal = NULL;
+
+std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads;
+std::map<LLUUID,LLDeleteHistoryThread *> LLLogChat::sDeleteHistoryThreads;
+LLMutex* LLLogChat::sHistoryThreadsMutex = NULL;
+
//static
std::string LLLogChat::makeLogFileName(std::string filename)
@@ -337,83 +341,179 @@ void LLLogChat::saveHistory(const std::string& filename,
void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
{
if (file_name.empty())
- {
- LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL;
- return ;
- }
+ {
+ LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL;
+ return ;
+ }
- bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
+ bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
- LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
- if (!fptr)
- {
- fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
- if (!fptr)
- {
- return; //No previous conversation with this name.
- }
- }
+ LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ if (!fptr)
+ {
+ fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ if (!fptr)
+ {
+ return; //No previous conversation with this name.
+ }
+ }
- char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
- char *bptr;
- S32 len;
- bool firstline = TRUE;
-
- if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
- { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
- firstline = FALSE;
- if (fseek(fptr, 0, SEEK_SET))
- {
- fclose(fptr);
- return;
- }
- }
- while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
- {
- len = strlen(buffer) - 1; /*Flawfinder: ignore*/
- for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
-
- if (firstline)
- {
- firstline = FALSE;
- continue;
- }
-
- std::string line(buffer);
-
- //updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
- if (' ' == line[0])
- {
- line.erase(0, MULTI_LINE_PREFIX.length());
- append_to_last_message(messages, '\n' + line);
- }
- else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
- {
- //to support old format's multilined messages with new lines used to divide paragraphs
- append_to_last_message(messages, line);
- }
- else
- {
- LLSD item;
- if (!LLChatLogParser::parse(line, item, load_params))
- {
- item[LL_IM_TEXT] = line;
- }
- messages.push_back(item);
- }
- }
- fclose(fptr);
+ char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
+ char *bptr;
+ S32 len;
+ bool firstline = TRUE;
+
+ if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
+ { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
+ firstline = FALSE;
+ if (fseek(fptr, 0, SEEK_SET))
+ {
+ fclose(fptr);
+ return;
+ }
+ }
+ while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
+ {
+ len = strlen(buffer) - 1; /*Flawfinder: ignore*/
+ for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
+
+ if (firstline)
+ {
+ firstline = FALSE;
+ continue;
+ }
+ std::string line(buffer);
+ //updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
+ if (' ' == line[0])
+ {
+ line.erase(0, MULTI_LINE_PREFIX.length());
+ append_to_last_message(messages, '\n' + line);
+ }
+ else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
+ {
+ //to support old format's multilined messages with new lines used to divide paragraphs
+ append_to_last_message(messages, line);
+ }
+ else
+ {
+ LLSD item;
+ if (!LLChatLogParser::parse(line, item, load_params))
+ {
+ item[LL_IM_TEXT] = line;
+ }
+ messages.push_back(item);
+ }
+ }
+ fclose(fptr);
}
-void LLLogChat::startChatHistoryThread(const std::string& file_name, const LLSD& load_params)
+// static
+bool LLLogChat::historyThreadsFinished(LLUUID session_id)
{
+ LLMutexLock lock(historyThreadsMutex());
+ bool finished = true;
+ std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id);
+ if (it != sLoadHistoryThreads.end())
+ {
+ finished = it->second->isFinished();
+ }
+ if (!finished)
+ {
+ return false;
+ }
+ std::map<LLUUID,LLDeleteHistoryThread *>::iterator dit = sDeleteHistoryThreads.find(session_id);
+ if (dit != sDeleteHistoryThreads.end())
+ {
+ finished = finished && dit->second->isFinished();
+ }
+ return finished;
+}
- LLLoadHistoryThread* mThread = new LLLoadHistoryThread();
- mThread->start();
- mThread->setHistoryParams(file_name, load_params);
+// static
+LLLoadHistoryThread* LLLogChat::getLoadHistoryThread(LLUUID session_id)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id);
+ if (it != sLoadHistoryThreads.end())
+ {
+ return it->second;
+ }
+ return NULL;
+}
+
+// static
+LLDeleteHistoryThread* LLLogChat::getDeleteHistoryThread(LLUUID session_id)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLDeleteHistoryThread *>::iterator it = sDeleteHistoryThreads.find(session_id);
+ if (it != sDeleteHistoryThreads.end())
+ {
+ return it->second;
+ }
+ return NULL;
+}
+
+// static
+bool LLLogChat::addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLLoadHistoryThread *>::const_iterator it = sLoadHistoryThreads.find(session_id);
+ if (it != sLoadHistoryThreads.end())
+ {
+ return false;
+ }
+ sLoadHistoryThreads[session_id] = lthread;
+ return true;
}
+
+// static
+bool LLLogChat::addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLDeleteHistoryThread *>::const_iterator it = sDeleteHistoryThreads.find(session_id);
+ if (it != sDeleteHistoryThreads.end())
+ {
+ return false;
+ }
+ sDeleteHistoryThreads[session_id] = dthread;
+ return true;
+}
+
+// static
+void LLLogChat::cleanupHistoryThreads()
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::vector<LLUUID> uuids;
+ std::map<LLUUID,LLLoadHistoryThread *>::iterator lit = sLoadHistoryThreads.begin();
+ for (; lit != sLoadHistoryThreads.end(); lit++)
+ {
+ if (lit->second->isFinished() && sDeleteHistoryThreads[lit->first]->isFinished())
+ {
+ delete lit->second;
+ delete sDeleteHistoryThreads[lit->first];
+ uuids.push_back(lit->first);
+ }
+ }
+ std::vector<LLUUID>::iterator uuid_it = uuids.begin();
+ for ( ;uuid_it != uuids.end(); uuid_it++)
+ {
+ sLoadHistoryThreads.erase(*uuid_it);
+ sDeleteHistoryThreads.erase(*uuid_it);
+ }
+}
+
+//static
+LLMutex* LLLogChat::historyThreadsMutex()
+{
+ if (sHistoryThreadsMutex == NULL)
+ {
+ sHistoryThreadsMutex = new LLMutex(NULL);
+ }
+ return sHistoryThreadsMutex;
+}
+
// static
std::string LLLogChat::oldLogFileName(std::string filename)
{
@@ -475,7 +575,7 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string
//Add Nearby chat history to the list of transcriptions
list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
LLFile::close(filep);
- return;
+ continue;
}
char buffer[LOG_RECALL_SIZE];
@@ -845,115 +945,188 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
return true; //parsed name and message text, maybe have a timestamp too
}
+LLDeleteHistoryThread::LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread)
+ : LLActionThread("delete chat history"),
+ mMessages(messages),
+ mLoadThread(loadThread)
+{
+}
+LLDeleteHistoryThread::~LLDeleteHistoryThread()
+{
+}
- LLLoadHistoryThread::LLLoadHistoryThread() : LLThread("load chat history")
- {
- mNewLoad = false;
+void LLDeleteHistoryThread::run()
+{
+ if (mLoadThread != NULL)
+ {
+ mLoadThread->waitFinished();
}
-
- void LLLoadHistoryThread::run()
+ if (NULL != mMessages)
{
- while (!LLApp::isQuitting())
- {
- if(mNewLoad)
- {
- loadHistory(mFileName,mMessages,mLoadParams);
- shutdown();
- }
- }
+ delete mMessages;
}
- void LLLoadHistoryThread::setHistoryParams(const std::string& file_name, const LLSD& load_params)
+ mMessages = NULL;
+ setFinished();
+}
+
+LLActionThread::LLActionThread(const std::string& name)
+ : LLThread(name),
+ mMutex(NULL),
+ mRunCondition(NULL),
+ mFinished(false)
+{
+}
+
+LLActionThread::~LLActionThread()
+{
+}
+
+void LLActionThread::waitFinished()
+{
+ mMutex.lock();
+ if (!mFinished)
{
- mFileName = file_name;
- mLoadParams = load_params;
- mNewLoad = true;
+ mMutex.unlock();
+ mRunCondition.wait();
}
- void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
+ else
{
+ mMutex.unlock();
+ }
+}
- if (file_name.empty())
- {
- LL_WARNS("LLLogChat::loadHistory") << "Session name is Empty!" << LL_ENDL;
- return ;
- }
+void LLActionThread::setFinished()
+{
+ mMutex.lock();
+ mFinished = true;
+ mMutex.unlock();
+ mRunCondition.signal();
+}
- bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
+LLLoadHistoryThread::LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params)
+ : LLActionThread("load chat history"),
+ mMessages(messages),
+ mFileName(file_name),
+ mLoadParams(load_params),
+ mNewLoad(true),
+ mLoadEndSignal(NULL)
+{
+}
- LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
- if (!fptr)
- {
- fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
- if (!fptr)
- {
- mNewLoad = false;
- (*mLoadEndSignal)(messages, file_name);
- return; //No previous conversation with this name.
- }
- }
+LLLoadHistoryThread::~LLLoadHistoryThread()
+{
+}
- char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
- char *bptr;
- S32 len;
- bool firstline = TRUE;
+void LLLoadHistoryThread::run()
+{
+ if(mNewLoad)
+ {
+ loadHistory(mFileName, mMessages, mLoadParams);
+ int count = mMessages->size();
+ llinfos << "mMessages->size(): " << count << llendl;
+ setFinished();
+ }
+}
- if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
- { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
- firstline = FALSE;
- if (fseek(fptr, 0, SEEK_SET))
- {
- fclose(fptr);
- mNewLoad = false;
- (*mLoadEndSignal)(messages, file_name);
- return;
- }
- }
- while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
- {
- len = strlen(buffer) - 1; /*Flawfinder: ignore*/
- for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
+void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params)
+{
+ if (file_name.empty())
+ {
+ LL_WARNS("LLLogChat::loadHistory") << "Session name is Empty!" << LL_ENDL;
+ return ;
+ }
- if (firstline)
- {
- firstline = FALSE;
- continue;
- }
+ bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
+ LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
- std::string line(buffer);
+ if (!fptr)
+ {
+ fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ if (!fptr)
+ {
+ mNewLoad = false;
+ (*mLoadEndSignal)(messages, file_name);
+ return; //No previous conversation with this name.
+ }
+ }
- //updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
- if (' ' == line[0])
- {
- line.erase(0, MULTI_LINE_PREFIX.length());
- append_to_last_message(messages, '\n' + line);
- }
- else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
- {
- //to support old format's multilined messages with new lines used to divide paragraphs
- append_to_last_message(messages, line);
- }
- else
- {
- LLSD item;
- if (!LLChatLogParser::parse(line, item, load_params))
- {
- item[LL_IM_TEXT] = line;
- }
- messages.push_back(item);
- }
- }
+ char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
+
+ char *bptr;
+ S32 len;
+ bool firstline = TRUE;
+
+ if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
+ { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
+ firstline = FALSE;
+ if (fseek(fptr, 0, SEEK_SET))
+ {
fclose(fptr);
mNewLoad = false;
(*mLoadEndSignal)(messages, file_name);
+ return;
+ }
}
- //static
- boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb)
+
+ while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
{
- if (NULL == mLoadEndSignal)
+ len = strlen(buffer) - 1; /*Flawfinder: ignore*/
+
+ for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
+
+
+ if (firstline)
{
- mLoadEndSignal = new load_end_signal_t();
+ firstline = FALSE;
+ continue;
}
+ std::string line(buffer);
- return mLoadEndSignal->connect(cb);
+ //updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
+ if (' ' == line[0])
+ {
+ line.erase(0, MULTI_LINE_PREFIX.length());
+ append_to_last_message(*messages, '\n' + line);
+ }
+ else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
+ {
+ //to support old format's multilined messages with new lines used to divide paragraphs
+ append_to_last_message(*messages, line);
+ }
+ else
+ {
+ LLSD item;
+ if (!LLChatLogParser::parse(line, item, load_params))
+ {
+ item[LL_IM_TEXT] = line;
+ }
+ messages->push_back(item);
+ }
}
+
+ fclose(fptr);
+ mNewLoad = false;
+ (*mLoadEndSignal)(messages, file_name);
+}
+
+boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb)
+{
+ if (NULL == mLoadEndSignal)
+ {
+ mLoadEndSignal = new load_end_signal_t();
+ }
+
+ return mLoadEndSignal->connect(cb);
+}
+
+void LLLoadHistoryThread::removeLoadEndSignal(const load_end_signal_t::slot_type& cb)
+{
+ if (NULL != mLoadEndSignal)
+ {
+ mLoadEndSignal->disconnect_all_slots();
+ delete mLoadEndSignal;
+ }
+ mLoadEndSignal = NULL;
+}
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index acee99afa2..81f75ef626 100755
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -28,23 +28,54 @@
#define LL_LLLOGCHAT_H
class LLChat;
-class LLLoadHistoryThread : public LLThread
+
+class LLActionThread : public LLThread
{
+public:
+ LLActionThread(const std::string& name);
+ ~LLActionThread();
+
+ void waitFinished();
+ bool isFinished() { return mFinished; }
+protected:
+ void setFinished();
private:
- std::string mFileName;
- std::list<LLSD> mMessages;
+ bool mFinished;
+ LLMutex mMutex;
+ LLCondition mRunCondition;
+};
+
+class LLLoadHistoryThread : public LLActionThread
+{
+private:
+ const std::string& mFileName;
+ std::list<LLSD>* mMessages;
LLSD mLoadParams;
bool mNewLoad;
public:
- LLLoadHistoryThread();
-
- void setHistoryParams(const std::string& file_name, const LLSD& load_params);
- virtual void loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params);
+ LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);
+ ~LLLoadHistoryThread();
+ //void setHistoryParams(const std::string& file_name, const LLSD& load_params);
+ virtual void loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);
virtual void run();
- typedef boost::signals2::signal<void (std::list<LLSD>& messages,const std::string& file_name)> load_end_signal_t;
- static load_end_signal_t * mLoadEndSignal;
- static boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb);
+ typedef boost::signals2::signal<void (std::list<LLSD>* messages,const std::string& file_name)> load_end_signal_t;
+ load_end_signal_t * mLoadEndSignal;
+ boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb);
+ void removeLoadEndSignal(const load_end_signal_t::slot_type& cb);
+};
+
+class LLDeleteHistoryThread : public LLActionThread
+{
+private:
+ std::list<LLSD>* mMessages;
+ LLLoadHistoryThread* mLoadThread;
+public:
+ LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread);
+ ~LLDeleteHistoryThread();
+
+ virtual void run();
+ static void deleteHistory();
};
class LLLogChat
@@ -73,7 +104,6 @@ public:
static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);
static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD());
- static void startChatHistoryThread(const std::string& file_name, const LLSD& load_params);
typedef boost::signals2::signal<void ()> save_history_signal_t;
static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb);
@@ -90,9 +120,21 @@ public:
static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);
static bool isNearbyTranscriptExist();
+ static bool historyThreadsFinished(LLUUID session_id);
+ static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id);
+ static LLDeleteHistoryThread* getDeleteHistoryThread(LLUUID session_id);
+ static bool addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread);
+ static bool addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread);
+ static void cleanupHistoryThreads();
+
private:
static std::string cleanFileName(std::string filename);
static save_history_signal_t * sSaveHistorySignal;
+
+ static std::map<LLUUID,LLLoadHistoryThread *> sLoadHistoryThreads;
+ static std::map<LLUUID,LLDeleteHistoryThread *> sDeleteHistoryThreads;
+ static LLMutex* sHistoryThreadsMutex;
+ static LLMutex* historyThreadsMutex();
};
/**
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index ae217958f0..a0ca82da46 100755
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -49,6 +49,7 @@
#include "llpanelgroupnotices.h"
#include "llpanelgroupgeneral.h"
+#include "llpanelgrouproles.h"
#include "llaccordionctrltab.h"
#include "llaccordionctrl.h"
@@ -275,6 +276,7 @@ void LLPanelGroup::onBtnApply(void* user_data)
{
LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
self->apply();
+ self->refreshData();
}
void LLPanelGroup::onBtnGroupCallClicked(void* user_data)
@@ -495,6 +497,22 @@ bool LLPanelGroup::apply(LLPanelGroupTab* tab)
{
//we skip refreshing group after ew manually apply changes since its very annoying
//for those who are editing group
+
+ LLPanelGroupRoles * roles_tab = dynamic_cast<LLPanelGroupRoles*>(tab);
+ if (roles_tab)
+ {
+ LLGroupMgr* gmgrp = LLGroupMgr::getInstance();
+ LLGroupMgrGroupData* gdatap = gmgrp->getGroupData(roles_tab->getGroupID());
+
+ // allow refresh only for one specific case:
+ // there is only one member in group and it is not owner
+ // it's a wrong situation and need refresh panels from server
+ if (gdatap && gdatap->isSingleMemberNotOwner())
+ {
+ return true;
+ }
+ }
+
mSkipRefresh = TRUE;
return true;
}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index d7130820ab..bb063f48a5 100755
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1491,7 +1491,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
mFolders(NULL),
mHaveInventory(FALSE),
mIsInventoryEmpty(TRUE),
- mInventoryNeedsUpdate(FALSE)
+ mInventoryNeedsUpdate(FALSE),
+ mInventoryViewModel(p.name)
{
// Setup context menu callbacks
mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2));
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index e533be7f24..f6f9dc90a9 100755
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -518,6 +518,10 @@ void LLScriptEdCore::initMenu()
menuItem->setClickCallback(boost::bind(&LLTextEditor::selectAll, mEditor));
menuItem->setEnableCallback(boost::bind(&LLTextEditor::canSelectAll, mEditor));
+ menuItem = getChild<LLMenuItemCallGL>("Deselect");
+ menuItem->setClickCallback(boost::bind(&LLTextEditor::deselect, mEditor));
+ menuItem->setEnableCallback(boost::bind(&LLTextEditor::canDeselect, mEditor));
+
menuItem = getChild<LLMenuItemCallGL>("Search / Replace...");
menuItem->setClickCallback(boost::bind(&LLFloaterScriptSearch::show, this));
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 1ed48a978f..5c41c5ad97 100755
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -127,9 +127,28 @@ BOOL LLPreviewTexture::postBuild()
getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
}
+
+ // Fill in ratios list with common aspect ratio values
+ mRatiosList.clear();
+ mRatiosList.push_back(LLTrans::getString("Unconstrained"));
+ mRatiosList.push_back("1:1");
+ mRatiosList.push_back("4:3");
+ mRatiosList.push_back("10:7");
+ mRatiosList.push_back("3:2");
+ mRatiosList.push_back("16:10");
+ mRatiosList.push_back("16:9");
+ mRatiosList.push_back("2:1");
- childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
+ // Now fill combo box with provided list
LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+ combo->removeall();
+
+ for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it)
+ {
+ combo->add(*it);
+ }
+
+ childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
combo->setCurrentByIndex(0);
return LLPreview::postBuild();
@@ -414,6 +433,13 @@ void LLPreviewTexture::updateDimensions()
{
return;
}
+
+ if (mAssetStatus != PREVIEW_ASSET_LOADED)
+ {
+ mAssetStatus = PREVIEW_ASSET_LOADED;
+ // Asset has been fully loaded, adjust aspect ratio
+ adjustAspectRatio();
+ }
// Update the width/height display every time
getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
@@ -501,6 +527,46 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
return mAssetStatus;
}
+void LLPreviewTexture::adjustAspectRatio()
+{
+ S32 w = mImage->getFullWidth();
+ S32 h = mImage->getFullHeight();
+
+ // Determine aspect ratio of the image
+ S32 tmp;
+ while (h != 0)
+ {
+ tmp = w % h;
+ w = h;
+ h = tmp;
+ }
+ S32 divisor = w;
+ S32 num = mImage->getFullWidth() / divisor;
+ S32 denom = mImage->getFullHeight() / divisor;
+
+ if (setAspectRatio(num, denom))
+ {
+ // Select corresponding ratio entry in the combo list
+ LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+ if (combo)
+ {
+ std::ostringstream ratio;
+ ratio << num << ":" << denom;
+ std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str());
+ if (found == mRatiosList.end())
+ {
+ combo->setCurrentByIndex(0);
+ }
+ else
+ {
+ combo->setCurrentByIndex(found - mRatiosList.begin());
+ }
+ }
+ }
+
+ mUpdateDimensions = TRUE;
+}
+
void LLPreviewTexture::updateImageID()
{
const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index cd16bacde2..97e74706cc 100755
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -70,6 +70,7 @@ protected:
/* virtual */ BOOL postBuild();
bool setAspectRatio(const F32 width, const F32 height);
static void onAspectRatioCommit(LLUICtrl*,void* userdata);
+ void adjustAspectRatio();
private:
void updateImageID(); // set what image is being uploaded.
@@ -95,5 +96,6 @@ private:
F32 mAspectRatio;
LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
+ std::vector<std::string> mRatiosList;
};
#endif // LL_LLPREVIEWTEXTURE_H
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 7532ebfc57..ea8225a3ac 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -50,7 +50,6 @@
#include "llviewerstats.h"
#include "llvfile.h"
#include "llvfs.h"
-#include "llwebsharing.h"
#include "llwindow.h"
#include "llworld.h"
@@ -845,30 +844,3 @@ BOOL LLSnapshotLivePreview::saveLocal()
}
return success;
}
-
-void LLSnapshotLivePreview::saveWeb()
-{
- // *FIX: Will break if the window closes because of CloseSnapshotOnKeep!
- // Needs to pass on ownership of the image.
- LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get());
- if(!jpg)
- {
- llwarns << "Formatted image not a JPEG" << llendl;
- return;
- }
-
- LLSD metadata;
- metadata["description"] = getChild<LLLineEditor>("description")->getText();
-
- LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(),
- boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4));
-
- gViewerWindow->playSnapshotAnimAndSound();
-}
-
-void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z)
-{
- metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString();
-
- LLWebSharing::instance().shareSnapshot(snapshot, metadata);
-}
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index fe3d257b02..0f09ef214a 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -96,7 +96,6 @@ public:
void setSnapshotQuality(S32 quality);
void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }
void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
- void saveWeb();
void saveTexture();
BOOL saveLocal();
@@ -113,9 +112,6 @@ public:
// Returns TRUE when snapshot generated, FALSE otherwise.
static BOOL onIdle( void* snapshot_preview );
- // callback for region name resolve
- void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z);
-
private:
LLColor4 mColor;
LLPointer<LLViewerTexture> mViewerImage[2]; //used to represent the scene when the frame is frozen.
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 1a137f7129..7314ab60c1 100755
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1611,16 +1611,19 @@ static void show_item_sharing_confirmation(const std::string name,
llassert(NULL != inv_item);
return;
}
-
- LLSD substitutions;
- substitutions["RESIDENTS"] = name;
- substitutions["ITEMS"] = inv_item->getName();
- LLSD payload;
- payload["agent_id"] = dest_agent;
- payload["item_id"] = inv_item->getUUID();
- payload["session_id"] = session_id;
- payload["d&d_dest"] = dest.asString();
- LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
+ if(gInventory.getItem(inv_item->getUUID())
+ && LLGiveInventory::isInventoryGiveAcceptable(inv_item))
+ {
+ LLSD substitutions;
+ substitutions["RESIDENTS"] = name;
+ substitutions["ITEMS"] = inv_item->getName();
+ LLSD payload;
+ payload["agent_id"] = dest_agent;
+ payload["item_id"] = inv_item->getUUID();
+ payload["session_id"] = session_id;
+ payload["d&d_dest"] = dest.asString();
+ LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
+ }
}
static void get_name_cb(const LLUUID& id,
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 21fb8d519b..2c132740fe 100755
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -67,7 +67,6 @@
#include "llvoavatarself.h"
#include "llvovolume.h"
#include "llwebprofile.h"
-#include "llwebsharing.h" // For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!
#include "llwindow.h"
#include "llvieweraudio.h"
@@ -1426,9 +1425,6 @@ void LLViewerMedia::setOpenIDCookie()
getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start));
- // *HACK: Doing this here is nasty, find a better way.
- LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie);
-
// Do a web profile get so we can store the cookie
LLSD headers = LLSD::emptyMap();
headers["Accept"] = "*/*";
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 8f8bfa23c1..a8716985cb 100755
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -115,7 +115,7 @@ public:
void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); }
void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); }
void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); }
- void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); }
+ //void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } Never used
void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); }
diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp
deleted file mode 100755
index 3a80051b9b..0000000000
--- a/indra/newview/llwebsharing.cpp
+++ /dev/null
@@ -1,603 +0,0 @@
-/**
- * @file llwebsharing.cpp
- * @author Aimee
- * @brief Web Snapshot Sharing
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llwebsharing.h"
-
-#include "llagentui.h"
-#include "llbufferstream.h"
-#include "llhttpclient.h"
-#include "llhttpstatuscodes.h"
-#include "llsdserialize.h"
-#include "llsdutil.h"
-#include "llurl.h"
-#include "llviewercontrol.h"
-
-#include <boost/regex.hpp>
-#include <boost/algorithm/string/replace.hpp>
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingConfigResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingConfigResponder);
-public:
- /// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- LLSD content;
- LLBufferStream istr(channels, buffer.get());
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
- if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
- {
- LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
- }
- else
- {
- completed(status, reason, content);
- }
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- }
-
- virtual void result(const LLSD& content)
- {
- LLWebSharing::instance().receiveConfig(content);
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingOpenIDAuthResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingOpenIDAuthResponder);
-public:
- /* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
- {
- completed(status, reason, content);
- }
-
- /* virtual */ void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- /// Left empty to override the default LLSD parsing behaviour.
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- if (HTTP_UNAUTHORIZED == status)
- {
- LL_WARNS("WebSharing") << "AU account not authenticated." << LL_ENDL;
- // *TODO: No account found on AU, so start the account creation process here.
- }
- else
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- LLWebSharing::instance().retryOpenIDAuth();
- }
-
- }
-
- virtual void result(const LLSD& content)
- {
- if (content.has("set-cookie"))
- {
- // OpenID request succeeded and returned a session cookie.
- LLWebSharing::instance().receiveSessionCookie(content["set-cookie"].asString());
- }
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingSecurityTokenResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingSecurityTokenResponder);
-public:
- /// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- LLSD content;
- LLBufferStream istr(channels, buffer.get());
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
- if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
- {
- LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
- LLWebSharing::instance().retryOpenIDAuth();
- }
- else
- {
- completed(status, reason, content);
- }
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- LLWebSharing::instance().retryOpenIDAuth();
- }
-
- virtual void result(const LLSD& content)
- {
- if (content[0].has("st") && content[0].has("expires"))
- {
- const std::string& token = content[0]["st"].asString();
- const std::string& expires = content[0]["expires"].asString();
- if (LLWebSharing::instance().receiveSecurityToken(token, expires))
- {
- // Sucessfully received a valid security token.
- return;
- }
- }
- else
- {
- LL_WARNS("WebSharing") << "No security token received." << LL_ENDL;
- }
-
- LLWebSharing::instance().retryOpenIDAuth();
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingUploadResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingUploadResponder);
-public:
- /// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
-/*
- // Dump the body, for debugging.
-
- LLBufferStream istr1(channels, buffer.get());
- std::ostringstream ostr;
- std::string body;
-
- while (istr1.good())
- {
- char buf[1024];
- istr1.read(buf, sizeof(buf));
- body.append(buf, istr1.gcount());
- }
- LL_DEBUGS("WebSharing") << body << LL_ENDL;
-*/
- LLSD content;
- LLBufferStream istr(channels, buffer.get());
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
- if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
- {
- LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
- }
- else
- {
- completed(status, reason, content);
- }
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- }
-
- virtual void result(const LLSD& content)
- {
- if (content[0].has("result") && content[0].has("id") &&
- content[0]["id"].asString() == "newMediaItem")
- {
- // *TODO: Upload successful, continue from here to post metadata and create AU activity.
- }
- else
- {
- LL_WARNS("WebSharing") << "Error [" << content[0]["code"].asString()
- << "]: " << content[0]["message"].asString() << LL_ENDL;
- }
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLWebSharing::LLWebSharing()
-: mConfig(),
- mSecurityToken(LLSD::emptyMap()),
- mEnabled(false),
- mRetries(0),
- mImage(NULL),
- mMetadata(LLSD::emptyMap())
-{
-}
-
-void LLWebSharing::init()
-{
- if (!mEnabled)
- {
- sendConfigRequest();
- }
-}
-
-bool LLWebSharing::shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata)
-{
- LL_INFOS("WebSharing") << metadata << LL_ENDL;
-
- if (mImage)
- {
- // *TODO: Handle this possibility properly, queue them up?
- LL_WARNS("WebSharing") << "Snapshot upload already in progress." << LL_ENDL;
- return false;
- }
-
- mImage = snapshot;
- mMetadata = metadata;
-
- // *TODO: Check whether we have a valid security token already and re-use it.
- sendOpenIDAuthRequest();
- return true;
-}
-
-bool LLWebSharing::setOpenIDCookie(const std::string& cookie)
-{
- LL_DEBUGS("WebSharing") << "Setting OpenID cookie " << cookie << LL_ENDL;
- mOpenIDCookie = cookie;
- return validateConfig();
-}
-
-bool LLWebSharing::receiveConfig(const LLSD& config)
-{
- LL_DEBUGS("WebSharing") << "Received config data: " << config << LL_ENDL;
- mConfig = config;
- return validateConfig();
-}
-
-bool LLWebSharing::receiveSessionCookie(const std::string& cookie)
-{
- LL_DEBUGS("WebSharing") << "Received AU session cookie: " << cookie << LL_ENDL;
- mSessionCookie = cookie;
-
- // Fetch a security token using the new session cookie.
- LLWebSharing::instance().sendSecurityTokenRequest();
-
- return (!mSessionCookie.empty());
-}
-
-bool LLWebSharing::receiveSecurityToken(const std::string& token, const std::string& expires)
-{
- mSecurityToken["st"] = token;
- mSecurityToken["expires"] = LLDate(expires);
-
- if (!securityTokenIsValid(mSecurityToken))
- {
- LL_WARNS("WebSharing") << "Invalid security token received: \"" << token << "\" Expires: " << expires << LL_ENDL;
- return false;
- }
-
- LL_DEBUGS("WebSharing") << "Received security token: \"" << token << "\" Expires: " << expires << LL_ENDL;
- mRetries = 0;
-
- // Continue the upload process now that we have a security token.
- sendUploadRequest();
-
- return true;
-}
-
-void LLWebSharing::sendConfigRequest()
-{
- std::string config_url = gSavedSettings.getString("SnapshotConfigURL");
- LL_DEBUGS("WebSharing") << "Requesting Snapshot Sharing config data from: " << config_url << LL_ENDL;
-
- LLSD headers = LLSD::emptyMap();
- headers["Accept"] = "application/json";
-
- LLHTTPClient::get(config_url, new LLWebSharingConfigResponder(), headers);
-}
-
-void LLWebSharing::sendOpenIDAuthRequest()
-{
- std::string auth_url = mConfig["openIdAuthUrl"];
- LL_DEBUGS("WebSharing") << "Starting OpenID Auth: " << auth_url << LL_ENDL;
-
- LLSD headers = LLSD::emptyMap();
- headers["Cookie"] = mOpenIDCookie;
- headers["Accept"] = "*/*";
-
- // Send request, successful login will trigger fetching a security token.
- LLHTTPClient::get(auth_url, new LLWebSharingOpenIDAuthResponder(), headers);
-}
-
-bool LLWebSharing::retryOpenIDAuth()
-{
- if (mRetries++ >= MAX_AUTH_RETRIES)
- {
- LL_WARNS("WebSharing") << "Exceeded maximum number of authorization attempts, aborting." << LL_ENDL;
- mRetries = 0;
- return false;
- }
-
- LL_WARNS("WebSharing") << "Authorization failed, retrying (" << mRetries << "/" << MAX_AUTH_RETRIES << ")" << LL_ENDL;
- sendOpenIDAuthRequest();
- return true;
-}
-
-void LLWebSharing::sendSecurityTokenRequest()
-{
- std::string token_url = mConfig["securityTokenUrl"];
- LL_DEBUGS("WebSharing") << "Fetching security token from: " << token_url << LL_ENDL;
-
- LLSD headers = LLSD::emptyMap();
- headers["Cookie"] = mSessionCookie;
-
- headers["Accept"] = "application/json";
- headers["Content-Type"] = "application/json";
-
- std::ostringstream body;
- body << "{ \"gadgets\": [{ \"url\":\""
- << mConfig["gadgetSpecUrl"].asString()
- << "\" }] }";
-
- // postRaw() takes ownership of the buffer and releases it later.
- size_t size = body.str().size();
- U8 *data = new U8[size];
- memcpy(data, body.str().data(), size);
-
- // Send request, receiving a valid token will trigger snapshot upload.
- LLHTTPClient::postRaw(token_url, data, size, new LLWebSharingSecurityTokenResponder(), headers);
-}
-
-void LLWebSharing::sendUploadRequest()
-{
- LLUriTemplate upload_template(mConfig["openSocialRpcUrlTemplate"].asString());
- std::string upload_url(upload_template.buildURI(mSecurityToken));
-
- LL_DEBUGS("WebSharing") << "Posting upload to: " << upload_url << LL_ENDL;
-
- static const std::string BOUNDARY("------------abcdef012345xyZ");
-
- LLSD headers = LLSD::emptyMap();
- headers["Cookie"] = mSessionCookie;
-
- headers["Accept"] = "application/json";
- headers["Content-Type"] = "multipart/form-data; boundary=" + BOUNDARY;
-
- std::ostringstream body;
- body << "--" << BOUNDARY << "\r\n"
- << "Content-Disposition: form-data; name=\"request\"\r\n\r\n"
- << "[{"
- << "\"method\":\"mediaItems.create\","
- << "\"params\": {"
- << "\"userId\":[\"@me\"],"
- << "\"groupId\":\"@self\","
- << "\"mediaItem\": {"
- << "\"mimeType\":\"image/jpeg\","
- << "\"type\":\"image\","
- << "\"url\":\"@field:image1\""
- << "}"
- << "},"
- << "\"id\":\"newMediaItem\""
- << "}]"
- << "--" << BOUNDARY << "\r\n"
- << "Content-Disposition: form-data; name=\"image1\"\r\n\r\n";
-
- // Insert the image data.
- // *FIX: Treating this as a string will probably screw it up ...
- U8* image_data = mImage->getData();
- for (S32 i = 0; i < mImage->getDataSize(); ++i)
- {
- body << image_data[i];
- }
-
- body << "\r\n--" << BOUNDARY << "--\r\n";
-
- // postRaw() takes ownership of the buffer and releases it later.
- size_t size = body.str().size();
- U8 *data = new U8[size];
- memcpy(data, body.str().data(), size);
-
- // Send request, successful upload will trigger posting metadata.
- LLHTTPClient::postRaw(upload_url, data, size, new LLWebSharingUploadResponder(), headers);
-}
-
-bool LLWebSharing::validateConfig()
-{
- // Check the OpenID Cookie has been set.
- if (mOpenIDCookie.empty())
- {
- mEnabled = false;
- return mEnabled;
- }
-
- if (!mConfig.isMap())
- {
- mEnabled = false;
- return mEnabled;
- }
-
- // Template to match the received config against.
- LLSD required(LLSD::emptyMap());
- required["gadgetSpecUrl"] = "";
- required["loginTokenUrl"] = "";
- required["openIdAuthUrl"] = "";
- required["photoPageUrlTemplate"] = "";
- required["openSocialRpcUrlTemplate"] = "";
- required["securityTokenUrl"] = "";
- required["tokenBasedLoginUrlTemplate"] = "";
- required["viewerIdUrl"] = "";
-
- std::string mismatch(llsd_matches(required, mConfig));
- if (!mismatch.empty())
- {
- LL_WARNS("WebSharing") << "Malformed config data response: " << mismatch << LL_ENDL;
- mEnabled = false;
- return mEnabled;
- }
-
- mEnabled = true;
- return mEnabled;
-}
-
-// static
-bool LLWebSharing::securityTokenIsValid(LLSD& token)
-{
- return (token.has("st") &&
- token.has("expires") &&
- (token["st"].asString() != "") &&
- (token["expires"].asDate() > LLDate::now()));
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLUriTemplate::LLUriTemplate(const std::string& uri_template)
- :
- mTemplate(uri_template)
-{
-}
-
-std::string LLUriTemplate::buildURI(const LLSD& vars)
-{
- // *TODO: Separate parsing the template from building the URI.
- // Parsing only needs to happen on construction/assignnment.
-
- static const std::string VAR_NAME_REGEX("[[:alpha:]][[:alnum:]\\._-]*");
- // Capture var name with and without surrounding {}
- static const std::string VAR_REGEX("\\{(" + VAR_NAME_REGEX + ")\\}");
- // Capture delimiter and comma separated list of var names.
- static const std::string JOIN_REGEX("\\{-join\\|(&)\\|(" + VAR_NAME_REGEX + "(?:," + VAR_NAME_REGEX + ")*)\\}");
-
- std::string uri = mTemplate;
- boost::smatch results;
-
- // Validate and expand join operators : {-join|&|var1,var2,...}
-
- boost::regex join_regex(JOIN_REGEX);
-
- while (boost::regex_search(uri, results, join_regex))
- {
- // Extract the list of var names from the results.
- std::string delim = results[1].str();
- std::string var_list = results[2].str();
-
- // Expand the list of vars into a query string with their values
- std::string query = expandJoin(delim, var_list, vars);
-
- // Substitute the query string into the template.
- uri = boost::regex_replace(uri, join_regex, query, boost::format_first_only);
- }
-
- // Expand vars : {var1}
-
- boost::regex var_regex(VAR_REGEX);
-
- std::set<std::string> var_names;
- std::string::const_iterator start = uri.begin();
- std::string::const_iterator end = uri.end();
-
- // Extract the var names used.
- while (boost::regex_search(start, end, results, var_regex))
- {
- var_names.insert(results[1].str());
- start = results[0].second;
- }
-
- // Replace each var with its value.
- for (std::set<std::string>::const_iterator it = var_names.begin(); it != var_names.end(); ++it)
- {
- std::string var = *it;
- if (vars.has(var))
- {
- boost::replace_all(uri, "{" + var + "}", vars[var].asString());
- }
- }
-
- return uri;
-}
-
-std::string LLUriTemplate::expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars)
-{
- std::ostringstream query;
-
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(",");
- tokenizer var_names(var_list, sep);
- tokenizer::const_iterator it = var_names.begin();
-
- // First var does not need a delimiter
- if (it != var_names.end())
- {
- const std::string& name = *it;
- if (vars.has(name))
- {
- // URL encode the value before appending the name=value pair.
- query << name << "=" << escapeURL(vars[name].asString());
- }
- }
-
- for (++it; it != var_names.end(); ++it)
- {
- const std::string& name = *it;
- if (vars.has(name))
- {
- // URL encode the value before appending the name=value pair.
- query << delim << name << "=" << escapeURL(vars[name].asString());
- }
- }
-
- return query.str();
-}
-
-// static
-std::string LLUriTemplate::escapeURL(const std::string& unescaped)
-{
- char* escaped = curl_escape(unescaped.c_str(), unescaped.size());
- std::string result = escaped;
- curl_free(escaped);
- return result;
-}
-
diff --git a/indra/newview/llwebsharing.h b/indra/newview/llwebsharing.h
deleted file mode 100755
index ad9c99c224..0000000000
--- a/indra/newview/llwebsharing.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * @file llwebsharing.h
- * @author Aimee
- * @brief Web Snapshot Sharing
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLWEBSHARING_H
-#define LL_LLWEBSHARING_H
-
-#include "llimagejpeg.h"
-#include "llsingleton.h"
-
-
-
-/**
- * @class LLWebSharing
- *
- * Manages authentication to, and interaction with, a web service allowing the
- * upload of snapshot images taken within the viewer, using OpenID and the
- * OpenSocial APIs.
- * http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/RPC-Protocol.html
- */
-class LLWebSharing : public LLSingleton<LLWebSharing>
-{
- LOG_CLASS(LLWebSharing);
-public:
- /*
- * Performs initial setup, by requesting config data from the web service if
- * it has not already been received.
- */
- void init();
-
- /*
- * @return true if both the OpenID cookie and config data have been received.
- */
- bool enabled() const { return mEnabled; };
-
- /*
- * Sets the OpenID cookie to use for login to the web service.
- *
- * @param cookie a string containing the OpenID cookie.
- *
- * @return true if both the OpenID cookie and config data have been received.
- */
- bool setOpenIDCookie(const std::string& cookie);
-
- /*
- * Receive config data used to connect to the web service.
- *
- * @param config an LLSD map of URL templates for the web service end-points.
- *
- * @return true if both the OpenID cookie and config data have been received.
- *
- * @see sendConfigRequest()
- */
- bool receiveConfig(const LLSD& config);
-
- /*
- * Receive the session cookie from the web service, which is the result of
- * the OpenID login process.
- *
- * @see sendOpenIDAuthRequest()
- */
- bool receiveSessionCookie(const std::string& cookie);
-
- /*
- * Receive a security token for the upload service.
- *
- * @see sendSecurityTokenRequest()
- */
- bool receiveSecurityToken(const std::string& token, const std::string& expires);
-
- /*
- * Restarts the authentication process if the maximum number of retries has
- * not been exceeded.
- *
- * @return true if retrying, false if LLWebSharing::MAX_AUTH_RETRIES has been exceeded.
- */
- bool retryOpenIDAuth();
-
- /*
- * Post a snapshot to the upload service.
- *
- * @return true if accepted for upload, false if already uploading another image.
- */
- bool shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata);
-
-private:
- static const S32 MAX_AUTH_RETRIES = 4;
-
- friend class LLSingleton<LLWebSharing>;
-
- LLWebSharing();
- ~LLWebSharing() {};
-
- /*
- * Request a map of URLs and URL templates to the web service end-points.
- *
- * @see receiveConfig()
- */
- void sendConfigRequest();
-
- /*
- * Initiate the OpenID login process.
- *
- * @see receiveSessionCookie()
- */
- void sendOpenIDAuthRequest();
-
- /*
- * Request a security token for the upload service.
- *
- * @see receiveSecurityToken()
- */
- void sendSecurityTokenRequest();
-
- /*
- * Request a security token for the upload service.
- *
- * @see receiveSecurityToken()
- */
- void sendUploadRequest();
-
- /*
- * Checks all necessary config information has been received, and sets mEnabled.
- *
- * @return true if both the OpenID cookie and config data have been received.
- */
- bool validateConfig();
-
- /*
- * Checks the security token is present and has not expired.
- *
- * @param token an LLSD map containing the token string and the time it expires.
- *
- * @return true if the token is not empty and has not expired.
- */
- static bool securityTokenIsValid(LLSD& token);
-
- std::string mOpenIDCookie;
- std::string mSessionCookie;
- LLSD mSecurityToken;
-
- LLSD mConfig;
- bool mEnabled;
-
- LLPointer<LLImageJPEG> mImage;
- LLSD mMetadata;
-
- S32 mRetries;
-};
-
-/**
- * @class LLUriTemplate
- *
- * @brief Builds complete URIs, given URI template and a map of keys and values
- * to use for substition.
- * Note: This is only a partial implementation of a draft standard required
- * by the web API used by LLWebSharing.
- * See: http://tools.ietf.org/html/draft-gregorio-uritemplate-03
- *
- * @see LLWebSharing
- */
-class LLUriTemplate
-{
- LOG_CLASS(LLUriTemplate);
-public:
- LLUriTemplate(const std::string& uri_template);
- ~LLUriTemplate() {};
-
- /*
- * Builds a complete URI from the template.
- *
- * @param vars an LLSD map of keys and values for substitution.
- *
- * @return a string containing the complete URI.
- */
- std::string buildURI(const LLSD& vars);
-
-private:
- /*
- * Builds a URL query string.
- *
- * @param delim a string containing the separator to use between name=value pairs.
- * @param var_list a string containing a comma separated list of variable names.
- * @param vars an LLSD map of keys and values for substitution.
- *
- * @return a URL query string.
- */
- std::string expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars);
-
- /*
- * URL escape the given string.
- * LLWeb::escapeURL() only does a partial escape, so this uses curl_escape() instead.
- */
- static std::string escapeURL(const std::string& unescaped);
-
- std::string mTemplate;
-};
-
-
-
-#endif // LL_LLWEBSHARING_H
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 11d100eeff..74d160dfae 100755
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1172,7 +1172,8 @@ Prøv venligst om lidt igen.
<string name="InventoryNoTexture">
Du har ikke en kopi af denne tekstur i din beholdning
</string>
- <string name="no_transfer" value=" (ikke overdragbar)"/>
+ <string name="Unconstrained">Ikke låst</string>
+ <string name="no_transfer" value=" (ikke overdragbar)"/>
<string name="no_modify" value=" (ikke redigere)"/>
<string name="no_copy" value=" (ikke kopiere)"/>
<string name="worn" value=" (båret)"/>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 4268b95370..082febd709 100755
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1267,7 +1267,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
- <string name="InventoryInboxNoItems">
+ <string name="Unconstrained">keines</string>
+ <string name="InventoryInboxNoItems">
Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.
</string>
<string name="MarketplaceURL">
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index 137e278ddc..e1e7e1c8c8 100755
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -79,30 +79,6 @@
width="108"
name="combo_aspect_ratio"
tool_tip="Preview at a fixed aspect ratio">
- <combo_item name="Unconstrained" value="Unconstrained">
- Unconstrained
- </combo_item>
- <combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile">
- 1:1
- </combo_item>
- <combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile">
- 4:3
- </combo_item>
- <combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks">
- 10:7
- </combo_item>
- <combo_item name="3:2" value="3:2" tool_tip="About land">
- 3:2
- </combo_item>
- <combo_item name="16:10" value="16:10">
- 16:10
- </combo_item>
- <combo_item name="16:9" value="16:9" tool_tip="Profile picks">
- 16:9
- </combo_item>
- <combo_item name="2:1" value="2:1">
- 2:1
- </combo_item>
</combo_box>
<button
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 958cfc0b32..2aa6206a13 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -3126,18 +3126,6 @@
<menu_item_call.on_click
function="Advanced.PrintAgentInfo" />
</menu_item_call>
- <menu_item_check
- label="Region Debug Console"
- name="Region Debug Console"
- shortcut="control|shift|`"
- use_mac_ctrl="true">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="region_debug_console" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="region_debug_console" />
- </menu_item_check>
<menu_item_separator />
<menu_item_check
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 5c75aa2059..0ffce9380e 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -7634,7 +7634,7 @@ Are you sure you want to share the following items:
With the following Residents:
-[RESIDENTS]
+&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@@ -7654,7 +7654,7 @@ Are you sure you want to share the following items:
With the following Residents:
-[RESIDENTS]
+&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@@ -10224,4 +10224,14 @@ Cannot create large prims that intersect other players. Please re-try when othe
yestext="OK"/>
</notification>
+ <notification
+ icon="alert.tga"
+ name="ChatHistoryIsBusyAlert"
+ type="alertmodal">
+ Chat history file is busy with previous operation. Please try again in a few minutes or choose chat with another person.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
</notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 81b2281adb..fea5f1b19f 100755
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -201,4 +201,14 @@
tool_tip="Cancel region restart"
top_delta="0"
width="150" />
+ <button
+ follows="left|top"
+ height="20"
+ label="Region Debug Console"
+ layout="topleft"
+ left="10"
+ name="region_debug_console_btn"
+ tool_tip="Open Region Debug Console"
+ top_pad="5"
+ width="150" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 44c84e69a1..489d286e67 100755
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -94,11 +94,20 @@
width="80" />
<check_box
height="20"
+ label="Block Parcel Fly Over"
+ layout="topleft"
+ left="10"
+ name="block_fly_over_check"
+ tool_tip="Extend access checks upwards to prevent flying over a parcel"
+ top="110"
+ width="90" />
+ <check_box
+ height="20"
label="Allow Damage"
layout="topleft"
left="10"
name="allow_damage_check"
- top="110"
+ top="130"
width="80" />
<check_box
height="20"
@@ -106,7 +115,7 @@
layout="topleft"
left="10"
name="restrict_pushobject"
- top="130"
+ top="150"
width="80" />
<check_box
height="20"
@@ -114,7 +123,7 @@
layout="topleft"
left="10"
name="allow_land_resell_check"
- top="150"
+ top="170"
width="80" />
<check_box
height="20"
@@ -122,7 +131,7 @@
layout="topleft"
left="10"
name="allow_parcel_changes_check"
- top="170"
+ top="190"
width="80" />
<check_box
height="20"
@@ -131,7 +140,7 @@
left="10"
name="block_parcel_search_check"
tool_tip="Let people see this region and its parcels in search results"
- top="190"
+ top="210"
width="80" />
<spinner
decimal_digits="0"
@@ -145,7 +154,7 @@
max_val="100"
min_val="1"
name="agent_limit_spin"
- top="240"
+ top="260"
width="170" />
<spinner
follows="left|top"
@@ -158,7 +167,7 @@
max_val="10"
min_val="1"
name="object_bonus_spin"
- top="260"
+ top="280"
width="170" />
<text
follows="left|top"
@@ -167,7 +176,7 @@
layout="topleft"
left="10"
name="access_text"
- top="290"
+ top="310"
width="100">
Rating:
</text>
@@ -224,7 +233,7 @@
layout="topleft"
left="108"
name="apply_btn"
- top="320"
+ top="340"
width="100"/>
<button
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 67f75fe1d2..f0ff6d5b88 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2257,6 +2257,7 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
<string name="Marketplace Error Internal Import">Error: There was a problem with this item. Try again later.</string>
<string name="Open landmarks">Open landmarks</string>
+ <string name="Unconstrained">Unconstrained</string>
<!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 484511a08b..2b91c542ad 100755
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1252,7 +1252,8 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InventoryInboxNoItems">
Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Sin restricciones</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 78d846ff4f..b8721420cb 100755
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1270,7 +1270,8 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InventoryInboxNoItems">
Les achats que vous avez effectués sur la Place du marché s&apos;affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Sans contraintes</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 60ed2b0929..86d7f75b83 100755
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1261,7 +1261,8 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InventoryInboxNoItems">
Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Libero</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index a0f45e5a55..36966d6825 100755
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1270,7 +1270,8 @@ support@secondlife.com にお問い合わせください。
<string name="InventoryInboxNoItems">
マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">非拘束</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index f6dec8536b..f86e393646 100755
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -1035,6 +1035,7 @@
<string name="InventoryNoTexture">
Nie posiadasz kopii tej tekstury w Twojej Szafie.
</string>
+ <string name="Unconstrained">Swobodny</string>
<string name="no_transfer" value=" (brak oddawania)"/>
<string name="no_modify" value=" (brak modyfikowania)"/>
<string name="no_copy" value=" (brak kopiowania)"/>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 2eb4c0a02e..8436452228 100755
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1216,7 +1216,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="InventoryInboxNoItems">
Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Sem limites</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 0f71edcee0..8faf834f8f 100755
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -1267,7 +1267,8 @@ support@secondlife.com.
<string name="InventoryInboxNoItems">
Здесь будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь для использования.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Без ограничения</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index c4b1530b2b..31c5d2d310 100755
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -1267,7 +1267,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="InventoryInboxNoItems">
Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Kısıtsız</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">