FIRE-5782 - Threaded filepickers for uploads

Cinder Roxley 2012-10-06 12:29:16 -06:00
parent 8e136288c7
commit b6ed0e6930
6 changed files with 277 additions and 54 deletions

View File

@ -281,7 +281,10 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
return success;
}
BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
// <FS:CR Threaded Filepickers>
//BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
// </FS:CR Threaded Filepickers>
{
if( mLocked )
{
@ -309,8 +312,13 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
reset();
// Modal, so pause agent
send_agent_pause();
// <FS:CR Threaded Filepickers>
if (blocking)
{
// Modal, so pause agent
send_agent_pause();
}
// </FS:CR Threaded Filepickers>
// NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
success = GetOpenFileName(&mOFN); // pauses until ok or cancel.
if( success )
@ -343,14 +351,21 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
}
}
}
send_agent_resume();
// Account for the fact that the app has been stalled.
LLFrameTimer::updateFrameTime();
// <FS:CR Threaded Filepickers>
if (blocking)
{
send_agent_resume();
// Account for the fact that the app has been stalled.
LLFrameTimer::updateFrameTime();
}
// </FS:CR Threaded Filepickers>
return success;
}
BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
// <FS:CR Threaded Filepickers>
//BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, bool blocking)
// </FS:CR Threaded Filepickers>
{
if( mLocked )
{
@ -535,8 +550,13 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
reset();
// Modal, so pause agent
send_agent_pause();
// <FS:CR Threaded Filepickers>
if (blocking)
{
// Modal, so pause agent
send_agent_pause();
}
// </FS:CR Threaded Filepickers>
{
// NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
success = GetSaveFileName(&mOFN);
@ -547,10 +567,14 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
}
gKeyboard->resetKeys();
}
send_agent_resume();
// Account for the fact that the app has been stalled.
LLFrameTimer::updateFrameTime();
// <FS:CR Threaded Filepickers>
if (blocking)
{
send_agent_resume();
// Account for the fact that the app has been stalled.
LLFrameTimer::updateFrameTime();
}
// </FS:CR Threaded Filepickers>
return success;
}
@ -991,11 +1015,19 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
mNavOptions.optionFlags |= kNavAllowMultipleFiles;
// Modal, so pause agent
send_agent_pause();
// <FS:CR Threaded Filepickers>
{
send_agent_pause();
}
// </FS:CR Threaded Filepickers>
{
error = doNavChooseDialog(filter);
}
send_agent_resume();
// <FS:CR Threaded Filepickers>
{
send_agent_resume();
}
// </FS:CR Threaded Filepickers>
if (error == noErr)
{
if (getFileCount())
@ -1424,7 +1456,10 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
return rtn;
}
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
// <FS:CR Threaded Filepickers>
//BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
// </FS:CR Threaded Filepickers>
{
BOOL rtn = FALSE;
@ -1483,7 +1518,10 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
return FALSE;
}
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
// <FS:CR Threaded Filepickers>
//BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
// </FS:CR Threaded Filepickers>
{
// if local file browsing is turned off, return without opening dialog
// (Even though this is a stub, I think we still should not return anything at all)
@ -1508,7 +1546,10 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
return TRUE;
}
// <FS:CR Threaded Filepickers>
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
// </FS:CR Threaded Filepickers>
{
// if local file browsing is turned off, return without opening dialog
// (Even though this is a stub, I think we still should not return anything at all)
@ -1531,13 +1572,19 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
return FALSE;
}
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
// <FS:CR Threaded Filepickers>
//BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
// </FS:CR Threaded Filepickers>
{
reset();
return FALSE;
}
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
// <FS:CR Threaded Filepickers>
//BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
// </FS:CR Threaded Filepickers>
{
reset();
return FALSE;

View File

@ -110,9 +110,13 @@ public:
};
// open the dialog. This is a modal operation
BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null );
// <FS:CR Threaded Filepickers>
//BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null );
BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null, bool blocking = true );
BOOL getOpenFile( ELoadFilter filter = FFLOAD_ALL, bool blocking = true );
BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL );
//BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL );
BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL, bool blocking = true );
// </FS:CR Threaded Filepickers>
// Get the filename(s) found. getFirstFile() sets the pointer to
// the start of the structure and allows the start of iteration.

View File

