Merge branch 'master' of https://vcs.firestormviewer.org/phoenix-firestorm
# Conflicts: # indra/llcommon/threadpool.h # indra/llwindow/llwindowwin32.cppmaster
commit
426ebef98c
|
|
@ -0,0 +1,211 @@
|
|||
#!/bin/python3
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import zipfile
|
||||
import glob
|
||||
import shutil
|
||||
|
||||
# iterate over the files in a directory and pass them to a command line subshell
|
||||
def get_files(path):
|
||||
files = []
|
||||
for root, dirs, files in os.walk(path):
|
||||
# print(f"Found : {files}")
|
||||
return files
|
||||
return None
|
||||
|
||||
|
||||
# run a command line subshell and return the output
|
||||
|
||||
# We want to get the following output by looping over the files
|
||||
# DOWNLOADS
|
||||
# -------------------------------------------------------------------------------------------------------
|
||||
|
||||
# Windows for SL 64 bit
|
||||
# https://downloads.firestormviewer.org/preview/windows/Phoenix-Firestorm-Releasex64-6-6-8-68355_Setup.exe
|
||||
|
||||
# MD5: 3094776F5DB11B6A959B0F3AED068C6A
|
||||
|
||||
# Windows for SL 32 bit
|
||||
# https://downloads.firestormviewer.org/preview/windows/Phoenix-Firestorm-Release-6-6-8-68355_Setup.exe
|
||||
|
||||
# MD5: 2F960B3353971FFF63307B5210D306F5
|
||||
|
||||
# Windows for Opensim 64bit
|
||||
# https://downloads.firestormviewer.org/preview/windows/Phoenix-FirestormOS-Releasex64-6-6-8-68355_Setup.exe
|
||||
|
||||
# MD5: 6218D7B826538BB956699F9581532ECE
|
||||
|
||||
# Windows for Opensim 32bit
|
||||
# https://downloads.firestormviewer.org/preview/windows/Phoenix-FirestormOS-Release-6-6-8-68355_Setup.exe
|
||||
|
||||
# MD5: D636CAFD287B4C8B96D726FE2A145327
|
||||
|
||||
# -------------------------------------------------------------------------------------------------------
|
||||
# Mac OSX for SL
|
||||
# https://downloads.firestormviewer.org/preview/mac/Phoenix-Firestorm-Releasex64-6-6-8-68355.dmg
|
||||
|
||||
# MD5: DA5AF534690328078B0B7BCEEA8D6959
|
||||
|
||||
# Mac OSX for Opensim
|
||||
# https://downloads.firestormviewer.org/preview/mac/Phoenix-FirestormOS-Releasex64-6-6-8-68355.dmg
|
||||
|
||||
# MD5: 16CA020E73760D8205E2314D07EEC90E
|
||||
|
||||
# -------------------------------------------------------------------------------------------------------
|
||||
# Linux for SL
|
||||
# https://downloads.firestormviewer.org/preview/linux/Phoenix-Firestorm-Releasex64-6-6-8-68355.tar.xz
|
||||
|
||||
# MD5: 1A0C50065077B92889FFBC651E4278E4
|
||||
|
||||
# Linux for Opensim
|
||||
# https://downloads.firestormviewer.org/preview/linux/Phoenix-FirestormOS-Releasex64-6-6-8-68355.tar.xz
|
||||
|
||||
# MD5: 9D5D8021F376194B42F6E7D8E537E45E
|
||||
|
||||
# -------------------------------------------------------------------------------------------------------
|
||||
|
||||
def run_cmd(cmd):
|
||||
# print(cmd)
|
||||
return os.popen(cmd).read()
|
||||
|
||||
#using the md5sum command get the md5 for the file
|
||||
|
||||
def get_md5(mdfile):
|
||||
# print(f"mdfile is {mdfile}")
|
||||
md5sum = run_cmd(f"md5sum {mdfile}")
|
||||
#split md5sum on space
|
||||
md5sum = md5sum.split()[0]
|
||||
#remove leading '\'
|
||||
md5sum = md5sum[1:]
|
||||
return md5sum
|
||||
|
||||
def unzip_file(zip_file, unzip_dir):
|
||||
with zipfile.ZipFile(zip_file, 'r') as zip_ref:
|
||||
zip_ref.extractall(unzip_dir)
|
||||
|
||||
def flatten_tree(tree_root):
|
||||
for root, flatten_dirs, files in os.walk(tree_root, topdown=False):
|
||||
for file in files:
|
||||
# Construct the full path to the file
|
||||
file_path = os.path.join(root, file)
|
||||
# Move the file to the root directory
|
||||
shutil.move(file_path, tree_root)
|
||||
for dir in flatten_dirs:
|
||||
# Construct the full path to the subdirectory
|
||||
subdir_path = os.path.join(root, dir)
|
||||
# Delete the subdirectory and its contents
|
||||
shutil.rmtree(subdir_path)
|
||||
|
||||
|
||||
# parse args first arg optional -r (release) second arg mandatory string path_to_directory
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="print_download_list",
|
||||
description="Prints the list of files for download and their md5 checksums"
|
||||
)
|
||||
parser.add_argument("-r", "--release", required=False, default=False, action="store_true", help="use the release folder in the target URL")
|
||||
parser.add_argument("-u", "--unzip", required=False, default=False, action="store_true", help="unzip the github artifact first")
|
||||
# add path_to_directory required parameter to parser
|
||||
parser.add_argument("path_to_directory", help="path to the directory in which we'll look for the files")
|
||||
|
||||
args = parser.parse_args()
|
||||
path_to_directory = args.path_to_directory
|
||||
release = args.release
|
||||
|
||||
dirs = ["windows", "mac", "linux"]
|
||||
|
||||
if args.unzip:
|
||||
# unzip the github artifact for this OS (`dir`) into the folder `dir`
|
||||
# get the .zip files in args.path_to_directory using glob
|
||||
zips = glob.glob(f"{args.path_to_directory}/*.zip")
|
||||
for file in zips:
|
||||
# print(f"unzipping {file}")
|
||||
if "ubuntu" in file.lower():
|
||||
unzip_file(file, os.path.join(args.path_to_directory, "linux"))
|
||||
if "windows" in file.lower():
|
||||
unzip_file(file, os.path.join(args.path_to_directory, "windows"))
|
||||
if "macos" in file.lower():
|
||||
unzip_file(file, os.path.join(args.path_to_directory, "mac"))
|
||||
for dir in dirs:
|
||||
flatten_tree(os.path.join(args.path_to_directory, dir))
|
||||
# Now move the symbols files to the symbols folder
|
||||
symbols_folder = os.path.join(args.path_to_directory, "symbols")
|
||||
os.mkdir(symbols_folder)
|
||||
# Traverse the directory tree and move all of the files to the root directory
|
||||
symbol_archives = glob.glob(f"{args.path_to_directory}/**/*_hvk*", recursive=True)
|
||||
for sym_file in symbol_archives:
|
||||
print(f"Moving {sym_file} to {symbols_folder}")
|
||||
shutil.move(sym_file, symbols_folder)
|
||||
symbol_archives = glob.glob(f"{args.path_to_directory}/**/*_oss*", recursive=True)
|
||||
for sym_file in symbol_archives:
|
||||
print(f"Moving {sym_file} to {symbols_folder}")
|
||||
shutil.move(sym_file, symbols_folder)
|
||||
|
||||
|
||||
file_dict = {}
|
||||
md5_dict = {}
|
||||
|
||||
for dir in dirs:
|
||||
dir = dir.lower()
|
||||
files = get_files(os.path.join(args.path_to_directory, dir))
|
||||
for file in files:
|
||||
full_file = os.path.join(args.path_to_directory, dir, file)
|
||||
md5 = get_md5(full_file)
|
||||
base_name = os.path.basename(file)
|
||||
if "-Release-" in base_name:
|
||||
wordsize = "32"
|
||||
else:
|
||||
wordsize = "64"
|
||||
|
||||
if "FirestormOS-" in base_name:
|
||||
grid = "OS"
|
||||
else:
|
||||
grid = "SL"
|
||||
|
||||
if dir in dirs:
|
||||
file_dict[f"{grid}{dir}{wordsize}"] = full_file
|
||||
md5_dict[f"{grid}{dir}{wordsize}"] = md5
|
||||
|
||||
download_root_preview = "https://downloads.firestormviewer.org/preview"
|
||||
download_root_release = "https://downloads.firestormviewer.org/release"
|
||||
|
||||
if args.release:
|
||||
download_root = download_root_release
|
||||
else:
|
||||
download_root = download_root_preview
|
||||
|
||||
print('''
|
||||
DOWNLOADS''')
|
||||
|
||||
platforms_printable = {"windows":"MS Windows", "mac":"MacOS", "linux":"Linux"}
|
||||
grids_printable = {"SL":"Second Life", "OS":"OpenSim"}
|
||||
|
||||
for dir in dirs:
|
||||
print(f'''-------------------------------------------------------------------------------------------------------
|
||||
{platforms_printable[dir]}
|
||||
''')
|
||||
dir=dir.lower()
|
||||
wordsize = "64"
|
||||
platform = f"{platforms_printable[dir]}"
|
||||
for grid in ["SL", "OS"]:
|
||||
grid_printable = f"{grids_printable[grid]}"
|
||||
print (f"{platform} for {grid_printable} ({wordsize}-bit)")
|
||||
print ( "{}/{}/{}".format(download_root,dir,os.path.basename(file_dict[f"{grid}{dir}{wordsize}"])) )
|
||||
print ()
|
||||
print ( "MD5: {}".format(md5_dict[f"{grid}{dir}{wordsize}"]) )
|
||||
print ()
|
||||
if(dir == "windows"):
|
||||
# Need to do 32 bit as well
|
||||
wordsize = "32"
|
||||
print (f"{platform} for {grid_printable} ({wordsize}-bit)")
|
||||
print ( "{}/{}/{}".format(download_root,dir,os.path.basename(file_dict[f"{grid}{dir}{wordsize}"])) )
|
||||
print ()
|
||||
print ( "MD5: {}".format(md5_dict[f"{grid}{dir}{wordsize}"]) )
|
||||
print ()
|
||||
wordsize = "64"
|
||||
|
||||
print('''
|
||||
-------------------------------------------------------------------------------------------------------''')
|
||||
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# open the avatar_lad.xml file and load it as a dom object
|
||||
|
||||
from xml.dom import minidom
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
# add positional argument for avatar_lad.xml
|
||||
parser.add_argument("avatar_lad", help="path to avatar_lad.xml file")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
# using minidom open the avatar_lad.xml file and load it as a dom object
|
||||
|
||||
|
||||
# open the avatar_lad.xml file and load it as a dom object
|
||||
|
||||
dom = minidom.parse(open(args.avatar_lad, "rb"))
|
||||
|
||||
|
||||
# get the first element in the dom object
|
||||
|
||||
root = dom.documentElement
|
||||
|
||||
# find the "skeleton" child node
|
||||
skeleton = root.getElementsByTagName("skeleton")[0]
|
||||
|
||||
|
||||
for child in skeleton.childNodes:
|
||||
if child.nodeType == child.ELEMENT_NODE:
|
||||
# if tagname is "attachment_point" and 'hud' attribute doesn't exist print id and name
|
||||
if child.tagName == "attachment_point":
|
||||
if not child.hasAttribute("hud"):
|
||||
print(f"{child.getAttribute('id')} - {child.getAttribute('name')}")
|
||||
else:
|
||||
print(f"{child.getAttribute('id')} - [HUD] {child.getAttribute('name')}")
|
||||
|
||||
|
||||
|
|
@ -308,7 +308,13 @@ bool LLThreadSafeQueue<ElementT, QueueT>::push_(lock_t& lock, T&& element)
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
|
||||
if (mStorage.size() >= mCapacity)
|
||||
// <FS:Beq> Make thread queue capacity hangs visible
|
||||
// return false;
|
||||
{
|
||||
LL_WARNS("ThreadPool") << "Threadsafe queue push_(lockacquired) queue full " << mStorage.size() << " >= " << mCapacity << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
// </FS:Beq>
|
||||
|
||||
mStorage.push(std::forward<T>(element));
|
||||
lock.unlock();
|
||||
|
|
|
|||
|
|
@ -55,7 +55,10 @@ namespace LL
|
|||
* ThreadPool listens for application shutdown messages on the "LLApp"
|
||||
* LLEventPump. Call close() to shut down this ThreadPool early.
|
||||
*/
|
||||
void close();
|
||||
// <FS:Beq> [FIRE-32453][BUG-232971] Improve shutdown behaviour.
|
||||
// void close();
|
||||
virtual void close();
|
||||
// </FS:Beq>
|
||||
|
||||
std::string getName() const { return mName; }
|
||||
size_t getWidth() const { return mThreads.size(); }
|
||||
|
|
@ -90,7 +93,8 @@ namespace LL
|
|||
|
||||
private:
|
||||
void run(const std::string& name);
|
||||
|
||||
|
||||
protected: // <FS:Beq/> [FIRE-32453][BUG-232971] Improve shutdown behaviour.
|
||||
std::string mName;
|
||||
size_t mThreadCount;
|
||||
std::vector<std::pair<std::string, std::thread>> mThreads;
|
||||
|
|
|
|||
|
|
@ -511,7 +511,12 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
// e.g. OS Window for upload something or Input Window...
|
||||
// mModifiers instance variable is for insertText: or insertText:replacementRange: (by Pell Smit)
|
||||
mModifiers = [theEvent modifierFlags];
|
||||
unichar ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
|
||||
NSString *str_no_modifiers = [theEvent charactersIgnoringModifiers];
|
||||
unichar ch = 0;
|
||||
if (str_no_modifiers.length)
|
||||
{
|
||||
ch = [str_no_modifiers characterAtIndex:0];
|
||||
}
|
||||
bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, ch);
|
||||
|
||||
if (acceptsText &&
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "llwindowcallbacks.h"
|
||||
|
||||
// Linden library includes
|
||||
#include "llapp.h" // <FS:Beq/> [FIRE-32453][BUG-232971] Improve shutdown behaviour.
|
||||
#include "llerror.h"
|
||||
#include "llexception.h"
|
||||
#include "llfasttimer.h"
|
||||
|
|
@ -93,6 +94,7 @@ const UINT WM_DUMMY_(WM_USER + 0x0017);
|
|||
const UINT WM_POST_FUNCTION_(WM_USER + 0x0018);
|
||||
|
||||
extern BOOL gDebugWindowProc;
|
||||
extern BOOL gDisconnected; // <FS:Beq/> [FIRE-32453][BUG-232971] Improve shutdown behaviour.
|
||||
|
||||
static std::thread::id sWindowThreadId;
|
||||
static std::thread::id sMainThreadId;
|
||||
|
|
@ -351,6 +353,7 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
|
|||
LLWindowWin32Thread();
|
||||
|
||||
void run() override;
|
||||
void close() override; // <FS:Beq/> [FIRE-32453][BUG-232971] Improve shutdown behaviour.
|
||||
|
||||
// initialzie DXGI adapter (for querying available VRAM)
|
||||
void initDX();
|
||||
|
|
@ -5056,6 +5059,31 @@ void LLWindowWin32::LLWindowWin32Thread::updateVRAMUsage()
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Beq> [FIRE-32453][BUG-232971] Improve shutdown behaviour.
|
||||
// Provide a close() override that ignores the initial close triggered by the threadpool detecting "quit"
|
||||
// but waits for the viewer to be disconected and the second close call triggered by the app window destructor
|
||||
void LLWindowWin32::LLWindowWin32Thread::close()
|
||||
{
|
||||
assert_main_thread();
|
||||
if (! mQueue.isClosed() && gDisconnected)
|
||||
{
|
||||
LL_DEBUGS("ThreadPool") << mName << " closing queue and joining threads" << LL_ENDL;
|
||||
mQueue.close();
|
||||
for (auto& pair: mThreads)
|
||||
{
|
||||
LL_DEBUGS("ThreadPool") << mName << " waiting on thread " << pair.first << LL_ENDL;
|
||||
// if mName does not contain the word Window
|
||||
pair.second.join();
|
||||
}
|
||||
LL_DEBUGS("ThreadPool") << mName << " shutdown complete" << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("ThreadPool") << mName << " shutdown request ignored - not yet disconneced." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
// </FS:Beq>
|
||||
|
||||
void LLWindowWin32::LLWindowWin32Thread::run()
|
||||
{
|
||||
sWindowThreadId = std::this_thread::get_id();
|
||||
|
|
@ -5101,20 +5129,30 @@ void LLWindowWin32::LLWindowWin32Thread::run()
|
|||
", ", msg.wParam, ")");
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
|
||||
mMessageQueue.pushFront(msg);
|
||||
// <FS:Beq> [FIRE-32453][BUG-232971] Improve shutdown behaviour.
|
||||
// mMessageQueue.pushFront(msg);
|
||||
try
|
||||
{
|
||||
// <FS:Beq> Nobody is reading this queue once we are quitting. Writing to it causes a hang.
|
||||
if(!LLApp::isQuitting())
|
||||
mMessageQueue.pushFront(msg);
|
||||
}
|
||||
catch (const LLThreadSafeQueueInterrupt&)
|
||||
{
|
||||
// Shutdown timing is tricky. The main thread can end up trying
|
||||
// to post a cursor position after having closed the WorkQueue.
|
||||
logger.always("Message procesing tried to push() to closed MessageQueue - caught");
|
||||
}
|
||||
// </FS:Beq>
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("w32t - Function Queue");
|
||||
logger.onChange("runPending()");
|
||||
logger.onChange("runPending()");
|
||||
//process any pending functions
|
||||
getQueue().runPending();
|
||||
}
|
||||
// <FS:Beq> This is very verbose even for debug so it has it's own debug tag
|
||||
LL_DEBUGS("WindowVerbose") << "PreCheck Done - closed=" << getQueue().isClosed() << " size=" << getQueue().size() << LL_ENDL;
|
||||
// </FS:Beq>
|
||||
|
||||
// update available vram once every 3 seconds
|
||||
static LLFrameTimer vramTimer;
|
||||
|
|
@ -5156,12 +5194,26 @@ void LLWindowWin32::LLWindowWin32Thread::run()
|
|||
|
||||
void LLWindowWin32::post(const std::function<void()>& func)
|
||||
{
|
||||
mFunctionQueue.pushFront(func);
|
||||
try
|
||||
{
|
||||
mFunctionQueue.pushFront(func);
|
||||
}
|
||||
catch (const LLThreadSafeQueueInterrupt&)
|
||||
{
|
||||
LL_INFOS("Window") << "push function to closed Queue caught" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
void LLWindowWin32::postMouseButtonEvent(const std::function<void()>& func)
|
||||
{
|
||||
mMouseQueue.pushFront(func);
|
||||
try
|
||||
{
|
||||
mMouseQueue.pushFront(func);
|
||||
}
|
||||
catch (const LLThreadSafeQueueInterrupt&)
|
||||
{
|
||||
LL_INFOS("Window") << "push mouse event to closed Queue caught" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
void LLWindowWin32::kickWindowThread(HWND windowHandle)
|
||||
|
|
|
|||
|
|
@ -1756,9 +1756,7 @@ bool LLAppViewer::doFrame()
|
|||
{
|
||||
LLVoiceClient::getInstance()->terminate();
|
||||
}
|
||||
// <FS:Beq> [FIRE-32453] [BUG-232971] disconnect sooner to force the cache write.
|
||||
persistCachesAndSettings();
|
||||
// </FS:Beq>
|
||||
|
||||
disconnectViewer();
|
||||
resumeMainloopTimeout();
|
||||
}
|
||||
|
|
@ -2035,6 +2033,7 @@ bool LLAppViewer::cleanup()
|
|||
LLViewerCamera::deleteSingleton();
|
||||
|
||||
LL_INFOS() << "Viewer disconnected" << LL_ENDL;
|
||||
|
||||
if (gKeyboard)
|
||||
{
|
||||
gKeyboard->resetKeys();
|
||||
|
|
@ -4827,9 +4826,6 @@ void LLAppViewer::removeDumpDir()
|
|||
|
||||
void LLAppViewer::forceQuit()
|
||||
{
|
||||
// <FS:Beq> [FIRE-32453] [BUG-232971] disconnect sooner to force the cache write.
|
||||
persistCachesAndSettings();
|
||||
// </FS:Beq>
|
||||
LLApp::setQuitting();
|
||||
}
|
||||
|
||||
|
|
@ -6298,12 +6294,7 @@ void LLAppViewer::idleNetwork()
|
|||
}
|
||||
}
|
||||
add(LLStatViewer::NUM_NEW_OBJECTS, gObjectList.mNumNewObjects);
|
||||
// <FS:Beq> [FIRE-32453] [BUG-232971] disconnect sooner to force the cache write.
|
||||
if(gDisconnected)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// </FS:Beq>
|
||||
|
||||
// Retransmit unacknowledged packets.
|
||||
gXferManager->retransmitUnackedPackets();
|
||||
gAssetStorage->checkForTimeouts();
|
||||
|
|
@ -6325,42 +6316,7 @@ void LLAppViewer::idleNetwork()
|
|||
mAgentRegionLastAlive = this_region_alive;
|
||||
}
|
||||
}
|
||||
void LLAppViewer::persistCachesAndSettings()
|
||||
{
|
||||
// Save inventory to disk if appropriate
|
||||
if (gInventory.isInventoryUsable()
|
||||
&& gAgent.getID().notNull()) // Shouldn't be null at this stage
|
||||
{
|
||||
LL_INFOS() << "Saving Inventory Cache" << LL_ENDL;
|
||||
gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());
|
||||
if (gInventory.getLibraryRootFolderID().notNull()
|
||||
&& gInventory.getLibraryOwnerID().notNull())
|
||||
{
|
||||
gInventory.cache(
|
||||
gInventory.getLibraryRootFolderID(),
|
||||
gInventory.getLibraryOwnerID());
|
||||
}
|
||||
LL_INFOS() << "Saving Inventory Cache : COMPLETED" << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS() << "Not Saving Inventory Cache : Inventory is currently unusable" << LL_ENDL;
|
||||
}
|
||||
// Persist name cache
|
||||
LLAvatarNameCache::instance().setCustomNameCheckCallback(LLAvatarNameCache::custom_name_check_callback_t()); // <FS:Ansariel> Contact sets
|
||||
LL_INFOS() << "Saving Name Cache" << LL_ENDL;
|
||||
saveNameCache();
|
||||
LL_INFOS() << "Saving Name Cache : COMPLETED" << LL_ENDL;
|
||||
|
||||
// Save experience cache if appropriate
|
||||
if (LLExperienceCache::instanceExists())
|
||||
{
|
||||
LL_INFOS() << "Saving Experience Cache" << LL_ENDL;
|
||||
LLExperienceCache::instance().cleanup();
|
||||
LL_INFOS() << "Saving Experience Cache : COMPLETED" << LL_ENDL;
|
||||
}
|
||||
|
||||
}
|
||||
void LLAppViewer::disconnectViewer()
|
||||
{
|
||||
if (gDisconnected)
|
||||
|
|
@ -6396,32 +6352,30 @@ void LLAppViewer::disconnectViewer()
|
|||
{
|
||||
LLSelectMgr::getInstance()->deselectAll();
|
||||
}
|
||||
// <FS:Beq> [FIRE-32453] [BUG-232971] Persist before disconnect
|
||||
// Moved to separate function
|
||||
// // save inventory if appropriate
|
||||
// if (gInventory.isInventoryUsable()
|
||||
// && gAgent.getID().notNull()) // Shouldn't be null at this stage
|
||||
// {
|
||||
// gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());
|
||||
// if (gInventory.getLibraryRootFolderID().notNull()
|
||||
// && gInventory.getLibraryOwnerID().notNull())
|
||||
// {
|
||||
// gInventory.cache(
|
||||
// gInventory.getLibraryRootFolderID(),
|
||||
// gInventory.getLibraryOwnerID());
|
||||
// }
|
||||
// }
|
||||
|
||||
// LLAvatarNameCache::instance().setCustomNameCheckCallback(LLAvatarNameCache::custom_name_check_callback_t()); // <FS:Ansariel> Contact sets
|
||||
// saveNameCache();
|
||||
// if (LLExperienceCache::instanceExists())
|
||||
// {
|
||||
// // TODO: LLExperienceCache::cleanup() logic should be moved to
|
||||
// // cleanupSingleton().
|
||||
// LLExperienceCache::instance().cleanup();
|
||||
// }
|
||||
// save inventory if appropriate
|
||||
if (gInventory.isInventoryUsable()
|
||||
&& gAgent.getID().notNull()) // Shouldn't be null at this stage
|
||||
{
|
||||
gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());
|
||||
if (gInventory.getLibraryRootFolderID().notNull()
|
||||
&& gInventory.getLibraryOwnerID().notNull())
|
||||
{
|
||||
gInventory.cache(
|
||||
gInventory.getLibraryRootFolderID(),
|
||||
gInventory.getLibraryOwnerID());
|
||||
}
|
||||
}
|
||||
|
||||
LLAvatarNameCache::instance().setCustomNameCheckCallback(LLAvatarNameCache::custom_name_check_callback_t()); // <FS:Ansariel> Contact sets
|
||||
saveNameCache();
|
||||
if (LLExperienceCache::instanceExists())
|
||||
{
|
||||
// TODO: LLExperienceCache::cleanup() logic should be moved to
|
||||
// cleanupSingleton().
|
||||
LLExperienceCache::instance().cleanup();
|
||||
}
|
||||
|
||||
// </FS:Beq>
|
||||
// close inventory interface, close all windows
|
||||
LLSidepanelInventory::cleanup();
|
||||
|
||||
|
|
@ -6451,7 +6405,7 @@ void LLAppViewer::disconnectViewer()
|
|||
LLDestroyClassList::instance().fireCallbacks();
|
||||
|
||||
cleanup_xfer_manager();
|
||||
gDisconnected = TRUE;
|
||||
gDisconnected = TRUE;
|
||||
|
||||
// Pass the connection state to LLUrlEntryParcel not to attempt
|
||||
// parcel info requests while disconnected.
|
||||
|
|
|
|||
|
|
@ -283,7 +283,6 @@ private:
|
|||
void idleNetwork();
|
||||
|
||||
void sendLogoutRequest();
|
||||
void persistCachesAndSettings();
|
||||
void disconnectViewer();
|
||||
|
||||
// *FIX: the app viewer class should be some sort of singleton, no?
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
legacy_header_height="18"
|
||||
can_minimize="false"
|
||||
can_close="false"
|
||||
height="200"
|
||||
height="215"
|
||||
layout="topleft"
|
||||
name="Display Name"
|
||||
help_topic="display_name"
|
||||
|
|
@ -30,12 +30,12 @@
|
|||
length="1"
|
||||
follows="left|top"
|
||||
font="SansSerif"
|
||||
height="16"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
left="25"
|
||||
text_color="EmphasisColor"
|
||||
name="lockout_text"
|
||||
top="50"
|
||||
top="65"
|
||||
use_ellipses="true"
|
||||
visible="false"
|
||||
width="410"
|
||||
|
|
|
|||
Loading…
Reference in New Issue