From f82785a9b275b78b47cdebaf2ccfc8aa9407c405 Mon Sep 17 00:00:00 2001 From: daianakproductengine Date: Wed, 24 May 2017 16:33:39 +0300 Subject: MAINT-4375 Viewer saves an empty snapshots if disk is full --- indra/newview/llpanelsnapshotlocal.cpp | 1 + indra/newview/llsnapshotlivepreview.cpp | 38 +++++++++++++++++++++- indra/newview/llsnapshotlivepreview.h | 1 + indra/newview/llviewermenufile.cpp | 2 +- indra/newview/llviewerwindow.cpp | 11 +++++++ indra/newview/llviewerwindow.h | 1 + .../newview/skins/default/xui/en/notifications.xml | 5 +++ 7 files changed, 57 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp index 51ec964ace..77378f8092 100644 --- a/indra/newview/llpanelsnapshotlocal.cpp +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -172,6 +172,7 @@ void LLPanelSnapshotLocal::onSaveFlyoutCommit(LLUICtrl* ctrl) } else { + cancel(); floater->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "local"))); } } diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 58e48480c1..c6f8c414fa 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -45,6 +45,7 @@ #include "llimagepng.h" #include "lllandmarkactions.h" #include "lllocalcliprect.h" +#include "llresmgr.h" #include "llnotificationsutil.h" #include "llslurl.h" #include "llsnapshotlivepreview.h" @@ -56,6 +57,7 @@ #include "llvfs.h" #include "llwindow.h" #include "llworld.h" +#include const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -1069,7 +1071,7 @@ BOOL LLSnapshotLivePreview::saveLocal() getFormattedImage(); // Save the formatted image - BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage); + BOOL success = saveLocal(mFormattedImage); if(success) { @@ -1078,3 +1080,37 @@ BOOL LLSnapshotLivePreview::saveLocal() return success; } +//Check if failed due to insuficient memory +BOOL LLSnapshotLivePreview::saveLocal(LLPointer mFormattedImage) +{ + BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage); + + if (!success) + { + std::string lastSnapshotDir = LLViewerWindow::getLastSnapshotDir(); + +#ifdef LL_WINDOWS + boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir)); +#else + boost::filesystem::path b_path(lastSnapshotDir); +#endif + boost::filesystem::space_info b_space = boost::filesystem::space(b_path); + if (b_space.free < mFormattedImage->getDataSize()) + { + LLSD args; + args["PATH"] = lastSnapshotDir; + + std::string needM_bytes_string; + LLResMgr::getInstance()->getIntegerString(needM_bytes_string, (mFormattedImage->getDataSize()) >> 10); + args["NEED_MEMORY"] = needM_bytes_string; + + std::string freeM_bytes_string; + LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10); + args["FREE_MEMORY"] = freeM_bytes_string; + + LLNotificationsUtil::add("SnapshotToComputerFailed", args); + return false; + } + } + return success; +} diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h index b689c50320..4ea8d25a5a 100644 --- a/indra/newview/llsnapshotlivepreview.h +++ b/indra/newview/llsnapshotlivepreview.h @@ -41,6 +41,7 @@ class LLSnapshotLivePreview : public LLView LOG_CLASS(LLSnapshotLivePreview); public: + static BOOL saveLocal(LLPointer); struct Params : public LLInitParam::Block { Params() diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d46bb0199b..8d0c5af314 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -583,7 +583,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t formatted->enableOverSize() ; formatted->encode(raw, 0); formatted->disableOverSize() ; - gViewerWindow->saveImageNumbered(formatted); + LLSnapshotLivePreview::saveLocal(formatted); } return true; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 2d3b48bab3..45ea0f8e02 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -4398,6 +4399,16 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picke LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath); } +// Check if there is enough free space to save snapshot +#ifdef LL_WINDOWS + boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(sSnapshotDir)); +#else + boost::filesystem::space_info b_space = boost::filesystem::space(sSnapshotDir); +#endif + if (b_space.free < image->getDataSize()) + { + return FALSE; + } // Look for an unused file name std::string filepath; S32 i = 1; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index a134dfaaa9..5d7076178a 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -419,6 +419,7 @@ public: bool getSystemUIScaleFactorChanged() { return mSystemUIScaleFactorChanged; } static void showSystemUIScaleFactorChanged(); + static std::string getLastSnapshotDir() { return sSnapshotDir; } private: bool shouldShowToolTipFor(LLMouseHandler *mh); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 91f3b7456f..b413720bc9 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -8533,6 +8533,11 @@ Appearance has been saved to XML to [PATH] Failed to save appearance to XML. + +Failed to save snapshot to [PATH]: Not enough memory. [NEED_MEMORY]KB is required but only [FREE_MEMORY]KB is free. + +