home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / lora299s.zip / EVENTS.CPP < prev    next >
C/C++ Source or Header  |  1998-05-12  |  12KB  |  442 lines

  1.  
  2. // LoraBBS Version 2.99 Free Edition
  3. // Copyright (C) 1987-98 Marco Maccaferri
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #include "_ldefs.h"
  20. #include "lora_api.h"
  21.  
  22. TEvents::TEvents (void)
  23. {
  24.    strcpy (DataFile, "events.dat");
  25.    Data.Clear ();
  26. }
  27.  
  28. TEvents::TEvents (PSZ pszDataFile)
  29. {
  30.    strcpy (DataFile, pszDataFile);
  31.    strlwr (DataFile);
  32.    if (strchr (DataFile, '.') == NULL)
  33.       strcat (DataFile, ".dat");
  34.    Data.Clear ();
  35.  
  36.    AdjustPath (DataFile);
  37. }
  38.  
  39. TEvents::~TEvents (void)
  40. {
  41.    Data.Clear ();
  42. }
  43.  
  44. VOID TEvents::Class2Struct (EVENT *Event)
  45. {
  46.    memset (Event, 0, sizeof (EVENT));
  47.  
  48.    strcpy (Event->Label, Label);
  49.    Event->Hour = Hour;
  50.    Event->Minute = Minute;
  51.    if (Sunday == TRUE)
  52.       Event->WeekDays |= DAY_SUNDAY;
  53.    if (Monday == TRUE)
  54.       Event->WeekDays |= DAY_MONDAY;
  55.    if (Tuesday == TRUE)
  56.       Event->WeekDays |= DAY_TUESDAY;
  57.    if (Wednesday == TRUE)
  58.       Event->WeekDays |= DAY_WEDNESDAY;
  59.    if (Thursday == TRUE)
  60.       Event->WeekDays |= DAY_THURSDAY;
  61.    if (Friday == TRUE)
  62.       Event->WeekDays |= DAY_FRIDAY;
  63.    if (Saturday == TRUE)
  64.       Event->WeekDays |= DAY_SATURDAY;
  65.    Event->Length = Length;
  66.    Event->LastDay = LastDay;
  67.    Event->Dynamic = Dynamic;
  68.    Event->Force = Force;
  69.    Event->MailOnly = MailOnly;
  70.    Event->ForceCall = ForceCall;
  71.    strcpy (Event->Address, Address);
  72.    Event->SendNormal = SendNormal;
  73.    Event->SendCrash = SendCrash;
  74.    Event->SendDirect = SendDirect;
  75.    Event->SendImmediate = SendImmediate;
  76.    Event->CallDelay = CallDelay;
  77.    Event->StartImport = StartImport;
  78.    Event->StartExport = StartExport;
  79.    Event->ExportMail = ExportMail;
  80.    Event->ImportNormal = ImportNormal;
  81.    Event->ImportKnown = ImportKnown;
  82.    Event->ImportProtected = ImportProtected;
  83.    strcpy (Event->RouteCmd, RouteCmd);
  84.    strcpy (Event->Command, Command);
  85.    Event->MaxCalls = MaxCalls;
  86.    Event->MaxConnects = MaxConnects;
  87.    Event->AllowRequests = AllowRequests;
  88.    Event->MakeRequests = MakeRequests;
  89.    Event->ProcessTIC = ProcessTIC;
  90.    Event->ClockAdjustment = ClockAdjustment;
  91.    Event->Completed = Completed;
  92. }
  93.  
  94. VOID TEvents::Struct2Class (EVENT *Event)
  95. {
  96.    strcpy (Label, Event->Label);
  97.    Hour = Event->Hour;
  98.    Minute = Event->Minute;
  99.    Sunday = Monday = Tuesday = Wednesday = Thursday = Friday = Saturday = FALSE;
  100.    if (Event->WeekDays & DAY_SUNDAY)
  101.       Sunday = TRUE;
  102.    if (Event->WeekDays & DAY_MONDAY)
  103.       Monday = TRUE;
  104.    if (Event->WeekDays & DAY_TUESDAY)
  105.       Tuesday = TRUE;
  106.    if (Event->WeekDays & DAY_WEDNESDAY)
  107.       Wednesday = TRUE;
  108.    if (Event->WeekDays & DAY_THURSDAY)
  109.       Thursday = TRUE;
  110.    if (Event->WeekDays & DAY_FRIDAY)
  111.       Friday = TRUE;
  112.    if (Event->WeekDays & DAY_SATURDAY)
  113.       Saturday = TRUE;
  114.    Length = Event->Length;
  115.    LastDay = Event->LastDay;
  116.    Dynamic = Event->Dynamic;
  117.    Force = Event->Force;
  118.    MailOnly = Event->MailOnly;
  119.    ForceCall = Event->ForceCall;
  120.    strcpy (Address, Event->Address);
  121.    SendNormal = Event->SendNormal;
  122.    SendCrash = Event->SendCrash;
  123.    SendDirect = Event->SendDirect;
  124.    SendImmediate = Event->SendImmediate;
  125.    CallDelay = Event->CallDelay;
  126.    StartImport = Event->StartImport;
  127.    StartExport = Event->StartExport;
  128.    ExportMail = Event->ExportMail;
  129.    ImportNormal = Event->ImportNormal;
  130.    ImportKnown = Event->ImportKnown;
  131.    ImportProtected = Event->ImportProtected;
  132.    strcpy (RouteCmd, Event->RouteCmd);
  133.    strcpy (Command, Event->Command);
  134.    MaxCalls = Event->MaxCalls;
  135.    MaxConnects = Event->MaxConnects;
  136.    AllowRequests = Event->AllowRequests;
  137.    MakeRequests = Event->MakeRequests;
  138.    ProcessTIC = Event->ProcessTIC;
  139.    ClockAdjustment = Event->ClockAdjustment;
  140.    Completed = Event->Completed;
  141. }
  142.  
  143. VOID TEvents::Add (VOID)
  144. {
  145.    USHORT RetVal, TimeNew, TimeEvent;
  146.    EVENT *lpEvent;
  147.    VOID *Value = NULL;
  148.  
  149.    Class2Struct (&Event);
  150.  
  151.    RetVal = FALSE;
  152.    TimeNew = (USHORT)(Event.Hour * 60 + Event.Minute);
  153.  
  154.    if ((lpEvent = (EVENT *)Data.First ()) != NULL) {
  155.       TimeEvent = (USHORT)(lpEvent->Hour * 60 + lpEvent->Minute);
  156.       if ((TimeNew + Event.Length) <= (TimeEvent + lpEvent->Length)) {
  157.          Data.Insert (&Event, sizeof (EVENT));
  158.          Value = Data.Value ();
  159.          Data.Insert (lpEvent, sizeof (EVENT));
  160.          Data.First ();
  161.          Data.Remove ();
  162.          RetVal = TRUE;
  163.       }
  164.       if (RetVal == FALSE)
  165.          do {
  166.             TimeEvent = (USHORT)(lpEvent->Hour * 60 + lpEvent->Minute);
  167.             if ((TimeNew + Event.Length) <= (TimeEvent + lpEvent->Length)) {
  168.                Data.Previous ();
  169.                Data.Insert (&Event, sizeof (EVENT));
  170.                Value = Data.Value ();
  171.                RetVal = TRUE;
  172.             }
  173.          } while (RetVal == FALSE && (lpEvent = (EVENT *)Data.Next ()) != NULL);
  174.    }
  175.  
  176.    if (RetVal == FALSE) {
  177.       Data.Add (&Event, sizeof (EVENT));
  178.       Value = Data.Value ();
  179.    }
  180.  
  181.    Number = 0;
  182.    if (Data.First () != NULL)
  183.       do {
  184.          Number++;
  185.          if (Data.Value () == Value)
  186.             break;
  187.       } while (Data.Next () != NULL);
  188. }
  189.  
  190. VOID TEvents::Delete (VOID)
  191. {
  192.    EVENT *Current;
  193.  
  194.    if (Data.Value () != NULL) {
  195.       Data.Remove ();
  196.       if (Data.Value () != NULL) {
  197.          Current = (EVENT *)Data.Value ();
  198.          Data.First ();
  199.          Number = 1;
  200.          while (Data.Value () != Current) {
  201.             Data.Next ();
  202.             Number++;
  203.          }
  204.          Struct2Class (Current);
  205.       }
  206.       else {
  207.          Number = 0;
  208.          New ();
  209.       }
  210.    }
  211. }
  212.  
  213. USHORT TEvents::First (VOID)
  214. {
  215.    USHORT RetVal = FALSE;
  216.    EVENT *Event;
  217.  
  218.    Started = FALSE;
  219.    if ((Event = (EVENT *)Data.First ()) != NULL) {
  220.       Number = 1;
  221.       Struct2Class (Event);
  222.       RetVal = TRUE;
  223.    }
  224.  
  225.    return (RetVal);
  226. }
  227.  
  228. USHORT TEvents::Load (VOID)
  229. {
  230.    int fd;
  231.    USHORT RetVal = FALSE;
  232.  
  233.    Data.Clear ();
  234.  
  235.    if ((fd = sopen (DataFile, O_RDONLY|O_BINARY, SH_DENYNO, S_IREAD|S_IWRITE)) != -1) {
  236.       while (read (fd, &Event, sizeof (EVENT)) == sizeof (EVENT))
  237.          Data.Add (&Event, sizeof (EVENT));
  238.       close (fd);
  239.  
  240.       RetVal = First ();
  241.    }
  242.  
  243.    return (RetVal);
  244. }
  245.  
  246. VOID TEvents::New (VOID)
  247. {
  248.    memset (Label, 0, sizeof (Label));
  249.    Hour = Minute = 0;
  250.    Sunday = Monday = Tuesday = Wednesday = Thursday = Friday = Saturday = FALSE;
  251.    Length = 1;
  252.    LastDay = 0;
  253.    Dynamic = Force = MailOnly = ForceCall = FALSE;
  254.    memset (Address, 0, sizeof (Address));
  255.    SendNormal = SendCrash = SendDirect = SendImmediate = FALSE;
  256.    CallDelay = 30;
  257.    StartImport = StartExport = ExportMail = FALSE;
  258.    ImportNormal = ImportProtected = ImportKnown = FALSE;
  259.    memset (RouteCmd, 0, sizeof (RouteCmd));
  260.    memset (Command, 0, sizeof (Command));
  261.    MaxCalls = 0;
  262.    MaxConnects = 0;
  263.    AllowRequests = MakeRequests = ProcessTIC = ClockAdjustment = FALSE;
  264. }
  265.  
  266. USHORT TEvents::Next (VOID)
  267. {
  268.    USHORT RetVal = FALSE;
  269.    EVENT *Event;
  270.  
  271.    Started = FALSE;
  272.    if ((Event = (EVENT *)Data.Next ()) != NULL) {
  273.       Number++;
  274.       Struct2Class (Event);
  275.       RetVal = TRUE;
  276.    }
  277.  
  278.    return (RetVal);
  279. }
  280.  
  281. USHORT TEvents::Previous (VOID)
  282. {
  283.    USHORT RetVal = FALSE;
  284.    EVENT *Event;
  285.  
  286.    Started = FALSE;
  287.    if ((Event = (EVENT *)Data.Previous ()) != NULL) {
  288.       Number--;
  289.       Struct2Class (Event);
  290.       RetVal = TRUE;
  291.    }
  292.  
  293.    return (RetVal);
  294. }
  295.  
  296. USHORT TEvents::Read (USHORT evtNum)
  297. {
  298.    USHORT RetVal = FALSE;
  299.  
  300.    if (First () == TRUE)
  301.       do {
  302.          if (Number == evtNum) {
  303.             RetVal = TRUE;
  304.             break;
  305.          }
  306.       } while (Next () == TRUE);
  307.  
  308.    return (RetVal);
  309. }
  310.  
  311. VOID TEvents::Save (VOID)
  312. {
  313.    int fd;
  314.    USHORT Current;
  315.  
  316.    if ((fd = sopen (DataFile, O_WRONLY|O_BINARY|O_CREAT|O_TRUNC, SH_DENYNO, S_IREAD|S_IWRITE)) != -1) {
  317.       Current = Number;
  318.  
  319.       if (Data.First () != NULL)
  320.          do {
  321.             write (fd, Data.Value (), sizeof (EVENT));
  322.          } while (Data.Next () != NULL);
  323.  
  324.       close (fd);
  325.  
  326.       if (Data.First () != NULL)
  327.          do {
  328.             if (Number == Current)
  329.                break;
  330.          } while (Data.Next () != NULL);
  331.    }
  332. }
  333.  
  334. USHORT TEvents::SetCurrent (VOID)
  335. {
  336.    USHORT RetVal = FALSE, TimeNow, TimeEvent;
  337.    USHORT CurDay;
  338.    EVENT *Event;
  339.    time_t t;
  340.    struct tm ltm;
  341.  
  342.    t = time (NULL);
  343.    memcpy (<m, localtime (&t), sizeof (struct tm));
  344.    TimeNow = (USHORT)(ltm.tm_hour * 60 + ltm.tm_min);
  345.    CurDay = (USHORT)(1 << ltm.tm_wday);
  346.    Number = 0;
  347.  
  348.    if ((Event = (EVENT *)Data.First ()) != NULL)
  349.       do {
  350.          Number++;
  351.          TimeEvent = (USHORT)(Event->Hour * 60 + Event->Minute);
  352.          if (TimeNow >= TimeEvent && TimeNow < (TimeEvent + Event->Length) && (CurDay & Event->WeekDays)) {
  353.             if (Event->LastDay != ltm.tm_yday) {
  354.                Event->LastDay = (USHORT)ltm.tm_yday;
  355.                Event->Completed = FALSE;
  356.                Started = TRUE;
  357.             }
  358.             else
  359.                Started = FALSE;
  360.  
  361.             Struct2Class (Event);
  362.             RetVal = TRUE;
  363.          }
  364.       } while (RetVal == FALSE && (Event = (EVENT *)Data.Next ()) != NULL);
  365.  
  366.    return (RetVal);
  367. }
  368.  
  369. VOID TEvents::TimeToNext (VOID)
  370. {
  371.    USHORT TimeNow, TimeEvent, ToMid;
  372.    USHORT CurDay, Num;
  373.    EVENT *Event;
  374.    time_t t;
  375.    struct tm ltm;
  376.  
  377.    t = time (NULL);
  378.    memcpy (<m, localtime (&t), sizeof (struct tm));
  379.    TimeNow = (USHORT)(ltm.tm_hour * 60 + ltm.tm_min);
  380.    CurDay = (USHORT)(1 << ltm.tm_wday);
  381.  
  382.    NextNumber = 0;
  383.    NextLabel[0] = '\0';
  384.    TimeRemain = 3000;
  385.    Num = 0;
  386.  
  387.    if ((Event = (EVENT *)Data.First ()) != NULL)
  388.       do {
  389.          Num++;
  390.          TimeEvent = (USHORT)(Event->Hour * 60 + Event->Minute);
  391.          if (Event->LastDay != ltm.tm_yday && TimeEvent > TimeNow && (CurDay & Event->WeekDays)) {
  392.             if (TimeRemain > (TimeEvent - TimeNow)) {
  393.                TimeRemain = (USHORT)(TimeEvent - TimeNow);
  394.                strcpy (NextLabel, Event->Label);
  395.                NextNumber = Num;
  396.             }
  397.          }
  398.       } while ((Event = (EVENT *)Data.Next ()) != NULL);
  399.  
  400.    if (TimeRemain > 1440) {
  401.       ToMid = (USHORT)(1440 - TimeNow);
  402.       TimeNow = 0;
  403.       CurDay <<= 1;
  404.       if (CurDay > DAY_SATURDAY)
  405.          CurDay = DAY_SUNDAY;
  406.       Num = 0;
  407.  
  408.       if ((Event = (EVENT *)Data.First ()) != NULL)
  409.          do {
  410.             Num++;
  411.             TimeEvent = (USHORT)(Event->Hour * 60 + Event->Minute);
  412. //            if (Event->LastDay != ltm.tm_yday && TimeEvent > TimeNow && (CurDay & Event->WeekDays)) {
  413.             if (TimeEvent >= TimeNow && (CurDay & Event->WeekDays)) {
  414.                if (TimeRemain > (TimeEvent - TimeNow + ToMid)) {
  415.                   TimeRemain = (USHORT)(TimeEvent - TimeNow + ToMid);
  416.                   strcpy (NextLabel, Event->Label);
  417.                   NextNumber = Num;
  418.                }
  419.             }
  420.          } while ((Event = (EVENT *)Data.Next ()) != NULL);
  421.    }
  422.  
  423.    if (TimeRemain > 1440)
  424.       TimeRemain = 1440;
  425. }
  426.  
  427. VOID TEvents::Update (VOID)
  428. {
  429.    EVENT *Event;
  430.  
  431.    if ((Event = (EVENT *)Data.Value ()) != NULL) {
  432.       if (Event->Hour != Hour || Event->Minute != Minute || Event->Length != Length) {
  433.          Data.Remove ();
  434.          Add ();
  435.          Struct2Class ((EVENT *)Data.Value ());
  436.       }
  437.       else
  438.          Class2Struct (Event);
  439.    }
  440. }
  441.  
  442.