|
|
1.1 root 1: /* scansubs.cpp */
2:
3: /* Synchronet message database scanning routines */
4:
5: /* $Id: scansubs.cpp,v 1.4 2000/12/11 23:21:12 rswindell Exp $ */
6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
11: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: #include "sbbs.h"
39:
40: /****************************************************************************/
41: /* Used to scan single or multiple sub-boards. 'mode' is the scan type. */
42: /****************************************************************************/
43: void sbbs_t::scansubs(long mode)
44: {
45: char ch,str[256];
46: char tmp[512];
47: uint i=0,found=0;
48:
49: mnemonics(text[SubGroupOrAll]);
50: ch=(char)getkeys("SGA\r",0);
51: if(sys_status&SS_ABORT || ch==CR)
52: return;
53:
54: if(ch!='A' && mode&(SCAN_FIND|SCAN_TOYOU)) {
55: if(yesno(text[DisplayTitlesOnlyQ])) i=1;
56: if(mode&SCAN_FIND) {
57: bputs(text[SearchStringPrompt]);
58: if(!getstr(str,40,K_LINE|K_UPPER))
59: return;
60: if(i) { /* if titles only */
61: if(ch=='S')
62: found=searchsub(usrsub[curgrp][cursub[curgrp]],str);
63: else if(ch=='G')
64: for(i=0;i<usrsubs[curgrp] && !msgabort();i++)
65: found=searchsub(usrsub[curgrp][i],str);
66: sprintf(tmp,"Searched messages for '%s'",str);
67: logline(nulstr,tmp);
68: if(!found)
69: CRLF;
70: return; } }
71: else if(mode&SCAN_TOYOU && i) {
72: if(ch=='S')
73: found=searchsub_toyou(usrsub[curgrp][cursub[curgrp]]);
74: else if(ch=='G')
75: for(i=0;i<usrsubs[curgrp] && !msgabort();i++)
76: found=searchsub_toyou(usrsub[curgrp][i]);
77: if(!found)
78: CRLF;
79: return; } }
80:
81: if(ch=='S') {
82: if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) {
83: menu("msgscan"); }
84: i=scanposts(usrsub[curgrp][cursub[curgrp]],mode,str);
85: bputs(text[MessageScan]);
86: if(i) bputs(text[MessageScanAborted]);
87: else bputs(text[MessageScanComplete]);
88: return; }
89: if(ch=='G') {
90: if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) {
91: menu("msgscan"); }
92: for(i=0;i<usrsubs[curgrp] && !msgabort();i++)
93: if(((mode&SCAN_NEW &&
94: (sub_cfg[usrsub[curgrp][i]]&SUB_CFG_NSCAN
95: || cfg.sub[usrsub[curgrp][i]]->misc&SUB_FORCED))
96: || (mode&SCAN_TOYOU && sub_cfg[usrsub[curgrp][i]]&SUB_CFG_SSCAN)
97: || mode&SCAN_FIND)
98: && scanposts(usrsub[curgrp][i],mode,str)) break;
99: bputs(text[MessageScan]);
100: if(i==usrsubs[curgrp]) bputs(text[MessageScanComplete]);
101: else bputs(text[MessageScanAborted]);
102: return; }
103:
104: scanallsubs(mode);
105: }
106:
107: /****************************************************************************/
108: /* Performs a new message scan all all sub-boards */
109: /****************************************************************************/
110: void sbbs_t::scanallsubs(long mode)
111: {
112: char str[256];
113: char tmp[512];
114: uint i,j,found=0;
115:
116: if(/* action==NODE_MAIN && */ mode&(SCAN_FIND|SCAN_TOYOU)) {
117: i=yesno(text[DisplayTitlesOnlyQ]);
118: if(mode&SCAN_FIND) {
119: bputs(text[SearchStringPrompt]);
120: if(!getstr(str,40,K_LINE|K_UPPER))
121: return;
122: if(i) { /* if titles only */
123: for(i=0;i<usrgrps;i++) {
124: for(j=0;j<usrsubs[i] && !msgabort();j++)
125: found=searchsub(usrsub[i][j],str);
126: if(j<usrsubs[i])
127: break; }
128: if(!found)
129: CRLF;
130: sprintf(tmp,"Searched messages for '%s'",str);
131: logline(nulstr,tmp);
132: return; } }
133: else if(mode&SCAN_TOYOU && i) {
134: for(i=0;i<usrgrps;i++) {
135: for(j=0;j<usrsubs[i] && !msgabort();j++)
136: found=searchsub_toyou(usrsub[i][j]);
137: if(j<usrsubs[i])
138: break; }
139: if(!found)
140: CRLF;
141: return; } }
142:
143: if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) {
144: menu("msgscan"); }
145: for(i=0;i<usrgrps;i++) {
146: for(j=0;j<usrsubs[i] && !msgabort();j++)
147: if(((mode&SCAN_NEW && sub_cfg[usrsub[i][j]]&SUB_CFG_NSCAN)
148: || cfg.sub[usrsub[i][j]]->misc&SUB_FORCED
149: || mode&SCAN_FIND
150: || (mode&SCAN_TOYOU && sub_cfg[usrsub[i][j]]&SUB_CFG_SSCAN))
151: && scanposts(usrsub[i][j],mode,str)) break;
152: if(j<usrsubs[i])
153: break; }
154: bputs(text[MessageScan]);
155: if(i<usrgrps) {
156: bputs(text[MessageScanAborted]);
157: return; }
158: bputs(text[MessageScanComplete]);
159: if(mode&SCAN_NEW && !(mode&(SCAN_BACK|SCAN_TOYOU))
160: && useron.misc&ANFSCAN && !(useron.rest&FLAG('T'))) {
161: xfer_cmds++;
162: scanalldirs(FL_ULTIME); }
163: }
164:
165: void sbbs_t::new_scan_ptr_cfg()
166: {
167: uint i,j;
168: long s;
169: ulong l;
170: time_t t;
171:
172: while(online) {
173: bputs(text[CfgGrpLstHdr]);
174: for(i=0;i<usrgrps && !msgabort();i++) {
175: checkline();
176: if(i<9) outchar(SP);
177: if(i<99) outchar(SP);
178: bprintf(text[CfgGrpLstFmt],i+1,cfg.grp[usrgrp[i]]->lname); }
179: SYNC;
180: mnemonics(text[WhichOrAll]);
181: s=getkeys("AQ",usrgrps);
182: if(!s || s==-1 || s=='Q')
183: break;
184: if(s=='A') {
185: mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or"
186: " [Last Message]: ");
187: s=getkeys("DLQ",9999);
188: if(s==-1 || s=='Q')
189: continue;
190: if(s=='D') {
191: t=time(NULL);
192: if(inputnstime(&t) && !(sys_status&SS_ABORT)) {
193: bputs(text[LoadingMsgPtrs]);
194: for(i=0;i<usrgrps && online;i++)
195: for(j=0;j<usrsubs[i] && online;j++) {
196: checkline();
197: sub_ptr[usrsub[i][j]]=getmsgnum(usrsub[i][j],t); } }
198: continue; }
199: if(s=='L')
200: s=0;
201: if(s)
202: s&=~0x80000000L;
203: bputs(text[LoadingMsgPtrs]);
204: for(i=0;i<usrgrps;i++)
205: for(j=0;j<usrsubs[i] && online;j++) {
206: checkline();
207: getlastmsg(usrsub[i][j],&l,0);
208: if(s>(long)l)
209: sub_ptr[usrsub[i][j]]=0;
210: else
211: sub_ptr[usrsub[i][j]]=l-s; }
212: continue; }
213: i=(s&~0x80000000L)-1;
214: while(online) {
215: l=0;
216: bprintf(text[CfgSubLstHdr],cfg.grp[usrgrp[i]]->lname);
217: for(j=0;j<usrsubs[i] && !msgabort();j++) {
218: checkline();
219: if(j<9) outchar(SP);
220: if(j<99) outchar(SP);
221: t=getmsgtime(usrsub[i][j],sub_ptr[usrsub[i][j]]);
222: if(t>(long)l)
223: l=t;
224: bprintf(text[SubPtrLstFmt],j+1,cfg.sub[usrsub[i][j]]->lname
225: ,timestr(&t),nulstr); }
226: SYNC;
227: mnemonics(text[WhichOrAll]);
228: s=getkeys("AQ",usrsubs[i]);
229: if(sys_status&SS_ABORT) {
230: lncntr=0;
231: return; }
232: if(s==-1 || !s || s=='Q')
233: break;
234: if(s=='A') { /* The entire group */
235: mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or"
236: " [Last Message]: ");
237: s=getkeys("DLQ",9999);
238: if(s==-1 || s=='Q')
239: continue;
240: if(s=='D') {
241: t=l;
242: if(inputnstime(&t) && !(sys_status&SS_ABORT)) {
243: bputs(text[LoadingMsgPtrs]);
244: for(j=0;j<usrsubs[i] && online;j++) {
245: checkline();
246: sub_ptr[usrsub[i][j]]=getmsgnum(usrsub[i][j],t); } }
247: continue; }
248: if(s=='L')
249: s=0;
250: if(s)
251: s&=~0x80000000L;
252: bputs(text[LoadingMsgPtrs]);
253: for(j=0;j<usrsubs[i] && online;j++) {
254: checkline();
255: getlastmsg(usrsub[i][j],&l,0);
256: if(s>(long)l)
257: sub_ptr[usrsub[i][j]]=0;
258: else
259: sub_ptr[usrsub[i][j]]=l-s; }
260: continue; }
261: else {
262: j=(s&~0x80000000L)-1;
263: mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or"
264: " [Last Message]: ");
265: s=getkeys("DLQ",9999);
266: if(s==-1 || s=='Q')
267: continue;
268: if(s=='D') {
269: t=getmsgtime(usrsub[i][j],sub_ptr[usrsub[i][j]]);
270: if(inputnstime(&t) && !(sys_status&SS_ABORT)) {
271: bputs(text[LoadingMsgPtrs]);
272: sub_ptr[usrsub[i][j]]=getmsgnum(usrsub[i][j],t); }
273: continue; }
274: if(s=='L')
275: s=0;
276: if(s)
277: s&=~0x80000000L;
278: getlastmsg(usrsub[i][j],&l,0);
279: if(s>(long)l)
280: sub_ptr[usrsub[i][j]]=0;
281: else
282: sub_ptr[usrsub[i][j]]=l-s; }
283: } }
284: }
285:
286: void sbbs_t::new_scan_cfg(ulong misc)
287: {
288: long s;
289: ulong i,j;
290: ulong t;
291:
292: while(online) {
293: bputs(text[CfgGrpLstHdr]);
294: for(i=0;i<usrgrps && !msgabort();i++) {
295: checkline();
296: if(i<9) outchar(SP);
297: if(i<99) outchar(SP);
298: bprintf(text[CfgGrpLstFmt],i+1,cfg.grp[usrgrp[i]]->lname); }
299: SYNC;
300: if(misc&SUB_CFG_NSCAN)
301: mnemonics(text[NScanCfgWhichGrp]);
302: else
303: mnemonics(text[SScanCfgWhichGrp]);
304: s=getnum(i);
305: if(s<1)
306: break;
307: i=s-1;
308: while(online) {
309: if(misc&SUB_CFG_NSCAN)
310: misc&=~SUB_CFG_YSCAN;
311: bprintf(text[CfgSubLstHdr],cfg.grp[usrgrp[i]]->lname);
312: for(j=0;j<usrsubs[i] && !msgabort();j++) {
313: checkline();
314: if(j<9) outchar(SP);
315: if(j<99) outchar(SP);
316: bprintf(text[CfgSubLstFmt],j+1
317: ,cfg.sub[usrsub[i][j]]->lname
318: ,sub_cfg[usrsub[i][j]]&misc ?
319: (misc&SUB_CFG_NSCAN && sub_cfg[usrsub[i][j]]&SUB_CFG_YSCAN) ?
320: "To You Only" : text[On] : text[Off]);
321: }
322: SYNC;
323: if(misc&SUB_CFG_NSCAN)
324: mnemonics(text[NScanCfgWhichSub]);
325: else
326: mnemonics(text[SScanCfgWhichSub]);
327: s=getkeys("AQ",usrsubs[i]);
328: if(sys_status&SS_ABORT) {
329: lncntr=0;
330: return; }
331: if(!s || s==-1 || s=='Q')
332: break;
333: if(s=='A') {
334: t=sub_cfg[usrsub[i][0]]&misc;
335: if(misc&SUB_CFG_NSCAN && !t && !(useron.misc&FLAG('Q')))
336: if(!noyes("Messages to you only"))
337: misc|=SUB_CFG_YSCAN;
338: for(j=0;j<usrsubs[i] && online;j++) {
339: checkline();
340: if(t) sub_cfg[usrsub[i][j]]&=~misc;
341: else {
342: if(misc&SUB_CFG_NSCAN)
343: sub_cfg[usrsub[i][j]]&=~SUB_CFG_YSCAN;
344: sub_cfg[usrsub[i][j]]|=misc; } }
345: continue; }
346: j=(s&~0x80000000L)-1;
347: if(misc&SUB_CFG_NSCAN && !(sub_cfg[usrsub[i][j]]&misc)) {
348: if(!(useron.misc&FLAG('Q')) && !noyes("Messages to you only"))
349: sub_cfg[usrsub[i][j]]|=SUB_CFG_YSCAN;
350: else
351: sub_cfg[usrsub[i][j]]&=~SUB_CFG_YSCAN; }
352: sub_cfg[usrsub[i][j]]^=misc; } }
353: }
354:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.