This commit was generated by cvs2svn to compensate for changes in r158,
[gnokii.git] / common / misc.c
index 1adf9c8..bf9887b 100644 (file)
 
   A Linux/Unix toolset and driver for Nokia mobile phones.
 
+  Copyright (C) 1999, 2000 Hugh Blemings & Pavel Janík ml.
+
   Released under the terms of the GNU GPL, see file COPYING for more details.
 
-*/
+  $Id$
+  
+  $Log$
+  Revision 1.1.1.9  2002/04/03 00:07:59  short
+  Found in "gnokii-working" directory, some November-patches version
+
+  Revision 1.18  2001/09/09 21:45:49  machek
+  Cleanups from Ladislav Michl <ladis@psi.cz>:
+
+  *) do *not* internationalize debug messages
+
+  *) some whitespace fixes, do not use //
+
+  *) break is unneccessary after return
+
+  Revision 1.17  2001/08/09 12:34:34  pkot
+  3330 and 6250 support - I have no idea if it does work (mygnokii)
+
+  Revision 1.16  2001/03/21 23:36:04  chris
+  Added the statemachine
+  This will break gnokii --identify and --monitor except for 6210/7110
+
+  Revision 1.15  2001/03/06 10:38:52  machek
+  Dancall models added to the global list.
+
+  Revision 1.14  2001/02/06 13:55:23  pkot
+  Enabled authentication in 51xx models
+
+  Revision 1.13  2001/02/02 08:09:56  ja
+  New dialogs for 6210/7110 in xgnokii. Fixed the smsd for new capabilty code.
 
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-
-#ifndef WIN32
-  #include <sys/types.h>
-  #include <sys/stat.h>
-  #include <stdlib.h>
-  #include <fcntl.h>
-  #include <signal.h>
-  #include <unistd.h>
-  #include <errno.h>
-#endif
 
-#include "misc.h"
-#include "gsm-common.h"
-
-#ifndef HAVE_TIMEOPS
-
-/* FIXME: I have timersub defined in sys/time.h :-( PJ
-   FIXME: Jano wants this function too... PJ
-
-int timersub(struct timeval *a, struct timeval *b, struct timeval *result) {
-  do {
-    (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;
-    (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;
-    if ((result)->tv_usec < 0) {
-      --(result)->tv_sec;
-      (result)->tv_usec += 1000000;
-    }
-  } while (0);
-}
 */
 
-#endif
+#include <string.h>
+#include <stdlib.h>
+#include "misc.h"
 
-int GetLine(FILE *File, char *Line, int count) {
 
-  char *ptr;
+int GetLine(FILE *File, char *Line, int count)
+{
+       char *ptr;
 
-  if (fgets(Line, count, File)) {
-    ptr=Line+strlen(Line)-1;
+       if (fgets(Line, count, File)) {
+               ptr = Line + strlen(Line) - 1;
 
-    while ( (*ptr == '\n' || *ptr == '\r') && ptr>=Line) *ptr--='\0';
+               while ( (*ptr == '\n' || *ptr == '\r') && ptr>=Line)
+                       *ptr--='\0';
 
-    return strlen(Line);
-  } else return -1;
+               return strlen(Line);
+       }
+       else
+               return 0;
 }
 
-/*
- * like atoi, but of a non-null-terminated string of a specified portion
+static PhoneModel models[] = {
+       {NULL,    "", 0 },
+       {"2711",  "?????", PM_SMS },            /* Dancall */
+       {"2731",  "?????", PM_SMS },
+       {"1611",  "NHE-5", 0 },
+       {"2110i", "NHE-4", PM_SMS },
+       {"2148i", "NHK-4", 0 },
+       {"3110",  "0310" , PM_SMS | PM_DTMF | PM_DATA }, /* NHE-8 */
+       {"3210",  "NSE-8", PM_SMS | PM_DTMF },
+       {"3210",  "NSE-9", PM_SMS | PM_DTMF },
+       {"3310",  "NHM-5", PM_SMS | PM_DTMF },
+       {"3330",  "NHM-6", PM_SMS | PM_DTMF },
+       {"3810",  "0305" , PM_SMS | PM_DTMF | PM_DATA }, /* NHE-9 */
+       {"5110",  "NSE-1", PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"5130",  "NSK-1", PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"5160",  "NSW-1", PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"5190",  "NSB-1", PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"6110",  "NSE-3", PM_CALLERGROUP | PM_CALENDAR | PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"6120",  "NSC-3", PM_CALLERGROUP | PM_CALENDAR | PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"6130",  "NSK-3", PM_CALLERGROUP | PM_CALENDAR | PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"6150",  "NSM-1", PM_CALLERGROUP | PM_CALENDAR | PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"616x",  "NSW-3", PM_CALLERGROUP | PM_CALENDAR | PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"6185",  "NSD-3", PM_CALLERGROUP | PM_CALENDAR | PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"6190",  "NSB-3", PM_CALLERGROUP | PM_CALENDAR | PM_NETMONITOR | PM_KEYBOARD | PM_SMS | PM_DTMF | PM_DATA | PM_SPEEDDIAL | PM_AUTHENTICATION },
+       {"6210",  "NPE-3", PM_CALLERGROUP | PM_CALENDAR | PM_EXTPBK },
+       {"6250",  "NHM-3", PM_CALLERGROUP | PM_CALENDAR | PM_EXTPBK },
+       {"7110",  "NSE-5", PM_CALLERGROUP | PM_SPEEDDIAL | PM_EXTPBK },
+       {"8810",  "NSE-6", PM_SMS | PM_DTMF | PM_DATA },
+       {"8110i", "0423",  PM_SMS | PM_DTMF | PM_DATA }, /* Guess for NHE-6 */
+       {"8110",  "0423" , PM_SMS | PM_DTMF | PM_DATA }, /* NHE-6BX */
+       {"9000i", "RAE-4", 0 },
+       {"9110",  "RAE-2", 0 },
+       {"550",   "THF-10", 0 },
+       {"540",   "THF-11", 0 },
+       {"650",   "THF-12", 0 },
+       {"640",   "THF-13", 0 },
+/* "AT" modele, all are prefixed by "AT-" to not to clash with FBUS interface to the same phone! 
  */
-int mem_to_int(const char str[], int len)
+       {"M20",   "AT-M20",                            PM_SMS },
+       {"9110",  "AT-RAE-2",                          PM_SMS },
+       {"9210",  "AT-Nokia Communicator GSM900/1800", PM_SMS },
+       {NULL,    NULL, 0 }
+};
+
+PhoneModel *GetPhoneModel (const char *num)
 {
-  char aux[81];
+       register int i = 0;
+
+       while (models[i].number != NULL) {
+               if (strcmp (num, models[i].number) == 0) {
+                       dprintf("Found model\n");
+                       return (&models[i]);
+               }
+               else {
+                       dprintf("comparing %s and %s\n", num, models[i].number);
+               }
+               i++;
+       }
+
+       return (&models[0]);
+}
 
