00001
00002
00003
00004
00005 #include "MFCBase.h"
00006 #include "LogWndDoc.h"
00007 #include "LogWndFrame.h"
00008
00009
00010 #ifdef _DEBUG
00011 #define new DEBUG_NEW
00012 #endif
00013
00014
00015 using namespace jbxl;
00016 using namespace jbxwl;
00017
00018
00019
00020
00021 IMPLEMENT_DYNCREATE(CLogWndDoc, CDocument)
00022
00023 BEGIN_MESSAGE_MAP(CLogWndDoc, CDocument)
00024 END_MESSAGE_MAP()
00025
00026
00027
00028
00029 CLogWndDoc::CLogWndDoc()
00030 {
00031
00032
00033 pFrame = NULL;
00034 pView = NULL;
00035 Title = _T("");
00036 save_fname = _T("");
00037 binHexMode = TRUE;
00038
00039
00040 ringBuffer = new CLogRingBuffer(MAXBUFFERLINE);
00041 }
00042
00043
00044
00045 CLogWndDoc::CLogWndDoc(int bufsz, BOOL binhex)
00046 {
00047
00048
00049 pFrame = NULL;
00050 pView = NULL;
00051 Title = _T("");
00052 save_fname = _T("");
00053 binHexMode = binhex;
00054
00055 if (bufsz<=0) bufsz = MAXBUFFERLINE;
00056 ringBuffer = new CLogRingBuffer(bufsz);
00057 }
00058
00059
00060
00061 CLogWndDoc::~CLogWndDoc()
00062 {
00063 DEBUG_INFO("DESTRUCTOR: CLogWndDoc: START\n");
00064
00065 while(m_locked) ::Sleep(10);
00066 if (pView!=NULL) pView->unlock();
00067
00068 CLogWndDoc::free();
00069
00070 DEBUG_INFO("DESTRUCTOR: CLogWndDoc: END\n");
00071 }
00072
00073
00074
00075 void CLogWndDoc::free(void)
00076 {
00077 if (ringBuffer!=NULL) {
00078 delete(ringBuffer);
00079 ringBuffer = NULL;
00080 }
00081 }
00082
00083
00084
00085 BOOL CLogWndDoc::OnNewDocument()
00086 {
00087
00088 if (!CDocument::OnNewDocument()) return FALSE;
00089 return TRUE;
00090 }
00091
00092
00093
00094
00096
00097
00098 void CLogWndDoc::Serialize(CArchive& ar)
00099 {
00100 if (ar.IsStoring())
00101 {
00102
00103 }
00104 else
00105 {
00106
00107 }
00108 }
00109
00110
00111
00112
00114
00115
00116 #ifdef _DEBUG
00117 void CLogWndDoc::AssertValid() const
00118 {
00119 CDocument::AssertValid();
00120 }
00121
00122
00123 void CLogWndDoc::Dump(CDumpContext& dc) const
00124 {
00125 CDocument::Dump(dc);
00126 }
00127 #endif //_DEBUG
00128
00129
00130
00131
00133
00134
00135 void CLogWndDoc::DeleteContents(void)
00136 {
00137
00138
00139 CDocument::DeleteContents();
00140 }
00141
00142
00143
00144 CLogWndView* CLogWndDoc::GetView(void)
00145 {
00146
00147 POSITION pos = GetFirstViewPosition();
00148 while (pos!=NULL) {
00149 CLogWndView* pview = (CLogWndView*)GetNextView(pos);
00150 if (this==pview->GetDocument()) return pview;
00151 }
00152 return NULL;
00153 }
00154
00155
00156
00157 void CLogWndDoc::clear(void)
00158 {
00159 save_fname = _T("");
00160
00161 CSingleLock lock(&criticalKey);
00162 lock.Lock();
00163 while (!lock.IsLocked()) {
00164 Sleep(100);
00165 lock.Lock();
00166 }
00167
00168 ringBuffer->clear();
00169 lock.Unlock();
00170
00171 return;
00172 }
00173
00174
00175
00176
00178
00179 int CLogWndDoc::writeLogFile(void)
00180 {
00181 if (save_fname==_T("")) return -1;
00182
00183 CSingleLock lock(&criticalKey);
00184 lock.Lock();
00185 while (!lock.IsLocked()) {
00186 Sleep(100);
00187 lock.Lock();
00188 }
00189
00190 int size = 0;
00191 FILE* fp = tfopen(save_fname, _T("wb"));
00192 if (fp==NULL) {
00193 lock.Unlock();
00194 return -2;
00195 }
00196
00197 for (int pos=0; pos<ringBuffer->getMaxLineY(); pos++) {
00198 Buffer buf = dup_Buffer(ringBuffer->pBuf[pos]);
00199 if (ringBuffer->getKindData(pos)!=LOG_RB_BINARY_DATA) {
00200 if (buf.buf[buf.vldsz-1]!='\n') cat_s2Buffer("\n", &buf);
00201 }
00202 fwrite((const char*)buf.buf, strlen((const char*)buf.buf), 1, fp);
00203 size += (int)strlen((const char*)buf.buf);
00204 free_Buffer(&buf);
00205 }
00206 fclose(fp);
00207 lock.Unlock();
00208
00209 return size;
00210 }
00211
00212
00213
00214 CString CLogWndDoc::easyGetSaveFileName(LPCTSTR title, HWND hWnd)
00215 {
00216 OPENFILENAME ofn;
00217 TCHAR fn[LNAME];
00218 CString str = _T("");
00219
00220 memset(fn, 0, LNAME);
00221 memset(&ofn, 0, sizeof(OPENFILENAME));
00222
00223 ofn.lStructSize = sizeof(OPENFILENAME);
00224 ofn.hwndOwner = hWnd;
00225 ofn.Flags = 0;
00226 ofn.lpstrFile = fn;
00227 ofn.nMaxFile = LNAME;
00228 ofn.lpstrTitle = title;
00229
00230 BOOL ret = GetSaveFileName(&ofn);
00231 if (ret) str = fn;
00232
00233 return str;
00234 }
00235
00236
00237
00238
00240
00241
00242
00243 void CLogWndDoc::lprintBuffer(Buffer buf, int input)
00244 {
00245 if (ringBuffer==NULL || pView==NULL || buf.buf==NULL) return;
00246
00247 int no = 0, trymax = 100;
00248
00249 CSingleLock lock(&criticalKey);
00250 lock.Lock();
00251 while (!lock.IsLocked() && no<trymax) {
00252 Sleep(100);
00253 lock.Lock();
00254 no++;
00255 }
00256
00257 ringBuffer->putRingBuffer(buf, input);
00258
00259 int lastPos = ringBuffer->getLastPosition();
00260 if (binHexMode && ringBuffer->getKindData(lastPos-1)==LOG_RB_BINARY_DATA) {
00261 ringBuffer->rewriteBinHexRingBuffer(lastPos-1, input);
00262 }
00263 lock.Unlock();
00264
00265 InvalidateRect(pView->m_hWnd, NULL, FALSE);
00266
00267 return;
00268 }
00269
00270
00271
00272 void CLogWndDoc::lprintString(char* msg, int input)
00273 {
00274 if (ringBuffer==NULL || pView==NULL || msg==NULL) return;
00275
00276 Buffer buf = make_Buffer_bystr(msg);
00277 printBuffer(buf, input);
00278 free_Buffer(&buf);
00279
00280 return;
00281 }
00282
00283
00284
00285 void CLogWndDoc::lfprintFormat(int input, char* fmt, ...)
00286 {
00287 if (ringBuffer==NULL || pView==NULL || fmt==NULL) return;
00288
00289 int no = 0, trymax = 100;
00290
00291 CSingleLock lock(&criticalKey);
00292 lock.Lock();
00293 while (!lock.IsLocked() && no<trymax) {
00294 Sleep(100);
00295 lock.Lock();
00296 no++;
00297 }
00298
00299 va_list args;
00300 va_start(args, fmt);
00301 ringBuffer->putRingFormat(input, fmt, args);
00302 va_end(args);
00303
00304 lock.Unlock();
00305
00306 InvalidateRect(pView->m_hWnd, NULL, FALSE);
00307
00308 return;
00309 }
00310
00311
00312
00313 void CLogWndDoc::lprintFormat(char* fmt, ...)
00314 {
00315 if (ringBuffer==NULL || pView==NULL || fmt==NULL) return;
00316
00317 int no = 0, trymax = 100;
00318
00319 CSingleLock lock(&criticalKey);
00320 lock.Lock();
00321 while (!lock.IsLocked() && no<trymax) {
00322 Sleep(100);
00323 lock.Lock();
00324 no++;
00325 }
00326
00327 va_list args;
00328 va_start(args, fmt);
00329 ringBuffer->putRingFormat(LOG_RB_MESG, fmt, args);
00330 va_end(args);
00331
00332 lock.Unlock();
00333
00334 InvalidateRect(pView->m_hWnd, NULL, FALSE);
00335
00336 return;
00337 }
00338
00339
00340
00341
00343
00344
00345 void CLogWndDoc::printBuffer(Buffer buf, int input)
00346 {
00347 if (ringBuffer==NULL || pView==NULL || buf.buf==NULL) return;
00348
00349 ringBuffer->putRingBuffer(buf, input);
00350
00351 int lastPos = ringBuffer->getLastPosition();
00352 if (binHexMode && ringBuffer->getKindData(lastPos-1)==LOG_RB_BINARY_DATA) {
00353 ringBuffer->rewriteBinHexRingBuffer(lastPos-1, input);
00354 }
00355
00356 InvalidateRect(pView->m_hWnd, NULL, FALSE);
00357
00358 return;
00359 }
00360
00361
00362
00363 void CLogWndDoc::printString(char* msg, int input)
00364 {
00365 if (ringBuffer==NULL || pView==NULL || msg==NULL) return;
00366
00367 Buffer buf = make_Buffer_bystr(msg);
00368 printBuffer(buf, input);
00369 free_Buffer(&buf);
00370
00371 return;
00372 }
00373
00374
00375
00376 void CLogWndDoc::fprintFormat(int input, char* fmt, ...)
00377 {
00378 if (ringBuffer==NULL || pView==NULL || fmt==NULL) return;
00379
00380 va_list args;
00381 va_start(args, fmt);
00382 ringBuffer->putRingFormat(input, fmt, args);
00383 va_end(args);
00384
00385 InvalidateRect(pView->m_hWnd, NULL, FALSE);
00386
00387 return;
00388 }
00389
00390
00391
00392 void CLogWndDoc::printFormat(char* fmt, ...)
00393 {
00394 if (ringBuffer==NULL || pView==NULL || fmt==NULL) return;
00395
00396 va_list args;
00397 va_start(args, fmt);
00398 ringBuffer->putRingFormat(LOG_RB_MESG, fmt, args);
00399 va_end(args);
00400
00401 InvalidateRect(pView->m_hWnd, NULL, FALSE);
00402
00403 return;
00404 }
00405