[BUG_FIXED] (Author: Andreas Jonsson) Fix saving file fails silently bug.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@953 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
Don Ho 2012-09-08 12:50:55 +00:00
parent 37efb3f8ea
commit f1a2acd85f
3 changed files with 31 additions and 10 deletions

View File

@ -31,6 +31,7 @@
#include "FileDialog.h" #include "FileDialog.h"
#include "EncodingMapper.h" #include "EncodingMapper.h"
#include "VerticalFileSwitcher.h" #include "VerticalFileSwitcher.h"
#include <TCHAR.h>
BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly, int encoding) BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly, int encoding)
@ -289,7 +290,8 @@ bool Notepad_plus::doSave(BufferID id, const TCHAR * filename, bool isCopy)
_pluginsManager.notify(&scnN); _pluginsManager.notify(&scnN);
} }
bool res = MainFileManager->saveBuffer(id, filename, isCopy); generic_string error_msg;
bool res = MainFileManager->saveBuffer(id, filename, isCopy, &error_msg);
if (!isCopy) if (!isCopy)
{ {
@ -298,11 +300,20 @@ bool Notepad_plus::doSave(BufferID id, const TCHAR * filename, bool isCopy)
} }
if (!res) if (!res)
_nativeLangSpeaker.messageBox("FileLockedWarning", {
_pPublicInterface->getHSelf(), if(error_msg.empty())
TEXT("Please check if this file is opened in another program."), {
TEXT("Save failed"), _nativeLangSpeaker.messageBox("FileLockedWarning",
MB_OK); _pPublicInterface->getHSelf(),
TEXT("Please check if this file is opened in another program."),
TEXT("Save failed"),
MB_OK);
}
else
{
::MessageBox(_pPublicInterface->getHSelf(), error_msg.c_str(), TEXT("Save failed"), MB_OK);
}
}
return res; return res;
} }

View File

@ -595,7 +595,7 @@ bool FileManager::moveFile(BufferID id, const TCHAR * newFileName)
return true; return true;
} }
bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy) { bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, generic_string * error_msg) {
Buffer * buffer = getBufferByID(id); Buffer * buffer = getBufferByID(id);
bool isHidden = false; bool isHidden = false;
bool isSys = false; bool isSys = false;
@ -636,9 +636,10 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy) {
int lengthDoc = _pscratchTilla->getCurrentDocLen(); int lengthDoc = _pscratchTilla->getCurrentDocLen();
char* buf = (char*)_pscratchTilla->execute(SCI_GETCHARACTERPOINTER); //to get characters directly from Scintilla buffer char* buf = (char*)_pscratchTilla->execute(SCI_GETCHARACTERPOINTER); //to get characters directly from Scintilla buffer
size_t items_written = 0;
if (encoding == -1) //no special encoding; can be handled directly by Utf8_16_Write if (encoding == -1) //no special encoding; can be handled directly by Utf8_16_Write
{ {
UnicodeConvertor.fwrite(buf, lengthDoc); items_written = UnicodeConvertor.fwrite(buf, lengthDoc);
} }
else else
{ {
@ -654,11 +655,20 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy) {
int incompleteMultibyteChar = 0; int incompleteMultibyteChar = 0;
const char *newData = wmc->encode(SC_CP_UTF8, encoding, buf+i, grabSize, &newDataLen, &incompleteMultibyteChar); const char *newData = wmc->encode(SC_CP_UTF8, encoding, buf+i, grabSize, &newDataLen, &incompleteMultibyteChar);
grabSize -= incompleteMultibyteChar; grabSize -= incompleteMultibyteChar;
UnicodeConvertor.fwrite(newData, newDataLen); items_written = UnicodeConvertor.fwrite(newData, newDataLen);
} }
} }
UnicodeConvertor.fclose(); UnicodeConvertor.fclose();
// Error, we didn't write the entire document to disk.
// Note that fwrite() doesn't return the number of bytes written, but rather the number of ITEMS.
if(items_written != 1)
{
if(error_msg != NULL)
*error_msg = TEXT("Not enough space on disk to save file.");
return false;
}
if (isHidden) if (isHidden)
::SetFileAttributes(fullpath, attrib | FILE_ATTRIBUTE_HIDDEN); ::SetFileAttributes(fullpath, attrib | FILE_ATTRIBUTE_HIDDEN);

View File

@ -101,7 +101,7 @@ public:
bool reloadBuffer(BufferID id); bool reloadBuffer(BufferID id);
bool reloadBufferDeferred(BufferID id); bool reloadBufferDeferred(BufferID id);
bool saveBuffer(BufferID id, const TCHAR * filename, bool isCopy = false); bool saveBuffer(BufferID id, const TCHAR * filename, bool isCopy = false, generic_string * error_msg = NULL);
bool deleteFile(BufferID id); bool deleteFile(BufferID id);
bool moveFile(BufferID id, const TCHAR * newFilename); bool moveFile(BufferID id, const TCHAR * newFilename);