|
|
1.1 ! root 1: { Synchronet User Editor (Delphi 5 for Win32 project) } ! 2: ! 3: { $Id: MainFormUnit.pas,v 1.9 2003/02/20 00:11:25 rswindell Exp $ } ! 4: ! 5: {**************************************************************************** ! 6: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 8: * * ! 9: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * ! 10: * * ! 11: * This program is free software; you can redistribute it and/or * ! 12: * modify it under the terms of the GNU General Public License * ! 13: * as published by the Free Software Foundation; either version 2 * ! 14: * of the License, or (at your option) any later version. * ! 15: * See the GNU General Public License for more details: gpl.txt or * ! 16: * http://www.fsf.org/copyleft/gpl.html * ! 17: * * ! 18: * Anonymous FTP access to the most recent released source is available at * ! 19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 20: * * ! 21: * Anonymous CVS access to the development source and modification history * ! 22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 24: * (just hit return, no password is necessary) * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 26: * * ! 27: * For Synchronet coding style and modification guidelines, see * ! 28: * http://www.synchro.net/source.html * ! 29: * * ! 30: * You are encouraged to submit any modifications (preferably in Unix diff * ! 31: * format) via e-mail to [email protected] * ! 32: * * ! 33: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 34: ****************************************************************************} ! 35: ! 36: { User Data function Notes: ! 37: ! 38: The Tag member of the Edit boxes is used to indicate modified data. ! 39: GetUserXxxx() calls GetXxxxField() sets the Tag to 0. ! 40: PutUserXxxx() only gets PutXxxxField() if Tag = 1. ! 41: GetXxxxField() and PutXxxxField() do not care about TEdits or Tags. ! 42: } ! 43: ! 44: unit MainFormUnit; ! 45: ! 46: interface ! 47: ! 48: uses ! 49: Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ! 50: StdCtrls, Menus, ComCtrls, ExtCtrls, Buttons, ActnList, ImgList, CheckLst, ! 51: ToolWin, Registry; ! 52: ! 53: type ! 54: TForm1 = class(TForm) ! 55: MainMenu: TMainMenu; ! 56: FileMenuItem: TMenuItem; ! 57: Panel: TPanel; ! 58: FileExitMenuItem: TMenuItem; ! 59: FileDeleteMenuItem: TMenuItem; ! 60: PageControl: TPageControl; ! 61: PersonalTabSheet: TTabSheet; ! 62: Label2: TLabel; ! 63: NameEdit: TEdit; ! 64: Label1: TLabel; ! 65: ComputerEdit: TEdit; ! 66: NetmailAddress: TLabel; ! 67: NetmailEdit: TEdit; ! 68: Label7: TLabel; ! 69: NoteEdit: TEdit; ! 70: HandleLabel: TLabel; ! 71: HandleEdit: TEdit; ! 72: Label5: TLabel; ! 73: PasswordEdit: TEdit; ! 74: Label6: TLabel; ! 75: BirthdateEdit: TEdit; ! 76: Label8: TLabel; ! 77: ModemEdit: TEdit; ! 78: Label16: TLabel; ! 79: SexEdit: TEdit; ! 80: Label18: TLabel; ! 81: PhoneEdit: TEdit; ! 82: SecurityTabSheet: TTabSheet; ! 83: Label10: TLabel; ! 84: LevelEdit: TEdit; ! 85: Label11: TLabel; ! 86: ExpireEdit: TEdit; ! 87: StatsTabSheet: TTabSheet; ! 88: TopPanel: TPanel; ! 89: NumberLabel: TLabel; ! 90: NumberEdit: TEdit; ! 91: TotalStaticText: TStaticText; ! 92: AliasLabel: TLabel; ! 93: AliasEdit: TEdit; ! 94: Label24: TLabel; ! 95: CommentEdit: TEdit; ! 96: FileNewUserMenuItem: TMenuItem; ! 97: Label25: TLabel; ! 98: ExemptionsEdit: TEdit; ! 99: Label26: TLabel; ! 100: RestrictionsEdit: TEdit; ! 101: Label27: TLabel; ! 102: CreditsEdit: TEdit; ! 103: Label28: TLabel; ! 104: MinutesEdit: TEdit; ! 105: Label29: TLabel; ! 106: FreeCreditsEdit: TEdit; ! 107: FileSaveUserMenuItem: TMenuItem; ! 108: ActionList: TActionList; ! 109: SaveUser: TAction; ! 110: NewUser: TAction; ! 111: RefreshUser: TAction; ! 112: ImageList: TImageList; ! 113: DeleteUser: TAction; ! 114: FileRefreshUserMenuItem: TMenuItem; ! 115: GroupBox1: TGroupBox; ! 116: TimeOnEdit: TEdit; ! 117: Label22: TLabel; ! 118: Label23: TLabel; ! 119: TimeOnTodayEdit: TEdit; ! 120: Label30: TLabel; ! 121: ExtraTimeEdit: TEdit; ! 122: Label31: TLabel; ! 123: LastCallTimeEdit: TEdit; ! 124: GroupBox2: TGroupBox; ! 125: Label20: TLabel; ! 126: LogonsEdit: TEdit; ! 127: Label21: TLabel; ! 128: LogonsTodayEdit: TEdit; ! 129: GroupBox3: TGroupBox; ! 130: Label17: TLabel; ! 131: FirstOnEdit: TEdit; ! 132: Label19: TLabel; ! 133: LastOnEdit: TEdit; ! 134: GroupBox4: TGroupBox; ! 135: Label32: TLabel; ! 136: PostsTotalEdit: TEdit; ! 137: Label33: TLabel; ! 138: PostsTodayEdit: TEdit; ! 139: GroupBox5: TGroupBox; ! 140: Label34: TLabel; ! 141: Label35: TLabel; ! 142: EmailTotalEdit: TEdit; ! 143: EmailTodayEdit: TEdit; ! 144: Label36: TLabel; ! 145: FeedbackEdit: TEdit; ! 146: GroupBox6: TGroupBox; ! 147: Label37: TLabel; ! 148: UploadedFilesEdit: TEdit; ! 149: Label38: TLabel; ! 150: UploadedBytesEdit: TEdit; ! 151: GroupBox7: TGroupBox; ! 152: Label39: TLabel; ! 153: Label40: TLabel; ! 154: DownloadedFilesEdit: TEdit; ! 155: DownloadedBytesEdit: TEdit; ! 156: GroupBox8: TGroupBox; ! 157: Label12: TLabel; ! 158: Flags1Edit: TEdit; ! 159: Label13: TLabel; ! 160: Flags2Edit: TEdit; ! 161: Label14: TLabel; ! 162: Flags3Edit: TEdit; ! 163: Label15: TLabel; ! 164: Flags4Edit: TEdit; ! 165: GroupBox9: TGroupBox; ! 166: AddressEdit: TEdit; ! 167: LocationEdit: TEdit; ! 168: ZipCodeEdit: TEdit; ! 169: DeactivateUser: TAction; ! 170: N1: TMenuItem; ! 171: FileDeactivateUserMenuItem: TMenuItem; ! 172: SettingsTabSheet: TTabSheet; ! 173: GroupBox10: TGroupBox; ! 174: Label3: TLabel; ! 175: RowsEdit: TEdit; ! 176: GroupBox11: TGroupBox; ! 177: GroupBox13: TGroupBox; ! 178: GroupBox15: TGroupBox; ! 179: ShellEdit: TEdit; ! 180: ExpertCheckBox: TCheckBox; ! 181: ChatCheckListBox: TCheckListBox; ! 182: TerminalCheckListBox: TCheckListBox; ! 183: LogonCheckListBox: TCheckListBox; ! 184: ToolBar: TToolBar; ! 185: ToolButton1: TToolButton; ! 186: ToolButton2: TToolButton; ! 187: ToolButton3: TToolButton; ! 188: ToolButton4: TToolButton; ! 189: ToolButton5: TToolButton; ! 190: FindEdit: TEdit; ! 191: ToolButton6: TToolButton; ! 192: FindNextButton: TButton; ! 193: FindButton: TButton; ! 194: ScrollBar: TScrollBar; ! 195: Label42: TLabel; ! 196: LeechEdit: TEdit; ! 197: Status: TEdit; ! 198: ToolButton7: TToolButton; ! 199: MsgFileSettingsTabSheet: TTabSheet; ! 200: GroupBox16: TGroupBox; ! 201: Label41: TLabel; ! 202: MessageCheckListBox: TCheckListBox; ! 203: EditorEdit: TEdit; ! 204: GroupBox12: TGroupBox; ! 205: Label4: TLabel; ! 206: Label9: TLabel; ! 207: TempFileExtEdit: TEdit; ! 208: ProtocolEdit: TEdit; ! 209: FileCheckListBox: TCheckListBox; ! 210: GroupBox14: TGroupBox; ! 211: QWKCheckListBox: TCheckListBox; ! 212: ExtendedCommentTabSheet: TTabSheet; ! 213: Memo: TMemo; ! 214: procedure FormShow(Sender: TObject); ! 215: procedure ScrollBarChange(Sender: TObject); ! 216: procedure NumberEditKeyPress(Sender: TObject; var Key: Char); ! 217: procedure FileExitMenuItemClick(Sender: TObject); ! 218: procedure EditChange(Sender: TObject); ! 219: procedure SaveUserExecute(Sender: TObject); ! 220: procedure NewUserExecute(Sender: TObject); ! 221: procedure DeleteUserExecute(Sender: TObject); ! 222: procedure FormClose(Sender: TObject; var Action: TCloseAction); ! 223: procedure DeactivateUserExecute(Sender: TObject); ! 224: procedure FindButtonClick(Sender: TObject); ! 225: procedure FindEditKeyPress(Sender: TObject; var Key: Char); ! 226: private ! 227: { Private declarations } ! 228: public ! 229: { Public declarations } ! 230: data_dir: AnsiString; ! 231: users: Integer; ! 232: user_misc: Integer; ! 233: user_chat: Integer; ! 234: user_qwk: Integer; ! 235: function LastUser: Integer; ! 236: procedure GetUserData(usernumber: Integer); ! 237: procedure PutUserData(usernumber: Integer); ! 238: end; ! 239: ! 240: var ! 241: Form1: TForm1; ! 242: ! 243: implementation ! 244: ! 245: const ETX=#3; { End Of Text character, all fields use for padding/terminator } ! 246: const CR=#13; { Carriage-return } ! 247: const LF=#10; { Line-feed } ! 248: ! 249: const { String lengths } ! 250: LEN_ALIAS =25; { User alias } ! 251: LEN_NAME =25; { User name } ! 252: LEN_HANDLE =8; { User chat handle } ! 253: LEN_NOTE =30; { User note } ! 254: LEN_COMP =30; { User computer description } ! 255: LEN_COMMENT =60; { User comment } ! 256: LEN_NETMAIL =60; { NetMail forwarding address } ! 257: LEN_PASS =8; { User password } ! 258: LEN_PHONE =12; { User phone number } ! 259: LEN_BIRTH =8; { Birthday in xx/xx/YY format } ! 260: LEN_ADDRESS =30; { User address } ! 261: LEN_LOCATION =30; { Location (City, State) } ! 262: LEN_ZIPCODE =10; { Zip/Postal code } ! 263: LEN_MODEM =8; { User modem type description } ! 264: LEN_FDESC =58; { File description } ! 265: LEN_FCDT =9; { 9 digits for file credit values } ! 266: LEN_TITLE =70; { Message title } ! 267: LEN_MAIN_CMD =40; { Storage in user.dat for custom commands } ! 268: LEN_XFER_CMD =40; ! 269: LEN_SCAN_CMD =40; ! 270: LEN_MAIL_CMD =40; ! 271: LEN_CID =25; { Caller ID (phone number) } ! 272: LEN_ARSTR =40; { Max length of Access Requirement string } ! 273: LEN_CHATACTCMD =9; { Chat action command } ! 274: LEN_CHATACTOUT =65; { Chat action output string } ! 275: ! 276: ! 277: { This is a list of offsets into the USER.DAT file for different variables ! 278: that are stored (for each user) } ! 279: const ! 280: U_ALIAS =0; { Offset to alias } ! 281: U_NAME =U_ALIAS+LEN_ALIAS; { Offset to name } ! 282: U_HANDLE =U_NAME+LEN_NAME; ! 283: U_NOTE =U_HANDLE+LEN_HANDLE+2; ! 284: U_COMP =U_NOTE+LEN_NOTE; ! 285: U_COMMENT =U_COMP+LEN_COMP+2; ! 286: ! 287: U_NETMAIL =U_COMMENT+LEN_COMMENT+2; ! 288: ! 289: U_ADDRESS =U_NETMAIL+LEN_NETMAIL+2; ! 290: U_LOCATION =U_ADDRESS+LEN_ADDRESS; ! 291: U_ZIPCODE =U_LOCATION+LEN_LOCATION; ! 292: ! 293: U_PASS =U_ZIPCODE+LEN_ZIPCODE+2; ! 294: U_PHONE =U_PASS+8; { Offset to phone-number } ! 295: U_BIRTH =U_PHONE+12; { Offset to users birthday } ! 296: U_MODEM =U_BIRTH+8; ! 297: U_LASTON =U_MODEM+8; ! 298: U_FIRSTON =U_LASTON+8; ! 299: U_EXPIRE =U_FIRSTON+8; ! 300: U_PWMOD =U_EXPIRE+8; ! 301: ! 302: U_LOGONS =U_PWMOD+8+2; ! 303: U_LTODAY =U_LOGONS+5; ! 304: U_TIMEON =U_LTODAY+5; ! 305: U_TEXTRA =U_TIMEON+5; ! 306: U_TTODAY =U_TEXTRA+5; ! 307: U_TLAST =U_TTODAY+5; ! 308: U_POSTS =U_TLAST+5; ! 309: U_EMAILS =U_POSTS+5; ! 310: U_FBACKS =U_EMAILS+5; ! 311: U_ETODAY =U_FBACKS+5; ! 312: U_PTODAY =U_ETODAY+5; ! 313: ! 314: U_ULB =U_PTODAY+5+2; ! 315: U_ULS =U_ULB+10; ! 316: U_DLB =U_ULS+5; ! 317: U_DLS =U_DLB+10; ! 318: U_CDT =U_DLS+5; ! 319: U_MIN =U_CDT+10; ! 320: ! 321: U_LEVEL =U_MIN+10+2; { Offset to Security Level } ! 322: U_FLAGS1 =U_LEVEL+2; { Offset to Flags } ! 323: U_TL =U_FLAGS1+8; { Offset to unused field } ! 324: U_FLAGS2 =U_TL+2; ! 325: U_EXEMPT =U_FLAGS2+8; ! 326: U_REST =U_EXEMPT+8; ! 327: U_ROWS =U_REST+8+2; { Number of Rows on user's monitor } ! 328: U_SEX =U_ROWS+2; { Sex, Del, ANSI, color etc. } ! 329: U_MISC =U_SEX+1; { Miscellaneous flags in 8-byte hex } ! 330: U_OLDXEDIT =U_MISC+8; { External editor (Version 1 method) } ! 331: U_LEECH =U_OLDXEDIT+2; { two hex digits - leech attempt count } ! 332: U_CURSUB =U_LEECH+2; { Current sub (internal code } ! 333: U_CURDIR =U_CURSUB+8; { Current dir (internal code } ! 334: U_CMDSET =U_CURDIR+8; { unused } ! 335: U_MAIN_CMD =U_CMDSET+2+2; { unused } ! 336: U_XFER_CMD =U_MAIN_CMD+LEN_MAIN_CMD; { unused } ! 337: U_SCAN_CMD =U_XFER_CMD+LEN_XFER_CMD+2; { unused } ! 338: U_MAIL_CMD =U_SCAN_CMD+LEN_SCAN_CMD; { unused } ! 339: U_FREECDT =U_MAIL_CMD+LEN_MAIL_CMD+2; ! 340: U_FLAGS3 =U_FREECDT+10; { Flag set #3 } ! 341: U_FLAGS4 =U_FLAGS3+8; { Flag set #4 } ! 342: U_XEDIT =U_FLAGS4+8; { External editor (code) } ! 343: U_SHELL =U_XEDIT+8; { Command shell (code) } ! 344: U_QWK =U_SHELL+8; { QWK settings } ! 345: U_TMPEXT =U_QWK+8; { QWK extension } ! 346: U_CHAT =U_TMPEXT+3; { Chat settings } ! 347: U_NS_TIME =U_CHAT+8; { New-file scan date/time } ! 348: U_PROT =U_NS_TIME+8; { Default transfer protocol } ! 349: U_UNUSED =U_PROT+1; ! 350: U_LEN =(U_UNUSED+28+2); ! 351: ! 352: { Bit values for user_misc } ! 353: const ! 354: DELETED =(1 shl 0); { Deleted user } ! 355: ANSI =(1 shl 1); { Supports ANSI terminal emulation } ! 356: UCOLOR =(1 shl 2); { Send color codes } ! 357: RIP =(1 shl 3); { Supports RIP terminal emulation } ! 358: UPAUSE =(1 shl 4); { Pause on every screen full } ! 359: SPIN =(1 shl 5); { Spinning cursor - Same as K_SPIN } ! 360: INACTIVE =(1 shl 6); { Inactive user slot } ! 361: EXPERT =(1 shl 7); { Expert menu mode } ! 362: ANFSCAN =(1 shl 8); { Auto New file scan } ! 363: CLRSCRN =(1 shl 9); { Clear screen before each message } ! 364: QUIET =(1 shl 10); { Quiet mode upon logon } ! 365: BATCHFLAG =(1 shl 11); { File list allow batch dl flags } ! 366: NETMAIL =(1 shl 12); { Forward e-mail to fidonet addr } ! 367: CURSUB =(1 shl 13); { Remember current sub-board/dir } ! 368: ASK_NSCAN =(1 shl 14); { Ask for newscanning upon logon } ! 369: NO_EXASCII =(1 shl 15); { Don't send extended ASCII } ! 370: ASK_SSCAN =(1 shl 16); { Ask for messages to you at logon } ! 371: AUTOTERM =(1 shl 17); { Autodetect terminal type } ! 372: COLDKEYS =(1 shl 18); { No hot-keys } ! 373: EXTDESC =(1 shl 19); { Extended file descriptions } ! 374: AUTOHANG =(1 shl 20); { Auto-hang-up after transfer } ! 375: WIP =(1 shl 21); { Supports WIP terminal emulation } ! 376: AUTOLOGON =(1 shl 22); { AutoLogon via IP } ! 377: ! 378: { Bit values for user_chat } ! 379: const ! 380: CHAT_ECHO =(1 shl 0); { Multinode chat echo } ! 381: CHAT_ACTION =(1 shl 1); { Chat actions } ! 382: CHAT_NOPAGE =(1 shl 2); { Can't be paged } ! 383: CHAT_NOACT =(1 shl 3); { No activity alerts } ! 384: CHAT_SPLITP =(1 shl 4); { Split screen private chat } ! 385: ! 386: { Bits for user_qwk } ! 387: const ! 388: QWK_FILES =(1 shl 0); { Include new files list } ! 389: QWK_EMAIL =(1 shl 1); { Include unread e-mail } ! 390: QWK_ALLMAIL =(1 shl 2); { Include ALL e-mail } ! 391: QWK_DELMAIL =(1 shl 3); { Delete e-mail after download } ! 392: QWK_BYSELF =(1 shl 4); { Include messages from self } ! 393: QWK_UNUSED =(1 shl 5); { Currently unused } ! 394: QWK_EXPCTLA =(1 shl 6); { Expand ctrl-a codes to ascii } ! 395: QWK_RETCTLA =(1 shl 7); { Retain ctrl-a codes } ! 396: QWK_ATTACH =(1 shl 8); { Include file attachments } ! 397: QWK_NOINDEX =(1 shl 9); { Do not create index files in QWK } ! 398: QWK_TZ =(1 shl 10); { Include "@TZ" time zone in msgs } ! 399: QWK_VIA =(1 shl 11); { Include "@VIA" seen-bys in msgs } ! 400: QWK_NOCTRL =(1 shl 12); { No extraneous control files } ! 401: ! 402: {$R *.DFM} ! 403: ! 404: { Returns total number of users in database } ! 405: function TForm1.LastUser: Integer; ! 406: var Str: AnsiString; ! 407: f: TFileStream; ! 408: begin ! 409: Str:=data_dir+'user/user.dat'; ! 410: try ! 411: f:=TFileStream.Create(Str,fmOpenRead or fmShareDenyNone); ! 412: Result := f.Size div U_LEN; ! 413: f.Free; ! 414: except ! 415: Result := 0; ! 416: end; ! 417: end; ! 418: ! 419: procedure SaveChanges; ! 420: begin ! 421: if Application.MessageBox('Save Changes','User Modified',MB_YESNO)=IDYES ! 422: then ! 423: Form1.SaveUserExecute(Form1) ! 424: else ! 425: Form1.GetUserData(Form1.ScrollBar.Position); ! 426: end; ! 427: ! 428: { ************* } ! 429: { GET USER DATA } ! 430: { ************* } ! 431: ! 432: { Parses a single text data field } ! 433: function GetTextField(buf : PChar; maxlen : Integer): AnsiString; ! 434: var str: AnsiString; ! 435: len: Integer; ! 436: term: PChar; ! 437: begin ! 438: term:=StrScan(buf,ETX); { Look for end-of-text marker } ! 439: if term = nil then ! 440: len:=maxlen { not found? } ! 441: else ! 442: len:=Term-buf; ! 443: if len > maxlen then len:=maxlen; ! 444: SetString(str,buf,len); ! 445: Result:=str; ! 446: end; ! 447: ! 448: { Get a 16-bit decimal integer field } ! 449: function GetShortIntField(buf : PChar): AnsiString; ! 450: begin ! 451: Result:=GetTextField(buf,5); ! 452: end; ! 453: ! 454: { Get a 32-bit decimal integer field } ! 455: function GetLongIntField(buf : PChar): AnsiString; ! 456: begin ! 457: Result:=GetTextField(buf,10); ! 458: end; ! 459: ! 460: { Parses a flag field returning string with flag letters and spaces } ! 461: { This function can be used for exemptions and restrictions too } ! 462: function GetFlagsField(buf : PChar): AnsiString; ! 463: var str: AnsiString; ! 464: flagstr: AnsiString; ! 465: flags: Integer; ! 466: i: Integer; ! 467: begin ! 468: str:='0x'+GetTextField(buf,8); ! 469: flags:=StrToIntDef(str,0); ! 470: for i:=0 to 25 do ! 471: if flags AND (1 shl i) <> 0 then ! 472: flagstr:=flagstr+Char(65+i) ! 473: else ! 474: flagstr:=flagstr+' '; ! 475: Result:=TrimRight(flagstr); ! 476: end; ! 477: ! 478: { Get a hexadecimal integer field (of any size) } ! 479: function GetHexField(buf : PChar; maxlen : Integer): Integer; ! 480: var str: AnsiString; ! 481: begin ! 482: str:='0x'+GetTextField(buf,maxlen); ! 483: Result:=StrToIntDef(str,0); ! 484: end; ! 485: ! 486: { Convert a hexadecimal time field (in unix format) to xx/xx/YY } ! 487: function GetDateField(buf : PChar): AnsiString; ! 488: var str: AnsiString; ! 489: date: TDateTime; ! 490: time: Integer; ! 491: begin ! 492: str:='0x'+GetTextField(buf,8); ! 493: time:=StrToIntDef(str,0); ! 494: if time=0 then begin ! 495: Result:='00/00/00'; ! 496: Exit; ! 497: end; ! 498: time:=time div (24*60*60); { convert from seconds to days } ! 499: date:=EncodeDate(1970,1,1)+time; { convert to days since 1970 } ! 500: Result:=DateToStr(date); ! 501: end; ! 502: ! 503: { Reads a user data record to an Edit box and clears modified flag } ! 504: function GetUserText(Edit: Tedit; buf: PChar; maxlen: Integer) : AnsiString; ! 505: begin ! 506: Edit.Text:=GetTextField(buf,maxlen); ! 507: Edit.Tag:=0; { clear modified flag } ! 508: Edit.MaxLength:=maxlen; ! 509: Result:=Edit.Text; ! 510: end; ! 511: ! 512: { Reads a user data record to an Edit box and clears modified flag } ! 513: function GetUserShortInt(Edit: Tedit; buf: PChar) : AnsiString; ! 514: begin ! 515: GetUserText(Edit,buf,5); ! 516: Result:=Edit.Text; ! 517: end; ! 518: ! 519: { Reads a user data record to an Edit box and clears modified flag } ! 520: function GetUserLongInt(Edit: Tedit; buf: PChar) : AnsiString; ! 521: begin ! 522: GetUserText(Edit,buf,10); ! 523: Result:=Edit.Text; ! 524: end; ! 525: ! 526: { Reads and parses a single user record, filling in edit boxes, etc. } ! 527: procedure TForm1.GetUserData(usernumber: Integer); ! 528: var Str: AnsiString; ! 529: f: TFileStream; ! 530: buf: array[0..U_LEN] of Char; ! 531: begin ! 532: { Open file and read user record } ! 533: Str:=data_dir+'user/user.dat'; ! 534: try ! 535: f:=TFileStream.Create(Str,fmOpenRead or fmShareDenyNone); ! 536: except ! 537: Exit; ! 538: end; ! 539: f.Seek((usernumber-1)*U_LEN,soFromBeginning); ! 540: f.Read(buf,U_LEN); ! 541: f.Free; ! 542: ! 543: { ********************** } ! 544: { Parse user data buffer } ! 545: { ********************** } ! 546: ! 547: { Personal } ! 548: GetUserText(AliasEdit,buf+U_ALIAS,LEN_ALIAS); ! 549: GetUserText(NameEdit,buf+U_NAME,LEN_NAME); ! 550: GetUserText(HandleEdit,buf+U_HANDLE,LEN_HANDLE); ! 551: GetUserText(ComputerEdit,buf+U_COMP,LEN_COMP); ! 552: GetUserText(NetMailEdit,buf+U_NETMAIL,LEN_NETMAIL); ! 553: GetUserText(AddressEdit,buf+U_ADDRESS,LEN_ADDRESS); ! 554: GetUserText(LocationEdit,buf+U_LOCATION,LEN_LOCATION); ! 555: GetUserText(NoteEdit,buf+U_NOTE,LEN_NOTE); ! 556: GetUserText(BirthDateEdit,buf+U_BIRTH,LEN_BIRTH); ! 557: GetUserText(PasswordEdit,buf+U_PASS,LEN_PASS); ! 558: GetUserText(ModemEdit,buf+U_MODEM,LEN_MODEM); ! 559: GetUserText(ZipCodeEdit,buf+U_ZIPCODE,LEN_ZIPCODE); ! 560: GetUserText(SexEdit,buf+U_SEX,1); ! 561: GetUserText(PhoneEdit,buf+U_PHONE,LEN_PHONE); ! 562: GetUserText(CommentEdit,buf+U_COMMENT,LEN_COMMENT); ! 563: ! 564: { Settings } ! 565: GetUserText(RowsEdit,buf+U_ROWS,2); ! 566: GetUserText(ShellEdit,buf+U_SHELL,8); ! 567: GetUserText(EditorEdit,buf+U_XEDIT,8); ! 568: GetUserText(ProtocolEdit,buf+U_PROT,1); ! 569: GetUserText(TempFileExtEdit,buf+U_TMPEXT,3); ! 570: ! 571: { Read 'misc' bit-field } ! 572: user_misc:=GetHexField(buf+U_MISC,8); ! 573: ExpertCheckBox.Checked:=user_misc AND EXPERT <> 0; ! 574: ExpertCheckBox.Tag:=0; ! 575: ! 576: TerminalCheckListBox.Checked[0]:=user_misc AND AUTOTERM <> 0; ! 577: TerminalCheckListBox.Checked[1]:=user_misc AND NO_EXASCII = 0; ! 578: TerminalCheckListBox.Checked[2]:=user_misc AND ANSI <> 0; ! 579: TerminalCheckListBox.Checked[3]:=user_misc AND UCOLOR <> 0; ! 580: TerminalCheckListBox.Checked[4]:=user_misc AND RIP <> 0; ! 581: TerminalCheckListBox.Checked[5]:=user_misc AND WIP <> 0; ! 582: TerminalCheckListBox.Checked[6]:=user_misc AND UPAUSE <> 0; ! 583: TerminalCheckListBox.Checked[7]:=user_misc AND COLDKEYS = 0; ! 584: TerminalCheckListBox.Checked[8]:=user_misc AND SPIN <> 0; ! 585: TerminalCheckListBox.Tag:=0; ! 586: ! 587: MessageCheckListBox.Checked[0]:=user_misc AND NETMAIL <> 0; ! 588: MessageCheckListBox.Checked[1]:=user_misc AND CLRSCRN <> 0; ! 589: MessageCheckListBox.Tag:=0; ! 590: ! 591: FileCheckListBox.Checked[0]:=user_misc AND ANFSCAN <> 0; ! 592: FileCheckListBox.Checked[1]:=user_misc AND EXTDESC <> 0; ! 593: FileCheckListBox.Checked[2]:=user_misc AND BATCHFLAG <> 0; ! 594: FileCheckListBox.Checked[3]:=user_misc AND AUTOHANG <> 0; ! 595: FileCheckListBox.Tag:=0; ! 596: ! 597: LogonCheckListBox.Checked[0]:=user_misc AND ASK_NSCAN <> 0; ! 598: LogonCheckListBox.Checked[1]:=user_misc AND ASK_SSCAN <> 0; ! 599: LogonCheckListBox.Checked[2]:=user_misc AND CURSUB <> 0; ! 600: LogonCheckListBox.Checked[3]:=user_misc AND QUIET <> 0; ! 601: LogonCheckListBox.Checked[4]:=user_misc AND AUTOLOGON <> 0; ! 602: LogonCheckListBox.Tag:=0; ! 603: ! 604: { Read 'QWK' bit-field } ! 605: user_qwk:=GetHexField(buf+U_QWK,8); ! 606: QWKCheckListBox.Checked[0]:=user_qwk AND QWK_FILES <> 0; ! 607: QWKCheckListBox.Checked[1]:=user_qwk AND QWK_EMAIL <> 0; ! 608: QWKCheckListBox.Checked[2]:=user_qwk AND QWK_ALLMAIL <> 0; ! 609: QWKCheckListBox.Checked[3]:=user_qwk AND QWK_DELMAIL <> 0; ! 610: QWKCheckListBox.Checked[4]:=user_qwk AND QWK_BYSELF <> 0; ! 611: QWKCheckListBox.Checked[5]:=user_qwk AND QWK_EXPCTLA <> 0; ! 612: QWKCheckListBox.Checked[6]:=user_qwk AND QWK_RETCTLA = 0; ! 613: QWKCheckListBox.Checked[7]:=user_qwk AND QWK_ATTACH <> 0; ! 614: QWKCheckListBox.Checked[8]:=user_qwk AND QWK_NOINDEX <> 0; ! 615: QWKCheckListBox.Checked[9]:=user_qwk AND QWK_TZ <> 0; ! 616: QWKCheckListBox.Checked[10]:=user_qwk AND QWK_VIA <> 0; ! 617: QWKCheckListBox.Checked[11]:=user_qwk AND QWK_NOCTRL = 0; ! 618: QWKCheckListBox.Tag:=0; ! 619: ! 620: { Read 'chat' bit-field } ! 621: user_chat:=GetHexField(buf+U_CHAT,8); ! 622: ChatCheckListBox.Checked[0]:=user_chat AND CHAT_ECHO <> 0; ! 623: ChatCheckListBox.Checked[1]:=user_chat AND CHAT_ACTION <> 0; ! 624: ChatCheckListBox.Checked[2]:=user_chat AND CHAT_NOPAGE = 0; ! 625: ChatCheckListBox.Checked[3]:=user_chat AND CHAT_NOACT = 0; ! 626: ChatCheckListBox.Checked[4]:=user_chat AND CHAT_SPLITP <> 0; ! 627: ChatCheckListBox.Tag:=0; ! 628: ! 629: { Initialize controls based on bits set/unset } ! 630: if user_misc AND DELETED <> 0 then begin ! 631: Status.Text := 'Deleted User'; ! 632: Status.Color := clRed; ! 633: end ! 634: else if user_misc AND INACTIVE <> 0 then begin ! 635: Status.Text := 'Inactive User'; ! 636: Status.Color := clYellow; ! 637: end ! 638: else begin ! 639: Status.Text := 'Active User'; ! 640: Status.Color := clMenu; ! 641: end; ! 642: ! 643: { Security } ! 644: GetUserText(LevelEdit,buf+U_LEVEL,2); ! 645: ExpireEdit.Text:=GetDateField(buf+U_EXPIRE); ! 646: ExpireEdit.Tag:=0; ! 647: Flags1Edit.Text:=GetFlagsField(buf+U_FLAGS1); ! 648: Flags1Edit.Tag:=0; ! 649: Flags2Edit.Text:=GetFlagsField(buf+U_FLAGS2); ! 650: Flags2Edit.Tag:=0; ! 651: Flags3Edit.Text:=GetFlagsField(buf+U_FLAGS3); ! 652: Flags3Edit.Tag:=0; ! 653: Flags4Edit.Text:=GetFlagsField(buf+U_FLAGS4); ! 654: Flags4Edit.Tag:=0; ! 655: ExemptionsEdit.Text:=GetFlagsField(buf+U_EXEMPT); ! 656: ExemptionsEdit.Tag:=0; ! 657: RestrictionsEdit.Text:=GetFlagsField(buf+U_REST); ! 658: RestrictionsEdit.Tag:=0; ! 659: GetUserLongInt(CreditsEdit,buf+U_CDT); ! 660: GetUserLongInt(FreeCreditsEdit,buf+U_FREECDT); ! 661: GetUserLongInt(MinutesEdit,buf+U_MIN); ! 662: ! 663: { Stats } ! 664: FirstOnEdit.Text:=GetDateField(buf+U_FIRSTON); ! 665: FirstOnEdit.Tag:=0; ! 666: LastOnEdit.Text:=GetDateField(buf+U_LASTON); ! 667: LastOnEdit.Tag:=0; ! 668: GetUserShortInt(LogonsEdit,buf+U_LOGONS); ! 669: GetUserShortInt(LogonsTodayEdit,buf+U_LTODAY); ! 670: GetUserShortInt(TimeOnEdit,buf+U_TIMEON); ! 671: GetUserShortInt(LastCallTimeEdit,buf+U_TLAST); ! 672: GetUserShortInt(TimeOnTodayEdit,buf+U_TTODAY); ! 673: GetUserShortInt(ExtraTimeEdit,buf+U_TEXTRA); ! 674: GetUserShortInt(PostsTotalEdit,buf+U_POSTS); ! 675: GetUserShortInt(PostsTodayEdit,buf+U_PTODAY); ! 676: GetUserShortInt(EmailTotalEdit,buf+U_EMAILS); ! 677: GetUserShortInt(EmailTodayEdit,buf+U_ETODAY); ! 678: GetUserShortInt(FeedbackEdit,buf+U_FBACKS); ! 679: GetUserShortInt(UploadedFilesEdit,buf+U_ULS); ! 680: GetUserLongInt(UploadedBytesEdit,buf+U_ULB); ! 681: GetUserShortInt(DownloadedFilesEdit,buf+U_DLS); ! 682: GetUserLongInt(DownloadedBytesEdit,buf+U_DLB); ! 683: LeechEdit.Text:=IntToStr(GetHexField(buf+U_LEECH,2)); ! 684: ! 685: { etc... } ! 686: ! 687: { Extended Comment } ! 688: Memo.Lines.Clear(); ! 689: Str:=data_dir+Format('USER/%.4d.MSG',[usernumber]); ! 690: if FileExists(Str) then Memo.Lines.LoadFromFile(Str); ! 691: Memo.Tag:=0; ! 692: ! 693: { Update User Number } ! 694: NumberEdit.Text:=IntToStr(ScrollBar.Position); ! 695: SaveUser.Enabled:=false; { no changes have been made yet } ! 696: end; ! 697: ! 698: { ************* } ! 699: { PUT USER DATA } ! 700: { ************* } ! 701: ! 702: { Encodes a single text data field (of any length) } ! 703: procedure PutTextField(buf : PChar; str : AnsiString; maxlen : Integer); ! 704: var len:Integer; ! 705: i:Integer; ! 706: begin ! 707: for i:=0 to maxlen-1 do buf[i]:=ETX; ! 708: len:=Length(str); ! 709: if len > maxlen then len:=maxlen; ! 710: for i:=0 to len-1 do buf[i]:=str[i+1]; ! 711: end; ! 712: ! 713: { Encodes a flag field (A-Z) into a 32-bit Hex string } ! 714: procedure PutFlagsField(buf : PChar; str : AnsiString); ! 715: var flags: Integer; ! 716: i:Integer; ! 717: begin ! 718: flags:=0; ! 719: for i:=0 to 25 do ! 720: if Pos(Chr(65+i),str) <> 0 then ! 721: flags:=flags OR (1 shl i); ! 722: PutTextField(buf,IntToHex(flags,8),8); ! 723: end; ! 724: ! 725: { Converts a date string in xx/xx/YY format into a unix time_t format in hex } ! 726: procedure PutDateField(buf : PChar; str : AnsiString); ! 727: var val: Integer; ! 728: begin ! 729: { convert to days since 1970 } ! 730: try ! 731: val:=Round(StrToDate(str)-EncodeDate(1970,1,1)); ! 732: except ! 733: val:=0; ! 734: end; ! 735: if val < 0 then val:=0; ! 736: { convert from days to seconds } ! 737: val:=val*(24*60*60); ! 738: PutTextField(buf,IntToHex(val,8),8); ! 739: end; ! 740: ! 741: { Writes to a 16-bit decimal integer field } ! 742: procedure PutShortIntField(buf : PChar; str : AnsiString); ! 743: begin ! 744: PutTextField(buf, str, 5); ! 745: end; ! 746: ! 747: { Writes to a 32-bit decimal integer field } ! 748: procedure PutLongIntField(buf : PChar; str : AnsiString); ! 749: begin ! 750: PutTextField(buf, str, 10); ! 751: end; ! 752: ! 753: { Writes to a hexadecimal integer field (of any length) } ! 754: procedure PutHexField(buf : PChar; val : Integer; maxlen : Integer); ! 755: begin ! 756: PutTextField(buf,IntToHex(val,maxlen),maxlen); ! 757: end; ! 758: ! 759: { Writes a user Edit box's contents to the buffer, if changed, resets Tag } ! 760: procedure PutUserText(Edit:Tedit; buf:PChar; maxlen:Integer); ! 761: begin ! 762: if Edit.Tag = 1 then { field modified, change record } ! 763: PutTextField(buf,Edit.Text,maxlen); ! 764: Edit.Tag:=0; { clear modified flag } ! 765: end; ! 766: ! 767: { Writes a flag Edit box's contents to the buffer, if changed } ! 768: { This function can be used for exemptions and restrictions too } ! 769: procedure PutUserFlags(Edit:Tedit; buf:PChar); ! 770: begin ! 771: if Edit.Tag = 1 then { field modified, change record } ! 772: PutFlagsField(buf,Edit.Text); ! 773: Edit.Tag:=0; { clear modified flag } ! 774: end; ! 775: ! 776: { Writes a 16-bit integer Edit box's contents to the buffer, if changed } ! 777: procedure PutUserShortInt(Edit:Tedit; buf:PChar); ! 778: begin ! 779: if Edit.Tag = 1 then { field modified, change record } ! 780: PutTextField(buf,Edit.Text,5); ! 781: Edit.Tag:=0; { clear modified flag } ! 782: end; ! 783: ! 784: { Writes a 32-bit integer Edit box's contents to the buffer, if changed } ! 785: procedure PutUserLongInt(Edit:Tedit; buf:PChar); ! 786: begin ! 787: if Edit.Tag = 1 then { field modified, change record } ! 788: PutTextField(buf,Edit.Text,10); ! 789: Edit.Tag:=0; { clear modified flag } ! 790: end; ! 791: ! 792: { Writes a date Edit box's contents to the buffer, if changed } ! 793: procedure PutUserDate(Edit:Tedit; buf:PChar); ! 794: begin ! 795: if Edit.Tag = 1 then { field modified, change record } ! 796: PutDateField(buf,Edit.Text); ! 797: Edit.Tag:=0; { clear modified flag } ! 798: end; ! 799: ! 800: function SetBit(set_it: bool; field: Cardinal; bit: Cardinal): Cardinal; ! 801: begin ! 802: if set_it then ! 803: Result:=field OR bit { set bit } ! 804: else ! 805: Result:=field AND NOT bit; { clear bit } ! 806: end; ! 807: ! 808: { Writes a complete user record. } ! 809: procedure TForm1.PutUserData(usernumber:Integer); ! 810: var Str: AnsiString; ! 811: f: TFileStream; ! 812: i: Integer; ! 813: buf: array[0..U_LEN] of Char; ! 814: begin ! 815: if AliasEdit.Tag = 1 then begin ! 816: { Set-up buffer for NAME.DAT record } ! 817: if user_misc AND DELETED <> 0 then ! 818: PutTextField(buf,'',LEN_ALIAS) ! 819: else ! 820: PutTextField(buf,AliasEdit.Text,LEN_ALIAS); ! 821: buf[LEN_ALIAS]:=CR; ! 822: buf[LEN_ALIAS+1]:=LF; ! 823: ! 824: { Open NAME.DAT write user name } ! 825: Str:=data_dir+'USER/NAME.DAT'; ! 826: if FileExists(Str) then ! 827: f:=TFileStream.Create(Str,fmOpenWrite or fmShareExclusive) ! 828: else ! 829: f:=TFileStream.Create(Str,fmCreate or fmShareExclusive); ! 830: f.Seek((usernumber-1)*(LEN_ALIAS+2),soFromBeginning); ! 831: f.Write(buf,LEN_ALIAS+2); ! 832: f.Free; ! 833: end; ! 834: ! 835: { Initialize USER record buffer } ! 836: for i:=0 to U_LEN-1 do buf[i]:=ETX; ! 837: ! 838: { Open file and read current user record } ! 839: Str:=data_dir+'user/user.dat'; ! 840: if FileExists(Str) then ! 841: f:=TFileStream.Create(Str,fmOpenReadWrite or fmShareExclusive) ! 842: else ! 843: f:=TFileStream.Create(Str,fmCreate or fmShareExclusive); ! 844: ! 845: f.Seek((usernumber-1)*U_LEN,soFromBeginning); ! 846: f.Read(buf,U_LEN); ! 847: ! 848: { Update changed fields } ! 849: PutUserText(AliasEdit,buf+U_ALIAS,LEN_ALIAS); ! 850: PutUserText(NameEdit,buf+U_NAME,LEN_NAME); ! 851: PutUserText(HandleEdit,buf+U_HANDLE,LEN_HANDLE); ! 852: PutUserText(ComputerEdit,buf+U_COMP,LEN_COMP); ! 853: PutUserText(NetMailEdit,buf+U_NETMAIL,LEN_NETMAIL); ! 854: PutUserText(AddressEdit,buf+U_ADDRESS,LEN_ADDRESS); ! 855: PutUserText(LocationEdit,buf+U_LOCATION,LEN_LOCATION); ! 856: PutUserText(NoteEdit,buf+U_NOTE,LEN_NOTE); ! 857: PutUserText(ZipCodeEdit,buf+U_ZIPCODE,LEN_ZIPCODE); ! 858: PutUserText(PasswordEdit,buf+U_PASS,LEN_PASS); ! 859: PutUserText(PhoneEdit,buf+U_PHONE,LEN_PHONE); ! 860: PutUserText(BirthDateEdit,buf+U_BIRTH,LEN_BIRTH); ! 861: PutUserText(ModemEdit,buf+U_MODEM,LEN_MODEM); ! 862: PutUserText(SexEdit,buf+U_SEX,1); ! 863: PutUserText(CommentEdit,buf+U_COMMENT,LEN_COMMENT); ! 864: { etc. } ! 865: ! 866: { Settings } ! 867: PutUserText(RowsEdit,buf+U_ROWS,2); ! 868: PutUserText(ShellEdit,buf+U_SHELL,8); ! 869: PutUserText(EditorEdit,buf+U_XEDIT,8); ! 870: PutUserText(ProtocolEdit,buf+U_PROT,1); ! 871: PutUserText(TempFileExtEdit,buf+U_TMPEXT,3); ! 872: ! 873: { Write MISC bit-field} ! 874: if (ExpertCheckBox.Tag = 1) ! 875: or (LogonCheckListBox.Tag = 1) ! 876: or (TerminalCheckListBox.Tag = 1) ! 877: or (MessageCheckListBox.Tag = 1) ! 878: or (FileCheckListBox.Tag = 1) ! 879: then begin ! 880: user_misc:=SetBit(ExpertCheckBox.Checked, user_misc, EXPERT); ! 881: ! 882: { TerminalCeckListBox } ! 883: user_misc:=SetBit(TerminalCheckListBox.Checked[0],user_misc,AUTOTERM); ! 884: user_misc:=SetBit(NOT TerminalCheckListBox.Checked[1],user_misc,NO_EXASCII); ! 885: user_misc:=SetBit(TerminalCheckListBox.Checked[2],user_misc,ANSI); ! 886: user_misc:=SetBit(TerminalCheckListBox.Checked[3],user_misc,UCOLOR); ! 887: user_misc:=SetBit(TerminalCheckListBox.Checked[4],user_misc,RIP); ! 888: user_misc:=SetBit(TerminalCheckListBox.Checked[5],user_misc,WIP); ! 889: user_misc:=SetBit(TerminalCheckListBox.Checked[6],user_misc,UPAUSE); ! 890: user_misc:=SetBit(NOT TerminalCheckListBox.Checked[7],user_misc,COLDKEYS); ! 891: user_misc:=SetBit(TerminalCheckListBox.Checked[8],user_misc,SPIN); ! 892: ! 893: { MessageCheckListBox } ! 894: user_misc:=SetBit(MessageCheckListBox.Checked[0],user_misc,NETMAIL); ! 895: user_misc:=SetBit(MessageCheckListBox.Checked[1],user_misc,CLRSCRN); ! 896: ! 897: { FileCheckListBox } ! 898: user_misc:=SetBit(FileCheckListBox.Checked[0],user_misc,ANFSCAN); ! 899: user_misc:=SetBit(FileCheckListBox.Checked[1],user_misc,EXTDESC); ! 900: user_misc:=SetBit(FileCheckListBox.Checked[2],user_misc,BATCHFLAG); ! 901: user_misc:=SetBit(FileCheckListBox.Checked[3],user_misc,AUTOHANG); ! 902: ! 903: { LogonCheckListBox } ! 904: user_misc:=SetBit(LogonCheckListBox.Checked[0],user_misc,ASK_NSCAN); ! 905: user_misc:=SetBit(LogonCheckListBox.Checked[1],user_misc,ASK_SSCAN); ! 906: user_misc:=SetBit(LogonCheckListBox.Checked[2],user_misc,CURSUB); ! 907: user_misc:=SetBit(LogonCheckListBox.Checked[3],user_misc,QUIET); ! 908: user_misc:=SetBit(LogonCheckListBox.Checked[4],user_misc,AUTOLOGON); ! 909: ! 910: PutHexField(buf+U_MISC, user_misc, 8); ! 911: end; ! 912: ! 913: if (ChatCheckListBox.Tag = 1) then begin ! 914: user_chat:=SetBit(ChatCheckListBox.Checked[0],user_chat,CHAT_ECHO); ! 915: user_chat:=SetBit(ChatCheckListBox.Checked[1],user_chat,CHAT_ACTION); ! 916: user_chat:=SetBit(NOT ChatCheckListBox.Checked[2],user_chat,CHAT_NOPAGE); ! 917: user_chat:=SetBit(NOT ChatCheckListBox.Checked[3],user_chat,CHAT_NOACT); ! 918: user_chat:=SetBit(ChatCheckListBox.Checked[4],user_chat,CHAT_SPLITP); ! 919: ! 920: PutHexField(buf+U_CHAT, user_chat, 8); ! 921: end; ! 922: ! 923: if (QWKCheckListBox.Tag =1) then begin ! 924: user_qwk:=SetBit(QWKCheckListBox.Checked[0],user_qwk,QWK_FILES); ! 925: user_qwk:=SetBit(QWKCheckListBox.Checked[1],user_qwk,QWK_EMAIL); ! 926: user_qwk:=SetBit(QWKCheckListBox.Checked[2],user_qwk,QWK_ALLMAIL); ! 927: user_qwk:=SetBit(QWKCheckListBox.Checked[3],user_qwk,QWK_DELMAIL); ! 928: user_qwk:=SetBit(QWKCheckListBox.Checked[4],user_qwk,QWK_BYSELF); ! 929: user_qwk:=SetBit(QWKCheckListBox.Checked[5],user_qwk,QWK_EXPCTLA); ! 930: user_qwk:=SetBit(NOT QWKCheckListBox.Checked[6],user_qwk,QWK_RETCTLA); ! 931: user_qwk:=SetBit(QWKCheckListBox.Checked[7],user_qwk,QWK_ATTACH); ! 932: user_qwk:=SetBit(QWKCheckListBox.Checked[8],user_qwk,QWK_NOINDEX); ! 933: user_qwk:=SetBit(QWKCheckListBox.Checked[9],user_qwk,QWK_TZ); ! 934: user_qwk:=SetBit(QWKCheckListBox.Checked[10],user_qwk,QWK_VIA); ! 935: user_qwk:=SetBit(NOT QWKCheckListBox.Checked[11],user_qwk,QWK_NOCTRL); ! 936: ! 937: PutHexField(buf+U_QWK, user_qwk, 8); ! 938: end; ! 939: ! 940: { Security } ! 941: PutUserText(LevelEdit,buf+U_LEVEL,2); ! 942: PutUserDate(ExpireEdit,buf+U_EXPIRE); ! 943: PutUserFlags(Flags1Edit,buf+U_FLAGS1); ! 944: PutUserFlags(Flags2Edit,buf+U_FLAGS2); ! 945: PutUserFlags(Flags3Edit,buf+U_FLAGS3); ! 946: PutUserFlags(Flags4Edit,buf+U_FLAGS4); ! 947: PutUserFlags(ExemptionsEdit,buf+U_EXEMPT); ! 948: PutUserFlags(RestrictionsEdit,buf+U_REST); ! 949: PutUserLongInt(CreditsEdit,buf+U_CDT); ! 950: PutUserLongInt(FreeCreditsEdit,buf+U_FREECDT); ! 951: PutUserLongInt(MinutesEdit,buf+U_MIN); ! 952: { etc. } ! 953: ! 954: { Stats } ! 955: PutUserDate(FirstOnEdit,buf+U_FIRSTON); ! 956: PutUserDate(LastOnEdit,buf+U_LASTON); ! 957: PutUserShortInt(LogonsEdit,buf+U_LOGONS); ! 958: PutUserShortInt(LogonsTodayEdit,buf+U_LTODAY); ! 959: PutUserShortInt(TimeOnEdit,buf+U_TIMEON); ! 960: PutUserShortInt(TimeOnTodayEdit,buf+U_TTODAY); ! 961: PutUserShortInt(LastCallTimeEdit,buf+U_TLAST); ! 962: PutUserShortInt(ExtraTimeEdit,buf+U_TEXTRA); ! 963: PutUserShortInt(PostsTotalEdit,buf+U_POSTS); ! 964: PutUserShortInt(PostsTodayEdit,buf+U_PTODAY); ! 965: PutUserShortInt(EmailTotalEdit,buf+U_EMAILS); ! 966: PutUserShortInt(EmailTodayEdit,buf+U_ETODAY); ! 967: PutUserShortInt(FeedbackEdit,buf+U_FBACKS); ! 968: PutUserShortInt(UploadedFilesEdit,buf+U_ULS); ! 969: PutUserLongInt(UploadedBytesEdit,buf+U_ULB); ! 970: PutUserShortInt(DownloadedFilesEdit,buf+U_DLS); ! 971: PutUserLongInt(DownloadedBytesEdit,buf+U_DLB); ! 972: PutHexField(buf+U_LEECH, StrToIntDef(LeechEdit.Text,0), 2); ! 973: { etc. } ! 974: ! 975: { Write user record and close file } ! 976: f.Seek((usernumber-1)*U_LEN,soFromBeginning); ! 977: f.Write(buf,U_LEN); ! 978: f.Free; ! 979: ! 980: { Extended Comemnt } ! 981: if Memo.Tag = 1 then begin ! 982: Str:=data_dir+Format('USER/%.4d.MSG',[usernumber]); ! 983: if Memo.Lines.Count<>0 then ! 984: Memo.Lines.SaveToFile(Str) ! 985: else ! 986: DeleteFile(Str); ! 987: end; ! 988: ! 989: SaveUser.Enabled:=false; ! 990: end; ! 991: ! 992: { ********* } ! 993: { MAIN FORM } ! 994: { ********* } ! 995: ! 996: { There's probably a better place to do this init stuff... constructor? } ! 997: procedure TForm1.FormShow(Sender: TObject); ! 998: begin ! 999: ! 1000: { Over-ride Locale settings here } ! 1001: DateSeparator:='/'; ! 1002: ! 1003: if (ShortDateFormat = 'M/d/yy') ! 1004: or (ShortDateFormat = 'M/d/yyyy') ! 1005: or (ShortDateFormat = 'MM/dd/yy') ! 1006: or (ShortDateFormat = 'MM/dd/yyyy') ! 1007: then ! 1008: ShortDateFormat:='mm/dd/yy' { American } ! 1009: else ! 1010: ShortDateFormat:='dd/mm/yy'; { European } ! 1011: ! 1012: data_dir:=ParamStr(1); ! 1013: { if Length(data_dir)=0 then data_dir:='.\'; } ! 1014: ! 1015: users:=LastUser(); ! 1016: ! 1017: if users = 0 then { Create user if none exist } ! 1018: users:=1; ! 1019: ! 1020: ScrollBar.Min:=1; ! 1021: ScrollBar.Max:=users; ! 1022: TotalStaticText.Caption:='of '+IntToStr(users); ! 1023: { *********************************** } ! 1024: { Set max lengths for edit boxes here } ! 1025: { *********************************** } ! 1026: { Personal } ! 1027: AliasEdit.MaxLength:=LEN_ALIAS; ! 1028: NameEdit.MaxLength:=LEN_NAME; ! 1029: PhoneEdit.MaxLength:=LEN_PHONE; ! 1030: HandleEdit.MaxLength:=LEN_HANDLE; ! 1031: ComputerEdit.MaxLength:=LEN_COMP; ! 1032: AddressEdit.MaxLength:=LEN_ADDRESS; ! 1033: LocationEdit.MaxLength:=LEN_LOCATION; ! 1034: ZipCodeEdit.MaxLength:=LEN_ZIPCODE; ! 1035: ModemEdit.MaxLength:=LEN_MODEM; ! 1036: CommentEdit.MaxLength:=LEN_COMMENT; ! 1037: { Security } ! 1038: PasswordEdit.MaxLength:=LEN_PASS; ! 1039: PhoneEdit.MaxLength:=LEN_PHONE; ! 1040: ModemEdit.MaxLength:=LEN_MODEM; ! 1041: SexEdit.MaxLength:=1; ! 1042: { Stats } ! 1043: { etc. } ! 1044: ! 1045: ScrollBar.Position:=StrToIntDef(ParamStr(2),1); ! 1046: GetUserData(ScrollBar.Position); ! 1047: ! 1048: PageControl.ActivePage:=PersonalTabSheet; ! 1049: end; ! 1050: ! 1051: { Change user } ! 1052: procedure TForm1.ScrollBarChange(Sender: TObject); ! 1053: begin ! 1054: if SaveUser.Enabled then SaveChanges(); ! 1055: users:=LastUser(); { this could change dynamically } ! 1056: ScrollBar.Max:=users; ! 1057: TotalStaticText.Caption:='of '+IntToStr(users); ! 1058: GetUserData(ScrollBar.Position); ! 1059: end; ! 1060: ! 1061: { Better than on OnChange event, waits til users hits enter key } ! 1062: procedure TForm1.NumberEditKeyPress(Sender: TObject; var Key: Char); ! 1063: var val : Integer; ! 1064: begin ! 1065: if Key <> #13 then Exit; ! 1066: users:=lastuser; ! 1067: val:=StrToIntDef(NumberEdit.Text,0); ! 1068: if (val = 0) or (val > users) then ! 1069: NumberEdit.Text:=IntToStr(ScrollBar.Position) ! 1070: else begin ! 1071: ScrollBar.Position:=val; ! 1072: GetUserData(val); ! 1073: Key:=#0; ! 1074: end ! 1075: end; ! 1076: ! 1077: procedure TForm1.FileExitMenuItemClick(Sender: TObject); ! 1078: begin ! 1079: Close; ! 1080: end; ! 1081: ! 1082: { OnChange event for ALL User Data Edit boxes } ! 1083: procedure TForm1.EditChange(Sender: TObject); ! 1084: begin ! 1085: SaveUser.Enabled:=true; ! 1086: (Sender as TComponent).Tag:=1; { Mark as modified } ! 1087: end; ! 1088: ! 1089: { Create a New User record } ! 1090: procedure TForm1.SaveUserExecute(Sender: TObject); ! 1091: begin ! 1092: PutUserData(StrToIntDef(NumberEdit.Text,ScrollBar.Position)); ! 1093: end; ! 1094: ! 1095: procedure TForm1.NewUserExecute(Sender: TObject); ! 1096: begin ! 1097: if SaveUser.Enabled then SaveChanges(); ! 1098: ! 1099: { New users's number } ! 1100: users:=lastuser()+1; ! 1101: ! 1102: { Initialize fields to default values } ! 1103: AliasEdit.Text:='New User'; ! 1104: AliasEdit.Tag := 1; ! 1105: LevelEdit.Text:='10'; ! 1106: LevelEdit.Tag :=1; ! 1107: FirstOnEdit.Text:=DatetoStr(Date); ! 1108: FirstOnEdit.Tag :=1; ! 1109: LastOnEdit.Text:=DateToStr(Date); ! 1110: LastOnEdit.Tag :=1; ! 1111: TerminalCheckListBox.Checked[0] := true; // AUTOTERM ! 1112: TerminalCheckListBox.Checked[1] := true; // EXASCII ! 1113: TerminalCheckListBox.Checked[2] := true; // ANSI ! 1114: TerminalCheckListBox.Checked[3] := true; // COLOR ! 1115: TerminalCheckListBox.Checked[6] := true; // UPAUSE ! 1116: TerminalCheckListBox.Checked[7] := true; // HOTKEYS ! 1117: FileCheckListBox.Checked[2] := true; // BATCHFLAG ! 1118: LogonCheckListBox.Tag:=1; ! 1119: ! 1120: { Create the new record } ! 1121: PutUserData(users); ! 1122: ! 1123: { Set scroll bar and usernumber text } ! 1124: ScrollBar.Max:=users; ! 1125: ScrollBar.Position:=users; ! 1126: NumberEdit.Text:=IntToStr(users); ! 1127: ! 1128: end; ! 1129: ! 1130: procedure TForm1.DeleteUserExecute(Sender: TObject); ! 1131: begin ! 1132: user_misc:=user_misc xor DELETED; ! 1133: LogonCheckListBox.Tag:=1; { flag as modified } ! 1134: AliasEdit.Tag := 1; ! 1135: PutUserData(ScrollBar.Position); ! 1136: GetUserData(ScrollBar.Position); ! 1137: end; ! 1138: ! 1139: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); ! 1140: begin ! 1141: if SaveUser.Enabled then SaveChanges(); ! 1142: end; ! 1143: ! 1144: procedure TForm1.DeactivateUserExecute(Sender: TObject); ! 1145: begin ! 1146: user_misc:=user_misc xor INACTIVE; ! 1147: LogonCheckListBox.Tag:=1; { flag as modified } ! 1148: PutUserData(ScrollBar.Position); ! 1149: GetUserData(ScrollBar.Position); ! 1150: end; ! 1151: ! 1152: procedure TForm1.FindButtonClick(Sender: TObject); ! 1153: var Str: AnsiString; ! 1154: SearchStr: AnsiString; ! 1155: f: TFileStream; ! 1156: usernumber: Integer; ! 1157: buf: array[0..U_LEN] of Char; ! 1158: begin ! 1159: SearchStr:=AnsiUpperCase(FindEdit.Text); ! 1160: usernumber:=0; ! 1161: { Open USER.DAT to search for string } ! 1162: Str:=data_dir+'user/user.dat'; ! 1163: if not FileExists(Str) then Exit; ! 1164: f:=TFileStream.Create(Str,fmOpenRead or fmShareDenyNone); ! 1165: if Sender = FindNextButton then ! 1166: f.Seek((ScrollBar.Position)*(U_LEN),soFromBeginning); ! 1167: while (f.Position < f.Size) and (usernumber=0) do begin ! 1168: f.Read(buf,U_LEN); ! 1169: SetString(Str,buf,U_LEN); ! 1170: Str:=AnsiUpperCase(Str); ! 1171: if Pos(SearchStr,Str) <> 0 then ! 1172: usernumber:=f.Position div (U_LEN); ! 1173: end; ! 1174: f.Free; ! 1175: if usernumber <> 0 then begin ! 1176: ScrollBar.Position:=usernumber; ! 1177: end; ! 1178: end; ! 1179: ! 1180: procedure TForm1.FindEditKeyPress(Sender: TObject; var Key: Char); ! 1181: begin ! 1182: if Key = #13 then begin ! 1183: FindButtonClick(Sender); ! 1184: Key:=#0; ! 1185: end; ! 1186: end; ! 1187: ! 1188: end.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.