@ -375,7 +375,10 @@ BOOL stop_gloderror()
LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)
: LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
// <FS:CR Threaded Filepickers>
//: LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
: LLLoadFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
// </FS:CR Threaded Filepickers>
{
mMP = mp;
mLOD = lod;

View File

@ -292,7 +292,10 @@ private:
LLButton* mCalculateBtn;
};
class LLMeshFilePicker : public LLFilePickerThread
// <FS:CR Threaded Filepickers>
//class LLMeshFilePicker : public LLFilePickerThread
class LLMeshFilePicker : public LLLoadFilePickerThread
// </FS:CR Threaded Filepickers>
{
public:
LLMeshFilePicker(LLModelPreview* mp, S32 lod);

View File

@ -127,8 +127,19 @@ void LLFilePickerThread::getFile()
#endif
}
// <FS:CR Threaded Filepickers>
//static
void LLFilePickerThread::initClass()
{
sMutex = new LLMutex(NULL);
}
// </FS:CR Threaded Filepickers>
//virtual
void LLFilePickerThread::run()
// <FS:CR Threaded Filepickers>
//void LLFilePickerThread::run()
void LLLoadFilePickerThread::run()
// </FS:CR Threaded Filepickers>
{
LLFilePicker picker;
#if LL_WINDOWS
@ -150,12 +161,46 @@ void LLFilePickerThread::run()
}
//static
void LLFilePickerThread::initClass()
// <FS:CR Threaded Filepickers>
////static
//void LLFilePickerThread::initClass()
//virtual
void LLSaveFilePickerThread::run()
{
sMutex = new LLMutex(NULL);
//sMutex = new LLMutex(NULL);
LLFilePicker picker;
#if LL_WINDOWS
if (picker.getSaveFile(mFilter, mDefaultFilename, false))
{
mFile = picker.getFirstFile();
}
#else
if (picker.getSaveFile(mFilter, mDefaultFilename, true))
{
mFile = picker.getFirstFile();
}
#endif
{
LLMutexLock lock(sMutex);
sDeadQ.push(this);
}
}
//virtual
void LLGenericLoadFilePicker::notify(const std::string& filename)
{
mSignal(filename);
}
//virtual
void LLGenericSaveFilePicker::notify(const std::string& filename)
{
mSignal(filename);
}
// </FS:CR Threaded Filepickers>
//static
void LLFilePickerThread::cleanupClass()
{
@ -234,6 +279,12 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
returns the string to the full path filename, else returns NULL.
Data is the load filter for the type of file as defined in LLFilePicker.
**/
// <FS:CR Threaded Filepickers>
//! upload_pick has been superceded by threaded filepickers
#if 0
// </FS:CR Threaded Filepickers>
const std::string upload_pick(void* data)
{
if( gAgentCamera.cameraMouselook() )
@ -341,16 +392,48 @@ const std::string upload_pick(void* data)
return filename;
}
// <FS:CR Threaded Filepickers>
#endif
//static
void show_floater_callback(const std::string& floater, const std::string& filename)
{
if (!filename.empty() && !floater.empty())
{
LLFloaterReg::showInstance(floater, LLSD(filename));
}
}
//static
void show_floater_anim_callback(const std::string& filename)
{
if (!filename.empty())
{
if (filename.rfind(".anim") != std::string::npos)
{
LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
}
else
{
LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
}
}
}
// </FS:CR Threaded Filepickers>
class LLFileUploadImage : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
std::string filename = upload_pick((void *)LLFilePicker::FFLOAD_IMAGE);
if (!filename.empty())
{
LLFloaterReg::showInstance("upload_image", LLSD(filename));
}
// <FS:CR Threaded Filepickers>
//std::string filename = upload_pick((void *)LLFilePicker::FFLOAD_IMAGE);
//if (!filename.empty())
//{
// LLFloaterReg::showInstance("upload_image", LLSD(filename));
//}
(new LLGenericLoadFilePicker(LLFilePicker::FFLOAD_IMAGE, boost::bind(&show_floater_callback,"upload_image",_1)))->getFile();
// </FS:CR Threaded Filepickers>
return TRUE;
}
};
@ -373,11 +456,14 @@ class LLFileUploadSound : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_WAV);
if (!filename.empty())
{
LLFloaterReg::showInstance("upload_sound", LLSD(filename));
}
// <FS:CR Threaded Filepickers>
//std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_WAV);
//if (!filename.empty())
//{
// LLFloaterReg::showInstance("upload_sound", LLSD(filename));
//}
(new LLGenericLoadFilePicker(LLFilePicker::FFLOAD_WAV, boost::bind(&show_floater_callback,"upload_sound",_1)))->getFile();
// </FS:CR Threaded Filepickers>
return true;
}
};
@ -386,18 +472,24 @@ class LLFileUploadAnim : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
const std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_ANIM);
if (!filename.empty())
{
if (filename.rfind(".anim") != std::string::npos)
{
LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
}
else
{
LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
}
}
// <FS:CR Threaded Filepickers>
/// This logic has been moved to show_floater_anim_callback to conform
/// with the rest of the threaded filepickers. -CR
//
//const std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_ANIM);
//if (!filename.empty())
//{
// if (filename.rfind(".anim") != std::string::npos)
// {
// LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
// }
// else
// {
// LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
// }
//}
(new LLGenericLoadFilePicker(LLFilePicker::FFLOAD_ANIM, boost::bind(&show_floater_anim_callback,_1)))->getFile();
// </FS:CR Threaded Filepickers>
return true;
}
};

