[BUG_FIXED] Fix status bar display bug that xml/html utf8 indicator makes status bar display ANSI instead of ANSI as UTF-8.

[UPDATE] Convert process thread module from ANSI to Unicode.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@593 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
Don Ho 2009-12-23 19:23:20 +00:00
parent 00e79d39c8
commit dbe22f6cac
5 changed files with 77 additions and 59 deletions

View File

@ -17,6 +17,7 @@
#include "precompiledHeaders.h"
#include "EncodingMapper.h"
#include "Scintilla.h"
// Don't change the order
EncodingUnit encodings[] = {
@ -129,7 +130,7 @@ int EncodingMapper::getIndexFromEncoding(int encoding) const
int EncodingMapper::getEncodingFromString(const char *encodingAlias) const
{
if (isInListA(encodingAlias, "utf-8 utf8"))
return 65001;
return SC_CP_UTF8;
size_t nbItem = sizeof(encodings)/sizeof(EncodingUnit);
int enc = -1;

View File

@ -15,8 +15,9 @@
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "precompiledHeaders.h"
#include "process.h"
#include "SysMsg.h"
//#include "SysMsg.h"
BOOL Process::run()
{
@ -38,11 +39,11 @@ BOOL Process::run()
try {
// Create stdout pipe
if (!::CreatePipe(&_hPipeOutR, &hPipeOutW, &sa, 0))
error("CreatePipe", result, 1000);
error(TEXT("CreatePipe"), result, 1000);
// Create stderr pipe
if (!::CreatePipe(&_hPipeErrR, &hPipeErrW, &sa, 0))
error("CreatePipe", result, 1001);
error(TEXT("CreatePipe"), result, 1001);
STARTUPINFO startup;
PROCESS_INFORMATION procinfo;
@ -69,27 +70,27 @@ BOOL Process::run()
_hProcessThread = procinfo.hThread;
if(!started)
error("CreateProcess", result, 1002);
error(TEXT("CreateProcess"), result, 1002);
hListenerEvent[0] = ::CreateEvent(NULL, FALSE, FALSE, "listenerEvent");
hListenerEvent[0] = ::CreateEvent(NULL, FALSE, FALSE, TEXT("listenerEvent"));
if(!hListenerEvent[0])
error("CreateEvent", result, 1003);
error(TEXT("CreateEvent"), result, 1003);
hListenerEvent[1] = ::CreateEvent(NULL, FALSE, FALSE, "listenerStdErrEvent");
hListenerEvent[1] = ::CreateEvent(NULL, FALSE, FALSE, TEXT("listenerStdErrEvent"));
if(!hListenerEvent[1])
error("CreateEvent", result, 1004);
error(TEXT("CreateEvent"), result, 1004);
hListenerStdOutThread = ::CreateThread(NULL, 0, staticListenerStdOut, this, 0, NULL);
if (!hListenerStdOutThread)
error("CreateThread", result, 1005);
error(TEXT("CreateThread"), result, 1005);
hListenerStdErrThread = ::CreateThread(NULL, 0, staticListenerStdErr, this, 0, NULL);
if (!hListenerStdErrThread)
error("CreateThread", result, 1006);
error(TEXT("CreateThread"), result, 1006);
::WaitForSingleObject(_hProcess, INFINITE);
::WaitForMultipleObjects(2, hListenerEvent, TRUE, INFINITE);
} catch (int coderr){}
} catch (int /*coderr*/){}
// on va fermer toutes les handles
if (hPipeOutW)
@ -117,11 +118,11 @@ BOOL Process::run()
void Process::listenerStdOut()
{
BOOL Result = 0;
DWORD size = 0;
//BOOL Result = 0;
//DWORD size = 0;
DWORD bytesAvail = 0;
BOOL result = 0;
HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "listenerEvent");
HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("listenerEvent"));
//FILE *fp = NULL;
int taille = 0;
@ -134,7 +135,8 @@ void Process::listenerStdOut()
::ResumeThread(_hProcessThread);
while (true)
bool goOn = true;
while (goOn)
{ // got data
memset(bufferOut,0x00,MAX_LINE_LENGTH + 1);
//memset(bufferErr,0x00,MAX_LINE_LENGTH + 1);
@ -145,6 +147,7 @@ void Process::listenerStdOut()
if (!::PeekNamedPipe(_hPipeOutR, bufferOut, taille, &outbytesRead, &bytesAvail, NULL))
{
bytesAvail = 0;
goOn = false;
break;
}
@ -152,18 +155,24 @@ void Process::listenerStdOut()
{
result = :: ReadFile(_hPipeOutR, bufferOut, taille, &outbytesRead, NULL);
if ((!result) && (outbytesRead == 0))
{
goOn = false;
break;
}
}
//outbytesRead = strlen(bufferOut);
bufferOut[outbytesRead] = '\0';
string s;
generic_string s;
s.assign(bufferOut);
_stdoutStr += s;
if (::GetExitCodeProcess(_hProcess, (unsigned long*)&nExitCode))
{
if (nExitCode != STILL_ACTIVE)
{
goOn = false;
break; // EOF condition
}
}
//else
//break;
@ -172,17 +181,17 @@ void Process::listenerStdOut()
if(!::SetEvent(hListenerEvent))
{
systemMessage("Thread listenerStdOut");
systemMessage(TEXT("Thread listenerStdOut"));
}
}
void Process::listenerStdErr()
{
BOOL Result = 0;
DWORD size = 0;
//BOOL Result = 0;
//DWORD size = 0;
DWORD bytesAvail = 0;
BOOL result = 0;
HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "listenerStdErrEvent");
HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("listenerStdErrEvent"));
int taille = 0;
//TCHAR bufferOut[MAX_LINE_LENGTH + 1];
@ -194,7 +203,8 @@ void Process::listenerStdErr()
::ResumeThread(_hProcessThread);
while (true)
bool goOn = true;
while (goOn)
{ // got data
memset(bufferErr, 0x00, MAX_LINE_LENGTH + 1);
taille = sizeof(bufferErr) - sizeof(TCHAR);
@ -204,6 +214,7 @@ void Process::listenerStdErr()
if (!::PeekNamedPipe(_hPipeErrR, bufferErr, taille, &errbytesRead, &bytesAvail, NULL))
{
bytesAvail = 0;
goOn = false;
break;
}
@ -211,18 +222,24 @@ void Process::listenerStdErr()
{
result = :: ReadFile(_hPipeErrR, bufferErr, taille, &errbytesRead, NULL);
if ((!result) && (errbytesRead == 0))
{
goOn = false;
break;
}
}
//outbytesRead = strlen(bufferOut);
bufferErr[errbytesRead] = '\0';
string s;
generic_string s;
s.assign(bufferErr);
_stderrStr += s;
if (::GetExitCodeProcess(_hProcess, (unsigned long*)&nExitCode))
{
if (nExitCode != STILL_ACTIVE)
{
goOn = false;
break; // EOF condition
}
}
//else
//break;
@ -231,11 +248,11 @@ void Process::listenerStdErr()
if(!::SetEvent(hListenerEvent))
{
systemMessage("Thread stdout listener");
systemMessage(TEXT("Thread stdout listener"));
}
}
void Process::error(const char *txt2display, BOOL & returnCode, int errCode)
void Process::error(const TCHAR *txt2display, BOOL & returnCode, int errCode)
{
systemMessage(txt2display);
returnCode = FALSE;

View File

@ -19,29 +19,28 @@
#define PROCESSUS_H
#include <windows.h>
#include <string>
//#include <string>
using namespace std;
class Process
{
public:
Process() {};
Process(const char *cmd, const char *cDir/*, unsigned int id = 0*/)
: _stdoutStr(""), _stderrStr(""), _hPipeOutR(NULL),
Process(const TCHAR *cmd, const TCHAR *cDir)
: _stdoutStr(TEXT("")), _stderrStr(TEXT("")), _hPipeOutR(NULL),
_hPipeErrR(NULL), _hProcess(NULL), _hProcessThread(NULL) {
strcpy(_command, cmd);
strcpy(_curDir, cDir);
//_pid = id;
lstrcpy(_command, cmd);
lstrcpy(_curDir, cDir);
};
BOOL run();
const char * getStdout() const {
const TCHAR * getStdout() const {
return _stdoutStr.c_str();
};
const char * getStderr() const {
const TCHAR * getStderr() const {
return _stderrStr.c_str();
};
@ -50,21 +49,21 @@ public:
};
bool hasStdout() {
return _stdoutStr.compare("");
return (_stdoutStr.compare(TEXT("")) != 0);
};
bool hasStderr() {
return _stderrStr.compare("");
return (_stderrStr.compare(TEXT("")) != 0);
};
protected:
// LES ENTREES
char _command[256];
char _curDir[256];
TCHAR _command[256];
TCHAR _curDir[256];
// LES SORTIES
string _stdoutStr;
string _stderrStr;
generic_string _stdoutStr;
generic_string _stderrStr;
int _exitCode;
// LES HANDLES
@ -85,7 +84,7 @@ protected:
};
void listenerStdOut();
void listenerStdErr();
void error(const char *txt2display, BOOL & returnCode, int errCode);
void error(const TCHAR *txt2display, BOOL & returnCode, int errCode);
};
#endif //PROCESSUS_H

View File

@ -23,14 +23,14 @@
class ProcessThread
{
public :
ProcessThread(const char *appName, const char *cmd, const char *cDir, HWND hwnd) : _hwnd(hwnd) {
strcpy(_appName, appName);
strcpy(_command, cmd);
strcpy(_curDir, cDir);
ProcessThread(const TCHAR *appName, const TCHAR *cmd, const TCHAR *cDir, HWND hwnd) : _hwnd(hwnd) {
lstrcpy(_appName, appName);
lstrcpy(_command, cmd);
lstrcpy(_curDir, cDir);
};
BOOL run(){
HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, "localVarProcessEvent");
HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, TEXT("localVarProcessEvent"));
_hProcessThread = ::CreateThread(NULL, 0, staticLauncher, this, 0, NULL);
@ -42,9 +42,9 @@ public :
protected :
// ENTREES
char _appName[256];
char _command[256];
char _curDir[256];
TCHAR _appName[256];
TCHAR _command[256];
TCHAR _curDir[256];
HWND _hwnd;
HANDLE _hProcessThread;
@ -54,28 +54,28 @@ protected :
};
bool launch() {
HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "localVarProcessEvent");
HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("localVarProcessEvent"));
HWND hwnd = _hwnd;
char appName[256];
strcpy(appName, _appName);
TCHAR appName[256];
lstrcpy(appName, _appName);
HANDLE hMyself = _hProcessThread;
Process process(_command, _curDir);
if(!::SetEvent(hEvent))
{
systemMessage("Thread launcher");
systemMessage(TEXT("Thread launcher"));
}
process.run();
int code = process.getExitCode();
char codeStr[256];
sprintf(codeStr, "%s : %0.4X", appName, code);
::MessageBox(hwnd, (char *)process.getStdout(), codeStr, MB_OK);
TCHAR codeStr[256];
generic_sprintf(codeStr, TEXT("%s : %0.4X"), appName, code);
::MessageBox(hwnd, process.getStdout(), codeStr, MB_OK);
if (process.hasStderr())
::MessageBox(hwnd, (char *)process.getStderr(), codeStr, MB_OK);
::MessageBox(hwnd, process.getStderr(), codeStr, MB_OK);
::CloseHandle(hMyself);
return true;

View File

@ -429,11 +429,12 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin
}
buf->setUnicodeMode(um);
}
else
else // encoding != -1
{
buf->setUnicodeMode(uniCookie);
// Test if encoding is set to UTF8 w/o BOM (usually for utf8 indicator of xml or html)
buf->setEncoding((encoding == SC_CP_UTF8)?-1:encoding);
buf->setUnicodeMode(uniCookie);
buf->setFormat(format);
buf->setEncoding(encoding);
}
//determine buffer properties
_nextBufferID++;