2014-11-19 00:25:21 +08:00
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
#include "AclTrans.h"
|
|
|
|
|
|
|
|
|
|
CAclTrans::CAclTrans(void)
|
|
|
|
|
: m_hWnd(0)
|
|
|
|
|
, m_sPath(_T(""))
|
|
|
|
|
, m_nMsgTransing(0)
|
|
|
|
|
, m_nMsgTransEnd(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CAclTrans::~CAclTrans(void)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CAclTrans::CAclTrans(HWND hWnd, CString &sPath)
|
|
|
|
|
: m_nMsgTransing(0)
|
|
|
|
|
, m_nMsgTransEnd(0)
|
|
|
|
|
{
|
|
|
|
|
Init(hWnd, sPath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CAclTrans::Init(HWND hWnd, CString &sPath)
|
|
|
|
|
{
|
|
|
|
|
m_hWnd =hWnd;
|
|
|
|
|
m_sPath = sPath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CAclTrans::OnTransing(int nMsg)
|
|
|
|
|
{
|
|
|
|
|
m_nMsgTransing = nMsg;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CAclTrans::OnTransEnd(int nMsg)
|
|
|
|
|
{
|
|
|
|
|
m_nMsgTransEnd = nMsg;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void *CAclTrans::RunThread(void *arg)
|
|
|
|
|
{
|
|
|
|
|
CAclTrans *pAclTrans = (CAclTrans*) arg;
|
|
|
|
|
|
|
|
|
|
pAclTrans->ScanPath(&pAclTrans->m_sPath);
|
|
|
|
|
::PostMessage(pAclTrans->m_hWnd, pAclTrans->m_nMsgTransEnd, 0, 0);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CAclTrans::Run(BOOL bTrans)
|
|
|
|
|
{
|
|
|
|
|
acl_pthread_t tid;
|
|
|
|
|
|
|
|
|
|
m_bTrans = bTrans;
|
|
|
|
|
if (m_sPath.GetLength() == 0)
|
|
|
|
|
return;
|
|
|
|
|
acl_pthread_create(&tid, NULL, RunThread, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CAclTrans::Restore(char *psBuf)
|
|
|
|
|
{
|
|
|
|
|
char *pTagBegin, *ptr, *pBegin;
|
|
|
|
|
int len = (int) strlen("_acl");
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
|
|
|
|
pTagBegin = strcasestr(psBuf, "_acl");
|
|
|
|
|
if (pTagBegin == NULL)
|
|
|
|
|
break;
|
|
|
|
|
if (strncmp(pTagBegin, "_acl", len) == 0)
|
|
|
|
|
{
|
|
|
|
|
if (*(pTagBegin + 1) == '.' && *(pTagBegin + 2) == 'h')
|
|
|
|
|
{
|
|
|
|
|
// skip "lib_acl.h"
|
|
|
|
|
psBuf = pTagBegin + len;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
ptr = pTagBegin;
|
|
|
|
|
pBegin = NULL;
|
|
|
|
|
while (ptr >= psBuf)
|
|
|
|
|
{
|
|
|
|
|
if (*ptr == '>') {
|
|
|
|
|
if (pBegin == NULL)
|
|
|
|
|
pBegin = ptr + 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (*ptr == '<') {
|
|
|
|
|
pBegin = NULL;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (*ptr == ' ' || *ptr == '\t'
|
|
|
|
|
|| *ptr == '\r' || *ptr == '\n'
|
|
|
|
|
|| *ptr == '*' || *ptr == '('
|
|
|
|
|
|| *ptr == '{')
|
|
|
|
|
{
|
|
|
|
|
if (pBegin == NULL)
|
|
|
|
|
pBegin = ptr + 1;
|
|
|
|
|
}
|
|
|
|
|
ptr--;
|
|
|
|
|
}
|
|
|
|
|
if (pBegin == NULL) {
|
|
|
|
|
psBuf = pTagBegin + len;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memcpy(pBegin + len, pBegin, pTagBegin - pBegin);
|
|
|
|
|
memcpy(pBegin, "acl_", len);
|
|
|
|
|
psBuf = pTagBegin + len;
|
|
|
|
|
}
|
|
|
|
|
else if (strncmp(pTagBegin, "_ACL", len) == 0)
|
|
|
|
|
{
|
|
|
|
|
ptr = pTagBegin;
|
|
|
|
|
pBegin = NULL;
|
|
|
|
|
while (ptr >= psBuf)
|
|
|
|
|
{
|
|
|
|
|
if (*ptr == '>') {
|
|
|
|
|
if (pBegin == NULL)
|
|
|
|
|
pBegin = ptr + 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (*ptr == '<') {
|
|
|
|
|
pBegin = NULL;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (*ptr == ' ' || *ptr == '\t'
|
|
|
|
|
|| *ptr == '\r' || *ptr == '\n'
|
|
|
|
|
|| *ptr == '*' || *ptr == '('
|
|
|
|
|
|| *ptr == '{')
|
|
|
|
|
{
|
|
|
|
|
if (pBegin == NULL)
|
|
|
|
|
pBegin = ptr + 1;
|
|
|
|
|
}
|
|
|
|
|
ptr--;
|
|
|
|
|
}
|
|
|
|
|
if (pBegin == NULL) {
|
|
|
|
|
psBuf = pTagBegin + len;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
memcpy(pBegin + len, pBegin, pTagBegin - pBegin);
|
|
|
|
|
memcpy(pBegin, "ACL_", len);
|
|
|
|
|
psBuf = pTagBegin + len;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
psBuf = pTagBegin + len;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CAclTrans::Trans(char *psBuf)
|
|
|
|
|
{
|
|
|
|
|
char *pTagBegin, *pTagEnd, *pNextChar;
|
|
|
|
|
int len = (int) strlen("acl_");
|
|
|
|
|
long int n;
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
|
|
|
|
AGAIN_TAG:
|
|
|
|
|
pTagBegin = strcasestr(psBuf, "acl_");
|
|
|
|
|
if (pTagBegin == NULL)
|
|
|
|
|
break;
|
|
|
|
|
if (strncmp(pTagBegin, "acl_", len) == 0)
|
|
|
|
|
{
|
|
|
|
|
pNextChar = pTagBegin + len;
|
|
|
|
|
pTagEnd = pNextChar;
|
|
|
|
|
while (*pTagEnd)
|
|
|
|
|
{
|
|
|
|
|
if (*pTagEnd == '(')
|
|
|
|
|
break;
|
|
|
|
|
if (*pTagEnd == ' ' || *pTagEnd == '\t'
|
|
|
|
|
|| *pTagEnd == '\r' || *pTagEnd == '\n'
|
|
|
|
|
|| *pTagEnd == '.' || *pTagEnd == '\''
|
|
|
|
|
|| *pTagEnd == '\"')
|
|
|
|
|
{
|
|
|
|
|
psBuf = pTagEnd;
|
|
|
|
|
goto AGAIN_TAG;
|
|
|
|
|
}
|
|
|
|
|
pTagEnd++;
|
|
|
|
|
}
|
|
|
|
|
if (*pTagEnd == 0) {
|
|
|
|
|
psBuf = pTagEnd;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
n = pTagEnd - pNextChar;
|
|
|
|
|
memcpy(pTagBegin, pNextChar, n);
|
|
|
|
|
memcpy(pTagBegin + n, "_acl", len);
|
|
|
|
|
psBuf = pTagEnd;
|
|
|
|
|
}
|
|
|
|
|
else if (strncmp(pTagBegin, "ACL_", len) == 0)
|
|
|
|
|
{
|
|
|
|
|
pNextChar = pTagBegin + len;
|
|
|
|
|
pTagEnd = pNextChar;
|
|
|
|
|
while (*pTagEnd)
|
|
|
|
|
{
|
|
|
|
|
if (*pTagEnd == ' ' || *pTagEnd == '\t'
|
|
|
|
|
|| *pTagEnd == ';' || *pTagEnd == ')'
|
|
|
|
|
|| *pTagEnd == '}' || *pTagEnd == '*')
|
|
|
|
|
break;
|
|
|
|
|
if (*pTagEnd == '\r' || *pTagEnd == '\n'
|
|
|
|
|
|| *pTagEnd == '.' || *pTagEnd == '\''
|
|
|
|
|
|| *pTagEnd == '\"' || *pTagEnd == '(')
|
|
|
|
|
{
|
|
|
|
|
psBuf = pTagEnd;
|
|
|
|
|
goto AGAIN_TAG;
|
|
|
|
|
}
|
|
|
|
|
pTagEnd++;
|
|
|
|
|
}
|
|
|
|
|
if (*pTagEnd == 0)
|
|
|
|
|
{
|
|
|
|
|
psBuf = pTagEnd;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
n = pTagEnd - pNextChar;
|
|
|
|
|
memcpy(pTagBegin, pNextChar, n);
|
|
|
|
|
memcpy(pTagBegin + n, "_ACL", len);
|
|
|
|
|
psBuf = pTagEnd;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
psBuf += len;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CAclTrans::TransFile(const char *psPath)
|
|
|
|
|
{
|
|
|
|
|
char *sBuf = NULL;
|
|
|
|
|
size_t iLen;
|
|
|
|
|
|
|
|
|
|
#undef RETURN
|
|
|
|
|
#define RETURN(_x_) do \
|
|
|
|
|
{ \
|
|
|
|
|
if (sBuf) \
|
|
|
|
|
acl_myfree(sBuf); \
|
|
|
|
|
return(_x_); \
|
|
|
|
|
} while(0);
|
|
|
|
|
|
|
|
|
|
sBuf = acl_vstream_loadfile(psPath);
|
|
|
|
|
if (sBuf == NULL || *sBuf == 0)
|
|
|
|
|
RETURN (-1);
|
|
|
|
|
|
|
|
|
|
iLen = strlen(sBuf);
|
|
|
|
|
if (m_bTrans)
|
|
|
|
|
Trans(sBuf); // <20><>ʼת<CABC><D7AA>
|
|
|
|
|
else if (strstr(psPath, ".html") != NULL)
|
|
|
|
|
Restore(sBuf);
|
|
|
|
|
else
|
|
|
|
|
RETURN (0);
|
|
|
|
|
|
|
|
|
|
ACL_VSTREAM *fp;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
fp = acl_vstream_fopen(psPath, O_RDWR | O_TRUNC | O_BINARY | O_APPEND, 0600, 1024);
|
|
|
|
|
if (fp == NULL)
|
|
|
|
|
RETURN (-1);
|
|
|
|
|
ret = acl_vstream_writen(fp, sBuf, iLen);
|
|
|
|
|
acl_vstream_close(fp);
|
|
|
|
|
RETURN (ret == ACL_VSTREAM_EOF ? -1 : 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CAclTrans::ScanPath(CString *psPath)
|
|
|
|
|
{
|
|
|
|
|
ACL_SCAN_DIR *scan_src;
|
|
|
|
|
|
|
|
|
|
scan_src = acl_scan_dir_open(psPath->GetString(), 1);
|
|
|
|
|
if (scan_src == NULL)
|
|
|
|
|
{
|
|
|
|
|
CString msg;
|
|
|
|
|
|
|
|
|
|
msg.Format("Open src path %s error", psPath->GetString());
|
|
|
|
|
MessageBox(NULL, msg, "Open path", 0);
|
|
|
|
|
return (-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
|
|
|
|
const char *fName;
|
|
|
|
|
CString fPath;
|
|
|
|
|
|
|
|
|
|
fName = acl_scan_dir_next_file(scan_src);
|
|
|
|
|
if (fName == NULL)
|
|
|
|
|
break;
|
|
|
|
|
fPath = acl_scan_dir_path(scan_src);
|
|
|
|
|
fPath += "\\";
|
|
|
|
|
fPath += fName;
|
|
|
|
|
TransFile(fPath.GetString());
|
|
|
|
|
}
|
|
|
|
|
acl_scan_dir_close(scan_src);
|
|
|
|
|
return (0);
|
|
|
|
|
}
|