home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 1996 February / Software of the Month Club 1996 February.iso / pc / os2 / pmpage / page.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-08  |  8.0 KB  |  278 lines

  1. #define INCL_DOSNMPIPES           // Named-pipe values
  2. #define INCL_DOSFILEMGR         // File Manager values
  3. #define INCL_DOSPROCESS
  4. #define INCL_DOSERRORS          // DOS Error values
  5. #include <os2.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <ctype.h>
  9. #include <string.h>
  10. #include <mem.h>
  11. #include "page.h"
  12.  
  13. char    *date_ptr ;
  14. char    *time_ptr ;
  15. char    *min_ptr ;
  16. char    *day_ptr ;
  17. char    *msg_ptr ;
  18. char    *id_ptr ;
  19. int        LogIndex ;
  20. int        StatType ;
  21. int        Option = 0 ;
  22. int SendMessage( int MessageSize, char *message_ptr ) ;
  23. int    CommandLine( int argc, char *argv[] ) ;
  24.  
  25. int main(int    argc, char  *argv[])
  26. {
  27. int     count, status, year, month, day, hour, min ;
  28. char    line[100] ;
  29. pgf     *pgf_ptr ;
  30.  
  31.     pgf_ptr = (pgf *) calloc( 1, sizeof(pgf) ) ;
  32.     if( pgf_ptr == NULL ) {
  33.         printf( "Calloc error\n" ) ;
  34.         return 0 ;
  35.     }
  36.  
  37.     status = CommandLine( argc, argv ) ;
  38.     if( status ) {
  39.         printf( "page [-nadils] args id Message\n" ) ;
  40.         printf( "      n  Page now - Default\n" ) ;
  41.         printf( "         page -n \"Bill\" \"My message\"\n" ) ;
  42.         printf( "         page \"Bill\" \"My message\"\n" ) ;
  43.         printf( "      a  Page at a date(MM-DD-YY) and time(HH:MM)\n" ) ;
  44.         printf( "         page -a 08-12-95 15:55 \"Bill\" \"My message\"\n" ) ;
  45.         printf( "      d  Delete a page at date(MM-DD-YY), time(HH:MM) and ID\n" ) ;
  46.         printf( "         page -d 08-12-95 15:55 \"Bill\"\n" ) ;
  47.         printf( "         page -d 00-00-00 00:00 \"\"     - Deletes all pages\n" ) ;
  48.         printf( "      i  Page in xxx minutes \n" ) ;
  49.         printf( "         page -i 10 \"Bill\" \"My message\"\n" ) ;
  50.         printf( "      l  List page log file:     page -l index\n" ) ;
  51.         printf( "            index:  0:  Show last 1K of log file - Default\n" ) ;
  52.         printf( "                    1:  Show 1K of log file, starting at EOF-2K\n" ) ;
  53.         printf( "                    2:  Show 1K of log file, starting at EOF-3K\n" ) ;
  54.         printf( "                    3:  Show 1K of log file, starting at EOF-4K\n" ) ;
  55.         printf( "                    4:  Show 1K of log file, starting at EOF-5K\n" ) ;
  56.         printf( "      s  List # of pages in Now queue and # of pages in At queue\n" ) ;
  57.         printf( "         page -s type\n" ) ;
  58.         printf( "            type:   0:  Short list - Default\n" ) ;
  59.         printf( "                    1:  Full list\n" ) ;
  60.         printf( "      page \"Watson Smith\" \"Watson come here, Brent\"" ) ;
  61.         return 0 ;
  62.     }
  63.  
  64.     memset( pgf_ptr, 0, sizeof(pgf) ) ;
  65.     pgf_ptr->header.MsgVersion = 1 ;            // Version 1 format
  66.     strcpy( pgf_ptr->id, id_ptr ) ;
  67.     strcpy( (char *)pgf_ptr->message, msg_ptr ) ;
  68.     pgf_ptr->header.DataSize = strlen( msg_ptr ) ;
  69.     switch( Option ) {
  70.         case 'n':
  71.             // page -n "Bill" "My message"
  72.             pgf_ptr->header.MsgType = PH_PAGE_BY_NAME_ID ;
  73.             pgf_ptr->header.Action = PH_ACTION_PAGE_NOW ;
  74.             break ;
  75.         case 'a':
  76.             // page -a 08-12-95 15:55 "Bill" "My message"
  77.             pgf_ptr->header.MsgType = PH_PAGE_BY_NAME_ID ;
  78.             pgf_ptr->header.Action = PH_ACTION_PAGE_AT ;
  79.             if( date_ptr[2] == '-' ) {
  80.                 sscanf( date_ptr, "%d-%d-%d", &month, &day, &year ) ;
  81.             } else {
  82.                 sscanf( date_ptr, "%d/%d/%d", &month, &day, &year ) ;
  83.             }
  84.             pgf_ptr->header.at.month = month ;
  85.             pgf_ptr->header.at.day = day ;
  86.             pgf_ptr->header.at.year = year ;
  87.             sscanf( time_ptr, "%d:%d", &hour, &min ) ;
  88.             pgf_ptr->header.at.hour = hour ;
  89.             pgf_ptr->header.at.min = min ;
  90.             break ;
  91.         case 'd':
  92.             // Delete a page(s)
  93.             // page -d 08-12-95 15:55 "Bill"
  94.             pgf_ptr->header.MsgType = PH_PAGE_DELETE_AT_PAGE ;
  95.             if( date_ptr[2] == '-' ) {
  96.                 sscanf( date_ptr, "%d-%d-%d", &month, &day, &year ) ;
  97.             } else {
  98.                 sscanf( date_ptr, "%d/%d/%d", &month, &day, &year ) ;
  99.             }
  100.             pgf_ptr->header.at.month = month ;
  101.             pgf_ptr->header.at.day = day ;
  102.             pgf_ptr->header.at.year = year ;
  103.             sscanf( time_ptr, "%d:%d", &hour, &min ) ;
  104.             pgf_ptr->header.at.hour = hour ;
  105.             pgf_ptr->header.at.min = min ;
  106.             break ;
  107.         case 'i':
  108.             // page -i 10 "Bill" "My message"
  109.             pgf_ptr->header.MsgType = PH_PAGE_BY_NAME_ID ;
  110.             pgf_ptr->header.Action = PH_ACTION_PAGE_DELAY ;
  111.             pgf_ptr->header.at.min = atol( min_ptr ) ;
  112.             break ;
  113.         case 'l':
  114.             // page -l index
  115.             pgf_ptr->header.MsgType = PH_PAGE_LIST_LOG ;
  116.             pgf_ptr->header.Modifier = LogIndex ;
  117.             pgf_ptr->header.DataSize = 0 ;
  118.             break ;
  119.         case 's':
  120.             // page -s type\n" ) ;
  121.             pgf_ptr->header.MsgType = PH_PAGE_SHOW_QUEUES ;
  122.             pgf_ptr->header.Modifier = StatType ;
  123.             pgf_ptr->header.DataSize = 0 ;
  124.             break ;
  125.     }
  126. /*
  127.     printf( "MsgType   = %d\n", pgf_ptr->header.MsgType ) ;
  128.     printf( "Action    = %d\n", pgf_ptr->header.Action ) ;
  129.     printf( "Modifier  = %d\n", pgf_ptr->header.Modifier ) ;
  130.     printf( "DataSize  = %d\n", pgf_ptr->header.DataSize ) ;
  131.     printf( "Date:     = %d/%d/%d\n", (int)pgf_ptr->header.at.month,
  132.             pgf_ptr->header.at.day, pgf_ptr->header.at.year ) ;
  133.     printf( "Time:     = %d:%d\n", pgf_ptr->header.at.hour, pgf_ptr->header.at.min ) ;
  134.     printf( "sec       = %ld\n", pgf_ptr->header.at.sec ) ;
  135.     printf( "id        = %s\n", pgf_ptr->id ) ;
  136.     printf( "Message   = %s\n", pgf_ptr->message ) ;
  137. */
  138.     SendMessage( sizeof(pgf_ptr->header) + PH_ID_SIZE + strlen(msg_ptr) + 1,
  139.         (char *)pgf_ptr  ) ;
  140.  
  141.     return 0 ;
  142. }
  143.  
  144.  
  145. int    CommandLine( int argc, char *argv[] )
  146. {
  147. int    index ;
  148.  
  149.  
  150.     if( argc > 1 ) {
  151.         if( argv[1][0] == '-' ) {
  152.             Option = tolower( argv[1][1] ) ;
  153.             switch( Option ) {
  154.                 case 'n':
  155.                     // page -n "Bill" "My message"
  156.                     if( argc != 4 ) break ;
  157.                     id_ptr = argv[2] ;
  158.                     msg_ptr = argv[3] ;
  159.                     return( 0 ) ;
  160.                 case 'a':
  161.                     // page -a 08-12-95 15:55 "Bill" "My message"
  162.                     if( argc != 6 ) break ;
  163.                     date_ptr = argv[2] ;
  164.                     time_ptr = argv[3] ;
  165.                     id_ptr = argv[4] ;
  166.                     msg_ptr = argv[5] ;
  167.                     return( 0 ) ;
  168.                 case 'd':
  169.                     // Delete a page(s)
  170.                     // page -d 08-12-95 15:55 "Bill"
  171.                     if( argc != 5 ) break ;
  172.                     date_ptr = argv[2] ;
  173.                     time_ptr = argv[3] ;
  174.                     id_ptr = argv[4] ;
  175.                     msg_ptr = "" ;
  176.                     return( 0 ) ;
  177.                 case 'i':
  178.                     // page -i 10 "Bill" "My message"
  179.                     if( argc != 5 ) break ;
  180.                     min_ptr = argv[2] ;
  181.                     id_ptr = argv[3] ;
  182.                     msg_ptr = argv[4] ;
  183.                     return( 0 ) ;
  184.                 case 'l':
  185.                     // page -l index
  186.                     if( argc == 3 ) {
  187.                         LogIndex = atoi( argv[2] ) ;
  188.                         id_ptr = "" ;
  189.                         msg_ptr = "" ;
  190.                         return( 0 ) ;
  191.                     }
  192.                     if( argc == 2 ) {
  193.                         LogIndex = 0 ;
  194.                         id_ptr = "" ;
  195.                         msg_ptr = "" ;
  196.                         return( 0 ) ;
  197.                     }
  198.                     break ;
  199.                 case 's':
  200.                     // page -s type \n" ) ;
  201.                     if( argc == 3 ) {
  202.                         StatType = atoi( argv[2] ) ;
  203.                         id_ptr = "" ;
  204.                         msg_ptr = "" ;
  205.                         return( 0 ) ;
  206.                     }
  207.                     if( argc == 2 ) {
  208.                         StatType = 0 ;
  209.                         id_ptr = "" ;
  210.                         msg_ptr = "" ;
  211.                         return( 0 ) ;
  212.                     }
  213.                     break ;
  214.             }
  215.         }
  216.         // page "ID" "Message"
  217.         if( argc == 3 ) {
  218.             Option = 'n' ;
  219.             id_ptr = argv[1] ;
  220.             msg_ptr = argv[2] ;
  221.             return( 0 ) ;
  222.         }
  223.     }
  224.     return( 1 ) ;        // Error
  225.  
  226. }
  227.  
  228.  
  229.  
  230. int SendMessage( int MessageSize, char *message_ptr )
  231. {
  232. int trys ;
  233. UCHAR    OutBuffer[3000];    // Read-buffer address
  234. ULONG    OutBufferLen;       // Read-buffer length
  235. ULONG    BytesOut;           // Bytes read (returned)
  236. ULONG    TimeOut;            // Maximum wait time
  237. APIRET   rc;                 // Return code
  238.  
  239.  
  240.  
  241.     OutBufferLen = 3000;    // Max data length for output
  242.                             // (return) buffer
  243.  
  244.     TimeOut = 10000 ;        //Timeout of 10 seconds (units
  245.                             //   are milliseconds)
  246.  
  247.     OutBuffer[0] = 0 ;
  248.     for( trys = 0 ; trys < 3 ; trys++ ) {
  249.         rc = DosCallNPipe(PIPENAME, message_ptr, MessageSize, OutBuffer,
  250.                                 OutBufferLen, &BytesOut, TimeOut);
  251.                           // On successful return, variable
  252.                           // BytesOut will contain the
  253.                           // number of bytes written to
  254.                           // the output buffer (OutBuffer)
  255.         if (rc != 0) {
  256.             continue ;
  257.         } else {
  258.            break ;
  259.         }
  260.     }
  261.     if( BytesOut )
  262.         printf( "%*.*s ", (int)BytesOut, (int)BytesOut, OutBuffer ) ;
  263.     if( BytesOut == 0 && trys == 3 ) {
  264.         printf( "Error sending page\n" ) ;
  265.     }
  266. /*
  267.     if( OutBuffer[0] == 'O' && OutBuffer[1] == 'K'  ) {
  268.         printf( "Page sent\n" ) ;
  269.     } else {
  270.         printf( "Error sending page\n" ) ;
  271.     }
  272. */
  273.     return 0 ;
  274. }
  275.  
  276.  
  277.  
  278.