[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:
{
::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();
}
break;
@ -1539,7 +1539,7 @@ void Notepad_plus::command(int id)
characterNumber += TEXT("\r");
TCHAR fileLenStr[64];
generic_sprintf(fileLenStr, TEXT("%d"), (size_t)fileLen);
generic_sprintf(fileLenStr, TEXT("%I64u"), static_cast<UINT64>( fileLen ) );
characterNumber += fileLenLabel;
characterNumber += fileLenStr;
characterNumber += TEXT("\r");
@ -1580,7 +1580,7 @@ void Notepad_plus::command(int id)
characterNumber += nbWordStr;
characterNumber += TEXT("\r");
generic_sprintf(nbLineStr, TEXT("%d"), nbLine);
generic_sprintf(nbLineStr, TEXT("%d"), static_cast<int>( nbLine ) );
characterNumber += nbLineLabel;
characterNumber += nbLineStr;
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)
{
NppParameters *pNppParam = NppParameters::getInstance();
TCHAR longFileName[MAX_PATH];
const rsize_t longFileNameBufferSize = MAX_PATH;
::GetFullPathName(fileName, MAX_PATH, longFileName, NULL);
::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);
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));
HWND hWinParent = ::GetParent(hWin);
TCHAR className[MAX_PATH];
::GetClassName(hWinParent,className, sizeof(className));
const rsize_t classNameBufferSize = MAX_PATH;
TCHAR className[classNameBufferSize];
::GetClassName(hWinParent,className, classNameBufferSize);
if (lstrcmp(className, _pPublicInterface->getClassName()) == 0 && hWinParent != _pPublicInterface->getHSelf()) // another Notepad++
{
int index = _pDocTab->getCurrentTabIndex();
@ -481,7 +482,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
case SCN_DOUBLECLICK :
{
if(notification->modifiers == SCMOD_CTRL)
if (notification->modifiers == SCMOD_CTRL)
{
const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
@ -500,7 +501,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
char *buf;
int length;
if(nppGUI._delimiterSelectionOnEntireDocument)
if (nppGUI._delimiterSelectionOnEntireDocument)
{
// Get entire document.
length = notifyView->execute(SCI_GETLENGTH);
@ -526,19 +527,18 @@ BOOL Notepad_plus::notify(SCNotification *notification)
int leftmost_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
// which are closest to the clicked position.
for(unsigned int i = position_of_click; i >= 0; --i)
for (int i = position_of_click; i >= 0; --i)
{
if(bufstring.at(i) == nppGUI._leftmostDelimiter)
if (bufstring.at(i) == nppGUI._leftmostDelimiter)
{
// 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;
break;
@ -552,18 +552,18 @@ BOOL Notepad_plus::notify(SCNotification *notification)
}
}
if(leftmost_position == -1)
if (leftmost_position == -1)
break;
// 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.
if(nppGUI._rightmostDelimiter == '"')
if (nppGUI._rightmostDelimiter == '"')
{
if(! (i > 0 && bufstring.at(i - 1) == '\\'))
if (! (i > 0 && bufstring.at(i - 1) == '\\'))
{
rightmost_position = i;
break;
@ -588,11 +588,11 @@ BOOL Notepad_plus::notify(SCNotification *notification)
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);
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();
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.
// 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;
rightmost_position = i;
@ -612,9 +612,9 @@ BOOL Notepad_plus::notify(SCNotification *notification)
}
// 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_SETANCHOR, leftmost_position + 1);

View File

@ -926,7 +926,13 @@ generic_string NppParameters::getCloudSettingsPath(CloudChoice cloudChoice)
generic_string settingsPath4dropbox = TEXT("");
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];
SHGetPathFromIDList(pidl, tmp);
generic_string dropboxInfoDB = tmp;
@ -1010,7 +1016,11 @@ generic_string NppParameters::getCloudSettingsPath(CloudChoice cloudChoice)
// TODO: check if google drive is present
//
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];
SHGetPathFromIDList(pidl2, tmp2);
generic_string googleDriveInfoDB = tmp2;
@ -1118,7 +1128,12 @@ generic_string NppParameters::getSettingsFolder()
else
{
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];
SHGetPathFromIDList(pidl, tmp);
generic_string settingsFolderPath = tmp;
@ -1148,7 +1163,12 @@ bool NppParameters::load()
if (_winVersion >= WV_VISTA)
{
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];
SHGetPathFromIDList(pidl, progPath);
TCHAR nppDirLocation[MAX_PATH];
@ -1167,7 +1187,12 @@ bool NppParameters::load()
else
{
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];
SHGetPathFromIDList(pidl, tmp);
_userPath = tmp;
@ -2603,6 +2628,11 @@ bool NppParameters::exportUDLToFile(int langIndex2export, generic_string fileNam
bool b = false;
if ( langIndex2export >= NB_MAX_USER_LANG )
{
return false;
}
insertUserLang2Tree(newRoot2export, _userLangArray[langIndex2export]);
b = pNewXmlUserLangDoc->SaveFile();
@ -4503,7 +4533,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
if (path && path[0])
{
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")))

View File

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

View File

@ -36,9 +36,32 @@
typedef std::vector<const TCHAR*> ParamVector;
bool checkSingleFile(const TCHAR * commandLine) {
TCHAR fullpath[MAX_PATH];
::GetFullPathName(commandLine, MAX_PATH, fullpath, NULL);
bool checkSingleFile( _In_z_ PCTSTR const commandLine) {
const rsize_t strLen = _tcslen( commandLine );
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)) {
return true;
}