Use AIFilePicker everywhere.
Also upgrade the file picker filters with the new extensions found in the orginal file picker code of Singularity. Also improve AIFilePicker a bit: added hasFilename() and now deleting the statemachine automatically by default: it's no longer needed to call deleteMe from the callback.
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
#include "llinventorybackup.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "llviewerinventory.h"
|
||||
#include "llfilepicker.h"
|
||||
#include "statemachine/aifilepicker.h"
|
||||
#include "lldirpicker.h"
|
||||
#include "llviewertexturelist.h" // gTextureList
|
||||
#include "llagent.h" // gAgent
|
||||
@@ -158,64 +158,64 @@ bool LLInventoryBackup::itemIsFolder(LLInventoryItem* item)
|
||||
}
|
||||
|
||||
// static
|
||||
LLFilePicker::ESaveFilter LLInventoryBackup::getSaveFilter(LLInventoryItem* item)
|
||||
ESaveFilter LLInventoryBackup::getSaveFilter(LLInventoryItem* item)
|
||||
{
|
||||
LLAssetType::EType type = item->getType();
|
||||
EWearableType wear = (EWearableType)(item->getFlags() & 0xFF);
|
||||
switch(type)
|
||||
{
|
||||
case LLAssetType::AT_TEXTURE:
|
||||
return LLFilePicker::FFSAVE_TGA;
|
||||
return FFSAVE_TGA;
|
||||
case LLAssetType::AT_SOUND:
|
||||
return LLFilePicker::FFSAVE_OGG;
|
||||
return FFSAVE_OGG;
|
||||
case LLAssetType::AT_SCRIPT:
|
||||
case LLAssetType::AT_LSL_TEXT:
|
||||
return LLFilePicker::FFSAVE_LSL;
|
||||
return FFSAVE_LSL;
|
||||
case LLAssetType::AT_ANIMATION:
|
||||
return LLFilePicker::FFSAVE_ANIMATN;
|
||||
return FFSAVE_ANIMATN;
|
||||
case LLAssetType::AT_GESTURE:
|
||||
return LLFilePicker::FFSAVE_GESTURE;
|
||||
return FFSAVE_GESTURE;
|
||||
case LLAssetType::AT_NOTECARD:
|
||||
return LLFilePicker::FFSAVE_NOTECARD;
|
||||
return FFSAVE_NOTECARD;
|
||||
case LLAssetType::AT_LANDMARK:
|
||||
return LLFilePicker::FFSAVE_LANDMARK;
|
||||
return FFSAVE_LANDMARK;
|
||||
case LLAssetType::AT_BODYPART:
|
||||
case LLAssetType::AT_CLOTHING:
|
||||
switch(wear)
|
||||
{
|
||||
case WT_EYES:
|
||||
return LLFilePicker::FFSAVE_EYES;
|
||||
return FFSAVE_EYES;
|
||||
case WT_GLOVES:
|
||||
return LLFilePicker::FFSAVE_GLOVES;
|
||||
return FFSAVE_GLOVES;
|
||||
case WT_HAIR:
|
||||
return LLFilePicker::FFSAVE_HAIR;
|
||||
return FFSAVE_HAIR;
|
||||
case WT_JACKET:
|
||||
return LLFilePicker::FFSAVE_JACKET;
|
||||
return FFSAVE_JACKET;
|
||||
case WT_PANTS:
|
||||
return LLFilePicker::FFSAVE_PANTS;
|
||||
return FFSAVE_PANTS;
|
||||
case WT_SHAPE:
|
||||
return LLFilePicker::FFSAVE_SHAPE;
|
||||
return FFSAVE_SHAPE;
|
||||
case WT_SHIRT:
|
||||
return LLFilePicker::FFSAVE_SHIRT;
|
||||
return FFSAVE_SHIRT;
|
||||
case WT_SHOES:
|
||||
return LLFilePicker::FFSAVE_SHOES;
|
||||
return FFSAVE_SHOES;
|
||||
case WT_SKIN:
|
||||
return LLFilePicker::FFSAVE_SKIN;
|
||||
return FFSAVE_SKIN;
|
||||
case WT_SKIRT:
|
||||
return LLFilePicker::FFSAVE_SKIRT;
|
||||
return FFSAVE_SKIRT;
|
||||
case WT_SOCKS:
|
||||
return LLFilePicker::FFSAVE_SOCKS;
|
||||
return FFSAVE_SOCKS;
|
||||
case WT_UNDERPANTS:
|
||||
return LLFilePicker::FFSAVE_UNDERPANTS;
|
||||
return FFSAVE_UNDERPANTS;
|
||||
case WT_UNDERSHIRT:
|
||||
return LLFilePicker::FFSAVE_UNDERSHIRT;
|
||||
return FFSAVE_UNDERSHIRT;
|
||||
case WT_PHYSICS:
|
||||
return LLFilePicker::FFSAVE_PHYSICS;
|
||||
return FFSAVE_PHYSICS;
|
||||
default:
|
||||
return LLFilePicker::FFSAVE_ALL;
|
||||
return FFSAVE_ALL;
|
||||
}
|
||||
default:
|
||||
return LLFilePicker::FFSAVE_ALL;
|
||||
return FFSAVE_ALL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -352,28 +352,9 @@ void LLInventoryBackup::imageCallback(BOOL success,
|
||||
return;
|
||||
}
|
||||
|
||||
LLFilePicker& file_picker = LLFilePicker::instance();
|
||||
if( !file_picker.getSaveFile( getSaveFilter(item), LLDir::getScrubbedFileName(item->getName())) )
|
||||
{
|
||||
// User canceled or we failed to acquire save file.
|
||||
return;
|
||||
}
|
||||
// remember the user-approved/edited file name.
|
||||
std::string filename = file_picker.getFirstFile();
|
||||
|
||||
LLPointer<LLImageTGA> image_tga = new LLImageTGA;
|
||||
if( !image_tga->encode( src ) )
|
||||
{
|
||||
LLSD args;
|
||||
args["ERROR_MESSAGE"] = "Couldn't encode file.";
|
||||
LLNotifications::instance().add("ErrorMessage", args);
|
||||
}
|
||||
else if( !image_tga->save( filename ) )
|
||||
{
|
||||
LLSD args;
|
||||
args["ERROR_MESSAGE"] = "Couldn't write file.";
|
||||
LLNotifications::instance().add("ErrorMessage", args);
|
||||
}
|
||||
AIFilePicker* filepicker = new AIFilePicker;
|
||||
filepicker->open(LLDir::getScrubbedFileName(item->getName()), getSaveFilter(item));
|
||||
filepicker->run(boost::bind(&LLInventoryBackup::imageCallback_continued, src, filepicker));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -381,6 +362,28 @@ void LLInventoryBackup::imageCallback(BOOL success,
|
||||
}
|
||||
}
|
||||
|
||||
void LLInventoryBackup::imageCallback_continued(LLImageRaw* src, AIFilePicker* filepicker)
|
||||
{
|
||||
if (!filepicker->hasFilename())
|
||||
return;
|
||||
|
||||
std::string filename = filepicker->getFilename();
|
||||
|
||||
LLPointer<LLImageTGA> image_tga = new LLImageTGA;
|
||||
if( !image_tga->encode( src ) )
|
||||
{
|
||||
LLSD args;
|
||||
args["ERROR_MESSAGE"] = "Couldn't encode file.";
|
||||
LLNotifications::instance().add("ErrorMessage", args);
|
||||
}
|
||||
else if( !image_tga->save( filename ) )
|
||||
{
|
||||
LLSD args;
|
||||
args["ERROR_MESSAGE"] = "Couldn't write file.";
|
||||
LLNotifications::instance().add("ErrorMessage", args);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLInventoryBackup::assetCallback(LLVFS *vfs,
|
||||
const LLUUID& asset_uuid,
|
||||
@@ -402,7 +405,7 @@ void LLInventoryBackup::assetCallback(LLVFS *vfs,
|
||||
LLVFile file(vfs, asset_uuid, type, LLVFile::READ);
|
||||
S32 size = file.getSize();
|
||||
|
||||
char* buffer = new char[size];
|
||||
char* buffer = new char[size]; // Deleted in assetCallback_continued.
|
||||
if (buffer == NULL)
|
||||
{
|
||||
llerrs << "Memory Allocation Failed" << llendl;
|
||||
@@ -413,18 +416,22 @@ void LLInventoryBackup::assetCallback(LLVFS *vfs,
|
||||
|
||||
// Write it back out...
|
||||
|
||||
LLFilePicker& file_picker = LLFilePicker::instance();
|
||||
if( !file_picker.getSaveFile( getSaveFilter(item), LLDir::getScrubbedFileName(item->getName())) )
|
||||
{
|
||||
// User canceled or we failed to acquire save file.
|
||||
return;
|
||||
}
|
||||
// remember the user-approved/edited file name.
|
||||
std::string filename = file_picker.getFirstFile();
|
||||
AIFilePicker* filepicker = new AIFilePicker;
|
||||
filepicker->open(LLDir::getScrubbedFileName(item->getName()), getSaveFilter(item));
|
||||
filepicker->run(boost::bind(&LLInventoryBackup::assetCallback_continued, buffer, size, filepicker));
|
||||
}
|
||||
|
||||
std::ofstream export_file(filename.c_str(), std::ofstream::binary);
|
||||
export_file.write(buffer, size);
|
||||
export_file.close();
|
||||
// static
|
||||
void LLInventoryBackup::assetCallback_continued(char* buffer, S32 size, AIFilePicker* filepicker)
|
||||
{
|
||||
if (filepicker->hasFilename())
|
||||
{
|
||||
std::string filename = filepicker->getFilename();
|
||||
std::ofstream export_file(filename.c_str(), std::ofstream::binary);
|
||||
export_file.write(buffer, size);
|
||||
export_file.close();
|
||||
}
|
||||
delete [] buffer;
|
||||
}
|
||||
|
||||
// static
|
||||
|
||||
Reference in New Issue
Block a user