First version, development moved to 5110-connected machine
authorshort <>
Mon, 25 Feb 2002 02:49:24 +0000 (02:49 +0000)
committershort <>
Mon, 25 Feb 2002 02:49:24 +0000 (02:49 +0000)
53 files changed:
Makefile
Makefile.global.in
acconfig.h
bigfunc [new file with mode: 0755]
common/Makefile
common/data/at-emulator.c
common/data/datapump.c
common/data/rlp-common.c
common/data/rlp-crc24.c
common/data/virtmodem.c
common/devices/device.c
common/devices/unixserial.c
common/files/cfgreader.c
common/files/midifile.c
common/gsm-api.c
common/gsm-bitmaps.c
common/gsm-calendar.c
common/gsm-coding.c
common/gsm-datetime.c
common/gsm-networks.c
common/gsm-phonebook.c
common/gsm-sms.c
common/gsm-wap.c
common/misc.c
common/newmodules/n6110.c
common/newmodules/newat.c
common/newmodules/sniff/sniff.c
common/protocol/at.c
common/protocol/fbus.c
common/protocol/fbusirda.c
common/protocol/mbus.c
configure.in
do [new file with mode: 0755]
getopt/getopt.c
getopt/getopt1.c
gnokii/Makefile
gnokii/gnokii.c
gnokii/gnokii.h
include/data/at-emulator.h
include/data/datapump.h
include/data/rlp-common.h
include/data/virtmodem.h
include/devices/device.h
include/devices/unixserial.h
include/files/cfgreader.h
include/gsm-api.h
include/gsm-coding.h
include/gsm-networks.h
include/gsm-sms.h
include/newmodules/n6110.h
include/protocol/fbus.h
include/uccompat.h [new file with mode: 0644]
utils/Makefile

index 1feaf9c..18a138b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -18,9 +18,9 @@ include ${TOPDIR}/Makefile.global
 BIN_DIRS = gnokii
 
 ifndef WIN32
-BIN_DIRS += gnokiid
-BIN_DIRS += mgnetd
-BIN_DIRS += mgnetd/mg_demo_client
+###BIN_DIRS += gnokiid
+###BIN_DIRS += mgnetd
+###BIN_DIRS += mgnetd/mg_demo_client
 endif
 
 DIRS =  common \
@@ -38,6 +38,8 @@ endif
 
 GTK_DIRS =  xgnokii \
             xlogos
+#uClinux:
+GTK_LIBS=
 
 PO_DIR   =     po
 DOCS_DIR =     Docs
index 23fa672..b00c902 100644 (file)
@@ -46,6 +46,7 @@ CFLAGS         = @CFLAGS@
 CPPFLAGS       = @CPPFLAGS@
 LIBS           = @LIBS@
 LEX            = @LEX@
+AR             = @AR@
 
 GTK_CFLAGS     = @GTK_CFLAGS@
 GTK_LIBS       = @GTK_LIBS@
index a5dae23..dfd6d99 100644 (file)
 
 */
 
-/* DO NOT EDIT MANUALLY !!! */
-
 #ifndef __CONFIG_H__
 #define __CONFIG_H__
 
-#define VERSION    "@VERSION@"
-#define XVERSION   "@XVERSION@"
-#define XGNOKIIDIR "@XGNOKIIDIR@/@XPACKAGE@"
+@TOP@
+
 
 /* Define if you have timersub() */
 #undef HAVE_TIMEOPS
 /* Define if you compile for M$ Windows */
 #undef WIN32
 
+/* Missing symbols */
+#undef VERSION
+#undef XVERSION
+#undef DEBUG
+#undef HAVE_CFSETISPEED
+#undef HAVE_CFSETOSPEED
+#undef HAVE_CFSETSPEED
+#undef HAVE_LIBINTL
+#undef HAVE_LIBINTL_H
+#undef HAVE_TERMIOS_CSPEED
+#undef HAVE_TIMEOPS
+#undef HAVE_TM_GMTON
+#undef RLP_DEBUG
+#undef SECURITY
+#undef USE_NLS
+#undef USE_UNIX98PTYS
+#undef WIN32
+#undef XDEBUG
+#undef XPM
+#undef CONFIG_CFG_INITLENGTH
+#undef CONFIG_CFG_MODEL
+#undef CONFIG_CFG_PORT
+
+
+@BOTTOM@
+
+#include "uccompat.h"
+
+
 #endif /* __CONFIG_H__ */
diff --git a/bigfunc b/bigfunc
new file mode 100755 (executable)
index 0000000..231e964
--- /dev/null
+++ b/bigfunc
@@ -0,0 +1,28 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+open NM,"-|",'m68k-pic-coff-nm gnokii/gnokii.coff|sort'
+               or die "nm: $!";
+my(%big,$prevhex,$prevsym,$tot);
+while (<NM>) {
+       chomp;
+       /^([0-9a-f]+) (\w) (.*)$/ or die "parse: $_";
+       my $hex=hex $1;
+       my $type=$2;
+       my $sym=$3;
+       next if $type!~/[tT]/ || $sym=~/^\./ || $sym=~/^L\d+$/ || $sym eq "__gnu_compiled_c" || $sym eq "gcc2_compiled.";
+       if ($prevhex) {
+               warn "dup: $prevsym" if exists $big{$prevsym};
+               $big{$prevsym}=$hex-$prevhex;
+               $tot+=$hex-$prevhex;
+               }
+       $prevhex=$hex;
+       $prevsym=$sym;
+       }
+close NM;
+$big{"_TOTAL"}=$tot;
+for (sort { $big{$b} <=> $big{$a} } keys %big) {
+       printf "%4u %s\n",$big{$_},$_;
+       }
index e396803..570b19a 100644 (file)
@@ -18,30 +18,31 @@ DIRS =              protocol \
                oldmodules \
                newmodules
 
+#      files/midifile.o \
+#      gsm-ringtones.o \
+#      gsm-wap.o \
+#      gsm-calendar.o \
+#      gsm-bitmaps.o \
+#      protocol/fbusirda.o \
+#      protocol/mbus.o \
+#      protocol/at.o \
+#      newmodules/n7110.o
+#      newmodules/sniff/sniff.o \
+#      newmodules/newat.o \
+
 OBJS = devices/device.o \
        data/rlp-common.o \
        data/rlp-crc24.o \
-       files/midifile.o \
-       gsm-ringtones.o \
-       gsm-coding.o \
        gsm-datetime.o \
-       gsm-wap.o \
        gsm-api.o \
+       gsm-sms.o \
+       gsm-coding.o \
        gsm-phonebook.o \
-       gsm-calendar.o \
        gsm-networks.o \
-       gsm-bitmaps.o \
-       gsm-sms.o \
        files/cfgreader.o \
        misc.o \
        protocol/fbus.o \
-       protocol/fbusirda.o \
-       protocol/mbus.o \
-       protocol/at.o \
-       newmodules/sniff/sniff.o \
-       newmodules/newat.o \
-       newmodules/n6110.o \
-       newmodules/n7110.o
+       newmodules/n6110.o
 
 DATA_OBJS = data/virtmodem.o \
        data/at-emulator.o \
@@ -50,22 +51,22 @@ DATA_OBJS = data/virtmodem.o \
 ifdef WIN32
        OBJS += $(TOPDIR)/win32/winserial.o
 else
-       OBJS += devices/unixserial.o \
-               devices/unixirda.o \
-               devices/tekram.o
+       OBJS += devices/unixserial.o
+#              devices/unixirda.o \
+#              devices/tekram.o
 endif
 
 ifdef XPM_CFLAGS
     CFLAGS += $(XPM_CFLAGS)
 endif
 
-all: COMMON.o DATA.o gsm-filetypes.o
+all: common.a data.a ##gsm-filetypes.o
 
-COMMON.o: $(OBJS)
-       $(LD) $(LDREL) $(LDOUT) COMMON.o $(OBJS)
+common.a: $(OBJS)
+       $(AR) rcs $@ $^
 
-DATA.o: $(DATA_OBJS)
-       $(LD) $(LDREL) $(LDOUT) DATA.o $(DATA_OBJS)
+data.a: $(DATA_OBJS)
+       $(AR) rcs $@ $^
 
 gsm-filetypes.o: files/gsm-filetypes.c 
        $(CC) $(CFLAGS) -c files/gsm-filetypes.c
index 41445c8..5f84b0b 100644 (file)
@@ -14,6 +14,8 @@
   
 */
 
+#include "config.h"
+
 #define                __data_at_emulator_c
 
 
@@ -50,28 +52,32 @@ bool ATEM_Initialised = false;      /* Set to true once initialised */
 extern bool    CommandMode;
 extern int ConnectCount;
 
-char ModelName[80]; /* This seems to be needed to avoid seg-faults */
-char PortName[80];
+static char ModelName[80]; /* This seems to be needed to avoid seg-faults */
+static char PortName[80];
 
 
        /* Local variables */
-int    PtyRDFD;        /* File descriptor for reading and writing to/from */
-int    PtyWRFD;        /* pty interface - only different in debug mode. */ 
+extern int     PtyRDFD;        /* File descriptor for reading and writing to/from */
+extern int     PtyWRFD;        /* pty interface - only different in debug mode. */ 
+
+static u8      ModemRegisters[MAX_MODEM_REGISTERS];
+static char    CmdBuffer[MAX_CMD_BUFFERS][CMD_BUFFER_LENGTH];
+static int     CurrentCmdBuffer;
+static int     CurrentCmdBufferIndex;
+static bool    VerboseResponse;        /* Switch betweek numeric (4) and text responses (ERROR) */
+static char    IncomingCallNo;
+static int     MessageFormat;          /* Message Format (text or pdu) */
 
-u8     ModemRegisters[MAX_MODEM_REGISTERS];
-char   CmdBuffer[MAX_CMD_BUFFERS][CMD_BUFFER_LENGTH];
-int    CurrentCmdBuffer;
-int    CurrentCmdBufferIndex;
-bool   VerboseResponse;        /* Switch betweek numeric (4) and text responses (ERROR) */
-char    IncomingCallNo;
-int     MessageFormat;          /* Message Format (text or pdu) */
+static void    ATEM_ParseAT(char *cmd_buffer);
 
        /* Current command parser */
-void   (*Parser)(char *);
+static void    (*Parser)(char *);
 //void         (*Parser)(char *) = ATEM_ParseAT; /* Current command parser */
 
-GSM_MemoryType         SMSType;
-int    SMSNumber;
+static GSM_MemoryType  SMSType;
+static int     SMSNumber;
+
+static void    ATEM_InitRegisters(void);
 
        /* If initialised in debug mode, stdin/out is used instead
           of ptys for interface. */
@@ -112,7 +118,7 @@ bool        ATEM_Initialise(int read_fd, int write_fd, char *model, char *port)
 }
 
        /* Initialise the "registers" used by the virtual modem. */
-void   ATEM_InitRegisters(void) 
+static void    ATEM_InitRegisters(void) 
 {
 
        ModemRegisters[REG_RINGATA] = 0;
@@ -137,6 +143,7 @@ void ATEM_CallPassup(char c)
        }
 }
 
+static void    ATEM_StringOut(char *buffer);
 
     /* Handler called when characters received from serial port.
        calls state machine code to process it. */
@@ -177,9 +184,13 @@ void       ATEM_HandleIncomingData(char *buffer, int length)
        }
 }     
 
+static bool    ATEM_CommandPlusC(char **buf);
+static bool    ATEM_CommandPlusG(char **buf);
+static int             ATEM_GetNum(char **p);
+static void    ATEM_ParseSMS(char *cmd_buffer);
 
        /* Parser for standard AT commands.  cmd_buffer must be null terminated. */
-void   ATEM_ParseAT(char *cmd_buffer)
+static void    ATEM_ParseAT(char *cmd_buffer)
 {
        char *buf;
        char number[30];
@@ -365,8 +376,10 @@ static void ATEM_HandleSMS()
        return;
 }
 
+static void    ATEM_ParseDIR(char *cmd_buffer);
+
        /* Parser for SMS interactive mode */
-void   ATEM_ParseSMS(char *buff)
+static void    ATEM_ParseSMS(char *buff)
 {
        if (!strcasecmp(buff, "HELP")) {
                ATEM_StringOut(_("\n\rThe following commands work...\n\r"));
@@ -391,7 +404,7 @@ void        ATEM_ParseSMS(char *buff)
 }
 
        /* Parser for DIR sub mode of SMS interactive mode. */
-void   ATEM_ParseDIR(char *buff)
+static void    ATEM_ParseDIR(char *buff)
 {
        switch (toupper(*buff)) {
                case 'P':
@@ -415,7 +428,7 @@ void        ATEM_ParseDIR(char *buff)
  
        /* Handle AT+C commands, this is a quick hack together at this
           stage. */
-bool   ATEM_CommandPlusC(char **buf)
+static bool    ATEM_CommandPlusC(char **buf)
 {
        float           rflevel;
        GSM_RFUnits     rfunits = GRF_CSQ;
@@ -515,7 +528,7 @@ bool        ATEM_CommandPlusC(char **buf)
                switch (**buf) {
                case '=':
                        buf[0]++;
-                       sscanf(*buf, "%d", &index);
+                       index = atoi(*buf);
                        buf[0] += strlen(*buf);
 
                        error = ATEM_ReadSMS(index, SMSType, &message);
@@ -599,7 +612,7 @@ bool        ATEM_CommandPlusC(char **buf)
 }
 
        /* AT+G commands.  Some of these responses are a bit tongue in cheek... */
-bool   ATEM_CommandPlusG(char **buf)
+static bool    ATEM_CommandPlusG(char **buf)
 {
        char            buffer[MAX_LINE_LENGTH];
 
@@ -685,7 +698,7 @@ void        ATEM_ModemResult(int code)
 
        /* Get integer from char-pointer, set pointer to end of number
           stolen basically verbatim from ISDN code.  */
-int ATEM_GetNum(char **p)
+static int ATEM_GetNum(char **p)
 {
        int v = -1;
 
@@ -699,7 +712,7 @@ int ATEM_GetNum(char **p)
        /* Write string to virtual modem port, either pty or
           STDOUT as appropriate.  This function is only used during
           command mode - data pump is used when connected.  */
-void   ATEM_StringOut(char *buffer)
+static void    ATEM_StringOut(char *buffer)
 {
        int             count = 0;
        char    out_char;
index 4eede53..adb201d 100644 (file)
@@ -14,6 +14,8 @@
 
 */
 
+#include "config.h"
+
 #define                __data_datapump_c
 
 
@@ -27,7 +29,9 @@
 #include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#ifndef UCLINUX
 #include <sys/poll.h>
+#endif
 #include <unistd.h>
 
 
 extern bool CommandMode;
 
 /* Local variables */
-int            PtyRDFD;        /* File descriptor for reading and writing to/from */
-int            PtyWRFD;        /* pty interface - only different in debug mode. */ 
-struct pollfd ufds;
-u8 pluscount;
-bool connected;
+extern int             PtyRDFD;        /* File descriptor for reading and writing to/from */
+extern int             PtyWRFD;        /* pty interface - only different in debug mode. */ 
+static u8 pluscount;
+static bool connected;
+
+static int DP_CallBack(RLP_UserInds ind, u8 *buffer, int length);
 
 bool DP_Initialise(int read_fd, int write_fd)
 {
        PtyRDFD = read_fd;
        PtyWRFD = write_fd;
-       ufds.fd=PtyRDFD;
-       ufds.events=POLLIN;
        RLP_Initialise(GSM->SendRLPFrame, DP_CallBack);
        RLP_SetUserRequest(Attach_Req,true);
        pluscount=0;
@@ -63,7 +66,7 @@ bool DP_Initialise(int read_fd, int write_fd)
 }
 
 
-int DP_CallBack(RLP_UserInds ind, u8 *buffer, int length)
+static int DP_CallBack(RLP_UserInds ind, u8 *buffer, int length)
 {
        int temp;
 
@@ -91,15 +94,23 @@ int DP_CallBack(RLP_UserInds ind, u8 *buffer, int length)
        case Reset_Ind:
                RLP_SetUserRequest(Reset_Resp,true);
                break;
-       case GetData:
-               if (poll(&ufds,1,0)) {
+       case GetData: {
+               fd_set readfds;
+               struct timeval timeout;
+
+               FD_ZERO(&readfds);
+               FD_SET(PtyRDFD,&readfds);
+               timeout.tv_sec=0;
+               timeout.tv_usec=0;
+
+               if (select(PtyRDFD+1,&readfds,NULL/*writefds*/,NULL/*exceptfds*/,&timeout)) {
 
                        /* Check if the program has closed */
                        /* Return to command mode */
                        /* Note that the call will still be in progress, */
                        /* as with a normal modem (I think) */
 
-                       if (ufds.revents!=POLLIN) { 
+                       if (!FD_ISSET(PtyRDFD,&readfds)) { 
                                CommandMode=true;
                                /* Set the call passup back to the at emulator */
                                GSM->DialData(NULL,-1,&ATEM_CallPassup);
@@ -137,7 +148,7 @@ int DP_CallBack(RLP_UserInds ind, u8 *buffer, int length)
                        return temp;
                }
                return 0;
-               break;
+               break;
 
        default:
 
index 9c46e0d..509faa7 100644 (file)
@@ -16,6 +16,8 @@
 
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
 
 /* Our state machine which handles all of nine possible states of RLP
    machine. */
-void MAIN_STATE_MACHINE(RLP_F96Frame *frame, RLP_F96Header *header);
+static void MAIN_STATE_MACHINE(RLP_F96Frame *frame, RLP_F96Header *header);
 
 /* This is the type we are just handling. */
-RLP_FrameTypes CurrentFrameType;
+static RLP_FrameTypes CurrentFrameType;
 
 /* Current state of RLP state machine. */
-RLP_State      CurrentState=RLP_S0; /* We start at ADM and Detached */
+static RLP_State      CurrentState=RLP_S0; /* We start at ADM and Detached */
 
 /* Next state of RLP state machine. */
-RLP_State      NextState;
+static RLP_State      NextState;
 
 /* Pointer to Send function that sends frame to phone. */
-bool      (*RLPSendFunction)(RLP_F96Frame *frame, bool out_dtx);
+static bool      (*RLPSendFunction)(RLP_F96Frame *frame, bool out_dtx);
 
 /* Pointer to Passup function which returns data/inds */
-int      (*RLP_Passup)(RLP_UserInds ind, u8 *buffer, int length);
+static int      (*RLP_Passup)(RLP_UserInds ind, u8 *buffer, int length);
 
 
 /* State variables - see GSM 04.22, Annex A, section A.1.2 */
 
-RLP_StateVariable UA_State;
-RLP_StateVariable UI_State;
-RLP_StateVariable Ackn_State;
-RLP_StateVariable Poll_State;
-RLP_StateVariable Poll_xchg;
-RLP_StateVariable SABM_State;
-RLP_StateVariable DISC_State;
-RLP_StateVariable DM_State;  /* FIXME - not handled */
-RLP_StateVariable XI_R_State;
-RLP_StateVariable XID_C_State;
-RLP_StateVariable XID_R_State;
-RLP_StateVariable TEST_R_State;
-
-u8 VR=0;
-u8 VA=0;
-u8 VS=0;
-u8 VD=0;
-u8 DISC_Count;
-
-u8 DTX_VR;
-RLP_FrameTypes DTX_SF;
+static RLP_StateVariable UA_State;
+/*
+static RLP_StateVariable UI_State;
+*/
+static RLP_StateVariable Ackn_State;
+static RLP_StateVariable Poll_State;
+static RLP_StateVariable Poll_xchg;
+static RLP_StateVariable SABM_State;
+static RLP_StateVariable DISC_State;
+static RLP_StateVariable DM_State;  /* FIXME - not handled */
+/*
+static RLP_StateVariable XID_C_State;
+*/
+static RLP_StateVariable XID_R_State;
+/*
+static RLP_StateVariable TEST_R_State;
+*/
+
+static u8 VR=0;
+static u8 VA=0;
+static u8 VS=0;
+static u8 VD=0;
+static u8 DISC_Count;
+
+static u8 DTX_VR;
+static RLP_FrameTypes DTX_SF;
 
 #define RLP_M 62
 
-RLP_Data R[RLP_M];
-RLP_Data S[RLP_M];
+static RLP_Data R[RLP_M];
+static RLP_Data S[RLP_M];
 
-RLP_StateVariable SABM_State;
-int SABM_Count;
+static RLP_StateVariable SABM_State;
+static int SABM_Count;
 
-RLP_UserRequestStore UserRequests;
+static RLP_UserRequestStore UserRequests;
 
-u8 Poll_Count=0;
+static u8 Poll_Count=0;
 
 /* For now timing is done based on a frame reception rate of 20ms */
 /* Serge has measured it as 18.4ms */
@@ -96,28 +103,28 @@ u8 Poll_Count=0;
 /* To set, timer is loaded with RLP_Timeout1_Limit/RLP_T_Scaling. */
 /* Each received frame (including NULLS / errors) any >0 timer is decrease */
 
-int T;
-int T_RCVS[RLP_M];
+static int T;
+static int T_RCVS[RLP_M];
 
-bool UA_FBit=true;
-bool Ackn_FBit=false;
-bool DM_FBit=false;  /* FIXME - not handled */
-bool RRReady=false;
-bool LRReady=true;   /* FIXME - not handled (as if we couldn't keep up with 9600bps :-) */
-bool DISC_PBit=false;
+static bool UA_FBit=true;
+static bool Ackn_FBit=false;
+static bool DM_FBit=false;  /* FIXME - not handled */
+static bool RRReady=false;
+static bool LRReady=true;   /* FIXME - not handled (as if we couldn't keep up with 9600bps :-) */
+static bool DISC_PBit=false;
 
-u8 LastStatus=0xff;   /* Last Status byte */
+static u8 LastStatus=0xff;   /* Last Status byte */
 
 
 /* RLP Parameters. FIXME: Reset these - e.g. when entering state 0 */
 
-u8 RLP_SEND_WS = RLP_M-1;
-u8 RLP_RCV_WS = RLP_M-1;
-u8 RLP_Timeout1_Limit = 55;
-u8 RLP_N2 = 15; /* Maximum number of retransmisions. GSM spec says 6 here, but
-                   Nokia will XID this. */
-u8 RLP_T2=0;
-u8 RLP_VersionNumber=0;
+static u8 RLP_SEND_WS = RLP_M-1;
+static u8 RLP_RCV_WS = RLP_M-1;
+static u8 RLP_Timeout1_Limit = 55;
+static u8 RLP_N2 = 15; /* Maximum number of retransmisions. GSM spec says 6 here, but
+                          Nokia will XID this. */
+static u8 RLP_T2=0;
+static u8 RLP_VersionNumber=0;
 
 
 
@@ -197,7 +204,7 @@ void RLP_SetUserRequest(RLP_UserRequests type, bool value) {
 
 /* Check whether a user event is set */
 
-bool RLP_GetUserRequest(RLP_UserRequests type) {
+static bool RLP_GetUserRequest(RLP_UserRequests type) {
 
        bool result=false, *x;
 
@@ -230,7 +237,7 @@ bool RLP_GetUserRequest(RLP_UserRequests type) {
        return result;
 }
 
-void RLP_SetTimer(int *timer)
+static void RLP_SetTimer(int *timer)
 {
        *timer=(int)(RLP_Timeout1_Limit/RLP_T_Scaling);
 }
@@ -280,7 +287,7 @@ static bool InWindow(u8 val, u8 lower, u8 upper)
        return (val <= upper) || (val >= lower);
 }
 
-void RLP_Init_link_vars(void)
+static void RLP_Init_link_vars(void)
 {
        int i;
   
@@ -305,7 +312,7 @@ void RLP_Init_link_vars(void)
 }
 
 
-void RLP_AddRingBufferDataToSlots(void)
+static void RLP_AddRingBufferDataToSlots(void)
 {
        u8 buffer[24];
        int size;
@@ -329,9 +336,11 @@ void RLP_AddRingBufferDataToSlots(void)
 }
 
 
+#ifndef UCLINUX
+
 /* FIXME: Remove this after finishing. */
 
-void X(RLP_F96Frame *frame) {
+static void X(RLP_F96Frame *frame) {
 
        int i;
 
@@ -340,9 +349,10 @@ void X(RLP_F96Frame *frame) {
    
 }
 
+#endif /* UCLINUX */
 
  
-void ResetAllT_RCVS(void)
+static void ResetAllT_RCVS(void)
 {
 
        int i;
@@ -353,7 +363,7 @@ void ResetAllT_RCVS(void)
 
 /* This function is used for sending RLP frames to the phone. */
 
-void RLP_SendF96Frame(RLP_FrameTypes FrameType,
+static void RLP_SendF96Frame(RLP_FrameTypes FrameType,
                       bool OutCR, bool OutPF,
                       u8 OutNR, u8 OutNS,
                       u8 *OutData, u8 OutDTX)
@@ -594,6 +604,8 @@ void RLP_SendF96Frame(RLP_FrameTypes FrameType,
 
 }
 
+static void RLP_DecodeF96Header(RLP_F96Frame *frame, RLP_F96Header *header);
+
 /* Check_input_PDU in Serge's code. */
 
 void RLP_DisplayF96Frame(RLP_F96Frame *frame)
@@ -930,14 +942,14 @@ void RLP_DisplayF96Frame(RLP_F96Frame *frame)
 
 /* FIXME: real TEST_Handling - we do not handle TEST yet. */
 
-void TEST_Handling() {
+static void TEST_Handling() {
 }
 
 
 
 /* FIXME: better XID_handling - but this will answer a XID command. */
 
-bool XID_Handling (RLP_F96Frame *frame, RLP_F96Header *header) {
+static bool XID_Handling (RLP_F96Frame *frame, RLP_F96Header *header) {
   
        u8 count;
        u8 type;
@@ -1026,7 +1038,7 @@ bool XID_Handling (RLP_F96Frame *frame, RLP_F96Header *header) {
 }
 
 
-bool Send_TXU(RLP_F96Frame *frame, RLP_F96Header *header) {
+static bool Send_TXU(RLP_F96Frame *frame, RLP_F96Header *header) {
 
 #ifdef DEBUG
        //    fprintf(stdout, _("Send_TXU()\n"));
@@ -1070,7 +1082,7 @@ bool Send_TXU(RLP_F96Frame *frame, RLP_F96Header *header) {
 
 /* Deliver data */
 
-void RLP_DeliverAllInSeqIF()
+static void RLP_DeliverAllInSeqIF()
 {
        int i,j;
 
@@ -1098,7 +1110,7 @@ void RLP_DeliverAllInSeqIF()
 
 
 /* Mark any missing information frames between VR and Ns*/
-void RLP_MarkMissingIF(u8 Ns)
+static void RLP_MarkMissingIF(u8 Ns)
 {
        u8 i;
        for (i=VR; i!=Ns; i=Incr(i)) {
@@ -1109,7 +1121,7 @@ void RLP_MarkMissingIF(u8 Ns)
 
 /* Information frame handler */
 
-bool RLP_I_Handler(RLP_F96Frame *frame, RLP_F96Header *header)
+static bool RLP_I_Handler(RLP_F96Frame *frame, RLP_F96Header *header)
 {
 
        if ((header->CR) && (header->PF))
@@ -1142,7 +1154,7 @@ bool RLP_I_Handler(RLP_F96Frame *frame, RLP_F96Header *header)
 
 /* Mark acknowledged send frames */
 
-void RLP_AdvanceVA(u8 Nr)
+static void RLP_AdvanceVA(u8 Nr)
 {
        while (VA!=Nr) {
                S[VA].State=_idle;
@@ -1153,7 +1165,7 @@ void RLP_AdvanceVA(u8 Nr)
 
 /* Decrease VS back down to Nr since these have not been acknowledged */
 
-void RLP_DecreaseVS(u8 Nr)
+static void RLP_DecreaseVS(u8 Nr)
 {
        while (VS!=Nr) {
                VS=Decr(VS);
@@ -1163,7 +1175,7 @@ void RLP_DecreaseVS(u8 Nr)
 
 /* Supervisory frame handling */
 
-void RLP_S_Handler(RLP_F96Frame *frame, RLP_F96Header *header)
+static void RLP_S_Handler(RLP_F96Frame *frame, RLP_F96Header *header)
 {
        u8 i;
 
@@ -1219,7 +1231,7 @@ void RLP_S_Handler(RLP_F96Frame *frame, RLP_F96Header *header)
 
 /* Find the first SREJ frame */
 
-bool RLP_SREJSlot(u8 *x)
+static bool RLP_SREJSlot(u8 *x)
 {
        u8 i;
 
@@ -1235,7 +1247,7 @@ bool RLP_SREJSlot(u8 *x)
 
 /* Check if any SREJ frames need sending, if not send the next in line */
 
-bool RLP_PrepareDataToTransmit(u8 *p)
+static bool RLP_PrepareDataToTransmit(u8 *p)
 {
        u8 i;
 
@@ -1258,7 +1270,7 @@ bool RLP_PrepareDataToTransmit(u8 *p)
 
 /* Send a SREJ command */
 
-void RLP_SendSREJ(u8 x)
+static void RLP_SendSREJ(u8 x)
 {
        u8 k;
   
@@ -1298,7 +1310,7 @@ void RLP_SendSREJ(u8 x)
 
 /* Send a command */
 
-void RLP_Send_XX_Cmd(RLP_FrameTypes type)
+static void RLP_Send_XX_Cmd(RLP_FrameTypes type)
 {
        u8 k;
 
@@ -1336,7 +1348,7 @@ void RLP_Send_XX_Cmd(RLP_FrameTypes type)
 
 /* Send a Response */
 
-void RLP_Send_XX_Resp(RLP_FrameTypes type)
+static void RLP_Send_XX_Resp(RLP_FrameTypes type)
 {
        u8 k;
   
@@ -1362,7 +1374,7 @@ void RLP_Send_XX_Resp(RLP_FrameTypes type)
 
 /* Decide which frame to use and send it - currently only used in state 4 */
 
-void RLP_SendData()
+static void RLP_SendData()
 {
        u8 x;
 
@@ -1382,7 +1394,7 @@ void RLP_SendData()
        else RLP_Send_XX_Cmd(RLPFT_S_RNR);
 }
 
-void MAIN_STATE_MACHINE(RLP_F96Frame *frame, RLP_F96Header *header) {
+static void MAIN_STATE_MACHINE(RLP_F96Frame *frame, RLP_F96Header *header) {
        int i;
 
        switch (CurrentState) {
@@ -1743,7 +1755,6 @@ void MAIN_STATE_MACHINE(RLP_F96Frame *frame, RLP_F96Header *header) {
                        if(SABM_State!=_idle) printf("[SABM_State %d]",SABM_State);
                        if(DISC_State!=_idle) printf("[DISC_State %d]",DISC_State);
                        if(DM_State!=_idle) printf("[DM_State %d]",DM_State);
-                       if(XI_R_State!=_idle) printf("[XI_R_State %d]",XI_R_State);
                        if(XID_C_State!=_idle) printf("[XID_C_State %d]",XID_C_State);
                        if(XID_R_State!=_idle) printf("[XID_R_State %d]",XID_R_State);
                        if(TEST_R_State!=_idle) printf("[TEST_R_State %d]",TEST_R_State);
@@ -1925,7 +1936,9 @@ void MAIN_STATE_MACHINE(RLP_F96Frame *frame, RLP_F96Header *header) {
    exact implementation of section 5.2.2.6, Exchange Identification, XID of
    the GSM specification 04.22. */
 
-void RLP_DisplayXID(u8 *frame) 
+#ifdef RLP_DEBUG
+
+static void RLP_DisplayXID(u8 *frame) 
 {
 
        int count = 25;  /* Sanity check */
@@ -2005,10 +2018,12 @@ void RLP_DisplayXID(u8 *frame)
        return;
 }
 
+#endif /* RLP_DEBUG */
+
 /* Given a pointer to an F9.6 Frame, split data out into component parts of
    header and determine frame type. */
 
-void RLP_DecodeF96Header(RLP_F96Frame *frame, RLP_F96Header *header)
+static void RLP_DecodeF96Header(RLP_F96Frame *frame, RLP_F96Header *header)
 {
 
        /* Poll/Final bit. */
index cc8af90..7f29c68 100644 (file)
@@ -16,7 +16,7 @@
 
 /* CRC-24 table is used for computation of RLP checksum. */
 
-const u32 CRC24_Table[256] = {
+static const u32 CRC24_Table[256] = {
     0x00000000, 0x00D6A776, 0x00F64557, 0x0020E221, 0x00B78115, 0x00612663,
     0x0041C442, 0x00976334, 0x00340991, 0x00E2AEE7, 0x00C24CC6, 0x0014EBB0,
     0x00838884, 0x00552FF2, 0x0075CDD3, 0x00A36AA5, 0x00681322, 0x00BEB454,
@@ -62,7 +62,7 @@ const u32 CRC24_Table[256] = {
     0x006D7F0C, 0x00BBD87A, 0x009B3A5B, 0x004D9D2D
 };
 
-void    RLP_CalculateCRC24Polinomial(u8 *data, int length, u32 *polinomial)
+static void    RLP_CalculateCRC24Polinomial(u8 *data, int length, u32 *polinomial)
 {
 
     int     i;
index 7c7f4e2..664127f 100644 (file)
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/time.h>
+#ifndef UCLINUX
 #include <sys/poll.h>
 #include <pthread.h>
+#endif /* UCLINUX */
 #include <unistd.h>
 
 #include "misc.h"
        /* Global variables */
 
 //extern bool TerminateThread;
-int ConnectCount;
 
        /* Local variables */
 
 int            PtyRDFD;        /* File descriptor for reading and writing to/from */
 int            PtyWRFD;        /* pty interface - only different in debug mode. */ 
 
-bool   UseSTDIO;       /* Use STDIO for debugging purposes instead of pty */
+static bool    UseSTDIO;       /* Use STDIO for debugging purposes instead of pty */
 bool   CommandMode;
 
-pthread_t              Thread;
-bool                   RequestTerminate;
-
+static bool    VM_ThreadLoop(void);
+static GSM_Error       VM_GSMInitialise(char *model, char *port, char *initlength, GSM_ConnectionType connection, char *synchronizetime);
+static int             VM_PtySetup(char *bindir);
 
        /* If initialised in debug mode, stdin/out is used instead
           of ptys for interface. */
-bool   VM_Initialise(char *model,char *port, char *initlength, GSM_ConnectionType connection, char *bindir, bool debug_mode, bool GSMInit,char *synchronizetime)
+bool VM_Initialise(char *model,char *port, char *initlength, GSM_ConnectionType connection, char *bindir, bool debug_mode, bool GSMInit,char *synchronizetime)
 {
-       int             rtn;
-
        CommandMode = true;
 
-       RequestTerminate = false;
-
        if (debug_mode == true) {
                UseSTDIO = true;
        }
@@ -108,34 +105,34 @@ bool      VM_Initialise(char *model,char *port, char *initlength, GSM_ConnectionType
                return (false);
        }
 
-               /* Create and start thread, */
-       rtn = pthread_create(&Thread, NULL, (void *) VM_ThreadLoop, (void *)NULL);
-
-    if (rtn == EAGAIN || rtn == EINVAL) {
-        return (false);
-    }
-       return (true);
+       /* Create and start thread, */
+       return VM_ThreadLoop();
 }
 
-void   VM_ThreadLoop(void)
+static void    VM_CharHandler(void);
+
+static bool VM_ThreadLoop(void)
 {
        int res;
-       struct pollfd ufds;
+       fd_set readfds;
+       struct timeval timeout;
 
                /* Note we can't use signals here as they are already used
                   in the FBUS code.  This may warrant changing the FBUS
                   code around sometime to use select instead to free up
                   the SIGIO handler for mainline code. */
 
-       ufds.fd=PtyRDFD;
-       ufds.events=POLLIN;
-
-       while (!RequestTerminate) {
+       for (;;) {
          if (!CommandMode) {
            sleep(1);
          } else {  /* If we are in data mode, leave it to datapump to get the data */
 
-               res=poll(&ufds,1,500);
+               FD_ZERO(&readfds);
+               FD_SET(PtyRDFD,&readfds);
+               timeout.tv_sec=0;
+               timeout.tv_usec=500*1000;
+
+               res = select(PtyRDFD+1,&readfds,NULL/*writefds*/,NULL/*exceptfds*/,&timeout);
 
                switch (res) {
                        case 0: /* Timeout */
@@ -143,10 +140,10 @@ void      VM_ThreadLoop(void)
 
                        case -1:
                                perror("VM_ThreadLoop - select");
-                               exit (-1);
+                               return (false);
 
                        default:
-                         if (ufds.revents==POLLIN) {
+                         if (FD_ISSET(PtyRDFD,&readfds)) {
                            VM_CharHandler();
                          } else usleep(500); /* Probably the file has been closed */
                          break;
@@ -160,34 +157,35 @@ void      VM_ThreadLoop(void)
           the virtual modem thread */
 void           VM_Terminate(void)
 {
-     
-       /* Request termination of thread */
-       RequestTerminate = true;
-
-       /* Now wait for thread to terminate. */
-       pthread_join(Thread, NULL);
-
        if (!UseSTDIO) {
                close (PtyRDFD);
                close (PtyWRFD);
        }
 }
 
+static int     VM_GetMasterPty(char **name);
+
        /* Open pseudo tty interface and (in due course create a symlink
           to be /dev/gnokii etc. ) */
 
-int            VM_PtySetup(char *bindir)
+static int             VM_PtySetup(char *bindir)
 {
        int                     err;
+#ifndef UCLINUX
        char            mgnokiidev[200];
+#endif /* UCLINUX */
        char            *slave_name;
+#ifndef UCLINUX
        char            cmdline[200];
+#endif /* UCLINUX */
 
+#ifndef UCLINUX
        if (bindir) {
                strncpy(mgnokiidev, bindir, 200);
                strcat(mgnokiidev, "/");
        }
        strncat(mgnokiidev, "mgnokiidev", 200 - strlen(bindir));
+#endif /* UCLINUX */
 
        if (UseSTDIO) {
                PtyRDFD = STDIN_FILENO;
@@ -202,22 +200,40 @@ int               VM_PtySetup(char *bindir)
        }
        PtyWRFD = PtyRDFD;
 
+#ifndef UCLINUX
                /* Check we haven't been installed setuid root for some reason
                   if so, don't create /dev/gnokii */
        if (getuid() != geteuid()) {
                fprintf(stderr, _("gnokiid should not be installed setuid root!\n"));
                return (0);
        }
+#endif
 
 #ifdef DEBUG
-       fprintf (stderr, _("Slave pty is %s, calling %s to create /dev/gnokii.\n"), slave_name, mgnokiidev);
+       fprintf (stderr, _("Slave pty is %s, calling %s to create /dev/gnokii.\n"), slave_name,
+#ifndef UCLINUX
+                       mgnokiidev
+#else /* UCLINUX */
+                       "<uClinux>"
+#endif /* UCLINUX */
+                       );
 #endif /* DEBUG */
 
+#ifndef UCLINUX
                /* Create command line, something line ./mkgnokiidev ttyp0 */
        sprintf(cmdline, "%s %s", mgnokiidev, slave_name);
 
                /* And use system to call it. */        
        err = system (cmdline);
+#else /* UCLINUX */
+
+       /* Remove symlink in case it already exists. Don't care if it fails.  */
+       unlink ("/dev/gnokii");
+
+       /* Create symlink */
+       err = symlink(slave_name, "/dev/gnokii");
+
+#endif /* UCLINUX */
        
        return (err);
 
@@ -225,7 +241,7 @@ int         VM_PtySetup(char *bindir)
 
     /* Handler called when characters received from serial port.
        calls state machine code to process it. */
-void    VM_CharHandler(void)
+static void    VM_CharHandler(void)
 {
     unsigned char   buffer[255];
     int             res;
@@ -250,7 +266,7 @@ void    VM_CharHandler(void)
 }     
 
        /* Initialise GSM interface, returning GSM_Error as appropriate  */
-GSM_Error      VM_GSMInitialise(char *model, char *port, char *initlength, GSM_ConnectionType connection, char *synchronizetime)
+static GSM_Error       VM_GSMInitialise(char *model, char *port, char *initlength, GSM_ConnectionType connection, char *synchronizetime)
 {
        int             count=0;
        GSM_Error       error;
@@ -289,7 +305,7 @@ GSM_Error   VM_GSMInitialise(char *model, char *port, char *initlength, GSM_Conne
    Applications by Troan and Johnson */
 
 
-int    VM_GetMasterPty(char **name) { 
+static int     VM_GetMasterPty(char **name) { 
 
 #ifdef USE_UNIX98PTYS
        int master, err;
index 45330c2..eb81b25 100644 (file)
@@ -8,12 +8,11 @@
 
 */
 
+#include "config.h"
+
 #ifndef WIN32
   #include "devices/unixserial.h"
-  #include "devices/unixirda.h"
-  #include "devices/tekram.h"
   #include <sys/ioctl.h>
-  #include <pthread.h>
   #include <termios.h>
   #include <signal.h>
   #include <errno.h>
@@ -32,9 +31,9 @@
   #include "mversion.h"
 #endif
 
-char PortDevice[GSM_MAX_DEVICE_NAME_LENGTH]={0x00};
+static char PortDevice[GSM_MAX_DEVICE_NAME_LENGTH]={0x00};
 
-bool duringwrite;
+static bool duringwrite;
 
 #ifndef WIN32
 
@@ -43,26 +42,22 @@ bool duringwrite;
   pthread_t selThread;
 #endif
 
-int device_portfd = -1;
+static int device_portfd = -1;
 
 /*
  * Structure to store the filedescriptor we use.
  *
  */
-int device_getfd(void)
+#ifdef DEBUG
+static int device_getfd(void)
 {
   return device_portfd;
 }
+#endif /* DEBUG */
 
-int device_open(__const char *__file, int __with_odd_parity) {
+static int device_open(__const char *__file, int __with_odd_parity) {
 
   switch (CurrentConnectionType) {
-    case GCT_Tekram:
-      device_portfd = tekram_open(__file);
-      break;
-    case GCT_Irda:
-      device_portfd = irda_open();
-      break;
     default:
       device_portfd = serial_opendevice(__file, __with_odd_parity, true, false);
       break;
@@ -79,23 +74,26 @@ void device_close(void)
   //pthread_join(Thread, NULL);
 
   switch (CurrentConnectionType) {
-    case GCT_Tekram: tekram_close(device_portfd); break;
-    case GCT_Irda  :   irda_close(device_portfd); break;
     default        : serial_close(device_portfd); break;
   }
 
   PortDevice[0]=0x00;
 }
 
+#ifndef UCLINUX
+
 void device_reset(void) {
 }
 
+#endif /* UCLINUX */
+
+#ifdef DEBUG
+static void device_dumpserial(void);
+#endif /* DEBUG */
+
 void device_setdtrrts(int __dtr, int __rts)
 {
   switch (CurrentConnectionType) {
-    case GCT_Tekram:
-    case GCT_Irda:
-      break;
     default:
       serial_setdtrrts(device_portfd, __dtr, __rts);
 #ifdef DEBUG
@@ -108,11 +106,6 @@ void device_setdtrrts(int __dtr, int __rts)
 void device_changespeed(int __speed)
 {
   switch (CurrentConnectionType) {
-    case GCT_Irda:
-      break;
-    case GCT_Tekram:
-      tekram_changespeed(device_portfd, __speed);
-      break;
     default:
       serial_changespeed(device_portfd, __speed);
 #ifdef DEBUG
@@ -122,11 +115,9 @@ void device_changespeed(int __speed)
   }
 }
 
-size_t device_read(__ptr_t __buf, size_t __nbytes)
+static size_t device_read(__ptr_t __buf, size_t __nbytes)
 {
   switch (CurrentConnectionType) {
-    case GCT_Tekram: return (tekram_read(device_portfd, __buf, __nbytes)); break;
-    case GCT_Irda  : return (  irda_read(device_portfd, __buf, __nbytes)); break;
     default        : return (serial_read(device_portfd, __buf, __nbytes)); break;
   }
 }
@@ -142,8 +133,6 @@ size_t device_write(__const __ptr_t __buf, size_t __n) {
 
   duringwrite=true;
   switch (CurrentConnectionType) {
-    case GCT_Irda  : mysize =   irda_write(device_portfd, __buf, __n); break;
-    case GCT_Tekram: mysize = tekram_write(device_portfd, __buf, __n); break;      
     default        : mysize = serial_write(device_portfd, __buf, __n); break;
   }
   duringwrite=false;
@@ -151,7 +140,7 @@ size_t device_write(__const __ptr_t __buf, size_t __n) {
 }
 
 #ifdef DEBUG
-void device_dumpserial(void)
+static void device_dumpserial(void)
 {
   int PortFD;
   unsigned int Flags=0;
@@ -168,7 +157,7 @@ void device_dumpserial(void)
 }
 #endif /* DEBUG */
 
-void SigHandler(int status)
+static void SigHandler(int status)
 {
 
   unsigned char buffer[2048];
@@ -223,6 +212,7 @@ bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionTyp
   struct sigaction sig_io;
 #endif
 
+#ifndef UCLINUX
 #ifdef DEBUG
       if ((strstr(GSM_Info->IrdaModels,"decode")!=NULL) &&  (CurrentConnectionType == GCT_Irda))
        {
@@ -230,6 +220,7 @@ bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionTyp
          return true;
        }
 #endif 
+#endif /* UCLINUX */
 
   if (PortDevice[0]!=0x00) return true;
 
@@ -254,13 +245,12 @@ bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionTyp
   strcpy(text,"Connection ");
   switch (con) {
     case GCT_FBUS    :strcpy(text+strlen(text),"FBUS");break;
-    case GCT_Infrared:strcpy(text+strlen(text),"infrared");break;
-    case GCT_Irda    :strcpy(text+strlen(text),"irda sockets");break;
+#ifndef UCLINUX
     case GCT_MBUS    :strcpy(text+strlen(text),"MBUS");break;
     case GCT_DLR3    :strcpy(text+strlen(text),"DLR3");break;
-    case GCT_Tekram  :strcpy(text+strlen(text),"Tekram");break;
     case GCT_AT      :strcpy(text+strlen(text),"AT");break;
     default          :strcpy(text+strlen(text),"unknown");break;
+#endif /* UCLINUX */
   }
   strcpy(text+strlen(text),"\n");
   AppendLogText(text,false);
@@ -415,11 +405,8 @@ bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionTyp
   strcpy(text,"Connection ");
   switch (con) {
     case GCT_FBUS    :strcpy(text+strlen(text),"FBUS");break;
-    case GCT_Infrared:strcpy(text+strlen(text),"infrared");break;
-    case GCT_Irda    :strcpy(text+strlen(text),"irda sockets");break;
     case GCT_MBUS    :strcpy(text+strlen(text),"MBUS");break;
     case GCT_DLR3    :strcpy(text+strlen(text),"DLR3");break;
-    case GCT_Tekram  :strcpy(text+strlen(text),"Tekram");break;
     case GCT_AT      :strcpy(text+strlen(text),"AT");break;
     default          :strcpy(text+strlen(text),"unknown");break;
   }
index bc7e37e..ba66941 100644 (file)
 
 /* Structure to backup the setting of the terminal. */
 
-struct termios serial_termios;
+static struct termios serial_termios;
 
 /* Open the serial port and store the settings. */
 
+#ifdef UCLINUX
+static
+#endif /* UCLINUX */
 int serial_open(__const char *__file, int __oflag) {
 
   int __fd;
@@ -193,6 +196,8 @@ void serial_setdtrrts(int __fd, int __dtr, int __rts) {
 }
 
 
+#ifndef UCLINUX
+
 int serial_select(int fd, struct timeval *timeout) {
 
   fd_set readfds;
@@ -204,6 +209,8 @@ int serial_select(int fd, struct timeval *timeout) {
 
 }
 
+#endif /* UCLINUX */
+
 
 /* Change the speed of the serial device. */
 
@@ -235,7 +242,7 @@ void serial_changespeed(int __fd, int __speed) {
   if (cfsetspeed(&t, speed) == -1)
        fprintf(stdout,_("Serial port speed setting failed\n"));
 #else
-  cfsetspeed(&t, speed);
+  (void)cfsetspeed(&t, speed);
 #endif
 
   tcsetattr(__fd, TCSADRAIN, &t);
index 9908cc1..ad25708 100644 (file)
 
 #include "files/cfgreader.h"
 
+#ifndef UCLINUX
+
 /* Read configuration information from a ".INI" style file */
-struct CFG_Header *CFG_ReadFile(char *filename)
+static struct CFG_Header *CFG_ReadFile(char *filename)
 {
         FILE *handle;
         char *line;
@@ -169,7 +171,7 @@ struct CFG_Header *CFG_ReadFile(char *filename)
 
 /*  Write configuration information to a config file */
 
-int CFG_WriteFile(struct CFG_Header *cfg, char *filename)
+static int CFG_WriteFile(struct CFG_Header *cfg, char *filename)
 {
   /* Not implemented - tricky to do and preserve comments */
 
@@ -209,7 +211,7 @@ char *CFG_Get(struct CFG_Header *cfg, char *section, char *key)
 /*  Set the value of a key in a config file.  Return the new value if
     the section/key can be found, else return NULL.  */
 
-char *CFG_Set(struct CFG_Header *cfg, char *section, char *key, 
+static char *CFG_Set(struct CFG_Header *cfg, char *section, char *key, 
                     char *value)
 {
         struct CFG_Header *h;
@@ -287,10 +289,21 @@ struct CFG_Header *CFG_FindGnokiirc()
        return cfg_info;
 }
 
+#endif /* UCLINUX */
+
 int CFG_ReadConfig(char **model, char **port, char **initlength,
-               char **connection, char **bindir, char **synchronizetime,
+               char **connection, char **bindir,
               bool isgnokiid)
 {
+#ifdef UCLINUX
+
+       *model=strdup(CONFIG_CFG_MODEL);
+       *port=strdup(CONFIG_CFG_PORT);
+       *initlength=strdup(CONFIG_CFG_INITLENGTH);
+       *connection=strdup("fbus");
+       *bindir=NULL;
+
+#else /* UCLINUX */
         struct CFG_Header *cfg_info;
 #ifdef WIN32
         char *DefaultPort            = "com2:";
@@ -300,7 +313,6 @@ int CFG_ReadConfig(char **model, char **port, char **initlength,
         char *DefaultModel           = "auto";
         char *DefaultConnection      = "fbus";
         char *DefaultBindir          = "/usr/local/sbin/";
-       char *DefaultSynchronizeTime = "yes";
        char *DefaultInitLength      = "30";
 
        char *section = "global";
@@ -309,7 +321,6 @@ int CFG_ReadConfig(char **model, char **port, char **initlength,
         (char *)*port = DefaultPort;
         (char *)*connection = DefaultConnection;
         (char *)*bindir = DefaultBindir;
-        (char *)*synchronizetime = DefaultSynchronizeTime;
         (char *)*initlength = DefaultInitLength;
        
        cfg_info=CFG_FindGnokiirc();
@@ -329,11 +340,9 @@ int CFG_ReadConfig(char **model, char **port, char **initlength,
         (char *)*bindir = CFG_Get(cfg_info, section, "bindir");
         if (!*bindir) (char *)*bindir = DefaultBindir;
 
-        (char *)*synchronizetime = CFG_Get(cfg_info, section, "synchronizetime");
-        if (!*synchronizetime) (char *)*synchronizetime = DefaultSynchronizeTime;
-
         (char *)*initlength = CFG_Get(cfg_info, section, "initlength");
         if (!*initlength) (char *)*initlength = "default";
+#endif /* UCLINUX */
 
         return 0;
 }
index 9e55249..9b3997a 100644 (file)
@@ -2,6 +2,8 @@
 
 /* embedding modified midifile.h and midifile.c into this file */
 
+#include "config.h"
+
 /***** midifile.h ******/
 
 struct MF {
index 99b73d7..4546e14 100644 (file)
@@ -18,6 +18,8 @@
 
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -30,6 +32,7 @@
 
 #include "gsm-api.h"
 
+#ifndef UCLINUX
 #include "newmodules/n6110.h"
 #include "newmodules/n7110.h"
 #include "newmodules/newat.h"
   #include "newmodules/sniff/sniff.h"
 #endif
 #include "protocol/fbusirda.h"
+#endif /* UCLINUX */
 #include "protocol/fbus.h"
+#ifndef UCLINUX
 #include "protocol/mbus.h"
 #include "protocol/at.h"
+#endif /* UCLINUX */
 #include "files/cfgreader.h"
 
 #ifndef WIN32
@@ -81,13 +87,16 @@ GSM_Protocol *Protocol;
 GSM_PhonebookEntry *CurrentPhonebookEntry;
 GSM_Error          CurrentPhonebookError;
 
+#ifndef UCLINUX
 GSM_SpeedDial      *CurrentSpeedDialEntry;
 GSM_Error          CurrentSpeedDialError;
+#endif /* UCLINUX */
 
 unsigned char      Current_IMEI[GSM_MAX_IMEI_LENGTH];
 unsigned char      Current_Revision[GSM_MAX_REVISION_LENGTH];
 unsigned char      Current_Model[GSM_MAX_MODEL_LENGTH];
 
+#ifndef UCLINUX
 GSM_SMSMessage     *CurrentSMSMessage;
 GSM_Error          CurrentSMSMessageError;
 int                CurrentSMSPointer;
@@ -99,10 +108,12 @@ int                CurrentSMSFoldersCount;
 GSM_OneSMSFolder   CurrentSMSFolder;
 GSM_Error          CurrentSMSFolderError;
 int                CurrentSMSFolderID;
+#endif /* UCLINUX */
 
 GSM_MemoryStatus   *CurrentMemoryStatus;
 GSM_Error          CurrentMemoryStatusError;
 
+#ifndef UCLINUX
 GSM_NetworkInfo    *CurrentNetworkInfo;
 GSM_Error          CurrentNetworkInfoError;
 
@@ -119,6 +130,8 @@ GSM_SecurityCode   *CurrentSecurityCode;
 GSM_DateTime       *CurrentDateTime;
 GSM_Error          CurrentDateTimeError;
 
+GSM_Error          CurrentResetPhoneSettingsError;
+
 GSM_DateTime       *CurrentAlarm;
 GSM_Error          CurrentAlarmError;
 
@@ -131,17 +144,20 @@ GSM_Error          CurrentCalendarNotesInfoError;
 GSM_Error          CurrentSetDateTimeError;
 GSM_Error          CurrentSetAlarmError;
 
+int                *CurrentFirstCalendarFreePos;
+GSM_Error          CurrentFirstCalendarFreePosError;
+#endif /* UCLINUX */
+
 GSM_Error          CurrentEnableExtendedCommandsError;
 
 int                CurrentRFLevel,
                    CurrentBatteryLevel,
                    CurrentPowerSource;
 
+#ifndef UCLINUX
 int                CurrentDisplayStatus;
 GSM_Error          CurrentDisplayStatusError;
 
-GSM_Error          CurrentResetPhoneSettingsError;
-
 char               *CurrentNetmonitor;
 GSM_Error          CurrentNetmonitorError;
 
@@ -164,17 +180,21 @@ int                CurrentPressKeyEvent;
 GSM_Error          CurrentPressKeyError;
 
 GSM_Error          CurrentPlayToneError=GE_UNKNOWN;
+#endif /* UCLINUX */
 
 GSM_Error          CurrentDialVoiceError;
 
+#ifndef UCLINUX
 GSM_Error          CurrentGetOperatorNameError;
 GSM_Network        *CurrentGetOperatorNameNetwork;
 GSM_Error          CurrentSetOperatorNameError;
+#endif /* UCLINUX */
 
 GSM_Error          CurrentGetIMEIError;
 
 GSM_Error          CurrentGetHWError;
 
+#ifndef UCLINUX
 unsigned char      CurrentPPS[4];
 GSM_Error          CurrentProductProfileSettingsError;
 
@@ -184,9 +204,11 @@ GSM_Error          CurrentBinRingtoneError;
 GSM_BinRingtone    *CurrentGetBinRingtone=NULL;
 
 GSM_Error          CurrentRingtoneError;
+#endif /* UCLINUX */
 
 GSM_Error          CurrentMagicError;
 
+#ifndef UCLINUX
 GSM_Error          CurrentSimlockInfoError;
 GSM_AllSimlocks    *CurrentSimLock;
 
@@ -201,6 +223,7 @@ GSM_Error          CurrentCallDivertError;
 GSM_CallDivert    *CurrentCallDivert;
 
 char              *CurrentManufacturer;
+#endif /* UCLINUX */
 
 /* This is the connection type used in gnokii. */
 GSM_ConnectionType CurrentConnectionType;
@@ -220,8 +243,13 @@ bool CurrentLinkOK;
 
 bool CurrentRequestTerminate;
 
+#ifndef UCLINUX
 bool CurrentDisableKeepAlive;
+#endif /* UCLINUX */
 
+#ifdef UCLINUX
+static
+#endif /* UCLINUX */
 bool CheckModel (GSM_Information InfoToCheck, char *model, GSM_ConnectionType connection) {
 
   bool found_match=false;
@@ -229,6 +257,7 @@ bool CheckModel (GSM_Information InfoToCheck, char *model, GSM_ConnectionType co
   if (strstr(InfoToCheck.FBUSModels, model) != NULL) {
     if (connection==GCT_FBUS) found_match=true;
   }
+#ifndef UCLINUX
   if (strstr(InfoToCheck.MBUSModels, model) != NULL) {
     if (connection==GCT_MBUS) found_match=true;
   }
@@ -247,10 +276,13 @@ bool CheckModel (GSM_Information InfoToCheck, char *model, GSM_ConnectionType co
   if (strstr(InfoToCheck.TekramModels, model) != NULL) {
     if (connection==GCT_Tekram) found_match=true;
   }
+#endif /* UCLINUX */
 
   return found_match;
 }
  
+#ifndef UCLINUX
+
 GSM_Error TryNewNokia(char *model, char *device, char *initlength, GSM_ConnectionType connection, void (*rlp_callback)(RLP_F96Frame *frame)) {
   int InitLength;
   int count;
@@ -298,6 +330,7 @@ GSM_Error TryNewNokia(char *model, char *device, char *initlength, GSM_Connectio
   while (N6110_GetModel(phonemodel) != GE_NONE)
     sleep(1);
 
+#ifndef UCLINUX
   if (!strcmp(phonemodel,"NPE-3") || !strcmp(phonemodel,"NSE-5"))
   {
     GSM->Terminate();      
@@ -308,9 +341,14 @@ GSM_Error TryNewNokia(char *model, char *device, char *initlength, GSM_Connectio
     GSM_LinkOK = &CurrentLinkOK;
     return GE_NONE;
   }
+#endif /* UCLINUX */
 
   return GE_NONE;
 }
+#endif /* UCLINUX */
+
+extern GSM_Information N6110_Information;
+extern GSM_Functions   N6110_Functions;
 
 GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_ConnectionType connection, void (*rlp_callback)(RLP_F96Frame *frame), char* SynchronizeTime)
 {
@@ -318,9 +356,11 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
   
   GSM_ConnectionType connection2;
 
+#ifndef UCLINUX
   struct tm *now;
   time_t nowh;
   GSM_DateTime Date;
+#endif /* UCLINUX */
   GSM_Error error;
   
   connection2=connection;
@@ -328,17 +368,22 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
   CurrentRLP_RXCallback = rlp_callback;
   CurrentCallPassup=NULL;
   CurrentPhonebookEntry=NULL;
+#ifndef UCLINUX
   CurrentNetworkInfo = NULL;
   CurrentGetBitmap=NULL;
   CurrentPlayToneError=GE_UNKNOWN;
   strcpy(CurrentIncomingCall," ");
   CurrentGetBinRingtone=NULL;
   CurrentNetworkInfo=NULL;
+#endif /* UCLINUX */
   CurrentRequestTerminate=false;
+#ifndef UCLINUX
   CurrentDisableKeepAlive=false;
   CurrentCalendarNotesInfo.HowMany=2000;
+#endif /* UCLINUX */
   CurrentMagicError = GE_BUSY;  
   
+#ifndef UCLINUX
   if (!strcmp(model,"auto")) {
 
     /* For now */
@@ -395,10 +440,13 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
       Protocol = &MBUS_Functions;
       CurrentConnectionType=GCT_MBUS;    
       connection2=GCT_MBUS;
+#ifndef UCLINUX
       if (TryNewNokia(model,device,initlength,CurrentConnectionType,rlp_callback)==GE_NONE)
       {
         found_match=true;
-      } else {
+      } else
+#endif /* UCLINUX */
+                               {
         GSM->Terminate();      
       }
     }
@@ -407,7 +455,10 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
 
     usleep(50);
         
-  } else {
+  } else
+#endif /* UCLINUX */
+               {
+#ifndef UCLINUX
 #ifdef DEBUG
     if (CheckModel (Nsniff_Information, model, connection)) {
       /* Set pointers to relevant addresses */
@@ -417,6 +468,7 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
       found_match=true;
     }
 #endif
+#endif /* UCLINUX */
 
     if (CheckModel (N6110_Information, model, connection)) {
       /* Set pointers to relevant addresses */
@@ -425,6 +477,7 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
       GSM_LinkOK = &CurrentLinkOK;
       found_match=true;
     }
+#ifndef UCLINUX
     if (CheckModel (N7110_Information, model, connection)) {
       /* Set pointers to relevant addresses */
       GSM = &N7110_Functions;
@@ -439,10 +492,12 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
       GSM_LinkOK = &CurrentLinkOK;
       found_match=true;
     }
+#endif /* UCLINUX */
 
     if (found_match) {
       switch (connection) {
         case GCT_FBUS    : Protocol = &FBUS_Functions;    break;
+#ifndef UCLINUX
         case GCT_Infrared: Protocol = &FBUS_Functions;    break;
         case GCT_Tekram  : Protocol = &FBUS_Functions;    break;
         case GCT_DLR3    : Protocol = &FBUS_Functions;    break;
@@ -450,6 +505,7 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
         case GCT_Irda    : Protocol = &FBUSIRDA_Functions;break;
         case GCT_AT      : Protocol = &AT_Functions;      break;
         case GCT_Default : Protocol = NULL;               break;
+#endif /* UCLINUX */
       }
     } else
       return GE_NOTSUPPORTED;
@@ -459,6 +515,7 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
   /* Now call model specific initialisation code. */
   error=(GSM->Initialise(device, initlength, connection2, rlp_callback));
 
+#ifndef UCLINUX
   /* RTH: FIXME: second try for Irda (6210 only?)*/
   if ( error!=GE_NONE && connection == GCT_Irda)
   {
@@ -468,7 +525,9 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
    device_close();
    error=(GSM->Initialise(device, initlength, connection2, rlp_callback));
   }
+#endif /* UCLINUX */
 
+#ifndef UCLINUX
   if (error==GE_NONE && !strcmp(SynchronizeTime,"yes"))
   {
     nowh=time(NULL);
@@ -499,10 +558,13 @@ GSM_Error GSM_Initialise(char *model, char *device, char *initlength, GSM_Connec
     /* FIXME: Error checking should be here. */
     GSM->SetDateTime(&Date);
   }
+#endif /* UCLINUX */
 
   return error;
 }
 
+#ifndef UCLINUX
+
 GSM_Error Unimplemented(void)
 {
        return GE_NOTIMPLEMENTED;
@@ -513,6 +575,8 @@ GSM_Error NotSupported(void)
        return GE_NOTSUPPORTED;
 }
 
+#endif /* UCLINUX */
+
 /* Applications should call N6110_Terminate to shut down the N6110 thread and
    close the serial port. */
 void NULL_Terminate(void)
@@ -578,12 +642,14 @@ GSM_ConnectionType GetConnectionTypeFromString(char *Connection) {
 
   GSM_ConnectionType connection=GCT_FBUS;
 
+#ifndef UCLINUX
   if (!strcmp(Connection, "irda"))     connection=GCT_Irda;
   if (!strcmp(Connection, "infrared")) connection=GCT_Infrared;
   if (!strcmp(Connection, "mbus"))     connection=GCT_MBUS;
   if (!strcmp(Connection, "dlr3"))     connection=GCT_DLR3;
   if (!strcmp(Connection, "at"))       connection=GCT_AT;
   if (!strcmp(Connection, "tekram210"))connection=GCT_Tekram;
+#endif /* UCLINUX */
   
   return connection;
 }
@@ -694,7 +760,7 @@ static OnePhoneModel allmodels[] = {
 {""    ,""     ,{      0,       0,        0,      0,     0,       0,     0,        0,      0,       0,     0,      0,        0,       0,       0,        0,    0}}
 };
 
-OnePhoneModel *GetPhoneModelData (const char *num)
+static OnePhoneModel *GetPhoneModelData (const char *num)
 {
        register int i = 0;
 
@@ -726,6 +792,7 @@ int GetModelFeature (featnum_index num)
   return (GetPhoneModelData(model)->features[num]);
 }
 
+#ifndef UCLINUX
 int LogAvailable=-1; //-1 not checked earlier, 0 not, 1 yes
 char *logfilename;
 
@@ -790,3 +857,4 @@ bool AppendLogText(u8 *buffer,bool format)
 {
   return AppendLog(buffer,strlen(buffer),format);
 }
+#endif /* UCLINUX */
index 1e96f8b..3dae76c 100644 (file)
@@ -10,6 +10,8 @@
   
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
index eadaff6..7bef750 100644 (file)
@@ -10,6 +10,8 @@
 
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
index 7baaaa9..26c1e67 100644 (file)
@@ -8,6 +8,8 @@
 
 */
 
+#include "config.h"
+
 #include <stdlib.h>
 #include <string.h>
 
@@ -24,6 +26,9 @@
 #define NUMBER_OF_7_BIT_ALPHABET_ELEMENTS 128
 
 #ifndef USE_NLS        
+
+#ifndef UCLINUX
+
   static unsigned char GSM_DefaultAlphabet[NUMBER_OF_7_BIT_ALPHABET_ELEMENTS] = {
 
        /* ETSI GSM 03.38, version 6.0.1, section 6.2.1; Default alphabet */
        'x',  'y',  'z',  0xe4, 0xf6, 0xf1, 0xfc, 0xe0
   };
 
+#endif /* UCLINUX */
+
   #ifndef WIN32
     /*Simple UNICODE decoding and encoding from/to iso-8859-2
     First version prepared by Martin Kacer <M.Kacer@sh.cvut.cz>
 
     Following table contains triplets:
     first unicode byte, second unicode byte, iso-8859-2 character*/
-    unsigned char unicode_table[][3] =
+    static unsigned char unicode_table[][3] =
     {
        /* C< D< E< N< R< S< T< Uo Z< */
        {0x01, 0x0C, 0xC8}, {0x01, 0x0E, 0xCF}, {0x01, 0x1A, 0xCC},
     };
   #endif
 
+#ifndef UCLINUX
+
 unsigned char EncodeWithDefaultAlphabet(unsigned char value)
 {
        unsigned char i;
@@ -137,6 +146,11 @@ unsigned char DecodeWithDefaultAlphabet(unsigned char value)
        return GSM_DefaultAlphabet[value];
 }
 
+#endif /* UCLINUX */
+
+#ifdef UCLINUX
+static
+#endif /* UCLINUX */
 wchar_t EncodeWithUnicodeAlphabet(unsigned char value)
 {
        wchar_t retval;
@@ -157,6 +171,9 @@ wchar_t EncodeWithUnicodeAlphabet(unsigned char value)
        return retval;
 }
 
+#ifdef UCLINUX
+static
+#endif /* UCLINUX */
 unsigned char DecodeWithUnicodeAlphabet(wchar_t value)
 {
        unsigned char retval;
@@ -177,6 +194,8 @@ unsigned char DecodeWithUnicodeAlphabet(wchar_t value)
 
 #else
 
+#ifndef UCLINUX
+
   /* ETSI GSM 03.38, version 6.0.1, section 6.2.1; Default alphabet */
   unsigned char GSM_DefaultAlphabetUnicode[NUMBER_OF_7_BIT_ALPHABET_ELEMENTS+1][2] =
   {
@@ -259,8 +278,12 @@ unsigned char DecodeWithUnicodeAlphabet(wchar_t value)
        else return retval;
 }
 
+#endif /* UCLINUX */
+
 #endif
 
+#ifndef UCLINUX
+
 void DecodeDefault (unsigned char* dest, const unsigned char* src, int len)
 {
        int i;
@@ -279,6 +302,8 @@ void EncodeDefault (unsigned char* dest, const unsigned char* src, int len)
        return;
 }
 
+#endif /* UCLINUX */
+
 void DecodeUnicode (unsigned char* dest, const unsigned char* src, int len)
 {
        int i;
@@ -304,6 +329,9 @@ void EncodeUnicode (unsigned char* dest, const unsigned char* src, int len)
        }
 }
 
+#ifdef UCLINUX
+static
+#endif /* UCLINUX */
 bool EncodeWithUTF8Alphabet(u8 mychar, u8 *ret1, u8 *ret2)
 {
       u8 mychar1,mychar2,mychar3,mychar4;
@@ -334,6 +362,8 @@ bool EncodeWithUTF8Alphabet(u8 mychar, u8 *ret1, u8 *ret2)
       return false;
 }
 
+#ifndef UCLINUX
+
 void DecodeWithUTF8Alphabet(u8 mychar3, u8 mychar4, u8 *ret)
 {
     u8 mychar1, mychar2;
@@ -356,6 +386,8 @@ void DecodeWithUTF8Alphabet(u8 mychar3, u8 mychar4, u8 *ret)
     j=-1;
 }
 
+#endif /* UCLINUX */
+
 void EncodeUTF8 (unsigned char* dest, const unsigned char* src, int len)
 {
        int i,j=0,z;
@@ -373,6 +405,8 @@ void EncodeUTF8 (unsigned char* dest, const unsigned char* src, int len)
        dest[j++]=0;
 }
 
+#ifndef UCLINUX
+
 void DecodeUTF8 (unsigned char* dest, const unsigned char* src, int len)
 {
        int i=0,j=0;
@@ -471,13 +505,12 @@ void EncodeBCD (unsigned char* dest, const unsigned char* src, int len, bool fil
 
 unsigned char EncodeWithBCDAlphabet(int value)
 {
-  div_t division;
-
-  division=div(value,10);
-  return ( ( (value-division.quot*10) & 0x0f) << 4) | (division.quot & 0xf);
+  return ((value%10) << 4) | ((value/10) & 0xf);
 }
 
 int DecodeWithBCDAlphabet(unsigned char value)
 {
        return 10*(value & 0x0f)+(value >> 4);
 }
+
+#endif /* UCLINUX */
index 589dcb3..13756b0 100644 (file)
@@ -8,14 +8,16 @@
 
 */
 
-#include <string.h>\r
-#include <time.h>\r
-\r
-#include "misc.h"\r
-#include "gsm-datetime.h"\r
-#include "gsm-common.h"\r
+#include "config.h"
 
-char DayOfWeekChar;
+#include <string.h>
+#include <time.h>
+
+#include "misc.h"
+#include "gsm-datetime.h"
+#include "gsm-common.h"
+
+static char DayOfWeekChar;
 
 /* Based on article in Polish PC-Kurier 8/1998 page 104 */
 /* Archive on http://www.pckurier.pl */
@@ -37,7 +39,9 @@ char *DayOfWeek (int year, int month, int day) {
     case 6: strcpy(&DayOfWeekChar,"Sat"); break;
   }
   return &DayOfWeekChar;
-}\r
+}
+
+#ifndef UCLINUX
 
 /* GetMachineDateTime ----------------------------------------------------------
 Purpose:    Gets system date and time.
@@ -47,42 +51,44 @@ Output:   date - System date in the format "aaaa-mm-gg".
           time  - System time in the format "hh:mm:ss".
 Return:  -
 ----------------------------------------------------------------------------- */
-void GetMachineDateTime( char nowdate[], char nowtime[] )\r
-{\r
-  struct tm *now;\r
-  time_t nowh;\r
-\r
-  nowh=time(NULL);\r
-  now=localtime(&nowh);\r
-\r
-  /* I have 100 (for 2000) Year now :-) */\r
-  if (now->tm_year>99 && now->tm_year<1900) {\r
-    now->tm_year=now->tm_year+1900;\r
-  }\r
-\r
+static void GetMachineDateTime( char nowdate[], char nowtime[] )
+{
+  struct tm *now;
+  time_t nowh;
+
+  nowh=time(NULL);
+  now=localtime(&nowh);
+
+  /* I have 100 (for 2000) Year now :-) */
+  if (now->tm_year>99 && now->tm_year<1900) {
+    now->tm_year=now->tm_year+1900;
+  }
+
   sprintf(nowdate,"%04d-%02d-%02d",now->tm_year,now->tm_mon+1,now->tm_mday);
-  sprintf(nowtime, "%02d:%02d:%02d",now->tm_hour,now->tm_min,now->tm_sec);\r
-\r
-}\r
-\r
-void EncodeDateTime(unsigned char* buffer, GSM_DateTime *datetime)\r
-{\r
-  buffer[0] = datetime->Year / 256;\r
-  buffer[1] = datetime->Year % 256;\r
-  buffer[2] = datetime->Month;\r
-  buffer[3] = datetime->Day;\r
-\r
-  buffer[4] = datetime->Hour;\r
-  buffer[5] = datetime->Minute;\r
-}\r
-\r
-void DecodeDateTime(unsigned char* buffer, GSM_DateTime *datetime)\r
-{\r
-  datetime->Year = buffer[0] * 256 + buffer[1];\r
-  datetime->Month = buffer[2];\r
-  datetime->Day = buffer[3];\r
-\r
-  datetime->Hour = buffer[4];\r
-  datetime->Minute = buffer[5];\r
-  datetime->Second = buffer[6];\r
-}\r
+  sprintf(nowtime, "%02d:%02d:%02d",now->tm_hour,now->tm_min,now->tm_sec);
+
+}
+
+void EncodeDateTime(unsigned char* buffer, GSM_DateTime *datetime)
+{
+  buffer[0] = datetime->Year / 256;
+  buffer[1] = datetime->Year % 256;
+  buffer[2] = datetime->Month;
+  buffer[3] = datetime->Day;
+
+  buffer[4] = datetime->Hour;
+  buffer[5] = datetime->Minute;
+}
+
+#endif /* UCLINUX */
+
+void DecodeDateTime(unsigned char* buffer, GSM_DateTime *datetime)
+{
+  datetime->Year = buffer[0] * 256 + buffer[1];
+  datetime->Month = buffer[2];
+  datetime->Day = buffer[3];
+
+  datetime->Hour = buffer[4];
+  datetime->Minute = buffer[5];
+  datetime->Second = buffer[6];
+}
index b36bcf5..f0379f5 100644 (file)
 
 */
 
+#include "config.h"
+
 #include <string.h>
 
 #include "gsm-common.h"
 #include "gsm-networks.h"
 #include "gsm-coding.h"
 
-GSM_Country GSM_Countries[] =
+#ifndef UCLINUX
+
+static GSM_Country GSM_Countries[] =
 {
   { "202", "Greece" },
   { "204", "Netherlands" },
@@ -454,7 +458,7 @@ char *GSM_GetCountryName(char *CountryCode)
   return GSM_Countries[index].Name;
 }
 
-char *GSM_GetCountryCode(char *CountryName)
+static char *GSM_GetCountryCode(char *CountryName)
 {
 
   int index=0;
@@ -480,3 +484,5 @@ void DecodeNetworkCode(unsigned char* buffer, unsigned char* output)
     output[4]=output[3];
     output[3]=' ';
 }
+
+#endif /* UCLINUX */
index bf0fdd3..d3be5bc 100644 (file)
@@ -10,6 +10,8 @@
   
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
index 5a35034..cfc0061 100644 (file)
@@ -8,6 +8,8 @@
        
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -18,7 +20,7 @@
 #include "gsm-coding.h"
 
 /* User data headers */
-GSM_UDHHeader UDHHeaders[] = {
+static GSM_UDHHeader UDHHeaders[] = {
   { GSM_ConcatenatedMessages, 0x05, "\x00\x03\x01\x00\x00" },
       /* See GSM 03.40 section 9.2.3.24.1 */
   { GSM_DisableVoice,         0x04, "\x01\x02\x00\x00" },
@@ -67,7 +69,8 @@ GSM_UDHHeader UDHHeaders[] = {
 
 #define ByteMask ((1 << Bits) - 1)
 
-int GSM_PackSevenBitsToEight(int offset, unsigned char *input, unsigned char *output)
+#ifndef UCLINUX
+static int GSM_PackSevenBitsToEight(int offset, unsigned char *input, unsigned char *output)
 {
         unsigned char *OUT = output; /* Current pointer to the output buffer */
         unsigned char *IN  = input;  /* Current pointer to the input buffer */
@@ -259,7 +262,7 @@ GSM_Error GSM_EncodeSMSDateTime(GSM_DateTime *DT, unsigned char *req)
 }
 
 /* See GSM 03.40 section 9.2.3.11 */
-GSM_Error GSM_DecodeSMSDateTime(GSM_DateTime *DT, unsigned char *req)
+static GSM_Error GSM_DecodeSMSDateTime(GSM_DateTime *DT, unsigned char *req)
 {
   DT->Year    = DecodeWithBCDAlphabet(req[0]);
   DT->Month   = DecodeWithBCDAlphabet(req[1]);
@@ -292,7 +295,7 @@ GSM_Error GSM_DecodeSMSDateTime(GSM_DateTime *DT, unsigned char *req)
   return GE_NONE;
 }
 
-int GSM_EncodeETSISMSSubmitData(GSM_SMSMessage *SMS, GSM_ETSISMSMessage *ETSI)
+static int GSM_EncodeETSISMSSubmitData(GSM_SMSMessage *SMS, GSM_ETSISMSMessage *ETSI)
 {
   int off,size=0,size2=0,w,i;
 
@@ -347,7 +350,7 @@ int GSM_EncodeETSISMSSubmitData(GSM_SMSMessage *SMS, GSM_ETSISMSMessage *ETSI)
       ETSI->TPDCS |= 0x08;
 
 #ifdef DEBUG
-      fprintf(stdout,_("SMS Length is %i\n"),strlen(SMS->MessageText));
+      fprintf(stdout,_("SMS Length is %ld\n"),(long)strlen(SMS->MessageText));
 #endif
 
       EncodeUnicode (ETSI->MessageText+off,SMS->MessageText,strlen(SMS->MessageText));
@@ -821,8 +824,9 @@ GSM_Error GSM_DecodeETSISMS(GSM_SMSMessage *SMS, GSM_ETSISMSMessage *ETSI)
 
   return GE_NONE;
 }
+#endif /* UCLINUX */
 
-void GSM_SetDefaultSMSData (GSM_SMSMessage *SMS)
+static void GSM_SetDefaultSMSData (GSM_SMSMessage *SMS)
 {
   struct tm *now;
   time_t nowh;
@@ -887,6 +891,9 @@ void GSM_SetDefaultSMSData (GSM_SMSMessage *SMS)
    - GSM 03.40 version 6.1.0 Release 1997, section 9.2.3.24
    - Smart Messaging Specification, Revision 1.0.0, September 15, 1997
 */
+#ifdef UCLINUX
+static
+#endif /* UCLINUX */
 GSM_Error EncodeUDHHeader(char *text, GSM_UDH UDHType)
 {
        int i=0;
@@ -910,7 +917,7 @@ GSM_Error EncodeUDHHeader(char *text, GSM_UDH UDHType)
        return GE_NONE;
 }
 
-int GSM_MakeSinglePartSMS2(GSM_SMSMessage *SMS,
+static int GSM_MakeSinglePartSMS2(GSM_SMSMessage *SMS,
     unsigned char *MessageBuffer,int cur, GSM_UDH UDHType, GSM_Coding_Type Coding){
 
   int j;
index 0ef16cc..fb9d3d5 100644 (file)
@@ -10,6 +10,8 @@
   
 */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
index 34d81b7..b355232 100644 (file)
@@ -8,6 +8,8 @@
 
 */
 
+#include "config.h"
+
 #include <string.h>\r
 #include <ctype.h>\r
 #include <time.h>\r
@@ -57,6 +59,8 @@ int GetLine(FILE *File, char *Line, int count) {
   } else return -1;
 }
 
+#ifndef UCLINUX
+
 /*
  * like atoi, but of a non-null-terminated string of a specified portion
  */
@@ -69,6 +73,8 @@ int mem_to_int(const char str[], int len)
   return( atoi(aux) );
 } 
 
+#endif /* UCLINUX */
+
 /*
  * make hexdump of Message
  */
@@ -156,6 +162,8 @@ void txhexdump(u16 MessageLength, u8 *MessageBuffer)
 
 #ifndef WIN32
 
+#ifndef UCLINUX
+
 #define max_buf_len 128
 #define lock_path "/var/lock/LCK.."
 
@@ -225,7 +233,7 @@ char *lock_device(const char* port)
 }
 
 /* Removes lock and frees memory */
-bool unlock_device(char *lock_file)
+static bool unlock_device(char *lock_file)
 {
        int err;
 
@@ -237,4 +245,7 @@ bool unlock_device(char *lock_file)
        free(lock_file);
        return (err + 1);
 }
+
+#endif /* UCLINUX */
+
 #endif /* WIN32 */
index d067fed..481c92e 100644 (file)
-/*\r
-\r
-  G N O K I I\r
-\r
-  A Linux/Unix toolset and driver for Nokia mobile phones.\r
-\r
-  Released under the terms of the GNU GPL, see file COPYING for more details.\r
-\r
-  This file provides an API for accessing functions on the 6110 and similar\r
-  phones.\r
-\r
-*/\r
-\r
-/* "Turn on" prototypes in n-6110.h */\r
-\r
-#define __n_6110_c \r
-\r
-/* System header files */\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <stdlib.h>\r
-\r
-#ifdef WIN32\r
-  #include "misc_win32.h"\r
-#endif\r
\r
-/* Various header file */\r
-#ifndef VC6\r
-  #include "config.h"\r
-#endif\r
-\r
-#include "gsm-api.h"\r
-#include "gsm-coding.h"\r
-#include "newmodules/n6110.h"\r
-#include "newmodules/n7110.h"\r
-#include "protocol/fbus.h"\r
-#include "devices/device.h"\r
-\r\r/* Global variables used by code in gsm-api.c to expose the functions\r
-   supported by this model of phone. */\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-/* Here we initialise model specific functions. */\r
-GSM_Functions N6110_Functions = {\r
-  N6110_Initialise,\r
-  N6110_DispatchMessage,\r
-  NULL_Terminate,\r
-  NULL_KeepAlive,\r
-  N6110_GetMemoryLocation,\r
-  N6110_WritePhonebookLocation,\r
-  N6110_GetSpeedDial,\r
-  N6110_SetSpeedDial,\r
-  N6110_GetMemoryStatus,\r
-  N6110_GetSMSStatus,\r
-  N6110_GetSMSCenter,\r
-  N6110_SetSMSCenter,\r
-  N6110_GetSMSMessage,\r
-  N6110_DeleteSMSMessage,\r
-  N6110_SendSMSMessage,\r
-  N6110_SaveSMSMessage,\r
-  N6110_GetRFLevel,\r
-  N6110_GetBatteryLevel,\r
-  N6110_GetPowerSource,\r
-  N6110_GetDisplayStatus,\r
-  N6110_EnterSecurityCode,\r
-  N6110_GetSecurityCodeStatus,\r
-  N6110_GetSecurityCode,\r
-  N6110_GetIMEI,\r
-  N6110_GetRevision,\r
-  N6110_GetModel,\r
-  N6110_GetDateTime,\r
-  N6110_SetDateTime,\r
-  N6110_GetAlarm,\r
-  N6110_SetAlarm,\r
-  N6110_DialVoice,\r
-  N6110_DialData,\r
-  N6110_GetIncomingCallNr,\r
-  N6110_GetNetworkInfo,\r
-  N6110_GetCalendarNote,\r
-  N6110_WriteCalendarNote,\r
-  N6110_DeleteCalendarNote,\r
-  N6110_NetMonitor,\r
-  N6110_SendDTMF,\r
-  N6110_GetBitmap,\r
-  N6110_SetBitmap,\r
-  N6110_SetRingTone,\r
-  N6110_SetBinRingTone,\r
-  N6110_GetBinRingTone,\r
-  N6110_Reset,\r
-  N6110_GetProfile,\r
-  N6110_SetProfile,\r
-  N6110_SendRLPFrame,\r
-  N6110_CancelCall,\r
-  N6110_PressKey,\r
-  N6110_EnableDisplayOutput,\r
-  N6110_DisableDisplayOutput,\r
-  N6110_EnableCellBroadcast,\r
-  N6110_DisableCellBroadcast,\r
-  N6110_ReadCellBroadcast,\r
-  N6110_PlayTone,\r
-  N6110_GetProductProfileSetting,\r
-  N6110_SetProductProfileSetting,\r
-  N6110_GetOperatorName,\r
-  N6110_SetOperatorName,\r
-  N6110_GetVoiceMailbox,\r  N6110_Tests,
+/*
+
+  G N O K I I
+
+  A Linux/Unix toolset and driver for Nokia mobile phones.
+
+  Released under the terms of the GNU GPL, see file COPYING for more details.
+
+  This file provides an API for accessing functions on the 6110 and similar
+  phones.
+
+*/
+
+#include "config.h"
+
+/* "Turn on" prototypes in n-6110.h */
+
+#define __n_6110_c 
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+  #include "misc_win32.h"
+#endif
+/* Various header file */
+#ifndef VC6
+  #include "config.h"
+#endif
+
+#include "gsm-api.h"
+#include "gsm-coding.h"
+#include "newmodules/n6110.h"
+#include "newmodules/n7110.h"
+#include "protocol/fbus.h"
+#include "devices/device.h"
+/* Global variables used by code in gsm-api.c to expose the functions
+   supported by this model of phone. */
+
+
+
+
+
+
+
+/* Here we initialise model specific functions. */
+GSM_Functions N6110_Functions = {
+  N6110_Initialise,
+  N6110_DispatchMessage,
+  NULL_Terminate,
+  NULL_KeepAlive,
+  N6110_GetMemoryLocation,
+  N6110_WritePhonebookLocation,
+#ifndef UCLINUX
+  N6110_GetSpeedDial,
+  N6110_SetSpeedDial,
+#else /* UCLINUX */
+  NULL,
+  NULL,
+#endif /* UCLINUX */
+  N6110_GetMemoryStatus,
+#ifndef UCLINUX
+  N6110_GetSMSStatus,
+  N6110_GetSMSCenter,
+  N6110_SetSMSCenter,
+  N6110_GetSMSMessage,
+  N6110_DeleteSMSMessage,
+  N6110_SendSMSMessage,
+  N6110_SaveSMSMessage,
+#else /* UCLINUX */
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+#endif /* UCLINUX */
+  N6110_GetRFLevel,
+  N6110_GetBatteryLevel,
+  N6110_GetPowerSource,
+#ifndef UCLINUX
+  N6110_GetDisplayStatus,
+  N6110_EnterSecurityCode,
+  N6110_GetSecurityCodeStatus,
+  N6110_GetSecurityCode,
+  N6110_GetIMEI,
+  N6110_GetRevision,
+  N6110_GetModel,
+  N6110_GetDateTime,
+  N6110_SetDateTime,
+  N6110_GetAlarm,
+  N6110_SetAlarm,
+  N6110_DialVoice,
+#else /* UCLINUX */
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+#endif /* UCLINUX */
+  N6110_DialData,
+#ifndef UCLINUX
+  N6110_GetIncomingCallNr,
+  N6110_GetNetworkInfo,
+  N6110_GetCalendarNote,
+  N6110_WriteCalendarNote,
+  N6110_DeleteCalendarNote,
+  N6110_NetMonitor,
+  N6110_SendDTMF,
+  N6110_GetBitmap,
+  N6110_SetBitmap,
+  N6110_SetRingTone,
+  N6110_SetBinRingTone,
+  N6110_GetBinRingTone,
+#else /* UCLINUX */
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+#endif /* UCLINUX */
+  N6110_Reset,
+#ifndef UCLINUX
+  N6110_GetProfile,
+  N6110_SetProfile,
+  N6110_SendRLPFrame,
+#else /* UCLINUX */
+  NULL,
+  NULL,
+  NULL,
+#endif /* UCLINUX */
+  N6110_CancelCall,
+#ifndef UCLINUX
+  N6110_PressKey,
+  N6110_EnableDisplayOutput,
+  N6110_DisableDisplayOutput,
+  N6110_EnableCellBroadcast,
+  N6110_DisableCellBroadcast,
+  N6110_ReadCellBroadcast,
+  N6110_PlayTone,
+  N6110_GetProductProfileSetting,
+  N6110_SetProductProfileSetting,
+  N6110_GetOperatorName,
+  N6110_SetOperatorName,
+  N6110_GetVoiceMailbox,  N6110_Tests,
   N6110_SimlockInfo,
   UNIMPLEMENTED,                 //GetCalendarNotesInfo
   N6110_GetSMSFolders,
@@ -116,568 +170,612 @@ GSM_Functions N6110_Functions = {
   N7110_GetWAPSettings,
   N6110_CallDivert,
   N6110_AnswerCall,
+#else /* UCLINUX */
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,  NULL,
+  NULL,
+  NULL,                 //GetCalendarNotesInfo
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+#endif /* UCLINUX */
   N6110_GetManufacturer
-};\r
-\r
-/* Mobile phone information */\r
-\r
-GSM_Information N6110_Information = {\r
-  "3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850",\r
-     /* Supported models in FBUS */\r
-  "3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850",\r
-     /* Supported models in MBUS */\r
-  "6110|6130|6150|8210|8850",\r
-     /* Supported models in FBUS over infrared */\r
-  "",\r
-     /* Supported models in FBUS over DLR3 */\r
+};
+
+/* Mobile phone information */
+
+GSM_Information N6110_Information = {
+  "3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850",
+     /* Supported models in FBUS */
+  "3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850",
+     /* Supported models in MBUS */
+  "6110|6130|6150|8210|8850",
+     /* Supported models in FBUS over infrared */
+  "",
+     /* Supported models in FBUS over DLR3 */
   "",
      /* AT commands */
   "8210|8850",
      /* infrared sockets */
   "6110|6130|6150|8210|8850",
-     /* Supported models in FBUS over infrared with Tekram device */\r  
-  4,                     /* Max RF Level */\r
-  0,                     /* Min RF Level */\r
-  GRF_Arbitrary,         /* RF level units */\r
-  4,                     /* Max Battery Level */\r
-  0,                     /* Min Battery Level */\r
-  GBU_Arbitrary,         /* Battery level units */\r
-  GDT_DateTime,          /* Have date/time support */\r
-  GDT_TimeOnly,                 /* Alarm supports time only */\r
-  1                      /* Only one alarm available */\r
-};\r
-\r
-const char *N6110_MemoryType_String [] = {\r
-  "",  /* 0x00 */\r
-  "MT", /* 0x01 */\r
-  "ME", /* 0x02 */\r
-  "SM", /* 0x03 */\r
-  "FD", /* 0x04 */\r
-  "ON", /* 0x05 */\r
-  "EN", /* 0x06 */\r
-  "DC", /* 0x07 */\r
-  "RC", /* 0x08 */\r
-  "MC", /* 0x09 */\r
-};\r
-\r
-/* Magic bytes from the phone. */\r
-unsigned char MagicBytes[4] = { 0x00, 0x00, 0x00, 0x00 };\r
-\r
-/* For DisplayOutput */\r
-char               PhoneScreen[5+1][27+1];\r
-int                OldX=1000,OldY=0,NewX=0,NewY=0;\r
-\r
-void N6110_ReplyEnableExtendedCommands(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Answer for EnableExtendedSecurityCommands frame, meaning not known :-(\n"));\r
-#endif /* DEBUG */\r
-\r
-  CurrentEnableExtendedCommandsError=GE_NONE;  \r
-}\r
-\r
-/* If you set make some things (for example,\r
-   change Security Code from phone's menu, disable and enable\r
-   phone), it won't answer for 0x40 frame - you won't be able\r
-   to play tones, get netmonitor, etc.\r
-\r
-   This function do thing called "Enabling extended security commands" -\r
-   it enables 0x40 frame functions.\r
-\r
-   This frame can also some other things - see below */\r
-GSM_Error N6110_EnableExtendedCommands (unsigned char status)\r
-{\r
-  unsigned char req[4] = { 0x00,\r
-                           0x01,0x64, /* Enable extended commands request */\r
-                          0x01 };    /* 0x01 - on, 0x00 - off,\r
-                                        0x03 & 0x04 - soft & hard reset,\r
-                                         0x06 - CONTACT SERVICE */\r
-\r
-  /* 0x06 MAKES CONTACT SERVICE! BE CAREFULL! */\r
+     /* Supported models in FBUS over infrared with Tekram device */  
+  4,                     /* Max RF Level */
+  0,                     /* Min RF Level */
+  GRF_Arbitrary,         /* RF level units */
+  4,                     /* Max Battery Level */
+  0,                     /* Min Battery Level */
+  GBU_Arbitrary,         /* Battery level units */
+  GDT_DateTime,          /* Have date/time support */
+  GDT_TimeOnly,                 /* Alarm supports time only */
+  1                      /* Only one alarm available */
+};
+
+#ifdef DEBUG
+static const char *N6110_MemoryType_String [] = {
+  "",  /* 0x00 */
+  "MT", /* 0x01 */
+  "ME", /* 0x02 */
+  "SM", /* 0x03 */
+  "FD", /* 0x04 */
+  "ON", /* 0x05 */
+  "EN", /* 0x06 */
+  "DC", /* 0x07 */
+  "RC", /* 0x08 */
+  "MC", /* 0x09 */
+};
+#endif /* DEBUG */
+
+/* Magic bytes from the phone. */
+static unsigned char MagicBytes[4] = { 0x00, 0x00, 0x00, 0x00 };
+
+/* For DisplayOutput */
+#ifndef UCLINUX
+static char               PhoneScreen[5+1][27+1];
+static int                OldX=1000,OldY=0,NewX=0,NewY=0;
+#endif /* UCLINUX */
+
+void N6110_ReplyEnableExtendedCommands(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+  fprintf(stdout, _("Message: Answer for EnableExtendedSecurityCommands frame, meaning not known :-(\n"));
+#endif /* DEBUG */
+
+  CurrentEnableExtendedCommandsError=GE_NONE;  
+}
+
+/* If you set make some things (for example,
+   change Security Code from phone's menu, disable and enable
+   phone), it won't answer for 0x40 frame - you won't be able
+   to play tones, get netmonitor, etc.
+
+   This function do thing called "Enabling extended security commands" -
+   it enables 0x40 frame functions.
+
+   This frame can also some other things - see below */
+GSM_Error N6110_EnableExtendedCommands (unsigned char status)
+{
+  unsigned char req[4] = { 0x00,
+                           0x01,0x64, /* Enable extended commands request */
+                          0x01 };    /* 0x01 - on, 0x00 - off,
+                                        0x03 & 0x04 - soft & hard reset,
+                                         0x06 - CONTACT SERVICE */
+
+  /* 0x06 MAKES CONTACT SERVICE! BE CAREFULL! */
   /* When use 0x03 and had during session changed time & date
      some phones (like 6150 or 6210) can ask for time & date after reset
      or disable clock on the screen */
-  if (status!=0x06) req[3] = status;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentEnableExtendedCommandsError, 4, 0x40, req);\r
-}\r
-\r
-void N6110_ReplyIMEI(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#if defined WIN32 || !defined HAVE_SNPRINTF\r
-  sprintf(Current_IMEI, "%s", MessageBuffer+4);\r
-#else\r
-  snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+4);\r
-#endif\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: IMEI %s received\n"),Current_IMEI);\r
-#endif\r
-\r
-  CurrentGetIMEIError=GE_NONE;       \r
-}\r
-\r
-GSM_Error N6110_SendIMEIFrame()\r
-{\r
-  unsigned char req[4] = {0x00, 0x01, 0x66, 0x00};  \r
-\r
-  GSM_Error error;\r
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-  \r
-  return NULL_SendMessageSequence (20, &CurrentGetIMEIError, 4, 0x40, req);\r
-}\r
-\r
-void N6110_ReplyHW(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i, j;\r
-    \r
-  if (MessageBuffer[3]==0x05) {\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout,_("Message: Hardware version received: "));\r
-#endif\r
-\r
-    j=strlen(Current_Revision);\r
-    Current_Revision[j++]=',';\r
-    Current_Revision[j++]=' ';\r
-    Current_Revision[j++]='H';\r
-    Current_Revision[j++]='W';\r
-            \r
-    for (i=5;i<9;i++) {\r
-#ifdef DEBUG\r
-      fprintf(stdout,_("%c"), MessageBuffer[i]);\r
-#endif\r
-      Current_Revision[j++]=MessageBuffer[i];\r
-    }\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout,_("\n"));\r
-#endif\r
-\r
-    CurrentGetHWError=GE_NONE;\r
-  }\r
-}\r
-\r
-GSM_Error N6110_SendHWFrame()\r
-{\r
-  unsigned char req[4] = {0x00, 0x01, 0xc8, 0x05};  \r
-\r
-  GSM_Error error;\r
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-  \r
-  return NULL_SendMessageSequence (20, &CurrentGetHWError, 4, 0x40, req);\r
-}\r
-\r
-void N6110_ReplyID(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i, j;\r
\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Mobile phone model identification received:\n"));\r
-  fprintf(stdout, _("   Firmware: "));\r
-#endif\r
-\r
-  strcpy(Current_Revision,"SW");\r
-    \r
-  i=6;j=2;\r
-  while (MessageBuffer[i]!=0x0a) {\r
-    Current_Revision[j]=MessageBuffer[i];\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("%c"),MessageBuffer[i]);\r
-#endif\r
-    if (j==GSM_MAX_REVISION_LENGTH-1) {\r
-#ifdef DEBUG\r
-      fprintf(stderr,_("ERROR: increase GSM_MAX_REVISION_LENGTH!\n"));\r
-#endif  \r
-      break;\r
-    }\r
-    j++;\r
-    i++;\r
-  }\r
-  Current_Revision[j+1]=0;\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("\n   Firmware date: "));\r
-#endif\r
-\r
-  i++;\r
-  while (MessageBuffer[i]!=0x0a) {\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("%c"),MessageBuffer[i]);\r
-#endif\r
-    i++;\r
-  }\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("\n   Model: "));\r
-#endif /* DEBUG */\r
-\r
-  i++;j=0;\r
-  while (MessageBuffer[i]!=0x0a) {\r
-    Current_Model[j]=MessageBuffer[i];\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("%c"),MessageBuffer[i]);\r
-#endif\r
-    if (j==GSM_MAX_MODEL_LENGTH-1) {\r
-#ifdef DEBUG\r
-      fprintf(stderr,_("ERROR: increase GSM_MAX_MODEL_LENGTH!\n"));\r
-#endif  \r
-      break;\r
-    }\r
-    j++;\r
-    i++;\r
-  }\r
-  Current_Model[j+1]=0;\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("\n"));\r
-#endif /* DEBUG */\r
-    \r
-  CurrentMagicError=GE_NONE;\r
-}\r
-\r
-GSM_Error N6110_SendIDFrame()\r
-{\r
-  unsigned char req[5] = {N6110_FRAME_HEADER, 0x03, 0x00};  \r
-\r
-  return NULL_SendMessageSequence (50, &CurrentMagicError, 5, 0xd1, req);\r
-}\r
-\r
-/* This function send the status request to the phone. */\r
-/* Seems to be ignored in N3210 */\r
-GSM_Error N6110_SendStatusRequest(void)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x01};\r
-\r
-  Protocol->SendMessage(4, 0x04, req);\r
-\r
-  return (GE_NONE);\r
-}\r
-\r
-void N6110_ReplyGetAuthentication(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#if defined WIN32 || !defined HAVE_SNPRINTF\r
-  sprintf(Current_IMEI, "%s", MessageBuffer+9);\r
-  sprintf(Current_Model, "%s", MessageBuffer+25);\r
-  sprintf(Current_Revision, "SW%s, HW%s", MessageBuffer+44, MessageBuffer+39);\r
-#else\r
-  snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+9);\r
-  snprintf(Current_Model, GSM_MAX_MODEL_LENGTH, "%s", MessageBuffer+25);\r
-  snprintf(Current_Revision, GSM_MAX_REVISION_LENGTH, "SW%s, HW%s", MessageBuffer+44, MessageBuffer+39);\r
-#endif\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Mobile phone identification received:\n"));\r
-  fprintf(stdout, _("   IMEI: %s\n"), Current_IMEI);\r
-  fprintf(stdout, _("   Model: %s\n"), Current_Model);\r
-  fprintf(stdout, _("   Production Code: %s\n"), MessageBuffer+31);\r
-  fprintf(stdout, _("   HW: %s\n"), MessageBuffer+39);\r
-  fprintf(stdout, _("   Firmware: %s\n"), MessageBuffer+44);\r
-\r
-  /* These bytes are probably the source of the "Accessory not connected"\r
-     messages on the phone when trying to emulate NCDS... I hope....\r
-     UPDATE: of course, now we have the authentication algorithm. */\r
-  fprintf(stdout, _("   Magic bytes: %02x %02x %02x %02x\n"), MessageBuffer[50], MessageBuffer[51], MessageBuffer[52], MessageBuffer[53]);\r
-#endif /* DEBUG */\r
-\r
-  MagicBytes[0]=MessageBuffer[50];\r
-  MagicBytes[1]=MessageBuffer[51];\r
-  MagicBytes[2]=MessageBuffer[52];\r
-  MagicBytes[3]=MessageBuffer[53];\r
-\r
-  CurrentMagicError=GE_NONE;\r
-}\r
-\r
-/* This function provides Nokia authentication protocol.\r
-\r
-   This code is written specially for gnokii project by Odinokov Serge.\r
-   If you have some special requests for Serge just write him to\r
-   apskaita@post.omnitel.net or serge@takas.lt\r
-\r
-   Reimplemented in C by Pavel Janík ml.\r
-\r
-   Nokia authentication protocol is used in the communication between Nokia\r
-   mobile phones (e.g. Nokia 6110) and Nokia Cellular Data Suite software,\r
-   commercially sold by Nokia Corp.\r
-\r
-   The authentication scheme is based on the token send by the phone to the\r
-   software. The software does it's magic (see the function\r
-   FB61_GetNokiaAuth()) and returns the result back to the phone. If the\r
-   result is correct the phone responds with the message "Accessory\r
-   connected!" displayed on the LCD. Otherwise it will display "Accessory not\r
-   supported" and some functions will not be available for use.\r
-\r
-   The specification of the protocol is not publicly available, no comment. */\r
-void N6110_GetNokiaAuth(unsigned char *Imei, unsigned char *MagicBytes, unsigned char *MagicResponse)\r
-{\r
-\r
-  int i, j, CRC=0;\r
-\r
-  /* This is our temporary working area. */\r
-\r
-  unsigned char Temp[16];\r
-\r
-  /* Here we put FAC (Final Assembly Code) and serial number into our area. */\r
-\r
-  Temp[0]  = Imei[6];\r
-  Temp[1]  = Imei[7];\r
-  Temp[2]  = Imei[8];\r
-  Temp[3]  = Imei[9];\r
-  Temp[4]  = Imei[10];\r
-  Temp[5]  = Imei[11];\r
-  Temp[6]  = Imei[12];\r
-  Temp[7]  = Imei[13];\r
-\r
-  /* And now the TAC (Type Approval Code). */\r
-\r
-  Temp[8]  = Imei[2];\r
-  Temp[9]  = Imei[3];\r
-  Temp[10] = Imei[4];\r
-  Temp[11] = Imei[5];\r
-\r
-  /* And now we pack magic bytes from the phone. */\r
-\r
-  Temp[12] = MagicBytes[0];\r
-  Temp[13] = MagicBytes[1];\r
-  Temp[14] = MagicBytes[2];\r
-  Temp[15] = MagicBytes[3];\r
-\r
-  for (i=0; i<=11; i++)\r
-    if (Temp[i + 1]& 1)\r
-      Temp[i]<<=1;\r
-\r
-  switch (Temp[15] & 0x03) {\r
-\r
-  case 1:\r
-  case 2:\r
-    j = Temp[13] & 0x07;\r
-\r
-    for (i=0; i<=3; i++)\r
-      Temp[i+j] ^= Temp[i+12];\r
-\r
-    break;\r
-\r
-  default:\r
-    j = Temp[14] & 0x07;\r
-\r
-    for (i=0; i<=3; i++)\r
-      Temp[i + j] |= Temp[i + 12];\r
-  }\r
-\r
-  for (i=0; i<=15; i++)\r
-    CRC ^= Temp[i];\r
-\r
-  for (i=0; i<=15; i++) {\r
-\r
-    switch (Temp[15 - i] & 0x06) {\r
-\r
-    case 0:\r
-      j = Temp[i] | CRC;\r
-      break;\r
-\r
-    case 2:\r
-    case 4:\r
-      j = Temp[i] ^ CRC;\r
-      break;\r
-\r
-    case 6:\r
-      j = Temp[i] & CRC;\r
-      break;\r
-    }\r
-  \r
-    if (j == CRC)\r
-      j = 0x2c;\r
-\r
-    if (Temp[i] == 0)\r
-      j = 0;\r
-\r
-    MagicResponse[i] = j;\r
-\r
-  }\r
-}\r
-\r
-GSM_Error N6110_Authentication()\r
-{\r
-  unsigned char connect1[] = {N6110_FRAME_HEADER, 0x0d, 0x00, 0x00, 0x02};\r
-  unsigned char connect2[] = {N6110_FRAME_HEADER, 0x20, 0x02};\r
-  unsigned char connect3[] = {N6110_FRAME_HEADER, 0x0d, 0x01, 0x00, 0x02};\r
-  unsigned char connect4[] = {N6110_FRAME_HEADER, 0x10};\r
-  \r
-  unsigned char magic_connect[] = {N6110_FRAME_HEADER,\r
-  0x12,\r
-\r
-  /* The real magic goes here ... These bytes are filled in with the\r
-     function N6110_GetNokiaAuth(). */\r
-\r
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-\r
-  /* NOKIA&GNOKII Accessory */\r
-\r
-  0x4e, 0x4f, 0x4b, 0x49, 0x41, 0x26, 0x4e, 0x4f, 0x4b, 0x49, 0x41, 0x20,\r
-  0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x79,\r
-  \r
-  0x00, 0x00, 0x00, 0x00};\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout,_("Making authentication!\n"));\r
-#endif\r
-\r
-  usleep(100); Protocol->SendMessage(7, 0x02, connect1);\r
-  usleep(100); Protocol->SendMessage(5, 0x02, connect2);\r
-  usleep(100); Protocol->SendMessage(7, 0x02, connect3);\r
-      \r
-  CurrentMagicError = GE_BUSY;\r
-\r
-  usleep(100); Protocol->SendMessage(4, 0x64, connect4);\r
-  if (NULL_WaitUntil(50,&CurrentMagicError)!=GE_NONE) return GE_TIMEOUT;\r
-\r
-  N6110_GetNokiaAuth(Current_IMEI, MagicBytes, magic_connect+4);\r
-\r
-  Protocol->SendMessage(45, 0x64, magic_connect);\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout,_("End of authentication!\n"));\r
-#endif\r
-\r
-  return GE_NONE;\r
-}\r
-\r
-/* Initialise variables and state machine. */\r
-GSM_Error N6110_Initialise(char *port_device, char *initlength,\r
-                          GSM_ConnectionType connection,\r
-                          void (*rlp_callback)(RLP_F96Frame *frame))\r
-{\r
-  unsigned char init_char = N6110_SYNC_BYTE;\r
-  unsigned char end_init_char = N6110_IR_END_SYNC_BYTE;\r
-\r
-  int count;\r
-  int InitLength;\r
-  \r
-  if (Protocol->Initialise(port_device,initlength,connection,rlp_callback)!=GE_NONE)\r
-  {\r
-    return GE_NOTSUPPORTED;\r
-  }\r
+  if (status!=0x06) req[3] = status;
+
+  return NULL_SendMessageSequence
+    (50, &CurrentEnableExtendedCommandsError, 4, 0x40, req);
+}
+
+void N6110_ReplyIMEI(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#if defined WIN32 || !defined HAVE_SNPRINTF
+  sprintf(Current_IMEI, "%s", MessageBuffer+4);
+#else
+  snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+4);
+#endif
+
+#ifdef DEBUG
+  fprintf(stdout, _("Message: IMEI %s received\n"),Current_IMEI);
+#endif
+
+  CurrentGetIMEIError=GE_NONE;       
+}
+
+GSM_Error N6110_SendIMEIFrame()
+{
+  unsigned char req[4] = {0x00, 0x01, 0x66, 0x00};  
+
+  GSM_Error error;
+
+  error=N6110_EnableExtendedCommands(0x01);
+  if (error!=GE_NONE) return error;
+  
+  return NULL_SendMessageSequence (20, &CurrentGetIMEIError, 4, 0x40, req);
+}
+
+void N6110_ReplyHW(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+  int i, j;
+    
+  if (MessageBuffer[3]==0x05) {
+
+#ifdef DEBUG
+    fprintf(stdout,_("Message: Hardware version received: "));
+#endif
+
+    j=strlen(Current_Revision);
+    Current_Revision[j++]=',';
+    Current_Revision[j++]=' ';
+    Current_Revision[j++]='H';
+    Current_Revision[j++]='W';
+            
+    for (i=5;i<9;i++) {
+#ifdef DEBUG
+      fprintf(stdout,_("%c"), MessageBuffer[i]);
+#endif
+      Current_Revision[j++]=MessageBuffer[i];
+    }
+
+#ifdef DEBUG
+    fprintf(stdout,_("\n"));
+#endif
+
+    CurrentGetHWError=GE_NONE;
+  }
+}
+
+GSM_Error N6110_SendHWFrame()
+{
+  unsigned char req[4] = {0x00, 0x01, 0xc8, 0x05};  
+
+  GSM_Error error;
+
+  error=N6110_EnableExtendedCommands(0x01);
+  if (error!=GE_NONE) return error;
+  
+  return NULL_SendMessageSequence (20, &CurrentGetHWError, 4, 0x40, req);
+}
+
+void N6110_ReplyID(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+  int i, j;
+#ifdef DEBUG
+  fprintf(stdout, _("Message: Mobile phone model identification received:\n"));
+  fprintf(stdout, _("   Firmware: "));
+#endif
+
+  strcpy(Current_Revision,"SW");
+    
+  i=6;j=2;
+  while (MessageBuffer[i]!=0x0a) {
+    Current_Revision[j]=MessageBuffer[i];
+#ifdef DEBUG
+    fprintf(stdout, _("%c"),MessageBuffer[i]);
+#endif
+    if (j==GSM_MAX_REVISION_LENGTH-1) {
+#ifdef DEBUG
+      fprintf(stderr,_("ERROR: increase GSM_MAX_REVISION_LENGTH!\n"));
+#endif  
+      break;
+    }
+    j++;
+    i++;
+  }
+  Current_Revision[j+1]=0;
+
+#ifdef DEBUG
+  fprintf(stdout, _("\n   Firmware date: "));
+#endif
+
+  i++;
+  while (MessageBuffer[i]!=0x0a) {
+#ifdef DEBUG
+    fprintf(stdout, _("%c"),MessageBuffer[i]);
+#endif
+    i++;
+  }
+
+#ifdef DEBUG
+  fprintf(stdout, _("\n   Model: "));
+#endif /* DEBUG */
+
+  i++;j=0;
+  while (MessageBuffer[i]!=0x0a) {
+    Current_Model[j]=MessageBuffer[i];
+#ifdef DEBUG
+    fprintf(stdout, _("%c"),MessageBuffer[i]);
+#endif
+    if (j==GSM_MAX_MODEL_LENGTH-1) {
+#ifdef DEBUG
+      fprintf(stderr,_("ERROR: increase GSM_MAX_MODEL_LENGTH!\n"));
+#endif  
+      break;
+    }
+    j++;
+    i++;
+  }
+  Current_Model[j+1]=0;
+
+#ifdef DEBUG
+  fprintf(stdout, _("\n"));
+#endif /* DEBUG */
+    
+  CurrentMagicError=GE_NONE;
+}
+
+GSM_Error N6110_SendIDFrame()
+{
+  unsigned char req[5] = {N6110_FRAME_HEADER, 0x03, 0x00};  
+
+  return NULL_SendMessageSequence (50, &CurrentMagicError, 5, 0xd1, req);
+}
+
+/* This function send the status request to the phone. */
+/* Seems to be ignored in N3210 */
+GSM_Error N6110_SendStatusRequest(void)
+{
+  unsigned char req[] = {N6110_FRAME_HEADER, 0x01};
+
+  Protocol->SendMessage(4, 0x04, req);
+
+  return (GE_NONE);
+}
+
+static void N6110_ReplyGetAuthentication(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#if defined WIN32 || !defined HAVE_SNPRINTF
+  sprintf(Current_IMEI, "%s", MessageBuffer+9);
+  sprintf(Current_Model, "%s", MessageBuffer+25);
+  sprintf(Current_Revision, "SW%s, HW%s", MessageBuffer+44, MessageBuffer+39);
+#else
+  snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+9);
+  snprintf(Current_Model, GSM_MAX_MODEL_LENGTH, "%s", MessageBuffer+25);
+  snprintf(Current_Revision, GSM_MAX_REVISION_LENGTH, "SW%s, HW%s", MessageBuffer+44, MessageBuffer+39);
+#endif
+
+#ifdef DEBUG
+  fprintf(stdout, _("Message: Mobile phone identification received:\n"));
+  fprintf(stdout, _("   IMEI: %s\n"), Current_IMEI);
+  fprintf(stdout, _("   Model: %s\n"), Current_Model);
+  fprintf(stdout, _("   Production Code: %s\n"), MessageBuffer+31);
+  fprintf(stdout, _("   HW: %s\n"), MessageBuffer+39);
+  fprintf(stdout, _("   Firmware: %s\n"), MessageBuffer+44);
+
+  /* These bytes are probably the source of the "Accessory not connected"
+     messages on the phone when trying to emulate NCDS... I hope....
+     UPDATE: of course, now we have the authentication algorithm. */
+  fprintf(stdout, _("   Magic bytes: %02x %02x %02x %02x\n"), MessageBuffer[50], MessageBuffer[51], MessageBuffer[52], MessageBuffer[53]);
+#endif /* DEBUG */
+
+  MagicBytes[0]=MessageBuffer[50];
+  MagicBytes[1]=MessageBuffer[51];
+  MagicBytes[2]=MessageBuffer[52];
+  MagicBytes[3]=MessageBuffer[53];
+
+  CurrentMagicError=GE_NONE;
+}
+
+/* This function provides Nokia authentication protocol.
+
+   This code is written specially for gnokii project by Odinokov Serge.
+   If you have some special requests for Serge just write him to
+   apskaita@post.omnitel.net or serge@takas.lt
+
+   Reimplemented in C by Pavel Janík ml.
+
+   Nokia authentication protocol is used in the communication between Nokia
+   mobile phones (e.g. Nokia 6110) and Nokia Cellular Data Suite software,
+   commercially sold by Nokia Corp.
+
+   The authentication scheme is based on the token send by the phone to the
+   software. The software does it's magic (see the function
+   FB61_GetNokiaAuth()) and returns the result back to the phone. If the
+   result is correct the phone responds with the message "Accessory
+   connected!" displayed on the LCD. Otherwise it will display "Accessory not
+   supported" and some functions will not be available for use.
+
+   The specification of the protocol is not publicly available, no comment. */
+static void N6110_GetNokiaAuth(unsigned char *Imei, unsigned char *MagicBytes, unsigned char *MagicResponse)
+{
+
+  int i, j, CRC=0;
+
+  /* This is our temporary working area. */
+
+  unsigned char Temp[16];
+
+  /* Here we put FAC (Final Assembly Code) and serial number into our area. */
+
+  Temp[0]  = Imei[6];
+  Temp[1]  = Imei[7];
+  Temp[2]  = Imei[8];
+  Temp[3]  = Imei[9];
+  Temp[4]  = Imei[10];
+  Temp[5]  = Imei[11];
+  Temp[6]  = Imei[12];
+  Temp[7]  = Imei[13];
+
+  /* And now the TAC (Type Approval Code). */
+
+  Temp[8]  = Imei[2];
+  Temp[9]  = Imei[3];
+  Temp[10] = Imei[4];
+  Temp[11] = Imei[5];
+
+  /* And now we pack magic bytes from the phone. */
+
+  Temp[12] = MagicBytes[0];
+  Temp[13] = MagicBytes[1];
+  Temp[14] = MagicBytes[2];
+  Temp[15] = MagicBytes[3];
+
+  for (i=0; i<=11; i++)
+    if (Temp[i + 1]& 1)
+      Temp[i]<<=1;
+
+  switch (Temp[15] & 0x03) {
+
+  case 1:
+  case 2:
+    j = Temp[13] & 0x07;
+
+    for (i=0; i<=3; i++)
+      Temp[i+j] ^= Temp[i+12];
+
+    break;
+
+  default:
+    j = Temp[14] & 0x07;
+
+    for (i=0; i<=3; i++)
+      Temp[i + j] |= Temp[i + 12];
+  }
+
+  for (i=0; i<=15; i++)
+    CRC ^= Temp[i];
+
+  for (i=0; i<=15; i++) {
+
+    switch (Temp[15 - i] & 0x06) {
+
+    case 0:
+      j = Temp[i] | CRC;
+      break;
+
+    case 2:
+    case 4:
+      j = Temp[i] ^ CRC;
+      break;
+
+    case 6:
+      j = Temp[i] & CRC;
+      break;
+    }
+  
+    if (j == CRC)
+      j = 0x2c;
+
+    if (Temp[i] == 0)
+      j = 0;
+
+    MagicResponse[i] = j;
+
+  }
+}
+
+static GSM_Error N6110_Authentication()
+{
+  unsigned char connect1[] = {N6110_FRAME_HEADER, 0x0d, 0x00, 0x00, 0x02};
+  unsigned char connect2[] = {N6110_FRAME_HEADER, 0x20, 0x02};
+  unsigned char connect3[] = {N6110_FRAME_HEADER, 0x0d, 0x01, 0x00, 0x02};
+  unsigned char connect4[] = {N6110_FRAME_HEADER, 0x10};
+  
+  unsigned char magic_connect[] = {N6110_FRAME_HEADER,
+  0x12,
+
+  /* The real magic goes here ... These bytes are filled in with the
+     function N6110_GetNokiaAuth(). */
+
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+
+  /* NOKIA&GNOKII Accessory */
+
+  0x4e, 0x4f, 0x4b, 0x49, 0x41, 0x26, 0x4e, 0x4f, 0x4b, 0x49, 0x41, 0x20,
+  0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x79,
+  
+  0x00, 0x00, 0x00, 0x00};
+
+#ifdef DEBUG
+  fprintf(stdout,_("Making authentication!\n"));
+#endif
+
+  usleep(100); Protocol->SendMessage(7, 0x02, connect1);
+  usleep(100); Protocol->SendMessage(5, 0x02, connect2);
+  usleep(100); Protocol->SendMessage(7, 0x02, connect3);
+      
+  CurrentMagicError = GE_BUSY;
+
+  usleep(100); Protocol->SendMessage(4, 0x64, connect4);
+  if (NULL_WaitUntil(50,&CurrentMagicError)!=GE_NONE) return GE_TIMEOUT;
+
+  N6110_GetNokiaAuth(Current_IMEI, MagicBytes, magic_connect+4);
+
+  Protocol->SendMessage(45, 0x64, magic_connect);
+
+#ifdef DEBUG
+  fprintf(stdout,_("End of authentication!\n"));
+#endif
+
+  return GE_NONE;
+}
+
+/* Initialise variables and state machine. */
+GSM_Error N6110_Initialise(char *port_device, char *initlength,
+                          GSM_ConnectionType connection,
+                          void (*rlp_callback)(RLP_F96Frame *frame))
+{
+  unsigned char init_char = N6110_SYNC_BYTE;
+#ifndef UCLINUX
+  unsigned char end_init_char = N6110_IR_END_SYNC_BYTE;
+#endif /* UCLINUX */
+
+  int count;
+  int InitLength;
+  
+  if (Protocol->Initialise(port_device,initlength,connection,rlp_callback)!=GE_NONE)
+  {
+    return GE_NOTSUPPORTED;
+  }
 
   switch (CurrentConnectionType) {
+#ifndef UCLINUX
     case GCT_Irda:
     case GCT_MBUS:
       /* We don't think about authentication in Irda, because
          AFAIK there are no phones working over sockets
         and having authentication. In MBUS it doesn't work */
-      usleep(100);\r
-\r
-      if (N6110_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;\r
-    \r
-      if (N6110_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;    \r
-\r
-      if (N6110_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;    \r
-
-      CurrentLinkOK = true;                           \r      \r
+      usleep(100);
+
+      if (N6110_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;
+    
+      if (N6110_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;    
+
+      if (N6110_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;    
+
+      CurrentLinkOK = true;                                 
       break;
+#endif /* UCLINUX */
       
     case GCT_FBUS:
+#ifndef UCLINUX
     case GCT_Infrared:
     case GCT_Tekram:
-      InitLength = atoi(initlength);\r
-\r
-      if ((strcmp(initlength, "default") == 0) || (InitLength == 0)) {\r
-        InitLength = 250;      /* This is the usual value, lower may work. */\r
-      }\r
-\r
+#endif /* UCLINUX */
+      InitLength = atoi(initlength);
+
+      if ((strcmp(initlength, "default") == 0) || (InitLength == 0)) {
+        InitLength = 250;      /* This is the usual value, lower may work. */
+      }
+
+#ifndef UCLINUX
       if (CurrentConnectionType==GCT_Infrared ||
-          CurrentConnectionType==GCT_Tekram) {\r
-#ifdef DEBUG\r
-        fprintf(stdout,_("Setting infrared for FBUS communication...\n"));\r
-#endif\r
-        device_changespeed(9600);\r
-      }\r
-
-#ifdef DEBUG\r
-      fprintf(stdout,_("Writing init chars...."));\r
-#endif\r
-\r
-      /* Initialise link with phone or what have you */\r
-      /* Send init string to phone, this is a bunch of 0x55 characters. Timing is\r
-         empirical. */\r
-      for (count = 0; count < InitLength; count ++) {\r
+          CurrentConnectionType==GCT_Tekram) {
+#ifdef DEBUG
+        fprintf(stdout,_("Setting infrared for FBUS communication...\n"));
+#endif
+        device_changespeed(9600);
+      }
+#endif /* UCLINUX */
+
+#ifdef DEBUG
+      fprintf(stdout,_("Writing init chars...."));
+#endif
+
+      /* Initialise link with phone or what have you */
+      /* Send init string to phone, this is a bunch of 0x55 characters. Timing is
+         empirical. */
+      for (count = 0; count < InitLength; count ++) {
+#ifndef UCLINUX
         if (CurrentConnectionType!=GCT_Infrared &&
-            CurrentConnectionType!=GCT_Tekram) \r        usleep(100);\r
-        Protocol->WritePhone(1,&init_char);\r
-      }\r
-\r
+            CurrentConnectionType!=GCT_Tekram)
+#endif /* UCLINUX */
+                                       usleep(100);
+        Protocol->WritePhone(1,&init_char);
+      }
+
+#ifndef UCLINUX
       if (CurrentConnectionType==GCT_Infrared ||
-          CurrentConnectionType==GCT_Tekram)\r      {
-        Protocol->WritePhone(1,&end_init_char);\r
+          CurrentConnectionType==GCT_Tekram)      {
+        Protocol->WritePhone(1,&end_init_char);
         usleep(200000);
       }
+#endif /* UCLINUX */
 
-#ifdef DEBUG\r
-      fprintf(stdout,_("Done\n"));  \r
-#endif\r
+#ifdef DEBUG
+      fprintf(stdout,_("Done\n"));  
+#endif
 
+#ifndef UCLINUX
       if (CurrentConnectionType==GCT_Infrared ||
-          CurrentConnectionType==GCT_Tekram)\r      {
-        device_changespeed(115200);    \r
+          CurrentConnectionType==GCT_Tekram)      {
+        device_changespeed(115200);    
       }
+#endif /* UCLINUX */
+
+      N6110_SendStatusRequest();
+    
+      usleep(100);
+
+      if (N6110_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;
+    
+      /* N51xx/61xx have something called authentication.
+         After making it phone display "Accessory connected"
+         and probably give access to some function (I'm not too sure about it !)
+         Anyway, I make it now for N51xx/61xx */
+      if (GetModelFeature (FN_AUTHENTICATION)!=0) {
+        if (N6110_Authentication()!=GE_NONE) return GE_TIMEOUT;
+      } else {        /* No authentication */
+        if (N6110_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;    
 
-      N6110_SendStatusRequest();\r
-    \r
-      usleep(100);\r
-\r
-      if (N6110_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;\r
-    \r
-      /* N51xx/61xx have something called authentication.\r
-         After making it phone display "Accessory connected"\r
-         and probably give access to some function (I'm not too sure about it !)\r
-         Anyway, I make it now for N51xx/61xx */\r
-      if (GetModelFeature (FN_AUTHENTICATION)!=0) {\r
-        if (N6110_Authentication()!=GE_NONE) return GE_TIMEOUT;\r
-      } else {\r        /* No authentication */
-        if (N6110_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;    \r
-\r
-        if (N6110_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;    \r
-      }\r
+        if (N6110_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;    
+      }
       
       break;
     default:
-#ifdef DEBUG\r
-      fprintf(stdout,_("Unknown connection type in n6110.c!\n"));\r
-#endif\r
+#ifdef DEBUG
+      fprintf(stdout,_("Unknown connection type in n6110.c!\n"));
+#endif
       break;
   }
 
-  return (GE_NONE);\r
-}\r
-\r
-/* This function translates GMT_MemoryType to N6110_MEMORY_xx */\r
-int N6110_GetMemoryType(GSM_MemoryType memory_type)\r
-{\r
-\r
-  int result;\r
-\r
-  switch (memory_type) {\r
-\r
-     case GMT_MT: result = N6110_MEMORY_MT; break;\r
-     case GMT_ME: result = N6110_MEMORY_ME; break;\r
-     case GMT_SM: result = N6110_MEMORY_SM; break;\r
-     case GMT_FD: result = N6110_MEMORY_FD; break;\r
-     case GMT_ON: result = N6110_MEMORY_ON; break;\r
-     case GMT_EN: result = N6110_MEMORY_EN; break;\r
-     case GMT_DC: result = N6110_MEMORY_DC; break;\r
-     case GMT_RC: result = N6110_MEMORY_RC; break;\r
-     case GMT_MC: result = N6110_MEMORY_MC; break;\r
-     default    : result = N6110_MEMORY_XX;\r
-\r
-   }\r
-\r
-   return (result);\r
-}\r
+  return (GE_NONE);
+}
+
+/* This function translates GMT_MemoryType to N6110_MEMORY_xx */
+int N6110_GetMemoryType(GSM_MemoryType memory_type)
+{
+
+  int result;
+
+  switch (memory_type) {
+
+     case GMT_MT: result = N6110_MEMORY_MT; break;
+     case GMT_ME: result = N6110_MEMORY_ME; break;
+     case GMT_SM: result = N6110_MEMORY_SM; break;
+     case GMT_FD: result = N6110_MEMORY_FD; break;
+     case GMT_ON: result = N6110_MEMORY_ON; break;
+     case GMT_EN: result = N6110_MEMORY_EN; break;
+     case GMT_DC: result = N6110_MEMORY_DC; break;
+     case GMT_RC: result = N6110_MEMORY_RC; break;
+     case GMT_MC: result = N6110_MEMORY_MC; break;
+     default    : result = N6110_MEMORY_XX;
+
+   }
+
+   return (result);
+}
+
+#ifndef UCLINUX
 
 void N6110_ReplyCallDivert(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
 
@@ -743,14 +841,14 @@ void N6110_ReplyCallDivert(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
       CurrentCallDivert->Enabled=false;
     }
 
-    CurrentCallDivertError=GE_NONE;\r
+    CurrentCallDivertError=GE_NONE;
     break;
 
-  case 0x03:\r
+  case 0x03:
 #ifdef DEBUG
     fprintf(stdout, _("Message: Call divert status receiving error ?\n"));
-#endif\r
-    CurrentCallDivertError=GE_UNKNOWN;\r
+#endif
+    CurrentCallDivertError=GE_UNKNOWN;
     break;
   }
 }
@@ -768,8 +866,8 @@ GSM_Error N6110_CallDivert(GSM_CallDivert *cd)
   int length = 0x09;
 
   switch (cd->Operation) {
-    case GSM_CDV_Register:\r
-    case GSM_CDV_Enable:\r
+    case GSM_CDV_Register:
+    case GSM_CDV_Enable:
       req[4] = 0x03;
       req[8] = 0x01;
       req[29]= GSM_PackSemiOctetNumber(cd->Number, req + 9, false);
@@ -816,96 +914,96 @@ GSM_Error N6110_CallDivert(GSM_CallDivert *cd)
 
   return error;
 }
-\r
-GSM_Error N6110_Tests()\r
-{\r
-  unsigned char buffer[3]={0x00,0x01,0xcf};\r
-  unsigned char buffer3[8]={0x00,0x01,0xce,0x1d,0xfe,0x23,0x00,0x00};\r
+
+GSM_Error N6110_Tests()
+{
+  unsigned char buffer[3]={0x00,0x01,0xcf};
+  unsigned char buffer3[8]={0x00,0x01,0xce,0x1d,0xfe,0x23,0x00,0x00};
   
   GSM_Error error;
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
+
+  error=N6110_EnableExtendedCommands(0x01);
   if (error!=GE_NONE) return error;
-\r
-  //make almost all tests\r
-  Protocol->SendMessage(8, 0x40, buffer3);\r
-\r
-  while (GSM->Initialise(PortDevice, "50", CurrentConnectionType, CurrentRLP_RXCallback)!=GE_NONE) {};\r
-\r
-  sleep(2);\r
-\r
-  return NULL_SendMessageSequence\r
-    (200, &CurrentNetworkInfoError, 3, 0x40, buffer);  \r
-}\r
-\r
-void N6110_DisplayTestsInfo(u8 *MessageBuffer) {\r
-\r
-  int i;\r
-\r
-  CurrentNetworkInfoError=GE_NONE;\r
-\r
-  for (i=0;i<MessageBuffer[3];i++) {\r
-    switch (i) {\r
-      case 0: fprintf(stdout,_("Unknown(%i)              "),i);break;\r
-      case 1: fprintf(stdout,_("MCU ROM checksum        "));break;\r
-      case 2: fprintf(stdout,_("MCU RAM interface       "));break;\r
-      case 3: fprintf(stdout,_("MCU RAM component       "));break;\r
-      case 4: fprintf(stdout,_("MCU EEPROM interface    "));break;\r
-      case 5: fprintf(stdout,_("MCU EEPROM component    "));break;\r
-      case 6: fprintf(stdout,_("Real Time Clock battery "));break;\r
-      case 7: fprintf(stdout,_("CCONT interface         "));break;\r
-      case 8: fprintf(stdout,_("AD converter            "));break;\r
-      case 9: fprintf(stdout,_("SW Reset                "));break;\r
-      case 10:fprintf(stdout,_("Power Off               "));break;\r
-      case 11:fprintf(stdout,_("Security Data           "));break;\r
-      case 12:fprintf(stdout,_("EEPROM Tune checksum    "));break;\r
-      case 13:fprintf(stdout,_("PPM checksum            "));break;\r
-      case 14:fprintf(stdout,_("MCU download DSP        "));break;\r
-      case 15:fprintf(stdout,_("DSP alive               "));break;\r
-      case 16:fprintf(stdout,_("COBBA serial            "));break;\r
-      case 17:fprintf(stdout,_("COBBA paraller          "));break;\r
-      case 18:fprintf(stdout,_("EEPROM security checksum"));break;\r
-      case 19:fprintf(stdout,_("PPM validity            "));break;\r
-      case 20:fprintf(stdout,_("Warranty state          "));break;\r
-      case 21:fprintf(stdout,_("Simlock check           "));break;\r
-      case 22:fprintf(stdout,_("IMEI check?             "));break;//from PC-Locals.is OK?\r
-      default:fprintf(stdout,_("Unknown(%i)             "),i);break;\r
-    }\r
-    switch (MessageBuffer[4+i]) {\r
-      case 0:   fprintf(stdout,_(" : done, result OK"));break;\r
-      case 0xff:fprintf(stdout,_(" : not done, result unknown"));break;\r
-      case 254: fprintf(stdout,_(" : done, result NOT OK"));break;\r
-      default:  fprintf(stdout,_(" : result unknown(%i)"),MessageBuffer[4+i]);break;\r
-    }\r
-    fprintf(stdout,_("\n"));\r
-  }\r
-}\r
 
-void N6110_ReplySimlockInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+  //make almost all tests
+  Protocol->SendMessage(8, 0x40, buffer3);
 
-  int i, j;
-  
-  char uni[100];
-    \r
-#ifdef DEBUG
-  fprintf(stdout, _("Message: Simlock info received\n"));
-\r
-  j=0;\r
-  for (i=0; i < 12; i++)\r
-  {\r
-    if (j<24) {\r
-      fprintf(stdout,_("%c"), ('0' + (MessageBuffer[9+i] >> 4)));\r
-      j++;\r
-    }\r
-    if (j==5 || j==15) fprintf(stdout, _("\n"));\r
-    if (j!=15) {\r
-      if (j<24) {\r
-        fprintf(stdout,_("%c"), ('0' + (MessageBuffer[9+i] & 0x0f)));\r
-       j++;\r
-      }\r
-    } else j++;\r
-    if (j==20 || j==24) fprintf(stdout, _("\n"));\r
-  }\r
+  while (GSM->Initialise(PortDevice, "50", CurrentConnectionType, CurrentRLP_RXCallback)!=GE_NONE) {};
+
+  sleep(2);
+
+  return NULL_SendMessageSequence
+    (200, &CurrentNetworkInfoError, 3, 0x40, buffer);  
+}
+
+void N6110_DisplayTestsInfo(u8 *MessageBuffer) {
+
+  int i;
+
+  CurrentNetworkInfoError=GE_NONE;
+
+  for (i=0;i<MessageBuffer[3];i++) {
+    switch (i) {
+      case 0: fprintf(stdout,_("Unknown(%i)              "),i);break;
+      case 1: fprintf(stdout,_("MCU ROM checksum        "));break;
+      case 2: fprintf(stdout,_("MCU RAM interface       "));break;
+      case 3: fprintf(stdout,_("MCU RAM component       "));break;
+      case 4: fprintf(stdout,_("MCU EEPROM interface    "));break;
+      case 5: fprintf(stdout,_("MCU EEPROM component    "));break;
+      case 6: fprintf(stdout,_("Real Time Clock battery "));break;
+      case 7: fprintf(stdout,_("CCONT interface         "));break;
+      case 8: fprintf(stdout,_("AD converter            "));break;
+      case 9: fprintf(stdout,_("SW Reset                "));break;
+      case 10:fprintf(stdout,_("Power Off               "));break;
+      case 11:fprintf(stdout,_("Security Data           "));break;
+      case 12:fprintf(stdout,_("EEPROM Tune checksum    "));break;
+      case 13:fprintf(stdout,_("PPM checksum            "));break;
+      case 14:fprintf(stdout,_("MCU download DSP        "));break;
+      case 15:fprintf(stdout,_("DSP alive               "));break;
+      case 16:fprintf(stdout,_("COBBA serial            "));break;
+      case 17:fprintf(stdout,_("COBBA paraller          "));break;
+      case 18:fprintf(stdout,_("EEPROM security checksum"));break;
+      case 19:fprintf(stdout,_("PPM validity            "));break;
+      case 20:fprintf(stdout,_("Warranty state          "));break;
+      case 21:fprintf(stdout,_("Simlock check           "));break;
+      case 22:fprintf(stdout,_("IMEI check?             "));break;//from PC-Locals.is OK?
+      default:fprintf(stdout,_("Unknown(%i)             "),i);break;
+    }
+    switch (MessageBuffer[4+i]) {
+      case 0:   fprintf(stdout,_(" : done, result OK"));break;
+      case 0xff:fprintf(stdout,_(" : not done, result unknown"));break;
+      case 254: fprintf(stdout,_(" : done, result NOT OK"));break;
+      default:  fprintf(stdout,_(" : result unknown(%i)"),MessageBuffer[4+i]);break;
+    }
+    fprintf(stdout,_("\n"));
+  }
+}
+
+void N6110_ReplySimlockInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+  int i, j;
+  
+  char uni[100];
+    
+#ifdef DEBUG
+  fprintf(stdout, _("Message: Simlock info received\n"));
+
+  j=0;
+  for (i=0; i < 12; i++)
+  {
+    if (j<24) {
+      fprintf(stdout,_("%c"), ('0' + (MessageBuffer[9+i] >> 4)));
+      j++;
+    }
+    if (j==5 || j==15) fprintf(stdout, _("\n"));
+    if (j!=15) {
+      if (j<24) {
+        fprintf(stdout,_("%c"), ('0' + (MessageBuffer[9+i] & 0x0f)));
+       j++;
+      }
+    } else j++;
+    if (j==20 || j==24) fprintf(stdout, _("\n"));
+  }
       
   if ((MessageBuffer[6] & 1) == 1) fprintf(stdout,_("lock 1 closed\n"));
   if ((MessageBuffer[6] & 2) == 2) fprintf(stdout,_("lock 2 closed\n"));
@@ -967,17 +1065,17 @@ void N6110_ReplySimlockInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType
   CurrentSimlockInfoError=GE_NONE;
 }
 
-GSM_Error N6110_SimlockInfo(GSM_AllSimlocks *siml)\r
-{\r
-\r  GSM_Error error;
-  unsigned char req[] = {0x00,0x01,0x8a,0x00};\r\r
-  error=N6110_EnableExtendedCommands(0x01);\r
+GSM_Error N6110_SimlockInfo(GSM_AllSimlocks *siml)
+{
+  GSM_Error error;
+  unsigned char req[] = {0x00,0x01,0x8a,0x00};
+  error=N6110_EnableExtendedCommands(0x01);
   if (error!=GE_NONE) return error;
 
   CurrentSimLock=siml;
  
-  return NULL_SendMessageSequence (50, &CurrentSimlockInfoError, 4, 0x40, req);  \r
-}\r
+  return NULL_SendMessageSequence (50, &CurrentSimlockInfoError, 4, 0x40, req);  
+}
 
 void N6110_ReplyResetPhoneSettings(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
 
@@ -988,4646 +1086,4728 @@ void N6110_ReplyResetPhoneSettings(u16 MessageLength, u8 *MessageBuffer, u8 Mess
   CurrentResetPhoneSettingsError=GE_NONE;
 }
 
-GSM_Error N6110_ResetPhoneSettings()\r
-{\r
-\r  GSM_Error error;
-  unsigned char req[] = {0x00,0x01,0x65,0x08,0x00};\r  \r
-  error=N6110_EnableExtendedCommands(0x01);\r
+GSM_Error N6110_ResetPhoneSettings()
+{
+  GSM_Error error;
+  unsigned char req[] = {0x00,0x01,0x65,0x08,0x00};  
+  error=N6110_EnableExtendedCommands(0x01);
   if (error!=GE_NONE) return error;
 
-  return NULL_SendMessageSequence\r
-    (50, &CurrentResetPhoneSettingsError, 5, 0x40, req);  \r
-}\r\r
+  return NULL_SendMessageSequence
+    (50, &CurrentResetPhoneSettingsError, 5, 0x40, req);  
+}
+
+#endif /* UCLINUX */
+
 GSM_Error N6110_GetManufacturer(char *manufacturer)
 {
        strcpy (manufacturer, "Nokia");
        return (GE_NONE);
 }
 
-GSM_Error N6110_GetVoiceMailbox ( GSM_PhonebookEntry *entry)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x01, 0x00, 0x00, 0x00};\r
-\r
-  GSM_Error error;\r
-  \r
-  CurrentPhonebookEntry = entry;\r
-\r
-  req[4] = N6110_MEMORY_VOICE;\r
-  req[5] = 0x00; /* Location - isn't important, but... */\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentPhonebookError, 7, 0x03, req);\r
-    \r
-  CurrentPhonebookEntry = NULL;\r
-  \r
-  return error;\r
-}\r
-\r
-void N6110_ReplyGetOperatorName(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i, count;\r
-  \r
-  GSM_Bitmap NullBitmap;\r
-\r
-  DecodeNetworkCode(MessageBuffer+5, NullBitmap.netcode);\r
-  \r
-  count=8;\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Info about downloaded operator name received: %s network (for gnokii \"%s\", for phone \""),\r
-          NullBitmap.netcode,\r
-         GSM_GetNetworkName(NullBitmap.netcode));      \r
-#endif\r
-      \r
-  i=count;\r
-  while (MessageBuffer[count]!=0) {\r
-#ifdef DEBUG\r
-    fprintf(stdout,_("%c"),MessageBuffer[count]);\r
-#endif\r
-    count++;\r
-  }\r
-      \r
- strcpy(CurrentGetOperatorNameNetwork->Code, NullBitmap.netcode);\r
- strncpy(CurrentGetOperatorNameNetwork->Name, MessageBuffer+i,count-i+1);\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout,_("\")\n"));\r
-#endif\r
-          \r
-  CurrentGetOperatorNameError=GE_NONE;\r
-}\r
-\r
-GSM_Error N6110_GetOperatorName (GSM_Network *operator)\r
-{\r
-  unsigned char req[] = { 0x00,0x01,0x8c,0x00};\r
-\r
-  GSM_Error error;\r
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  CurrentGetOperatorNameNetwork = operator;\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentGetOperatorNameError, 4, 0x40, req);\r
-\r
-  CurrentGetOperatorNameNetwork = NULL;\r
-  \r
-  return error;\r
-}\r
-\r
-void N6110_ReplySetOperatorName(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-    \r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Downloaded operator name changed\n"));\r
-#endif    \r
-\r
-  CurrentSetOperatorNameError=GE_NONE;      \r
-}\r
-\r
-GSM_Error N6110_SetOperatorName (GSM_Network *operator)\r
-{\r
-  unsigned char req[256] = { 0x00,0x01,0x8b,0x00,\r
-                             0x00,0x00, /* MCC */\r
-                            0x00};     /* MNC */\r
-\r
-  GSM_Error error;\r
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  EncodeNetworkCode(req+4,operator->Code);\r
-\r
-  strncpy(req+7,operator->Name,200);\r
-    \r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSetOperatorNameError, 8+strlen(operator->Name), 0x40, req);\r
-}\r
-\r
-void N6110_ReplyGetMemoryStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x08:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Memory status received:\n"));\r
-\r
-    fprintf(stdout, _("   Memory Type: %s\n"), N6110_MemoryType_String[MessageBuffer[4]]);\r
-    fprintf(stdout, _("   Used: %d\n"), MessageBuffer[6]);\r
-    fprintf(stdout, _("   Free: %d\n"), MessageBuffer[5]);\r
-#endif /* DEBUG */\r
-\r
-    CurrentMemoryStatus->Used = MessageBuffer[6];\r
-    CurrentMemoryStatus->Free = MessageBuffer[5];\r
-    CurrentMemoryStatusError = GE_NONE;\r
-\r
-    break;\r
-\r
-  case 0x09:\r
-\r
-#ifdef DEBUG\r
-    switch (MessageBuffer[4]) {\r
-      case 0x6f:\r
-       fprintf(stdout, _("Message: Memory status error, phone is probably powered off.\n"));break;\r
-      case 0x7d:\r
-       fprintf(stdout, _("Message: Memory status error, memory type not supported by phone model.\n"));break;\r
-      case 0x8d:\r
-       fprintf(stdout, _("Message: Memory status error, waiting for security code.\n"));break;\r
-      default:\r
-       fprintf(stdout, _("Message: Unknown Memory status error, subtype (MessageBuffer[4]) = %02x\n"),MessageBuffer[4]);break;\r
-    }\r
-#endif\r
-\r
-    switch (MessageBuffer[4]) {\r
-      case 0x6f:CurrentMemoryStatusError = GE_TIMEOUT;break;\r
-      case 0x7d:CurrentMemoryStatusError = GE_INTERNALERROR;break;\r
-      case 0x8d:CurrentMemoryStatusError = GE_INVALIDSECURITYCODE;break;\r
-      default:break;\r
-    }\r
-\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-/* This function is used to get storage status from the phone. It currently\r
-   supports two different memory areas - internal and SIM. */\r
-GSM_Error N6110_GetMemoryStatus(GSM_MemoryStatus *Status)\r
-{\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x07, /* MemoryStatus request */\r
-                          0x00  /* MemoryType */\r
-                        };\r
-\r
-  GSM_Error error;\r
-  \r
-  CurrentMemoryStatus = Status;\r
-\r
-  req[4] = N6110_GetMemoryType(Status->MemoryType);\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentMemoryStatusError, 5, 0x03, req);\r
-\r
-  CurrentMemoryStatus = NULL;\r
-\r
-  return error;\r
-}\r
-\r
-void N6110_ReplyGetNetworkInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  GSM_NetworkInfo NullNetworkInfo;\r
-  \r
-  /* Make sure we are expecting NetworkInfo frame */\r
-  if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY) {\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Network informations:\n"));\r
-#endif\r
-  } else {\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Network informations not requested, but received:\n"));\r
-#endif\r
-  }\r
-      \r
-  sprintf(NullNetworkInfo.NetworkCode, "%x%x%x %x%x", MessageBuffer[14] & 0x0f, MessageBuffer[14] >>4, MessageBuffer[15] & 0x0f, MessageBuffer[16] & 0x0f, MessageBuffer[16] >>4);\r
-\r
-  sprintf(NullNetworkInfo.CellID, "%02x%02x", MessageBuffer[10], MessageBuffer[11]);\r
-\r
-  sprintf(NullNetworkInfo.LAC, "%02x%02x", MessageBuffer[12], MessageBuffer[13]);\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("   CellID: %s\n"), NullNetworkInfo.CellID);\r
-  fprintf(stdout, _("   LAC: %s\n"), NullNetworkInfo.LAC);\r
-  fprintf(stdout, _("   Network code: %s\n"), NullNetworkInfo.NetworkCode);\r
-  fprintf(stdout, _("   Network name: %s (%s)\n"),\r
-                     GSM_GetNetworkName(NullNetworkInfo.NetworkCode),\r
-                     GSM_GetCountryName(NullNetworkInfo.NetworkCode));\r
-  fprintf(stdout, _("   Status: "));\r
-\r
-  switch (MessageBuffer[8]) {\r
-    case 0x01: fprintf(stdout, _("home network selected")); break;\r
-    case 0x02: fprintf(stdout, _("roaming network")); break;\r
-    case 0x03: fprintf(stdout, _("requesting network")); break;\r
-    case 0x04: fprintf(stdout, _("not registered in the network")); break;\r
-    default: fprintf(stdout, _("unknown"));\r
-  }\r
-\r
-  fprintf(stdout, "\n");\r
-\r
-  fprintf(stdout, _("   Network selection: %s\n"), MessageBuffer[9]==1?_("manual"):_("automatic"));\r
-#endif /* DEBUG */\r
-\r
-  /* Make sure we are expecting NetworkInfo frame */\r
-  if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY)\r
-    *CurrentNetworkInfo=NullNetworkInfo;\r
-\r
-  CurrentNetworkInfoError = GE_NONE;      \r
-}\r
-\r
-GSM_Error N6110_GetNetworkInfo(GSM_NetworkInfo *NetworkInfo)\r
-{\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x70\r
-                        };\r
-\r
-  GSM_Error error;\r
-  \r
-  CurrentNetworkInfo = NetworkInfo;\r
-  \r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentNetworkInfoError, 4, 0x0a, req);\r
-\r
-  CurrentNetworkInfo = NULL;\r
-\r
-  return error;\r
-}\r
-\r
-void N6110_ReplyGetProductProfileSetting(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i;\r
-  \r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Product Profile Settings received -"));\r
-  for (i=0;i<4;i++) fprintf(stdout, _(" %02x"),MessageBuffer[3+i]);\r
-  fprintf(stdout, _("\n"));  \r
-#endif\r
-\r
-  for (i=0;i<4;i++) CurrentPPS[i]=MessageBuffer[3+i];\r
-\r
-  CurrentProductProfileSettingsError=GE_NONE;      \r
-}\r
-\r
-GSM_Error N6110_GetProductProfileSetting (GSM_PPS *PPS)\r
-{\r
-  unsigned char req[] = { 0x00, 0x01,0x6a };\r
-  \r
-  int i,j;\r
-\r
-  GSM_Error error;\r
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentProductProfileSettingsError, 3, 0x40, req);\r
-  if (error!=GE_NONE) return error;    \r
-  \r
-  switch (PPS->Name) {\r
-    case PPS_ALS      : PPS->bool_value=(CurrentPPS[1]&32); break;\r
-    case PPS_GamesMenu: PPS->bool_value=(CurrentPPS[3]&64); break;\r
-    case PPS_HRData   : PPS->bool_value=(CurrentPPS[0]&64); break;\r
-    case PPS_14400Data: PPS->bool_value=(CurrentPPS[0]&128);break;\r
-    case PPS_EFR      : PPS->int_value =(CurrentPPS[0]&1)    +(CurrentPPS[0]&2);    break;\r
-    case PPS_FR       : PPS->int_value =(CurrentPPS[0]&16)/16+(CurrentPPS[0]&32)/16;break;\r
-    case PPS_HR       : PPS->int_value =(CurrentPPS[0]&4)/4  +(CurrentPPS[0]&8)/4;  break;\r
-    case PPS_VibraMenu: PPS->bool_value=(CurrentPPS[4]&64); break;\r
-    case PPS_LCDContrast:\r
-         PPS->int_value=0;\r
-         j=1;\r
-         for (i=0;i<5;i++) {\r
-          if (CurrentPPS[3]&j) PPS->int_value=PPS->int_value+j;\r
-          j=j*2;\r
-        }\r
-        PPS->int_value=PPS->int_value*100/32;\r
-         break;\r
-\r
-  }\r
-  \r
-  return (GE_NONE);\r
-}\r
-\r
-void N6110_ReplySetProductProfileSetting(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  int i;\r
-  
-  fprintf(stdout, _("Message: Product Profile Settings set to"));\r
-  for (i=0;i<4;i++) fprintf(stdout, _(" %02x"),CurrentPPS[i]);\r
-  fprintf(stdout, _("\n"));  \r
-#endif\r
-     \r
-  CurrentProductProfileSettingsError=GE_NONE;     \r
-}\r
-\r
-GSM_Error N6110_SetProductProfileSetting (GSM_PPS *PPS)\r
-{\r
-  unsigned char req[] = { 0x00, 0x01,0x6b, \r
-                          0x00, 0x00, 0x00, 0x00 }; /* bytes with Product Profile Setings */\r
-  unsigned char settings[32];\r
-  \r
-  GSM_PPS OldPPS;\r
-  \r
-  int i,j,z;\r
-  \r
-  GSM_Error error;\r
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-  \r
-  OldPPS.Name=PPS_ALS;\r
-  error=N6110_GetProductProfileSetting(&OldPPS);\r
-  if (error!=GE_NONE) return error;\r
-  \r
-  j=128;z=0;\r
-  for (i=0;i<32;i++) {\r
-    if (CurrentPPS[z]&j)\r
-      settings[i]='1';\r
-    else\r
-      settings[i]='0';    \r
-    if (j==1) {\r
-      j=128;\r
-      z++;\r
-    } else j=j/2;\r
-  }\r
-  \r
-#ifdef DEBUG\r
-  fprintf(stdout,_("Current settings: "));\r
-  for (i=0;i<32;i++) {\r
-    fprintf(stdout,_("%c"),settings[i]);    \r
-  }\r
-  fprintf(stdout,_("\n"));\r
-#endif\r
-\r
-  switch (PPS->Name) {\r
-    case PPS_ALS      :settings[10]=PPS->bool_value?'1':'0';break;\r
-    case PPS_HRData   :settings[ 5]=PPS->bool_value?'1':'0';break;\r
-    case PPS_14400Data:settings[ 6]=PPS->bool_value?'1':'0';break;\r
-    default           :break;\r
-  }\r
-    \r
-  j=128;z=0;\r
-  for (i=0;i<32;i++) {\r
-    if (settings[i]=='1') req[z+3]=req[z+3]+j;\r
-    if (j==1) {\r
-      j=128;\r
-      z++;\r
-    } else j=j/2;\r
-  }  \r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout,_("Current settings: "));\r
-  for (i=0;i<4;i++) {\r
-    fprintf(stdout,_("%i "),req[i+3]);    \r
-  }\r
-  fprintf(stdout,_("\n"));\r
-#endif\r
-\r
-  for (i=0;i<4;i++) {\r
-   CurrentPPS[i]=req[i+3];    \r
-  }\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentProductProfileSettingsError, 7, 0x40, req);\r
-}\r
-\r
-void N6110_ReplyPressKey(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-    if (MessageBuffer[4]==CurrentPressKeyEvent) CurrentPressKeyError=GE_NONE;\r
-                                           else CurrentPressKeyError=GE_UNKNOWN; /* MessageBuffer[4] = 0x05 */\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Result of key "));\r
-    switch (MessageBuffer[4])\r
-    {\r
-      case PRESSPHONEKEY:   fprintf(stdout, _("press OK\n"));break;\r
-      case RELEASEPHONEKEY: fprintf(stdout, _("release OK\n"));break;\r
-      default:              fprintf(stdout, _("press or release - error\n"));break;\r
-    }\r
-#endif /* DEBUG */\r
-}\r
-\r
-GSM_Error N6110_PressKey(int key, int event)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x42, 0x01, 0x00, 0x01};\r
-  \r
-  req[4]=event; /* if we press or release key */\r
-  req[5]=key;\r
-  \r
-  CurrentPressKeyEvent=event;\r
-  \r
-  return NULL_SendMessageSequence\r
-    (10, &CurrentPressKeyError, 7, 0x0c, req);\r
-}\r
-\r
-void N6110_ReplyDisplayOutput(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  /* Hopefully is 64 larger as FB38_MAX* / N6110_MAX* */\r
-  char model[64];\r
-\r
-  int i, j;\r
-\r
-  char uni[100];\r
-    \r
-  switch(MessageBuffer[3]) {\r
-\r
-  /* Phone sends displayed texts */\r
-  case 0x50:\r
-    NewX=MessageBuffer[6];\r
-    NewY=MessageBuffer[5];\r
-\r
-    DecodeUnicode (uni, MessageBuffer+8, MessageBuffer[7]);\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("New displayed text (%i %i): \"%s\"\n"),NewX,NewY,uni);      \r
-#endif /* DEBUG */\r
-\r
-    while (N6110_GetModel(model)  != GE_NONE)\r
-      sleep(1);\r
-\r
-    /* With these rules it works almost excellent with my N5110 */\r
-    /* I don't have general rule :-(, that's why you must experiment */\r
-    /* with your phone. Nokia could make it better. MW */\r
-    /* It's almost OK for N5110*/\r
-    /* FIX ME: it will be the same for N5130 and 3210 too*/\r
-    if (!strcmp(model,"NSE-1"))\r
-    {\r
-      /* OldX==1000 means - it's first time */\r
-      if (OldX==1000) {\r
-      \r
-        /* Clean table */\r
-        for (i=0;i<5+1;i++) {\r
-          for (j=0;j<27+1;j++) {PhoneScreen[i][j]=' ';}\r
-      }\r
-      OldX=0;\r
-    }\r
-\r
-    if ((OldX==0 && OldY==31 && NewX==29 && NewY==46) ||\r
-        (OldX==0 && OldY==13 && NewX==23 && NewY==46)) {\r
-      /* Clean the line with current text */\r
-      for (j=0;j<27+1;j++) {PhoneScreen[NewY/(47/5)][j]=' ';}\r
-      \r
-      /* Inserts text into table */\r
-      for (i=0; i<MessageBuffer[7];i++) {      \r
-        PhoneScreen[NewY/(47/5)][NewX/(84/27)+i]=uni[i];\r
-      }\r
-\r
-    }\r
-\r
-    if ((OldX==0 && OldY==21 && NewX==0 && NewY==10) ||\r
-        (OldX==0 && OldY==10 && NewX==35 && NewY==46)) {\r
-    } else {\r
-      if ((OldX!=0 && NewX==0 && NewY!=6) ||\r
-          (OldX==0 && NewX!=0 && OldY!=13 && OldY!=22) ||\r
-          (OldX==0 && NewX==0 && NewY<OldY && (NewY!=13 || OldY!=26)) ||\r
-          (OldY==5 && NewY!=5) ||\r
-          (OldX==0 && OldY==13 && NewX==23 && NewY==46)) {\r
-\r
-        /* Writes "old" screen */\r
-        for (i=0;i<5+1;i++) {\r
-          for (j=0;j<27+1;j++) {fprintf(stdout,_("%c"),PhoneScreen[i][j]);}\r
-           fprintf(stdout,_("\n"));\r
-         }\r
-       \r
-         /* Clean table */\r
-          for (i=0;i<5+1;i++) {\r
-           for (j=0;j<27+1;j++) {PhoneScreen[i][j]=' ';}\r
-         }\r
-        }\r
-      }\r
-      \r
-      /* Clean the line with current text */\r
-      for (j=0;j<27+1;j++) {PhoneScreen[NewY/(47/5)][j]=' ';}\r
-      \r
-      /* Inserts text into table */\r
-      for (i=0; i<MessageBuffer[7];i++) {      \r
-        PhoneScreen[NewY/(47/5)][NewX/(84/27)+i]=uni[i];\r
-      }\r
-      \r
-      OldY=NewY;\r
-      OldX=NewX;\r
-    } else {\r
-#ifndef DEBUG\r
-      fprintf(stdout, _("%s\n"),uni);      \r
-#endif\r
-    }\r
-\r
-    break;\r
\r
-  case 0x54:\r
-      \r
-    if (MessageBuffer[4]==1)\r
-    {\r
-      \r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Display output successfully disabled/enabled.\n"));\r
-#endif /* DEBUG */\r
-\r
-      CurrentDisplayOutputError=GE_NONE;\r
-    }\r
-       \r
-    break;\r
-  }\r
-}\r
-\r
-GSM_Error SetDisplayOutput(unsigned char state)\r
-{\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x53, 0x00};\r
-\r
-  req[4]=state;\r
-  \r
-  return NULL_SendMessageSequence\r
-    (30, &CurrentDisplayOutputError, 5, 0x0d, req);\r
-}\r
-\r
-GSM_Error N6110_EnableDisplayOutput()\r
-{\r
-  return SetDisplayOutput(0x01);\r
-}\r
\r
-GSM_Error N6110_DisableDisplayOutput()\r
-{\r
-  return SetDisplayOutput(0x02);\r
-}\r
-\r
-/* If it is interesting for somebody: we can use 0x40 msg for it\r
-   and it will work for all phones. See n6110.txt for details */\r
-GSM_Error N6110_AnswerCall(char s)\r
-{\r
-       unsigned char req0[] = { N6110_FRAME_HEADER, 0x42,0x05,0x01,0x07,                                0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,\r
-                           0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80};\r
-       unsigned char req[] = { N6110_FRAME_HEADER, 0x06, 0x00, 0x00};\r
-\r
-       req[4]=s;\r
-\r
-#ifdef DEBUG\r
-       fprintf(stdout,_("Answering call %d\n\r"),s);\r
-#endif\r
-\r
-       Protocol->SendMessage(sizeof(req0), 0x01, req0);\r
-       sleep(1);\r
-\r
-       return NULL_SendMessageSequence\r
-               (20, &CurrentMagicError, sizeof(req) , 0x01, req);\r
-}\r
-\r
-void N6110_ReplyGetProfile(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  /* Profile feature */\r
-  case 0x14:   \r
-\r
-    switch(GetModelFeature (FN_PROFILES)) {\r
-      case F_PROF33:\r
-        switch (MessageBuffer[6]) {\r
-          case 0x00: CurrentProfile->KeypadTone  = MessageBuffer[8]; break;\r
-          case 0x01: CurrentProfile->CallAlert   = MessageBuffer[8]; break;\r
-          case 0x02: CurrentProfile->Ringtone    = MessageBuffer[8]; break;\r
-          case 0x03: CurrentProfile->Volume      = MessageBuffer[8]; break;\r
-          case 0x04: CurrentProfile->MessageTone = MessageBuffer[8]; break;\r
-          case 0x05: CurrentProfile->Vibration   = MessageBuffer[8]; break;\r
-          case 0x06: CurrentProfile->WarningTone = MessageBuffer[8]; break;\r
-          case 0x07: CurrentProfile->ScreenSaver = MessageBuffer[8]; break;      \r
-          default:\r
-#ifdef DEBUG\r
-           fprintf(stdout,_("feature %i = value %i\n\n"),MessageBuffer[6],MessageBuffer[8]);\r
-#endif\r
-            break;\r
-        }\r
-        break;\r
-      default:\r
-        switch (MessageBuffer[6]) {\r
-          case 0x00: CurrentProfile->KeypadTone      = MessageBuffer[8];break;\r
-          case 0x01: CurrentProfile->Lights          = MessageBuffer[8];break;\r
-          case 0x02: CurrentProfile->CallAlert       = MessageBuffer[8];break;\r
-          case 0x03: CurrentProfile->Ringtone        = MessageBuffer[8];break;\r
-          case 0x04: CurrentProfile->Volume          = MessageBuffer[8];break;\r
-          case 0x05: CurrentProfile->MessageTone     = MessageBuffer[8];break;\r
-          case 0x06: CurrentProfile->Vibration       = MessageBuffer[8];break;\r
-          case 0x07: CurrentProfile->WarningTone     = MessageBuffer[8];break;\r
-          case 0x08: CurrentProfile->CallerGroups    = MessageBuffer[8];break;\r
-          case 0x09: CurrentProfile->AutomaticAnswer = MessageBuffer[8];break;\r
-          default:\r
-#ifdef DEBUG\r
-           fprintf(stdout,_("feature %i = value %i\n\n"),MessageBuffer[6],MessageBuffer[8]);\r
-#endif\r
-            break;\r
-        }\r
-        break;\r
-    }\r
-\r
-    CurrentProfileError = GE_NONE;\r
-    break;\r
-\r
-  /* Incoming profile name */\r
-  case 0x1b:   \r
-\r
-    if (MessageBuffer[9] == 0x00) {\r
-      CurrentProfile->DefaultName=MessageBuffer[8];\r
-    } else {\r
-      CurrentProfile->DefaultName=-1;      \r
-       \r
-      /* Here name is in Unicode */\r
-      if (GetModelFeature (FN_PROFILES)==F_PROF33) {\r
-       DecodeUnicode (CurrentProfile->Name, MessageBuffer+10, MessageBuffer[9]/2);\r
-      } else {\r
-        /* ...here not */\r
-        sprintf(CurrentProfile->Name, MessageBuffer + 10, MessageBuffer[9]);\r
-        CurrentProfile->Name[MessageBuffer[9]] = '\0';\r
-      }\r
-    }\r
-\r
-    CurrentProfileError = GE_NONE;\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-/* Needs SIM card with PIN in phone */\r
-GSM_Error N6110_GetProfile(GSM_Profile *Profile)\r
-{\r
-  int i;\r
-  \r
-  unsigned char name_req[] = { N6110_FRAME_HEADER, 0x1a, 0x00};\r
-  unsigned char feat_req[] = { N6110_FRAME_HEADER, 0x13, 0x01, 0x00, 0x00};\r
-\r
-  GSM_Error error;\r
-  \r
-  CurrentProfile = Profile;\r
-\r
-  /* When after sending all frames feature==253, it means, that it is not\r
-     supported */\r
-  CurrentProfile->KeypadTone=253;\r
-  CurrentProfile->Lights=253;    \r
-  CurrentProfile->CallAlert=253; \r
-  CurrentProfile->Ringtone=253;  \r
-  CurrentProfile->Volume=253;    \r
-  CurrentProfile->MessageTone=253;\r
-  CurrentProfile->WarningTone=253;\r
-  CurrentProfile->Vibration=253;  \r
-  CurrentProfile->CallerGroups=253;\r
-  CurrentProfile->ScreenSaver=253; \r
-  CurrentProfile->AutomaticAnswer=253;\r
-\r
-  name_req[4] = Profile->Number;\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentProfileError, 5, 0x05, name_req);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  for (i = 0x00; i <= 0x09; i++) {\r
-\r
-    feat_req[5] = Profile->Number;\r
-    \r
-    feat_req[6] = i;\r
-\r
-    error=NULL_SendMessageSequence\r
-      (20, &CurrentProfileError, 7, 0x05, feat_req);\r
-    if (error!=GE_NONE) return error;\r
-  }\r
-\r
-  if (Profile->DefaultName > -1)\r
-  {\r
-    switch(GetModelFeature (FN_PROFILES)) {\r
-      case F_PROF33:\r
-        switch (Profile->DefaultName) {\r
-          case 0x00: sprintf(Profile->Name, "General");break;\r
-          case 0x01: sprintf(Profile->Name, "Silent");break;\r
-          case 0x02: sprintf(Profile->Name, "Descreet");break;\r
-          case 0x03: sprintf(Profile->Name, "Loud");break;\r
-          case 0x04: sprintf(Profile->Name, "My style");break;\r
-          case 0x05: Profile->Name[0]=0;break;\r
-          default  : sprintf(Profile->Name, "Unknown (%i)", Profile->DefaultName);break;\r
-       }\r
-        break;\r
-      case F_PROF51:\r
-        switch (Profile->DefaultName) {\r
-          case 0x00: sprintf(Profile->Name, "Personal");break;\r
-          case 0x01: sprintf(Profile->Name, "Car");break;\r
-          case 0x02: sprintf(Profile->Name, "Headset");break;\r
-          default  : sprintf(Profile->Name, "Unknown (%i)", Profile->DefaultName);break;\r
-        }\r
-        break;\r
-      case F_PROF61:\r
-        switch (Profile->DefaultName) {\r
-          case 0x00: sprintf(Profile->Name, "General");break;\r
-          case 0x01: sprintf(Profile->Name, "Silent");break;\r
-          case 0x02: sprintf(Profile->Name, "Meeting");break;\r
-          case 0x03: sprintf(Profile->Name, "Outdoor");break;\r
-          case 0x04: sprintf(Profile->Name, "Pager");break;\r
-          case 0x05: sprintf(Profile->Name, "Car");break;\r
-          case 0x06: sprintf(Profile->Name, "Headset");break;\r
-          default  : sprintf(Profile->Name, "Unknown (%i)", Profile->DefaultName);break;\r
-       }\r
-        break;\r
-    }\r
-  }\r
-  \r
-  return (GE_NONE);\r
-\r
-}\r
-\r
-void N6110_ReplySetProfile(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  /* Profile feature change result */\r
-  case 0x11:   \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Profile feature change result.\n"));\r
-#endif /* DEBUG */\r
-    CurrentProfileError = GE_NONE;\r
-    break;\r
-\r
-  /* Profile name set result */\r
-  case 0x1d:   \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Profile name change result.\n"));\r
-#endif /* DEBUG */\r
-    CurrentProfileError = GE_NONE;\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-GSM_Error N6110_SetProfileFeature(u8 profile, u8 feature, u8 value)\r
-{\r
-  unsigned char feat_req[] = { N6110_FRAME_HEADER, 0x10, 0x01,\r
-                               0x00, 0x00, 0x00};\r
-\r
-  feat_req[5]=profile;\r
-  feat_req[6]=feature;\r
-  feat_req[7]=value;\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentProfileError, 8, 0x05, feat_req);\r
-}\r
-\r
-GSM_Error N6110_SetProfile(GSM_Profile *Profile)\r
-{\r
-  int i,value;\r
-\r
-  unsigned char name_req[40] = { N6110_FRAME_HEADER, 0x1c, 0x01, 0x03,\r
-                                 0x00, 0x00, 0x00};\r
-\r
-  GSM_Error error;\r
-  \r
-  name_req[7] = Profile->Number;\r
-  name_req[8] = strlen(Profile->Name);\r
-  name_req[6] = name_req[8] + 2;\r
-\r
-  for (i = 0; i < name_req[8]; i++)\r
-    name_req[9 + i] = Profile->Name[i];\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentProfileError, name_req[8] + 9, 0x05, name_req);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  for (i = 0x00; i <= 0x09; i++) {\r
-\r
-    switch (i) {\r
-      case 0x00: value = Profile->KeypadTone; break;\r
-      case 0x01: value = Profile->Lights; break;\r
-      case 0x02: value = Profile->CallAlert; break;\r
-      case 0x03: value = Profile->Ringtone; break;\r
-      case 0x04: value = Profile->Volume; break;\r
-      case 0x05: value = Profile->MessageTone; break;\r
-      case 0x06: value = Profile->Vibration; break;\r
-      case 0x07: value = Profile->WarningTone; break;\r
-      case 0x08: value = Profile->CallerGroups; break;\r
-      case 0x09: value = Profile->AutomaticAnswer; break;\r
-      default  : value = 0; break;
-    }\r
-\r
-    error=N6110_SetProfileFeature(Profile->Number,i,value);\r
-    if (error!=GE_NONE) return error;\r
-  }\r
-\r
-  return (GE_NONE);\r
-}\r
-\r
-bool N6110_SendRLPFrame(RLP_F96Frame *frame, bool out_dtx)\r
-{\r
-  u8 req[60] = { 0x00, 0xd9 };\r
-               \r
-  /* Discontinuos transmission (DTX).  See section 5.6 of GSM 04.22 version\r
-     7.0.1. */\r
-       \r
-  if (out_dtx)\r
-    req[1]=0x01;\r
-\r
-  memcpy(req+2, (u8 *) frame, 32);\r
-\r
-  return (Protocol->SendFrame(32, 0xf0, req));\r
-}\r
-\r
-void N6110_ReplyGetCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i, j;\r
-\r
-  u8 mychar1;\r
-\r
-  wchar_t wc;  \r
-    \r
-  switch (MessageBuffer[4]) {\r
-\r
-    case 0x01:\r
-      \r
-      CurrentCalendarNote->Type=MessageBuffer[8];\r
-\r
-      DecodeDateTime(MessageBuffer+9, &CurrentCalendarNote->Time);\r
-\r
-      DecodeDateTime(MessageBuffer+16, &CurrentCalendarNote->Alarm);\r
-\r
-      CurrentCalendarNote->Text[0]=0;\r
-      \r
-      if (GetModelFeature (FN_CALENDAR)==F_CAL33) {\r
-        i=0;\r
-        if (CurrentCalendarNote->Type == GCN_REMINDER) i=1; //first char is subset\r
-        switch (MessageBuffer[24]) {\r
-          case 3:\r
-#ifdef DEBUG\r
-            fprintf(stdout,_("Subset 3 in reminder note !\n"));\r
-#endif\r
-            while (i!=MessageBuffer[23]) {\r
-              j=0;\r
-              if (i!=MessageBuffer[23]-1) {\r
-               if (MessageBuffer[24+i]>=0xc2) {\r
-                 DecodeWithUTF8Alphabet(MessageBuffer[24+i], MessageBuffer[24+i+1], &mychar1);\r
-                  CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)+1]=0;\r
-                  CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)]=mychar1;\r
-                 j=-1;\r
-                 i++;\r
-               }\r
-             }\r
-              if (j!=-1) {\r
-                CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)+1]=0;\r
-                CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)]=MessageBuffer[24+i];\r
-              }\r
-             i++;\r
-            }\r
-            break;\r
-          case 2:\r
-#ifdef DEBUG\r
-            fprintf(stdout,_("Subset 2 in reminder note !\n"));\r
-#endif\r
-            while (i!=MessageBuffer[23]) {\r
-             wc = MessageBuffer[24+i] | (0x00 << 8);\r
-              CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)+1]=0;\r
-              CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)]=\r
-                     DecodeWithUnicodeAlphabet(wc);\r
-             i++;\r
-            }\r
-            break;\r
-          case 1:\r
-#ifdef DEBUG\r
-            fprintf(stdout,_("Subset 1 in reminder note !\n"));\r
-#endif\r
-            memcpy(CurrentCalendarNote->Text,MessageBuffer+24+i,MessageBuffer[23]-i);\r
-            CurrentCalendarNote->Text[MessageBuffer[23]-i]=0;\r
-            break;\r
-          default:\r
-#ifdef DEBUG\r
-            fprintf(stdout,_("Unknown subset in reminder note !\n"));\r
-#endif\r
-            memcpy(CurrentCalendarNote->Text,MessageBuffer+24+i,MessageBuffer[23]-i);\r
-            CurrentCalendarNote->Text[MessageBuffer[23]-i]=0;\r
-            break;\r
-        }\r
-      } else {\r
-        memcpy(CurrentCalendarNote->Text,MessageBuffer+24,MessageBuffer[23]);\r
-        CurrentCalendarNote->Text[MessageBuffer[23]]=0;\r
-      }\r
-      \r
-      if (CurrentCalendarNote->Type == GCN_CALL) {\r
-        memcpy(CurrentCalendarNote->Phone,MessageBuffer+24+MessageBuffer[23]+1,MessageBuffer[24+MessageBuffer[23]]);\r
-        CurrentCalendarNote->Phone[MessageBuffer[24+MessageBuffer[23]]]=0;\r
-      }\r
-\r
-      CurrentCalendarNote->Recurrance=0;\r
-\r
-      CurrentCalendarNote->AlarmType=0;\r
-\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Calendar note received.\n"));\r
-\r
-      fprintf(stdout, _("   Date: %d-%02d-%02d\n"), CurrentCalendarNote->Time.Year,\r
-                                           CurrentCalendarNote->Time.Month,\r
-                                           CurrentCalendarNote->Time.Day);\r
-\r
-      fprintf(stdout, _("   Time: %02d:%02d:%02d\n"), CurrentCalendarNote->Time.Hour,\r
-                                           CurrentCalendarNote->Time.Minute,\r
-                                           CurrentCalendarNote->Time.Second);\r
-\r
-      /* Some messages do not have alarm set up */\r
-      if (CurrentCalendarNote->Alarm.Year != 0) {\r
-        fprintf(stdout, _("   Alarm date: %d-%02d-%02d\n"), CurrentCalendarNote->Alarm.Year,\r
-                                                CurrentCalendarNote->Alarm.Month,\r
-                                                CurrentCalendarNote->Alarm.Day);\r
-\r
-       fprintf(stdout, _("   Alarm time: %02d:%02d:%02d\n"), CurrentCalendarNote->Alarm.Hour,\r
-                                                CurrentCalendarNote->Alarm.Minute,\r
-                                                 CurrentCalendarNote->Alarm.Second);\r
-      }\r
-\r
-      fprintf(stdout, _("   Type: %d\n"), CurrentCalendarNote->Type);\r
-      fprintf(stdout, _("   Text: %s\n"), CurrentCalendarNote->Text);\r
-\r
-      if (CurrentCalendarNote->Type == GCN_CALL)\r
-        fprintf(stdout, _("   Phone: %s\n"), CurrentCalendarNote->Phone);\r
-#endif /* DEBUG */\r
-\r
-      CurrentCalendarNoteError=GE_NONE;\r
-      break;\r
-\r
-    case 0x93:\r
-\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Calendar note not available\n"));\r
-#endif /* DEBUG */\r
-\r
-      CurrentCalendarNoteError=GE_INVALIDCALNOTELOCATION;\r
-      break;\r
-\r
-    default:\r
-\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Calendar note error\n"));\r
-#endif /* DEBUG */\r
-\r
-      CurrentCalendarNoteError=GE_INTERNALERROR;\r
-      break;\r
-\r
-  }\r
-}\r
-\r
-GSM_Error N6110_GetCalendarNote(GSM_CalendarNote *CalendarNote)\r
-{\r
-\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x66, 0x00\r
-                        };\r
-  GSM_Error error;\r
-\r
-  req[4]=CalendarNote->Location;\r
-\r
-  CurrentCalendarNote = CalendarNote;\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentCalendarNoteError, 5, 0x13, req);\r
-\r
-  CurrentCalendarNote = NULL;\r
-\r
-  return error;\r
-}\r
-\r
-void N6110_ReplyWriteCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  switch(MessageBuffer[4]) {\r
-    /* This message is also sent when the user enters the new entry on keypad */\r
-    case 0x01:\r
-      fprintf(stdout, _("Message: Calendar note write succesfull!\n"));break;      \r
-    case 0x73:\r
-      fprintf(stdout, _("Message: Calendar note write failed!\n"));break;\r
-    case 0x7d:\r
-      fprintf(stdout, _("Message: Calendar note write failed!\n"));break;\r
-    default:\r
-      fprintf(stdout, _("Unknown message of type 0x13 and subtype 0x65\n"));break;\r
-  }\r
-#endif\r
-\r
-  switch(MessageBuffer[4]) {\r
-    case 0x01: CurrentCalendarNoteError=GE_NONE; break;      \r
-    case 0x73: CurrentCalendarNoteError=GE_INTERNALERROR; break;\r
-    case 0x7d: CurrentCalendarNoteError=GE_INTERNALERROR; break;\r
-    default  : AppendLogText("Unknown msg\n",false); break;\r
-  }\r
-}\r
-\r
-GSM_Error N6110_WriteCalendarNote(GSM_CalendarNote *CalendarNote)\r
-{\r
-\r
-  unsigned char req[200] = { N6110_FRAME_HEADER,\r
-                             0x64, 0x01, 0x10,\r
-                             0x00, /* Length of the rest of the frame. */\r
-                             0x00, /* The type of calendar note */\r
-                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
-                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
-                        };\r
-\r
-  typedef struct {\r
-    char *model;\r
-    unsigned char call;\r
-    unsigned char meeting;\r
-    unsigned char birthday;\r
-    unsigned char reminder;\r
-  } calendar_model_length;\r
-  \r
-  /* Length of entries */\r
-  calendar_model_length calendar_lengths[] =\r
-  {\r
-    /*model,CallTo,Meeting,Birthday,Reminder*/\r
-    {"NHM-5",0x24,0x24,0x24,0x24}, //Reminder from phone, other quesses\r
-    {"NHM-6",0x24,0x24,0x24,0x24}, //Reminder from phone, other quesses\r
-    {"NSE-3",0x1e,0x14,0x14,0x1e}, //from NCDS3 [HKEY_LOCAL_MACHINE\Software\Nokia\Data Suite\3.0\Calendar]\r
-    {"NSM-1",0x1e,0x18,0x18,0x24}, //from NCDS3 \r
-    {"NSK-3",0x1e,0x14,0x14,0x1e}, //from NCDS3 \r
-    {"NSB-3",0x20,0x14,0x14,0x1e}, //from NCDS3\r
-    {"",     0,   0,   0,   0   }  //end of table\r
-  };\r
-\r
-  int i, j, current;\r
-\r
-  u8 mychar;\r
-  
-  u8 mychar1,mychar2;
-  \r
-  GSM_Error error;\r
-  \r
-  /* Hopefully is 64 larger as FB38_MAX* / N6110_MAX* */\r
-  char model[64];\r
-\r
-  req[7]=CalendarNote->Type;\r
-\r
-  EncodeDateTime(req+8, &CalendarNote->Time);\r
-  req[14] = CalendarNote->Time.Timezone;\r
-\r
-  if (CalendarNote->Alarm.Year) {\r
-    EncodeDateTime(req+15, &CalendarNote->Alarm);\r
-    req[21] = CalendarNote->Alarm.Timezone;\r
-  }\r
-\r
-  req[22]=strlen(CalendarNote->Text);\r
-  \r
-  current=23;\r
-\r
-  if (GetModelFeature (FN_CALENDAR)==F_CAL33 && CalendarNote->Type==GCN_REMINDER) {\r
-    req[22]++;           // one additional char\r
-    req[current++]=0x01; //we use now subset 1\r
-  }\r
-    \r
-  for (i=0; i<strlen(CalendarNote->Text); i++) {\r
-    j=0;\r
-    mychar=CalendarNote->Text[i];\r
-    if (GetModelFeature (FN_CALENDAR)==F_CAL33 && CalendarNote->Type==GCN_REMINDER) {\r
-      if (EncodeWithUTF8Alphabet(mychar,&mychar1,&mychar2)) {
-          req[current++]=mychar1;\r
-         req[current++]=mychar2;\r
-          req[23]=0x03; //use subset 3\r
-          req[22]++;    // one additional char\r
-         j=-1;\r
-      }
-    }\r
-    if (j!=-1) {\r
-      /* Enables/disables blinking */\r
-      if (mychar=='~') req[current++]=0x01;\r
-                  else req[current++]=mychar;\r
-    }\r
-  }\r
-\r
-  req[current++]=strlen(CalendarNote->Phone);\r
-\r
-  for (i=0; i<strlen(CalendarNote->Phone); i++)\r
-    req[current++]=CalendarNote->Phone[i];\r
-\r
-  while (N6110_GetModel(model)  != GE_NONE)\r
-    sleep(1);\r
-\r
-  /* Checking maximal length */\r
-  i=0;\r
-  while (strcmp(calendar_lengths[i].model,"")) {\r
-    if (!strcmp(calendar_lengths[i].model,model)) {\r
-      switch (CalendarNote->Type) {\r
-        case GCN_REMINDER:if (req[22]>calendar_lengths[i].reminder) return GE_TOOLONG;break;\r
-        case GCN_MEETING :if (req[22]>calendar_lengths[i].meeting)  return GE_TOOLONG;break;\r
-        case GCN_BIRTHDAY:if (req[22]>calendar_lengths[i].birthday) return GE_TOOLONG;break;\r
-        case GCN_CALL    :if (strlen(CalendarNote->Phone)>calendar_lengths[i].call) return GE_TOOLONG;break;\r
-      }\r
-      break;\r
-    }\r
-    i++;\r
-  }\r
-\r
-  CurrentCalendarNote = CalendarNote;\r
-\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentCalendarNoteError, current, 0x13, req);\r
-\r
-  CurrentCalendarNote = NULL;\r
-\r
-  return error;\r
-}\r
-\r
-void N6110_ReplyDeleteCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  switch (MessageBuffer[4]) {\r
-    /* This message is also sent when the user deletes an old entry on\r
-       keypad or moves an old entry somewhere (there is also `write'\r
-       message). */\r
-    case 0x01:fprintf(stdout, _("Message: Calendar note deleted\n"));break;\r
-    case 0x93:fprintf(stdout, _("Message: Calendar note can't be deleted\n"));break;\r
-    default  :fprintf(stdout, _("Message: Calendar note deleting error\n"));break;\r
-  }\r
-#endif\r
-\r
-  switch (MessageBuffer[4]) {\r
-    case 0x01:CurrentCalendarNoteError=GE_NONE;break;\r
-    case 0x93:CurrentCalendarNoteError=GE_INVALIDCALNOTELOCATION;break;\r
-    default  :CurrentCalendarNoteError=GE_INTERNALERROR;break;\r
-  }\r
-}\r
-\r
-GSM_Error N6110_DeleteCalendarNote(GSM_CalendarNote *CalendarNote)\r
-{\r
-\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x68, 0x00\r
-                        };\r
-\r
-  req[4]=CalendarNote->Location;\r
-\r
-  return NULL_SendMessageSequence (20, &CurrentCalendarNoteError, 5, 0x13, req);\r
-}\r
-\r
-void N6110_ReplyRFBatteryLevel(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Phone status received:\n"));\r
-    fprintf(stdout, _("   Mode: "));\r
-\r
-    switch (MessageBuffer[4]) {\r
-\r
-      case 0x01:\r
-\r
-       fprintf(stdout, _("registered within the network\n"));\r
-       break;\r
-             \r
-      /* I was really amazing why is there a hole in the type of 0x02, now I\r
-        know... */\r
-      case 0x02: fprintf(stdout, _("call in progress\n"));          break; /* ringing or already answered call */\r
-      case 0x03: fprintf(stdout, _("waiting for security code\n")); break;\r
-      case 0x04: fprintf(stdout, _("powered off\n"));               break;\r
-      default  : fprintf(stdout, _("unknown\n"));\r
-\r
-    }\r
-\r
-    fprintf(stdout, _("   Power source: "));\r
-\r
-    switch (MessageBuffer[7]) {\r
-\r
-      case 0x01: fprintf(stdout, _("AC/DC\n"));   break;\r
-      case 0x02: fprintf(stdout, _("battery\n")); break;\r
-      default  : fprintf(stdout, _("unknown\n"));\r
-\r
-    }\r
-\r
-    fprintf(stdout, _("   Battery Level: %d\n"), MessageBuffer[8]);\r
-    fprintf(stdout, _("   Signal strength: %d\n"), MessageBuffer[5]);\r
-#endif /* DEBUG */\r
-\r
-    CurrentRFLevel=MessageBuffer[5];\r
-    CurrentBatteryLevel=MessageBuffer[8];\r
-    CurrentPowerSource=MessageBuffer[7];\r
-}\r
-\r
-\r
-GSM_Error N6110_GetRFLevel(GSM_RFUnits *units, float *level)\r
-{\r
-\r
-  /* FIXME - these values are from 3810 code, may be incorrect.  Map from\r
-     values returned in status packet to the the values returned by the AT+CSQ\r
-     command. */\r
-  float        csq_map[5] = {0, 8, 16, 24, 31};\r
-\r
-  int timeout=10;\r
-  int rf_level;\r
-  \r
-  char screen[NM_MAX_SCREEN_WIDTH];\r
-\r
-  CurrentRFLevel=-1;\r
-    \r
-  if (GetModelFeature (FN_NOPOWERFRAME)==F_NOPOWER) {\r
-\r
-    if (N6110_NetMonitor(1, screen)!=GE_NONE)\r
-      return GE_INTERNALERROR;\r
-    \r
-    rf_level=4;\r
-    \r
-    if (screen[4]!='-') {\r
-      if (screen[5]=='9' && screen[6]>'4') rf_level=1;\r
-      if (screen[5]=='9' && screen[6]<'5') rf_level=2;\r
-      if (screen[5]=='8' && screen[6]>'4') rf_level=3;      \r
-    } else rf_level=0;\r
-\r
-    /* Arbitrary units. */\r
-    if (*units == GRF_Arbitrary) {\r
-      *level = rf_level;\r
-      return (GE_NONE);\r
-    }\r
-    \r
-  } else {\r
-    N6110_SendStatusRequest();\r
-\r
-    /* Wait for timeout or other error. */\r
-    while (timeout != 0 && CurrentRFLevel == -1 ) {\r
-\r
-      if (--timeout == 0)\r
-        return (GE_TIMEOUT);\r
-\r
-      usleep (100000);\r
-    }\r
-\r
-    /* Make copy in case it changes. */\r
-    rf_level = CurrentRFLevel;\r
-\r
-    if (rf_level == -1)\r
-      return (GE_NOLINK);\r
-\r
-    /* Now convert between the different units we support. */\r
-\r
-    /* Arbitrary units. */\r
-    if (*units == GRF_Arbitrary) {\r
-      *level = rf_level;\r
-      return (GE_NONE);\r
-    }\r
-\r
-    /* CSQ units. */\r
-    if (*units == GRF_CSQ) {\r
-\r
-      if (rf_level <=4)\r
-        *level = csq_map[rf_level];\r
-      else\r
-        *level = 99; /* Unknown/undefined */\r
-\r
-      return (GE_NONE);\r
-    }\r
-  }\r
-\r
-  /* Unit type is one we don't handle so return error */\r
-  return (GE_INTERNALERROR);\r
-}\r
-\r
-\r
-GSM_Error N6110_GetBatteryLevel(GSM_BatteryUnits *units, float *level)\r
-{\r
-\r  int timeout=10;\r
-  int batt_level;\r
-\r
-  char screen[NM_MAX_SCREEN_WIDTH];\r
-\r
-  CurrentBatteryLevel=-1;\r
-\r
-  if (GetModelFeature (FN_NOPOWERFRAME)==F_NOPOWER) {\r
-\r
-    if (N6110_NetMonitor(23, screen)!=GE_NONE)\r
-      return GE_NOLINK;\r
-    \r
-    batt_level=4;\r
-    \r
-    if (screen[29]=='7') batt_level=3;\r
-    if (screen[29]=='5') batt_level=2;\r
-    if (screen[29]=='2') batt_level=1;\r
-    \r
-    /* Only units we handle at present are GBU_Arbitrary */\r
-    if (*units == GBU_Arbitrary) {\r
-      *level = batt_level;\r
-      return (GE_NONE);\r
-    }\r
-\r
-    return (GE_INTERNALERROR);    \r
-    \r
-  } else {\r
-    N6110_SendStatusRequest();\r
-\r
-    /* Wait for timeout or other error. */\r
-    while (timeout != 0 && CurrentBatteryLevel == -1 ) {\r
-\r
-      if (--timeout == 0)\r
-        return (GE_TIMEOUT);\r
-\r
-      usleep (100000);\r
-    }\r
-\r
-    /* Take copy in case it changes. */\r
-    batt_level = CurrentBatteryLevel;\r
-\r
-    if (batt_level != -1) {\r
-\r
-      /* Only units we handle at present are GBU_Arbitrary */\r
-      if (*units == GBU_Arbitrary) {\r
-        *level = batt_level;\r
-        return (GE_NONE);\r
-      }\r
-\r
-      return (GE_INTERNALERROR);\r
-    }\r
-    else\r
-      return (GE_NOLINK);\r
-  }\r
-}\r
-\r
-GSM_Error N6110_GetPowerSource(GSM_PowerSource *source)\r
-{\r
-\r
-  int timeout=10;\r
-\r
-  char screen[NM_MAX_SCREEN_WIDTH];\r
-\r
-  CurrentPowerSource=-1;\r
-\r
-  if (GetModelFeature (FN_NOPOWERFRAME)==F_NOPOWER) {    \r
-\r
-    if (N6110_NetMonitor(20, screen)!=GE_NONE)\r
-      return GE_NOLINK;\r
-    \r
-    CurrentPowerSource=GPS_ACDC;\r
-\r
-    if (screen[6]=='x') CurrentPowerSource=GPS_BATTERY;\r
-\r
-    *source=CurrentPowerSource;        \r
-    \r
-    return GE_NONE;    \r
-  } else {\r
-    N6110_SendStatusRequest();\r
-\r
-    /* Wait for timeout or other error. */\r
-    while (timeout != 0 && CurrentPowerSource == -1 ) {\r
-\r
-      if (--timeout == 0)\r
-        return (GE_TIMEOUT);\r
-\r
-      usleep (100000);\r
-    }\r
-\r
-    if (CurrentPowerSource != -1) {\r
-      *source=CurrentPowerSource;\r
-      return (GE_NONE);\r
-    }\r
-    else\r
-      return (GE_NOLINK);\r
-  }\r
-}\r
-\r
-void N6110_ReplyGetDisplayStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i;\r
-\r
-  for (i=0; i<MessageBuffer[4];i++)\r
-    if (MessageBuffer[2*i+6]==2)\r
-      CurrentDisplayStatus|=1<<(MessageBuffer[2*i+5]-1);\r
-    else\r
-      CurrentDisplayStatus&= (0xff - (1<<(MessageBuffer[2*i+5]-1)));\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Call in progress: %s\n"), CurrentDisplayStatus & (1<<DS_Call_In_Progress)?"on":"off");\r
-  fprintf(stdout, _("Unknown: %s\n"),          CurrentDisplayStatus & (1<<DS_Unknown)?"on":"off");\r
-  fprintf(stdout, _("Unread SMS: %s\n"),       CurrentDisplayStatus & (1<<DS_Unread_SMS)?"on":"off");\r
-  fprintf(stdout, _("Voice call: %s\n"),       CurrentDisplayStatus & (1<<DS_Voice_Call)?"on":"off");\r
-  fprintf(stdout, _("Fax call active: %s\n"),  CurrentDisplayStatus & (1<<DS_Fax_Call)?"on":"off");\r
-  fprintf(stdout, _("Data call active: %s\n"), CurrentDisplayStatus & (1<<DS_Data_Call)?"on":"off");\r
-  fprintf(stdout, _("Keyboard lock: %s\n"),    CurrentDisplayStatus & (1<<DS_Keyboard_Lock)?"on":"off");\r
-  fprintf(stdout, _("SMS storage full: %s\n"), CurrentDisplayStatus & (1<<DS_SMS_Storage_Full)?"on":"off");\r
-#endif /* DEBUG */\r
-\r
-  CurrentDisplayStatusError=GE_NONE;\r
-}\r
-\r
-GSM_Error N6110_GetDisplayStatus(int *Status) {\r
-\r
-  unsigned char req[4]={ N6110_FRAME_HEADER, 0x51 };\r
-\r
-  GSM_Error error;\r
-\r
-  error=NULL_SendMessageSequence\r
-    (10, &CurrentDisplayStatusError, 4, 0x0d, req);\r
-  if (error!=GE_NONE) return error;\r
-  \r
-  *Status=CurrentDisplayStatus;\r
-\r
-  return GE_NONE;\r
-}\r
-\r
-GSM_Error N6110_DialVoice(char *Number) {\r
-/* This commented sequence doesn't work on N3210/3310/6210/7110 */\r
-//  unsigned char req[64]={N6110_FRAME_HEADER, 0x01};\r
-//  unsigned char req_end[]={0x05, 0x01, 0x01, 0x05, 0x81, 0x01, 0x00, 0x00, 0x01};\r
-//  int i=0;\r
-//  req[4]=strlen(Number);\r
-//  for(i=0; i < strlen(Number) ; i++)\r
-//   req[5+i]=Number[i];\r
-//  memcpy(req+5+strlen(Number), req_end, 10);\r
-//  return NULL_SendMessageSequence\r
-//    (20, &CurrentDialVoiceError, 13+strlen(Number), 0x01, req);\r
-\r
-  unsigned char req[64]={0x00,0x01,0x7c,\r
-                         0x01}; //call command\r
-\r
-  int i=0;                      \r
-  \r
-  GSM_Error error;\r
-\r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  for(i=0; i < strlen(Number) ; i++) req[4+i]=Number[i];\r
-  \r
-  req[4+i+1]=0;\r
-  \r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentDialVoiceError, 4+strlen(Number)+1, 0x40, req);  \r
-}\r
-\r
-/* Dial a data call - type specifies request to use: \r
-     type 0 should normally be used\r
-     type 1 should be used when calling a digital line - corresponds to ats35=0\r
-     Maybe one day we'll know what they mean!\r
-*/\r
-GSM_Error N6110_DialData(char *Number, char type, void (* callpassup)(char c))
+#ifndef UCLINUX
+
+GSM_Error N6110_GetVoiceMailbox ( GSM_PhonebookEntry *entry)
 {
-       unsigned char req[100]   = { N6110_FRAME_HEADER, 0x01 };
-       unsigned char *req_end;
-       unsigned char req_end0[] = { 0x01,  /* make a data call = type 0x01 */
-                                    0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
-                                    0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00 };
-       unsigned char req_end1[] = { 0x01,
-                                    0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
-                                    0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
-                                    0x88,0x90,0x21,0x48,0x40,0xbb };
-       unsigned char req2[]     = { N6110_FRAME_HEADER, 0x42,0x05,0x01,
-                                    0x07,0xa2,0xc8,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
-                                    0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80,0x01,0x60 };
-       unsigned char req3[]     = { N6110_FRAME_HEADER, 0x42,0x05,0x01,
-                                    0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
-                                    0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80 };
-       unsigned char req4[]     = { N6110_FRAME_HEADER, 0x42,0x05,0x81,
-                                    0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
-                                    0x88,0x90,0x21,0x48,0x40,0xbb,0x07,0xa3,0xb8,0x81,
-                                    0x20,0x15,0x63,0x80 };
+  unsigned char req[] = {N6110_FRAME_HEADER, 0x01, 0x00, 0x00, 0x00};
 
-       int i = 0;
-       u8 size;
+  GSM_Error error;
+  
+  CurrentPhonebookEntry = entry;
 
-       CurrentCallPassup=callpassup;
+  req[4] = N6110_MEMORY_VOICE;
+  req[5] = 0x00; /* Location - isn't important, but... */
 
-       switch (type) {
-       case 0:
-               req_end = req_end0;
-               size = sizeof(req_end0);
-               break;
-       case 1:
-               Protocol->SendMessage(sizeof(req3), 0x01, req3);
-               Protocol->SendMessage(sizeof(req4), 0x01, req4);
-               req_end = req_end1;
-               size = sizeof(req_end1);
-               break;
-       case -1:   /* Just used to set the call passup */
-               return GE_NONE;
-               break;
-       default:
-               req_end = req_end0;
-               size = sizeof(req_end0);
-               break;
-       }
+  error=NULL_SendMessageSequence
+    (20, &CurrentPhonebookError, 7, 0x03, req);
+    
+  CurrentPhonebookEntry = NULL;
+  
+  return error;
+}
 
-       req[4] = strlen(Number);
+void N6110_ReplyGetOperatorName(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
 
-       for(i = 0; i < strlen(Number) ; i++)
-               req[5+i] = Number[i];
+  int i, count;
+  
+  GSM_Bitmap NullBitmap;
 
-       memcpy(req + 5 + strlen(Number), req_end, size);
+  DecodeNetworkCode(MessageBuffer+5, NullBitmap.netcode);
+  
+  count=8;
 
-       Protocol->SendMessage(5 + size + strlen(Number), 0x01, req);
-       if (type != 1) Protocol->SendMessage(26, 0x01, req2);
+#ifdef DEBUG
+  fprintf(stdout, _("Message: Info about downloaded operator name received: %s network (for gnokii \"%s\", for phone \""),
+          NullBitmap.netcode,
+         GSM_GetNetworkName(NullBitmap.netcode));      
+#endif
+      
+  i=count;
+  while (MessageBuffer[count]!=0) {
+#ifdef DEBUG
+    fprintf(stdout,_("%c"),MessageBuffer[count]);
+#endif
+    count++;
+  }
+      
+ strcpy(CurrentGetOperatorNameNetwork->Code, NullBitmap.netcode);
+ strncpy(CurrentGetOperatorNameNetwork->Name, MessageBuffer+i,count-i+1);
 
-       return (GE_NONE);
+#ifdef DEBUG
+  fprintf(stdout,_("\")\n"));
+#endif
+          
+  CurrentGetOperatorNameError=GE_NONE;
 }
 
-GSM_Error N6110_GetIncomingCallNr(char *Number)\r
-{\r
-\r
-  if (*CurrentIncomingCall != ' ') {\r
-    strcpy(Number, CurrentIncomingCall);\r
-    return GE_NONE;\r
-  }\r
-  else\r
-    return GE_BUSY;\r
-}\r
-
-GSM_Error N6110_CancelCall(void)
+GSM_Error N6110_GetOperatorName (GSM_Network *operator)
 {
-//  This frame & method works only on 61xx/51xx
-//  unsigned char req[] = { N6110_FRAME_HEADER, 0x08, 0x00, 0x85};
-//  req[4]=CurrentCallSequenceNumber;
-//  Protocol->SendMessage(6, 0x01, req);
-//  return GE_NONE;
+  unsigned char req[] = { 0x00,0x01,0x8c,0x00};
+
   GSM_Error error;
 
-  unsigned char req[]={0x00,0x01,0x7c,0x03};
-    
-  /* Checking */
   error=N6110_EnableExtendedCommands(0x01);
   if (error!=GE_NONE) return error;
 
-  return NULL_SendMessageSequence (20, &CurrentDialVoiceError, 4, 0x40, req);   
-}  
-\r
-void N6110_ReplyEnterSecurityCode(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-    \r
-  switch(MessageBuffer[3]) {\r
-\r
-  case 0x0b:\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Security code accepted.\n"));\r
-#endif /* DEBUG */\r
-    CurrentSecurityCodeError = GE_NONE;\r
-    break;\r
-\r
-  default:\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Security code is wrong. You're not my big owner :-)\n"));\r
-#endif /* DEBUG */\r
-    CurrentSecurityCodeError = GE_INVALIDSECURITYCODE;\r
-  }\r
-}\r
-\r
-GSM_Error N6110_EnterSecurityCode(GSM_SecurityCode SecurityCode)\r
-{\r
-\r
-  unsigned char req[15] = { N6110_FRAME_HEADER,\r
-                            0x0a, /* Enter code request. */\r
-                            0x00  /* Type of the entered code. */\r
-                            };\r
-  int i=0;\r
-\r
-  req[4]=SecurityCode.Type;\r
-\r
-  for (i=0; i<strlen(SecurityCode.Code);i++)\r
-    req[5+i]=SecurityCode.Code[i];\r
-\r
-  req[5+strlen(SecurityCode.Code)]=0x00;\r
-  req[6+strlen(SecurityCode.Code)]=0x00;\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSecurityCodeError, 7+strlen(SecurityCode.Code), 0x08, req);\r
-}\r
-\r
-void N6110_ReplyGetSecurityCodeStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-    \r
-  *CurrentSecurityCodeStatus = MessageBuffer[4];\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Security Code status received: "));\r
-\r
-  switch(*CurrentSecurityCodeStatus) {\r
-\r
-    case GSCT_SecurityCode: fprintf(stdout, _("waiting for Security Code.\n")); break;\r
-    case GSCT_Pin         : fprintf(stdout, _("waiting for PIN.\n")); break;\r
-    case GSCT_Pin2        : fprintf(stdout, _("waiting for PIN2.\n")); break;\r
-    case GSCT_Puk         : fprintf(stdout, _("waiting for PUK.\n")); break;\r
-    case GSCT_Puk2        : fprintf(stdout, _("waiting for PUK2.\n")); break;\r
-    case GSCT_None        : fprintf(stdout, _("nothing to enter.\n")); break;\r
-    default               : fprintf(stdout, _("Unknown!\n"));\r
-  }\r
-      \r
-#endif /* DEBUG */\r
-\r
-  CurrentSecurityCodeError = GE_NONE;\r
-}\r
-\r
-GSM_Error N6110_GetSecurityCodeStatus(int *Status)\r
-{\r
-\r
-  unsigned char req[4] = { N6110_FRAME_HEADER,\r
-                           0x07\r
-                         };\r
-\r
-  CurrentSecurityCodeStatus=Status;\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSecurityCodeError, 4, 0x08, req);\r
-}\r
-\r
-void N6110_ReplyGetSecurityCode(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i;\r
-  \r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Security code received: "));\r
-  switch (MessageBuffer[3]) {\r
-    case GSCT_SecurityCode: fprintf(stdout, _("Security code"));break;\r
-    case GSCT_Pin:  fprintf(stdout, _("PIN"));break;\r
-    case GSCT_Pin2: fprintf(stdout, _("PIN2"));break;\r
-    case GSCT_Puk:  fprintf(stdout, _("PUK"));break;\r
-    case GSCT_Puk2: fprintf(stdout, _("PUK2"));break;\r
-    default: fprintf(stdout, _("unknown !"));break;\r
-  }\r
-  if (MessageBuffer[4]==1) {\r
-    fprintf(stdout, _(" allowed, value \""));\r
-    if (MessageBuffer[3]==GSCT_SecurityCode) {\r
-      for (i=0;i<5;i++) {fprintf(stdout, _("%c"), MessageBuffer[5+i]);}\r
-    }\r
-    if (MessageBuffer[3]==GSCT_Pin || MessageBuffer[3]==GSCT_Pin2 ||\r
-       MessageBuffer[3]==GSCT_Puk || MessageBuffer[3]==GSCT_Puk2) {\r
-      for (i=0;i<4;i++) {fprintf(stdout, _("%c"), MessageBuffer[5+i]);}\r
-    }\r
-    fprintf(stdout, _("\""));\r
-  } else {\r
-    fprintf(stdout, _(" not allowed"));  \r
-  }\r
-  fprintf(stdout, _("\n"));  \r
-#endif /* DEBUG */\r
-      \r
-  if (CurrentSecurityCode->Type==MessageBuffer[3] /* We wanted this code */\r
-          && MessageBuffer[4]==1) {                      /* It's allowed */\r
-    if (MessageBuffer[3]==GSCT_SecurityCode) {\r
-      for (i=0;i<5;i++) {CurrentSecurityCode->Code[i]=MessageBuffer[5+i];}\r
-      CurrentSecurityCode->Code[5]=0;\r
-    }\r
-    if (MessageBuffer[3]==GSCT_Pin || MessageBuffer[3]==GSCT_Pin2 ||\r
-       MessageBuffer[3]==GSCT_Puk || MessageBuffer[3]==GSCT_Puk2) {\r
-      for (i=0;i<4;i++) {CurrentSecurityCode->Code[i]=MessageBuffer[5+i];}\r
-      CurrentSecurityCode->Code[4]=0;\r
-    }\r
-    CurrentSecurityCodeError=GE_NONE;\r
-  } else\r
-    CurrentSecurityCodeError=GE_INVALIDSECURITYCODE;\r
-}\r
-\r
-GSM_Error N6110_GetSecurityCode(GSM_SecurityCode *SecurityCode)\r
-{\r
-\r
-  unsigned char req[4] = { 0x00,\r
-                           0x01,0x6e, /* Get code request. */\r
-                          0x00 };    /* Type of the requested code. */\r
-\r
-  GSM_Error error;\r
-  \r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-  \r
-  req[3]=SecurityCode->Type;\r
-\r
-  CurrentSecurityCode=SecurityCode;\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSecurityCodeError, 4, 0x40, req);\r
-}\r
-\r
-void N6110_ReplyPlayTone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: answer for PlayTone frame\n"));      \r
-#endif\r
-      \r
-  CurrentPlayToneError=GE_NONE;      \r
-}\r
-\r
-GSM_Error N6110_PlayTone(int Herz, u8 Volume)\r
-{\r
-  unsigned char req[6] = { 0x00,0x01,0x8f,\r
-                           0x00,   /* Volume */\r
-                          0x00,   /* HerzLo */\r
-                          0x00 }; /* HerzHi */\r
-\r
-  GSM_Error error;\r
-\r
-  /* PlayTone wasn't used earlier */\r
-  if (CurrentPlayToneError==GE_UNKNOWN) {\r
-    if (CurrentConnectionType!=GCT_MBUS)\r
-      CurrentDisableKeepAlive=true;\r
-\r
-    error=N6110_EnableExtendedCommands(0x01);\r
-    if (error!=GE_NONE) return error;\r
-  }\r
-\r
-  /* For Herz==255*255 we have silent */  \r
-  if (Herz!=255*255) {\r
-    req[3]=Volume;\r
-\r
-    req[5]=Herz%256;\r
-    req[4]=Herz/256;\r
-  } else {\r
-    req[3]=0;\r
-\r
-    req[5]=0;\r
-    req[4]=0;\r
-  }\r
-\r
-#ifdef WIN32\r
-  /* For Herz==255*255 we have silent and additionaly\r
-     we wait for phone answer - it's important for MBUS */\r
-  if (Herz==255*255) {\r
-    error=NULL_SendMessageSequence\r
-      (20, &CurrentPlayToneError, 6, 0x40, req);\r
-\r
-    CurrentPlayToneError=GE_UNKNOWN;\r
-    CurrentDisableKeepAlive=false;\r
-\r
-    if (error!=GE_NONE) return error;\r
-  } else {\r
-    Protocol->SendMessage(6,0x40,req);\r
-  }\r
-#else\r
-  error=NULL_SendMessageSequence\r
-    (20, &CurrentPlayToneError, 6, 0x40, req);\r
-\r
-  /* For Herz==255*255 we wait for phone answer - it's important for MBUS */\r
-  if (Herz==255*255) {\r
-    CurrentPlayToneError=GE_UNKNOWN;\r
-    CurrentDisableKeepAlive=false;\r
-  }\r
-  \r
-  if (error!=GE_NONE) return error;\r
-\r
-#endif\r
-    \r
-  return(GE_NONE);\r
-}\r
-\r
-void N6110_ReplyGetDateTime(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  if (MessageBuffer[4]==0x01) {\r
-    DecodeDateTime(MessageBuffer+8, CurrentDateTime);\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Date and time\n"));\r
-    fprintf(stdout, _("   Time: %02d:%02d:%02d\n"), CurrentDateTime->Hour, CurrentDateTime->Minute, CurrentDateTime->Second);\r
-    fprintf(stdout, _("   Date: %4d/%02d/%02d\n"), CurrentDateTime->Year, CurrentDateTime->Month, CurrentDateTime->Day);\r
-#endif /* DEBUG */\r
-\r
-    CurrentDateTime->IsSet=true;\r
-  } else {\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Date and time not set in phone\n"));\r
-#endif\r
-\r
-    CurrentDateTime->IsSet=false;\r
-  }\r
-      \r
-  CurrentDateTimeError=GE_NONE;\r
-}\r
-\r
-GSM_Error N6110_GetDateTime(GSM_DateTime *date_time)\r
-{\r
-  return N6110_PrivGetDateTime(date_time,0x11);\r
-}\r
-\r
-GSM_Error N6110_PrivGetDateTime(GSM_DateTime *date_time, int msgtype)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x62};\r
-\r
-  CurrentDateTime=date_time;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentDateTimeError, 4, msgtype, req);\r
-}\r
-\r
-void N6110_ReplyGetAlarm(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Alarm\n"));\r
-  fprintf(stdout, _("   Alarm: %02d:%02d\n"), MessageBuffer[9], MessageBuffer[10]);\r
-  fprintf(stdout, _("   Alarm is %s\n"), (MessageBuffer[8]==2) ? _("on"):_("off"));\r
-#endif /* DEBUG */\r
-\r
-  CurrentAlarm->Hour=MessageBuffer[9];\r
-  CurrentAlarm->Minute=MessageBuffer[10];\r
-  CurrentAlarm->Second=0;\r
-\r
-  CurrentAlarm->IsSet=(MessageBuffer[8]==2);\r
-\r
-  CurrentAlarmError=GE_NONE;\r
-}\r
-\r
-GSM_Error N6110_GetAlarm(int alarm_number, GSM_DateTime *date_time)\r
-{\r
-  return N6110_PrivGetAlarm(alarm_number,date_time,0x11);\r
-}\r
-\r
-GSM_Error N6110_PrivGetAlarm(int alarm_number, GSM_DateTime *date_time, int msgtype)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x6d};\r
-\r
-  CurrentAlarm=date_time;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentAlarmError, 4, msgtype, req);\r
-}\r
-\r
-void N6110_ReplyGetSMSCenter(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-  \r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x34:\r
-\r
-    CurrentMessageCenter->No=MessageBuffer[4];\r
-    CurrentMessageCenter->Format=MessageBuffer[6];\r
-    CurrentMessageCenter->Validity=MessageBuffer[8];\r
-    sprintf(CurrentMessageCenter->Name, "%s", MessageBuffer+33);\r
-\r
-    sprintf(CurrentMessageCenter->DefaultRecipient, "%s", GSM_UnpackSemiOctetNumber(MessageBuffer+9,false));\r
-\r
-    sprintf(CurrentMessageCenter->Number, "%s", GSM_UnpackSemiOctetNumber(MessageBuffer+21,false));\r
-      \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SMS Center received:\n"));\r
-    fprintf(stdout, _("   %d. SMS Center name is %s\n"), CurrentMessageCenter->No, CurrentMessageCenter->Name);\r
-    fprintf(stdout, _("   SMS Center number is %s\n"), CurrentMessageCenter->Number);\r
-    fprintf(stdout, _("   Default recipient number is %s\n"), CurrentMessageCenter->DefaultRecipient);\r
-      \r
-    fprintf(stdout, _("   SMS Center message format is "));\r
-\r
-    switch (CurrentMessageCenter->Format) {\r
-\r
-      case GSMF_Text  : fprintf(stdout, _("Text"));   break;\r
-      case GSMF_Paging: fprintf(stdout, _("Paging")); break;\r
-      case GSMF_Fax   : fprintf(stdout, _("Fax"));    break;\r
-      case GSMF_Email : fprintf(stdout, _("Email"));  break;\r
-      default         : fprintf(stdout, _("Unknown"));\r
-    }\r
-\r
-    fprintf(stdout, "\n");\r
-\r
-    fprintf(stdout, _("   SMS Center message validity is "));\r
-\r
-    switch (CurrentMessageCenter->Validity) {\r
-\r
-      case GSMV_1_Hour  : fprintf(stdout, _("1 hour"));      break;\r
-      case GSMV_6_Hours : fprintf(stdout, _("6 hours"));     break;\r
-      case GSMV_24_Hours: fprintf(stdout, _("24 hours"));    break;\r
-      case GSMV_72_Hours: fprintf(stdout, _("72 hours"));    break;\r
-      case GSMV_1_Week  : fprintf(stdout, _("1 week"));      break;\r
-      case GSMV_Max_Time: fprintf(stdout, _("Maximum time"));break;\r
-      default           : fprintf(stdout, _("Unknown"));\r
-    }\r
-\r
-    fprintf(stdout, "\n");\r
-\r
-#endif /* DEBUG */\r
-\r
-    CurrentMessageCenterError=GE_NONE;\r
-\r
-    break;\r
-\r
-  case 0x35:\r
-\r
-    /* Number of entries depends on SIM card */\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SMS Center error received:\n"));\r
-    fprintf(stdout, _("   The request for SMS Center failed.\n"));\r
-#endif /* DEBUG */\r
-\r
-    /* FIXME: appropriate error. */\r
-    CurrentMessageCenterError=GE_INTERNALERROR;\r
-\r
-    break;  \r
-\r
-  }\r
-}\r
-\r
-/* This function sends to the mobile phone a request for the SMS Center */\r
-GSM_Error N6110_GetSMSCenter(GSM_MessageCenter *MessageCenter)\r
-{\r
-  unsigned char req[] = { N6110_FRAME_HEADER, 0x33, 0x64,\r
-                          0x00 /* SMS Center Number. */\r
-                        };\r
-\r
-  req[5]=MessageCenter->No;\r
-\r
-  CurrentMessageCenter=MessageCenter;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentMessageCenterError, 6, 0x02, req);\r
-}\r
-\r
-void N6110_ReplySetSMSCenter(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: SMS Center correctly set.\n"));\r
-#endif\r
-  CurrentMessageCenterError=GE_NONE;\r
-}\r
-\r
-/* This function set the SMS Center profile on the phone. */\r
-GSM_Error N6110_SetSMSCenter(GSM_MessageCenter *MessageCenter)\r
-{\r
-  unsigned char req[64] = { N6110_FRAME_HEADER, 0x30, 0x64,\r
-                            0x00, /* SMS Center Number. */\r
-                            0x00, /* Unknown. */\r
-                            0x00, /* SMS Message Format. */\r
-                            0x00, /* Unknown. */\r
-                            0x00, /* Validity. */\r
-                            0,0,0,0,0,0,0,0,0,0,0,0, /* Default recipient number */\r
-                            0,0,0,0,0,0,0,0,0,0,0,0 /* Message Center Number. */\r
-                            /* Message Center Name. */\r
-                          };\r
-\r
-  req[5]=MessageCenter->No;\r
-  req[7]=MessageCenter->Format;\r
-  req[9]=MessageCenter->Validity;\r
-\r
-  req[10]=GSM_PackSemiOctetNumber(MessageCenter->DefaultRecipient, req+11, false);\r
-\r
-  req[22]=GSM_PackSemiOctetNumber(MessageCenter->Number, req+23, false);\r
-\r
-  sprintf(req+34, "%s", MessageCenter->Name);\r
-\r
-  CurrentMessageCenter=MessageCenter;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentMessageCenterError, 35+strlen(MessageCenter->Name), 0x02, req);\r
-}\r
-\r
-void N6110_ReplyGetSMSStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x37:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SMS Status Received\n"));\r
-    fprintf(stdout, _("   The number of messages: %d\n"), MessageBuffer[10]);\r
-    fprintf(stdout, _("   Unread messages: %d\n"), MessageBuffer[11]);\r
-#endif /* DEBUG */\r
-\r
-    CurrentSMSStatus->UnRead = MessageBuffer[11];\r
-    CurrentSMSStatus->Number = MessageBuffer[10];\r
-    \r
-    CurrentSMSStatusError = GE_NONE;\r
-    break;\r
-\r
-  case 0x38:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SMS Status error, probably not authorized by PIN\n"));\r
-#endif /* DEBUG */\r
-\r
-    CurrentSMSStatusError = GE_INTERNALERROR;\r
-    break;\r
-         \r
-  }\r
-}\r
-\r
-GSM_Error N6110_GetSMSStatus(GSM_SMSStatus *Status)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x36, 0x64};\r
-\r
-  CurrentSMSStatus = Status;\r
-\r
-  return NULL_SendMessageSequence\r
-    (10, &CurrentSMSStatusError, 5, 0x14, req);\r
-}\r
+  CurrentGetOperatorNameNetwork = operator;
 
-GSM_Error N6110_GetSMSFolders ( GSM_SMSFolders *folders)
-{
-  folders->number=2;
+  error=NULL_SendMessageSequence
+    (20, &CurrentGetOperatorNameError, 4, 0x40, req);
 
-  strcpy(folders->Folder[0].Name,"Inbox");
-  strcpy(folders->Folder[1].Name,"Outbox");
+  CurrentGetOperatorNameNetwork = NULL;
   
-  return GE_NONE;
+  return error;
 }
-\r
-GSM_Error N6110_GetIMEI(char *imei)\r
-{\r
-  if (strlen(Current_IMEI)>0) {\r
-    strncpy (imei, Current_IMEI, GSM_MAX_IMEI_LENGTH);\r
-    return (GE_NONE);\r
-  }\r
-  else\r
-    return (GE_TRYAGAIN);\r
-}\r
-\r
-GSM_Error N6110_GetRevision(char *revision)\r
-{\r
-\r
-  if (strlen(Current_Revision)>0) {\r
-    strncpy (revision, Current_Revision, GSM_MAX_REVISION_LENGTH);\r
-    return (GE_NONE);\r
-  }\r
-  else\r
-    return (GE_TRYAGAIN);\r
-}\r
-\r
-GSM_Error N6110_GetModel(char *model)\r
-{\r
-  if (strlen(Current_Model)>0) {\r
-    strncpy (model, Current_Model, GSM_MAX_MODEL_LENGTH);\r
-    return (GE_NONE);\r
-  }\r
-  else\r
-    return (GE_TRYAGAIN);\r
-}\r
-\r
-void N6110_ReplySetDateTime(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[4]) {\r
-\r
-    case 0x01:\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Date and time set correctly\n"));\r
-#endif /* DEBUG */\r
-      CurrentSetDateTimeError=GE_NONE;\r
-      break;\r
-      \r
-    default:\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Date and time setting error\n"));\r
-#endif /* DEBUG */\r
-      CurrentSetDateTimeError=GE_INVALIDDATETIME;\r
-\r
-  }\r
-}\r
-\r
-/* Needs SIM card with PIN in phone */\r
-GSM_Error N6110_SetDateTime(GSM_DateTime *date_time)\r
-{\r
-  return N6110_PrivSetDateTime(date_time,0x11);\r
-}\r
-\r
-/* Needs SIM card with PIN in phone */\r
-GSM_Error N6110_PrivSetDateTime(GSM_DateTime *date_time, int msgtype)\r
-{\r
-\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                         0x60, /* set-time subtype */\r
-                         0x01, 0x01, 0x07, /* unknown */\r
-                         0x00, 0x00, /* Year (0x07cf = 1999) */\r
-                         0x00, 0x00, /* Month Day */\r
-                         0x00, 0x00, /* Hours Minutes */\r
-                         0x00 /* Unknown, but not seconds - try 59 and wait 1 sec. */\r
-                       };\r
-\r
-  EncodeDateTime(req+7, date_time);\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSetDateTimeError, 14, msgtype, req);\r
-}\r
-\r
-void N6110_ReplySetAlarm(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[4]) {\r
-\r
-    case 0x01:\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Alarm set correctly\n"));\r
-#endif /* DEBUG */\r
-      CurrentSetAlarmError=GE_NONE;\r
-      break;\r
-      \r
-    default:\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Alarm setting error\n"));\r
-#endif /* DEBUG */\r
-      CurrentSetAlarmError=GE_INVALIDDATETIME;\r
-\r
-  }\r
-}\r
-\r
-/* FIXME: we should also allow to set the alarm off :-) */\r
-GSM_Error N6110_SetAlarm(int alarm_number, GSM_DateTime *date_time)\r
-{\r
-  return N6110_PrivSetAlarm(alarm_number,date_time, 0x11);\r
-}\r
-\r
-/* FIXME: we should also allow to set the alarm off :-) */\r
-GSM_Error N6110_PrivSetAlarm(int alarm_number, GSM_DateTime *date_time, int msgtype)\r
-{\r
-\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                         0x6b, /* set-alarm subtype */\r
-                         0x01, 0x20, 0x03, /* unknown */\r
-                         0x02,       /* should be alarm on/off, but it don't works */\r
-                         0x00, 0x00, /* Hours Minutes */\r
-                         0x00 /* Unknown, but not seconds - try 59 and wait 1 sec. */\r
-                       };\r
-\r
-  req[8] = date_time->Hour;\r
-  req[9] = date_time->Minute;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentSetAlarmError, 11, msgtype, req);\r
-}\r
-\r
-void N6110_ReplyGetMemoryLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  /* Hopefully is 64 larger as FB38_MAX* / N6110_MAX* */\r
-  char model[64];\r
-\r
-  int i, tmp, count;\r
-    \r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x02:\r
-\r
-    CurrentPhonebookEntry->Empty = true;\r
-\r
-    count=MessageBuffer[5];\r
-         \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Phonebook entry received:\n"));\r
-    fprintf(stdout, _("   Name: "));\r
-\r
-    for (tmp=0; tmp <count; tmp++)\r
-    {\r
-      if (MessageBuffer[6+tmp]==1) fprintf(stdout, "%c", '~'); else //enables/disables blinking\r
-      if (MessageBuffer[6+tmp]==0) fprintf(stdout, "%c", '`'); else //hides rest ot contents\r
-      fprintf(stdout, "%c", MessageBuffer[6+tmp]);\r
-    }\r
-\r
-    fprintf(stdout, "\n");\r
-#endif /* DEBUG */\r
-\r
-    while (N6110_GetModel(model)  != GE_NONE)\r
-      sleep(1);\r
-        \r
-    if (GetModelFeature (FN_PHONEBOOK)==F_PBK33) {//pbk with Unicode\r
-      DecodeUnicode (CurrentPhonebookEntry->Name, MessageBuffer+6, count/2);\r
-      CurrentPhonebookEntry->Name[count/2] = 0x00;\r
-    } else {\r
-      memcpy(CurrentPhonebookEntry->Name, MessageBuffer + 6, count);\r
-      CurrentPhonebookEntry->Name[count] = 0x00;\r
-    }\r
-\r
-    CurrentPhonebookEntry->Empty = false;\r
-\r
-    for (tmp=0; tmp <count; tmp++)\r
-    {\r
-      if (GetModelFeature (FN_PHONEBOOK)==F_PBK33) {//pbk with Unicode\r
-        /* We check only 1'st, 3'rd, ... char */\r
-        if (tmp%2!=0 && MessageBuffer[6+tmp]==1) CurrentPhonebookEntry->Name[tmp/2]='~'; //enables/disables blinking\r
-        if (tmp%2!=0 && MessageBuffer[6+tmp]==0) CurrentPhonebookEntry->Name[tmp/2]='`'; //hides rest ot contents\r
-      } else {\r
-        if (MessageBuffer[6+tmp]==1) CurrentPhonebookEntry->Name[tmp]='~'; //enables/disables blinking\r
-        if (MessageBuffer[6+tmp]==0) CurrentPhonebookEntry->Name[tmp]='`'; //hides rest ot contents\r
-      }\r
-    }\r
-\r
-    i=7+count;\r
-    count=MessageBuffer[6+count];\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("   Number: "));\r
-\r
-    for (tmp=0; tmp <count; tmp++)\r
-      fprintf(stdout, "%c", MessageBuffer[i+tmp]);\r
-\r
-    fprintf(stdout, "\n");\r
-#endif /* DEBUG */\r
-\r
-    memcpy(CurrentPhonebookEntry->Number, MessageBuffer + i, count);\r
-    CurrentPhonebookEntry->Number[count] = 0x00;\r
-    CurrentPhonebookEntry->Group = MessageBuffer[i+count];\r
-      \r
-    /* Phone doesn't have entended phonebook */\r
-    CurrentPhonebookEntry->SubEntriesCount = 0;\r
-\r
-    /* But for these memories data is saved and we can save it using 7110/6210 style */\r
-    if (CurrentPhonebookEntry->MemoryType==GMT_DC ||\r
-        CurrentPhonebookEntry->MemoryType==GMT_RC ||\r
-        CurrentPhonebookEntry->MemoryType==GMT_MC) {\r
-        CurrentPhonebookEntry->SubEntriesCount = 1;\r
-        CurrentPhonebookEntry->SubEntries[0].EntryType=N7110_ENTRYTYPE_DATE;\r
-        CurrentPhonebookEntry->SubEntries[0].NumberType=0;\r
-        CurrentPhonebookEntry->SubEntries[0].BlockNumber=1;\r
-        DecodeDateTime(MessageBuffer+(i+count+2),&CurrentPhonebookEntry->SubEntries[0].data.Date);\r
-\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("   Date: "));\r
-      fprintf(stdout, "%02u.%02u.%04u\n",\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Day,\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Month,\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Year);\r
-      fprintf(stdout, _("   Time: "));\r
-      fprintf(stdout, "%02u:%02u:%02u\n",\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Hour,\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Minute,\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Second);\r
-#endif /* DEBUG */\r
-\r
-      /* These values are set, when date and time unavailable in phone.\r
-         Values from 3310 - in other can be different */\r
-      if (CurrentPhonebookEntry->SubEntries[0].data.Date.Day==20 &&\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Month==1 &&\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Year==2118 &&\r
-          CurrentPhonebookEntry->SubEntries[0].data.Date.Hour==3 &&\r
-         CurrentPhonebookEntry->SubEntries[0].data.Date.Minute==14 &&\r
-         CurrentPhonebookEntry->SubEntries[0].data.Date.Second==7)\r
-          CurrentPhonebookEntry->SubEntriesCount = 0;\r
-    }\r
-\r
-    /* Signal no error to calling code. */\r
-    CurrentPhonebookError = GE_NONE;\r
-\r
-    break;\r
-\r
-  case 0x03:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Phonebook read entry error received:\n"));\r
-#endif /* DEBUG */\r
-\r
-    switch (MessageBuffer[4]) {\r
-\r
-      case 0x7d:\r
-#ifdef DEBUG\r
-       fprintf(stdout, _("   Invalid memory type!\n"));\r
-#endif /* DEBUG */\r
-       CurrentPhonebookError = GE_INVALIDMEMORYTYPE;\r
-       break;\r
-\r
-      default:\r
-#ifdef DEBUG\r
-       fprintf(stdout, _("   Unknown error!\n"));\r
-#endif /* DEBUG */\r
-       CurrentPhonebookError = GE_INTERNALERROR;\r
-    }\r
-\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-/* Routine to get specifed phone book location.  Designed to be called by\r
-   application.  Will block until location is retrieved or a timeout/error\r
-   occurs. */\r
-GSM_Error N6110_GetMemoryLocation(GSM_PhonebookEntry *entry)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x01, 0x00, 0x00, 0x00};\r
-\r
-  CurrentPhonebookEntry = entry;\r
-\r
-  req[4] = N6110_GetMemoryType(entry->MemoryType);\r
-  req[5] = entry->Location;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentPhonebookError, 7, 0x03, req);\r
-}\r
-\r
-void N6110_ReplyWritePhonebookLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x05:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Phonebook written correctly.\n"));\r
-#endif /* DEBUG */\r
-    CurrentPhonebookError = GE_NONE;\r
-    break;\r
-\r
-  case 0x06:\r
-\r
-    switch (MessageBuffer[4]) {\r
-      /* FIXME: other errors? When I send the phonebook with index of 350 it\r
-         still report error 0x7d :-( */\r
-      case 0x7d:\r
-#ifdef DEBUG\r
-        fprintf(stdout, _("Message: Phonebook not written - name is too long.\n"));\r
-#endif /* DEBUG */\r
-       CurrentPhonebookError = GE_PHBOOKNAMETOOLONG;\r
-       break;\r
-\r
-      default:\r
-#ifdef DEBUG\r
-       fprintf(stdout, _("   Unknown error!\n"));\r
-#endif /* DEBUG */\r
-       CurrentPhonebookError = GE_INTERNALERROR;\r
-    }\r
-  }\r
-}\r
-\r
-/* Routine to write phonebook location in phone. Designed to be called by\r
-   application code. Will block until location is written or timeout\r
-   occurs. */\r
-GSM_Error N6110_WritePhonebookLocation(GSM_PhonebookEntry *entry)\r
-{\r
-  unsigned char req[128] = { N6110_FRAME_HEADER, 0x04, 0x00, 0x00 };\r
-  int i=0, current=0;\r
-\r
-  req[4] = N6110_GetMemoryType(entry->MemoryType);\r
-  req[5] = entry->Location;\r
-\r
-  current=7;\r
-\r
-  if (GetModelFeature (FN_PHONEBOOK)==F_PBK33) {\r
-\r
-     req[6] = strlen(entry->Name)*2;\r
-\r
-     EncodeUnicode (req+current,entry->Name ,strlen(entry->Name));\r
-     \r
-     for (i=0; i<strlen(entry->Name); i++)\r
-     {\r
-       /* here we encode "special" chars */\r
-       if (entry->Name[i]=='~') req[current+i*2]=1; //enables/disables blinking\r
-       if (entry->Name[i]=='`') req[current+i*2]=0; //hides rest ot contents\r
-     }\r
-\r
-     current+=strlen(entry->Name)*2;\r
-  } else {\r
-\r
-    req[6] = strlen(entry->Name);\r
-\r
-    for (i=0; i<strlen(entry->Name); i++)\r
-    {\r
-      req[current+i] = entry->Name[i];\r
-\r
-      /* here we encode "special" chars */\r
-      if (entry->Name[i]=='~') req[current+i]=1; //enables/disables blinking\r
-      if (entry->Name[i]=='`') req[current+i]=0; //hides rest ot contents\r
-    }\r
-\r
-    current+=strlen(entry->Name);\r
-  }\r
-\r
-  req[current++]=strlen(entry->Number);\r
-\r
-  for (i=0; i<strlen(entry->Number); i++)\r
-    req[current+i] = entry->Number[i];\r
-\r
-  current+=strlen(entry->Number);\r
-\r
-  /* Jano: This allow to save 14 characters name into SIM memory, when\r
-     No Group is selected. */\r
-  if (entry->Group == 5)\r
-    req[current++]=0xff;\r
-  else\r
-    req[current++]=entry->Group;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentPhonebookError, current, 0x03, req);\r
-}\r
-\r
-void N6110_ReplyNetmonitor(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch(MessageBuffer[3]) {\r
-\r
-    case 0x00:\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Netmonitor correctly set.\n"));\r
-#endif /* DEBUG */\r
-      CurrentNetmonitorError=GE_NONE;  \r
-      break;\r
-      \r
-    default:\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Netmonitor menu %d received:\n"), MessageBuffer[3]);\r
-      fprintf(stdout, "%s\n", MessageBuffer+4);\r
-#endif /* DEBUG */\r
-\r
-      strcpy(CurrentNetmonitor, MessageBuffer+4);\r
-\r
-      CurrentNetmonitorError=GE_NONE;  \r
-  }\r
-}\r
-\r
-GSM_Error N6110_NetMonitor(unsigned char mode, char *Screen)\r
-{\r
-  unsigned char req[] = { 0x00, 0x01, 0x7e, 0x00 };\r
-  \r
-  GSM_Error error;\r
-  \r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  CurrentNetmonitor=Screen;\r
-\r
-  req[3]=mode;\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentNetmonitorError, 4, 0x40, req);\r
-}\r
-\r
-/* Doesn't work in N3210. */\r
-/* In other allow to access phone menu without SIM card (just send any sequence) */\r
-GSM_Error N6110_SendDTMF(char *String)\r
-{\r
-  unsigned char req[64] = { N6110_FRAME_HEADER, 0x50,\r
-                            0x00 /* Length of DTMF string. */\r
-                          };\r
-                         \r
-  u8 length=strlen(String);\r
-\r
-  if (length>59) length=59;\r
-  \r
-  req[4] = length;\r
-  \r
-  memcpy(req+5,String,length);\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSendDTMFError, 5+length, 0x01, req);\r
-}\r
-\r
-void N6110_ReplyGetSpeedDial(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x17:\r
-\r
-    switch (MessageBuffer[4]) {\r
-      case 0x02: CurrentSpeedDialEntry->MemoryType = GMT_ME;\r
-      default  : CurrentSpeedDialEntry->MemoryType = GMT_SM;\r
-    }\r
-      \r
-    CurrentSpeedDialEntry->Location = MessageBuffer[5];\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Speed dial entry received:\n"));\r
-    fprintf(stdout, _("   Location: %d\n"), CurrentSpeedDialEntry->Location);\r
-    fprintf(stdout, _("   MemoryType: %s\n"), N6110_MemoryType_String[CurrentSpeedDialEntry->MemoryType]);\r
-    fprintf(stdout, _("   Number: %d\n"), CurrentSpeedDialEntry->Number);\r
-#endif /* DEBUG */\r
-\r
-    CurrentSpeedDialError=GE_NONE;\r
-    break;\r
-\r
-  case 0x18:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Speed dial entry error\n"));\r
-#endif /* DEBUG */\r
-    CurrentSpeedDialError=GE_INVALIDSPEEDDIALLOCATION;\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-GSM_Error N6110_GetSpeedDial(GSM_SpeedDial *entry)\r
-{\r
-\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x16,\r
-                          0x00  /* The number of speed dial. */\r
-                        };\r
-\r
-  CurrentSpeedDialEntry = entry;\r
-\r
-  req[4] = entry->Number;\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSpeedDialError, 5, 0x03, req);\r
-}\r
-\r
-void N6110_ReplySetSpeedDial(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x1a:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Speed dial entry set.\n"));\r
-#endif /* DEBUG */\r
-    CurrentSpeedDialError=GE_NONE;\r
-    break;\r
-\r
-  case 0x1b:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Speed dial entry setting error.\n"));\r
-#endif /* DEBUG */\r
-    CurrentSpeedDialError=GE_INVALIDSPEEDDIALLOCATION;\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-GSM_Error N6110_SetSpeedDial(GSM_SpeedDial *entry)\r
-{\r
-\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x19,\r
-                          0x00, /* Number */\r
-                          0x00, /* Memory Type */\r
-                          0x00  /* Location */\r
-                        };\r
-\r
-  req[4] = entry->Number;\r
-\r
-  switch (entry->MemoryType) {\r
-    case GMT_ME: req[5] = 0x02;\r
-    default    : req[5] = 0x03;\r
-  }\r
-\r
-  req[6] = entry->Location;\r
-\r
-  return NULL_SendMessageSequence\r
-    (20, &CurrentSpeedDialError, 7, 0x03, req);\r
-}\r
-\r
-/* This function finds parts of SMS in frame used in new Nokia phones\r
-   in internal protocols (they're coded according to GSM 03.40), copies them\r
-   to GSM_ETSISMSMessage and calls GSM_DecodeETSISMS to decode\r
-   GSM_ETSISMSMessage to GSM_SMSMessage structure */\r
-GSM_Error GSM_DecodeNokiaSMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int length)\r
-{\r
-  SMS_MessageType PDU=SMS_Deliver;\r
-  GSM_ETSISMSMessage ETSI;\r
-  int offset=0,i;\r
-\r
-  ETSI.firstbyte=req[12];\r
-\r
-  /* See GSM 03.40 section 9.2.3.1 */\r
-  if ((ETSI.firstbyte & 0x03) == 0x01) PDU=SMS_Submit;\r
-  if ((ETSI.firstbyte & 0x03) == 0x02) PDU=SMS_Status_Report;\r
-\r
-  switch (PDU) {\r
-    case SMS_Submit       : offset=5;break;\r
-    case SMS_Deliver      : offset=4;break;\r
-    case SMS_Status_Report: offset=3;break;\r
-    default:                break;\r
-  }\r
-\r
-  for (i=0;i<req[0]+1;i++)\r
-    ETSI.SMSCNumber[i]=req[i];\r
-\r
-  for (i=0;i<((req[12+offset]+1)/2+1)+1;i++)\r
-    ETSI.Number[i]=req[i+12+offset];\r
-\r
-  switch (PDU) {\r
-    case SMS_Submit:\r
-      ETSI.TPDCS=req[10+offset];\r
-      ETSI.TPUDL=req[11+offset];\r
-      ETSI.TPVP=0;  //no support for now\r
-      ETSI.TPPID=0; //no support for now\r
-      for(i=31+offset;i<length;i++)\r
-        ETSI.MessageText[i-31-offset]=req[i];\r
-      break;\r
-    case SMS_Deliver:\r
-      ETSI.TPDCS=req[10+offset];\r
-      ETSI.TPUDL=req[11+offset];\r
-      ETSI.TPPID=0; //no support for now\r
-      for(i=31+offset;i<length;i++)\r
-        ETSI.MessageText[i-31-offset]=req[i];\r
-      for(i=0;i<7;i++)\r
-        ETSI.DeliveryDateTime[i]=req[i+24+offset];\r
-      break;\r
-    case SMS_Status_Report:\r
-      for(i=0;i<7;i++)\r
-        ETSI.DeliveryDateTime[i]=req[i+24+offset];\r
-      ETSI.TPStatus=req[14];\r
-      for(i=0;i<7;i++)\r
-        ETSI.SMSCDateTime[i]=req[i+34];\r
-      break;\r
-    default:\r
-      break;\r
-  }\r
-\r
-  GSM_DecodeETSISMS(SMS, &ETSI);\r
-\r
-  SMS->Name[0]=0;\r
-\r
-  return GE_NONE;\r
-}\r
-\r
-void N6110_ReplyGetSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int offset;\r
-  \r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x08:\r
-\r
-    switch (MessageBuffer[7]) {\r
-\r
-      case 0x00:\r
-       CurrentSMSMessage->Type = GST_SMS;\r
-        CurrentSMSMessage->folder=GST_INBOX;\r
-       offset=4;\r
-        break;\r
-\r
-      case 0x01:\r
-        CurrentSMSMessage->Type = GST_DR;\r
-       CurrentSMSMessage->folder=GST_INBOX;\r
-       offset=3;\r
-        break;\r
-\r
-      case 0x02:\r
-       CurrentSMSMessage->Type = GST_SMS;\r
-       CurrentSMSMessage->folder=GST_OUTBOX;\r
-       offset=5;\r
-        break;\r
-\r
-      default:\r
-        CurrentSMSMessage->Type = GST_UN;\r
-       offset=4;\r
-        break;\r
-\r
-    }\r
-\r
-    /* Field Short Message Status - MessageBuffer[4] seems not to be\r
-       compliant with GSM 07.05 spec.\r
-       Meaning     Nokia protocol      GMS spec\r
-       ----------------------------------------------------\r
-       MO Sent     0x05                        0x07 or 0x01\r
-       MO Not sent 0x07                        0x06 or 0x00\r
-       MT Read    0x01                 0x05 or 0x01\r
-       MT Not read 0x03                        0x04 or 0x00\r
-       ----------------------------------------------------\r
-       See GSM 07.05 section 2.5.2.6 and correct me if I'm wrong.\r
-       \r
-                                        Pawel Kot */\r
-\r
-    if (MessageBuffer[4] & 0x02) CurrentSMSMessage->Status = GSS_NOTSENTREAD;\r
-                            else CurrentSMSMessage->Status = GSS_SENTREAD;\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Number: %d\n"), MessageBuffer[6]);\r
-\r
-    if (CurrentSMSMessage->folder!=1) { //GST_OUTBOX\r
-      fprintf(stdout, _("Message: Received SMS (mobile terminated)\n"));\r
-    } else {\r
-      fprintf(stdout, _("Message: Outbox message (mobile originated)\n"));\r
-    }\r
-\r
-    if (CurrentSMSMessage->Type == GST_DR) fprintf(stdout, _("   Delivery Report\n"));\r
-    if (CurrentSMSMessage->Type == GST_UN) fprintf(stdout, _("   Unknown type\n"));\r
-\r
-    if (CurrentSMSMessage->folder==1) { //GST_OUTBOX\r
-      if (CurrentSMSMessage->Status) fprintf(stdout, _("   Sent\n"));\r
-                                else fprintf(stdout, _("   Not sent\n"));\r
-    } else {\r
-      if (CurrentSMSMessage->Status) fprintf(stdout, _("   Read\n"));\r
-                                else fprintf(stdout, _("   Not read\n"));\r
-    }\r
-#endif\r
-\r
-    CurrentSMSPointer=GSM_DecodeNokiaSMSFrame(CurrentSMSMessage, MessageBuffer+8, MessageLength-8);\r
-\r
-    CurrentSMSMessage->MemoryType = MessageBuffer[5];\r
-    CurrentSMSMessage->MessageNumber = MessageBuffer[6];\r
\r
-    /* Signal no error to calling code. */\r
-    CurrentSMSMessageError = GE_NONE;\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, "\n");\r
-#endif\r
-\r
-    break;\r
-\r
-  case 0x09:\r
-\r
-    /* We have requested invalid or empty location. */\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SMS reading failed\n"));\r
-\r
-    switch (MessageBuffer[4]) {\r
-      case 0x02:\r
-        fprintf(stdout, _("   Invalid location!\n"));break;\r
-      case 0x07:\r
-       fprintf(stdout, _("   Empty SMS location.\n"));break;\r
-      case 0x0c:\r
-       fprintf(stdout, _("   No access to memory (no PIN on card ?)\n"));break;\r
-      default:      \r
-        fprintf(stdout, _("   Error code %i - please report it \n"),MessageBuffer[4]);break;\r
-    }\r
-#endif /* DEBUG */\r
-\r
-    switch (MessageBuffer[4]) {\r
-      case 0x02:CurrentSMSMessageError = GE_INVALIDSMSLOCATION;break;\r
-      case 0x07:CurrentSMSMessageError = GE_EMPTYSMSLOCATION;break;\r
-      case 0x0c:CurrentSMSMessageError = GE_NOACCESS;break;\r
-      default  :CurrentSMSMessageError = GE_UNKNOWN;break;\r
-    }\r
-\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-GSM_Error N6110_GetSMSMessage(GSM_SMSMessage *message)\r
-{\r
-\r
-  unsigned char req[] = { N6110_FRAME_HEADER,\r
-                          0x07,\r
-                          0x02, /* Unknown */\r
-                          0x00, /* Location */\r
-                          0x01, 0x64};\r
-\r
-  int timeout = 60;\r
-\r
-  /* State machine code writes data to these variables when it comes in. */\r
-\r
-  CurrentSMSMessage = message;\r
-  CurrentSMSMessageError = GE_BUSY;\r
-\r
-  req[5] = message->Location;\r
-\r
-  /* Send request */\r
-  Protocol->SendMessage(8, 0x02, req);\r
-\r
-  /* Wait for timeout or other error. */\r
-  while (timeout != 0 && (CurrentSMSMessageError == GE_BUSY || CurrentSMSMessageError == GE_SMSWAITING)) {\r
-\r
-    if (--timeout == 0)\r
-      return (GE_TIMEOUT);\r
-\r
-    usleep (100000);\r
-  }\r
-\r
-  return (CurrentSMSMessageError);\r
-}\r
-\r
-void N6110_ReplyDeleteSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: SMS deleted successfully.\n"));\r
-#endif /* DEBUG */\r
-\r
-  CurrentSMSMessageError = GE_NONE;    \r
-}\r
-\r
-GSM_Error N6110_DeleteSMSMessage(GSM_SMSMessage *message)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x0a, 0x02, 0x00};\r
-\r
-  req[5] = message->Location;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentSMSMessageError, 6, 0x14, req);\r
-}\r
 
-/* FIXME: do we need more than SMS_Submit and SMS_Deliver ? */
-GSM_Error GSM_EncodeNokiaSMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int *length, SMS_MessageType PDU)
-{
-  GSM_ETSISMSMessage ETSI;
-  int i,offset=0;
+void N6110_ReplySetOperatorName(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+    
+#ifdef DEBUG
+  fprintf(stdout, _("Message: Downloaded operator name changed\n"));
+#endif    
 
-  GSM_EncodeETSISMS(SMS, &ETSI, PDU, length);
+  CurrentSetOperatorNameError=GE_NONE;      
+}
 
-  /* Cleaning */
-  for (i=0;i<36;i++) req[i]=0;
+GSM_Error N6110_SetOperatorName (GSM_Network *operator)
+{
+  unsigned char req[256] = { 0x00,0x01,0x8b,0x00,
+                             0x00,0x00, /* MCC */
+                            0x00};     /* MNC */
 
-  req[12]=ETSI.firstbyte;
+  GSM_Error error;
 
-  for (i=0;i<ETSI.SMSCNumber[0]+1;i++)
-    req[i]=ETSI.SMSCNumber[i];
+  error=N6110_EnableExtendedCommands(0x01);
+  if (error!=GE_NONE) return error;
 
-  switch (PDU) {
-    case SMS_Submit:
-      offset=5;
-      for (i=0;i<((ETSI.Number[0]+1)/2+1)+1;i++)
-        req[i+12+offset]=ETSI.Number[i];
-      req[10+offset]=ETSI.TPDCS;
-      req[11+offset]=ETSI.TPUDL;
-      req[24+offset]=ETSI.TPVP;
-#ifdef DEBUG
-//      fprintf(stdout,_("   First byte: %02x\n"),ETSI.firstbyte);
-//      fprintf(stdout,_("   TP-VP: %02x\n"),ETSI.TPVP);
-//      fprintf(stdout,_("   TP-DCS: %02x\n"),ETSI.TPDCS);
-#endif
-//    req[]=ETSI.TPPID;
-      for(i=0;i<*length;i++)
-        req[i+31+offset]=ETSI.MessageText[i];
-      break;
+  EncodeNetworkCode(req+4,operator->Code);
 
-    case SMS_Deliver:
-      offset=4;
-      for (i=0;i<((ETSI.Number[0]+1)/2+1)+1;i++)
-        req[i+12+offset]=ETSI.Number[i];
-      req[10+offset]=ETSI.TPDCS;
-      req[11+offset]=ETSI.TPUDL;
-//    req[]=ETSI.TPPID;
-      for(i=0;i<*length;i++)
-        req[i+31+offset]=ETSI.MessageText[i];
-      for (i=0;i<7;i++)
-        req[24+offset+i]=ETSI.DeliveryDateTime[i];
-      break;
-    default:
-      break;
-  }
-  
-  *length=*length+offset;
-  
-  return GE_NONE;
+  strncpy(req+7,operator->Name,200);
+    
+  return NULL_SendMessageSequence
+    (20, &CurrentSetOperatorNameError, 8+strlen(operator->Name), 0x40, req);
 }
-\r
-void N6110_ReplySendSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-    \r
-  switch (MessageBuffer[3]) {\r
-\r
-  /* SMS message correctly sent to the network */\r
-  case 0x02:\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SMS Message correctly sent.\n"));\r
-#endif /* DEBUG */\r
-    CurrentSMSMessageError = GE_SMSSENDOK;\r
-    break;\r
-\r
-  /* SMS message send to the network failed */\r
-  case 0x03:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Sending SMS Message failed, error: %i"),MessageBuffer[6]);\r
-      \r
-    switch (MessageBuffer[6]) {\r
-      case 1: fprintf(stdout,_(" (info \"Number not in use\")"));break;\r
-      case 21: fprintf(stdout,_(" (info \"Message not sent this time\")"));break;\r
-      case 28: fprintf(stdout,_(" (info \"Number not in use\")"));break;\r
-      case 38: fprintf(stdout,_(" (info \"Message not sent this time\")"));break;       case 50: fprintf(stdout,_(" (info \"Check operator services\")"));break;       \r
-      case 96: fprintf(stdout,_(" (info \"Message sending failed\")"));break;  \r
-      case 111: fprintf(stdout,_(" (info \"Message sending failed\")"));break; \r
-      case 166: fprintf(stdout,_(" (info \"Message sending failed\")"));break; \r
-      case 178: fprintf(stdout,_(" (info \"Message sending failed\")"));break; \r
-      case 252: fprintf(stdout,_(" (info \"Message sending failed\")"));break;        case 253: fprintf(stdout,_(" (info \"Message sending failed\")"));break; \r
-    }\r
-\r
-    fprintf(stdout,_("\n   For more details with errors see netmonitor manual (test 65) on www.marcin-wiacek.topnet.pl"));\r
-    fprintf(stdout,_("\n   If know their meaning, GSM specs decribing them, contact with me on marcin-wiacek@topnet.pl. THX\n"));\r
-#endif /* DEBUG */\r
-\r
-    CurrentSMSMessageError = GE_SMSSENDFAILED;\r
-    break;\r
-\r
-  }\r
-}\r
-\r
-GSM_Error N6110_SendSMSMessage(GSM_SMSMessage *SMS)\r
-{\r
-  GSM_Error error;\r
-\r
-  unsigned char req[256] = {\r
-    N6110_FRAME_HEADER,\r
-    0x01, 0x02, 0x00, /* SMS send request*/\r
-  };\r
-\r
-  int length;\r
-\r
-  error=GSM_EncodeNokiaSMSFrame(SMS, req+6, &length, SMS_Submit);    \r
-  if (error != GE_NONE) return error;\r
-\r
-  return NULL_SendMessageSequence\r
-    (200, &CurrentSMSMessageError, 42+length, 0x02, req);\r
-}\r
-\r
-void N6110_ReplySaveSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x05:\r
-      \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("SMS Message stored at %d\n"), MessageBuffer[5]);\r
-#endif\r
-      \r
-    CurrentSMSMessage->MessageNumber=MessageBuffer[5];\r
-      \r
-    CurrentSMSMessageError = GE_NONE;\r
-    break;\r
-\r
-  case 0x06:\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("SMS saving failed\n"));\r
-    switch (MessageBuffer[4]) {\r
-      case 0x02:fprintf(stdout, _("   All locations busy.\n"));break;\r
-      case 0x03:fprintf(stdout, _("   Invalid location!\n"));break;\r
-      default  :fprintf(stdout, _("   Unknown error.\n"));break;\r
-    }\r
-#endif      \r
-      \r
-    switch (MessageBuffer[4]) {\r
-      case 0x02:CurrentSMSMessageError = GE_MEMORYFULL;break;\r
-      case 0x03:CurrentSMSMessageError = GE_INVALIDSMSLOCATION;break;\r
-      default  :CurrentSMSMessageError = GE_UNKNOWN;break;\r
-    }\r
-  }\r
-}\r
-\r
-/* GST_DR and GST_UN not supported ! */\r
-GSM_Error N6110_SaveSMSMessage(GSM_SMSMessage *SMS)\r
-{\r
-  unsigned char req[256] = {\r
-    N6110_FRAME_HEADER, 0x04, /* SMS save request*/\r
-    0x00, /* SMS Status. Different for Inbox and Outbox */\r
-    0x02, /* ?? */\r
-    0x00, /* SMS Location */\r
-    0x02, /* SMS Type */\r
-  };\r
-\r
-  int length;\r
-  SMS_MessageType PDU;\r
-  GSM_Error error;\r
-\r
-  if (SMS->Location) req[6] = SMS->Location;\r
-    \r
-  if (SMS->folder==0) { /*Inbox*/\r
-    req[4]=1;      /* SMS Status */\r
-    req[7] = 0x00; /* SMS Type */\r
-    PDU=SMS_Deliver;\r
-  } else {\r
-    req[4]=5;      /* SMS Status */\r
-    req[7] = 0x02; /* SMS Type */\r
-    PDU=SMS_Submit;\r
-  }\r
-  \r
-  if (SMS->Status == GSS_NOTSENTREAD) req[4] |= 0x02;  \r
-\r
-  error=GSM_EncodeNokiaSMSFrame(SMS, req+8, &length, PDU);  \r
-  if (error != GE_NONE) return error;\r
-\r
-  CurrentSMSMessage = SMS;\r
-\r
-  return NULL_SendMessageSequence\r
-    (70, &CurrentSMSMessageError, 39+length, 0x14, req);\r
-}\r
-\r
-void N6110_ReplySetCellBroadcast(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: Cell Broadcast enabled/disabled successfully.\n")); fflush (stdout);\r
-#endif\r
-\r
-  CurrentCBError = GE_NONE;\r
-}\r
-\r
-/* Enable and disable Cell Broadcasting */\r
-GSM_Error N6110_EnableCellBroadcast(void)\r
-{\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x20,\r
-                         0x01, 0x01, 0x00, 0x00, 0x01, 0x01};\r
-\r
-#ifdef DEBUG\r
-  fprintf (stdout,"Enabling CB\n");\r
-#endif\r
-\r
-  CurrentCBMessage = (GSM_CBMessage *)malloc(sizeof (GSM_CBMessage));\r
-  CurrentCBMessage->Channel = 0;\r
-  CurrentCBMessage->New = false;\r
-  strcpy (CurrentCBMessage->Message,"");\r
-\r
-  return NULL_SendMessageSequence\r
-    (10, &CurrentCBError, 10, 0x02, req);\r
-}\r
-\r
-\r
-GSM_Error N6110_DisableCellBroadcast(void)\r
-{\r
-  /* Should work, but not tested fully */\r
-\r
-  unsigned char req[] = {N6110_FRAME_HEADER, 0x20,\r
-                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /*VERIFY*/\r
-\r
-  return NULL_SendMessageSequence\r
-    (10, &CurrentCBError, 10, 0x02, req);\r
-}\r
-\r
-void N6110_ReplyReadCellBroadcast(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i, tmp;\r
-  unsigned char output[160];\r
-  \r
-  CurrentCBMessage->Channel = MessageBuffer[7];\r
-  CurrentCBMessage->New = true;\r
-  tmp=GSM_UnpackEightBitsToSeven(0, MessageBuffer[9], MessageBuffer[9], MessageBuffer+10, output);\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: CB received.\n")); fflush (stdout);\r
-\r
-  fprintf(stdout, _("Message: channel number %i\n"),MessageBuffer[7]);\r
-\r
-  fflush (stdout);\r
-\r
-  for (i=0; i<tmp;i++) {\r
-    fprintf(stdout, "%c", DecodeWithDefaultAlphabet(output[i]));\r
-  }\r
-\r
-  fprintf(stdout, "\n");\r
-#endif\r
-   \r
-  for (i=0; i<tmp; i++) {\r
-    CurrentCBMessage->Message[i] = DecodeWithDefaultAlphabet(output[i]);\r
-  }\r
-  CurrentCBMessage->Message[i]=0;\r
-}\r
-\r
-GSM_Error N6110_ReadCellBroadcast(GSM_CBMessage *Message)\r
-{\r
-#ifdef DEBUG\r
-   fprintf(stdout,"Reading CB\n");\r
-#endif\r
-\r
-  if (CurrentCBMessage != NULL) \r
-  {\r
-    if (CurrentCBMessage->New == true)\r
-    {\r
-#ifdef DEBUG\r
-  fprintf(stdout,"New CB received\n");\r
-#endif\r
-      Message->Channel = CurrentCBMessage->Channel;\r
-      strcpy(Message->Message,CurrentCBMessage->Message);\r
-      CurrentCBMessage->New = false;\r
-      return (GE_NONE);\r
-    }\r
-  }\r
-  return (GE_NONEWCBRECEIVED);\r
-}\r
-\r
-int N6110_MakeCallerGroupFrame(unsigned char *req,GSM_Bitmap Bitmap)\r
-{\r
-  int count=0;\r
-\r
-  req[count++]=Bitmap.number;\r
-  req[count++]=strlen(Bitmap.text);\r
-  memcpy(req+count,Bitmap.text,req[count-1]);\r
-  count+=req[count-1];\r
-  req[count++]=Bitmap.ringtone;\r
-\r
-  /* Setting for graphic:\r
-     0x00 - Off\r
-     0x01 - On\r
-     0x02 - View Graphics\r
-     0x03 - Send Graphics\r
-     0x04 - Send via IR\r
-     You can even set it higher but Nokia phones (my\r
-     6110 at least) will not show you the name of this\r
-     item in menu ;-)) Nokia is really joking here. */\r
-  if (Bitmap.enabled) req[count++]=0x01;\r
-                 else req[count++]=0x00;\r
-\r
-  req[count++]=(Bitmap.size+4)>>8;\r
-  req[count++]=(Bitmap.size+4)%0xff;\r
-  req[count++]=0x00;  /* Future extensions! */\r
-  req[count++]=Bitmap.width;\r
-  req[count++]=Bitmap.height;\r
-  req[count++]=0x01;  /* Just BW */\r
-  memcpy(req+count,Bitmap.bitmap,Bitmap.size);\r
-\r
-  return count+Bitmap.size;\r
-}\r
-\r
-int N6110_MakeOperatorLogoFrame(unsigned char *req,GSM_Bitmap Bitmap)\r
-{\r
-  int count=0;\r
-\r
-  EncodeNetworkCode(req+count, Bitmap.netcode);\r
-  count=count+3;\r
-\r
-  req[count++]=(Bitmap.size+4)>>8;\r
-  req[count++]=(Bitmap.size+4)%0xff;\r
-  req[count++]=0x00;  /* Infofield */\r
-  req[count++]=Bitmap.width;\r
-  req[count++]=Bitmap.height;\r
-  req[count++]=0x01;  /* Just BW */    \r
-  memcpy(req+count,Bitmap.bitmap,Bitmap.size);\r
-\r
-  return count+Bitmap.size;\r
-}\r
-\r
-int N6110_MakeStartupLogoFrame(unsigned char *req,GSM_Bitmap Bitmap)\r
-{\r
-  int count=0;\r
-\r
-  req[count++]=0x01;\r
-  req[count++]=Bitmap.height;\r
-  req[count++]=Bitmap.width;\r
-  memcpy(req+count,Bitmap.bitmap,Bitmap.size);\r
-\r
-  return count+Bitmap.size;\r
-}\r
-\r
-/* Set a bitmap or welcome-note */\r
-GSM_Error N6110_SetBitmap(GSM_Bitmap *Bitmap) {\r
-\r
-  unsigned char req[600] = { N6110_FRAME_HEADER };\r
-  u16 count=3;\r
-  u8 textlen;\r
-  \r
-  int timeout=50;\r
 
-  /* Direct uploading variables */
-  GSM_MultiSMSMessage SMS;
-  unsigned char buffer[1000] = {0x0c,0x01};
-  GSM_NetworkInfo NetworkInfo;
+#endif /* UCLINUX */
 
-  GSM_Error error;\r
-  /* Uploading with preview */
-  if (Bitmap->number==255 &&
-     (Bitmap->type==GSM_OperatorLogo || Bitmap->type==GSM_CallerLogo)) {
-    GSM_SaveBitmapToSMS(&SMS,Bitmap,false,false);
-    memcpy(buffer+2,SMS.SMS[0].UDH,SMS.SMS[0].UDH[0]+1);
+static void N6110_ReplyGetMemoryStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
 
-    memcpy(buffer+2+SMS.SMS[0].UDH[0]+1,SMS.SMS[0].MessageText,SMS.SMS[0].Length);
+  switch (MessageBuffer[3]) {
 
-    buffer[2+SMS.SMS[0].UDH[0]+1+SMS.SMS[0].Length]=0x00;
+  case 0x08:
 
-    Protocol->SendMessage(2+SMS.SMS[0].UDH[0]+1+SMS.SMS[0].Length+1, 0x12, buffer);
+#ifdef DEBUG
+    fprintf(stdout, _("Message: Memory status received:\n"));
 
-    GSM->GetNetworkInfo(&NetworkInfo); //need to make something
-    return GE_NONE; //no answer from phone
-  }
\r
-  CurrentSetBitmapError = GE_BUSY;  \r
-  \r
-  switch (Bitmap->type) {\r
-  case GSM_WelcomeNoteText:\r
-  case GSM_DealerNoteText:\r
-    req[count++]=0x18;\r
-    req[count++]=0x01; /* Only one block */\r
-\r
-    if (Bitmap->type==GSM_WelcomeNoteText)\r
-      req[count++]=0x02; /* Welcome text */\r
-    else\r
-      req[count++]=0x03; /* Dealer Welcome Note */\r
-\r
-    textlen=strlen(Bitmap->text);\r
-    req[count++]=textlen;\r
-    memcpy(req+count,Bitmap->text,textlen);\r
-      \r
-    count+=textlen;\r
-\r
-    Protocol->SendMessage(count, 0x05, req);\r
-    \r
-    break;\r
-\r
-  case GSM_StartupLogo:\r
-    if (Bitmap->number==0) {\r
-\r
-      /* For 33xx we first set animated logo to default */\r
-      if (GetModelFeature (FN_STARTUP)==F_STANIM) {\r
-        error=N6110_SetProfileFeature(0, 0x29, Bitmap->number);\r
-        if (error!=GE_NONE) return error;\r
-      }\r
-\r
-      req[count++]=0x18;\r
-      req[count++]=0x01; /* Only one block */\r
-      count=count+N6110_MakeStartupLogoFrame(req+5,*Bitmap); \r
-      Protocol->SendMessage(count, 0x05, req);\r
-    } else {\r
-      return N6110_SetProfileFeature(0, 0x29, Bitmap->number);\r
-    }\r
-    break;\r
-\r
-  case GSM_OperatorLogo:\r
-    req[count++]=0x30;  /* Store Op Logo */\r
-    req[count++]=0x01;  /* Location */\r
-    count=count+N6110_MakeOperatorLogoFrame(req+5,*Bitmap); 
-    Protocol->SendMessage(count, 0x05, req);\r
-    break;\r
-\r
-  case GSM_CallerLogo:\r
-    req[count++]=0x13;\r
-    count=count+N6110_MakeCallerGroupFrame(req+4,*Bitmap);\r
-    Protocol->SendMessage(count, 0x03, req);\r
-    break;\r
-\r
-  case GSM_PictureImage:\r
-    req[count++]=0x03;\r
-    req[count++]=Bitmap->number;\r
-    if (strcmp(Bitmap->Sender,"")) {\r
-       req[count]=GSM_PackSemiOctetNumber(Bitmap->Sender, req+count+1,true);\r
-\r
-       /* Convert number of semioctets to number of chars and add count */\r
-       textlen=req[count];\r
-       if (textlen % 2) textlen++;\r
-       count+=textlen / 2 + 1;\r
-\r
-       count++;\r
-    } else {\r
-      req[count++]=0x00;\r
-      req[count++]=0x00;\r
-    }\r
-    req[count++]=0x00;\r
-    req[count++]=strlen(Bitmap->text);\r
-    memcpy(req+count,Bitmap->text,strlen(Bitmap->text));\r
-    count+=strlen(Bitmap->text);\r
-    req[count++]=0x00;\r
-    req[count++]=Bitmap->width;\r
-    req[count++]=Bitmap->height;\r
-    req[count++]=0x01;\r
-    memcpy(req+count,Bitmap->bitmap,Bitmap->size);\r
-    Protocol->SendMessage(count+Bitmap->size, 0x47, req);\r
-    break;\r
-\r
-  case GSM_7110OperatorLogo:\r
-  case GSM_7110StartupLogo:\r
-  case GSM_6210StartupLogo:\r
-    return GE_NOTSUPPORTED;\r
-\r
-  case GSM_None:\r
-    return GE_NONE;\r
-  }\r
-\r
-  /* Wait for timeout or other error. */\r
-  while (timeout != 0 && CurrentSetBitmapError == GE_BUSY ) {\r
-          \r
-    if (--timeout == 0)\r
-      return (GE_TIMEOUT);\r
-                    \r
-    usleep (100000);\r
-  }\r
-\r
-  return CurrentSetBitmapError;\r
-}\r
-\r
-/* Get a bitmap from the phone */\r
-GSM_Error N6110_GetBitmap(GSM_Bitmap *Bitmap) {\r
-\r
-  unsigned char req[10] = { N6110_FRAME_HEADER };\r
-  u8 count=3;\r
-  \r
-  int timeout=100;\r
-  \r
-  CurrentGetBitmap=Bitmap; \r
-  CurrentGetBitmapError = GE_BUSY;  \r
-  \r
-  switch (CurrentGetBitmap->type) {\r
-  case GSM_StartupLogo:\r
-  case GSM_WelcomeNoteText:\r
-  case GSM_DealerNoteText:\r
-    req[count++]=0x16;\r
-    Protocol->SendMessage(count, 0x05, req);\r
-    break;\r
-  case GSM_OperatorLogo:\r
-    req[count++]=0x33;\r
-    req[count++]=0x01; /* Location 1 */\r
-    Protocol->SendMessage(count, 0x05, req);\r
-    break;\r
-  case GSM_CallerLogo:\r
-    req[count++]=0x10;\r
-    req[count++]=Bitmap->number;\r
-    Protocol->SendMessage(count, 0x03, req);\r
-    break;\r
-  case GSM_PictureImage:\r
-    req[count++]=0x01;\r
-    req[count++]=Bitmap->number;\r
-    Protocol->SendMessage(count, 0x47, req);\r
-    break;\r
-  case GSM_7110OperatorLogo:\r
-  case GSM_7110StartupLogo:\r
-  case GSM_6210StartupLogo:\r
-  default:\r
-    return GE_NOTSUPPORTED;\r
-  }\r
-\r
-  /* Wait for timeout or other error. */\r
-  while (timeout != 0 && CurrentGetBitmapError == GE_BUSY ) {\r
-          \r
-    if (--timeout == 0)\r
-      return (GE_TIMEOUT);\r
-                    \r
-    usleep (100000);\r
-  }\r
-\r
-  CurrentGetBitmap=NULL;\r
-\r
-  return CurrentGetBitmapError;\r
-}\r
-\r
-void N6110_ReplySetRingtone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[3]) {\r
-\r
-  /* Set ringtone OK */\r
-  case 0x37:       \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Ringtone set OK!\n"));\r
-#endif  \r
-    CurrentRingtoneError=GE_NONE; \r
-    break;      \r
-\r
-  /* Set ringtone error */\r
-  case 0x38:       \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Ringtone setting error !\n"));\r
-#endif  \r
-    CurrentRingtoneError=GE_NOTSUPPORTED; \r
-    break;      \r
-  }\r
-}\r
-\r
-GSM_Error N6110_SetRingTone(GSM_Ringtone *ringtone, int *maxlength)\r
-{\r
-  \r
-  char req[FB61_MAX_RINGTONE_FRAME_LENGTH+10] =\r
-      {N6110_FRAME_HEADER,\r
-       0x36,\r
-       0x00,  /* Location */\r
-       0x00,0x78};\r
-\r
-  int size=FB61_MAX_RINGTONE_FRAME_LENGTH;\r
-  /* Variables for preview uploading */
-  unsigned char buffer[FB61_MAX_RINGTONE_FRAME_LENGTH+50];
-  unsigned char buffer2[20];
-  GSM_NetworkInfo NetworkInfo;
+    fprintf(stdout, _("   Memory Type: %s\n"), N6110_MemoryType_String[MessageBuffer[4]]);
+    fprintf(stdout, _("   Used: %d\n"), MessageBuffer[6]);
+    fprintf(stdout, _("   Free: %d\n"), MessageBuffer[5]);
+#endif /* DEBUG */
 
-  /* Setting ringtone with preview */
-  if (ringtone->location==255) {
-    buffer[0]=0x0c;
-    buffer[1]=0x01;
-    EncodeUDHHeader(buffer2, GSM_RingtoneUDH);
-    memcpy(buffer+2,buffer2,buffer2[0]+1); //copying UDH
-    *maxlength=GSM_PackRingtone(ringtone, buffer+2+buffer2[0]+1, &size); //packing ringtone
-    Protocol->SendMessage(2+buffer2[0]+1+size, 0x12, buffer); //sending frame
-    GSM->GetNetworkInfo(&NetworkInfo); //need to make something
-    sleep(1);
-    return GE_NONE; //no answer from phone
-  }
-  \r
-  *maxlength=GSM_PackRingtone(ringtone, req+7, &size);\r
-\r
-  req[4]=ringtone->location-1;\r
-\r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentRingtoneError, (size+7), 0x05, req);\r
-}\r
-\r
-void N6110_ReplyGetBinRingtone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i;\r
-  \r
-  switch (MessageBuffer[4]) {\r
-    case 0x00: /* location supported. We have ringtone */\r
-\r
-      /* Binary format used in N6150 */\r
-      if (MessageBuffer[5]==0x0c && MessageBuffer[6]==0x01 && MessageBuffer[7]==0x2c) {\r
-#ifdef DEBUG\r
-        fprintf(stdout,_("Message: ringtone \""));\r
-#endif      \r
-\r
-        /* Copying name */\r
-        i=8;\r
-        while (true) {\r
-#ifdef DEBUG\r
-          if (MessageBuffer[i]!=0)\r
-            fprintf(stdout,_("%c"),MessageBuffer[i]);\r
-#endif\r
-          CurrentGetBinRingtone->name[i-8]=MessageBuffer[i];\r
-          if (MessageBuffer[i]==0) break;\r
-          i++;\r
-        }\r
-\r
-#ifdef DEBUG    \r
-        fprintf(stdout,_("\" received from location %i\n"),MessageBuffer[3]+1);\r
-#endif\r
-      \r
-        /* Looking for end */\r
-        i=0;\r
-       while (true) {\r
-         if (MessageBuffer[i]==0x07 && MessageBuffer[i+1]==0x0b) {\r
-           i=i+2;break;\r
-         }\r
-         if (MessageBuffer[i]==0x0e && MessageBuffer[i+1]==0x0b) {\r
-           i=i+2;break;\r
-         }\r
-         i++;\r
-          if (i==MessageLength) break;\r
-       }\r
-         \r
-        /* Copying frame */\r
-        memcpy(CurrentGetBinRingtone->frame,MessageBuffer+3,i-3);\r
-        CurrentGetBinRingtone->length=i-3;\r
-      \r
-        CurrentBinRingtoneError=GE_NONE;\r
-        break;\r
-      }\r
-         \r
-      /* Binary format used in N3210 */\r
-      if (MessageBuffer[5]==0x10 && MessageBuffer[6]==0x01 && MessageBuffer[7]==0x2c) {      \r
-\r
-#ifdef DEBUG\r
-        fprintf(stdout,_("Message: ringtone \""));\r
-#endif      \r
-\r
-        /* Copying name */\r
-        i=8;\r
-        while (true) {\r
-#ifdef DEBUG\r
-          if (MessageBuffer[i]!=0)\r
-            fprintf(stdout,_("%c"),MessageBuffer[i]);\r
-#endif\r
-          CurrentGetBinRingtone->name[i-8]=MessageBuffer[i];\r
-          if (MessageBuffer[i]==0) break;\r
-          i++;\r
-        }\r
-\r
-#ifdef DEBUG    \r
-        fprintf(stdout,_("\" received from location %i\n"),MessageBuffer[3]+1);\r
-#endif\r
-\r
-        /* Here changes to get full compatibility with binary format used in N6150 */\r
-        MessageBuffer[3]=0;\r
-        MessageBuffer[4]=0;\r
-        MessageBuffer[5]=0x0c;\r
-        MessageBuffer[6]=0x01;\r
-        MessageBuffer[7]=0x2c;\r
-\r
-        /* Looking for end */\r
-        i=0;\r
-        while (true) {\r
-          if (MessageBuffer[i]==0x07 && MessageBuffer[i+1]==0x0b) {\r
-           i=i+2;break;\r
-         }\r
-         if (MessageBuffer[i]==0x0e && MessageBuffer[i+1]==0x0b) {\r
-           i=i+2;break;\r
-         }\r
-         i++;\r
-         if (i==MessageLength) break;\r
-        }\r
-         \r
-       /* Copying frame */\r
-        memcpy(CurrentGetBinRingtone->frame,MessageBuffer+3,i-3);\r
-\r
-        CurrentGetBinRingtone->length=i-3;\r
-           \r
-        CurrentBinRingtoneError=GE_NONE;         \r
-       break;\r
-      }\r
-\r
-      /* Copying frame */\r
-      memcpy(CurrentGetBinRingtone->frame,MessageBuffer,MessageLength);\r
-\r
-      CurrentGetBinRingtone->length=MessageLength;\r
-\r
-#ifdef DEBUG    \r
-      fprintf(stdout,_("Message: unknown binary format for ringtone received from location %i\n"),MessageBuffer[3]+1);\r
-#endif\r
-      CurrentBinRingtoneError=GE_UNKNOWNMODEL;\r
-      break;\r
-\r
-    default:\r
-\r
-#ifdef DEBUG\r
-      fprintf(stdout,_("Message: Phone doesn't support downloaded ringtones at location %i\n"),MessageBuffer[3]+1);\r
-#endif\r
-\r
-      CurrentBinRingtoneError=GE_INVALIDRINGLOCATION;  \r
-  }\r
-}\r
-\r
-GSM_Error N6110_GetBinRingTone(GSM_BinRingtone *ringtone)\r
-{\r
-  unsigned char req[] = { 0x00,0x01,0x9e,\r
-                          0x00 }; //location\r
-\r
-  GSM_Error error;\r
-  \r
-  CurrentGetBinRingtone=ringtone;\r
-  \r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-\r
-  req[3]=ringtone->location-1;\r
-  \r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentBinRingtoneError, 4, 0x40, req);\r
-}\r
-\r
-void N6110_ReplySetBinRingtone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch (MessageBuffer[4]) {\r
-    case 0x00: /* location supported. We set ringtone */\r
-#ifdef DEBUG\r
-      fprintf(stdout,_("Message: downloaded ringtone set at location %i\n"),MessageBuffer[3]+1);\r
-#endif\r
-      CurrentBinRingtoneError=GE_NONE;\r
-      break;\r
-\r
-    default:\r
-#ifdef DEBUG\r
-      fprintf(stdout,_("Message: Phone doesn't support downloaded ringtones at location %i\n"),MessageBuffer[3]+1);\r
-#endif\r
-      CurrentBinRingtoneError=GE_NOTSUPPORTED;   \r
-      break;\r
-  }\r
-}\r
-\r
-GSM_Error N6110_SetBinRingTone(GSM_BinRingtone *ringtone)\r
-{\r
-  unsigned char req[1000] = { 0x00,0x01,0xa0};\r
-\r
-  GSM_Error error;\r
-\r
-  GSM_BinRingtone ring;\r
-\r
-  /* Must be sure, that can upload ringtone to this phone */\r
-  ring.location=ringtone->location;\r
-  error=N6110_GetBinRingTone(&ring);\r
-  if (error!=GE_NONE) return error;\r
-    \r
-  error=N6110_EnableExtendedCommands(0x01);\r
-  if (error!=GE_NONE) return error;\r
-  \r
-  memcpy(req+3,ringtone->frame,ringtone->length);\r
-\r
-  req[3]=ringtone->location-1;\r
-  \r
-  return NULL_SendMessageSequence\r
-    (50, &CurrentBinRingtoneError, ringtone->length+3, 0x40, req);\r
-}\r
-\r
-GSM_Error N6110_Reset(unsigned char type)\r
-{  \r
-  return N6110_EnableExtendedCommands(type);\r
-}\r
-\r
-void N6110_Dispatch0x01Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int tmp, count;\r
-         \r
-  switch (MessageBuffer[3]) {\r
-\r
-  /* Unknown message - it has been seen after the 0x07 message (call\r
-     answered). Probably it has similar meaning. If you can solve\r
-     this - just mail me. Pavel Janík ml.\r
-\r
-     The message looks like this:\r
-\r
-     Msg Destination: PC\r
-     Msg Source: Phone\r
-     Msg Type: 01\r
-     Msg Unknown: 00\r
-     Msg Len: 0e\r
-\r
-     Phone: [01 ][08 ][00 ] is the header of the frame\r
-\r
-     [03 ] is the call message subtype\r
-\r
-     [05 ] is the call sequence number\r
-\r
-     [05 ] unknown \r
-\r
-     [00 ][01 ][03 ][02 ][91][00] are unknown but has been\r
-     seen in the Incoming call message (just after the\r
-     caller's name from the phonebook). But never change\r
-     between phone calls :-(\r
-  */\r
-\r
-  /* This may mean sequence number of 'just made' call - CK */\r
-  case 0x02:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Call message, type 0x02:"));\r
-    fprintf(stdout, _("   Exact meaning not known yet, sorry :-(\n"));\r
-#endif /* DEBUG */\r
-\r
-    break;\r
-\r
-  /* Possibly call OK */\r
-  /* JD: I think that this means "call in progress" (incomming or outgoing) */\r
-  case 0x03:\r
-    \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Call message, type 0x03:"));\r
-    fprintf(stdout, _("   Sequence nr. of the call: %d\n"), MessageBuffer[4]);\r
-    fprintf(stdout, _("   Exact meaning not known yet, sorry :-(\n"));\r
-#endif /* DEBUG */\r
-    \r
-    CurrentCallSequenceNumber=MessageBuffer[4];\r
-    CurrentIncomingCall[0]='D';\r
-    if (CurrentCallPassup) CurrentCallPassup('D');\r
-\r
-    break;\r
-\r
-  /* Remote end has gone away before you answer the call.  Probably your\r
-     mother-in-law or banker (which is worse?) ... */\r
-  case 0x04:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Remote end hang up.\n"));\r
-    fprintf(stdout, _("   Sequence nr. of the call: %d, error: %i"), MessageBuffer[4],MessageBuffer[6]);\r
-\r
-    switch (MessageBuffer[6]) {\r
-      case 28: fprintf(stdout,_(" (info \"Invalid phone number\")"));break;\r
-      case 34: fprintf(stdout,_(" (info \"Network busy\")"));break;\r
-      case 42: fprintf(stdout,_(" (info \"Network busy\")"));break;\r
-      case 47: fprintf(stdout,_(" (info \"Error in connection\")"));break;\r
-      case 50: fprintf(stdout,_(" (info \"Check operator services\")"));break;       case 76: fprintf(stdout,_(" (info \"Check operator services\")"));break;\r
-      case 111: fprintf(stdout,_(" (info \"Error in connection\")"));break;\r
-    }\r
-      \r
-    fprintf(stdout,_("\n   For more details with errors see netmonitor manual (test 39) on www.marcin-wiacek.topnet.pl"));\r
-    fprintf(stdout,_("\n   If know their meaning, GSM specs decribing them, contact with me on marcin-wiacek@topnet.pl. THX\n"));\r
-#endif /* DEBUG */\r
-\r
-    CurrentIncomingCall[0] = ' ';\r
-    if (CurrentCallPassup) CurrentCallPassup(' ');\r
-\r
-    break;\r
-\r
-  /* Incoming call alert */\r
-  case 0x05:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Incoming call alert:\n"));\r
-\r
-    /* We can have more then one call ringing - we can distinguish between\r
-       them */\r
-\r
-    fprintf(stdout, _("   Sequence nr. of the call: %d\n"), MessageBuffer[4]);\r
-    fprintf(stdout, _("   Number: "));\r
-\r
-    count=MessageBuffer[6];\r
-\r
-    for (tmp=0; tmp <count; tmp++)\r
-      fprintf(stdout, "%c", MessageBuffer[7+tmp]);\r
-\r
-    fprintf(stdout, "\n");\r
-\r
-    fprintf(stdout, _("   Name: "));\r
-\r
-    for (tmp=0; tmp <MessageBuffer[7+count]; tmp++)\r
-      fprintf(stdout, "%c", MessageBuffer[8+count+tmp]);\r
-\r
-    fprintf(stdout, "\n");\r
-#endif /* DEBUG */\r
-\r
-    count=MessageBuffer[6];\r
-\r
-    CurrentIncomingCall[0] = 0;\r
-    for (tmp=0; tmp <count; tmp++)\r
-      sprintf(CurrentIncomingCall, "%s%c", CurrentIncomingCall, MessageBuffer[7+tmp]);\r
-\r
-    break;\r
-\r
-  /* Call answered. Probably your girlfriend...*/\r
-  case 0x07:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Call answered.\n"));\r
-    fprintf(stdout, _("   Sequence nr. of the call: %d\n"), MessageBuffer[4]);\r
-#endif /* DEBUG */\r
-\r
-    break;\r
-\r
-  /* Call ended. Girlfriend is girlfriend, but time is money :-) */\r
-  case 0x09:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Call ended by your phone.\n"));\r
-    fprintf(stdout, _("   Sequence nr. of the call: %d\n"), MessageBuffer[4]);\r
-#endif /* DEBUG */\r
-\r
-    break;\r
-\r
-  /* This message has been seen with the message of subtype 0x09\r
-     after I hang the call.\r
-\r
-  Msg Destination: PC\r
-  Msg Source: Phone\r
-  Msg Type: 01 \r
-  Msg Unknown: 00\r
-  Msg Len: 08\r
-  Phone: [01 ][08 ][00 ][0a ][04 ][87 ][01 ][42B][1a ][c2 ]\r
-\r
-  What is the meaning of 87? Can you spell some magic light into\r
-  this issue?\r
-\r
-  */\r
-\r
-  /* Probably means call over - CK */\r
-  case 0x0a:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Call message, type 0x0a:"));\r
-    fprintf(stdout, _("   Sequence nr. of the call: %d\n"), MessageBuffer[4]);\r
-    fprintf(stdout, _("   Exact meaning not known yet, sorry :-(\n"));\r
-#endif /* DEBUG */\r
-\r
-    CurrentIncomingCall[0] = ' ';\r
-    if (CurrentCallPassup) CurrentCallPassup(' ');\r
-\r
-    break;\r
-\r
-  case 0x40:\r
-\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Answer for send DTMF or dial voice command\n"));\r
-#endif\r
-\r
-    if (CurrentSendDTMFError!=GE_NONE) CurrentSendDTMFError=GE_NONE;\r
-\r
-    if (CurrentDialVoiceError!=GE_NONE) CurrentDialVoiceError=GE_NONE;\r
-\r
-    break;\r
-     \r
-  default:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Unknown message of type 0x01\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg\n",false);\r
-\r
-    break;     /* Visual C Don't like empty cases */\r
-  }\r
-}\r
-\r
-void N6110_Dispatch0x03Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int tmp, count;\r
-    \r
-  switch (MessageBuffer[3]) {\r
-\r
-  case 0x04:\r
-\r
-    /* AFAIK, this frame isn't used anywhere - it's rather for testing :-) */\r
-    /* If you want see, if it works with your phone make something like that: */\r
-\r
-    /* unsigned char connect5[] = {N6110_FRAME_HEADER, 0x03}; */\r
-    /* Protocol->SendMessage(4, 0x04, connect5); */\r
-\r
-    /*                                        Marcin-Wiacek@TopNet.PL */\r
-    \r
-#ifdef WIN32\r
-    sprintf(Current_IMEI, "%s", MessageBuffer+5);\r
-    sprintf(Current_Model, "%s", MessageBuffer+21);\r
-    sprintf(Current_Revision, "SW%s, HW%s", MessageBuffer+41, MessageBuffer+35);\r
-#else\r
-    snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+5);\r
-    snprintf(Current_Model, GSM_MAX_MODEL_LENGTH, "%s", MessageBuffer+21);\r
-    snprintf(Current_Revision, GSM_MAX_REVISION_LENGTH, "SW%s, HW%s", MessageBuffer+41, MessageBuffer+35);\r
-#endif\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Mobile phone identification received:\n"));\r
-    fprintf(stdout, _("   IMEI: %s\n"), Current_IMEI);\r
-    fprintf(stdout, _("   Model: %s\n"), Current_Model);\r
-    fprintf(stdout, _("   Production Code: %s\n"), MessageBuffer+27);\r
-    fprintf(stdout, _("   HW: %s\n"), MessageBuffer+35);\r
-    fprintf(stdout, _("   Firmware: %s\n"), MessageBuffer+41);\r
-#endif /* DEBUG */\r
-\r
-    break;\r
-\r
-  /* Get group data */    \r
-  /* [ID],[name_len],[name].,[ringtone],[graphicon],[lenhi],[lenlo],[bitmap] */\r
-  case 0x11:   \r
\r
-    if (CurrentGetBitmap!=NULL) {\r
-      if (CurrentGetBitmap->number==MessageBuffer[4]) {\r
-        count=MessageBuffer[5];\r
-        memcpy(CurrentGetBitmap->text,MessageBuffer+6,count);\r
-        CurrentGetBitmap->text[count]=0;\r
-\r
-#ifdef DEBUG   \r
-       fprintf(stdout, _("Message: Caller group datas\n"));\r
-       fprintf(stdout, _("Caller group name: %s\n"),CurrentGetBitmap->text);\r
-#endif /* DEBUG */\r
-\r
-       count+=6;\r
-\r
-       CurrentGetBitmap->ringtone=MessageBuffer[count++];\r
-#ifdef DEBUG   \r
-        fprintf(stdout, _("Caller group ringtone ID: %i"),CurrentGetBitmap->ringtone);\r
-        if (CurrentGetBitmap->ringtone==16) fprintf(stdout,_(" (default)"));\r
-       fprintf(stdout,_("\n"));\r
-#endif /* DEBUG */\r
-\r
-       CurrentGetBitmap->enabled=(MessageBuffer[count++]==1);\r
-#ifdef DEBUG   \r
-       fprintf(stdout, _("Caller group logo "));\r
-       if (CurrentGetBitmap->enabled)\r
-         fprintf(stdout, _("enabled \n"));\r
-       else\r
-         fprintf(stdout, _("disabled \n"));\r
-#endif /* DEBUG */     \r
-\r
-       CurrentGetBitmap->size=MessageBuffer[count++]<<8;\r
-       CurrentGetBitmap->size+=MessageBuffer[count++];\r
-#ifdef DEBUG   \r
-       fprintf(stdout, _("Bitmap size=%i\n"),CurrentGetBitmap->size);\r
-#endif /* DEBUG */\r
-\r
-       count++;\r
-       CurrentGetBitmap->width=MessageBuffer[count++];\r
-        CurrentGetBitmap->height=MessageBuffer[count++];\r
-       count++;\r
-       tmp=CurrentGetBitmap->height*CurrentGetBitmap->width/8;\r
-       if (CurrentGetBitmap->size>tmp) CurrentGetBitmap->size=tmp;\r
-       memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count,CurrentGetBitmap->size);\r
-       CurrentGetBitmapError=GE_NONE;\r
-      } else {\r
-#ifdef DEBUG   \r
-       fprintf(stdout, _("Message: Caller group datas received, but group number does not match (%i is not %i)\n"),MessageBuffer[4],CurrentGetBitmap->number);\r
-#endif\r
-      }\r
-    } else {\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Caller group data received but not requested!\n"));\r
-#endif\r
-    }\r
-    break;\r
-\r
-  /* Get group data error */\r
-  case 0x12:   \r
-      \r
-    CurrentGetBitmapError=GE_UNKNOWN;   \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Error attempting to get caller group data.\n"));\r
-#endif   \r
-    break;\r
-\r
-  /* Set group data OK */      \r
-  case 0x14:   \r
-      \r
-    CurrentSetBitmapError=GE_NONE;      \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Caller group data set correctly.\n"));\r
-#endif\r
-    break;\r
-\r
-  /* Set group data error */\r
-  case 0x15:   \r
-      \r
-    CurrentSetBitmapError=GE_UNKNOWN;      \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Error attempting to set caller group data\n"));\r
-#endif\r
-    break;  \r
-  \r
-  default:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Unknown message of type 0x03\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg\n",false);\r
-\r
-    break;     /* Visual C Don't like empty cases */\r
-  }\r
-}\r
-\r
-void N6110_Dispatch0x05Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int tmp, count, length;\r
-  bool issupported;\r
+    CurrentMemoryStatus->Used = MessageBuffer[6];
+    CurrentMemoryStatus->Free = MessageBuffer[5];
+    CurrentMemoryStatusError = GE_NONE;
 
-#ifdef DEBUG
-  int i;
-#endif
+    break;
 
-  switch (MessageBuffer[3]) {\r
-\r
-  /* Startup Logo */\r
-  case 0x17:  \r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Startup Logo, welcome note and dealer welcome note received.\n"));\r
-#endif\r
-\r
-    if (CurrentGetBitmap!=NULL) {\r
-       \r
-      issupported=false;\r
-       \r
-      count=5;\r
-       \r
-      for (tmp=0;tmp<MessageBuffer[4];tmp++){\r
-        switch (MessageBuffer[count++]) {\r
-        case 0x01:\r
-          if (CurrentGetBitmap->type==GSM_StartupLogo) {\r
-            CurrentGetBitmap->height=MessageBuffer[count++];\r
-           CurrentGetBitmap->width=MessageBuffer[count++];\r
-           CurrentGetBitmap->size=CurrentGetBitmap->height*CurrentGetBitmap->width/8;\r
-           length=CurrentGetBitmap->size;\r
-           memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count,length);\r
-          } else {\r
-           length=MessageBuffer[count++];\r
-           length=length*MessageBuffer[count++]/8;\r
-         }\r
-         count+=length;\r
-#ifdef DEBUG\r
-         fprintf(stdout, _("Startup logo supported - "));\r
-         if (length!=0) { fprintf(stdout, _("currently set\n"));   }\r
-                    else { fprintf(stdout, _("currently empty\n")); }\r
-#endif\r
-          if (CurrentGetBitmap->type==GSM_StartupLogo) issupported=true;\r
-         break;\r
-       case 0x02:\r
-         length=MessageBuffer[count];\r
-         if (CurrentGetBitmap->type==GSM_WelcomeNoteText) {\r
-            memcpy(CurrentGetBitmap->text,MessageBuffer+count+1,length);\r
-           CurrentGetBitmap->text[length]=0;\r
-         }\r
-#ifdef DEBUG\r
-          fprintf(stdout, _("Startup Text supported - "));\r
-          if (length!=0)\r
-         {\r
-           fprintf(stdout, _("currently set to \""));\r
-           for (i=0;i<length;i++) fprintf(stdout, _("%c"),MessageBuffer[count+1+i]);\r
-           fprintf(stdout, _("\"\n"));\r
-         } else {\r
-            fprintf(stdout, _("currently empty\n"));\r
-         }\r
-#endif\r
-         count+=length+1;\r
-          if (CurrentGetBitmap->type==GSM_WelcomeNoteText) issupported=true;\r
-         break;\r
-       case 0x03:\r
-         length=MessageBuffer[count];\r
-         if (CurrentGetBitmap->type==GSM_DealerNoteText) {\r
-            memcpy(CurrentGetBitmap->text,MessageBuffer+count+1,length);\r
-           CurrentGetBitmap->text[length]=0;\r
-         }\r
-#ifdef DEBUG\r
-         fprintf(stdout, _("Dealer Welcome supported - "));\r
-         if (length!=0)\r
-         {\r
-           fprintf(stdout, _("currently set to \""));\r
-           for (i=0;i<length;i++) fprintf(stdout, _("%c"),MessageBuffer[count+1+i]);\r
-           fprintf(stdout, _("\"\n"));\r
-         } else {\r
-            fprintf(stdout, _("currently empty\n"));\r
-         }\r
-#endif\r
-         count+=length+1;\r
-          if (CurrentGetBitmap->type==GSM_DealerNoteText) issupported=true;\r
-         break;\r
-        }\r
-      }\r
-      if (issupported) CurrentGetBitmapError=GE_NONE;\r
-                  else CurrentGetBitmapError=GE_NOTSUPPORTED;\r
-    } else {\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Startup logo received but not requested!\n"));\r
-#endif\r
-    }\r
-    break;\r
-\r
-  /* Set startup OK */\r
-  case 0x19:   \r
-    \r
-    CurrentSetBitmapError=GE_NONE;    \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Startup logo, welcome note or dealer welcome note correctly set.\n"));\r
-#endif  \r
-    break;      \r
-\r
-  /* Set Operator Logo OK */\r
-  case 0x31:   \r
-      \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Operator logo correctly set.\n"));\r
-#endif  \r
-\r
-    CurrentSetBitmapError=GE_NONE;      \r
-    break;\r
-\r
-  /* Set Operator Logo Error */      \r
-  case 0x32:  \r
-      \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Error setting operator logo!\n"));\r
-#endif\r
-\r
-    CurrentSetBitmapError=GE_UNKNOWN;        \r
-    break;\r
-\r
-  /* Operator Logo */\r
-  /* [location],[netcode x 3],[lenhi],[lenlo],[bitmap] */ \r
-  case 0x34:\r
\r
-    if (CurrentGetBitmap!=NULL) {\r
-\r
-      count=5;  /* Location ignored. */\r
-\r
-      DecodeNetworkCode(MessageBuffer+count, CurrentGetBitmap->netcode);
-      count=count+3;
-\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Operator Logo for %s (%s) network received.\n"),\r
-                          CurrentGetBitmap->netcode,\r
-                          GSM_GetNetworkName(CurrentGetBitmap->netcode));\r
-#endif  \r
-\r
-      CurrentGetBitmap->size=MessageBuffer[count++]<<8;\r
-      CurrentGetBitmap->size+=MessageBuffer[count++];\r
-      count++;\r
-      CurrentGetBitmap->width=MessageBuffer[count++];\r
-      CurrentGetBitmap->height=MessageBuffer[count++];\r
-      count++;\r
-      tmp=CurrentGetBitmap->height*CurrentGetBitmap->width/8;\r
-      if (CurrentGetBitmap->size>tmp) CurrentGetBitmap->size=tmp;\r
-      memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count,CurrentGetBitmap->size);\r
-      CurrentGetBitmapError=GE_NONE;\r
-    } else {\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: Operator logo received but not requested!\n"));\r
-#endif\r
-    }\r
-      \r
-    break;\r
-\r
-  /* Get op logo error */      \r
-  case 0x35:\r
-     \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Error getting operator logo!\n"));\r
-#endif  \r
-    CurrentGetBitmapError=GE_UNKNOWN; \r
-    break;\r
-\r
-  default:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Unknown message of type 0x05\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg\n",false);\r
-\r
-    break;\r
-  }\r
-}\r
-\r
-void N6110_Dispatch0x06Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int tmp;\r
-  unsigned char output[160];\r
+  case 0x09:
 
 #ifdef DEBUG
-  int i;
+    switch (MessageBuffer[4]) {
+      case 0x6f:
+       fprintf(stdout, _("Message: Memory status error, phone is probably powered off.\n"));break;
+      case 0x7d:
+       fprintf(stdout, _("Message: Memory status error, memory type not supported by phone model.\n"));break;
+      case 0x8d:
+       fprintf(stdout, _("Message: Memory status error, waiting for security code.\n"));break;
+      default:
+       fprintf(stdout, _("Message: Unknown Memory status error, subtype (MessageBuffer[4]) = %02x\n"),MessageBuffer[4]);break;
+    }
 #endif
-    \r
-  switch (MessageBuffer[3]) {\r
-
-  case 0x05:\r
-\r
-    /* MessageBuffer[3] = 0x05\r
-       MessageBuffer[4] = 0x00\r
-       MessageBuffer[5] = 0x0f\r
-       MessageBuffer[6] = 0x03\r
-       MessageBuffer[7] = length of packed message\r
-\r
-       This is all I have seen - Gerry Anderson */\r
-\r
-    tmp=GSM_UnpackEightBitsToSeven(0, 82, 82, MessageBuffer+8, output);\r
-\r
-#ifdef DEBUG\r
-\r
-    fprintf(stdout, _("Message from Network operator: "));\r
-\r
-    for (i=0; i<tmp; i++)\r
-       fprintf(stdout, "%c", DecodeWithDefaultAlphabet(output[i]));\r
-\r
-    fprintf(stdout, "\n");\r
-\r
-#endif /* DEBUG */\r
-\r
-    break;\r
-\r
-  default:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Unknown message of type 0x06\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg\n",false);\r
-\r
-    break;\r
-  }\r
-}\r
-\r
-void N6110_Dispatch0x09Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-    \r
-  switch (MessageBuffer[3]) {\r
-    \r
-  case 0x80:    \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SIM card login\n"));\r
-#endif\r
-    break;\r
-\r
-  case 0x81:    \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: SIM card logout\n"));\r
-#endif\r
-    break;\r
-      \r
-  default:\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Unknown message of type 0x09.\n"));      \r
-#endif\r
-    AppendLogText("Unknown msg\n",false);\r
-    break;\r
-  }\r
-}\r
-\r
-void N6110_Dispatch0x13Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  switch(MessageBuffer[3]) {\r
-    \r
-  case 0x6a:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Calendar Alarm active\n"));\r
-    fprintf(stdout, _("   Item number: %d\n"), MessageBuffer[4]);\r
-#endif /* DEBUG */\r
-\r
-  default:\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Unknown message of type 0x13.\n"));      \r
-#endif\r
-    AppendLogText("Unknown msg\n",false);\r
-    break;\r
-  }\r
-}\r
-\r
-void N6110_Dispatch0x40Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int i;\r
-  \r
-  switch(MessageBuffer[2]) {\r
-\r
-  case 0x02:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: ACK for simlock opening part 1\n"));\r
-#endif /* DEBUG */\r
-    \r
-    CurrentMagicError=GE_NONE;\r
-    break;\r
-    \r
-  case 0x7c:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Answer for call commands.\n"));\r
-#endif\r
-    \r
-    CurrentDialVoiceError=GE_NONE;      \r
-    break;\r
-      \r
-  case 0x81:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: ACK for simlock opening part 2\n"));\r
-#endif /* DEBUG */\r
-    \r
-    CurrentMagicError=GE_NONE;\r
-    break;\r
-\r
-  case 0x82:\r
-\r
-#ifdef DEBUG\r
-      fprintf(stdout, _("Message: ACK for simlock closing\n"));\r
-#endif /* DEBUG */\r
-    \r
-    CurrentMagicError=GE_NONE;\r
-    break;\r
-\r
-  case 0xd4:\r
-\r
-    switch (MessageBuffer[5]) {\r
-      case 0xa0:\r
-#ifdef DEBUG\r
-        fprintf(stdout,_("Message: EEPROM contest received\n"));\r
-#endif\r
-\r
-        if (MessageBuffer[8]!=0x00) {\r
-          for (i=9;i<MessageLength;i++) {\r
-            fprintf(stdout,_("%c"), MessageBuffer[i]);\r
-        }\r
-\r
-        CurrentMagicError=GE_NONE;\r
-      }\r
-      \r
-      break;\r
-    }\r
-      \r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Unknown message of type 0x40.\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg\n",false);      \r
-    break;\r
-\r
-  case 0xcf:\r
-\r
-    N6110_DisplayTestsInfo(MessageBuffer);\r
-    break;\r
-      \r
-  default:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Unknown message of type 0x40.\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg\n",false);\r
-    break;     /* Visual C Don't like empty cases */\r
-  }\r
-}\r
-\r
-void N6110_Dispatch0x47Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  int count;\r
-  \r
-  switch(MessageBuffer[3]) {\r
-    \r
-  case 0x02:\r
-\r
-    count=5;\r
-    \r
-    if (MessageBuffer[5]!=0) {\r
-      strcpy(CurrentGetBitmap->Sender,GSM_UnpackSemiOctetNumber(MessageBuffer+5,true));\r
-\r
-      while (MessageBuffer[count]!=0) {\r
-        count++;\r
-      }\r
-\r
-      count++;\r
-    } else {\r
-      strcpy(CurrentGetBitmap->Sender,"\0");\r
-\r
-      count+=3;\r
-    }\r
-\r
-    memcpy(CurrentGetBitmap->text,MessageBuffer+count+1,MessageBuffer[count]);\r
-    CurrentGetBitmap->text[MessageBuffer[count]]=0;\r
-\r
-    if (MessageBuffer[count]!=0)\r
-      count+=MessageBuffer[count];\r
-\r
-    count++;\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout,_("Picture Image received, text \"%s\", sender %s\n"),CurrentGetBitmap->text,CurrentGetBitmap->Sender);\r
-#endif\r
-\r
-    CurrentGetBitmap->width=MessageBuffer[count+1];\r
-    CurrentGetBitmap->height=MessageBuffer[count+2]; \r
-    CurrentGetBitmap->size=CurrentGetBitmap->height*CurrentGetBitmap->width/8;\r
-      \r
-    memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count+4,CurrentGetBitmap->size);\r
-      \r
-    CurrentGetBitmapError=GE_NONE;\r
-    break;\r
-\r
-  case 0x04:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout,_("Getting or setting Picture Image - OK\n"));\r
-#endif\r
-    CurrentSetBitmapError=GE_NONE;\r
-    CurrentGetBitmapError=GE_NONE;\r
-    break;     \r
-\r
-  case 0x05:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout,_("Setting Picture Image - invalid location or other error\n"));\r
-#endif\r
-    CurrentSetBitmapError=GE_UNKNOWN;\r
-    break;     \r
-\r
-  case 0x06:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout,_("Getting Picture Image - invalid location or other error\n"));\r
-#endif\r
-    CurrentGetBitmapError=GE_UNKNOWN;\r
-    break;     \r
-\r
-  default:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Unknown message of type 0x47.\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg\n",false);\r
-    break;     /* Visual C Don't like empty cases */\r
-  }\r
-}\r
-\r
-void N6110_DispatchACKMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-  char buffer[50];\r
-  \r
-  sprintf(buffer,"Received ACK %02x %02x\n",MessageBuffer[0],MessageBuffer[1]);\r
-  AppendLog(buffer,strlen(buffer),false);\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("[Received Ack of type %02x, seq: %2x]\n"), MessageBuffer[0],\r
-                                                                MessageBuffer[1]);\r
-#endif /* DEBUG */\r
-  \r
-  CurrentLinkOK = true;\r
-}\r
-\r
-void N6110_Dispatch0xD0Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-   \r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: The phone is powered on - seq 1.\n"));\r
-#endif /* DEBUG */\r
-\r
-}\r
-\r
-/* This function is used for parsing the RLP frame into fields. */\r
-void N6110_RX_HandleRLPMessage(u8 *MessageBuffer)\r
-{\r
-\r
-  RLP_F96Frame frame;\r
-  int count;\r
-  int valid = true;\r
-\r
-  /* We do not need RLP frame parsing to be done when we do not have callback\r
-     specified. */\r
-  if (CurrentRLP_RXCallback == NULL)\r
-    exit;\r
-    \r
-  /* Anybody know the official meaning of the first two bytes?\r
-     Nokia 6150 sends junk frames starting D9 01, and real frames starting\r
-     D9 00. We'd drop the junk frames anyway because the FCS is bad, but\r
-     it's tidier to do it here. We still need to call the callback function\r
-     to give it a chance to handle timeouts and/or transmit a frame */\r
-  if (MessageBuffer[0] == 0xd9 && MessageBuffer[1] == 0x01)\r
-    valid = false;\r
-\r
-  /* Nokia uses 240 bit frame size of RLP frames as per GSM 04.22\r
-     specification, so Header consists of 16 bits (2 bytes). See section 4.1\r
-     of the specification. */\r
-    \r
-  frame.Header[0] = MessageBuffer[2];\r
-  frame.Header[1] = MessageBuffer[3];\r
-\r
-  /* Next 200 bits (25 bytes) contain the Information. We store the\r
-     information in the Data array. */\r
-\r
-  for (count = 0; count < 25; count ++)\r
-    frame.Data[count] = MessageBuffer[4 + count];\r
-\r
-  /* The last 24 bits (3 bytes) contain FCS. */\r
-\r
-  frame.FCS[0] = MessageBuffer[29];\r
-  frame.FCS[1] = MessageBuffer[30];\r
-  frame.FCS[2] = MessageBuffer[31];\r
-\r
-  /* Here we pass the frame down in the input stream. */\r
-  CurrentRLP_RXCallback(valid ? &frame : NULL);\r
-}\r
-\r
-void N6110_Dispatch0xF4Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("Message: The phone is powered on - seq 2.\n"));\r
-#endif /* DEBUG */\r
-\r
-}\r
-\r
-void N6110_ReplyIncomingSMS(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
-\r
-  GSM_SMSMessage NullSMS;\r
-\r
-  switch (MessageBuffer[6]) {\r
-\r
-    case 0x00: NullSMS.Type = GST_SMS; NullSMS.folder = GST_INBOX; break;\r
-    case 0x01: NullSMS.Type = GST_DR;  NullSMS.folder = GST_INBOX; break;\r
-\r
-    /* Is it possible ? */\r
-    case 0x02: NullSMS.Type = GST_SMS; NullSMS.folder = GST_OUTBOX; break;      \r
-    default:   NullSMS.Type = GST_UN;                               break;\r
-  }\r
-\r
-#ifdef DEBUG\r
-  if (NullSMS.Type == GST_DR)\r
-    fprintf(stdout, _("Message: SMS Message (Report) Received\n"));\r
-  else \r
-    fprintf(stdout, _("Message: SMS Message Received\n"));  \r
-#endif /* DEBUG */\r
-\r
-  GSM_DecodeNokiaSMSFrame(&NullSMS, MessageBuffer+7, MessageLength-7);\r
-\r
-#ifdef DEBUG\r
-  fprintf(stdout, _("\n"));      \r
-#endif /* DEBUG */\r
-}\r
-\r
-void N6110_DispatchMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {\r
 
-  bool unknown=false;
+    switch (MessageBuffer[4]) {
+      case 0x6f:CurrentMemoryStatusError = GE_TIMEOUT;break;
+      case 0x7d:CurrentMemoryStatusError = GE_INTERNALERROR;break;
+      case 0x8d:CurrentMemoryStatusError = GE_INVALIDSECURITYCODE;break;
+      default:break;
+    }
 
-  /* Switch on the basis of the message type byte */\r
-  switch (MessageType) {\r
-         \r
-  /* Call information */\r
-  case 0x01:\r
-\r
-    N6110_Dispatch0x01Message(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-\r
-  /* SMS handling */\r
-  case 0x02:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x02:\r
-      case 0x03:N6110_ReplySendSMSMessage(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x10:N6110_ReplyIncomingSMS(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x21:N6110_ReplySetCellBroadcast(MessageLength, MessageBuffer, MessageType);break;\r
-      case 0x23:N6110_ReplyReadCellBroadcast(MessageLength, MessageBuffer, MessageType);break;\r
-      case 0x31:N6110_ReplySetSMSCenter(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x34:\r
-      case 0x35:N6110_ReplyGetSMSCenter(MessageLength,MessageBuffer,MessageType);break;\r
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-\r
-  /* Phonebook handling */\r
-  case 0x03:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x02:\r
-      case 0x03:N6110_ReplyGetMemoryLocation(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x05:\r
-      case 0x06:N6110_ReplyWritePhonebookLocation(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x08:\r
-      case 0x09:N6110_ReplyGetMemoryStatus(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x17:\r
-      case 0x18:N6110_ReplyGetSpeedDial(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x1a:\r
-      case 0x1b:N6110_ReplySetSpeedDial(MessageLength,MessageBuffer,MessageType);break;\r
-      default  :N6110_Dispatch0x03Message(MessageLength,MessageBuffer,MessageType);break;\r
-    }\r
-    break;\r
-\r
-  /* Phone status */    \r
-  case 0x04:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x02:N6110_ReplyRFBatteryLevel(MessageLength,MessageBuffer,MessageType);break;\r
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-      \r
-  /* Startup Logo, Operator Logo and Profiles. */\r
-  case 0x05:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x11:N6110_ReplySetProfile    (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x14:N6110_ReplyGetProfile    (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x1b:N6110_ReplyGetProfile    (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x1d:N6110_ReplySetProfile    (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x37:N6110_ReplySetRingtone   (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x38:N6110_ReplySetRingtone   (MessageLength,MessageBuffer,MessageType);break;\r
-      default  :N6110_Dispatch0x05Message(MessageLength,MessageBuffer,MessageType);break;\r
-    }\r
-    break;\r
-\r
-  /* Network Operator Message to handset -> Gerry Anderson & prepaid info */
-  /* Call diverts */
-  case 0x06:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x02:\r
-      case 0x03:N6110_ReplyCallDivert    (MessageLength,MessageBuffer,MessageType);break;\r
-      default  :N6110_Dispatch0x06Message(MessageLength,MessageBuffer,MessageType);break;\r
-    }\r
-    break;\r
-\r
-  /* Security code requests */\r
-  case 0x08:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x08:N6110_ReplyGetSecurityCodeStatus(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x0b:N6110_ReplyEnterSecurityCode    (MessageLength,MessageBuffer,MessageType);break;\r
-      default  :N6110_ReplyEnterSecurityCode    (MessageLength,MessageBuffer,MessageType);break;\r
-    }\r
-    break;\r
-\r
-  /* SIM login */\r
-  case 0x09:\r
-\r
-    N6110_Dispatch0x09Message(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-\r
-  /* Network info */\r
-  case 0x0a:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x71:N6110_ReplyGetNetworkInfo(MessageLength,MessageBuffer,MessageType);break;\r
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-\r
-  /* Simulating key pressing */\r
-  case 0x0c:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x43:N6110_ReplyPressKey(MessageLength,MessageBuffer,MessageType);break;\r
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-\r
-  /* Display */\r
-  case 0x0d:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x50:N6110_ReplyDisplayOutput   (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x52:N6110_ReplyGetDisplayStatus(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x54:N6110_ReplyDisplayOutput   (MessageLength,MessageBuffer,MessageType);break;\r
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-\r
-  /* Phone Clock and Alarm */\r
-  case 0x11:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x61:N6110_ReplySetDateTime(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x63:N6110_ReplyGetDateTime(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x6c:N6110_ReplySetAlarm   (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x6e:N6110_ReplyGetAlarm   (MessageLength,MessageBuffer,MessageType);break;\r
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-\r
-  /* Calendar notes handling */\r
-  case 0x13:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x65:N6110_ReplyWriteCalendarNote (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x67:N6110_ReplyGetCalendarNote   (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x69:N6110_ReplyDeleteCalendarNote(MessageLength,MessageBuffer,MessageType);break;\r
-      default  :N6110_Dispatch0x13Message    (MessageLength,MessageBuffer,MessageType);break;\r
-    }\r
-    break;\r
-\r
-  /* SMS Messages */\r
-  case 0x14:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x05:\r
-      case 0x06:N6110_ReplySaveSMSMessage  (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x08:\r
-      case 0x09:N6110_ReplyGetSMSMessage   (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x0b:N6110_ReplyDeleteSMSMessage(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x37:\r
-      case 0x38:N6110_ReplyGetSMSStatus    (MessageLength,MessageBuffer,MessageType);break;\r
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-\r
-  /* WAP */\r
-  case 0x3f:\r
-    switch (MessageBuffer[3]) {\r
-      case 0x01:\r
-      case 0x02:N7110_ReplyEnableWAPCommands(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x07:\r
-      case 0x08:N7110_ReplyGetWAPBookmark   (MessageLength,MessageBuffer,MessageType);break;
-      case 0x0a:
-      case 0x0b:N7110_ReplySetWAPBookmark   (MessageLength,MessageBuffer,MessageType);break;
-      case 0x16:
-      case 0x17:
-      case 0x1c:N7110_ReplyGetWAPSettings   (MessageLength,MessageBuffer,MessageType);break;
-      default  :unknown=true;break;\r
-    }\r
-    break;\r
-\r
-  /* Internal phone functions? */\r
-  case 0x40:\r
-    switch (MessageBuffer[2]) {\r
-      case 0x64:N6110_ReplyEnableExtendedCommands  (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x65:N6110_ReplyResetPhoneSettings      (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x66:N6110_ReplyIMEI                    (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x6a:N6110_ReplyGetProductProfileSetting(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x6b:N6110_ReplySetProductProfileSetting(MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x6e:N6110_ReplyGetSecurityCode         (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x7e:N6110_ReplyNetmonitor              (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x8a:N6110_ReplySimlockInfo             (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x8b:N6110_ReplySetOperatorName         (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x8c:N6110_ReplyGetOperatorName         (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x8f:N6110_ReplyPlayTone                (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0x9e:N6110_ReplyGetBinRingtone          (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0xa0:N6110_ReplySetBinRingtone          (MessageLength,MessageBuffer,MessageType);break;\r
-      case 0xc8:N6110_ReplyHW                      (MessageLength,MessageBuffer,MessageType);break;\r
-      default  :N6110_Dispatch0x40Message          (MessageLength,MessageBuffer,MessageType);break;\r
-    }\r
-    break;\r
-\r
-  /* Picture Images */\r
-  case 0x47:\r
-\r
-    N6110_Dispatch0x47Message(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-\r
-  /* Mobile phone identification */\r
-  case 0x64:\r
-\r
-    N6110_ReplyGetAuthentication(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-\r
-  /***** Acknowlegment of our frames. *****/\r
-  case FBUS_FRTYPE_ACK:\r
-\r
-    N6110_DispatchACKMessage(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-\r
-  /***** Power on message. *****/\r
-  case 0xd0:\r
-\r
-    N6110_Dispatch0xD0Message(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-\r
-  case 0xd2:\r
-\r
-    N6110_ReplyID(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-  \r
-  /***** RLP frame received. *****/\r
-  case 0xf1:\r
-\r
-    N6110_RX_HandleRLPMessage(MessageBuffer);\r
-    break;\r
-\r
-  /***** Power on message. *****/\r
-  case 0xf4:\r
-\r
-    N6110_Dispatch0xF4Message(MessageLength, MessageBuffer, MessageType);\r
-    break;\r
-\r
-  /***** Unknown message *****/\r
-  /* If you think that you know the exact meaning of other messages - please\r
-     let us know. */\r
-  default:\r
-\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Message: Unknown message type.\n"));\r
-#endif /* DEBUG */\r
-    AppendLogText("Unknown msg type\n",false);\r
-\r
-    unknown=false;\r
-    break;\r
-\r
-  }\r
-\r
-  if (unknown) {\r
-#ifdef DEBUG\r
-    fprintf(stdout, _("Unknown message of type %02x.\n"),MessageType);\r
-#endif\r
-    AppendLogText("Unknown msg\n",false);\r
-  }\r
-}\r
+    break;
+
+  }
+}
+
+/* This function is used to get storage status from the phone. It currently
+   supports two different memory areas - internal and SIM. */
+GSM_Error N6110_GetMemoryStatus(GSM_MemoryStatus *Status)
+{
+  unsigned char req[] = { N6110_FRAME_HEADER,
+                          0x07, /* MemoryStatus request */
+                          0x00  /* MemoryType */
+                        };
+
+  GSM_Error error;
+  
+  CurrentMemoryStatus = Status;
+
+  req[4] = N6110_GetMemoryType(Status->MemoryType);
+
+  error=NULL_SendMessageSequence
+    (20, &CurrentMemoryStatusError, 5, 0x03, req);
+
+  CurrentMemoryStatus = NULL;
+
+  return error;
+}
+
+#ifndef UCLINUX
+
+void N6110_ReplyGetNetworkInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+  GSM_NetworkInfo NullNetworkInfo;
+  
+  /* Make sure we are expecting NetworkInfo frame */
+  if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY) {
+#ifdef DEBUG
+    fprintf(stdout, _("Message: Network informations:\n"));
+#endif
+  } else {
+#ifdef DEBUG
+    fprintf(stdout, _("Message: Network informations not requested, but received:\n"));
+#endif
+  }
+      
+  sprintf(NullNetworkInfo.NetworkCode, "%x%x%x %x%x", MessageBuffer[14] & 0x0f, MessageBuffer[14] >>4, MessageBuffer[15] & 0x0f, MessageBuffer[16] & 0x0f, MessageBuffer[16] >>4);
+
+  sprintf(NullNetworkInfo.CellID, "%02x%02x", MessageBuffer[10], MessageBuffer[11]);
+
+  sprintf(NullNetworkInfo.LAC, "%02x%02x", MessageBuffer[12], MessageBuffer[13]);
+
+#ifdef DEBUG
+  fprintf(stdout, _("   CellID: %s\n"), NullNetworkInfo.CellID);
+  fprintf(stdout, _("   LAC: %s\n"), NullNetworkInfo.LAC);
+  fprintf(stdout, _("   Network code: %s\n"), NullNetworkInfo.NetworkCode);
+  fprintf(stdout, _("   Network name: %s (%s)\n"),
+                     GSM_GetNetworkName(NullNetworkInfo.NetworkCode),
+                     GSM_GetCountryName(NullNetworkInfo.NetworkCode));
+  fprintf(stdout, _("   Status: "));
+
+  switch (MessageBuffer[8]) {
+    case 0x01: fprintf(stdout, _("home network selected")); break;
+    case 0x02: fprintf(stdout, _("roaming network")); break;
+    case 0x03: fprintf(stdout, _("requesting network")); break;
+    case 0x04: fprintf(stdout, _("not registered in the network")); break;
+    default: fprintf(stdout, _("unknown"));
+  }
+
+  fprintf(stdout, "\n");
+
+  fprintf(stdout, _("   Network selection: %s\n"), MessageBuffer[9]==1?_("manual"):_("automatic"));
+#endif /* DEBUG */
+
+  /* Make sure we are expecting NetworkInfo frame */
+  if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY)
+    *CurrentNetworkInfo=NullNetworkInfo;
+
+  CurrentNetworkInfoError = GE_NONE;      
+}
+
+GSM_Error N6110_GetNetworkInfo(GSM_NetworkInfo *NetworkInfo)
+{
+  unsigned char req[] = { N6110_FRAME_HEADER,
+                          0x70
+                        };
+
+  GSM_Error error;
+  
+  CurrentNetworkInfo = NetworkInfo;
+  
+  error=NULL_SendMessageSequence
+    (20, &CurrentNetworkInfoError, 4, 0x0a, req);
+
+  CurrentNetworkInfo = NULL;
+
+  return error;
+}
+
+void N6110_ReplyGetProductProfileSetting(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+  int i;
+  
+#ifdef DEBUG
+  fprintf(stdout, _("Message: Product Profile Settings received -"));
+  for (i=0;i<4;i++) fprintf(stdout, _(" %02x"),MessageBuffer[3+i]);
+  fprintf(stdout, _("\n"));  
+#endif
+
+  for (i=0;i<4;i++) CurrentPPS[i]=MessageBuffer[3+i];
+
+  CurrentProductProfileSettingsError=GE_NONE;      
+}
+
+GSM_Error N6110_GetProductProfileSetting (GSM_PPS *PPS)
+{
+  unsigned char req[] = { 0x00, 0x01,0x6a };
+  
+  int i,j;
+
+  GSM_Error error;
+
+  error=N6110_EnableExtendedCommands(0x01);
+  if (error!=GE_NONE) return error;
+
+  error=NULL_SendMessageSequence
+    (20, &CurrentProductProfileSettingsError, 3, 0x40, req);
+  if (error!=GE_NONE) return error;    
+  
+  switch (PPS->Name) {
+    case PPS_ALS      : PPS->bool_value=(CurrentPPS[1]&32); break;
+    case PPS_GamesMenu: PPS->bool_value=(CurrentPPS[3]&64); break;
+    case PPS_HRData   : PPS->bool_value=(CurrentPPS[0]&64); break;
+    case PPS_14400Data: PPS->bool_value=(CurrentPPS[0]&128);break;
+    case PPS_EFR      : PPS->int_value =(CurrentPPS[0]&1)    +(CurrentPPS[0]&2);    break;
+    case PPS_FR       : PPS->int_value =(CurrentPPS[0]&16)/16+(CurrentPPS[0]&32)/16;break;
+    case PPS_HR       : PPS->int_value =(CurrentPPS[0]&4)/4  +(CurrentPPS[0]&8)/4;  break;
+    case PPS_VibraMenu: PPS->bool_value=(CurrentPPS[4]&64); break;
+    case PPS_LCDContrast:
+         PPS->int_value=0;
+         j=1;
+         for (i=0;i<5;i++) {
+          if (CurrentPPS[3]&j) PPS->int_value=PPS->int_value+j;
+          j=j*2;
+        }
+        PPS->int_value=PPS->int_value*100/32;
+         break;
+
+  }
+  
+  return (GE_NONE);
+}
+
+void N6110_ReplySetProductProfileSetting(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+  int i;
+  
+  fprintf(stdout, _("Message: Product Profile Settings set to"));
+  for (i=0;i<4;i++) fprintf(stdout, _(" %02x"),CurrentPPS[i]);
+  fprintf(stdout, _("\n"));  
+#endif
+     
+  CurrentProductProfileSettingsError=GE_NONE;     
+}
+
+GSM_Error N6110_SetProductProfileSetting (GSM_PPS *PPS)
+{
+  unsigned char req[] = { 0x00, 0x01,0x6b, 
+                          0x00, 0x00, 0x00, 0x00 }; /* bytes with Product Profile Setings */
+  unsigned char settings[32];
+  
+  GSM_PPS OldPPS;
+  
+  int i,j,z;
+  
+  GSM_Error error;
+
+  error=N6110_EnableExtendedCommands(0x01);
+  if (error!=GE_NONE) return error;
+  
+  OldPPS.Name=PPS_ALS;
+  error=N6110_GetProductProfileSetting(&OldPPS);
+  if (error!=GE_NONE) return error;
+  
+  j=128;z=0;
+  for (i=0;i<32;i++) {
+    if (CurrentPPS[z]&j)
+      settings[i]='1';
+    else
+      settings[i]='0';    
+    if (j==1) {
+      j=128;
+      z++;
+    } else j=j/2;
+  }
+  
+#ifdef DEBUG
+  fprintf(stdout,_("Current settings: "));
+  for (i=0;i<32;i++) {
+    fprintf(stdout,_("%c"),settings[i]);    
+  }
+  fprintf(stdout,_("\n"));
+#endif
+
+  switch (PPS->Name) {
+    case PPS_ALS      :settings[10]=PPS->bool_value?'1':'0';break;
+    case PPS_HRData   :settings[ 5]=PPS->bool_value?'1':'0';break;
+    case PPS_14400Data:settings[ 6]=PPS->bool_value?'1':'0';break;
+    default           :break;
+  }
+    
+  j=128;z=0;
+  for (i=0;i<32;i++) {
+    if (settings[i]=='1') req[z+3]=req[z+3]+j;
+    if (j==1) {
+      j=128;
+      z++;
+    } else j=j/2;
+  }  
+
+#ifdef DEBUG
+  fprintf(stdout,_("Current settings: "));
+  for (i=0;i<4;i++) {
+    fprintf(stdout,_("%i "),req[i+3]);    
+  }
+  fprintf(stdout,_("\n"));
+#endif
+
+  for (i=0;i<4;i++) {
+   CurrentPPS[i]=req[i+3];    
+  }
+
+  return NULL_SendMessageSequence
+    (20, &CurrentProductProfileSettingsError, 7, 0x40, req);
+}
+
+void N6110_ReplyPressKey(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+    if (MessageBuffer[4]==CurrentPressKeyEvent) CurrentPressKeyError=GE_NONE;
+                                           else CurrentPressKeyError=GE_UNKNOWN; /* MessageBuffer[4] = 0x05 */
+#ifdef DEBUG
+    fprintf(stdout, _("Message: Result of key "));
+    switch (MessageBuffer[4])
+    {
+      case PRESSPHONEKEY:   fprintf(stdout, _("press OK\n"));break;
+      case RELEASEPHONEKEY: fprintf(stdout, _("release OK\n"));break;
+      default:              fprintf(stdout, _("press or release - error\n"));break;
+    }
+#endif /* DEBUG */
+}
+
+GSM_Error N6110_PressKey(int key, int event)
+{
+  unsigned char req[] = {N6110_FRAME_HEADER,&nb