[BUG_FIXED] (Author: Alexander Riccio) Fix several bugs.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@1352 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
Don Ho 2015-03-14 22:55:03 +00:00
parent 8ec487d668
commit 55099cb4b7
6 changed files with 118 additions and 38 deletions

View File

@ -339,7 +339,7 @@ void Notepad_plus::command(int id)
case IDM_EDIT_BEGINENDSELECT: case IDM_EDIT_BEGINENDSELECT:
{ {
::CheckMenuItem(_mainMenuHandle, IDM_EDIT_BEGINENDSELECT, MF_BYCOMMAND | _pEditView->beginEndSelectedIsStarted()?MF_UNCHECKED:MF_CHECKED); ::CheckMenuItem(_mainMenuHandle, IDM_EDIT_BEGINENDSELECT, MF_BYCOMMAND | (_pEditView->beginEndSelectedIsStarted() ? MF_UNCHECKED : MF_CHECKED));
_pEditView->beginOrEndSelect(); _pEditView->beginOrEndSelect();
} }
break; break;
@ -1539,7 +1539,7 @@ void Notepad_plus::command(int id)
characterNumber += TEXT("\r"); characterNumber += TEXT("\r");
TCHAR fileLenStr[64]; TCHAR fileLenStr[64];
generic_sprintf(fileLenStr, TEXT("%d"), (size_t)fileLen); generic_sprintf(fileLenStr, TEXT("%I64u"), static_cast<UINT64>( fileLen ) );
characterNumber += fileLenLabel; characterNumber += fileLenLabel;
characterNumber += fileLenStr; characterNumber += fileLenStr;
characterNumber += TEXT("\r"); characterNumber += TEXT("\r");
@ -1580,7 +1580,7 @@ void Notepad_plus::command(int id)
characterNumber += nbWordStr; characterNumber += nbWordStr;
characterNumber += TEXT("\r"); characterNumber += TEXT("\r");
generic_sprintf(nbLineStr, TEXT("%d"), nbLine); generic_sprintf(nbLineStr, TEXT("%d"), static_cast<int>( nbLine ) );
characterNumber += nbLineLabel; characterNumber += nbLineLabel;
characterNumber += nbLineStr; characterNumber += nbLineStr;
characterNumber += TEXT("\r"); characterNumber += TEXT("\r");

View File

