Skip to content

Commit

Permalink
エラーがたくさんあるとき対策で1つのみ表示するように実装
Browse files Browse the repository at this point in the history
  • Loading branch information
berryzplus committed Oct 12, 2020
1 parent d9679d3 commit 1122750
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 12 deletions.
38 changes: 27 additions & 11 deletions sakura_core/_main/CCommandLine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,28 @@
#include "util/file.h"
#include "env/CSakuraEnvironment.h"

//! ファイル名に使えない文字が含まれるエラーのメッセージを取得する
inline std::wstring GetFilePathIncludeInvalidCharErrorMessage( LPCWSTR pszPath )
{
CNativeW cmText;

// L"%ls\r\n上記のファイル名は不正です。ファイル名に \\ / : * ? "" < > | の文字は使えません。 "
ErrorMessage( NULL, LS(STR_CMDLINE_PARSECMD1), pszPath );

return std::wstring( cmText.GetStringPtr(), cmText.GetStringLength() );
}

//! ファイル名が長すぎるエラーのメッセージを取得する
inline std::wstring GetFilePathTooLongErrorMessage( LPCWSTR pszPath )
{
CNativeW cmText;

// L"%ls\nというファイルを開けません。\nファイルのパスが長すぎます。"
cmText.AppendStringF( LS(STR_ERR_FILEPATH_TOO_LONG), pszPath );

return std::wstring( cmText.GetStringPtr(), cmText.GetStringLength() );
}

/* コマンドラインオプション用定数 */
#define CMDLINEOPT_R 1002 //!< ビューモード
#define CMDLINEOPT_NOWIN 1003 //!< タスクトレイのみ起動
Expand Down Expand Up @@ -267,8 +289,7 @@ void CCommandLine::ParseCommandLine( LPCWSTR pszCmdLineSrc, bool bResponse )
if( chDst == L'\0' ){
if( fexist(szPath) ){
if( !CSakuraEnvironment::ResolvePath( szPath ) ){
// L"%ls\nというファイルを開けません。\nファイルのパスが長すぎます。"
ErrorMessage( NULL, LS(STR_ERR_FILEPATH_TOO_LONG), szPath );
m_vErrorMessages.emplace_back( GetFilePathTooLongErrorMessage( szPath ) );
}else{
::wcscpy_s( m_fi.m_szPath, szPath );
nPos = static_cast<int>(i + 1); //残りの解析の開始位置をずらす
Expand Down Expand Up @@ -312,15 +333,13 @@ void CCommandLine::ParseCommandLine( LPCWSTR pszCmdLineSrc, bool bResponse )
cmWork.SetString( &pszToken[1], (int) nTokenLen - ( nTokenLen != 0 && pszToken[nTokenLen] == L'\"' ? 1 : 0 ) );
cmWork.Replace( L"\"\"", L"\"" );
if( _countof(szPath) == ::wcsnlen( cmWork.GetStringPtr(), _countof(szPath) ) ){
// L"%ls\nというファイルを開けません。\nファイルのパスが長すぎます。"
ErrorMessage( NULL, LS(STR_ERR_FILEPATH_TOO_LONG), cmWork.GetStringPtr() );
m_vErrorMessages.emplace_back( GetFilePathTooLongErrorMessage( cmWork.GetStringPtr() ) );
}else{
::wcscpy_s( szPath, cmWork.GetStringPtr() );
}
}else{
if( _countof(szPath) == ::wcsnlen( pszToken, _countof(szPath) ) ){
// L"%ls\nというファイルを開けません。\nファイルのパスが長すぎます。"
ErrorMessage( NULL, LS(STR_ERR_FILEPATH_TOO_LONG), pszToken );
m_vErrorMessages.emplace_back( GetFilePathTooLongErrorMessage( pszToken ) );
}else{
::wcscpy_s( szPath, pszToken );
}
Expand All @@ -337,16 +356,13 @@ void CCommandLine::ParseCommandLine( LPCWSTR pszCmdLineSrc, bool bResponse )
constexpr const wchar_t invalidFilenameChars[] = L"<>?\"|*";

if( ::wcscspn( szPath, invalidFilenameChars ) < ::wcsnlen( szPath, _countof(szPath) ) ){
// L"%ls\r\n上記のファイル名は不正です。ファイル名に \\ / : * ? "" < > | の文字は使えません。 "
ErrorMessage( NULL, LS(STR_CMDLINE_PARSECMD1), szPath );

m_vErrorMessages.emplace_back( GetFilePathIncludeInvalidCharErrorMessage( pszToken ) );
::wcscpy_s( szPath, L"" ); // クリアする
}

if( szPath[0] != L'\0' ){
if( !CSakuraEnvironment::ResolvePath( szPath ) ){
// L"%ls\nというファイルを開けません。\nファイルのパスが長すぎます。"
ErrorMessage( NULL, LS(STR_ERR_FILEPATH_TOO_LONG), szPath );
m_vErrorMessages.emplace_back( GetFilePathTooLongErrorMessage( szPath ) );
}else if( m_fi.m_szPath[0] == L'\0' ){
::wcscpy_s( m_fi.m_szPath, szPath );
}else{
Expand Down
4 changes: 3 additions & 1 deletion sakura_core/_main/CCommandLine.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ class CCommandLine : public TSingleton<CCommandLine> {
ECodeType GetDocCode() const noexcept { return m_fi.m_nCharCode; }
void ParseKanjiCodeFromFileName( LPWSTR pszExeFileName, int cchExeFileName );
void ParseCommandLine( LPCWSTR pszCmdLineSrc, bool bResponse = true );

const std::vector<std::wstring>& GetErrorMessages() const { return m_vErrorMessages; }

// member valiables
private:
bool m_bGrepMode; //! [out] TRUE: Grep Mode
Expand All @@ -109,5 +110,6 @@ class CCommandLine : public TSingleton<CCommandLine> {
CNativeW m_cmMacroType; //! [out] マクロ種別
CNativeW m_cmProfile; //! プロファイル名
std::vector<std::wstring> m_vFiles; //!< ファイル名(複数)
std::vector<std::wstring> m_vErrorMessages; //!< エラーメッセージ(複数)
};
#endif /* SAKURA_CCOMMANDLINE_DF7E2E03_76E1_458C_82AC_7C485EECF677_H_ */
6 changes: 6 additions & 0 deletions sakura_core/_main/CProcessFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@ bool CProcessFactory::ProfileSelect( HINSTANCE hInstance, LPCWSTR lpCmdLine )

CCommandLine::getInstance()->ParseCommandLine(lpCmdLine);

// コマンドライン解析のエラーがあれば、最初のメッセージだけ表示する
const auto& vErrorMessages = CCommandLine::getInstance()->GetErrorMessages();
if( !vErrorMessages.empty() ){
ErrorMessage( NULL, vErrorMessages.front().c_str() );
}

// コマンドラインオプションから起動プロファイルを判定する
bool profileSelected = CDlgProfileMgr::TrySelectProfile( CCommandLine::getInstance() );
if( !profileSelected ){
Expand Down

0 comments on commit 1122750

Please sign in to comment.