/lib/messagebases/OLD/r8msgb.pas

https://github.com/r8/spacetoss · Pascal · 323 lines · 253 code · 66 blank · 4 comment · 0 complexity · 4c95f9e381afd9357f4f88d17cfd80cd MD5 · raw file

  1. {$IFDEF RELEASE}
  2. {$A+,B-,D-,E-,F+,G+,I-,L-,N+,Q-,R-,S-,X+,Y-}
  3. {$ENDIF}
  4. Unit r8msgb;
  5. interface
  6. Uses
  7. r8ftn,
  8. r8objs,
  9. strings,
  10. r8str,
  11. objects;
  12. Type
  13. TMessageBody = object(TObject)
  14. MsgBodyLink : PStream;
  15. PathLink : PStream;
  16. SeenByLink : PStream;
  17. ViaLink : PStream;
  18. KludgeBase : PKludgeBase;
  19. Origin : PString;
  20. TearLine : PString;
  21. Constructor Init;
  22. Destructor Done;virtual;
  23. Procedure AddToMsgBodyStream(S:PStream);
  24. Function GetMsgBodyStream:PStream;virtual;
  25. Function GetMsgBodyStreamLite:PStream;virtual;
  26. Procedure PutMsgPathStream(S:PStream);virtual;
  27. Procedure PutMsgSeenByStream(S:PStream);virtual;
  28. Function GetMsgStringPChar:PChar;
  29. Function GetMsgString:string;
  30. Procedure PutMsgString(S:string);
  31. Procedure PutMsgStringPChar(S:PChar);
  32. Function EndOfMessage:boolean;
  33. Procedure SetPos(i:longint);
  34. Procedure SetTearLine(const _Tearline : string);
  35. Procedure SetOrigin(const _Origin : string);
  36. end;
  37. PMessageBody = ^TMessageBody;
  38. implementation
  39. Constructor TMessageBody.Init;
  40. begin
  41. inherited Init;
  42. MsgBodyLink:=New(PMemoryStream,Init(0,cBuffSize));
  43. PathLink:=New(PMemoryStream,Init(0,cBuffSize));
  44. SeenByLink:=New(PMemoryStream,Init(0,cBuffSize));
  45. ViaLink:=New(PMemoryStream,Init(0,cBuffSize));
  46. KludgeBase:=New(PKludgeBase,Init);
  47. Origin:=nil;
  48. Tearline:=nil;
  49. end;
  50. Destructor TMessageBody.Done;
  51. begin
  52. inherited Done;
  53. objDispose(MsgBodyLink);
  54. objDispose(PathLink);
  55. objDispose(SeenByLink);
  56. objDispose(ViaLink);
  57. objDispose(KludgeBase);
  58. DisposeStr(Origin);
  59. DisposeStr(TearLine);
  60. end;
  61. Procedure TMessageBody.PutMsgString(S:string);
  62. begin
  63. objStreamWriteStr10(MsgBodyLink,S);
  64. end;
  65. Procedure TMessageBody.PutMsgStringPChar(S:PChar);
  66. begin
  67. objStreamWriteStrPChar(MsgBodyLink,S);
  68. objStreamWriteStr10(MsgBodyLink,'');
  69. end;
  70. Function TMessageBody.GetMsgBodyStream:PStream;
  71. var
  72. TempStream : PStream;
  73. i : longint;
  74. TempKludge : PKludge;
  75. begin
  76. TempStream:=GetMsgBodyStreamLite;
  77. If SeenByLink^.GetSize>0 then
  78. begin
  79. SeenByLink^.Seek(0);
  80. TempStream^.CopyFrom(SeenByLink^,SeenByLink^.GetSize);
  81. end;
  82. If PathLink^.GetSize>0 then
  83. begin
  84. PathLink^.Seek(0);
  85. TempStream^.CopyFrom(PathLink^,PathLink^.GetSize);
  86. end;
  87. If ViaLink^.GetSize>0 then
  88. begin
  89. ViaLink^.Seek(0);
  90. TempStream^.CopyFrom(ViaLink^,ViaLink^.GetSize);
  91. end;
  92. GetMsgBodyStream:=TempStream;
  93. end;
  94. Function TMessageBody.GetMsgBodyStreamLite:PStream;
  95. var
  96. TempStream : PStream;
  97. i : longint;
  98. TempKludge : PKludge;
  99. begin
  100. TempStream:=New(PMemoryStream,Init(0,cBuffSize));
  101. For i:=0 to KludgeBase^.Kludges^.Count-1 do
  102. begin
  103. TempKludge:=KludgeBase^.Kludges^.At(i);
  104. objStreamWriteStr(TempStream,
  105. #1+TempKludge^.Name+#32+TempKludge^.Value+#13);
  106. end;
  107. MsgBodyLink^.Seek(0);
  108. TempStream^.CopyFrom(MsgBodyLink^,MsgBodyLink^.GetSize);
  109. If TearLine<>nil then objStreamWriteStr10(TempStream,TearLine^);
  110. If Origin<>nil then objStreamWriteStr10(TempStream,Origin^);
  111. GetMsgBodyStreamLite:=TempStream;
  112. end;
  113. Procedure TMessageBody.PutMsgPathStream(S:PStream);
  114. begin
  115. objDispose(PathLink);
  116. PathLink:=New(PMemoryStream,Init(0,cBuffSize));
  117. S^.Seek(0);
  118. PathLink^.Seek(0);
  119. PathLink^.CopyFrom(S^,S^.GetSize);
  120. end;
  121. Procedure TMessageBody.PutMsgSeenByStream(S:PStream);
  122. begin
  123. objDispose(SeenByLink);
  124. SeenByLink:=New(PMemoryStream,Init(0,cBuffSize));
  125. S^.Seek(0);
  126. SeenByLink^.Seek(0);
  127. SeenByLink^.CopyFrom(S^,S^.GetSize);
  128. end;
  129. Function TMessageBody.GetMsgStringPChar:PChar;
  130. begin
  131. GetMsgStringPChar:=objStreamReadStrPChar(MsgBodylink,$1000);
  132. end;
  133. Function TMessageBody.GetMsgString:string;
  134. Var
  135. PTemp:Pchar;
  136. begin
  137. pTemp:=GetMsgStringPChar;
  138. GetMsgString:=StrPas(pTemp);
  139. StrDispose(pTemp);
  140. end;
  141. Function TMessageBody.EndOfMessage:boolean;
  142. begin
  143. EndOfMessage:=True;
  144. If MsgBodyLink^.GetPos<MsgBodyLink^.GetSize-1 then EndOfMessage:=False;
  145. end;
  146. Procedure TMessageBody.SetPos(i:longint);
  147. begin
  148. MsgBodyLink^.Seek(i);
  149. end;
  150. Procedure TMessageBody.AddToMsgBodyStream(S:PStream);
  151. Var
  152. pTemp : PChar;
  153. sTemp : string;
  154. lTemp : longint;
  155. StreamSize : longint;
  156. TextStart : longint;
  157. TextEnd : longint;
  158. SeenByStart : longint;
  159. SeenByEnd : longint;
  160. Kludge : string;
  161. begin
  162. TextStart:=-1;
  163. TextEnd:=-1;
  164. SeenByStart:=-1;
  165. SeenByEnd:=-1;
  166. S^.Seek(0);
  167. MsgBodyLink^.Seek(MsgBodyLink^.GetSize);
  168. StreamSize:=S^.GetSize;
  169. { }
  170. While S^.GetPos<StreamSize-1 do
  171. begin
  172. TextStart:=S^.GetPos;
  173. pTemp:=objStreamReadStrPChar(S,500);
  174. sTemp:=strUpper(StrPas(pTemp));
  175. sTemp:=strUpper(sTemp);
  176. If sTemp[1]=#1 then
  177. begin
  178. sTemp:=StrPas(pTemp);
  179. sTemp:=strTrimL(sTemp,[#1]);
  180. Kludge:=strUpper(strParser(sTemp,1,[#32]));
  181. KludgeBase^.SetKludge(strParser(sTemp,1,[#32]),
  182. Copy(sTemp,Pos(#32,sTemp)+1,Length(sTemp)-Pos(#32,sTemp)+1));
  183. StrDispose(pTemp);
  184. TextStart:=-1;
  185. continue;
  186. end
  187. else
  188. begin
  189. StrDispose(pTemp);
  190. break;
  191. end;
  192. end;
  193. S^.Seek(StreamSize-1);
  194. SeenByEnd:=StreamSize-1;
  195. While S^.GetPos>0 do
  196. begin
  197. TextEnd:=S^.GetPos;
  198. pTemp:=objStreamReadStrBackPChar(S,100);
  199. sTemp:=strUpper(StrPas(pTemp));
  200. If (Copy(sTemp,1,4)='--- ') or (sTemp='---') then
  201. begin
  202. DisposeStr(TearLine);
  203. TearLine:=NewStr(StrPas(pTemp));
  204. StrDispose(pTemp);
  205. continue;
  206. end;
  207. If Copy(sTemp,1,10)=' * ORIGIN:' then
  208. begin
  209. DisposeStr(Origin);
  210. Origin:=NewStr(StrPas(pTemp));
  211. StrDispose(pTemp);
  212. continue;
  213. end;
  214. If (Copy(sTemp,1,4)=#1'VIA')
  215. or (Copy(sTemp,1,5)=#1'RECD')
  216. or (Copy(sTemp,1,10)=#1'FORWARDED')
  217. then
  218. begin
  219. ViaLink:=objStreamInsertStr(ViaLink,StrPas(pTemp)+#13);
  220. StrDispose(pTemp);
  221. continue;
  222. end;
  223. If Copy(sTemp,1,6)=#1'PATH:' then
  224. begin
  225. PathLink:=objStreamInsertStr(PathLink,StrPas(pTemp)+#13);
  226. StrDispose(pTemp);
  227. SeenByEnd:=S^.GetPos+1;
  228. continue;
  229. end;
  230. If Copy(sTemp,1,8)='SEEN-BY:' then
  231. begin
  232. StrDispose(pTemp);
  233. SeenByStart:=S^.GetPos+1;
  234. continue;
  235. end;
  236. StrDispose(pTemp);
  237. break;
  238. end;
  239. If TextStart=-1 then exit;
  240. S^.Seek(TextStart);
  241. MsgBodyLink^.CopyFrom(S^,TextEnd-TextStart);
  242. objStreamWriteStr(MsgBodyLink,#13);
  243. If SeenByStart=-1 then exit;
  244. S^.Seek(SeenByStart);
  245. SeenByLink^.CopyFrom(S^,SeenByEnd-SeenByStart);
  246. end;
  247. Procedure TMessageBody.SetTearLine(const _Tearline : string);
  248. begin
  249. DisposeStr(TearLine);
  250. TearLine:=NewStr(_TearLine);
  251. end;
  252. Procedure TMessageBody.SetOrigin(const _Origin : string);
  253. begin
  254. DisposeStr(Origin);
  255. Origin:=NewStr(_Origin);
  256. end;
  257. end.