kitlog.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. Uses Objects, App, Drivers, Menus, Views, CTime, FTN, TKitLog, Dialogs, MsgBox;
  2. type
  3. {TLogInterior}
  4. PLogInterior = ^TLogInterior;
  5. TLogInterior = object (TScroller)
  6. Lines:PCollection;
  7. constructor Init(var R: TRect; SX, SY:PScrollBar;
  8. aL:PCollection);
  9. Procedure Draw;virtual;
  10. Destructor Done;virtual;
  11. end;
  12. {TLogDialog}
  13. LogDialogParams = record
  14. Hour,Min,SB,RB,ST,RT,SF,RF : longint;
  15. aProt, aSes : Pointer;
  16. end;
  17. PLogDialog = ^TLogDialog;
  18. TLogDialog = object (TDialog)
  19. TextLogPath : PString;
  20. TxtLog : PDOSStream;
  21. DialData : LogDialogParams;
  22. Constructor Init(var Bounds: TRect; ATitle: TTitleStr;aTxtLog:String);
  23. Procedure NewLogWnd(OB,OE:LongInt);
  24. Procedure HandleEvent(var Event:TEvent);virtual;
  25. Destructor Done;virtual;
  26. end;
  27. PNodesList = ^TNodesList;
  28. TNodesList = object (TListViewer)
  29. Log : PLog;
  30. CurView : PCollection;
  31. DayScroller: PSCrollBar;
  32. Procedure FocusItem(Item: Integer); virtual;
  33. Procedure HandleEvent(var Event: TEvent); virtual;
  34. Procedure ChangeDay(aD:integer);
  35. Function GetText(Item: Integer; MaxLen: Integer): String; virtual;
  36. Destructor Done;virtual;
  37. constructor Init(var Bounds: TRect; ANumCols: Integer;
  38. aLogName:FNameStr;
  39. AHScrollBar, AVScrollBar: PScrollBar);
  40. end;
  41. {TKLVApp}
  42. TKLVApp = object (TApplication)
  43. BinaryLog : PString;
  44. TextLog : PString;
  45. Config : PString;
  46. Procedure OpenLogWindow(BL,TL:PString);
  47. Procedure ReadConfig;
  48. Procedure SaveConfig;
  49. Function OptDial:boolean;
  50. Procedure CheckPaths;
  51. Procedure Run; Virtual;
  52. Procedure InitStatusLine; Virtual;
  53. Procedure InitMenuBar; Virtual;
  54. Destructor Done; Virtual;
  55. end;
  56. {------------------------------------------------------------------}
  57. { I M P L E M E N T A T I O N }
  58. {TKLVApp}
  59. {------------}
  60. Procedure TKLVApp.InitStatusLine;
  61. Var
  62. R:TRect;
  63. Begin
  64. GetExtent(R);
  65. R.A.Y:=R.B.Y-1;
  66. New(StatusLine,Init(R,
  67. NewStatusDef(0,10,
  68. NewStatusKey('~F3~ Открыть лог',kbF3,cmOpen,
  69. NewStatusKey('~Alt-X~ Выход',kbAltX,cmQuit,
  70. nil)),
  71. NewStatusDef(11,12,
  72. NewStatusKey('Меню работы с файлами',kbNoKey,0,
  73. nil),
  74. NewStatusDef(13,14,
  75. NewStatusKey('Помощь по программе',kbNoKey,0,
  76. nil),
  77. nil)))
  78. ));
  79. End;{TKLVApp.InitStatusLine}
  80. {------------}
  81. Procedure TKLVApp.InitMenuBar;
  82. Var
  83. R: TRect;
  84. Begin
  85. GetExtent(R);
  86. R.B.Y:=R.A.Y+1;
  87. MenuBar:=New(PMenuBar,Init(R,NewMenu(
  88. NewSubMenu('~F~ Файл',11,
  89. NewMenu(
  90. NewItem('~O~ Открыть','F3',kbF3,cmOpen,hcNoContext,
  91. NewItem('~X~ Выход','AltX',kbAltX,cmQuit,hcNoContext,
  92. nil))),
  93. NewSubMenu('~H~ Помощь',13,
  94. NewMenu(
  95. NewItem('~I~ Оглавление','CtrlF1',kbCtrlF1,cmHelp,hcNoContext,
  96. nil)),
  97. nil))
  98. )));
  99. End;{TKLVApp.InitMenuBar}
  100. {---------------------------}
  101. Procedure TKLVApp.OpenLogWindow;
  102. var
  103. R,RR1,RR2:TRect;
  104. W:PLogDialog;
  105. B1,B2:PScrollBar;
  106. P:PNodesList;
  107. begin
  108. R.Assign(0,0,30,23);
  109. W:=New(PLogDialog, Init(R,'Ло',PString(TL)^));
  110. with W^ do
  111. begin
  112. RR1.Assign(28,2,29,15);
  113. B1:=New(PScrollBar, Init(RR1));
  114. RR2.Assign(1,14,28,15);
  115. B2:=New(PScrollBar, Init(RR2));
  116. Insert(B1);
  117. Insert(B2);
  118. R.Assign(1,2,28,14);
  119. P:=New(PNodesList,Init(R,1,PString(BL)^,B2,B1));
  120. Insert(P);
  121. RR1.Assign(1,1,28,2);
  122. Insert(New(PParamText,Init(RR1,'Session begins: %02d:%02d',2)));
  123. RR1.Assign(1,15,28,16);
  124. Insert(New(PParamText,Init(RR1,'Send bytes: %12d',1)));
  125. RR1.Assign(1,16,28,17);
  126. Insert(New(PParamText,Init(RR1,'Recived bytes: %12d',1)));
  127. RR1.Assign(1,17,28,18);
  128. Insert(New(PParamText,Init(RR1,'Send time : %12d',1)));
  129. RR1.Assign(1,18,28,19);
  130. Insert(New(PParamText,Init(RR1,'Recive time : %12d',1)));
  131. RR1.Assign(1,19,28,20);
  132. Insert(New(PParamText,Init(RR1,'Send files: %12d',1)));
  133. RR1.Assign(1,20,28,21);
  134. Insert(New(PParamText,Init(RR1,'Recived files: %12d',1)));
  135. RR1.Assign(1,21,28,22);
  136. Insert(New(PParamText,Init(RR1,'Flags: %-8s %-8s',2)));
  137. end;
  138. W^.SetData(W^.DialData);
  139. Desktop^.Insert(W);
  140. P^.ChangeDay(0);
  141. end;{TKLVApp.OpenLogWindow}
  142. {-------------------------------------}
  143. Procedure TKLVApp.CheckPaths;
  144. const
  145. GG = [cmCancel];
  146. Function Exists:boolean;
  147. var
  148. fr:boolean;
  149. tst:TDosStream;
  150. begin
  151. tst.Init(PString(BinaryLog)^,stOpenRead);
  152. fr := tst.Status = stOK;
  153. tst.Done;
  154. tst.Init(PString(TextLog)^,stOpenRead);
  155. fr := fr and (tst.Status = stOK);
  156. tst.Done;
  157. Exists:=fr;
  158. end;
  159. begin
  160. if not Exists then
  161. begin
  162. repeat
  163. MessageBox('Пути неверны!',nil,0);
  164. { DisableCommands(GG);
  165. EnableCommands(GG);}
  166. if OptDial then
  167. begin
  168. if exists then SaveConfig;
  169. end
  170. else
  171. begin
  172. Done;
  173. Halt;
  174. end;
  175. until Exists;
  176. end;
  177. end;{TKLVApp.CheckPaths}
  178. {-------------------------------------}
  179. Procedure TKLVApp.ReadConfig;
  180. const
  181. GG = [cmCancel];
  182. var
  183. conf : TDosStream;
  184. s : string[128];
  185. begin
  186. conf.Init('kitlog.dat',stOpenRead);
  187. if conf.status = stOk then
  188. begin
  189. conf.Read(S,128);
  190. BinaryLog:=NewStr(S);
  191. conf.Read(S,128);
  192. TextLog:=NewStr(S);
  193. end
  194. else
  195. begin
  196. { DisableCommands(GG);
  197. EnableCommands(GG);}
  198. if OptDial then
  199. begin
  200. CheckPaths;
  201. SaveConfig;
  202. end
  203. else
  204. begin
  205. Done;
  206. Halt;
  207. end;
  208. end;
  209. conf.done;
  210. end;{TKLVApp.ReadConfig}
  211. {-------------------------------------}
  212. Procedure TKLVApp.SaveConfig;
  213. var
  214. conf:PDOSStream;
  215. begin
  216. conf:=New(PDosStream,Init('kitlog.dat',stCreate));
  217. conf^.Write(BinaryLog^,128);
  218. conf^.Write(TextLog^,128);
  219. conf^.done;
  220. end;{TKLVApp.ReadConfig}
  221. {-------------------------------------}
  222. Function TKLVApp.OptDial;
  223. var
  224. R:TRect;
  225. D:PDialog;
  226. I:PInputLine;
  227. type
  228. TOptDialData = record
  229. binpath : string[128];
  230. txtpath : string[128];
  231. end;
  232. const
  233. Data: TOptDialData = (
  234. Binpath : 'bhistory.dat';
  235. TxtPath : 'mailer.log');
  236. begin
  237. R.Assign(5,6,75,19);
  238. D:=New(PDialog, Init(R,'Настройка путей'));
  239. with D^ do
  240. begin
  241. R.Assign(1,1,69,3);
  242. Insert(New(PSTaticText,Init(R,#3'Для работы программы необходимо ввести пути к логам')));
  243. R.Assign(30,3,65,4);
  244. I := New(PInputLine, Init(R, 128));
  245. Insert(i);
  246. R.Assign(1,3,25,4);
  247. Insert(New(PLabel,Init(R,'Путь к BinLog''у',I)));
  248. R.Assign(30,5,65,6);
  249. I := New(PInputLine, Init(R, 128)); Insert(i);
  250. R.Assign(1,5,25,6);
  251. Insert(New(PLabel,Init(R,'Путь к текст. логу',I)));
  252. R.Assign(7,8,27,10);
  253. Insert(New(PButton, Init(R,'O~k~',cmOk,bfNormal)));
  254. R.Assign(42,8,62,10);
  255. Insert(New(PButton, Init(R,'~О~тменить',cmCancel,bfNormal)));
  256. SetData(Data);
  257. end;
  258. case Desktop^.ExecView(D) of
  259. cmCancel : OptDial:=false;
  260. else
  261. begin
  262. D^.GetData(Data);
  263. if BinaryLog <> nil then DisposeStr(BinaryLog);
  264. BinaryLog:=NewStr(DAta.binpath);
  265. if TextLog <> nil then DisposeStr(TextLog);
  266. TextLog:=NewStr(DAta.txtpath);
  267. optdial:=true;
  268. end;
  269. end;
  270. end;{TKLVApp.ReadConfig}
  271. {-------------------------------------}
  272. Procedure TKLVApp.Run;
  273. begin
  274. ReadConfig;
  275. CheckPaths;
  276. OpenLogWindow(BinaryLog,TextLog);
  277. Inherited Run;
  278. end;{TKLVApp.Run}
  279. {------------}
  280. Destructor TKLVApp.Done;
  281. begin
  282. if (Binarylog <> nil ) then DisposeStr(BinaryLog);
  283. if (Config <> nil ) then DisposeStr(Config);
  284. if (Textlog <> nil ) then DisposeStr(TextLog);
  285. Inherited Done;
  286. end;{TKLVApp.Done}
  287. {-------------------------------------}
  288. {/TKLVApp}
  289. {TNodesList}
  290. Constructor TNodesList.Init;
  291. begin
  292. Inherited Init(Bounds,ANumCols,nil, AVScrollBar);
  293. Log := New(PLog,Init(aLogName,4));
  294. Log^.Load;
  295. Log^.SetCurDay;
  296. SetRange(Log^.CurDay^.GetSesNum);
  297. CurView := New(PCollection,Init(20,5));
  298. ChangeDay(0);
  299. DayScroller := AHScrollBar;
  300. if (DayScroller<>nil) then DayScroller^.SetParams(Log^.GetDayNum,1,Log^.DayNum,1,1);
  301. end;{TNodesList.Init}
  302. {-------------------------}
  303. Destructor TNodesList.Done;
  304. begin
  305. CurView^.DeleteAll;
  306. Dispose(CurView);
  307. Dispose(Log,Done);
  308. Inherited Done;
  309. end;{TNodesList.Done}
  310. {-------------------------}
  311. Procedure TNodesList.ChangeDay;
  312. var g:PLogSes;s1,s2:string;
  313. begin
  314. if (Log<>nil) then
  315. begin
  316. FocusItem(0);
  317. CurView^.DeleteAll;
  318. Log^.ChangeCurDay(Ad);
  319. G:=Log^.CurDay^.LogSes;
  320. SetRange(Log^.CurDay^.GetSesNum);
  321. if (DayScroller<>nil) then DayScroller^.SetValue(Log^.CurNum+1);
  322. if (Self.Owner<>nil) then
  323. begin
  324. s1:='Лог на ';
  325. Str(Log^.CurDaY^.Date.tm_mday,s2);
  326. s1:=s1+s2;
  327. Str(Log^.CurDaY^.Date.tm_mon,s2);
  328. s1:=s1+'/'+s2;
  329. Str(Log^.CurDaY^.Date.tm_year,s2);
  330. s1:=s1+'/'+s2;
  331. DisposeStr(PDialog(Self.Owner)^.Title);
  332. PDialog(Self.Owner)^.Title:=NewStr(S1);
  333. PDialog(Self.Owner)^.Frame^.Draw;
  334. end;
  335. while G <> Nil do
  336. begin
  337. CurView^.Insert(G);
  338. G:=G^.Next;
  339. end;
  340. FocusItem(0);
  341. DrawView;
  342. end;
  343. end;{TNodesList.ChangeDay}
  344. {-------------------------}
  345. Procedure TNodesList.HandleEvent;
  346. begin
  347. if Event.What = evKeyDown then
  348. case CtrlToArrow(Event.KeyCode) of
  349. kbLeft : begin ChangeDay(-1);ClearEvent(Event);end;
  350. kbRight : begin ChangeDay(1);ClearEvent(Event);end;
  351. end;
  352. Inherited HandleEvent(Event);
  353. end;{TNodesList.Done}
  354. {-------------------------}
  355. Function TNodesList.GetText;
  356. begin
  357. GetText:=Copy(AdrToStr(PLogSes(CurView^.At(Item))^.Who),1,MaxLen);
  358. end;{TNodesList.GetText}
  359. {-------------------------}
  360. Procedure TNodesList.FocusItem;
  361. var
  362. W:PLogDialog;
  363. g:PLogSes;
  364. begin
  365. Inherited FocusItem(Item);
  366. W:=PLogDialog(Self.Owner);
  367. if (W<>nil) then with W^.DialData do
  368. begin
  369. G:=PLogSes(CurView^.At(Focused));
  370. Hour:=G^.TS.TM_HOUR;
  371. Min:=G^.TS.TM_min;
  372. SB:=G^.SB;
  373. RB:=G^.RB;
  374. ST:=G^.ST;
  375. RT:=G^.RT;
  376. SF:=G^.SF;
  377. RF:=G^.RF;
  378. if (aProt<>nil) then DisposeStr(aProt);
  379. if (Ases<>nil) then DisposeStr(ases);
  380. aprot:=NewStr(G^.GetProt);
  381. ases:=NewStr(G^.GetFlag);
  382. W^.SEtData(W^.DialData);
  383. end;
  384. end;{TNodesList.GetText}
  385. {/TNodesList}
  386. {-------------------------}
  387. {TLogDialog}
  388. Constructor TLogDialog.Init;
  389. begin
  390. Inherited Init(Bounds,ATitle);
  391. TextLogPath:=NewStr(ATxtLog);
  392. DialData.aProt:=nil;DialData.aSes:=nil;
  393. TxtLog:=nil;
  394. end;{TLogDialog.Init}
  395. {-------------------------}
  396. Procedure TLogDialog.HandleEvent;
  397. var
  398. nl : PNodesList;
  399. begin
  400. if (Event.What = evBroadCast) and (Event.Command = cmListItemSelected) then
  401. begin
  402. nl :=PNodesList(Event.InfoPtr);
  403. NewLogWnd(PLogSes(nl^.CurView^.At(nl^.Focused))^.OL,
  404. PLogSes(nl^.CurView^.At(nl^.Focused))^.OE);
  405. ClearEvent(Event);
  406. end;
  407. Inherited HandleEvent(Event);
  408. end;{TLogDialog.HandleEvent}
  409. {-------------------------}
  410. Procedure TLogDialog.NewLogWnd;
  411. var
  412. Ls : PCollection;
  413. I:Word;
  414. st2:string;
  415. W:PDialog;
  416. R:TRect;
  417. begin
  418. Ls:=New(PCollection,Init(10,5));
  419. if (TxtLog=nil) then
  420. txtlog:=New(PDOSStream,Init(PString(textlogpath)^,stopenread));
  421. txtlog^.Seek(OB);
  422. repeat
  423. i:=0;
  424. repeat
  425. inc(i);
  426. txtlog^.Read(st2[i],1);
  427. if (txtlog^.Status <> stOK) then
  428. begin
  429. Ls^.Insert(NewStr('Ошибка открытия файла'));
  430. exit;
  431. end;
  432. until (I>254) or (st2[I]=#10);
  433. st2[0]:=chr(i-2);
  434. if (st2[0]=#0) then Ls^.Insert(NewStr(' ')) else
  435. Ls^.Insert(NewStr(st2));
  436. until txtlog^.GetPos>OE;
  437. R.Assign(1,1,77,22);
  438. W:=New(PDialog,Init(R,'Лог на сессию'));
  439. with W^ do
  440. begin
  441. GetClipRect(R);
  442. R.Grow(-1,-1);
  443. Insert(New(PLogInterior,Init(R,
  444. StandardScrollBar(sbHorizontal+sbHandleKeyBoard),
  445. StandardScrollBar(sbVertical+sbHandleKeyBoard),
  446. Ls)));
  447. end;
  448. DeskTop^.ExecView(W);
  449. W^.Done;
  450. end;{TLogDialog.NewLogWnd}
  451. {-------------------------}
  452. Destructor TLogDialog.Done;
  453. begin
  454. DisposeStr(TextLogPath);
  455. if (TxtLog<>nil) then Dispose(TxtLog,Done);
  456. Inherited Done;
  457. end;{TLogDialog.Done}
  458. {-------------------------}
  459. {/TLogDialog}
  460. {TLogInterior}
  461. Constructor TLogInterior.Init;
  462. begin
  463. Inherited Init(R,Sx,SY);
  464. Lines:=Al;
  465. if (Lines<>nil) then
  466. begin
  467. GrowMode := gfGrowHiX+gfGrowHiY;
  468. SetLimit(128,Lines^.Count-1);
  469. end;
  470. end;{TLogInterior.Init}
  471. {-------------------------}
  472. Procedure TLogInterior.Draw;
  473. var
  474. Y:Integer;
  475. B:TDrawBuffer;
  476. S:String;
  477. begin
  478. for Y:=0 to pred(Size.Y) do
  479. begin
  480. MoveChar(B,' ',GetColor(1),Size.X);
  481. if (Y+Delta.Y < Lines^.Count) and (Lines^.At(y+Delta.y)<>nil) then
  482. begin
  483. S:= PString(Lines^.At(Y+Delta.Y))^;
  484. MoveStr(B,Copy(s,Delta.x+1,Length(s)-Delta.x),GetColor(1))
  485. end;
  486. WritelINE(0,y,sIZE.x,1,B);
  487. end;
  488. end;{TLogInterior.Draw}
  489. {-------------------------}
  490. Destructor TLogInterior.Done;
  491. Procedure DelAll(Item: Pointer); far;
  492. begin
  493. DisPoseStr(Item);
  494. end;{}
  495. begin
  496. if Lines<>nil then
  497. begin
  498. Lines^.ForEach(@DElAll);
  499. Lines^.DeleteAll;
  500. end;
  501. INherited Done;
  502. end;
  503. {/TLogInterior}
  504. {------------------------------------------------------------------}
  505. var
  506. KLVApp : TKLVApp;
  507. BEGIN
  508. KLVApp.Init;
  509. KLVApp.Run;
  510. KLVApp.Done;
  511. END.