PageRenderTime 68ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/tags/Alpha_3_9_8/xp4o.pas

#
Pascal | 4396 lines | 3507 code | 231 blank | 658 comment | 475 complexity | 09a2e8714432df6bf580de431dc2cc27 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. { $Id: xp4o.pas 6395 2003-09-29 18:26:17Z mk $
  2. Copyright (C) 1991-2001 Peter Mandrella
  3. Copyright (C) 2000-2002 OpenXP team (www.openxp.de)
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. }
  16. { CrossPoint - Overlayroutinen, die von XP4 aufgerufen werden }
  17. {$I xpdefine.inc }
  18. {.$DEFINE sDebug}
  19. unit xp4o;
  20. interface
  21. uses
  22. keys, //taste
  23. classes,
  24. lister; //TLister
  25. var such_brett : string; { fuer Suche im gewaehlten Brett }
  26. FMsgReqnode : string; { F3 - Request - Nodenr. }
  27. const max_arc = 3; { maximale verschachtelte Archivdateien }
  28. suchlen = 160; { Maximallaenge der Suchbegriffe }
  29. histmax = 14; { Anzahl Eintraege in Suchbegriff-History}
  30. opthmax = 4; { Anzahl Eintraege in Optionen-History }
  31. suchmax = 20; { Anzahl AND/OR Teilstrings im Suchbegriff }
  32. var seeklen : array[0..suchmax-1] of byte;
  33. seekstart : array[0..suchmax-1] of byte;
  34. seeknot : array[0..suchmax-1] of boolean;
  35. suchand : boolean;
  36. suchanz : Integer;
  37. sst : string[suchlen];
  38. igcase : boolean;
  39. umlaut : boolean;
  40. Const
  41. historyFile = 'SEEK.TXT';
  42. libraryFile = 'SEEKLIB.TXT';
  43. optionsFile = 'OPTIONS.TXT';
  44. var Suchergebnis : boolean = false;
  45. procedure msg_info; { interpretierten Header anzeigen }
  46. procedure ShowHeader; { Original-Header anzeigen }
  47. function Suche(anztxt,suchfeld,autosuche:string):boolean;
  48. procedure betreffsuche;
  49. procedure SucheWiedervorlage;
  50. procedure BU_reorg(user,adrbuch,auto:boolean);
  51. procedure MsgReorgScan(_del,repair:boolean; var brk:boolean);
  52. procedure MsgReorg;
  53. procedure ImportBrettliste;
  54. procedure ImportUserliste;
  55. procedure ExportUB(user:boolean);
  56. procedure ModiEmpfDatum;
  57. procedure ModiBetreff;
  58. procedure ModiText;
  59. procedure ModiRot13;
  60. procedure ModiTyp;
  61. procedure ModiGelesen;
  62. procedure ModiHighlite;
  63. procedure zeige_unversandt;
  64. function ViewArchive(var fn:string; typ:shortint):shortint;
  65. procedure FileArcViewer(fn:string);
  66. procedure ShowArch(const fn:string);
  67. function a_getfilename(nr,nn:byte):string;
  68. procedure ArcSpecial(LSelf: TLister; var t:taste);
  69. procedure DupeKill(autodupekill:boolean);
  70. procedure CompleteMaintenance;
  71. procedure print_msg(initpr:boolean);
  72. function UserMarkSuche(allmode:boolean):boolean;
  73. procedure BrettInfo;
  74. procedure ntinfo;
  75. procedure do_bseek(fwd:boolean);
  76. procedure FidoMsgRequest(var nnode:string);
  77. function _killit(ask:boolean):boolean;
  78. function testbrettscope(var s:string):boolean;
  79. procedure seek_cutspace(var s:string);
  80. procedure seekmenu(var s:string);
  81. procedure OldSEEK_ed(LSelf: TLister; var t:taste); {Lister-Tastenabfrage fuer Seek-Menue}
  82. function Bool_BrettGruppe(var s:string):boolean;
  83. function Bool_Brettindex(var s:string):boolean;
  84. Procedure Brettmarksuche;
  85. implementation {-----------------------------------------------------}
  86. uses
  87. sysutils,
  88. {$IFDEF NCRT }
  89. xpcurses,
  90. {$ENDIF }
  91. {$IFDEF Kylix}
  92. xplinux,
  93. {$ENDIF}
  94. typeform,fileio,inout,
  95. maske,datadef,database,
  96. archive,maus2,winxp,printerx,resource,osdepend,
  97. xp0,xp1,xp1o,xp1o2,xp1help,xp1input,xp3,xp3o,xp3o2,xp3ex,xp4,xp4o2,xp9bp,
  98. xpkeys,xpnt,xpfido,xpmaus,xpheader, xpmakeheader,
  99. xp_pgp,debug,viewer, MarkedList, regexpr, xpconfigedit,
  100. xprope,
  101. xpspam,
  102. xpglobal;
  103. type arcbuf = record
  104. arcer_typ : shortint;
  105. arcname : string;
  106. end;
  107. var arcbufp : byte = 0;
  108. suchopt : string = '*'; { Flag fuer erste Suche seit Programmstart }
  109. history : array[0..histmax] of String[Suchlen]=
  110. ('','','','','','','','','','','','','','','');
  111. history_changed : boolean = false;
  112. var reobuf : array[0..ablagen-1] of boolean;
  113. bufsiz : array[0..ablagen-1] of longint; { Groesse nach Reorg }
  114. abuf : array[1..max_arc+1] of arcbuf;
  115. exdir : string;
  116. arctyp_save : shortint;
  117. mid_bretter : byte;
  118. Mid_teilstring : boolean;
  119. function testbrettscope(var s:string):boolean;
  120. var i : integer;
  121. begin
  122. if (length(s)=1) and (lastkey<>keybs) then begin
  123. for i:=4 downto 0 do
  124. if upcase(FirstChar(s))=UpperCase(FirstChar(getres2(442,i))) then
  125. s:=getres2(442,i);
  126. freeres;
  127. if length(s)>1 then _keyboard(keyend);
  128. end;
  129. testbrettscope:=true;
  130. end;
  131. procedure seek_cutspace(var s:string);
  132. begin
  133. if s=' ' then s:='';
  134. end;
  135. function mid_suchoption(var s:string):boolean;
  136. begin
  137. if aktdispmode <> 11 then setfieldenable(mid_bretter,s='J');
  138. mid_suchoption:=true;
  139. end;
  140. procedure OldSEEK_ed(LSelf: TLister; var t:taste); {Lister-Tastenabfrage fuer Seek-Menue}
  141. begin
  142. if (UpperCase(t)='E') then begin
  143. EditFile(libraryFile,false,false,false,0,false);
  144. t:=keyesc;
  145. pushkey(keysf2);
  146. end;
  147. end;
  148. procedure seekmenu(var s:string);
  149. const height = 10;
  150. width = 70;
  151. var t : text;
  152. brk : boolean;
  153. x,y : Integer;
  154. List: TLister;
  155. begin
  156. assign(t,libraryFile);
  157. reset(t);
  158. s:='';
  159. if ioresult<>0 then exit;
  160. selbox(width+2,height+2,getres2(441,21),x,y,true);
  161. List := TLister.CreateWithOptions(x+1,x+width,y+1,y+height,0,'/NS/SB/DM/S/M/');
  162. ListboxCol(List);
  163. List.SetArrows(x+width+1,y+1,y+height,col.colselrahmen,col.colselrahmen,'ł');
  164. while not eof(t) do
  165. begin
  166. readln(t,s);
  167. List.AddLine(LeftStr(s,suchlen));
  168. end;
  169. List.OnKeyPressed := oldseek_ed;
  170. brk := List.Show;
  171. if List.SelCount =0 then
  172. begin
  173. s := List.GetSelection;
  174. if FirstChar(s)=' ' then brk:=true;
  175. end
  176. else if not brk then begin
  177. s:= List.FirstMarked;
  178. x:=0;
  179. repeat
  180. if (s<>#0) and (s<>'') and (s[1]<>' ')
  181. then inc(x);
  182. s:= List.NextMarked;
  183. until (s=#0) or (x=histmax);
  184. for y:=histmax downto x do history[y]:=history[y-x];
  185. s:= List.FirstMarked;
  186. y:=0;
  187. repeat
  188. if (s<>#0) and (s<>'') and (s[1]<>' ')
  189. then begin
  190. history[y]:=s;
  191. inc(y);
  192. end;
  193. s:= List.NextMarked;
  194. until (y>x) or (s=#0);
  195. s:=history[0];
  196. history_changed:=true;
  197. pushkey(keyctcr);
  198. end;
  199. List.Free;
  200. closebox;
  201. close(t);
  202. if brk then s:='';
  203. end;
  204. { Suchfeld: '' (Volltext), '*' (Umiversal), 'Betreff', 'Absender', 'MsgID' }
  205. type suchrec = record
  206. betr,user,txt : string;
  207. fidoempf,mid : string;
  208. nbetr,nuser : Boolean;
  209. nfidoempf : Boolean;
  210. or_betr : Boolean;
  211. or_user : Boolean;
  212. or_fidoempf : Boolean;
  213. vondat,bisdat : string;
  214. vonkb,biskb : longint;
  215. status : string;
  216. typ : string;
  217. end;
  218. var srec : ^suchrec = nil;
  219. opthist : array[0..opthmax] of String[8]=('','','','','');
  220. history0 : string='';
  221. history1 : string='';
  222. history2 : string='';
  223. function Suche(anztxt,suchfeld,autosuche:string):boolean;
  224. var x,y : Integer;
  225. brk : boolean;
  226. n,nf : longint;
  227. p : pointer;
  228. psize : Integer;
  229. spez : boolean;
  230. sst : string; { evtl. UpString von suchstring }
  231. i : integer;
  232. brett : string;
  233. me,uu : boolean;
  234. hdp : Theader;
  235. hds : longint;
  236. bretter : string;
  237. t : text;
  238. suchstring : string;
  239. typc : char;
  240. statb : byte;
  241. _vondat,_bisdat : longint;
  242. minsize,maxsize : longint;
  243. regex : boolean; // regexpressions zulassen?
  244. bereich : shortint;
  245. _brett : string;
  246. mi,add : byte;
  247. bera : array[0..4] of string;
  248. stata : array[0..5] of string;
  249. typa : array[0..4] of string;
  250. RegExpr: TRegExpr;
  251. seek : string;
  252. found : boolean;
  253. markedback : TMarkedList;
  254. markanzback : integer;
  255. check4date : boolean;
  256. headersuche : byte;
  257. andmask,ormask : byte;
  258. holdmarked : boolean;
  259. label ende, restart;
  260. { Check_Seekmode:
  261. Wenn bei Normalsuche die Suchoptionen "ua&" fuer UND oder "o|" fuer ODER angegeben wurden,
  262. werden in den Arrays die Anfangs und End Offsets von bis zu 10 Teilsuchstrings gespeichert,
  263. und Suchanz auf die Anzahl der (durch Leerzeichen getrennten, bzw in Anfuehrungszeichen
  264. eingefassten) Teilsuchstrings gesetzt. Suchand ist "true" bei UND Verknuepfung und "false"
  265. bei ODER Verknuepfung. Wurden keine Verknuepfungsoptionen angegeben, wird eine OR
  266. Verknuepfung durchgefuehrt, mit einem einzigen "Teilsuchstring", der die Ganze Laenge
  267. des Suchstring abdeckt
  268. }
  269. procedure check_seekmode;
  270. var
  271. m,n,i : Integer;
  272. quotes : boolean;
  273. {$IFDEF sDebug} { Zum Debuggen der Suchstringerkennung}
  274. Procedure Show_Seekstrings;
  275. var n,x,y: byte;
  276. const width=75; height=20;
  277. begin
  278. selbox(width+2,height+2,'Suchstring-Check',x,y,true);
  279. openlist(x+1,x+width,y+1,y+height,0,'/NS/CR/');
  280. ListboxCol;
  281. listarrows(width+3,y+1,y+height,col.colselrahmen,col.colselrahmen,'ł');
  282. app_L('');
  283. app_L(' Benutzte Teilstrings: '+StrS(suchanz)+iifs(suchand,' AND',' OR')+
  284. ' Igcase='+iifs(igcase,'1','0')+' Umlaut='+iifs(umlaut,'1','0')+
  285. iifs(spez,' SPEZIAL',''));
  286. app_L('');
  287. app_l(' Suchstring: '+chr($af)+iifs(spez,srec^.txt,suchstring)+chr($ae));
  288. app_l(' sst: '+chr($af)+sst+chr($ae));
  289. app_l('');
  290. for n:=0 to iif(suchanz<10,10,suchanz-1) do
  291. begin
  292. app_l(' String'+rforms(strs(n),2)+': '+rforms(strs(seekstart[n]),3)+','+
  293. rforms(strs(seeklen[n]),3)+
  294. iifs(seeknot[n],' NOT ',' ')+chr($af)+
  295. left(mid(sst,seekstart[n]),seeklen[n])+chr($ae));
  296. end;
  297. app_l('');
  298. app_l(' Length(sst)='+strs(length(sst))+' i='+(strs(i)));
  299. if spez then with srec^do
  300. begin
  301. app_l('');
  302. app_l(dup(30,'-'));
  303. app_l(' AND-Maske: '+bin(andmask,3)+' OR-Maske: '+bin(ormask,3));
  304. app_l('');
  305. app_l(' User: '+iifs(or_user,' OR',' ')
  306. +iifs(nuser,' NOT ',' ')+chr($af)+user+chr($ae));
  307. app_l(' Betr: '+iifs(or_betr,' OR',' ')
  308. +iifs(nbetr,' NOT ',' ')+chr($af)+betr+chr($ae));
  309. app_l(' Fidoempf: '+iifs(or_fidoempf,' OR',' ')
  310. +iifs(nfidoempf,' NOT ',' ')+chr($af)+fidoempf+chr($ae));
  311. end;
  312. list(brk);
  313. closelist;
  314. closebox;
  315. end;
  316. {$ENDIF}
  317. begin
  318. {$IFDEF sDebug}
  319. for n:=0 to suchmax-1 do
  320. begin
  321. seekstart[n]:=0;
  322. seeklen[n]:=0;
  323. seeknot[n]:=false;
  324. end;
  325. {$ENDIF}
  326. suchand:=cpos('o', LowerCase(suchopt))=0; { OR }
  327. if not suchand or (cpos('a', LowerCase(suchopt))>0) { oder AND ?}
  328. and not (trim(sst)='') then { und nicht Leertext (Suche-Spezial) }
  329. begin
  330. n:=0;
  331. seek:=trim(sst); { Leerzeichen vorne und hinten, }
  332. i:=length(seek);
  333. while (i <> 0) and (seek[i]='"') do dec(i); { Und Ausrufezeichen hinten abschneiden }
  334. truncstr(seek,i);
  335. if seek<>'' then begin
  336. i:=1;
  337. sst:=seek+'"'; quotes:=false;
  338. while (i<length(sst)) and (n<suchmax) do
  339. begin
  340. while sst[i]=' ' do inc(i); { Leerzeichen ueberspringen }
  341. if not quotes then
  342. begin
  343. seeknot[n]:=sst[i]='~'; { NOT Flag setzen }
  344. while ((sst[i]='~') or (sst[i]=' '))
  345. do inc(i); { und evtl weitere ^ ueberspringen }
  346. end;
  347. quotes:=sst[i]='"'; { Evtl. "- Modus aktivieren....}
  348. while sst[i]='"' do inc(i); { weitere " ueberspringen }
  349. seekstart[n]:=i;
  350. while (i<length(sst)) and not { Weiterzaehlen bis Stringende }
  351. ((not quotes and (sst[i]=' ')) or { oder Space das nicht in " ist }
  352. (sst[i]='"')) do inc(i); { oder das naechste " gefunden wird }
  353. seeklen[n]:=i-seekstart[n];
  354. quotes:=not quotes and (sst[i]='"'); { -"- Modus umschalten }
  355. if (not quotes) then inc(i);
  356. inc(n);
  357. end;
  358. if seeklen[n-1]=0 then dec(n); { Falls String mit > "< Endete... }
  359. suchanz:=n;
  360. end;
  361. if suchanz=1 then suchand:=true;
  362. m:=0;
  363. for n:=0 to suchanz-1 do { Teilstrings Umsortieren: NOT zuerst }
  364. begin
  365. if (seeknot[n]=true) and (seeklen[n]<>0) then
  366. begin
  367. i:=seekstart[m]; seekstart[m]:=seekstart[n]; seekstart[n]:=i;
  368. i:=seeklen[m]; seeklen[m]:=seeklen[n]; seeklen[n]:=i;
  369. quotes:=seeknot[m]; seeknot[m]:=seeknot[n]; seeknot[n]:=quotes;
  370. inc(m);
  371. end;
  372. end;
  373. end
  374. else begin
  375. suchand:=true;
  376. suchanz:=1;
  377. seekstart[0]:=1;
  378. seeklen[0]:=length(sst);
  379. seeknot[0]:=false;
  380. end;
  381. {$IFDEF sDebug}
  382. if cpos('c',lstr(suchopt))>0 then show_seekstrings; { "Writeln ist der beste Debugger..." }
  383. {$ENDIF}
  384. end;
  385. function InText(const key:string):boolean;
  386. var size : longint;
  387. ofs : longint;
  388. wsize: Integer;
  389. s: String;
  390. begin
  391. dbReadN(mbase,mb_msgsize,size);
  392. if size=0 then begin { leerer Datensatz - vermutlich durch RuntimeError }
  393. dbDelete(mbase);
  394. InText:=false;
  395. end
  396. else begin
  397. wsize:=min(size,psize);
  398. ofs:=dbReadIntN(mbase, mb_msgsize)-dbReadIntN(mbase,mb_groesse);
  399. if headersuche=1 then begin { nur Header durchsuchen }
  400. wsize:=ofs;
  401. ofs:=0;
  402. end
  403. else if headersuche=2 then ofs:=0; { Header und Text durchsuchen }
  404. if (ofs>=0) and (ofs<wsize+1+length(key)) then
  405. begin
  406. dec(wsize,ofs);
  407. XmemRead(ofs,wsize,p^);
  408. if RegEx then
  409. begin
  410. RegExpr.Expression := key;
  411. SetString(s, PChar(p), WSize);
  412. InText := RegExpr.Exec(s);
  413. end else
  414. begin
  415. TxtSeekKey := Key;
  416. Intext:=TxtSeek(p,wsize,igcase,umlaut);
  417. end;
  418. end else
  419. Intext:=false;
  420. end;
  421. end;
  422. function DateFit:boolean;
  423. var d : longint;
  424. begin
  425. dbReadN(mbase,mb_origdatum,d);
  426. DateFit:=not smdl(d,_vondat) and not smdl(_bisdat,d);
  427. end;
  428. function Sizefit:boolean;
  429. var s : longint;
  430. begin
  431. dbReadN(mbase,mb_groesse,s);
  432. sizefit:=(s>=minsize) and (s<=maxsize);
  433. end;
  434. function TypeFit:boolean;
  435. var t : char;
  436. nt : longint;
  437. flags : longint;
  438. begin
  439. if typc=' ' then typefit:=true
  440. else begin
  441. dbReadN(mbase,mb_typ,t);
  442. dbReadN(mbase,mb_netztyp,nt);
  443. dbReadN(mbase,mb_flags,flags);
  444. TypeFit:=((typc='F') and (nt and $200<>0)) or
  445. ((typc='M') and (flags and 4<>0)) or
  446. (t=typc);
  447. end;
  448. end;
  449. function StatOk:boolean;
  450. var flags : byte;
  451. begin
  452. dbReadN(mbase,mb_halteflags,flags);
  453. case statb of
  454. 1,2 : StatOK:=(statb=flags);
  455. 3 : StatOK:=(flags=1) or (flags=2);
  456. 4 : StatOK:=(dbReadInt(mbase,'gelesen')=0);
  457. 5 : StatOK:=(dbReadInt(mbase,'gelesen')<>0);
  458. else
  459. {0 : }StatOk:=true;
  460. end;
  461. end;
  462. { Leerzeichen Links und rechts loschen, Tilden links ebenfalls }
  463. { boolean setzen, wenn Tilde gefunden wurde }
  464. procedure Scantilde(var s:String; var suchnot:boolean);
  465. begin
  466. trim(s);
  467. if s='' then
  468. suchnot:=false
  469. else
  470. begin
  471. suchnot:=s[1]='~';
  472. i:=1;
  473. while ((s[i]='~') or (s[i]=' ')) do inc(i);
  474. s:=mid(s,i);
  475. end;
  476. end;
  477. {--Einzelne Nachricht mit Sucheingaben vergleichen--}
  478. procedure TestMsg;
  479. var betr2 : string;
  480. user2 : string;
  481. realn : string;
  482. such : string;
  483. j : byte;
  484. d : Longint;
  485. b : byte;
  486. found_not : boolean;
  487. foundmask : byte;
  488. label msg_ok;
  489. { Volltextcheck:
  490. Seekstart und Seeklen sind Zeiger auf Anfang und Ende der Teilsuchstrings
  491. innerhalb des Gesamtsuchstrings SST. Suchand ist "true" bei UND-Suche,
  492. und "false" bei ODER-Suche Der Textinhalt wird mit den Teilsuchstrings verglichen,
  493. solange Suchand=1 (UND) und Found=0, bzw bis Suchand=0 (OR) und Found=1,
  494. wurde ein Teilsuchstring gefunden, obwol SeekNOT fuer ihn definiert ist,
  495. wird die Suche beendet und Found nachtraeglich auf 0 gesetzt (Suche gescheitert).
  496. NOT-Suchstrings werden dabei aus der UND-Verknuepfung ausgeklammert.
  497. }
  498. procedure Volltextcheck;
  499. begin
  500. j:=0;
  501. repeat
  502. seek:=LeftStr(mid(sst,seekstart[j]),seeklen[j]);
  503. found:=Intext(seek);
  504. found_not:=found and seeknot[j];
  505. if suchand and not found and seeknot[j] then found:=true;
  506. inc(j);
  507. until (j=suchanz) or (suchand xor found) or found_not;
  508. if found_not then found:=false;
  509. end;
  510. begin
  511. inc(n);
  512. if (n mod 30)=0 then
  513. begin
  514. moff;
  515. FWrt(x+9, WhereY, Format('%7d', [n]));
  516. FWrt(x+26, WhereY, Format('%5d', [nf]));
  517. mon;
  518. end;
  519. {--Spezialsuche--}
  520. if spez then with srec^ do
  521. begin
  522. if DateFit and SizeFit and TypeFit and StatOk then begin
  523. Betr2 := dbReadNStr(mbase,mb_betreff);
  524. if (betr<>'') and (length(betr2)=40) then begin
  525. ReadHeader(hdp,hds,false);
  526. if length(hdp.betreff)>40 then
  527. betr2:=hdp.betreff;
  528. end;
  529. user2 := dbReadNStr(mbase,mb_absender);
  530. if not ntEditBrettEmpf(mbnetztyp) then begin { <> Fido, QWK }
  531. realn:= dbReadNStr(mbase,mb_name);
  532. end
  533. else
  534. realn:=#0;
  535. if fidoempf<>'' then
  536. if not ntBrettEmpf(mbnetztyp) then
  537. hdp.fido_to:=''
  538. else begin
  539. ReadHeader(hdp,hds,false);
  540. end;
  541. if umlaut then begin { Umlaute anpassen}
  542. UkonvStr(betr2,Length(betr2));
  543. UkonvStr(user2,Length(user2));
  544. UkonvStr(realn,Length(realn));
  545. UkonvStr(hdp.fido_to,Length(hdp.fido_to));
  546. end;
  547. if igcase then begin { Ignore Case}
  548. UpString(betr2);
  549. UpString(user2);
  550. UpString(realn);
  551. UpString(hdp.fido_to);
  552. end;
  553. if andmask<>0 then begin
  554. foundmask:=0;
  555. if ((betr='') or (pos(betr,betr2)>0) xor nbetr)
  556. then inc(foundmask,2);
  557. if ((user='') or ((pos(user,user2)>0) or (pos(user,realn)>0)) xor nuser)
  558. then inc(foundmask,4);
  559. if ((fidoempf='') or (pos(fidoempf,hdp.fido_to)>0) xor nfidoempf)
  560. then inc(foundmask);
  561. if foundmask and ormask <> 0 then goto msg_ok;
  562. if (foundmask and andmask) <> (andmask and not ormask) then exit;
  563. end;
  564. if txt<>'' then begin
  565. volltextcheck;
  566. if not found then exit;
  567. end;
  568. msg_ok: MsgAddmark;
  569. inc(nf);
  570. end
  571. end
  572. else begin
  573. if check4date and (readmode >0) then
  574. begin { Suchen im akt. Lesemodus }
  575. if readmode=1 then begin
  576. dbReadN(mbase,mb_gelesen,b);
  577. if b>0 then exit;
  578. end
  579. else if aktdispmode <> 10 then begin
  580. dbReadN(mbase,mb_empfdatum,d);
  581. if smdl(d,readdate) then exit;
  582. end;
  583. end;
  584. { Headereintrag-Suche }
  585. if suchfeld<>'' then
  586. begin
  587. such := dbReadStr(mbase,suchfeld);
  588. if (suchfeld='Absender') and not ntEditBrettEmpf(mbnetztyp)
  589. then begin
  590. seek := dbReadNStr(mbase,mb_name); { Bei Usersuche auch Realname ansehen... }
  591. such:=such+seek;
  592. end;
  593. if stricmp(suchfeld,'betreff') and (length(such)=40)
  594. then begin
  595. ReadHeader(hdp,hds,false);
  596. if length(hdp.betreff)>40 then
  597. such:=hdp.betreff;
  598. end;
  599. if suchfeld='MsgID' then begin
  600. ReadHeader(hdp,hds,false);
  601. such:=hdp.msgid;
  602. end;
  603. if umlaut then UkonvStr(such,Length(such));
  604. j:=0;
  605. repeat
  606. seek:=LeftStr(mid(sst,seekstart[j]),seeklen[j]); { Erklaerung siehe Volltextcheck }
  607. found:=((igcase and (pos(seek,UpperCase(such))>0)) or
  608. (not igcase and (pos(seek,such)>0)));
  609. found_not:=found and seeknot[j];
  610. if suchand and not found and seeknot[j] then found:=true;
  611. inc(j);
  612. until (j=suchanz) or (suchand xor found) or found_not;
  613. if found_not then found:=false;
  614. if Found then Begin
  615. MsgAddmark;
  616. inc(nf);
  617. end;
  618. end
  619. else begin { Volltextsuche }
  620. volltextcheck;
  621. if found then Begin
  622. MsgAddmark;
  623. inc(nf);
  624. end;
  625. end;
  626. end;
  627. end;
  628. procedure TestBrett(const _brett:string);
  629. begin
  630. if check4date {and (aktdispmode<=10) } and (readmode>0)
  631. then if Readmode>1 then dbSeek(mbase,miBrett,_brett+dbLongStr(readdate))
  632. else dbSeek(mbase,miGelesen,_brett+#0)
  633. else dbSeek(mbase,miBrett,_brett);
  634. while not dbEof(mbase) and (dbReadStrN(mbase,mb_brett)=_brett) and not brk do
  635. begin
  636. TestMsg;
  637. dbNext(mbase);
  638. testbrk(brk);
  639. end;
  640. end;
  641. function userform(const s:string):string;
  642. var p : Integer;
  643. begin
  644. p:=cpos('@',s);
  645. if p=0 then userform:=s
  646. else userform:=trim(LeftStr(s,p-1))+'@'+trim(mid(s,p+1));
  647. end;
  648. procedure InitHistory; { Such-History beim Programmstart aus Datei laden }
  649. var i : byte;
  650. var t : text;
  651. begin
  652. assign(t,historyFile);
  653. reset(t);
  654. if ioresult<>0 then exit;
  655. for i:=0 to histmax do readln(t,history[i]);
  656. close(t);
  657. assign(t,optionsFile);
  658. reset(t);
  659. if ioresult<>0 then exit;
  660. for i:=0 to opthmax do readln(t,opthist[i]);
  661. close(t);
  662. end;
  663. procedure CheckHistory; { Such-History Aktualisieren und in Datei speichern }
  664. var i,h: byte;
  665. var t : text;
  666. begin
  667. if (suchstring='') or history_changed then exit;
  668. h:=histmax;
  669. for i:=0 to histmax do if history[i]=suchstring then h:=i;
  670. for i:=h downto 1 do history[i]:=history[i-1];
  671. history[0]:=suchstring;
  672. h:=opthmax;
  673. for i:=0 to opthmax do if opthist[i]=suchopt then h:=i;
  674. for i:=h downto 1 do opthist[i]:=opthist[i-1];
  675. opthist[0]:=suchopt;
  676. assign(t,historyFile);
  677. rewrite(t);
  678. for i:=0 to histmax do writeln(t,history[i]);
  679. close(t);
  680. assign(t,optionsFile);
  681. rewrite(t);
  682. for i:=0 to opthmax do writeln(t,opthist[i]);
  683. close(t);
  684. end;
  685. // adds new message id to boxname.mid
  686. procedure AddMsgId;
  687. var
  688. Boxname, Filename: String;
  689. IDList: TStringList;
  690. begin
  691. if ReadJN('Soll die Message-ID online gesucht werden?', true) then
  692. begin
  693. BoxName := UniSel(usBoxes, false, DefaultBox);
  694. if BoxName <> '' then
  695. begin
  696. ReadboxPar(0, Boxname);
  697. Filename := OwnPath + BoxPar.ClientPath + GetServerFilename(Boxname, extMid);
  698. IDLIst := TStringList.Create;
  699. try
  700. with IDList do
  701. begin
  702. if FileExists(Filename) then
  703. begin
  704. LoadFromFile(Filename);
  705. Sort;
  706. end;
  707. Sorted := true;
  708. Duplicates := dupIgnore;
  709. Add(Suchstring);
  710. SaveToFile(Filename);
  711. end;
  712. finally
  713. IDList.Free;
  714. end;
  715. end;
  716. end;
  717. end;
  718. {--# Suche #--}
  719. begin
  720. RegExpr := TRegExpr.Create;
  721. for i:=0 to 4 do bera[i]:=getres2(442,i);
  722. for i:=0 to 5 do stata[i]:=getres2(442,10+i);
  723. for i:=0 to 4 do typa[i]:=getres2(442,20+i);
  724. if FirstChar(suchopt)='*' then
  725. begin { Erste Suche seit Programmstart? }
  726. suchopt:='au';
  727. InitHistory;
  728. end;
  729. if srec=nil then begin
  730. new(srec);
  731. fillchar(srec^,sizeof(srec^),0);
  732. with srec^ do begin
  733. vondat:='01.01.80'; bisdat:='31.12.69';
  734. vonkb:=0; biskb:=maxlongint div 2048;
  735. typ:=typa[0]; status:=stata[0];
  736. end;
  737. end;
  738. spez:=(suchfeld='*');
  739. case aktdispmode of
  740. -1,0 : bretter:=bera[iif(bmarkanz>0,3,1)];
  741. 1..4 : bretter:=bera[iif(bmarkanz>0,3,2)];
  742. 10 : bretter:=bera[4];
  743. else bretter:=bera[0];
  744. end;
  745. i:=0;
  746. while (i<=4) and (bretter<>bera[i]) do inc(i);
  747. if i>4 then bretter:=bera[0];
  748. {-- Eingabemaske Normalsuche --}
  749. MaskShiftF2(seekmenu,534);
  750. restart:
  751. MaskSeekMenu:=iif(spez,4,1);
  752. if not spez then begin
  753. add:=0;
  754. (* if autosuche='' then begin *)
  755. dialog(51,7,getreps2(441,1,anztxt),x,y); { '%s-Suche' }
  756. if autosuche<>'' then suchstring:=autosuche
  757. else if suchfeld='Betreff' then suchstring:=srec^.betr
  758. else if suchfeld='Absender' then suchstring:=srec^.user
  759. else if suchfeld='MsgID' then suchstring:=srec^.mid { MID Suche aus Menue }
  760. else suchstring:=srec^.txt;
  761. maddstring(3,2,getres2(441,2),suchstring,32,SuchLen,range(' ',#255));
  762. mnotrim;
  763. if history[0] <> '' then { Bei Leerer Suchhistory kein Auswahlpfeil... }
  764. for i:=0 to histmax do mappsel(false,history[i]);
  765. mset3proc(seek_cutspace);
  766. mhnr(530); { 'Suchbegriff ' }
  767. maddstring(3,4,getres2(441,3),suchopt,8,8,''); { 'Optionen ' }
  768. if opthist[0] <>'' then
  769. for i:=0 to opthmax do mappsel(false,opthist[i]);
  770. maddstring(31,4,getres2(441,4),bretter,8,8,''); { 'Bretter ' }
  771. mid_bretter:=fieldpos;
  772. if (aktdispmode=11) or (suchfeld='#') then
  773. MDisable
  774. else begin
  775. for i:=0 to 4 do
  776. mappsel(true,bera[i]); { Alle / Netz / User / markiert / gew„hlt }
  777. mset1func(testbrettscope);
  778. end;
  779. if autosuche<>'' then _keyboard(keypgdn);
  780. if suchfeld='MsgID' then
  781. Begin
  782. Mid_teilstring:=false;
  783. Maddbool(3,6,getres2(442,25),Mid_teilstring);
  784. MSet1func(Mid_suchoption);
  785. if mid_suchoption(suchfeld) then;
  786. end;
  787. readmask(brk);
  788. MaskSeekMenu:=0;
  789. closemask;
  790. CheckHistory;
  791. if suchfeld='Betreff' then begin
  792. i:=ReCount(suchstring); // Re's wegschneiden
  793. srec^.betr:=suchstring
  794. end
  795. else if suchfeld='Absender' then begin
  796. suchstring:=userform(suchstring);
  797. srec^.user:=suchstring;
  798. end
  799. else if suchfeld='MsgID' then srec^.mid:=suchstring {JG: 22.01.00}
  800. else srec^.txt:=suchstring;
  801. if suchstring='' then goto ende;
  802. dec(x); inc(y);
  803. end
  804. {--Eingabemaske Spezialsuche--}
  805. else with srec^ do begin
  806. { Spezial: NOT-Flags wieder an Suchstrings setzen }
  807. if nbetr and (betr[1]<>'~') then betr:='~'+betr;
  808. if nuser and (user[1]<>'~') then user:='~'+user;
  809. if nfidoempf and (fidoempf[1]<>'~') then fidoempf:='~'+fidoempf;
  810. add:=iif(ntBrettEmpfUsed,1,0);
  811. dialog(53,12+add,getreps2(441,1,anztxt),x,y);
  812. i:=4;
  813. while (i>0) and (UpperCase(typ)<>UpperCase(typa[i])) do dec(i);
  814. typ:=typa[i];
  815. i:=5;
  816. while (i>0) and (UpperCase(status)<>UpperCase(stata[i])) do dec(i);
  817. status:=stata[i];
  818. maddstring(3,2,getres2(441,6),user,30,SuchLen,''); mhnr(630); { 'Absender ' }
  819. maddstring(3,3,getres2(441,7),betr,30,SuchLen,''); { 'Betreff ' }
  820. mnotrim;
  821. mset3proc(seek_cutspace);
  822. if ntBrettEmpfUsed then
  823. maddstring(3,4,getres2(441,9),fidoempf,30,SuchLen,''); { 'Fido-Empf.' }
  824. maddstring(3,4+add,getres2(441,8),txt,35,SuchLen,''); { 'Text ' }
  825. if history[0] <> '' then { Bei leerer Suchhistory kein Auswahlpfeil... }
  826. for i:=0 to histmax do mappsel(false,history[i]);
  827. mnotrim;
  828. mset3proc(seek_cutspace);
  829. maddtext(48,1,'OR',0);
  830. maddbool(46,2,'',or_user);mhnr(640);
  831. maddbool(46,3,'',or_betr);
  832. if ntBrettEmpfUsed then maddbool(46,4,'',or_fidoempf);
  833. madddate(3,6+add,getres2(441,10),vondat,false,false); mhnr(634); { 'von Datum ' }
  834. madddate(3,7+add,getres2(441,11),bisdat,false,false); mhnr(634); { 'bis Datum ' }
  835. maddint(30,6+add,getres2(441,19),vonkb,6,5,0,99999); mhnr(635); { 'von ' }
  836. maddtext(45,6+add,getres(14),0); { 'KBytes' }
  837. biskb:=min(biskb,99999);
  838. maddint(30,7+add,getres2(441,20),biskb,6,5,0,99999); mhnr(635); { 'bis ' }
  839. maddtext(45,7+add,getres(14),0); { 'KBytes' }
  840. maddstring(3,9+add,getres2(441,12),typ,8,9,''); { 'Typ ' }
  841. for i:=0 to 4 do
  842. mappsel(true,typa[i]);
  843. maddstring(3,10+add,getres2(441,13),status,8,8,''); { 'Status ' }
  844. for i:=0 to 5 do
  845. mappsel(true,stata[i]);
  846. maddstring(30,9+add,getres2(441,14),bretter,8,8,''); { 'Bretter ' }
  847. if aktdispmode=11 then
  848. MDisable
  849. else begin
  850. for i:=0 to 4 do
  851. mappsel(true,bera[i]);
  852. mset1func(testbrettscope);
  853. end;
  854. maddstring(30,10+add,getres2(441,15),suchopt,8,8,''); { 'Optionen ' }
  855. if opthist[0] <>'' then
  856. for i:=0 to opthmax do mappsel(false,opthist[i]);
  857. readmask(brk);
  858. MaskSeekMenu:=0;
  859. closemask;
  860. dec(x);
  861. suchstring:=txt;
  862. CheckHistory;
  863. end;
  864. {--Eingaben auswerten--}
  865. if not brk then with srec^ do begin
  866. if spez then begin
  867. andmask:=0; ormask:=0;
  868. if user='' then or_user:=false else andmask:=4;
  869. if betr='' then or_betr:=false else inc(andmask,2);
  870. if fidoempf='' then or_fidoempf:=false else inc(andmask);
  871. if or_user then ormask:=4;
  872. if or_betr then inc(ormask,2);
  873. if or_fidoempf then inc(ormask);
  874. if txt='' then
  875. asm
  876. mov al,ormask { verhindern, dass alle Suchbegriffe auf OR stehen }
  877. or al,al
  878. je @2
  879. cmp al,andmask
  880. jne @2
  881. mov cl,0
  882. @1: inc cx
  883. shr al,1
  884. jnc @1
  885. shl al,cl
  886. mov ormask,al
  887. @2:
  888. end;
  889. end;
  890. sst:=suchstring;
  891. igcase:=multipos('iu', LowerCase(suchopt));
  892. umlaut:=multipos('„”u', LowerCase(suchopt)); { Umlautschalter}
  893. regex := pos('r', LowerCase(suchopt)) > 0 ;
  894. if umlaut and not igcase then
  895. begin
  896. suchopt:=suchopt+'i';
  897. igcase:=true;
  898. end;
  899. check4date:=cpos('l', LowerCase(suchopt))>0; { Suchen ab aktuellem Lesedatum }
  900. HoldMarked:=cpos('m', LowerCase(suchopt))>0; { Alte Markierungen beibehalten }
  901. i:=cpos('s', LowerCase(suchopt)); { Such-History loeschen }
  902. if i>0 then
  903. begin
  904. delete(suchopt,i,1);
  905. for i:=1 to histmax do history[i]:='';
  906. CheckHistory;
  907. closebox;
  908. goto restart;
  909. end;
  910. i:=cpos('k', LowerCase(suchopt)); { Such-History loeschen }
  911. if i>0 then
  912. begin
  913. delete(suchopt,i,1);
  914. assign(t,libraryFile);
  915. append(t);
  916. if ioresult<>0 then rewrite(t);
  917. if trim(suchstring)<>'' then writeln(t,suchstring);
  918. close(t);
  919. closebox;
  920. goto restart;
  921. end;
  922. headersuche:=0; { Volltextsuche }
  923. if cpos('h', LowerCase(Suchopt))>0 then headersuche:=1; { Headersuche }
  924. if cpos('g', LowerCase(suchopt))>0 then headersuche:=2; { Volltext+Headersuche }
  925. bereich:=0;
  926. for i:=1 to 4 do
  927. if UpperCase(bretter)=UpperCase(bera[i]) then bereich:=i;
  928. statb:=0;
  929. for i:=1 to 5 do
  930. if UpperCase(status)=UpperCase(stata[i]) then statb:=i;
  931. me:=true;
  932. attrtxt(col.coldialog);
  933. if spez then with srec^ do begin
  934. sst:=txt;
  935. user:=userform(user);
  936. if umlaut then begin { Umlaute konvertieren }
  937. UkonvStr(betr, Length(betr)); UkonvStr(user, Length(user));
  938. { UkonvStr(txt,high(txt));} UkonvStr(fidoempf,Length(fidoempf));
  939. end;
  940. if igcase then begin
  941. UpString(betr); UpString(user); {UpString(txt);} UpString(fidoempf);
  942. end;
  943. scantilde(betr,nbetr); scantilde(user,nuser);
  944. scantilde(fidoempf,nfidoempf);
  945. if UpperCase(typ)=UpperCase(typa[1]) then typc:='T'
  946. else if UpperCase(typ)=UpperCase(typa[2]) then typc:='B'
  947. else if UpperCase(typ)=UpperCase(typa[3]) then typc:='F'
  948. else if UpperCase(typ)=UpperCase(typa[4]) then typc:='M'
  949. else typc:=' ';
  950. _vondat:=ixdat(copy(vondat,7,2)+copy(vondat,4,2)+copy(vondat,1,2)+'0000');
  951. _bisdat:=ixdat(copy(bisdat,7,2)+copy(bisdat,4,2)+copy(bisdat,1,2)+'2359');
  952. if biskb=99999 then biskb:=maxlongint div 2048;
  953. minsize:=vonkb*1024;
  954. maxsize:=biskb*1024+1023;
  955. end;
  956. { else begin}
  957. if umlaut then UkonvStr(sst, Length(sst)); { 15.02.00}
  958. if igcase then UpString(sst);
  959. { end;}
  960. {--Start der Suche--}
  961. markanzback:= Marked.Count;
  962. if suchfeld='#' then begin {Lister-Dummysuche}
  963. check_seekmode;
  964. CloseBox;
  965. suche:=false;
  966. exit;
  967. end;
  968. if (suchfeld='MsgID') and NOT MID_teilstring then begin {-- Suche: Message-ID --}
  969. if not brk then begin
  970. if not holdmarked then Marked.Clear;
  971. check_seekmode;
  972. for i:=0 to suchanz-1 do
  973. begin
  974. seek:=copy(suchstring,seekstart[i],seeklen[i]);
  975. n:=GetBezug(seek);
  976. if n<>0 then begin
  977. dbGo(mbase,n);
  978. MsgAddmark;
  979. end;
  980. end;
  981. end;
  982. end
  983. { Anzeige fuer alle anderen Suchvarianten }
  984. else begin
  985. {if spez then sst:=txt; } { Bei Spezialsuche nur im Volltext... }
  986. if brk then goto ende;
  987. if history_changed then begin
  988. history_changed:=false;
  989. closebox;
  990. goto restart;
  991. end;
  992. check_seekmode; { Vorbereiten fuer verknuepfte Suche}
  993. if brk then begin
  994. closebox;
  995. goto restart;
  996. end;
  997. mwrt(x+3,y+iif(spez,11+add,4),getres2(441,16)); { 'Suche: passend:' }
  998. if (aktdispmode<>11) and not holdmarked then Marked.Clear;
  999. n:=0; nf:=0;
  1000. hdp := THeader.Create;
  1001. attrtxt(col.coldiahigh);
  1002. psize:=65536;
  1003. getmem(p,psize);
  1004. brk:=false;
  1005. if aktdispmode=11 then
  1006. begin {-- Suche markiert (Weiter suchen) --}
  1007. MarkedBack := TMarkedList.Create;
  1008. MarkedBack.Assign(Marked);
  1009. markanzback:= Marked.Count;
  1010. i:=0;
  1011. while i< Marked.Count do begin
  1012. dbGo(mbase,marked[i].recno);
  1013. msgunmark;
  1014. TestMsg;
  1015. if MsgMarked then inc(i);
  1016. end;
  1017. aufbau:=true;
  1018. if (Marked.Count = 0) and (markanzback<>0) then
  1019. begin
  1020. hinweis(getres2(441,18)); { 'keine passenden Nachrichten gefunden' }
  1021. Marked.Assign(MarkedBack);
  1022. end;
  1023. MarkedBack.Free;
  1024. end
  1025. else if bereich<3 then begin {-- Suche: Alle/Netz/User --}
  1026. mi:=dbGetIndex(mbase);
  1027. dbSetIndex(mbase,0);
  1028. dbGoTop(mbase);
  1029. brk:=false; i := 0;
  1030. while not dbEOF(mbase) and not brk do begin
  1031. _brett := dbReadNStr(mbase,mb_brett);
  1032. if (bereich=0) or ((bereich=1) and (FirstChar(_brett)='A')) or
  1033. ((bereich=2) and (FirstChar(_brett)='U')) then
  1034. TestMsg;
  1035. if not dbEOF(mbase) then { kann passieren, wenn fehlerhafter }
  1036. dbNext(mbase); { Satz geloescht wurde }
  1037. Inc(i);
  1038. if i mod 50 = 0 then testbrk(brk);
  1039. end;
  1040. dbSetIndex(mbase,mi);
  1041. end
  1042. else begin {-- Suche: aktuelles Brett --}
  1043. mi:=dbGetIndex(mbase);
  1044. dbSetIndex(mbase,miBrett);
  1045. if bereich=3 then begin { bzw. markierte Bretter }
  1046. if aktdispmode<11 then begin
  1047. i:=0;
  1048. uu:=((aktdispmode>0) and (aktdispmode<10));
  1049. while (i<bmarkanz) and not brk do begin
  1050. if uu then begin
  1051. dbGo(ubase,bmarked^[i]);
  1052. TestBrett(mbrettd('U',ubase));
  1053. end
  1054. else begin
  1055. dbGo(bbase,bmarked^[i]);
  1056. brett := dbReadNStr(bbase,bb_brettname);
  1057. TestBrett(mbrettd(FirstChar(brett),bbase));
  1058. end;
  1059. inc(i);
  1060. end;
  1061. end;
  1062. end
  1063. else
  1064. case aktdispmode of
  1065. -1..0 : begin
  1066. brett := dbReadNStr(bbase,bb_brettname);
  1067. TestBrett(mbrettd(FirstChar(brett),bbase));
  1068. end;
  1069. 1..4 : TestBrett(mbrettd('U',ubase));
  1070. 10 : TestBrett(such_brett);
  1071. else begin
  1072. hinweis(getres2(441,17)); { 'kein Brett gew„hlt' }
  1073. me:=false;
  1074. end;
  1075. end;
  1076. dbSetIndex(mbase,mi);
  1077. end;
  1078. freemem(p,psize);
  1079. CloseBox;
  1080. hdp.Free;
  1081. end;
  1082. {--Suche beendet--}
  1083. if (Marked.Count =0) or (holdmarked and (Marked.Count=markanzback)) { Nichts gefunden }
  1084. then
  1085. begin
  1086. if me then
  1087. begin
  1088. if Suchfeld = 'MsgID' then
  1089. AddMsgId
  1090. else
  1091. hinweis(getres2(441,18)); { 'keine passenden Nachrichten gefunden' }
  1092. aufbau:=true; { wg. gelöschter Markierung! }
  1093. end;
  1094. goto ende; { Fenster wiedeherstellen...}
  1095. end
  1096. else begin
  1097. Suchergebnis:=true;
  1098. suche:=true; { Suche erfolgreich }
  1099. signal;
  1100. CloseBox;
  1101. end;
  1102. end { of NOT Brk }
  1103. else begin { brk }
  1104. ende: { Suche gescheitert/abgebrochen }
  1105. suche:=false;
  1106. CloseBox;
  1107. end;
  1108. freeres;
  1109. end;
  1110. { R+}
  1111. { Betreff-Direktsuche }
  1112. procedure betreffsuche;
  1113. var betr,betr2 : string;
  1114. brett,_Brett : string;
  1115. begin
  1116. moment;
  1117. betr := dbReadNStr(mbase,mb_betreff);
  1118. ReCount(betr); { schneidet Re's weg }
  1119. betr:=trim(betr);
  1120. UkonvStr(betr, Length(betr));
  1121. brett := dbReadNStr(mbase,mb_brett);
  1122. dbSetIndex(mbase,miBrett);
  1123. dbSeek(mbase,miBrett,brett);
  1124. Marked.Clear;
  1125. repeat
  1126. betr2 := dbReadNStr(mbase,mb_betreff);
  1127. ReCount(betr2);
  1128. betr2:=trim(betr2);
  1129. UkonvStr(betr2, Length(betr2));
  1130. (* ll:=min(length(betr),length(betr2));
  1131. if (ll>0) and (UpperCase(left(betr,ll))=UpperCase(left(betr2,ll))) then *)
  1132. if UpperCase(betr)=UpperCase(betr2) then
  1133. MsgAddmark;
  1134. dbSkip(mbase,1);
  1135. if not dbEOF(mbase) then
  1136. _brett := dbReadNStr(mbase,mb_brett);
  1137. until dbEOF(mbase) or (_brett<>brett);
  1138. closebox;
  1139. signal;
  1140. if Marked.Count >0 then select(11);
  1141. aufbau:=true;
  1142. end;
  1143. //Nachricht/Suchen/Wiedervorlage
  1144. procedure SucheWiedervorlage;
  1145. var x,y,xx : Integer;
  1146. brk : boolean;
  1147. _brett : string;
  1148. mbrett : string;
  1149. dat : string;
  1150. n,nn : longint;
  1151. bi : shortint;
  1152. procedure testbase(xbase:pointer);
  1153. begin
  1154. bi:=dbGetIndex(xbase);
  1155. if xbase=bbase then begin
  1156. dbSetIndex(xbase,bibrett);
  1157. dbGoTop(xbase);
  1158. end
  1159. else begin
  1160. dbsetindex(xbase,uiadrbuch);
  1161. dbseek(xbase,uiadrbuch,#1);
  1162. end;
  1163. dat:=dbLongStr(ixDat('2712310000'));
  1164. brk:=false;
  1165. dbSetIndex(mbase,miBrett);
  1166. while not dbEOF(xbase) and not brk do
  1167. begin
  1168. inc(n);
  1169. attrtxt(col.colmboxhigh);
  1170. FWrt(xx, y+2, Format('%3d', [n*100 div nn]));
  1171. if (xbase=ubase) or (not smdl(dbReadInt(xbase,'ldatum'),ixDat('2712310000')))
  1172. then begin
  1173. if xbase=ubase then _brett:='U' else
  1174. _brett:=copy(dbReadStr(xbase,'brettname'),1,1);
  1175. _brett:=_brett+dbLongStr(dbReadInt(xbase,'int_nr'));
  1176. dbSeek(mbase,miBrett,_brett+dat);
  1177. mbrett:=_brett;
  1178. while not dbEOF(mbase) and (mbrett=_brett) do begin
  1179. mbrett := dbReadNStr(mbase,mb_brett);
  1180. if mbrett=_brett then MsgAddmark;
  1181. dbSkip(mbase,1);
  1182. end;
  1183. end;
  1184. dbSkip(xbase,1);
  1185. testbrk(brk);
  1186. end;
  1187. dbSetIndex(xbase,bi);
  1188. end;
  1189. begin
  1190. Marked.Clear;
  1191. msgbox(33,5,'',x,y);
  1192. wrt(x+3,y+2,getres(443)); { 'Einen Moment bitte... %' }
  1193. xx:=wherex-5;
  1194. n:=0;
  1195. nn:=dbRecCount(bbase)+dbreccount(ubase);
  1196. testbase(ubase);
  1197. if not brk then
  1198. testbase(bbase);
  1199. CloseBox;
  1200. if not brk then
  1201. if Marked.Count=0 then
  1202. hinweis(getres(444)) { 'keine Wiedervorlage-Nachrichten gefunden' }
  1203. else begin
  1204. signal;
  1205. select(11);
  1206. end;
  1207. end;
  1208. {.$I xp4o.inc} { Reorg }
  1209. { XP4O - Reorganisation }
  1210. procedure BU_reorg(user,adrbuch,auto:boolean);
  1211. var x,y,xx : Integer;
  1212. brk,ask : boolean;
  1213. typ : string;
  1214. d : DB;
  1215. brett : string[BrettLen];
  1216. brettc : char;
  1217. _brett : string;
  1218. _mbrett : string;
  1219. nfeld : integer;
  1220. loesch : string;
  1221. n,gel : longint;
  1222. leer : boolean;
  1223. next : longint;
  1224. null : byte;
  1225. procedure wrstat;
  1226. begin
  1227. attrtxt(col.coldiahigh);
  1228. moff;
  1229. Wrt(xx,y+1, Format('%5d', [n]));
  1230. Wrt(xx,y+2, Format('%5d', [gel]));
  1231. mon;
  1232. end;
  1233. const
  1234. _user12: array[boolean] of integer = (2,1);
  1235. _user34: array[boolean] of integer = (4,3);
  1236. begin
  1237. typ:=getres2(445,iif(user,1,2)); { 'User' / 'Bretter' }
  1238. if auto then
  1239. brk := false
  1240. else
  1241. if not adrbuch then
  1242. { 'Beim Loeschen von '+typ+'n nachfragen' }
  1243. n := _user34[user] //ask:=ReadJNesc(getres2(445,iif(user,3,4)),true,brk)
  1244. else
  1245. n := 5; { 'Beim Austragen von Usern nachfragen' }
  1246. ask:=ReadJNesc(getres2(445,n),not adrbuch,brk);
  1247. if not brk then begin
  1248. if user then begin
  1249. d:=ubase; nfeld:=ub_username; end
  1250. else begin
  1251. d:=bbase; nfeld:=bb_brettname; end;
  1252. n:=0; gel:=0;
  1253. msgbox(25,4,'',x,y);
  1254. if not adrbuch then begin
  1255. mwrt(x+3,y+1,forms(typ,8)+':');
  1256. mwrt(x+3,y+2,getres2(445,6)); { 'geloescht:' }
  1257. xx:=x+13;
  1258. end
  1259. else begin
  1260. mwrt(x+3,y+1,getres2(445,7)); { 'User ..... :' }
  1261. mwrt(x+3,y+2,getres2(445,8)); { 'ausgetragen:' }
  1262. xx:=x+16;
  1263. end;
  1264. if adrbuch then begin
  1265. dbSetindex(d,uiAdrbuch);
  1266. dbSeek(d,uiAdrbuch,#1);
  1267. end
  1268. else begin
  1269. dbSetindex(d,1);
  1270. dbGoTop(d);
  1271. end;
  1272. brettc:='U';
  1273. null:=0;
  1274. while not (dbEOF(d) or brk) do
  1275. begin
  1276. inc(n);
  1277. if not user then
  1278. begin
  1279. brett := dbReadNStr(bbase,bb_brettname);
  1280. brettc:= FirstChar(brett);
  1281. end else
  1282. brett := dbReadNStr(ubase,ub_username);
  1283. _brett:=mbrettd(brettc,d);
  1284. dbSeek(mbase,miBrett,_brett);
  1285. leer:=dbEOF(mbase);
  1286. if not leer then begin
  1287. _Mbrett := dbReadNStr(mbase,mb_brett);
  1288. leer:=_mbrett<>_brett;
  1289. end;
  1290. if leer and ((user and (LeftStr(brett,4)<>#0+'$/T')) or
  1291. (not user and (LeftStr(brett,3)<>'$/T'))) then
  1292. begin
  1293. loesch := dbReadNStr(d,nfeld);
  1294. if not user then loesch:=copy(loesch,2,80);
  1295. if adrbuch then
  1296. if (dbReadInt(ubase,'userflags') and 4=0) and
  1297. (dbXsize(ubase,'adresse')=0) then
  1298. if not ask or (ReadJNesc(getreps2(445,9,LeftStr(loesch,55)),true,brk)and not brk)
  1299. then begin { '%s austragen' }
  1300. dbSkip(d,1);
  1301. next:=dbRecno(d);
  1302. if dbEOF(d) then dbGoEnd(d)
  1303. else dbSkip(d,-1);
  1304. dbWriteN(d,ub_adrbuch,null);
  1305. dbGo(d,next);
  1306. inc(gel);
  1307. end
  1308. else
  1309. dbNext(d)
  1310. else
  1311. dbNext(d);
  1312. if not adrbuch then
  1313. if (not user or
  1314. ((dbReadInt(d,'adrbuch')=0) and (dbReadInt(d,'userflags') and 5=1)))
  1315. and (not ask or (ReadJNesc(getreps2(445,10,LeftStr(loesch,60)),true,brk)and not brk))
  1316. then begin { '%s loeschen' }
  1317. if (user and (aktdispmode in [1..4])) or
  1318. (not user and (aktdispmode<=0)) then
  1319. UBunmark(dbRecno(d));
  1320. dbDelete(d);
  1321. inc(gel);
  1322. end
  1323. else
  1324. dbNext(d);
  1325. end { not leer }
  1326. else dbNext(d);
  1327. wrstat;
  1328. if (n mod 16=0) and not brk then
  1329. begin
  1330. testbrk(brk);
  1331. if brk and not ReadJN(getres(446),true) then { 'Reorganisation abbrechen' }
  1332. brk:=false;
  1333. end;
  1334. end;
  1335. closebox;
  1336. end;
  1337. freeres;
  1338. end;
  1339. procedure MsgReorgScan(_del,repair:boolean; var brk:boolean);
  1340. var x,y,wdt: Integer;
  1341. n,ndel,
  1342. nbesch : longint;
  1343. bt,dbt,
  1344. bbt : longint;
  1345. disp : string;
  1346. hzeit : integer16;
  1347. hzahl : boolean;
  1348. dat : TDateTime;
  1349. bi : shortint;
  1350. procedure display;
  1351. begin
  1352. attrtxt(col.colmboxhigh);
  1353. moff;
  1354. Wrt(x+wdt+3,y+4, Format('%7d', [n]));
  1355. Wrt(x+wdt+3,y+5, Format('%7d', [ndel]));
  1356. Wrt(x+wdt+3,y+6, Format('%7d', [nbesch]));
  1357. Wrt(x+wdt+12,y+4, Format('%7d', [bt div 1024]));
  1358. Wrt(x+wdt+12,y+5, Format('%7d', [dbt div 1024]));
  1359. Wrt(x+wdt+12,y+6, Format('%7d', [bbt div 1024]));
  1360. mon;
  1361. end;
  1362. procedure testdel(const _brett:string);
  1363. var _mbrett : string;
  1364. haltedat: longint;
  1365. edat : longint;
  1366. msize : longint;
  1367. groesse : longint;
  1368. hflags : byte;
  1369. uvs,b : byte;
  1370. ablage : byte;
  1371. defekt : boolean;
  1372. hdp : THeader;
  1373. hds : longint;
  1374. nzahl : longint;
  1375. typ : char;
  1376. function htimeout:boolean;
  1377. begin
  1378. htimeout:=(hzahl and (hzeit>0) and (nzahl>hzeit)) or
  1379. (not hzahl and smdl(edat,haltedat));
  1380. end;
  1381. begin
  1382. if hzahl then begin
  1383. dbSeek(mbase,miBrett,_brett+#$ff#$ff); { Brettende suchen }
  1384. if dbEOF(mbase) then dbGoEnd(mbase)
  1385. else dbSkip(mbase,-1);
  1386. if dbBOF(mbase) then exit;
  1387. while not dbBOF(mbase) and (dbReadStrN(mbase,mb_brett)=_brett) and
  1388. (dbReadIntN(mbase,mb_unversandt) and 8<>0) do
  1389. dbSkip(mbase,-1);
  1390. if dbBOF(mbase) then exit;
  1391. end
  1392. else begin
  1393. dbSeek(mbase,miBrett,_brett); { Brettanfang suchen }
  1394. if dbEOF(mbase) then exit;
  1395. end;
  1396. if hzahl or (hzeit=0) then
  1397. haltedat:=0
  1398. else
  1399. haltedat:=ixdat(FormatDateTime('yymmdd', Dat-hzeit+1) + '0000');
  1400. nzahl:=1;
  1401. brk := false;
  1402. hdp := THeader.Create;
  1403. repeat
  1404. if n mod 100 = 0 then testbrk(brk);
  1405. if brk then
  1406. brk:=ReadJN(getres(iif(_del,446,447)),true); { (Reorganisation) 'abbrechen' }
  1407. _mbrett := dbReadNStr(mbase,mb_brett);
  1408. if _mbrett=_brett then begin
  1409. inc(n);
  1410. dbReadN(mbase,mb_msgsize,msize);
  1411. inc(bt,msize);
  1412. dbReadN(mbase,mb_groesse,groesse);
  1413. dbReadN(mbase,mb_ablage,ablage);
  1414. dbReadN(mbase,mb_typ,typ);
  1415. dbReadN(mbase,mb_halteflags,hflags);
  1416. defekt:=(groesse<0) or (msize<0) or (groesse+14>msize) or (ablage>=ablagen) or
  1417. (msize-groesse>iif(ntZCablage(ablage),1000000,8000)) or
  1418. (dbReadIntN(mbase, mb_adresse)+msize>ablsize[ablage]) or
  1419. ((typ<>'T') and (typ<>'B') and (typ<>'M')) or (hflags>2) or
  1420. (dbReadIntN(mbase, mb_adresse)<0) or
  1421. (dbReadIntN(mbase, mb_netztyp)<0); { empfanz > 127 ? }
  1422. if repair and not defekt then begin
  1423. dbReadN(mbase,mb_gelesen,b);
  1424. if b>1 then begin
  1425. b:=0;
  1426. dbWriteN(mbase,mb_gelesen,b);
  1427. end;
  1428. ReadHeader(hdp,hds,false);
  1429. defekt:=(hds=1) or (hds<>msize-groesse) or (groesse<>hdp.groesse);
  1430. end;
  1431. if defekt then begin
  1432. hflags:=2; { Nachricht defekt }
  1433. dbWriteN(mbase,mb_halteflags,hflags);
  1434. if repair then msgaddmark;
  1435. inc(nbesch); inc(bbt,msize);
  1436. end;
  1437. if typ='M' then begin
  1438. typ := 'T';
  1439. dbWriteN(mbase,mb_typ,typ);
  1440. end;
  1441. dbReadN(mbase,mb_empfdatum,edat);
  1442. dbReadN(mbase,mb_unversandt,uvs);
  1443. if (msize=0) or { nur zur Sicherheit - sollte nicht vorkommen }
  1444. ((uvs and 1=0) and ((hflags=2) or ((hflags<>1) and htimeout)))
  1445. then begin
  1446. inc(ndel);
  1447. inc(dbt,msize);
  1448. if _del and (hflags<>2) then begin
  1449. hflags:=2;
  1450. dbWriteN(mbase,mb_halteflags,hflags);
  1451. end;
  1452. if ablage<ablagen then reobuf[ablage]:=true;
  1453. end
  1454. else
  1455. if ablage<ablagen then inc(bufsiz[ablage],msize);
  1456. dbSkip(mbase,iif(hzahl,-1,1));
  1457. inc(nzahl);
  1458. if n mod 20=0 then display;
  1459. end;
  1460. until brk or (_mbrett<>_brett) or dbEOF(mbase) or dbBOF(mbase);
  1461. Hdp.Free;
  1462. end;
  1463. begin
  1464. if dbRecCount(mbase)=0 then begin
  1465. rfehler(420); { 'keine Nachrichten vorhanden!' }
  1466. brk:=true;
  1467. exit;
  1468. end;
  1469. if not repair then MausInfoReorg;
  1470. wdt:=length(getres2(448,4));
  1471. msgbox(max(45,wdt+33),iif(_del,9,10),getres2(448,iif(_del,1,iif(repair,2,3))),x,y);
  1472. mwrt(x+3,y+4,getres2(448,4)+' / KB'); { 'Nachrichten:' }
  1473. mwrt(x+3,y+5,getres2(448,5)+' / KB'); { 'auf Loeschen:' }
  1474. mwrt(x+3,y+6,getres2(448,6)+' / KB'); { 'fehlerhaft: ' }
  1475. n:=0; ndel:=0; nbesch:=0;
  1476. bt:=0; dbt:=0; bbt:=0;
  1477. getablsizes;
  1478. Dat := Now;
  1479. bi:=dbGetIndex(bbase);
  1480. dbSetIndex(bbase,biBrett);

Large files files are truncated, but you can click here to view the full file