home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 3 Comm / 03-Comm.zip / superpg.zip / PAGE.CPP < prev    next >
C/C++ Source or Header  |  1996-04-07  |  10KB  |  332 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    *tmpbuf_ptr ;
  19. char    *id_ptr ;
  20. char    *file_name_ptr ;
  21. char    tmp[100], tmp1[400] ;
  22. int        LogIndex ;
  23. int        StatType ;
  24. int        Option = 0 ;
  25. int        IDInFile = 0 ;
  26. int SendMessage( int MessageSize, char *message_ptr ) ;
  27. int    CommandLine( int argc, char *argv[] ) ;
  28.  
  29. int main(int    argc, char  *argv[])
  30. {
  31. int     count, status, year, month, day, hour, min ;
  32. char    line[100] ;
  33. pgf     *pgf_ptr ;
  34.  
  35.     pgf_ptr = (pgf *) calloc( 1, sizeof(pgf) ) ;
  36.     if( pgf_ptr == NULL ) {
  37.         printf( "Calloc error\n" ) ;
  38.         return 0 ;
  39.     }
  40.  
  41.     status = CommandLine( argc, argv ) ;
  42.     if( status ) {
  43.         printf("Super Pager.   Version 1.5 Rev. 1\n" ) ;
  44.         printf("Copyright (c) Borghese Software Engineering. 1995.  All rights reserved.\n" );
  45.         printf("Command line client. Version 1.1 Rev. 1 - Used with paged.exe\n" ) ;
  46.         printf( "page [-nadils args] [@filename.txt] id Message\n" ) ;
  47.         printf( "      n  Page now - Default\n" ) ;
  48.         printf( "         page -n \"Bill\" \"My message\"\n" ) ;
  49.         printf( "         page \"Bill\" \"My message\"\n" ) ;
  50.         printf( "      a  Page at a date(MM-DD-YY) and time(HH:MM)\n" ) ;
  51.         printf( "         page -a 08-12-95 15:55 \"Bill\" \"My message\"\n" ) ;
  52.         printf( "      d  Delete a page at date(MM-DD-YY), time(HH:MM) and ID\n" ) ;
  53.         printf( "         page -d 08-12-95 15:55 \"Bill\"\n" ) ;
  54.         printf( "         page -d 00-00-00 00:00 \"\"     - Deletes all pages\n" ) ;
  55.         printf( "      i  Page in xxx minutes \n" ) ;
  56.         printf( "         page -i 10 \"Bill\" \"My message\"\n" ) ;
  57.         printf( "      l  List page log file:     page -l index\n" ) ;
  58.         printf( "            index:  0:  Show last 1K of log file - Default\n" ) ;
  59.         printf( "                    1:  Show 1K of log file, starting at EOF-2K\n" ) ;
  60.         printf( "      s  List # of pages in Now queue and # of pages in At queue\n" ) ;
  61.         printf( "         page -s type\n" ) ;
  62.         printf( "            type:   0:  Short list - Default\n" ) ;
  63.         printf( "                    1:  Full list\n" ) ;
  64.         printf( "      page @filename.txt\n" ) ;
  65.         printf( "      page id @filename.txt" ) ;
  66.         return 0 ;
  67.     }
  68.  
  69.     memset( pgf_ptr, 0, sizeof(pgf) ) ;
  70.     pgf_ptr->header.MsgVersion = 1 ;            // Version 1 format
  71.     strcpy( pgf_ptr->id, id_ptr ) ;
  72.     pgf_ptr->header.DataSize = strlen( msg_ptr ) ;
  73.     if( pgf_ptr->header.DataSize >= PH_MESSAGE_SIZE ) {
  74.         pgf_ptr->header.DataSize = PH_MESSAGE_SIZE - 2 ;
  75.         msg_ptr[pgf_ptr->header.DataSize] = 0 ;
  76.     }
  77.     strcpy( (char *)pgf_ptr->message, msg_ptr ) ;
  78.     switch( Option ) {
  79.         case 'n':
  80.             // page -n "Bill" "My message"
  81.             pgf_ptr->header.MsgType = PH_PAGE_BY_NAME_ID ;
  82.             pgf_ptr->header.Action = PH_ACTION_PAGE_NOW ;
  83.             break ;
  84.         case 'a':
  85.             // page -a 08-12-95 15:55 "Bill" "My message"
  86.             pgf_ptr->header.MsgType = PH_PAGE_BY_NAME_ID ;
  87.             pgf_ptr->header.Action = PH_ACTION_PAGE_AT ;
  88.             if( date_ptr[2] == '-' ) {
  89.                 sscanf( date_ptr, "%d-%d-%d", &month, &day, &year ) ;
  90.             } else {
  91.                 sscanf( date_ptr, "%d/%d/%d", &month, &day, &year ) ;
  92.             }
  93.             pgf_ptr->header.at.month = month ;
  94.             pgf_ptr->header.at.day = day ;
  95.             pgf_ptr->header.at.year = year ;
  96.             sscanf( time_ptr, "%d:%d", &hour, &min ) ;
  97.             pgf_ptr->header.at.hour = hour ;
  98.             pgf_ptr->header.at.min = min ;
  99.             break ;
  100.         case 'd':
  101.             // Delete a page(s)
  102.             // page -d 08-12-95 15:55 "Bill"
  103.             pgf_ptr->header.MsgType = PH_PAGE_DELETE_AT_PAGE ;
  104.             if( date_ptr[2] == '-' ) {
  105.                 sscanf( date_ptr, "%d-%d-%d", &month, &day, &year ) ;
  106.             } else {
  107.                 sscanf( date_ptr, "%d/%d/%d", &month, &day, &year ) ;
  108.             }
  109.             pgf_ptr->header.at.month = month ;
  110.             pgf_ptr->header.at.day = day ;
  111.             pgf_ptr->header.at.year = year ;
  112.             sscanf( time_ptr, "%d:%d", &hour, &min ) ;
  113.             pgf_ptr->header.at.hour = hour ;
  114.             pgf_ptr->header.at.min = min ;
  115.             break ;
  116.         case 'i':
  117.             // page -i 10 "Bill" "My message"
  118.             pgf_ptr->header.MsgType = PH_PAGE_BY_NAME_ID ;
  119.             pgf_ptr->header.Action = PH_ACTION_PAGE_DELAY ;
  120.             pgf_ptr->header.at.min = atol( min_ptr ) ;
  121.             break ;
  122.         case 'l':
  123.             // page -l index
  124.             pgf_ptr->header.MsgType = PH_PAGE_LIST_LOG ;
  125.             pgf_ptr->header.Modifier = LogIndex ;
  126.             pgf_ptr->header.DataSize = 0 ;
  127.             break ;
  128.         case 's':
  129.             // page -s type\n" ) ;
  130.             pgf_ptr->header.MsgType = PH_PAGE_SHOW_QUEUES ;
  131.             pgf_ptr->header.Modifier = StatType ;
  132.             pgf_ptr->header.DataSize = 0 ;
  133.             break ;
  134.     }
  135. /*
  136.     printf( "MsgType   = %d\n", pgf_ptr->header.MsgType ) ;
  137.     printf( "Action    = %d\n", pgf_ptr->header.Action ) ;
  138.     printf( "Modifier  = %d\n", pgf_ptr->header.Modifier ) ;
  139.     printf( "DataSize  = %d\n", pgf_ptr->header.DataSize ) ;
  140.     printf( "Date:     = %d/%d/%d\n", (int)pgf_ptr->header.at.month,
  141.             pgf_ptr->header.at.day, pgf_ptr->header.at.year ) ;
  142.     printf( "Time:     = %d:%d\n", pgf_ptr->header.at.hour, pgf_ptr->header.at.min ) ;
  143.     printf( "sec       = %ld\n", pgf_ptr->header.at.sec ) ;
  144.     printf( "id        = %s\n", pgf_ptr->id ) ;
  145.     printf( "Message   = %s\n", pgf_ptr->message ) ;
  146. */
  147.     SendMessage( sizeof(pgf_ptr->header) + PH_ID_SIZE + strlen(msg_ptr) + 1,
  148.         (char *)pgf_ptr  ) ;
  149.  
  150.     return 0 ;
  151. }
  152.  
  153.  
  154. int    CommandLine( int argc, char *argv[] )
  155. {
  156. int    index ;
  157. FILE *fp_ptr ;
  158.  
  159.     if( argc > 1 ) {
  160.         if( argv[1][0] == '-' ) {
  161.             Option = tolower( argv[1][1] ) ;
  162.             switch( Option ) {
  163.                 case 'n':
  164.                     // page -n "Bill" "My message"
  165.                     if( argc != 4 ) break ;
  166.                     id_ptr = argv[2] ;
  167.                     msg_ptr = argv[3] ;
  168.                     return( 0 ) ;
  169.                 case 'a':
  170.                     // page -a 08-12-95 15:55 "Bill" "My message"
  171.                     if( argc != 6 ) break ;
  172.                     date_ptr = argv[2] ;
  173.                     time_ptr = argv[3] ;
  174.                     id_ptr = argv[4] ;
  175.                     msg_ptr = argv[5] ;
  176.                     return( 0 ) ;
  177.                 case 'd':
  178.                     // Delete a page(s)
  179.                     // page -d 08-12-95 15:55 "Bill"
  180.                     if( argc != 5 ) break ;
  181.                     date_ptr = argv[2] ;
  182.                     time_ptr = argv[3] ;
  183.                     id_ptr = argv[4] ;
  184.                     msg_ptr = "" ;
  185.                     return( 0 ) ;
  186.                 case 'i':
  187.                     // page -i 10 "Bill" "My message"
  188.                     if( argc != 5 ) break ;
  189.                     min_ptr = argv[2] ;
  190.                     id_ptr = argv[3] ;
  191.                     msg_ptr = argv[4] ;
  192.                     return( 0 ) ;
  193.                 case 'l':
  194.                     // page -l index
  195.                     if( argc == 3 ) {
  196.                         LogIndex = atoi( argv[2] ) ;
  197.                         id_ptr = "" ;
  198.                         msg_ptr = "" ;
  199.                         return( 0 ) ;
  200.                     }
  201.                     if( argc == 2 ) {
  202.                         LogIndex = 0 ;
  203.                         id_ptr = "" ;
  204.                         msg_ptr = "" ;
  205.                         return( 0 ) ;
  206.                     }
  207.                     break ;
  208.                 case 's':
  209.                     // page -s type \n" ) ;
  210.                     if( argc == 3 ) {
  211.                         StatType = atoi( argv[2] ) ;
  212.                         id_ptr = "" ;
  213.                         msg_ptr = "" ;
  214.                         return( 0 ) ;
  215.                     }
  216.                     if( argc == 2 ) {
  217.                         StatType = 0 ;
  218.                         id_ptr = "" ;
  219.                         msg_ptr = "" ;
  220.                         return( 0 ) ;
  221.                     }
  222.                     break ;
  223.             }
  224.         }
  225.         // page @FileName.txt
  226.         if( argc == 2 ) {
  227.             long fsize ;
  228.             Option = 'n' ;
  229.             if( argv[1][0] == '@' ) {
  230.                 int    size ;
  231.                 fp_ptr = fopen( &argv[1][1], "rt" ) ;
  232.                 if( fp_ptr == NULL ) return( 1 ) ; // Error
  233.                 fseek( fp_ptr, 0L, SEEK_END ) ;
  234.                 fsize = ftell( fp_ptr ) ;
  235.                 fseek( fp_ptr, 0L, SEEK_SET ) ;
  236.                 tmpbuf_ptr = (char *)calloc( fsize + 100, 1 ) ;
  237.                 if( tmpbuf_ptr == NULL ) return( 1 ) ; // Error
  238.                 fgets( (char *)tmp, 100, fp_ptr ) ;
  239.                 id_ptr = strtok( tmp, "\n\r" ) ;
  240. //                id_ptr = (char *)&tmp ;
  241.                 size = fread( tmpbuf_ptr, 1, fsize, fp_ptr ) ;
  242.                 tmpbuf_ptr[size] = '\0' ;
  243.                 msg_ptr = tmpbuf_ptr ;
  244.                 fclose( fp_ptr ) ;
  245.                 return( 0 ) ;
  246.             }
  247.         }
  248.         // page id @FileName.txt
  249.         if( argc == 3 ) {
  250.             long fsize ;
  251.             Option = 'n' ;
  252.             id_ptr = argv[1] ;
  253.             if( argv[2][0] == '@' ) {
  254.                 int    size ;
  255.                 fp_ptr = fopen( &argv[2][1], "rt" ) ;
  256.                 if( fp_ptr == NULL ) return( 1 ) ; // Error
  257.                 fseek( fp_ptr, 0L, SEEK_END ) ;
  258.                 fsize = ftell( fp_ptr ) ;
  259.                 fseek( fp_ptr, 0L, SEEK_SET ) ;
  260.                 tmpbuf_ptr = (char *)calloc( fsize + 100, 1 ) ;
  261.                 if( tmpbuf_ptr == NULL ) return( 1 ) ; // Error
  262.                 size = fread( tmpbuf_ptr, 1, fsize, fp_ptr ) ;
  263.                 tmpbuf_ptr[size] = '\0' ;
  264.                 msg_ptr = tmpbuf_ptr ;
  265.                 fclose( fp_ptr ) ;
  266.                 return( 0 ) ;
  267.             }
  268.         }
  269.         // page "ID" "Message"
  270.         if( argc == 3 ) {
  271.             Option = 'n' ;
  272.             id_ptr = argv[1] ;
  273.             msg_ptr = argv[2] ;
  274.             return( 0 ) ;
  275.         }
  276.  
  277.     }
  278.     return( 1 ) ;        // Error
  279.  
  280. }
  281.  
  282.  
  283.  
  284. int SendMessage( int MessageSize, char *message_ptr )
  285. {
  286. int trys ;
  287. UCHAR    OutBuffer[3000];    // Read-buffer address
  288. ULONG    OutBufferLen;       // Read-buffer length
  289. ULONG    BytesOut;           // Bytes read (returned)
  290. ULONG    TimeOut;            // Maximum wait time
  291. APIRET   rc;                 // Return code
  292.  
  293.  
  294.  
  295.     OutBufferLen = 3000;    // Max data length for output
  296.                             // (return) buffer
  297.  
  298.     TimeOut = 10000 ;        //Timeout of 10 seconds (units
  299.                             //   are milliseconds)
  300.  
  301.     OutBuffer[0] = 0 ;
  302.     for( trys = 0 ; trys < 3 ; trys++ ) {
  303.         rc = DosCallNPipe(PIPENAME, message_ptr, MessageSize, OutBuffer,
  304.                                 OutBufferLen, &BytesOut, TimeOut);
  305.                           // On successful return, variable
  306.                           // BytesOut will contain the
  307.                           // number of bytes written to
  308.                           // the output buffer (OutBuffer)
  309.         if (rc != 0) {
  310.             continue ;
  311.         } else {
  312.            break ;
  313.         }
  314.     }
  315.     if( BytesOut )
  316.         printf( "%*.*s ", (int)BytesOut, (int)BytesOut, OutBuffer ) ;
  317.     if( BytesOut == 0 && trys == 3 ) {
  318.         printf( "Error sending page\n" ) ;
  319.     }
  320. /*
  321.     if( OutBuffer[0] == 'O' && OutBuffer[1] == 'K'  ) {
  322.         printf( "Page sent\n" ) ;
  323.     } else {
  324.         printf( "Error sending page\n" ) ;
  325.     }
  326. */
  327.     return 0 ;
  328. }
  329.  
  330.  
  331.  
  332.