+/* Applications should call N6110_Terminate to shut down the N6110 thread and
+ close the serial port. */
+void NULL_Terminate(void)
+{
+ Protocol->Terminate();
+}
+
+#ifdef WIN32
+/* Here are things made for keeping connecting */
+void NULL_KeepAlive()
+{
+}
+#else
+/* Here are things made for keeping connecting */
+void NULL_KeepAlive()
+{
+}
+#endif
+
+#ifdef DEBUG
+void NULL_TX_DisplayMessage(u16 MessageLength, u8 *MessageBuffer)
+{
+ fprintf(stdout, _("PC: "));
+
+ txhexdump(MessageLength,MessageBuffer);
+}
+#endif
+
+bool NULL_WritePhone (u16 length, u8 *buffer) {
+ if (device_write(buffer,length)!=length) return false;
+ else return true;
+}
+
+GSM_Error NULL_WaitUntil (int time, GSM_Error *value)
+{
+ int timeout;
+
+ timeout=time;
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && *value == GE_BUSY ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ return *value;
+}
+
+GSM_Error NULL_SendMessageSequence (int time, GSM_Error *value,
+ u16 message_length, u8 message_type, u8 *buffer)
+{
+ *value=GE_BUSY;
+
+ Protocol->SendMessage(message_length, message_type, buffer);
+
+ return NULL_WaitUntil (time, value);
+}
+
+GSM_ConnectionType GetConnectionTypeFromString(char *Connection) {
+
+ GSM_ConnectionType connection=GCT_FBUS;
+
+ 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;
+
+ return connection;
+}
+
+bool GetMemoryTypeString(char *memorytext, GSM_MemoryType *type)
+{
+ int i=0;
+
+ typedef struct {
+ GSM_MemoryType type;
+ char *name;
+ } GSM_MTStrings;
+
+ GSM_MTStrings mystring[] = {
+ {GMT_ME,"ME"},
+ {GMT_SM,"SM"},
+ {GMT_FD,"FD"},
+ {GMT_ON,"ON"},
+ {GMT_EN,"EN"},
+ {GMT_DC,"DC"},
+ {GMT_RC,"RC"},
+ {GMT_MC,"MC"},
+ {GMT_LD,"LD"},
+ {GMT_MT,"MT"},
+ {GMT_ME,"undefined"}
+ };
+
+ while (strcmp(mystring[i].name,"undefined")) {
+ if (*type==mystring[i].type) {
+ strcpy(memorytext,mystring[i].name);
+ return true;
+ }
+ i++;
+ }
+ return false;
+}
+
+bool GetMemoryTypeID(char *memorytext, GSM_MemoryType *type)
+{
+ int i=0;
+
+ typedef struct {
+ GSM_MemoryType type;
+ char *name;
+ } GSM_MTStrings;
+
+ GSM_MTStrings mystring[] = {
+ {GMT_ME,"ME"},
+ {GMT_SM,"SM"},
+ {GMT_FD,"FD"},
+ {GMT_ON,"ON"},
+ {GMT_EN,"EN"},
+ {GMT_DC,"DC"},
+ {GMT_RC,"RC"},
+ {GMT_MC,"MC"},
+ {GMT_LD,"LD"},
+ {GMT_MT,"MT"},
+ {GMT_ME,"undefined"}
+ };
+
+ while (strcmp(mystring[i].name,"undefined")) {
+ if (strcmp(mystring[i].name,memorytext)==0) {
+ *type=mystring[i].type;
+ return true;
+ }
+ i++;
+ }
+
+ return false;
+}
+
+char *GetMygnokiiVersion() {
+
+ static char Buffer[1000]="";
+
+ sprintf(Buffer, "%s",VERSION);
+
+ return Buffer;
+}
+
+/*
+1.Name,2.CodeName,3.Calendar,4.Netmonitor,5.Caller groups,6.Phonebook,
+7.Authentication 8.Datacalls 9.KeysPressing 10.SMSC Default Recipient
+11.SpeedDials 12.ScreenSavers 13.DTMF 14.SMS 15.NoPowerFrame 16.StartUpLogo
+17.Profiles 18.Ringtones 19.WAP
+*/
+
+static OnePhoneModel allmodels[] = {
+
+/*1, 2, 3, 4, 5, 6 7 8 9 10 11 12 13 14 15 16 17 18 19 */
+{"3210","NSE-8",{ 0,F_NETMON, 0, 0, 0, 0, 0,F_SMSCDEF,F_SPEED, 0, 0,F_SMS ,F_NOPOWER,F_STANIM,F_PROF51,F_RINGBIN, 0}},
+{"3210","NSE-9",{ 0,F_NETMON, 0, 0, 0, 0, 0,F_SMSCDEF,F_SPEED, 0, 0,F_SMS ,F_NOPOWER,F_STANIM,F_PROF51,F_RINGBIN, 0}},
+{"3310","NHM-5",{F_CAL33,F_NETMON, 0,F_PBK33, 0, 0, 0,F_SMSCDEF,F_SPEED,F_SCRSAV, 0,F_SMS ,F_NOPOWER,F_STANIM,F_PROF33,F_RING_SM, 0}},
+{"3330","NHM-6",{F_CAL33,F_NETMON, 0,F_PBK33, 0, 0,F_KEYB,F_SMSCDEF,F_SPEED,F_SCRSAV, 0,F_SMS , 0,F_STANIM,F_PROF33,F_RING_SM,F_WAP}},
+{"5110","NSE-1",{ 0,F_NETMON, 0, 0,F_AUTH,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0, 0,F_PROF51, 0, 0}},
+{"5130","NSK-1",{ 0,F_NETMON, 0, 0,F_AUTH,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0, 0,F_PROF51, 0, 0}},
+{"5190","NSB-1",{ 0,F_NETMON, 0, 0,F_AUTH,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0, 0,F_PROF51, 0, 0}},
+{"6110","NSE-3",{F_CAL61,F_NETMON,F_CALER61, 0,F_AUTH,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0,F_STA ,F_PROF61,F_RINGBIN, 0}},
+{"6130","NSK-3",{F_CAL61,F_NETMON,F_CALER61, 0,F_AUTH,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0,F_STA ,F_PROF61,F_RINGBIN, 0}},
+{"6150","NSM-1",{F_CAL61,F_NETMON,F_CALER61, 0,F_AUTH,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0,F_STA ,F_PROF61,F_RINGBIN, 0}},
+{"6190","NSB-3",{F_CAL61,F_NETMON,F_CALER61, 0,F_AUTH,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0,F_STA ,F_PROF61,F_RINGBIN, 0}},
+{"6210","NPE-3",{F_CAL71,F_NETMON,F_CALER61,F_PBK71, 0,F_DATA71, 0,F_SMSCDEF,F_SPEED, 0, 0,F_SMS71, 0,F_STA62 ,F_PROF61,F_RINGBIN,F_WAP}},
+{"6250","NHM-3",{F_CAL71,F_NETMON,F_CALER61,F_PBK71, 0,F_DATA71, 0,F_SMSCDEF,F_SPEED, 0, 0,F_SMS71, 0,F_STA62 ,F_PROF61,F_RINGBIN,F_WAP}},
+{"7110","NSE-5",{F_CAL71,F_NETMON,F_CALER61,F_PBK71, 0,F_DATA71, 0,F_SMSCDEF,F_SPEED, 0, 0,F_SMS71, 0,F_STA71 ,F_PROF61,F_RINGBIN,F_WAP}},
+{"8210","NSM-3",{ 0,F_NETMON,F_CALER61, 0, 0,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0,F_STA ,F_PROF61,F_RINGBIN, 0}},
+{"8850","NSM-2",{ 0,F_NETMON,F_CALER61, 0, 0,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0,F_STA ,F_PROF61,F_RINGBIN, 0}},
+{"9210","RAE-3",{ 0,F_NETMON,F_CALER61, 0, 0,F_DATA61,F_KEYB,F_SMSCDEF,F_SPEED, 0,F_DTMF,F_SMS , 0,F_STA ,F_PROF61,F_RINGBIN, 0}},//quesses only !
+{"" ,"" ,{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
+};
+
+OnePhoneModel *GetPhoneModelData (const char *num)
+{
+ register int i = 0;
+
+ while (allmodels[i].number != "") {
+ if (strcmp (num, allmodels[i].number) == 0) {
+ return (&allmodels[i]);
+ }
+ i++;