#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

#include <pmbslib2.h>

short pnummer = 0;

void pmbsPrintf( char *str, ... )
{
 va_list args;
 char line[ 1024 ];
  va_start( args, str );
  vsprintf( line, str, args );
  va_end( args );

  pmbsSend( pnummer, line );
}

void CheckCarrier( void )
{
 long l;

  pmbsCheckCarrier( pnummer, &l );
  if ( 0 == l )
  {
     pmbsQuit( pnummer );
     exit( EXIT_FAILURE );
  }
}

int main( int argc, char *argv[] )
{
 char buffer[ 1024 ];
 char dname[ 1024 ];
 long l;
 short num;

  /* Ist ein Argument übergeben worden, werte es als Portnummer aus */

  if ( 2 != argc )
  {
     printf("Usage : pmbsDemo <Portnr.>" CRLF );
     return( 5 );
  }
  pnummer = atoi( argv[1] );

  pmbsPrintf( CLS HG_DBLAU "pmbsDemo C-Demosource" HG_SCHWARZ CRLF CRLF );

  /* Username */

  pmbsGetUser( pnummer, buffer );
  pmbsPrintf( VG_ROT "Username : " VG_WEISS "%s" CRLF, buffer );
  pmbsPrintf( CRLF );

  /* Pointname des Users */

  pmbsGetPoint( pnummer, buffer );
  pmbsPrintf( VG_ROT "Point    : " VG_WEISS "%s" CRLF, buffer );
  pmbsPrintf( CRLF );

  /* Downloadfreiraum */

     /* Lesen */
  pmbsGetFree( pnummer, &l );
  pmbsPrintf( VG_ROT "Freiraum : " VG_WEISS "%ld kBytes" CRLF, l );
  l += 100;
  pmbsPrintf( VG_GELB " addiere 100 zum Freiraum und speichere ihn" VG_WEISS CRLF );
     /* Setzen */
  pmbsSetFree( pnummer, l );
  pmbsPrintf( VG_GELB " Noch einmal lesen..." VG_WEISS CRLF );
     /* Lesen */
  pmbsGetFree( pnummer, &l );
  pmbsPrintf( VG_ROT "Freiraum : " VG_WEISS "%ld kBytes" CRLF, l );

  /* Level des Users */

  pmbsGetLevel( pnummer, &l );
  pmbsPrintf( VG_ROT "Level    : " VG_WEISS "%ld" CRLF, l );

  /* Zeitlimit des Users */

  pmbsGetTime( pnummer, &l );
  pmbsPrintf( VG_ROT "Time     : " VG_WEISS "%ld" CRLF, l );

  /* Restzeit des Users */

  pmbsGetRest( pnummer, &l );
  pmbsPrintf( VG_ROT "Rest     : " VG_WEISS "%ld" CRLF, l );
  pmbsPrintf( CRLF );

  /* Boxname */

  pmbsGetBox( pnummer, buffer);
  pmbsPrintf( VG_ROT "Boxname  : " VG_WEISS "%s" CRLF, buffer );

  /* Pmbs-Hauptverzeichnis */

  pmbsGetDir( dname );
  pmbsPrintf( VG_ROT "PMBSDir. : " VG_WEISS "%s" CRLF, dname );

  /* Netzverzeichnis */

  pmbsGetNetDir( buffer );
  pmbsPrintf( VG_ROT "Netzdir. : " VG_WEISS "%s" CRLF , buffer );

  /* Hole das Userverzeichnis und bastele mit dem Pmbs-Hauptverzeichnis
     ein komplettes Verzeichnis */

  pmbsGetUserDos( pnummer, buffer );
  pmbsPrintf( VG_ROT "UserDir. : " VG_WEISS "%sUSER\\%s" CRLF, dname, buffer );
  pmbsPrintf( CRLF );

  pmbsPrintf( CRLF HG_DBLAU "--- Eingabetests : ---" HG_SCHWARZ CRLF CRLF );

  pmbsPrintf( CRLF "1. Eingabe : " );
  CheckCarrier();
  pmbsBRead( pnummer, "Blueread", 20, buffer );
  CheckCarrier();

  pmbsPrintf( CRLF "Die Eingabe war : %s" CRLF, buffer );
  pmbsPrintf( CRLF );

  pmbsPrintf( CRLF "2. Eingabe : " );
  CheckCarrier();
  pmbsRead( pnummer, "Read", 20, buffer );
  CheckCarrier();

  pmbsPrintf( CRLF "Die Eingabe war : %s" CRLF, buffer );
  pmbsPrintf( CRLF CRLF "<Taste> für den Inhalt des aktuellen Brettes" );

  CheckCarrier();
  pmbsRead( pnummer, "", 0, buffer);
  CheckCarrier();

  num = 1;
  pmbsPrintf( CLS );
  pmbsPrintf( HG_DBLAU "%-3s : %-20s : %-16s : %s" HG_SCHWARZ CRLF, "Nr.", "Betreff:", "Uploader:", "Flags:" );

  for(;;)
  {
     /* Lösche buffer, damit wir nach dem Aufruf von pmbsGetSender()
        erkennen können, ob noch ein File folgt */
     buffer[0]=0;
     /* Der Uploader ist das einzige was für jedes File da sein muss. */
     pmbsGetSender( pnummer, buffer, num );
     if ( 0 == buffer[0] )
     {
        break;
     }
     pmbsPrintf("%3d : ", num );
     pmbsGetSubject( pnummer, buffer, num );
     pmbsPrintf("%-20s : ", buffer );
     pmbsGetSender( pnummer, buffer, num );
     pmbsPrintf("%-16s : ", buffer );
     pmbsGetFlags( pnummer, &l, num );
     pmbsPrintf("%s/%s",(l&FLAGS_ASCII)?"A":"B",(l&FLAGS_DELETED)?"K":"-" );
     pmbsPrintf( CRLF );
     num++;
  }

  pmbsQuit( pnummer );

  return( 0 );
}

