display api improvements - to be continued
[my-code/ivac.git] / src / ivac.c
index e3e2060..60338ee 100644 (file)
  *
  */
 
-// #define USE_NCURSES
-/* dont care about ncurses .. go for gtk(2)! */
-#define USE_GTK
-
 #include "ivac.h"
 
 int usage(void) {
@@ -36,6 +32,9 @@ int usage(void) {
   puts("-h \t\t show this help");
   puts("-n <name> \t specify your name");
   puts("-p <port> \t specify port to listen for incoming connections");
+  puts("-u <port> \t specify udp data port");
+  puts("-d <device> \t specify audio device");
+  puts("-i <iface> \t specify network interface");
   puts("");
 
   return SUCCESS;
@@ -51,6 +50,9 @@ int main(int argc,char **argv) {
   /* default values */
   strcpy(ivac.username,"ivac");
   ivac.net.l_port=IVAC_LISTEN_PORT;
+  ivac.net.l_udp_port=IVAC_UDP_PORT;
+  strcpy(ivac.audio.dsp_dev,SOUND_DEVICE);
+  strcpy(ivac.net.nic,"eth0");
  
   /* parse argv and change default values */
   for(i=1;i<argc;i++) {
@@ -65,6 +67,14 @@ int main(int argc,char **argv) {
         case 'p':
           ivac.net.l_port=atoi(argv[++i]);
           break;
+        case 'u':
+          ivac.net.l_udp_port=atoi(argv[++i]);
+          break;
+        case 'd':
+          strncpy(ivac.audio.dsp_dev,argv[++i],MAX_CHAR_DEVICE);
+          break;
+        case 'i':
+          strncpy(ivac.net.nic,argv[++i],MAX_NIC_DEVICE);
         default:
           usage();
           return ERROR;
@@ -101,18 +111,32 @@ int main(int argc,char **argv) {
     ivac_shutdown(&ivac);
     return ERROR;
   }
+  network_udp_listen_init(&(ivac.net));
 
-  /* add listening port + stdin to (read) event system */
+  /* add listening port(s) + stdin to (read) event system */
   event_math(ivac.net.l_fd,&(ivac.event),READ,ADD);
+  event_math(ivac.net.l_udp_fd,&(ivac.event),READ,ADD);
   event_math(0,&(ivac.event),READ,ADD);
 
-#ifdef USE_NCURSES
   /* display init */
   display_init(&(ivac.display));
-#endif
+
+  /* use hardcoded audio settings by now */
+  ivac.audio.fmt=BIT_8;
+  ivac.audio.channels=MONO;
+  ivac.audio.speed=8000;
+  /* audio init */
+  audio_init(&(ivac.audio));
+  audio_setup(&(ivac.audio));
 
   /* display */
-  ivac_display(&(ivac.display));
+#ifdef XXX_GUI
+  /* "constant" graphics */
+  ivac_display_head(&ivac);
+  ivac_display_box(&ivac);
+  ivac_display_console(&ivac);
+#endif
+  ivac_display(&ivac);
 
   /* start event system - callbacks used: ivac_event_cb + ivac_regular_cb */
   event_start(&(ivac.event),(void *)&ivac,ivac_event_cb,ivac_regular_cb);
@@ -123,11 +147,11 @@ int main(int argc,char **argv) {
 int ivac_shutdown(t_ivac *ivac) {
 
   network_shutdown(&(ivac->net));
+  network_udp_shutdown(&(ivac->net));
   input_shutdown(&(ivac->input));
   event_stop(&(ivac->event));
-#ifdef USE_NCURSES
+  audio_shutdown(&(ivac->audio));
   display_shutdown(&(ivac->display));
-#endif
 
   return SUCCESS;
 }
@@ -255,7 +279,7 @@ int ivac_event_cb(t_event *event,void *ptr) {
       event_math(ivac->net.connection[channel].fd,event,READ,ADD);
       ivac_send_info(channel,ivac);
     }
-    ivac_display_content(ivac);
+    ivac_display(ivac);
   }
 
   /* wait for user info */
@@ -269,7 +293,7 @@ int ivac_event_cb(t_event *event,void *ptr) {
           sprintf(c_str,"channel %02d: broken pipe - disconnected",channel);
           ivac_add_to_monitor(ivac,c_str);
         }
-        ivac_display_content(ivac);
+        ivac_display(ivac);
       }
     }
   } 
@@ -302,7 +326,7 @@ int ivac_parse_command(t_input *input,void *ptr) {
   data=input->content;
   valid=0;
 
-  /* refresh prompt content only! */
+  /* refresh prompt content only */
   ivac_display_prompt_content(ivac);
 
   /* parse command routines */
@@ -435,7 +459,7 @@ int ivac_parse_command(t_input *input,void *ptr) {
     ivac_add_to_monitor(ivac,c_str);
 
     /* refresh whole display content */
-    ivac_display_content(ivac);
+    ivac_display(ivac);
 
     /* delete content buffer + reset counter */
     memset(input->content,0,input->c_count-1);
@@ -446,21 +470,10 @@ int ivac_parse_command(t_input *input,void *ptr) {
   return SUCCESS;
 }
 
-int ivac_display_head(t_display *display) {
-
-#ifdef USE_NCURSES
-  int x,y;
+int ivac_display_head(t_ivac *ivac) {
 
-  move(0,0);
-  for(x=0;x<display->max_x;x++) addch('#');
-  mvaddstr(1,0,"##");
-  mvaddstr(1,(display->max_x-4)/2-4,"- ivac -");
-  mvaddstr(1,(display->max_x-2),"##");
-  move(2,0);
-  for(x=0;x<display->max_x;x++) addch('#');
-  refresh();
-#else
-  puts("#########################################################");
+#ifndef XXX_GUI
+  display_term_line(&(ivac->display),'#');
   puts("##### ivac - -  Copyright (C) 2004 Frank Zirkelbach #####");
   puts("#########################################################");
 #endif
@@ -468,17 +481,16 @@ int ivac_display_head(t_display *display) {
   return SUCCESS;
 }
 
-int ivac_display_box(t_display *display) {
-#ifdef USE_NCURSES 
-  int x,y;
+int ivac_display_box(t_ivac *ivac) {
 
-  for(y=IVAC_PROMPT_LEN;y<display->max_y-IVAC_PROMPT_LEN;y++) {
-    mvaddch(y,0,'#');
-    mvaddch(y,display->max_x-1,'#');
-  }
+#ifndef XXX_GUI
+  puts("---------------------------------------------------------------------");
+  printf("username: %s, capabilities: %02x|%04x\n",ivac->username,ivac->g_cap,
+                                                   ivac->av_cap);
+  puts("---------------------------------------------------------------------");
+  puts("connections:");
 #endif
-
   return SUCCESS;
 }
 
@@ -491,11 +503,10 @@ int ivac_display_box_content(t_ivac *ivac) {
     if(ivac->challenger[channel].name[0]==0)
       strcpy(ivac->challenger[channel].name,"<empty>");
 
-#ifdef USE_NCURSES
-#else
+#ifndef XXX_GUI
   for(channel=0;channel<MAX_CONNECTIONS;channel++) {
     if(ivac->net.connection[channel].status&C_INFO_A)
-      printf("channel %02d: ip:%s port:%d status: %02x - name: %s\n",channel,
+      printf("channel %02d: %s:%d, status: %02x, name: %s\n",channel,
              ivac->net.connection[channel].ip,
              ivac->net.connection[channel].port,
              ivac->net.connection[channel].status,
@@ -506,55 +517,33 @@ int ivac_display_box_content(t_ivac *ivac) {
   return SUCCESS;
 }
 
-int ivac_display_console(t_display *display) {
+int ivac_display_console(t_ivac *ivac) {
 
-#ifdef USE_NCURSES                                             
-  int x,y;
-         
-  move(display->max_y-IVAC_CONSOLE_LEN-IVAC_PROMPT_LEN-1,0);
-  for(x=0;x<display->max_x;x++) addch('#');
+#ifndef XXX_GUI
+  puts("---------------------------------------------------------------------");
+  puts("console messages:");
 #endif
-                                          
+
   return SUCCESS;
 }
 
 int ivac_display_console_content(t_ivac *ivac) {
 
-#ifdef USE_NCURSES
-  int x,y;
-  int len;
-
-  for(y=0;y<IVAC_CONSOLE_LEN;y++) {
-    len=strlen(ivac->console[y]);
-    move(ivac->display.max_y-IVAC_CONSOLE_LEN-IVAC_PROMPT_LEN+y,2);
-    for(x=0;x<len;x++)
-       addch(((ivac->console[y][x]>' ')||(ivac->console[y][x]<='~'))
-               ?ivac->console[y][x]:' ');
-    for(x=len;x<IVAC_CONSOLE_STRING_LEN-4;x++) addch(' ');
-  }
-  refresh();
-#else
   int i;
 
+#ifndef XXX_GUI
   for(i=0;i<IVAC_CONSOLE_LEN;i++)
-    printf("[ivac] console line %d: %s\n",i,ivac->console[i]);
+    printf("| %s\n",ivac->console[i]);
 #endif
 
   return SUCCESS;
 }
 
-int ivac_display_prompt(t_display *display) {
+int ivac_display_prompt(t_ivac *ivac) {
 
-#ifdef USE_NCURSES
-  int x,y;
-
-  move(display->max_y-3,0);
-  for(x=0;x<display->max_x;x++) addch('#');
-  mvaddstr(display->max_y-2,0,"## command: ");
-  mvaddstr(display->max_y-2,display->max_x-2,"##");
-  move(display->max_y-1,0);
-  for(x=0;x<display->max_x;x++) addch('#');
-  refresh();
+#ifndef XXX_GUI
+  puts("---------------------------------------------------------------------");
+  printf("prompt: ");
 #endif
 
   return SUCCESS;
@@ -562,19 +551,7 @@ int ivac_display_prompt(t_display *display) {
 
 int ivac_display_prompt_content(t_ivac *ivac) {
 
-#ifdef USE_NCURSES
-  int x,y;
-
-  /* delete old command */
-  if(ivac->input.c_count==0) {
-    move(ivac->display.max_y-2,12);
-    for(x=12;x<ivac->display.max_x-1;x++) addch(' ');
-  }
-
-  for(x=0;x<ivac->input.c_count;x++)
-    mvaddch(ivac->display.max_y-2,x+12,ivac->input.content[x]);
-  refresh();
-#else
+#ifndef XXX_GUI
   printf("%c",ivac->input.content[ivac->input.c_count-1]);
   fflush(NULL);
 #endif
@@ -582,35 +559,30 @@ int ivac_display_prompt_content(t_ivac *ivac) {
   return SUCCESS;
 }
 
-int ivac_display(t_display *display) {
+int ivac_display(t_ivac *ivac) {
 
   int x,y;
 
+#ifndef XXX_GUI
   /* display head */
-  ivac_display_head(display);
+  ivac_display_head(ivac);
 
   /* display box */
-  ivac_display_box(display);
-
-  /* display console */
-  ivac_display_console(display);
-
-  /* display command prompt */
-  ivac_display_prompt(display);
-
-  return SUCCESS;
-}
-
-int ivac_display_content(t_ivac *ivac) {
-
-  /* display box content */
+  ivac_display_box(ivac);
+#endif
   ivac_display_box_content(ivac);
 
-  /* display console content */
+#ifndef XXX_GUI
+  /* display console */
+  ivac_display_console(ivac);
+#endif
   ivac_display_console_content(ivac);
 
-  /* display prompt content */
-  ivac_display_prompt_content(ivac);
+#ifndef XXX_GUI
+  /* display command prompt */
+  ivac_display_prompt(ivac);
+#endif
+  fflush(NULL);
 
   return SUCCESS;
 }