OSDN Git Service

バグレポート機能実装途中
[nlite/nlite.git] / nlite / nlite_common.cpp
1 #include "stdafx.h"
2 #include "nlite_include.h"
3
4
5
6 namespace nlite{
7         
8         namespace nliteregex{
9                 namespace text{
10                         const  CString URL_TEXT = TEXT("(https?|ftp)(://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)");
11                         const  CString TAG_TEXT = TEXT("<[\"_;!?,\\:.'$%&#/a-zA-Z0-9= ]*>");
12                         const  CString VIDEOID_TEXT = TEXT("(sm|nm)([0-9])+");
13                         const  CString LIVEID_TEXT = TEXT("(lv)([0-9])+");
14                         const  CString LINK_TEXT = TEXT("(") + URL_TEXT + TEXT(")|(") + VIDEOID_TEXT + TEXT(")|(") + LIVEID_TEXT + TEXT(")");
15                         const  CString SEARTCH_AT_MARK(TEXT("(.*)(@|\81\97)([^ |^\81@][^@^\81\97]+)"));
16                         const  tstring NUTHINGSTRING(TEXT(""));
17                 }
18                 const  tregex URL(text::URL_TEXT);
19                 const  tregex TAGSTRING(text::TAG_TEXT);
20                 const  tregex VIDEOID(text::VIDEOID_TEXT);
21                 const  tregex LIVEID(text::LIVEID_TEXT);
22                 const  tregex LILNKREGEX(text::LINK_TEXT);
23                 const tregex NAMESERTCHREGEX(text::SEARTCH_AT_MARK);
24         }
25         CProperty nliteProperty;        
26         CListenerList nlite::listenerList;
27         TCHAR appFolderPath[_MAX_PATH];
28         CString ncvAppSettingPath;
29         TCHAR localAppDataPath[_MAX_PATH];
30         speaker::ISpeaker &g_speaker = speaker::ISpeaker::GetMeiNormal(TEXT("libs\\Voice\\mei_normal\\"),TEXT("libs\\open_jtalk_dic\\"));
31         WSAData wsaData;                                                        //winsockdata
32         HINTERNET hInternet = NULL;
33         CNliteMainFrame wnd;                                            //\83\81\83C\83\93\83t\83\8c\81[\83\80\83E\83B\83\93\83h\83E
34
35         VOID nlite::UnexpectedErrorMessageShow(LPCTSTR headMessage,LPCTSTR summary,UINT line,LPCTSTR fileName,LPCTSTR function){
36                 
37                 CString errLogFilePath(nliteProperty.GetPropertySaveFolderPath());
38                 CAtlFile errFile;
39                 TCHAR errfile[_MAX_PATH];
40
41                 time_t nowtime = time(NULL);
42                 tm timestruct = *gmtime(&nowtime);
43                 _tcsftime(errfile,ARRAY_LENGTH(errfile),TEXT("errorlog\\nlite_errorLog_%Y%m%d%H%M%S.log"),&timestruct);
44                 errLogFilePath += errfile;
45                 SurelyCreate(errLogFilePath,TRUE);
46                 
47                 CString outputLogfileString;
48                 TCHAR file[_MAX_PATH];
49                 TCHAR ext[_MAX_PATH];
50                 _wsplitpath(fileName,(wchar_t*)NULL,(wchar_t*)NULL,file,ext);
51                 DWORD lastErrorCode = ::GetLastError();
52                 LPTSTR lpMsgBuf;
53                 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, lastErrorCode,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,(va_list*)NULL);
54                 
55                 
56                 outputLogfileString.Format(TEXT("##ERROR##\r\n\94­\90\83t\83@\83C\83\8b\96¼:%s%s\r\n\94­\90\8aÖ\90\94\96¼:%s\r\n\94­\90\8ds:%d\r\n\83G\83\89\81[\83\81\83b\83Z\81[\83W:%s\r\n\8dÅ\8fIOS\83G\83\89\81[\83R\81[\83h:%u\r\n\8dÅ\8fIOS\83G\83\89\81[\83\81\83b\83Z\81[\83W:%s")
57                         ,file,ext,function,line,summary,lastErrorCode,lpMsgBuf);
58                 LocalFree(lpMsgBuf);
59                 CStringA outputLogfileStringA(outputLogfileString);
60                 errFile.Create(errLogFilePath,GENERIC_WRITE,0,OPEN_ALWAYS);
61                 errFile.Write(outputLogfileStringA,outputLogfileStringA.GetLength() * sizeof(char));
62                 tstring errMessage;
63                 errMessage = headMessage;
64                 errMessage += TEXT("\91z\92è\82³\82ê\82Ä\82¢\82È\82¢\83G\83\89\81[\82ª\94­\90\82µ\82Ü\82µ\82½\81B\88È\89º\82Ì\83t\83@\83C\83\8b\82É\83G\83\89\81[\83t\83@\83C\83\8b\82ª\8fo\97Í\82³\82ê\82½\82Ü\82µ\82½\81B\r\n");
65                 errMessage += errLogFilePath;
66                 errMessage += TEXT("\r\n\83G\83\89\81[\83\81\83b\83Z\81[\83W:");
67                 errMessage += summary;
68                 ::MessageBox(NULL,errMessage.c_str(),TEXT("\91z\92è\82³\82ê\82Ä\82¢\82È\82¢\83G\83\89\81["),MB_ICONERROR | MB_OK);
69                 
70                 
71                 
72                 
73                 
74                 return;
75         }
76
77         HINSTANCE OpenURL(HWND hwnd,const CGeneralProperty &gp,LPCTSTR url ,INT nShowCommand){
78
79                 HINSTANCE rslt;
80
81                 if(gp.GetBrowserPath().Length() == 0){
82
83                         rslt = ShellExecute(hwnd, NULL, url, NULL, NULL, nShowCommand);
84
85                 } else{
86
87                         rslt = ShellExecute(hwnd, NULL, gp.GetBrowserPath(), url, NULL, nShowCommand);
88
89                 }
90
91                 return rslt;
92
93         }
94
95         BOOL SurelyCreate(LPCTSTR dir,BOOL bFile){
96
97
98
99                 BOOL rslt = FALSE;
100                 std::vector<TCHAR> buf(_tcslen(dir) + 1);
101                 _tcscpy(&buf[0],dir);
102
103
104                 if( (PathFileExists(dir) && (!bFile || !::PathIsDirectory( dir )))){
105
106                         goto success;
107                 }
108
109                 LPTSTR startPtr = &buf[0];
110                 LPTSTR indexPtr = startPtr;
111                 LPTSTR cmpPtr;
112                 do {
113
114                         cmpPtr = _tcsstr(indexPtr,TEXT("\\"));
115
116                         if(cmpPtr == NULL){
117
118                                 if(bFile == TRUE){
119                                         CAtlFile file;
120                                         if( file.Create(startPtr,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL) != S_OK){
121
122                                                 goto err;
123
124                                         }
125                                 } else {
126
127                                         ::CreateDirectory(startPtr,0);
128                                 }
129
130                                 break;
131
132
133                         }else if(indexPtr == cmpPtr){
134                                 break;
135
136                         }
137
138                         cmpPtr[0] = TEXT('\0');
139                         ::CreateDirectory(startPtr,0);
140                         cmpPtr[0] = TEXT('\\');
141                         cmpPtr++;
142                         indexPtr = cmpPtr;
143
144
145                 }while(indexPtr[0] != TEXT('\0'));
146
147 success:
148
149
150                 rslt = TRUE;
151
152 end:
153
154                 return rslt;
155
156
157 err:
158                 rslt = FALSE;
159                 goto end;
160         }
161
162
163         ///
164         ///NCV\83\86\81[\83U\8fî\95ñ\83t\83@\83C\83\8b\83p\83X\8eæ\93¾XML\83p\81[\83T
165         ///
166         class CReadNCVListenerInfoFile:public CXmlParser{
167
168         private:
169
170                 BOOL settingDirFlag;
171                 CString &path;  
172
173
174
175
176         public:
177
178                 CReadNCVListenerInfoFile(CString &in_path):settingDirFlag(FALSE),path(in_path){}
179
180                 void OnStartElement (const XML_Char *pszName, const XML_Char **papszAttrs){
181
182                         if(_tcscmp(pszName,TEXT("SettingDir")) == 0){
183
184                                 settingDirFlag = TRUE;
185
186                         }
187
188                 }
189
190                 void OnEndElement (const XML_Char *pszName){
191
192                         if(_tcscmp(pszName,TEXT("SettingDir")) == 0){
193
194                                 settingDirFlag = FALSE;
195
196                         }
197
198                 }
199
200                 void OnCharacterData (const XML_Char *pszData, int nLength){
201
202                         if(settingDirFlag == TRUE){
203
204                                 path.Append(pszData,nLength);
205
206                         }
207
208                 }
209         };
210
211         CString GetNCVListenerInfoFilePath(){
212
213
214                 CString rslt;
215
216
217                 if((PathFileExists(ncvAppSettingPath) &&  (!::PathIsDirectory( ncvAppSettingPath )))){
218
219
220                         CAtlFile ncvAppSettingFile;
221                         ULONGLONG ncvAppSettingFileSize = 0;
222                         if(SUCCEEDED(ncvAppSettingFile.Create(ncvAppSettingPath,GENERIC_READ,FILE_SHARE_READ,OPEN_ALWAYS)) == FALSE ||
223                                 SUCCEEDED(ncvAppSettingFile.GetSize(ncvAppSettingFileSize)) == FALSE){
224
225                                         throw Exception(TEXT("NCV\82Ì\90Ý\92è\83t\83@\83C\83\8b\82ª\93Ç\82Ý\8d\9e\82ß\82Ü\82¹\82ñ\82Å\82µ\82½"),__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
226
227                         }
228                         std::vector<char> fileBuf(static_cast<UINT_PTR>(ncvAppSettingFileSize) / sizeof(char) + (1 * sizeof(char)));
229                         ncvAppSettingFile.Read(&fileBuf[0],fileBuf.size());
230                         LPSTR startPtr = strstr(&fileBuf[0],"<");
231                         if(startPtr != NULL){
232                                 CReadNCVListenerInfoFile parser(rslt);
233                                 parser.Parse(startPtr);
234                                 rslt += TEXT("UserSetting.xml");
235
236                         }
237
238                 }
239
240
241
242
243                 return rslt;
244         }
245
246
247
248         const CApplicationInfo * appInfo = NULL;
249
250
251
252
253
254         BOOL InitializeNlite(){
255
256                 BOOL rslt = FALSE;
257
258                 try{
259
260                         nlite::appInfo = &CApplicationInfo::getInstance();
261                         INT_PTR err;
262                         INT_PTR count = 0;
263
264                         //WSAData\82ð\8f\89\8aú\89»
265                         while((err = WSAStartup(MAKEWORD(2,0),&wsaData)) == WSASYSNOTREADY){
266
267                                 count++;
268                                 if(count >= 5)break;
269                                 Sleep(500);
270
271
272
273                         }
274
275                         if(err != ERROR_SUCCESS){
276
277                                 throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
278                         }
279
280                         //\83A\83v\83\8a\83P\81[\83V\83\87\83\93\8fî\95ñ\83C\83\93\83X\83^\83\93\83X\90\90¬
281                         const CApplicationInfo &appInfo = CApplicationInfo::getInstance();
282                         CNLiteString userAgent;
283                         userAgent = appInfo.getProcuctName();
284                         userAgent += TEXT("/");
285                         userAgent += appInfo.getProductVersion();
286
287
288
289                         //HTTP\83I\83u\83W\83F\83N\83g\90\90¬
290                         hInternet = WinHttpOpen(userAgent,WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,(LPCWSTR)WINHTTP_NO_PROXY_NAME,(LPCWSTR)WINHTTP_NO_PROXY_BYPASS,0);
291
292                         if(hInternet == NULL){
293
294                                 throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
295
296                         }
297
298                         //nlib\82Ì\8f\89\8aú\89»
299                         InitializeNLIB(hInternet);
300
301                         //\83\8d\81[\83J\83\8b\83A\83v\83\8a\83P\81[\83V\83\87\83\93\83t\83H\83\8b\83_\8c\9f\8dõ
302                         if(SHGetFolderPathW(0,CSIDL_LOCAL_APPDATA,0,SHGFP_TYPE_CURRENT,localAppDataPath) != S_OK){
303
304                                 throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
305                         }
306
307
308                         
309
310
311
312                         if(SHGetFolderPathW(0,CSIDL_APPDATA,0,SHGFP_TYPE_CURRENT,appFolderPath) != S_OK){
313
314                                 throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
315                         }
316                         ncvAppSettingPath = appFolderPath;
317                         ncvAppSettingPath += TEXT("\\posite-c\\NiconamaCommentViewer\\AppSetting.xml");
318
319                         nliteProperty.ReadProperty();
320
321                         if((nliteProperty.GetGeneralProperty().IsNCVUserSettingReaded() == FALSE)){
322
323                                 ReadNCVListenerData();
324                         }
325
326                         listenerList.ReadProperty(nliteProperty.GetListenerDataPath());
327
328                         CBugReport::Initalize(hInternet,CString(nliteProperty.GetPropertySaveFolderPath()) + TEXT("bugReport\\"));
329                         rslt = TRUE;
330                 }catch (AppInitException e){
331
332                         rslt = FALSE;
333
334                 }
335         
336
337                 return rslt;
338         }
339
340
341         VOID FinalizeNlite(){
342
343                 //\83\81\83C\83\93\83t\83\8c\81[\83\80\83E\83B\83\93\83h\83E\8cã\8f\88\97\9d
344                 wnd.Finalaize();
345
346                 //nlib\8cã\8f\88\97\9d
347                 FinalizeNLIB();
348
349                 //HTTP\83I\83u\83W\83F\83N\83g\8aJ\95ú
350                 WinHttpCloseHandle(hInternet);
351
352                 //winsock\8aJ\95ú
353                 WSACleanup();
354
355                 return;
356         }
357
358
359         BOOL ReadNCVListenerData(){
360
361                 BOOL rslt = FALSE;
362
363                 if((PathFileExists(ncvAppSettingPath) &&  (!::PathIsDirectory( ncvAppSettingPath )))){
364                 
365                         if((::MessageBox(NULL,TEXT("NCV\82Ì\83\8a\83X\83i\81[\8fî\95ñ\82Æ\93¯\8aú\82µ\82Ü\82·\82©\81H"),TEXT("\83\8a\83X\83i\81[\8fî\95ñ\93Ç\82Ý\8d\9e\82Ý"),MB_OK | MB_OKCANCEL) == IDOK)){
366                                 listenerList.ReadProperty(GetNCVListenerInfoFilePath());
367                         }
368                         nliteProperty.GetGeneralProperty().SetNCVUSerSettingReaded(TRUE);
369                         rslt = TRUE;
370                 }
371
372                 return rslt;
373         }
374 }
375