|
|
1.1 ! root 1: /* prntfile.cpp */ ! 2: ! 3: /* Synchronet file print/display routines */ ! 4: ! 5: /* $Id: prntfile.cpp,v 1.17 2006/08/23 01:45:05 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 2006 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: /* Prints a file remotely and locally, interpreting ^A sequences, checks */ ! 42: /* for pauses, aborts and ANSI. 'str' is the path of the file to print */ ! 43: /* Called from functions menu and text_sec */ ! 44: /****************************************************************************/ ! 45: void sbbs_t::printfile(char *str, long mode) ! 46: { ! 47: char* buf; ! 48: char* p; ! 49: int file; ! 50: BOOL wip=FALSE,rip=FALSE,html=FALSE; ! 51: long l,length,savcon=console; ! 52: FILE *stream; ! 53: ! 54: p=strrchr(str,'.'); ! 55: if(p!=NULL) { ! 56: if(stricmp(p,".wip")==0) { ! 57: wip=TRUE; ! 58: mode|=P_NOPAUSE; ! 59: } ! 60: else if(stricmp(p,".rip")==0) { ! 61: rip=TRUE; ! 62: mode|=P_NOPAUSE; ! 63: } ! 64: else if(stricmp(p,".html")==0) { ! 65: html=TRUE; ! 66: mode|=(P_HTML|P_NOPAUSE); ! 67: } ! 68: } ! 69: ! 70: if(mode&P_NOABORT || wip || rip || html) { ! 71: if(online==ON_REMOTE && console&CON_R_ECHO) { ! 72: rioctl(IOCM|ABORT); ! 73: rioctl(IOCS|ABORT); ! 74: } ! 75: sys_status&=~SS_ABORT; ! 76: } ! 77: ! 78: if(!(mode&P_NOCRLF) && !tos && !wip && !rip && !html) ! 79: CRLF; ! 80: ! 81: if((stream=fnopen(&file,str,O_RDONLY))==NULL) { ! 82: lprintf(LOG_NOTICE,"Node %d !File not found: %s",cfg.node_num,str); ! 83: bputs(text[FileNotFound]); ! 84: if(SYSOP) bputs(str); ! 85: CRLF; ! 86: return; ! 87: } ! 88: ! 89: length=filelength(file); ! 90: if(length<0) { ! 91: close(file); ! 92: errormsg(WHERE,ERR_CHK,str,length); ! 93: return; ! 94: } ! 95: if((buf=(char*)malloc(length+1L))==NULL) { ! 96: close(file); ! 97: errormsg(WHERE,ERR_ALLOC,str,length+1L); ! 98: return; ! 99: } ! 100: l=lread(file,buf,length); ! 101: fclose(stream); ! 102: if(l!=length) ! 103: errormsg(WHERE,ERR_READ,str,length); ! 104: else { ! 105: buf[l]=0; ! 106: putmsg(buf,mode); ! 107: } ! 108: free(buf); ! 109: ! 110: if((mode&P_NOABORT || wip || rip || html) && online==ON_REMOTE) { ! 111: SYNC; ! 112: rioctl(IOSM|ABORT); ! 113: } ! 114: if(rip) ! 115: ansi_getlines(); ! 116: console=savcon; ! 117: } ! 118: ! 119: void sbbs_t::printtail(char *str, int lines, long mode) ! 120: { ! 121: char* buf; ! 122: char* p; ! 123: int file,cur=0; ! 124: long length,l; ! 125: ! 126: if(mode&P_NOABORT) { ! 127: if(online==ON_REMOTE) { ! 128: rioctl(IOCM|ABORT); ! 129: rioctl(IOCS|ABORT); ! 130: } ! 131: sys_status&=~SS_ABORT; ! 132: } ! 133: if(!tos) { ! 134: CRLF; ! 135: } ! 136: if((file=nopen(str,O_RDONLY))==-1) { ! 137: lprintf(LOG_NOTICE,"Node %d !File not found: %s",cfg.node_num,str); ! 138: bputs(text[FileNotFound]); ! 139: if(SYSOP) bputs(str); ! 140: CRLF; ! 141: return; ! 142: } ! 143: length=filelength(file); ! 144: if(length<0) { ! 145: close(file); ! 146: errormsg(WHERE,ERR_CHK,str,length); ! 147: return; ! 148: } ! 149: if((buf=(char*)malloc(length+1L))==NULL) { ! 150: close(file); ! 151: errormsg(WHERE,ERR_ALLOC,str,length+1L); ! 152: return; ! 153: } ! 154: l=lread(file,buf,length); ! 155: close(file); ! 156: if(l!=length) ! 157: errormsg(WHERE,ERR_READ,str,length); ! 158: else { ! 159: buf[l]=0; ! 160: p=(buf+l)-1; ! 161: if(*p==LF) p--; ! 162: while(*p && p>buf) { ! 163: if(*p==LF) ! 164: cur++; ! 165: if(cur>=lines) { ! 166: p++; ! 167: break; ! 168: } ! 169: p--; ! 170: } ! 171: putmsg(p,mode); ! 172: } ! 173: if(mode&P_NOABORT && online==ON_REMOTE) { ! 174: SYNC; ! 175: rioctl(IOSM|ABORT); ! 176: } ! 177: free(buf); ! 178: } ! 179: ! 180: /****************************************************************************/ ! 181: /* Prints the menu number 'menunum' from the text directory. Checks for ^A */ ! 182: /* ,ANSI sequences, pauses and aborts. Usually accessed by user inputing '?'*/ ! 183: /* Called from every function that has an available menu. */ ! 184: /* The code definitions are as follows: */ ! 185: /****************************************************************************/ ! 186: void sbbs_t::menu(const char *code) ! 187: { ! 188: char str[MAX_PATH+1],path[MAX_PATH+1]; ! 189: ! 190: sys_status&=~SS_ABORT; ! 191: if(menu_file[0]) ! 192: strcpy(path,menu_file); ! 193: else { ! 194: sprintf(str,"%smenu/",cfg.text_dir); ! 195: if(menu_dir[0]) { ! 196: strcat(str,menu_dir); ! 197: strcat(str,"/"); ! 198: } ! 199: strcat(str,code); ! 200: strcat(str,"."); ! 201: sprintf(path,"%s%s",str,term_supports(WIP) ? "wip": term_supports(RIP) ? "rip" : "html"); ! 202: if(!(term_supports()&(RIP|WIP|HTML)) || !fexistcase(path)) { ! 203: sprintf(path,"%smon",str); ! 204: if((term_supports()&(COLOR|ANSI))!=ANSI || !fexistcase(path)) { ! 205: sprintf(path,"%sans",str); ! 206: if(!term_supports(ANSI) || !fexistcase(path)) ! 207: sprintf(path,"%sasc",str); ! 208: } ! 209: } ! 210: } ! 211: ! 212: printfile(path,P_OPENCLOSE); ! 213: } ! 214: ! 215:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.