View File

@ -32,6 +32,8 @@
#include "llinventorytype.h"
#include "llfilepicker.h"
#include <boost\signals2.hpp> // <FS:CR Threaded Filepickers />
class LLTransactionID;
@ -111,20 +113,92 @@ public:
std::string mFile;
LLFilePicker::ELoadFilter mFilter;
LLFilePickerThread(LLFilePicker::ELoadFilter filter)
: LLThread("file picker"), mFilter(filter)
// <FS:CR Threaded Filepickers>
//LLFilePicker::ELoadFilter mFilter;
//
//LLFilePickerThread(LLFilePicker::ELoadFilter filter)
// : LLThread("file picker"), mFilter(filter)
LLFilePickerThread()
: LLThread("file picker")
// </FS:CR Threaded Filepickers>
{
}
void getFile();
// <FS:CR Threaded Filepickers>
virtual void run() = 0;
virtual void notify(const std::string& filename) = 0;
};
class LLLoadFilePickerThread : public LLFilePickerThread
{ //multi-threaded file picker (runs system specific file picker in background and calls "notify" from main thread)
public:
LLFilePicker::ELoadFilter mFilter;
LLLoadFilePickerThread(LLFilePicker::ELoadFilter filter)
: LLFilePickerThread(), mFilter(filter)
{
}
// <FS:CR Threaded Filepickers>
virtual void run();
virtual void notify(const std::string& filename) = 0;
};
// <FS:CR Threaded Filepickers>
class LLSaveFilePickerThread : public LLFilePickerThread
{ //multi-threaded file picker (runs system specific file picker in background and calls "notify" from main thread)
public:
LLFilePicker::ESaveFilter mFilter;
std::string mDefaultFilename;
LLSaveFilePickerThread(LLFilePicker::ESaveFilter filter, const std::string& default_name)
: LLFilePickerThread(), mFilter(filter), mDefaultFilename(default_name)
{
}
virtual void run();
virtual void notify(const std::string& filename) = 0;
};
class LLGenericLoadFilePicker : public LLLoadFilePickerThread
{
public:
LLGenericLoadFilePicker::LLGenericLoadFilePicker(LLFilePicker::ELoadFilter filter, boost::function<void (const std::string&)> notify_slot)
: LLLoadFilePickerThread(filter)
{
mSignal.connect(notify_slot);
}
virtual void notify(const std::string& filename);
protected:
boost::signals2::signal<void (const std::string&)> mSignal;
};
class LLGenericSaveFilePicker : public LLSaveFilePickerThread
{
public:
LLGenericSaveFilePicker::LLGenericSaveFilePicker(LLFilePicker::ESaveFilter filter, const std::string& default_name, boost::function<void (const std::string&)> notify_slot)
: LLSaveFilePickerThread(filter, default_name)
{
mSignal.connect(notify_slot);
}
virtual void notify(const std::string& filename);
protected:
boost::signals2::signal<void (const std::string&)> mSignal;
};
static void show_floater_callback(const std::string& floater, const std::string& filename);
static void show_floater_anim_callback(const std::string& filename);
// <FS:CR Threaded Filepickers>
#endif