-  strncpy(aux, str, len);
-  aux[len]=0;
-  return( atoi(aux) );
-} 
+inline char *GetModel (const char *num)
+{
+       return (GetPhoneModel(num)->model);
+}
 
-/*
- * make hexdump of Message
- */
-#ifdef DEBUG
-void hexdump(u16 MessageLength, u8 *MessageBuffer)
+#ifndef HAVE_VASPRINTF
+/* Adapted from snprintf(3) man page: */
+int gvasprintf(char **destp,const char *fmt,va_list ap)
 {
-  int count;
-  int n=0;
-  char string1[80]="";
-  char string2[80]="";
-  char hex1[10];
-  char hex2[10];
-  for (count = 0; count < MessageLength; count ++)
-  {
-    n++;
-
-    switch (MessageBuffer[count]) {
-      case 0x09:
-        sprintf(hex1,"%02x  ",MessageBuffer[count]);
-        strcpy(hex2,".");
-        break;
-      default:
-        if (isprint(MessageBuffer[count]))
-          sprintf(hex1,"%02x%c ",MessageBuffer[count],MessageBuffer[count]);
-        else
-          sprintf(hex1,"%02x  ",MessageBuffer[count]);
-
-        if (isprint(MessageBuffer[count])) sprintf(hex2,"%c",MessageBuffer[count]);
-                                      else strcpy(hex2,".");
-        break;
-    }
-
-    if ( n!=15 && count != MessageLength-1 ) hex1[3]='|';
-    strcat(string1,hex1);
-    strcat(string2,hex2);
-    if ( n==15 || count == MessageLength-1 )
-    {      
-      fprintf(stdout,"%-60s%03x %s\n",string1,count+1,string2);
-      strcpy(string1,"");
-      strcpy(string2,"");
-      n=0;
-    }
-  }//for count
-
-  if (n!=0) fprintf (stdout,_("\n")); 
-  fflush(stdout);
+int n,size=0x100;
+char *p,*pnew;
+
+       if (!(p=malloc(size))) {
+               *destp=NULL;
+               return(-1);
+               }
+       for (;;) {
+               /* Try to print in the allocated space. */
+               n=gvsprintf(p,size,fmt,ap);
+               /* If that worked, return the string. */
+               if (n>-1 && n<size) {
+                       *destp=p;
+                       return(n);
+                       }
+               /* Else try again with more space. */
+               if (n>-1)       /* glibc 2.1 */
+                       size=n+1;       /* precisely what is needed */
+               else            /* glibc 2.0 */
+                       size*=2;        /* twice the old size */
+               if (!(pnew=realloc(p,size))) {
+                       free(p);
+                       *destp=NULL;
+                       return(-1);
+                       }
+               p=pnew;
+       }
 }
+#endif
+
+#ifndef HAVE_ASPRINTF
+int gasprintf(char **destp,const char *fmt,...)
+{
+va_list ap;
+int r;
 
-void txhexdump(u16 MessageLength, u8 *MessageBuffer)
-{ 
-  int count;
-  int n=0;
-  for (count = 0; count < MessageLength; count ++)
-   {
-    n++;
-    fprintf(stdout,_("%02x"),MessageBuffer[count]);
-    switch (MessageBuffer[count]) {
-      case 0x09:
-        fprintf(stdout,_(" |"));
-        break;
-      default:
-        if (isprint(MessageBuffer[count])) fprintf(stdout, _("%c|"),MessageBuffer[count]);
-                                      else fprintf(stdout,_(" |"));
-        break;
-    }
-
-    if (n==18)
-    { 
-      fprintf (stdout,_("\n"));
-      n=0;
-    }
-   }//for count
-
-  if (n!=0) fprintf (stdout,_("\n")); 
-
-  fflush(stdout);
+       va_start(ap,fmt);
+       r=gvasprintf(destp,fmt,ap);
+       va_end(ap);
+       return(r);
 }
 #endif