@ -37,11 +37,37 @@
BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp) BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp)
{ {
NppParameters *pNppParam = NppParameters::getInstance();
TCHAR longFileName[MAX_PATH];
::GetFullPathName(fileName, MAX_PATH, longFileName, NULL); const rsize_t longFileNameBufferSize = MAX_PATH;
::GetLongPathName(longFileName, longFileName, MAX_PATH);
//If [GetFullPathName] succeeds, the return value is the length, in TCHARs, of the string copied to lpBuffer, not including the terminating null character.
//If the lpBuffer buffer is too small to contain the path, the return value [of GetFullPathName] is the size, in TCHARs, of the buffer that is required to hold the path and the terminating null character.
//If [GetFullPathName] fails for any other reason, the return value is zero.
NppParameters *pNppParam = NppParameters::getInstance();
TCHAR longFileName[longFileNameBufferSize];
const DWORD getFullPathNameResult = ::GetFullPathName(fileName, longFileNameBufferSize, longFileName, NULL);
if ( getFullPathNameResult == 0 )
{
return BUFFER_INVALID;
}
if ( getFullPathNameResult > longFileNameBufferSize )
{
return BUFFER_INVALID;
}
assert( _tcslen( longFileName ) == getFullPathNameResult );
const DWORD getLongPathNameResult = ::GetLongPathName(longFileName, longFileName, longFileNameBufferSize);
if ( getLongPathNameResult == 0 )
{
return BUFFER_INVALID;
}
if ( getLongPathNameResult > longFileNameBufferSize )
{
return BUFFER_INVALID;
}
assert( _tcslen( longFileName ) == getLongPathNameResult );
bool isSnapshotMode = backupFileName != NULL && PathFileExists(backupFileName); bool isSnapshotMode = backupFileName != NULL && PathFileExists(backupFileName);
if (isSnapshotMode && !PathFileExists(longFileName)) // UNTITLED if (isSnapshotMode && !PathFileExists(longFileName)) // UNTITLED

View File

@ -190,8 +190,9 @@ BOOL Notepad_plus::notify(SCNotification *notification)
fileNamesData.cbData = long(quotFileName.length() + 1)*(sizeof(TCHAR)); fileNamesData.cbData = long(quotFileName.length() + 1)*(sizeof(TCHAR));
HWND hWinParent = ::GetParent(hWin); HWND hWinParent = ::GetParent(hWin);
TCHAR className[MAX_PATH]; const rsize_t classNameBufferSize = MAX_PATH;
::GetClassName(hWinParent,className, sizeof(className)); TCHAR className[classNameBufferSize];
::GetClassName(hWinParent,className, classNameBufferSize);
if (lstrcmp(className, _pPublicInterface->getClassName()) == 0 && hWinParent != _pPublicInterface->getHSelf()) // another Notepad++ if (lstrcmp(className, _pPublicInterface->getClassName()) == 0 && hWinParent != _pPublicInterface->getHSelf()) // another Notepad++
{ {
int index = _pDocTab->getCurrentTabIndex(); int index = _pDocTab->getCurrentTabIndex();
@ -481,7 +482,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
case SCN_DOUBLECLICK : case SCN_DOUBLECLICK :
{ {
if(notification->modifiers == SCMOD_CTRL) if (notification->modifiers == SCMOD_CTRL)
{ {
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI(); const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
@ -500,7 +501,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
char *buf; char *buf;
int length; int length;
if(nppGUI._delimiterSelectionOnEntireDocument) if (nppGUI._delimiterSelectionOnEntireDocument)
{ {
// Get entire document. // Get entire document.
length = notifyView->execute(SCI_GETLENGTH); length = notifyView->execute(SCI_GETLENGTH);
@ -526,19 +527,18 @@ BOOL Notepad_plus::notify(SCNotification *notification)
int leftmost_position = -1; int leftmost_position = -1;
int rightmost_position = -1; int rightmost_position = -1;
if(nppGUI._rightmostDelimiter == nppGUI._leftmostDelimiter) if (nppGUI._rightmostDelimiter == nppGUI._leftmostDelimiter)
{ {
// If the delimiters are the same (e.g. they are both a quotation mark), choose the ones // If the delimiters are the same (e.g. they are both a quotation mark), choose the ones
// which are closest to the clicked position. // which are closest to the clicked position.
for (int i = position_of_click; i >= 0; --i)
for(unsigned int i = position_of_click; i >= 0; --i)
{ {
if(bufstring.at(i) == nppGUI._leftmostDelimiter) if (bufstring.at(i) == nppGUI._leftmostDelimiter)
{ {
// Respect escaped quotation marks. // Respect escaped quotation marks.
if(nppGUI._leftmostDelimiter == '"') if (nppGUI._leftmostDelimiter == '"')
{ {
if(! (i > 0 && bufstring.at(i - 1) == '\\')) if (! (i > 0 && bufstring.at(i - 1) == '\\'))
{ {
leftmost_position = i; leftmost_position = i;
break; break;
@ -552,18 +552,18 @@ BOOL Notepad_plus::notify(SCNotification *notification)
} }
} }
if(leftmost_position == -1) if (leftmost_position == -1)
break; break;
// Scan for right delimiter. // Scan for right delimiter.
for(unsigned int i = position_of_click; i < bufstring.length(); ++i) for (unsigned int i = position_of_click; i < bufstring.length(); ++i)
{ {
if(bufstring.at(i) == nppGUI._rightmostDelimiter) if (bufstring.at(i) == nppGUI._rightmostDelimiter)
{ {
// Respect escaped quotation marks. // Respect escaped quotation marks.
if(nppGUI._rightmostDelimiter == '"') if (nppGUI._rightmostDelimiter == '"')
{ {
if(! (i > 0 && bufstring.at(i - 1) == '\\')) if (! (i > 0 && bufstring.at(i - 1) == '\\'))
{ {
rightmost_position = i; rightmost_position = i;
break; break;
@ -588,11 +588,11 @@ BOOL Notepad_plus::notify(SCNotification *notification)
std::stack<unsigned int> leftmost_delimiter_positions; std::stack<unsigned int> leftmost_delimiter_positions;
for(unsigned int i = 0; i < bufstring.length(); ++i) for (unsigned int i = 0; i < bufstring.length(); ++i)
{ {
if(bufstring.at(i) == nppGUI._leftmostDelimiter) if (bufstring.at(i) == nppGUI._leftmostDelimiter)
leftmost_delimiter_positions.push(i); leftmost_delimiter_positions.push(i);
else if(bufstring.at(i) == nppGUI._rightmostDelimiter && ! leftmost_delimiter_positions.empty()) else if (bufstring.at(i) == nppGUI._rightmostDelimiter && ! leftmost_delimiter_positions.empty())
{ {
unsigned int matching_leftmost = leftmost_delimiter_positions.top(); unsigned int matching_leftmost = leftmost_delimiter_positions.top();
leftmost_delimiter_positions.pop(); leftmost_delimiter_positions.pop();
@ -602,7 +602,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
// Note: cast of leftmost_position to unsigned int is safe, since if leftmost_position is not -1 then it is guaranteed to be positive. // Note: cast of leftmost_position to unsigned int is safe, since if leftmost_position is not -1 then it is guaranteed to be positive.
// If it was possible, leftmost_position and rightmost_position should be of type optional<unsigned int>. // If it was possible, leftmost_position and rightmost_position should be of type optional<unsigned int>.
if( matching_leftmost <= position_of_click && i >= position_of_click && (leftmost_position == -1 || matching_leftmost > (unsigned int)leftmost_position) ) if ( matching_leftmost <= position_of_click && i >= position_of_click && (leftmost_position == -1 || matching_leftmost > (unsigned int)leftmost_position) )
{ {
leftmost_position = matching_leftmost; leftmost_position = matching_leftmost;
rightmost_position = i; rightmost_position = i;
@ -612,9 +612,9 @@ BOOL Notepad_plus::notify(SCNotification *notification)
} }
// Set selection to the position we found (if any). // Set selection to the position we found (if any).
if(rightmost_position != -1 && leftmost_position != -1) if (rightmost_position != -1 && leftmost_position != -1)
{ {
if(nppGUI._delimiterSelectionOnEntireDocument) if (nppGUI._delimiterSelectionOnEntireDocument)
{ {
notifyView->execute(SCI_SETCURRENTPOS, rightmost_position); notifyView->execute(SCI_SETCURRENTPOS, rightmost_position);
notifyView->execute(SCI_SETANCHOR, leftmost_position + 1); notifyView->execute(SCI_SETANCHOR, leftmost_position + 1);

View File

@ -926,7 +926,13 @@ generic_string NppParameters::getCloudSettingsPath(CloudChoice cloudChoice)
generic_string settingsPath4dropbox = TEXT(""); generic_string settingsPath4dropbox = TEXT("");
ITEMIDLIST *pidl; ITEMIDLIST *pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); static_assert( SUCCEEDED( S_OK ), "bad HRESULT test!" );
const HRESULT specialFolderLocationResult_1 = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl);
if ( !SUCCEEDED( specialFolderLocationResult_1 ) )
{
return cloudSettingsPath;
}
TCHAR tmp[MAX_PATH]; TCHAR tmp[MAX_PATH];
SHGetPathFromIDList(pidl, tmp); SHGetPathFromIDList(pidl, tmp);
generic_string dropboxInfoDB = tmp; generic_string dropboxInfoDB = tmp;
@ -1010,7 +1016,11 @@ generic_string NppParameters::getCloudSettingsPath(CloudChoice cloudChoice)
// TODO: check if google drive is present // TODO: check if google drive is present
// //
ITEMIDLIST *pidl2; ITEMIDLIST *pidl2;
SHGetSpecialFolderLocation(NULL, CSIDL_LOCAL_APPDATA, &pidl2); const HRESULT specialFolderLocationResult_2 = SHGetSpecialFolderLocation(NULL, CSIDL_LOCAL_APPDATA, &pidl2);
if ( !SUCCEEDED( specialFolderLocationResult_2 ) )
{
return TEXT( "" );
}
TCHAR tmp2[MAX_PATH]; TCHAR tmp2[MAX_PATH];
SHGetPathFromIDList(pidl2, tmp2); SHGetPathFromIDList(pidl2, tmp2);
generic_string googleDriveInfoDB = tmp2; generic_string googleDriveInfoDB = tmp2;
@ -1118,7 +1128,12 @@ generic_string NppParameters::getSettingsFolder()
else else
{ {
ITEMIDLIST *pidl; ITEMIDLIST *pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); static_assert( SUCCEEDED( S_OK ), "Bad HRESULT code check!!" );
const HRESULT specialLocationResult = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl);
if ( !SUCCEEDED( specialLocationResult ) )
{
return TEXT( "" );
}
TCHAR tmp[MAX_PATH]; TCHAR tmp[MAX_PATH];
SHGetPathFromIDList(pidl, tmp); SHGetPathFromIDList(pidl, tmp);
generic_string settingsFolderPath = tmp; generic_string settingsFolderPath = tmp;
@ -1148,7 +1163,12 @@ bool NppParameters::load()
if (_winVersion >= WV_VISTA) if (_winVersion >= WV_VISTA)
{ {
ITEMIDLIST *pidl; ITEMIDLIST *pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAM_FILES, &pidl); static_assert( SUCCEEDED( S_OK ), "Bad HRESULT code check!!" );
const HRESULT specialLocationResult = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAM_FILES, &pidl);
if ( !SUCCEEDED( specialLocationResult ) )
{
return false;
}
TCHAR progPath[MAX_PATH]; TCHAR progPath[MAX_PATH];
SHGetPathFromIDList(pidl, progPath); SHGetPathFromIDList(pidl, progPath);
TCHAR nppDirLocation[MAX_PATH]; TCHAR nppDirLocation[MAX_PATH];
@ -1167,7 +1187,12 @@ bool NppParameters::load()
else else
{ {
ITEMIDLIST *pidl; ITEMIDLIST *pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); static_assert( SUCCEEDED( S_OK ), "Bad HRESULT code check!!" );
const HRESULT specialLocationResult = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl);
if ( !SUCCEEDED( specialLocationResult ) )
{
return false;
}
TCHAR tmp[MAX_PATH]; TCHAR tmp[MAX_PATH];
SHGetPathFromIDList(pidl, tmp); SHGetPathFromIDList(pidl, tmp);
_userPath = tmp; _userPath = tmp;
@ -2603,6 +2628,11 @@ bool NppParameters::exportUDLToFile(int langIndex2export, generic_string fileNam
bool b = false; bool b = false;
if ( langIndex2export >= NB_MAX_USER_LANG )
{
return false;
}
insertUserLang2Tree(newRoot2export, _userLangArray[langIndex2export]); insertUserLang2Tree(newRoot2export, _userLangArray[langIndex2export]);
b = pNewXmlUserLangDoc->SaveFile(); b = pNewXmlUserLangDoc->SaveFile();
@ -4503,7 +4533,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
if (path && path[0]) if (path && path[0])
{ {
lstrcpyn(_nppGUI._defaultDir, path, MAX_PATH); lstrcpyn(_nppGUI._defaultDir, path, MAX_PATH);
::ExpandEnvironmentStrings(_nppGUI._defaultDir, _nppGUI._defaultDirExp, 500); ::ExpandEnvironmentStrings(_nppGUI._defaultDir, _nppGUI._defaultDirExp, MAX_PATH);
} }
} }
else if (!lstrcmp(nm, TEXT("titleBar"))) else if (!lstrcmp(nm, TEXT("titleBar")))

View File

@ -663,7 +663,7 @@ public:
generic_string toString() { // Return Notepad++ date format : YYYYMMDD generic_string toString() { // Return Notepad++ date format : YYYYMMDD
TCHAR dateStr[8+1]; TCHAR dateStr[8+1];
wsprintf(dateStr, TEXT("%04d%02d%02d"), _year, _month, _day); wsprintf(dateStr, TEXT("%04u%02u%02u"), _year, _month, _day);
return dateStr; return dateStr;
}; };
@ -828,6 +828,7 @@ struct NppGUI
bool _shortTitlebar; bool _shortTitlebar;
OpenSaveDirSetting _openSaveDir; OpenSaveDirSetting _openSaveDir;
TCHAR _defaultDir[MAX_PATH]; TCHAR _defaultDir[MAX_PATH];
TCHAR _defaultDirExp[MAX_PATH]; //expanded environment variables TCHAR _defaultDirExp[MAX_PATH]; //expanded environment variables
generic_string _themeName; generic_string _themeName;

View File

@ -36,9 +36,32 @@
typedef std::vector<const TCHAR*> ParamVector; typedef std::vector<const TCHAR*> ParamVector;
bool checkSingleFile(const TCHAR * commandLine) { bool checkSingleFile( _In_z_ PCTSTR const commandLine) {
TCHAR fullpath[MAX_PATH]; const rsize_t strLen = _tcslen( commandLine );
::GetFullPathName(commandLine, MAX_PATH, fullpath, NULL); if ( strLen == 0 ) {
return false;
}
const rsize_t fullpathBufSize = MAX_PATH;
TCHAR fullpath[ fullpathBufSize ] = { 0 };
//If [GetFullPathName] succeeds, the return value is the length, in TCHARs, of the string copied to lpBuffer, not including the terminating null character.
//If the lpBuffer buffer is too small to contain the path, the return value [of GetFullPathName] is the size, in TCHARs, of the buffer that is required to hold the path and the terminating null character.
//If [GetFullPathName] fails for any other reason, the return value is zero. To get extended error information, call GetLastError.
const DWORD fullpathResult = ::GetFullPathName(commandLine, fullpathBufSize, fullpath, NULL);
if ( fullpathResult == 0 )
{
MessageBoxA( NULL, "GetFullPathName failed with some unexpected error!", "checkSingleFile failed!!", MB_OK );
MessageBox( NULL, commandLine, TEXT( "path that failed:" ), MB_OK );
return false;
}
if ( fullpathResult > fullpathBufSize )
{
MessageBoxA( NULL, "the buffer passed to GetFullPathName was too small!", "checkSingleFile failed!!", MB_OK );
MessageBox( NULL, commandLine, TEXT( "path that failed:" ), MB_OK );
return false;
}
if (::PathFileExists(fullpath)) { if (::PathFileExists(fullpath)) {
return true; return true;
} }