TKITLOG.PAS 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. Unit TKitLog;
  2. InterFace
  3. Uses CTime, Objects, FTN;
  4. type
  5. PLogDay = ^TLogDay;
  6. PLogSes = ^TLogSes;
  7. PLog = ^TLog;
  8. TLog = object
  9. MyAddr : TFTNA;
  10. LogName : FNameStr;
  11. AllLog : PLogDay;
  12. Days : PCollection;
  13. DayNum : word;
  14. SesNum : longint;
  15. CurDay : PLogDay;
  16. CurNum : word;
  17. TZ : ShortInt;
  18. Constructor Init(aLogName:FNameStr;aTZ:ShortInt);
  19. Function GetDaySes(day:tm):PLogSes;
  20. Function GetDay(day:tm):PLogDay;
  21. Function GetSesNum:longint;
  22. Function GetDayNum:Word;
  23. Procedure SetCurDay;
  24. Procedure ChangeCurDay(delta:integer);
  25. Procedure Load;
  26. Destructor Done;
  27. end;
  28. TLogSes = object
  29. Owner : PLogDay;
  30. Who : TFTNA;
  31. TS : Tm;
  32. TE : Tm;
  33. SB : LongInt;
  34. RB : LongInt;
  35. ST : LongInt;
  36. RT : LongInt;
  37. OL : LongInt;
  38. OE : LongInt;
  39. Flags : LongInt;
  40. SF : LongInt;
  41. RF : LongInt;
  42. Next : PLogSes;
  43. Destructor Done;
  44. Constructor Init(aOwn:PLogDay);
  45. Procedure Get(S:PDosStream);
  46. Function GetProt:string;
  47. Function GetFlag:string;
  48. Function LogLine:string;
  49. end;
  50. TLogDay = object
  51. Owner : PLog;
  52. Date : tm;
  53. LogSes : PLogSes;
  54. Next : PLogDay;
  55. Constructor Init(aOwn:PLOg);
  56. Procedure Get(S:PDosStream);
  57. Function GetSesNum:word;
  58. destructor Done;
  59. end;
  60. Implementation
  61. Constructor TLogDay.Init;
  62. begin
  63. Owner:=aOwn;
  64. end;
  65. Destructor TLog.Done;
  66. begin
  67. if (Days<>nil) Then
  68. begin
  69. Days^.DeleteAll;
  70. Dispose(Days);
  71. end;
  72. if (AllLog<>nil) then DisPose(AllLog,Done);
  73. end;
  74. Destructor TLogSes.Done;
  75. begin
  76. if (Next<>nil) then DisPose(Next,Done);
  77. end;
  78. Destructor TLogDay.Done;
  79. begin
  80. if (LogSes<>nil) then Dispose(LogSes,Done);
  81. if (Next<>nil) then DisPose(Next,Done);
  82. end;
  83. Procedure TLOG.SetCurDay;
  84. var
  85. cur:plogday;
  86. begin
  87. if (Days=nil) then
  88. begin
  89. New(days,Init(10,5));
  90. cur:=AllLog;
  91. DayNum:=0;
  92. while(cur<>nil) do
  93. begin
  94. Days^.Insert(Cur);
  95. cur:=cur^.next;
  96. inc(DayNum);
  97. end;
  98. CurNum:=DayNum-1;
  99. CurDay:=Days^.At(CurNum);
  100. end;
  101. end;
  102. Function TLogSes.GetProt:String;
  103. const
  104. Zds:array[0..3] of string[6] = ('zmodem','zedzap','undf ','dirzap');
  105. Hyd:array[6..7] of string[6] = ('hydra ','hydRH1');
  106. FTS:string[6] = 'xmodem';
  107. KMP:string[6] = 'KMP ';
  108. begin
  109. if (((Flags shr 8) and $F) and $C) = 0 then
  110. GetProt:=Zds[(Flags shr 8) and $F]
  111. else if (((Flags shr 8) and $F) and 8) = 0 then
  112. GetProt:=Hyd[(Flags shr 8) and $F]
  113. else if ((Flags shr 8) and $F) = 8 then
  114. GetProt:=FTS
  115. else
  116. GetProt:=KMP;
  117. end;
  118. Function TLogSes.GetFlag:String;
  119. const
  120. FLS:string[7] = 'IPCAFEK';
  121. begin
  122. if (Flags and 1)=0 then FLS[1]:='O';
  123. if (Flags and 2)=0 then FLS[2]:='!';
  124. if (Flags and 4)=0 then FLS[3]:=' ';
  125. if (Flags and 8)=0 then FLS[4]:=' ';
  126. if (Flags and 16)=0 then FLS[5]:=' ';
  127. if (Flags and 32)=0 then FLS[6]:='d';
  128. if (Flags and 4096)=0 then FLS[7]:=' ';
  129. GetFlag:=Fls;
  130. end;
  131. {------------------------------------------}
  132. Procedure TLog.Load;
  133. var
  134. Log:PDosStream;
  135. sig,ver:longint;
  136. begin
  137. New(Log,Init(LogName,stOpenRead));
  138. if Log^.Status=stOk then
  139. begin
  140. Log^.Read(Sig,4);
  141. Log^.Read(Ver,4);
  142. if (Sig=$D51AFF04) and (Ver=1) then
  143. begin
  144. New(AllLog,Init(@Self));
  145. AllLog^.Get(Log);
  146. end;
  147. end;
  148. Dispose(Log,Done);
  149. end;
  150. Procedure TLogDay.Get(S:PDosStream);
  151. var
  152. gg:LongInt;
  153. begin
  154. S^.Read(GG,4);
  155. S^.Read(GG,4);
  156. S^.Read(GG,4);
  157. unixtodos(GG,Date,Owner^.TZ);
  158. S^.Seek(S^.GetPos-12);
  159. if (S^.Status=stOk) then
  160. begin
  161. New(LogSes,Init(@Self));
  162. LogSes^.Get(S);
  163. if (S^.Status=stOk) then
  164. begin
  165. New(Next,Init(Owner));
  166. Next^.Get(S);
  167. end
  168. else Next:=nil;
  169. end
  170. end;
  171. Procedure TLogSes.Get;
  172. var g:longint;nxt:tm;
  173. begin
  174. S^.Read(Who,8);
  175. S^.Read(G,4);
  176. UnixToDos(G,TS,Owner^.Owner^.TZ);
  177. S^.Read(G,4);
  178. UnixToDos(G,TE,Owner^.Owner^.TZ);
  179. S^.Read(SB,4);
  180. S^.Read(RB,4);
  181. S^.Read(ST,4);
  182. S^.Read(RT,4);
  183. S^.Read(OL,4);
  184. S^.Read(OE,4);
  185. S^.Read(Flags,4);
  186. S^.Read(G,4);
  187. S^.Read(SF,4);
  188. S^.Read(RF,4);
  189. S^.Read(G,4);
  190. S^.Read(G,4);
  191. if (S^.Status=stOk) then
  192. begin
  193. S^.Read(G,4);
  194. S^.Read(G,4);
  195. S^.Read(G,4);
  196. UnixToDos(G,NXT,Owner^.Owner^.TZ);
  197. S^.Seek(S^.GetPos-12);
  198. if (NXT.TM_MDAY=Owner^.Date.TM_MDay) and
  199. (NXT.TM_MON=Owner^.Date.TM_MON) and
  200. (NXT.TM_YEAR=Owner^.Date.TM_YEAR) then
  201. begin
  202. New(Next,INit(Owner));
  203. Next^.Get(S);
  204. end
  205. else
  206. Next:=nil;
  207. end;
  208. end;
  209. Constructor TLogSes.Init(aOwn:PLogDay);
  210. begin
  211. Owner:=aOwn;
  212. end;
  213. Constructor TLog.Init;
  214. begin
  215. LogName:=aLogName;
  216. Days:=nil;
  217. TZ:=ATZ;
  218. end;
  219. Function TLog.GetDayNum:Word;
  220. var ret:word;
  221. Cur : PLogDay;
  222. begin
  223. ret:=0;
  224. cur:=AllLog;
  225. while(cur<>nil) do
  226. begin
  227. inc(ret);
  228. cur:=cur^.next;
  229. end;
  230. GetDayNum:=ret;
  231. DayNum:=ret;
  232. end;
  233. Function TLog.GetDaySes(day:tm):PLogSes;
  234. var
  235. Cur : PLogDay;
  236. begin
  237. Cur:=AllLog;
  238. while (cur^.Next<>nil) and (not
  239. (cur^.Date.tm_mday=day.tm_mday) and
  240. (cur^.Date.tm_mon=day.tm_mon) and
  241. (cur^.Date.tm_year=day.tm_year)) do Cur:=Cur^.Next;
  242. if (cur^.Date.tm_mday=day.tm_mday) and
  243. (cur^.Date.tm_mon=day.tm_mon) and
  244. (cur^.Date.tm_year=day.tm_year) then GetDaySes:=Cur^.LogSes
  245. else
  246. GetDaySes:=nil;
  247. end;
  248. Function TLog.GetDay(day:tm):PLogDay;
  249. var
  250. Cur : PLogDay;
  251. begin
  252. Cur:=AllLog;
  253. while (cur^.Next<>nil) and
  254. (not ((cur^.Date.tm_mday=day.tm_mday) and
  255. (cur^.Date.tm_mon=day.tm_mon) and
  256. (cur^.Date.tm_year=day.tm_year))) do Cur:=Cur^.Next;
  257. if (cur^.Date.tm_mday=day.tm_mday) and
  258. (cur^.Date.tm_mon=day.tm_mon) and
  259. (cur^.Date.tm_year=day.tm_year) then GetDay:=Cur
  260. else
  261. GetDay:=nil;
  262. end;
  263. Function TLog.GetSesNum:longint;
  264. var ret:word;
  265. Cur : PLogDay;
  266. begin
  267. ret:=0;
  268. cur:=AllLog;
  269. while Cur<>nil do
  270. begin
  271. ret:=ret+Cur^.GetSesNum;
  272. Cur:=cur^.next;
  273. end;
  274. GetSesNum:=ret;
  275. SesNum:=ret;
  276. end;
  277. Function TLogDay.GetSesNum:Word;
  278. var
  279. Cur2 : PLogSes;
  280. ret2 : word;
  281. begin
  282. ret2:=0;
  283. cur2:=LogSes;
  284. while(cur2<>nil) do
  285. begin
  286. inc(ret2);
  287. cur2:=cur2^.next;
  288. end;
  289. GetSesNum:=ret2;
  290. end;
  291. Function TLogSes.LogLine;
  292. begin
  293. LogLine:=AdrToStr(Who);
  294. end;
  295. Procedure TLog.ChangeCurDay(delta:integer);
  296. begin
  297. if (DAys<>nil) then
  298. begin
  299. if (CurNum+Delta) in [0..DayNum-1] then
  300. begin
  301. CurNum:=CurNum+Delta;
  302. CurDay:=Days^.At(CurNum);
  303. end;
  304. end;
  305. end;
  306. END.