#include <stdio.h>
#include "Connect.h"
#include "inet-udp.h"
#include "Code.h"
#include "literal.h"

void printError()
{
  while (Error_Exists)
    {
      fprintf(stderr, Error_String(Error), Error_Info);
      fputc('\n', stderr);
      Error_Pop();
    }
}
 
#define E(x) if (x) printError()

main(argc, argv)
     char **argv;
{
  Addr a, b;
  Packet p;
  CodeBlock *block;
  char *message;
  char name[50];

  if (!argv[1] || !argv[2])
    {
      fprintf(stderr, "usage: <from> <to>\n");
      exit(1);
    }

  E(Connect_Initialize());
  E(Connect_RegisterDomain(&inetudp));

  E(Code_Initialize());
  E(Code_RegisterDomain(&literal));

  E(Connect_NameToAddress(argv[1], &a));
  E(Connect_NameToAddress(argv[2], &b));

  E(Code_CreateBlock(&block, "literal", NULL, 0));
  E(Code_PutString(block, "hello\n"));

  E(Connect_OpenConnection(a, b));

  p.Source = a;
  p.Destination = b;
  p.packet = Code_BlockData(block);
  p.length = Code_BlockLength(block);
  E(Connect_SendPacket(&p));
  sleep(2);
  E(Connect_SendPacket(&p));
  sleep(2);
  E(Connect_SendPacket(&p));

  E(Code_FreeBlock(block));

  E(Connect_Wait(&p, NOTIMEOUT));

  Connect_AddressToName(p.Source, name, sizeof(name));
  fprintf(stdout, "From: %d - %s\n", p.Source, name);

  E(Code_CreateBlock(&block, "literal", p.packet, p.length));
  E(Code_GetString(block, &message));

  fprintf(stdout, "%s", message);
}
