summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common
authorzautrix <zautrix>2004-10-05 11:13:51 (UTC)
committer zautrix <zautrix>2004-10-05 11:13:51 (UTC)
commit50ab40e1e02ad7c65c17a78d08116a808b1257aa (patch) (unidiff)
tree0d1939e2297fa7bbd8e1f2030f154463854164c6 /gammu/emb/common
parentcf8616f64f20e5448d4ff644f7cc15750cf3f85f (diff)
downloadkdepimpi-50ab40e1e02ad7c65c17a78d08116a808b1257aa.zip
kdepimpi-50ab40e1e02ad7c65c17a78d08116a808b1257aa.tar.gz
kdepimpi-50ab40e1e02ad7c65c17a78d08116a808b1257aa.tar.bz2
updated to latest gammu version
Diffstat (limited to 'gammu/emb/common') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/common.pro1
-rw-r--r--gammu/emb/common/commonE.pro1
-rw-r--r--gammu/emb/common/device/bluetoth/bluez.c29
-rw-r--r--gammu/emb/common/device/devfunc.c12
-rw-r--r--gammu/emb/common/device/irda/irda.c8
-rw-r--r--gammu/emb/common/device/irda/irda_unx.h2
-rw-r--r--gammu/emb/common/device/serial/ser_djg.c10
-rw-r--r--gammu/emb/common/device/serial/ser_unx.c38
-rw-r--r--gammu/emb/common/device/serial/ser_w32.c6
-rw-r--r--gammu/emb/common/gsmcomon.c21
-rw-r--r--gammu/emb/common/gsmcomon.h3
-rw-r--r--gammu/emb/common/gsmstate.c74
-rw-r--r--gammu/emb/common/gsmstate.h31
-rw-r--r--gammu/emb/common/misc/coding/coding.c177
-rw-r--r--gammu/emb/common/misc/coding/coding.h27
-rw-r--r--gammu/emb/common/misc/coding/md5.c2
-rw-r--r--gammu/emb/common/misc/misc.c19
-rw-r--r--gammu/emb/common/misc/misc.h8
-rw-r--r--gammu/emb/common/phone/alcatel/alcatel.c298
-rw-r--r--gammu/emb/common/phone/at/atgen.c295
-rw-r--r--gammu/emb/common/phone/at/atgen.h8
-rw-r--r--gammu/emb/common/phone/at/samsung.c447
-rw-r--r--gammu/emb/common/phone/at/samsung.h16
-rw-r--r--gammu/emb/common/phone/at/siemens.c74
-rw-r--r--gammu/emb/common/phone/at/sonyeric.c141
-rw-r--r--gammu/emb/common/phone/nokia/dct3/dct3func.c16
-rw-r--r--gammu/emb/common/phone/nokia/dct3/dct3func.h2
-rw-r--r--gammu/emb/common/phone/nokia/dct3/n6110.c17
-rw-r--r--gammu/emb/common/phone/nokia/dct3/n7110.c9
-rw-r--r--gammu/emb/common/phone/nokia/dct3/n9210.c3
-rw-r--r--gammu/emb/common/phone/nokia/dct4/n3320.c3
-rw-r--r--gammu/emb/common/phone/nokia/dct4/n3650.c3
-rw-r--r--gammu/emb/common/phone/nokia/dct4/n6510.c168
-rw-r--r--gammu/emb/common/phone/nokia/dct4/n6510.h2
-rw-r--r--gammu/emb/common/phone/nokia/nauto.c2
-rw-r--r--gammu/emb/common/phone/nokia/nfunc.c14
-rw-r--r--gammu/emb/common/phone/obex/obexgen.c3
-rw-r--r--gammu/emb/common/phone/obex/obexgen.h4
-rw-r--r--gammu/emb/common/phone/symbian/mroutgen.c3
-rw-r--r--gammu/emb/common/protocol/at/at.c6
-rw-r--r--gammu/emb/common/protocol/nokia/fbus2.c6
-rw-r--r--gammu/emb/common/protocol/nokia/fbus2.h6
-rw-r--r--gammu/emb/common/protocol/nokia/mbus2.c2
-rw-r--r--gammu/emb/common/protocol/nokia/mbus2.h2
-rw-r--r--gammu/emb/common/protocol/nokia/phonet.c5
-rw-r--r--gammu/emb/common/protocol/nokia/phonet.h5
-rw-r--r--gammu/emb/common/service/backup/backgen.h4
-rw-r--r--gammu/emb/common/service/backup/backtext.c229
-rw-r--r--gammu/emb/common/service/backup/gsmback.c36
-rw-r--r--gammu/emb/common/service/backup/gsmback.h2
-rw-r--r--gammu/emb/common/service/gsmcal.h2
-rw-r--r--gammu/emb/common/service/gsmdata.c124
-rw-r--r--gammu/emb/common/service/gsmdata.h2
-rw-r--r--gammu/emb/common/service/gsmlogo.c47
-rw-r--r--gammu/emb/common/service/gsmlogo.h28
-rw-r--r--gammu/emb/common/service/gsmmisc.h7
-rw-r--r--gammu/emb/common/service/gsmring.c45
-rw-r--r--gammu/emb/common/service/gsmring.h8
-rw-r--r--gammu/emb/common/service/sms/gsmmulti.c5
-rw-r--r--gammu/emb/common/service/sms/gsmmulti.h11
-rw-r--r--gammu/emb/common/service/sms/gsmsms.c5
-rw-r--r--gammu/emb/common/service/sms/gsmsms.h5
62 files changed, 2118 insertions, 471 deletions
diff --git a/gammu/emb/common/common.pro b/gammu/emb/common/common.pro
index 0e719ee..797199b 100644
--- a/gammu/emb/common/common.pro
+++ b/gammu/emb/common/common.pro
@@ -111,77 +111,78 @@ HEADERS += config.h \
111 phone/nokia/dct3/dct3func.h \ 111 phone/nokia/dct3/dct3func.h \
112 phone/nokia/dct3/n6110.h \ 112 phone/nokia/dct3/n6110.h \
113 phone/nokia/dct3/n7110.h \ 113 phone/nokia/dct3/n7110.h \
114 phone/nokia/dct3/n9210.h \ 114 phone/nokia/dct3/n9210.h \
115 phone/nokia/dct4/dct4func.h \ 115 phone/nokia/dct4/dct4func.h \
116 phone/nokia/dct4/n3320.h \ 116 phone/nokia/dct4/n3320.h \
117 phone/nokia/dct4/n3650.h \ 117 phone/nokia/dct4/n3650.h \
118 phone/nokia/dct4/n6510.h 118 phone/nokia/dct4/n6510.h
119SOURCES +=gsmcomon.c \ 119SOURCES +=gsmcomon.c \
120gsmstate.c \ 120gsmstate.c \
121misc/misc.c \ 121misc/misc.c \
122misc/cfg.c \ 122misc/cfg.c \
123misc/coding/coding.c \ 123misc/coding/coding.c \
124misc/coding/md5.c \ 124misc/coding/md5.c \
125service/sms/gsmsms.c \ 125service/sms/gsmsms.c \
126service/sms/gsmems.c \ 126service/sms/gsmems.c \
127service/sms/gsmmulti.c \ 127service/sms/gsmmulti.c \
128service/gsmcal.c \ 128service/gsmcal.c \
129service/gsmdata.c \ 129service/gsmdata.c \
130service/gsmpbk.c \ 130service/gsmpbk.c \
131service/gsmring.c \ 131service/gsmring.c \
132service/gsmlogo.c \ 132service/gsmlogo.c \
133service/gsmmisc.c \ 133service/gsmmisc.c \
134service/gsmnet.c \ 134service/gsmnet.c \
135service/backup/gsmback.c \ 135service/backup/gsmback.c \
136service/backup/backldif.c \ 136service/backup/backldif.c \
137service/backup/backlmb.c \ 137service/backup/backlmb.c \
138service/backup/backtext.c \ 138service/backup/backtext.c \
139service/backup/backvcs.c \ 139service/backup/backvcs.c \
140service/backup/backvcf.c \ 140service/backup/backvcf.c \
141service/backup/backics.c \ 141service/backup/backics.c \
142device/bluetoth/affix.c \ 142device/bluetoth/affix.c \
143device/bluetoth/bluez.c \ 143device/bluetoth/bluez.c \
144device/bluetoth/blue_w32.c \ 144device/bluetoth/blue_w32.c \
145device/bluetoth/bluetoth.c \ 145device/bluetoth/bluetoth.c \
146device/serial/ser_djg.c \ 146device/serial/ser_djg.c \
147device/irda/irda.c \ 147device/irda/irda.c \
148device/devfunc.c \ 148device/devfunc.c \
149protocol/at/at.c \ 149protocol/at/at.c \
150protocol/alcatel/alcabus.c \ 150protocol/alcatel/alcabus.c \
151protocol/nokia/mbus2.c \ 151protocol/nokia/mbus2.c \
152protocol/nokia/fbus2.c \ 152protocol/nokia/fbus2.c \
153protocol/nokia/phonet.c \ 153protocol/nokia/phonet.c \
154protocol/obex/obex.c \ 154protocol/obex/obex.c \
155protocol/symbian/mrouter.c \ 155protocol/symbian/mrouter.c \
156phone/pfunc.c \ 156phone/pfunc.c \
157phone/at/atgen.c \ 157phone/at/atgen.c \
158phone/at/siemens.c \ 158phone/at/siemens.c \
159phone/at/samsung.c \
159phone/at/sonyeric.c \ 160phone/at/sonyeric.c \
160phone/alcatel/alcatel.c \ 161phone/alcatel/alcatel.c \
161phone/nokia/dct3/n6110.c \ 162phone/nokia/dct3/n6110.c \
162phone/nokia/dct3/n7110.c \ 163phone/nokia/dct3/n7110.c \
163phone/nokia/dct3/n9210.c \ 164phone/nokia/dct3/n9210.c \
164phone/nokia/dct3/dct3func.c \ 165phone/nokia/dct3/dct3func.c \
165phone/nokia/dct4/n3320.c \ 166phone/nokia/dct4/n3320.c \
166phone/nokia/dct4/n3650.c \ 167phone/nokia/dct4/n3650.c \
167phone/nokia/dct4/n6510.c \ 168phone/nokia/dct4/n6510.c \
168phone/nokia/dct4/dct4func.c \ 169phone/nokia/dct4/dct4func.c \
169phone/nokia/nauto.c \ 170phone/nokia/nauto.c \
170phone/nokia/nfunc.c \ 171phone/nokia/nfunc.c \
171phone/nokia/nfuncold.c \ 172phone/nokia/nfuncold.c \
172phone/obex/obexgen.c \ 173phone/obex/obexgen.c \
173phone/symbian/mroutgen.c 174phone/symbian/mroutgen.c
174 175
175DEFINES += DESKTOP_VERSION 176DEFINES += DESKTOP_VERSION
176TARGET = microgammu 177TARGET = microgammu
177CONFIG = warn_off release console 178CONFIG = warn_off release console
178DESTDIR = ../../../bin 179DESTDIR = ../../../bin
179OBJECTS_DIR = obj/unix 180OBJECTS_DIR = obj/unix
180MOC_DIR = moc/unix 181MOC_DIR = moc/unix
181 182
182unix: { 183unix: {
183SOURCES += device/serial/ser_unx.c 184SOURCES += device/serial/ser_unx.c
184} 185}
185win32:{ 186win32:{
186SOURCES += device/serial/ser_w32.c 187SOURCES += device/serial/ser_w32.c
187} 188}
diff --git a/gammu/emb/common/commonE.pro b/gammu/emb/common/commonE.pro
index a36947b..f5b559d 100644
--- a/gammu/emb/common/commonE.pro
+++ b/gammu/emb/common/commonE.pro
@@ -112,69 +112,70 @@ HEADERS += config.h \
112 phone/nokia/dct3/n6110.h \ 112 phone/nokia/dct3/n6110.h \
113 phone/nokia/dct3/n7110.h \ 113 phone/nokia/dct3/n7110.h \
114 phone/nokia/dct3/n9210.h \ 114 phone/nokia/dct3/n9210.h \
115 phone/nokia/dct4/dct4func.h \ 115 phone/nokia/dct4/dct4func.h \
116 phone/nokia/dct4/n3320.h \ 116 phone/nokia/dct4/n3320.h \
117 phone/nokia/dct4/n3650.h \ 117 phone/nokia/dct4/n3650.h \
118 phone/nokia/dct4/n6510.h 118 phone/nokia/dct4/n6510.h
119SOURCES +=gsmcomon.c \ 119SOURCES +=gsmcomon.c \
120gsmstate.c \ 120gsmstate.c \
121misc/misc.c \ 121misc/misc.c \
122misc/cfg.c \ 122misc/cfg.c \
123misc/coding/coding.c \ 123misc/coding/coding.c \
124misc/coding/md5.c \ 124misc/coding/md5.c \
125service/sms/gsmsms.c \ 125service/sms/gsmsms.c \
126service/sms/gsmems.c \ 126service/sms/gsmems.c \
127service/sms/gsmmulti.c \ 127service/sms/gsmmulti.c \
128service/gsmcal.c \ 128service/gsmcal.c \
129service/gsmdata.c \ 129service/gsmdata.c \
130service/gsmpbk.c \ 130service/gsmpbk.c \
131service/gsmring.c \ 131service/gsmring.c \
132service/gsmlogo.c \ 132service/gsmlogo.c \
133service/gsmmisc.c \ 133service/gsmmisc.c \
134service/gsmnet.c \ 134service/gsmnet.c \
135service/backup/gsmback.c \ 135service/backup/gsmback.c \
136service/backup/backldif.c \ 136service/backup/backldif.c \
137service/backup/backlmb.c \ 137service/backup/backlmb.c \
138service/backup/backtext.c \ 138service/backup/backtext.c \
139service/backup/backvcs.c \ 139service/backup/backvcs.c \
140service/backup/backvcf.c \ 140service/backup/backvcf.c \
141service/backup/backics.c \ 141service/backup/backics.c \
142device/bluetoth/affix.c \ 142device/bluetoth/affix.c \
143device/bluetoth/bluez.c \ 143device/bluetoth/bluez.c \
144device/bluetoth/blue_w32.c \ 144device/bluetoth/blue_w32.c \
145device/bluetoth/bluetoth.c \ 145device/bluetoth/bluetoth.c \
146device/serial/ser_unx.c \ 146device/serial/ser_unx.c \
147device/serial/ser_djg.c \ 147device/serial/ser_djg.c \
148device/irda/irda.c \ 148device/irda/irda.c \
149device/devfunc.c \ 149device/devfunc.c \
150protocol/at/at.c \ 150protocol/at/at.c \
151protocol/alcatel/alcabus.c \ 151protocol/alcatel/alcabus.c \
152protocol/nokia/mbus2.c \ 152protocol/nokia/mbus2.c \
153protocol/nokia/fbus2.c \ 153protocol/nokia/fbus2.c \
154protocol/nokia/phonet.c \ 154protocol/nokia/phonet.c \
155protocol/obex/obex.c \ 155protocol/obex/obex.c \
156protocol/symbian/mrouter.c \ 156protocol/symbian/mrouter.c \
157phone/pfunc.c \ 157phone/pfunc.c \
158phone/at/atgen.c \ 158phone/at/atgen.c \
159phone/at/siemens.c \ 159phone/at/siemens.c \
160phone/at/samsung.c \
160phone/at/sonyeric.c \ 161phone/at/sonyeric.c \
161phone/alcatel/alcatel.c \ 162phone/alcatel/alcatel.c \
162phone/nokia/dct3/n6110.c \ 163phone/nokia/dct3/n6110.c \
163phone/nokia/dct3/n7110.c \ 164phone/nokia/dct3/n7110.c \
164phone/nokia/dct3/n9210.c \ 165phone/nokia/dct3/n9210.c \
165phone/nokia/dct3/dct3func.c \ 166phone/nokia/dct3/dct3func.c \
166phone/nokia/dct4/n3320.c \ 167phone/nokia/dct4/n3320.c \
167phone/nokia/dct4/n3650.c \ 168phone/nokia/dct4/n3650.c \
168phone/nokia/dct4/n6510.c \ 169phone/nokia/dct4/n6510.c \
169phone/nokia/dct4/dct4func.c \ 170phone/nokia/dct4/dct4func.c \
170phone/nokia/nauto.c \ 171phone/nokia/nauto.c \
171phone/nokia/nfunc.c \ 172phone/nokia/nfunc.c \
172phone/nokia/nfuncold.c \ 173phone/nokia/nfuncold.c \
173phone/obex/obexgen.c \ 174phone/obex/obexgen.c \
174phone/symbian/mroutgen.c 175phone/symbian/mroutgen.c
175 176
176TARGET = kammu 177TARGET = kammu
177DESTDIR = $(QPEDIR)/lib 178DESTDIR = $(QPEDIR)/lib
178OBJECTS_DIR = obj/$(PLATFORM) 179OBJECTS_DIR = obj/$(PLATFORM)
179MOC_DIR = moc/$(PLATFORM) 180MOC_DIR = moc/$(PLATFORM)
180 CONFIG = warn_off release console 181 CONFIG = warn_off release console
diff --git a/gammu/emb/common/device/bluetoth/bluez.c b/gammu/emb/common/device/bluetoth/bluez.c
index 8a4807e..e7e8adf 100644
--- a/gammu/emb/common/device/bluetoth/bluez.c
+++ b/gammu/emb/common/device/bluetoth/bluez.c
@@ -1,207 +1,216 @@
1/* Based on work by Marcel Holtmann and other authors of Bluez */ 1/* Based on some work from Bluez (www.bluez.org)
2 * (C) 2000-2001 Qualcomm Incorporated
3 * (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
4 * (C) 2002-2004 Marcel Holtmann <marcel@holtmann.org>
5 * GNU GPL version 2
6 */
7/* based on some Marcel Holtmann work from Gnokii (www.gnokii.org)
8 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
9 * GNU GPL version 2 or later
10 */
2 11
3#include "../../gsmstate.h" 12#include "../../gsmstate.h"
4 13
5#ifdef GSM_ENABLE_BLUETOOTHDEVICE 14#ifdef GSM_ENABLE_BLUETOOTHDEVICE
6#ifdef GSM_ENABLE_BLUEZ 15#ifdef GSM_ENABLE_BLUEZ
7 16
8#include <stdlib.h> 17#include <stdlib.h>
9#include <stdio.h> 18#include <stdio.h>
10#include <fcntl.h> 19#include <fcntl.h>
11#include <errno.h> 20#include <errno.h>
12#include <string.h> 21#include <string.h>
13#include <sys/socket.h> 22#include <sys/socket.h>
14#include <sys/time.h> 23#include <sys/time.h>
15#include <unistd.h> 24#include <unistd.h>
16#include <bluetooth/bluetooth.h> 25#include <bluetooth/bluetooth.h>
17#include <bluetooth/rfcomm.h> 26#include <bluetooth/rfcomm.h>
18#include <bluetooth/sdp.h> 27#include <bluetooth/sdp.h>
19#include <bluetooth/sdp_lib.h> 28#include <bluetooth/sdp_lib.h>
20 29
21#include "../../gsmcomon.h" 30#include "../../gsmcomon.h"
22#include "../devfunc.h" 31#include "../devfunc.h"
23#include "bluetoth.h" 32#include "bluetoth.h"
24 33
25GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device) 34GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device)
26{ 35{
27 GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth; 36 GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
28 struct sockaddr_rc laddr, raddr; 37 struct sockaddr_rc laddr, raddr;
29 bdaddr_t bdaddr; 38 bdaddr_t bdaddr;
30 int fd; 39 int fd;
31 40
32 smprintf(s, "Connecting to RF channel %i\n",port); 41 smprintf(s, "Connecting to RF channel %i\n",port);
33 42
34 fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); 43 fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
35 if (fd < 0) { 44 if (fd < 0) {
36 dbgprintf("Can't create socket\n"); 45 dbgprintf("Can't create socket\n");
37 return ERR_DEVICENODRIVER; 46 return ERR_DEVICENODRIVER;
38 } 47 }
39 48
40 bacpy(&laddr.rc_bdaddr, BDADDR_ANY); 49 bacpy(&laddr.rc_bdaddr, BDADDR_ANY);
41 laddr.rc_family = AF_BLUETOOTH; 50 laddr.rc_family = AF_BLUETOOTH;
42 laddr.rc_channel = 0; 51 laddr.rc_channel = 0;
43 52
44 if (bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)) < 0) { 53 if (bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)) < 0) {
45 dbgprintf("Can't bind socket\n"); 54 dbgprintf("Can't bind socket\n");
46 close(fd); 55 close(fd);
47 return ERR_DEVICEOPENERROR; 56 return ERR_DEVICEOPENERROR;
48 } 57 }
49 58
50 str2ba(device, &bdaddr); 59 str2ba(device, &bdaddr);
51 bacpy(&raddr.rc_bdaddr, &bdaddr); 60 bacpy(&raddr.rc_bdaddr, &bdaddr);
52 raddr.rc_family = AF_BLUETOOTH; 61 raddr.rc_family = AF_BLUETOOTH;
53 raddr.rc_channel = port; 62 raddr.rc_channel = port;
54 63
55 if (connect(fd, (struct sockaddr *)&raddr, sizeof(raddr)) < 0) { 64 if (connect(fd, (struct sockaddr *)&raddr, sizeof(raddr)) < 0) {
56 dbgprintf("Can't connect\n"); 65 dbgprintf("Can't connect\n");
57 close(fd); 66 close(fd);
58 return ERR_DEVICEOPENERROR; 67 return ERR_DEVICEOPENERROR;
59 } 68 }
60 69
61 d->hPhone = fd; 70 d->hPhone = fd;
62 return ERR_NONE; 71 return ERR_NONE;
63} 72}
64 73
65#ifdef BLUETOOTH_RF_SEARCHING 74#ifdef BLUETOOTH_RF_SEARCHING
66 75
67struct search_context { 76struct search_context {
68 char *svc; 77 char *svc;
69 uuid_t group; 78 uuid_t group;
70 int tree; 79 int tree;
71 uint32_t handle; 80 uint32_t handle;
72}; 81};
73 82
74static void print_service_desc(void *value, void *user) 83static void print_service_desc(void *value, void *user)
75{ 84{
76 sdp_data_t *p = (sdp_data_t *)value; 85 sdp_data_t *p = (sdp_data_t *)value;
77 int i = 0, proto = 0, *channel = (int *)user; 86 int i = 0, proto = 0, *channel = (int *)user;
78 87
79 for (; p; p = p->next, i++) { 88 for (; p; p = p->next, i++) {
80 switch (p->dtd) { 89 switch (p->dtd) {
81 case SDP_UUID16: 90 case SDP_UUID16:
82 case SDP_UUID32: 91 case SDP_UUID32:
83 case SDP_UUID128: 92 case SDP_UUID128:
84 proto = 1;//sdp_uuid_to_proto(&p->val.uuid); 93 proto = sdp_uuid_to_proto(&p->val.uuid);
85 break; 94 break;
86 case SDP_UINT8: 95 case SDP_UINT8:
87 if (proto == RFCOMM_UUID) { 96 if (proto == RFCOMM_UUID) {
88 (*channel) = p->val.uint8; 97 (*channel) = p->val.uint8;
89 return; 98 return;
90 } 99 }
91 break; 100 break;
92 } 101 }
93 } 102 }
94} 103}
95 104
96void print_access_protos(value, user) 105void print_access_protos(value, user)
97{ 106{
98 sdp_list_t *protDescSeq = (sdp_list_t *)value; 107 sdp_list_t *protDescSeq = (sdp_list_t *)value;
99 int *channel = (int *)user; 108 int *channel = (int *)user;
100 109
101 sdp_list_foreach(protDescSeq,print_service_desc,channel); 110 sdp_list_foreach(protDescSeq,print_service_desc,channel);
102} 111}
103 112
104static GSM_Error bluetooth_checkdevice(GSM_StateMachine *s, bdaddr_t *bdaddr, struct search_context *context) 113static GSM_Error bluetooth_checkdevice(GSM_StateMachine *s, bdaddr_t *bdaddr, struct search_context *context)
105{ 114{
106 sdp_session_t *sess; 115 sdp_session_t *sess;
107 sdp_list_t *attrid, *search, *seq, *next, *proto = 0;
108 uint32_t range = 0x0000ffff;
109 char str[20];
110 sdp_record_t *rec; 116 sdp_record_t *rec;
117 sdp_list_t *attrid, *search, *seq, *next, *proto = 0;
111 sdp_data_t *d; 118 sdp_data_t *d;
112 bdaddr_t interface; 119 bdaddr_t interface;
120 uint32_t range = 0x0000ffff;
113 struct search_context subcontext; 121 struct search_context subcontext;
122 char str[20];
114 int channel,channel2; 123 int channel,channel2;
115 124
116 bacpy(&interface,BDADDR_ANY); 125 bacpy(&interface,BDADDR_ANY);
117 126
118 ba2str(bdaddr, str); 127 ba2str(bdaddr, str);
119 smprintf(s,"%s\n", str); 128 smprintf(s,"%s\n", str);
120 129
121 sess = sdp_connect(&interface, bdaddr, SDP_RETRY_IF_BUSY); 130 sess = sdp_connect(&interface, bdaddr, SDP_RETRY_IF_BUSY);
122 if (!sess) { 131 if (!sess) {
123 dbgprintf("Failed to connect to SDP server on %s: %s\n", str, strerror(errno)); 132 dbgprintf("Failed to connect to SDP server on %s: %s\n", str, strerror(errno));
124 return ERR_UNKNOWN; 133 return ERR_UNKNOWN;
125 } 134 }
126 135
127 attrid = sdp_list_append(0, &range); 136 attrid = sdp_list_append(0, &range);
128 search = sdp_list_append(0, &context->group); 137 search = sdp_list_append(0, &context->group);
129 if (sdp_service_search_attr_req(sess, search, SDP_ATTR_REQ_RANGE, attrid, &seq)) { 138 if (sdp_service_search_attr_req(sess, search, SDP_ATTR_REQ_RANGE, attrid, &seq)) {
130 dbgprintf("Service Search failed: %s\n", strerror(errno)); 139 dbgprintf("Service Search failed: %s\n", strerror(errno));
131 sdp_close(sess); 140 sdp_close(sess);
132 return ERR_UNKNOWN; 141 return ERR_UNKNOWN;
133 } 142 }
134 sdp_list_free(attrid, 0); 143 sdp_list_free(attrid, 0);
135 sdp_list_free(search, 0); 144 sdp_list_free(search, 0);
136 145
137 channel2 = -1; 146 channel2 = -1;
138 for (; seq; seq = next) { 147 for (; seq; seq = next) {
139 rec = (sdp_record_t *) seq->data; 148 rec = (sdp_record_t *) seq->data;
140 149
141 if (channel2 == -1) { 150 if (channel2 == -1) {
142 if (!context->tree) { 151 if (!context->tree) {
143 d = sdp_data_get(rec,SDP_ATTR_SVCNAME_PRIMARY); 152 d = sdp_data_get(rec,SDP_ATTR_SVCNAME_PRIMARY);
144 153
145 if (false) { 154 if (sdp_get_access_protos(rec,&proto) == 0) {
146 channel = -1; 155 channel = -1;
147 sdp_list_foreach(proto,print_access_protos,&channel); 156 sdp_list_foreach(proto,print_access_protos,&channel);
148 //sdp_list_free(proto,(sdp_free_func_t)sdp_data_free); 157 sdp_list_free(proto,(sdp_free_func_t)sdp_data_free);
149 } 158 }
150 smprintf(s,"Channel %i",channel); 159 smprintf(s,"Channel %i",channel);
151 if (d) smprintf(s," - \"%s\"",d->val.str); 160 if (d) smprintf(s," - \"%s\"",d->val.str);
152 smprintf(s,"\n"); 161 smprintf(s,"\n");
153 if (channel2 == -1 && bluetooth_checkservicename(s, d->val.str) == ERR_NONE) { 162 if (channel2 == -1 && bluetooth_checkservicename(s, d->val.str) == ERR_NONE) {
154 channel2 = channel; 163 channel2 = channel;
155 } 164 }
156 } 165 }
157 if (sdp_get_group_id(rec,&subcontext.group) != -1) { 166 if (sdp_get_group_id(rec,&subcontext.group) != -1) {
158 memcpy(&subcontext, context, sizeof(struct search_context)); 167 memcpy(&subcontext, context, sizeof(struct search_context));
159 if (subcontext.group.value.uuid16 != context->group.value.uuid16) bluetooth_checkdevice(s,bdaddr,&subcontext); 168 if (subcontext.group.value.uuid16 != context->group.value.uuid16) bluetooth_checkdevice(s,bdaddr,&subcontext);
160 } 169 }
161 } 170 }
162 171
163 next = seq->next; 172 next = seq->next;
164 free(seq); 173 free(seq);
165 //sdp_record_free(rec); 174 sdp_record_free(rec);
166 } 175 }
167 sdp_close(sess); 176 sdp_close(sess);
168 177
169 if (channel2 != -1) return bluetooth_connect(s, channel2, str); 178 if (channel2 != -1) return bluetooth_connect(s, channel2, str);
170 179
171 return ERR_UNKNOWN; 180 return ERR_NOTSUPPORTED;
172} 181}
173 182
174GSM_Error bluetooth_findchannel(GSM_StateMachine *s) 183GSM_Error bluetooth_findchannel(GSM_StateMachine *s)
175{ 184{
176 inquiry_info ii[20]; 185 inquiry_info ii[20];
177 uint8_t count = 0; 186 uint8_t count = 0;
178 int i; 187 int i;
179 struct search_context context; 188 struct search_context context;
180 GSM_Error error = ERR_NOTSUPPORTED; 189 GSM_Error error = ERR_NOTSUPPORTED;
181 190
182 memset(&context, '\0', sizeof(struct search_context)); 191 memset(&context, '\0', sizeof(struct search_context));
183 //sdp_uuid16_create(&(context.group),PUBLIC_BROWSE_GROUP); 192 sdp_uuid16_create(&(context.group),PUBLIC_BROWSE_GROUP);
184 193
185 if (!strcmp(s->CurrentConfig->Device,"/dev/ttyS1")) { 194 if (!strcmp(s->CurrentConfig->Device,"/dev/ttyS1")) {
186 dbgprintf("Searching for devices\n"); 195 dbgprintf("Searching for devices\n");
187 if (sdp_general_inquiry(ii, 20, 8, &count) < 0) { 196 if (sdp_general_inquiry(ii, 20, 8, &count) < 0) {
188 return ERR_UNKNOWN; 197 return ERR_UNKNOWN;
189 } 198 }
190 } else { 199 } else {
191 count = 1; 200 count = 1;
192 str2ba(s->CurrentConfig->Device,&ii[0].bdaddr); 201 str2ba(s->CurrentConfig->Device,&ii[0].bdaddr);
193 } 202 }
194 for (i=0;i<count;i++) { 203 for (i=0;i<count;i++) {
195 error = bluetooth_checkdevice(s,&ii[i].bdaddr,&context); 204 error = bluetooth_checkdevice(s,&ii[i].bdaddr,&context);
196 if (error == ERR_NONE) return error; 205 if (error == ERR_NONE) return error;
197 } 206 }
198 return error; 207 return error;
199} 208}
200 209
201#endif 210#endif
202#endif 211#endif
203#endif 212#endif
204 213
205/* How should editor hadle tabs in this file? Add editor commands here. 214/* How should editor hadle tabs in this file? Add editor commands here.
206 * vim: noexpandtab sw=8 ts=8 sts=8: 215 * vim: noexpandtab sw=8 ts=8 sts=8:
207 */ 216 */
diff --git a/gammu/emb/common/device/devfunc.c b/gammu/emb/common/device/devfunc.c
index d31ebbf..c58a01f 100644
--- a/gammu/emb/common/device/devfunc.c
+++ b/gammu/emb/common/device/devfunc.c
@@ -1,48 +1,56 @@
1/* Some source from Gnokii (www.gnokii.org)
2 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
3 * GNU GPL version 2 or later
4 */
5/* Some source from Minicom (http://alioth.debian.org/projects/minicom)
6 * (C) 1991,1992,1993,1994,1995,1996 by Miquel van Smoorenburg
7 * GNU GPL version 2
8 */
1 9
2#include <string.h> 10#include <string.h>
3#ifdef WIN32 11#ifdef WIN32
4# include <io.h> 12# include <io.h>
5#else 13#else
6# include <errno.h> 14# include <errno.h>
7# include <signal.h> 15# include <signal.h>
8#endif 16#endif
9 17
10#include "../gsmstate.h" 18#include "../gsmstate.h"
11 19
12#ifdef GSM_ENABLE_BLUETOOTHDEVICE 20#ifdef GSM_ENABLE_BLUETOOTHDEVICE
13#ifdef BLUETOOTH_RF_SEARCHING 21#ifdef BLUETOOTH_RF_SEARCHING
14 22
15GSM_Error bluetooth_checkservicename(GSM_StateMachine *s, char *name) 23GSM_Error bluetooth_checkservicename(GSM_StateMachine *s, char *name)
16{ 24{
17 if (s->ConnectionType == GCT_BLUEPHONET && strstr(name,"Nokia PC Suite")!=NULL) return ERR_NONE; 25 if (s->ConnectionType == GCT_BLUEPHONET && strstr(name,"Nokia PC Suite")!=NULL) return ERR_NONE;
18 if (s->ConnectionType == GCT_BLUEOBEX && strstr(name,"OBEX") !=NULL) return ERR_NONE; 26 if (s->ConnectionType == GCT_BLUEOBEX && strstr(name,"OBEX") !=NULL) return ERR_NONE;
19 if (s->ConnectionType == GCT_BLUEAT && strstr(name,"COM 1") !=NULL) return ERR_NONE; 27 if (s->ConnectionType == GCT_BLUEAT && strstr(name,"COM 1") !=NULL) return ERR_NONE;
20 return ERR_UNKNOWN; 28 return ERR_UNKNOWN;
21} 29}
22 30
23#endif 31#endif
24#endif 32#endif
25 33
26#if defined (GSM_ENABLE_BLUETOOTHDEVICE) || defined (GSM_ENABLE_IRDADEVICE) 34#if defined (GSM_ENABLE_BLUETOOTHDEVICE) || defined (GSM_ENABLE_IRDADEVICE)
27 35
28int socket_read(GSM_StateMachine *s, void *buf, size_t nbytes, int hPhone) 36int socket_read(GSM_StateMachine *s, void *buf, size_t nbytes, int hPhone)
29{ 37{
30 fd_set readfds; 38 fd_set readfds;
31#ifdef WIN32 39#ifdef WIN32
32 struct timeval timer; 40 struct timeval timer;
33#endif 41#endif
34 42
35 FD_ZERO(&readfds); 43 FD_ZERO(&readfds);
36 FD_SET(hPhone, &readfds); 44 FD_SET(hPhone, &readfds);
37#ifndef WIN32 45#ifndef WIN32
38 if (select(hPhone+1, &readfds, NULL, NULL, 0)) { 46 if (select(hPhone+1, &readfds, NULL, NULL, 0)) {
39 return(read(hPhone, buf, nbytes)); 47 return(read(hPhone, buf, nbytes));
40 } 48 }
41#else 49#else
42 memset(&timer,0,sizeof(timer)); 50 memset(&timer,0,sizeof(timer));
43 if (select(0, &readfds, NULL, NULL, &timer) != 0) { 51 if (select(0, &readfds, NULL, NULL, &timer) != 0) {
44 return(recv(hPhone, buf, nbytes, 0)); 52 return(recv(hPhone, buf, nbytes, 0));
45 } 53 }
46#endif 54#endif
47 return 0; 55 return 0;
48} 56}
@@ -60,97 +68,97 @@ int socket_write(GSM_StateMachine *s, void *buf, size_t nbytes, int hPhone)
60 ret = send(hPhone, buf, nbytes - actual, 0); 68 ret = send(hPhone, buf, nbytes - actual, 0);
61 if (ret < 0) { 69 if (ret < 0) {
62 if (actual != nbytes) GSM_OSErrorInfo(s,"socket_write"); 70 if (actual != nbytes) GSM_OSErrorInfo(s,"socket_write");
63 return actual; 71 return actual;
64 } 72 }
65 actual += ret; 73 actual += ret;
66 buf += ret; 74 buf += ret;
67 } while (actual < nbytes); 75 } while (actual < nbytes);
68 76
69 return actual; 77 return actual;
70} 78}
71 79
72GSM_Error socket_close(GSM_StateMachine *s, int hPhone) 80GSM_Error socket_close(GSM_StateMachine *s, int hPhone)
73{ 81{
74 shutdown(hPhone, 0); 82 shutdown(hPhone, 0);
75#ifdef WIN32 83#ifdef WIN32
76 closesocket(hPhone); /*FIXME: error checking */ 84 closesocket(hPhone); /*FIXME: error checking */
77#else 85#else
78 close(hPhone); /*FIXME: error checking */ 86 close(hPhone); /*FIXME: error checking */
79#endif 87#endif
80 return ERR_NONE; 88 return ERR_NONE;
81} 89}
82 90
83#endif 91#endif
84 92
85#ifdef ENABLE_LGPL 93#ifdef ENABLE_LGPL
86 94
87GSM_Error lock_device(const char* port, char **lock_device) 95GSM_Error lock_device(const char* port, char **lock_device)
88{ 96{
89 *lock_device = 0; 97 *lock_device = 0;
90 return ERR_NONE; 98 return ERR_NONE;
91} 99}
92 100
93bool unlock_device(char **lock_file) 101bool unlock_device(char **lock_file)
94{ 102{
95 return true; 103 return true;
96} 104}
97 105
98#else 106#else
99 107
100 #define max_buf_len 128 108 #define max_buf_len 128
101 #define lock_path "/var/lock/LCK.." 109 #define lock_path "/var/lock/LCK.."
102 110
103/* Lock the device. Allocated string with a lock name is returned 111/* Lock the device. Allocated string with a lock name is returned
104 * in lock_device 112 * in lock_device
105 */ 113 */
106GSM_Error lock_device(const char* port, char **lock_device) 114GSM_Error lock_device(const char* port, char **lock_device)
107{ 115{
108#ifndef WIN32 116#if !defined(WIN32) && !defined(DJGPP)
109 char *lock_file = NULL; 117 char *lock_file = NULL;
110 char buffer[max_buf_len]; 118 char buffer[max_buf_len];
111 const char *aux; 119 const char *aux;
112 int fd, len; 120 int fd, len;
113 GSM_Errorerror = ERR_NONE; 121 GSM_Errorerror = ERR_NONE;
114 122
115 dbgprintf("Locking device\n"); 123 dbgprintf("Locking device\n");
116 124
117 aux = strrchr(port, '/'); 125 aux = strrchr(port, '/');
118 /* Remove leading '/' */ 126 /* Remove leading '/' */
119 if (aux) { 127 if (aux) {
120 aux++; 128 aux++;
121 } else { 129 } else {
122 /* No / in port */ 130 /* No / in port */
123 aux = port; 131 aux = port;
124 } 132 }
125 len = strlen(aux) + strlen(lock_path); 133 len = strlen(aux) + strlen(lock_path);
126 134
127 memset(buffer, 0, sizeof(buffer)); 135 memset(buffer, 0, sizeof(buffer));
128 lock_file = calloc(len + 1, 1); 136 lock_file = calloc(len + 1, 1);
129 if (!lock_file) { 137 if (!lock_file) {
130 dbgprintf("Out of memory error while locking device\n"); 138 dbgprintf("Out of memory error while locking device\n");
131 return ERR_MOREMEMORY; 139 return ERR_MOREMEMORY;
132 } 140 }
133 /* I think we don't need to use strncpy, as we should have enough 141 /* I think we don't need to use strncpy, as we should have enough
134 * buffer due to strlen results 142 * buffer due to strlen results
135 */ 143 */
136 strcpy(lock_file, lock_path); 144 strcpy(lock_file, lock_path);
137 strcat(lock_file, aux); 145 strcat(lock_file, aux);
138 146
139 /* Check for the stale lockfile. 147 /* Check for the stale lockfile.
140 * The code taken from minicom by Miquel van Smoorenburg */ 148 * The code taken from minicom by Miquel van Smoorenburg */
141 if ((fd = open(lock_file, O_RDONLY)) >= 0) { 149 if ((fd = open(lock_file, O_RDONLY)) >= 0) {
142 char buf[max_buf_len]; 150 char buf[max_buf_len];
143 int pid, n = 0; 151 int pid, n = 0;
144 152
145 n = read(fd, buf, sizeof(buf) - 1); 153 n = read(fd, buf, sizeof(buf) - 1);
146 close(fd); 154 close(fd);
147 if (n > 0) { 155 if (n > 0) {
148 pid = -1; 156 pid = -1;
149 if (n == 4) 157 if (n == 4)
150 /* Kermit-style lockfile. */ 158 /* Kermit-style lockfile. */
151 pid = *(int *)buf; 159 pid = *(int *)buf;
152 else { 160 else {
153 /* Ascii lockfile. */ 161 /* Ascii lockfile. */
154 buf[n] = 0; 162 buf[n] = 0;
155 sscanf(buf, "%d", &pid); 163 sscanf(buf, "%d", &pid);
156 } 164 }
@@ -173,94 +181,94 @@ GSM_Error lock_device(const char* port, char **lock_device)
173 /* no wrong permissions are set. only reason could be */ 181 /* no wrong permissions are set. only reason could be */
174 /* flock/lockf or a empty lockfile due to a broken binary */ 182 /* flock/lockf or a empty lockfile due to a broken binary */
175 /* which is more likely */ 183 /* which is more likely */
176 if (n == 0) { 184 if (n == 0) {
177 dbgprintf("Unable to read lockfile %s.\n", lock_file); 185 dbgprintf("Unable to read lockfile %s.\n", lock_file);
178 dbgprintf("Please check for reason and remove the lockfile by hand.\n"); 186 dbgprintf("Please check for reason and remove the lockfile by hand.\n");
179 dbgprintf("Cannot lock device\n"); 187 dbgprintf("Cannot lock device\n");
180 error = ERR_UNKNOWN; 188 error = ERR_UNKNOWN;
181 goto failed; 189 goto failed;
182 } 190 }
183 } 191 }
184 192
185 /* Try to create a new file, with 0644 mode */ 193 /* Try to create a new file, with 0644 mode */
186 fd = open(lock_file, O_CREAT | O_EXCL | O_WRONLY, 0644); 194 fd = open(lock_file, O_CREAT | O_EXCL | O_WRONLY, 0644);
187 if (fd == -1) { 195 if (fd == -1) {
188 if (errno == EEXIST) { 196 if (errno == EEXIST) {
189 dbgprintf("Device seems to be locked by unknown process\n"); 197 dbgprintf("Device seems to be locked by unknown process\n");
190 error = ERR_DEVICEOPENERROR; 198 error = ERR_DEVICEOPENERROR;
191 } else if (errno == EACCES) { 199 } else if (errno == EACCES) {
192 dbgprintf("Please check permission on lock directory\n"); 200 dbgprintf("Please check permission on lock directory\n");
193 error = ERR_PERMISSION; 201 error = ERR_PERMISSION;
194 } else if (errno == ENOENT) { 202 } else if (errno == ENOENT) {
195 dbgprintf("Cannot create lockfile %s. Please check for existence of path\n", lock_file); 203 dbgprintf("Cannot create lockfile %s. Please check for existence of path\n", lock_file);
196 error = ERR_UNKNOWN; 204 error = ERR_UNKNOWN;
197 } else { 205 } else {
198 dbgprintf("Unknown error with creating lockfile %s\n", lock_file); 206 dbgprintf("Unknown error with creating lockfile %s\n", lock_file);
199 error = ERR_UNKNOWN; 207 error = ERR_UNKNOWN;
200 } 208 }
201 goto failed; 209 goto failed;
202 } 210 }
203 sprintf(buffer, "%10ld gammu\n", (long)getpid()); 211 sprintf(buffer, "%10ld gammu\n", (long)getpid());
204 write(fd, buffer, strlen(buffer)); 212 write(fd, buffer, strlen(buffer));
205 close(fd); 213 close(fd);
206 *lock_device = lock_file; 214 *lock_device = lock_file;
207 return ERR_NONE; 215 return ERR_NONE;
208failed: 216failed:
209 free(lock_file); 217 free(lock_file);
210 *lock_device = 0; 218 *lock_device = 0;
211 return error; 219 return error;
212#else 220#else
213 *lock_device = 0; 221 *lock_device = 0;
214 return ERR_NONE; 222 return ERR_NONE;
215#endif 223#endif
216} 224}
217 225
218/* Removes lock and frees memory */ 226/* Removes lock and frees memory */
219bool unlock_device(char **lock_file) 227bool unlock_device(char **lock_file)
220{ 228{
221#ifndef WIN32 229#if !defined(WIN32) && !defined(DJGPP)
222 int err; 230 int err;
223 231
224 if (!lock_file) { 232 if (!lock_file) {
225 dbgprintf("Cannot unlock device\n"); 233 dbgprintf("Cannot unlock device\n");
226 return false; 234 return false;
227 } 235 }
228 err = unlink(*lock_file); 236 err = unlink(*lock_file);
229 free(*lock_file); 237 free(*lock_file);
230 *lock_file = NULL; 238 *lock_file = NULL;
231 return (err + 1); 239 return (err + 1);
232#else 240#else
233 return true; 241 return true;
234#endif 242#endif
235} 243}
236 244
237#endif 245#endif
238 246
239int FindSerialSpeed(char *buffer) 247int FindSerialSpeed(char *buffer)
240{ 248{
241 switch (atoi(buffer)) { 249 switch (atoi(buffer)) {
242 case 50 : return 50; 250 case 50 : return 50;
243 case 75 : return 75; 251 case 75 : return 75;
244 case 110: return 110; 252 case 110: return 110;
245 case 134: return 134; 253 case 134: return 134;
246 case 150: return 150; 254 case 150: return 150;
247 case 200: return 200; 255 case 200: return 200;
248 case 300: return 300; 256 case 300: return 300;
249 case 600: return 600; 257 case 600: return 600;
250 case 1200: return 1200; 258 case 1200: return 1200;
251 case 1800: return 1800; 259 case 1800: return 1800;
252 case 2400: return 2400; 260 case 2400: return 2400;
253 case 4800: return 4800; 261 case 4800: return 4800;
254 case 9600: return 9600; 262 case 9600: return 9600;
255 case 19200: return 19200; 263 case 19200: return 19200;
256 case 38400: return 38400; 264 case 38400: return 38400;
257 case 57600: return 57600; 265 case 57600: return 57600;
258 case 115200: return 115200; 266 case 115200: return 115200;
259 case 230400: return 230400; 267 case 230400: return 230400;
260 default : return 0; 268 default : return 0;
261 } 269 }
262} 270}
263 271
264/* How should editor hadle tabs in this file? Add editor commands here. 272/* How should editor hadle tabs in this file? Add editor commands here.
265 * vim: noexpandtab sw=8 ts=8 sts=8: 273 * vim: noexpandtab sw=8 ts=8 sts=8:
266 */ 274 */
diff --git a/gammu/emb/common/device/irda/irda.c b/gammu/emb/common/device/irda/irda.c
index fef50ac..e680377 100644
--- a/gammu/emb/common/device/irda/irda.c
+++ b/gammu/emb/common/device/irda/irda.c
@@ -1,51 +1,55 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2/* based on some work from Ralf Thelen and MyGnokii */ 2/* based on some work from Ralf Thelen and MyGnokii (www.mwiacek.com) */
3/* based on some work from Gnokii and MSDN */ 3/* based on some work from MSDN */
4/* based on some work from Gnokii (www.gnokii.org)
5 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
6 * GNU GPL version 2 or later
7 */
4 8
5/* You have to include wsock32.lib library to MS VC project to compile it */ 9/* You have to include wsock32.lib library to MS VC project to compile it */
6 10
7#include "../../gsmstate.h" 11#include "../../gsmstate.h"
8 12
9#ifdef GSM_ENABLE_IRDADEVICE 13#ifdef GSM_ENABLE_IRDADEVICE
10#ifndef DJGPP 14#ifndef DJGPP
11 15
12#ifndef WIN32 16#ifndef WIN32
13# include <stdlib.h> 17# include <stdlib.h>
14# include <unistd.h> 18# include <unistd.h>
15# include <stdio.h> 19# include <stdio.h>
16# include <fcntl.h> 20# include <fcntl.h>
17# include <errno.h> 21# include <errno.h>
18# include <string.h> 22# include <string.h>
19# include <sys/time.h> 23# include <sys/time.h>
20# include <sys/poll.h> 24# include <sys/poll.h>
21# include <sys/socket.h> 25# include <sys/socket.h>
22# include <sys/ioctl.h> 26# include <sys/ioctl.h>
23#else 27#else
24# include <windows.h> 28# include <windows.h>
25# include <io.h> 29# include <io.h>
26#endif 30#endif
27 31
28#include "../../gsmcomon.h" 32#include "../../gsmcomon.h"
29#include "../devfunc.h" 33#include "../devfunc.h"
30#include "irda.h" 34#include "irda.h"
31 35
32static bool irda_discover_device(GSM_StateMachine *state) 36static bool irda_discover_device(GSM_StateMachine *state)
33{ 37{
34 GSM_Device_IrdaData *d = &state->Device.Data.Irda; 38 GSM_Device_IrdaData *d = &state->Device.Data.Irda;
35 struct irda_device_list*list; 39 struct irda_device_list*list;
36 unsigned char *buf; 40 unsigned char *buf;
37 unsigned int sec; 41 unsigned int sec;
38 int s, z, len, fd, i; 42 int s, z, len, fd, i;
39 GSM_DateTime Date; 43 GSM_DateTime Date;
40 bool founddevice = false; 44 bool founddevice = false;
41#ifdef WIN32 45#ifdef WIN32
42 int index; 46 int index;
43#endif 47#endif
44 48
45 fd = socket(AF_IRDA, SOCK_STREAM, 0); 49 fd = socket(AF_IRDA, SOCK_STREAM, 0);
46 50
47 /* can handle maximally 10 devices during discovering */ 51 /* can handle maximally 10 devices during discovering */
48 len = sizeof(struct irda_device_list) + sizeof(struct irda_device_info) * 10; 52 len = sizeof(struct irda_device_list) + sizeof(struct irda_device_info) * 10;
49 buf = malloc(len); 53 buf = malloc(len);
50 list = (struct irda_device_list *)buf; 54 list = (struct irda_device_list *)buf;
51 55
diff --git a/gammu/emb/common/device/irda/irda_unx.h b/gammu/emb/common/device/irda/irda_unx.h
index 8dbcb97..7a55273 100644
--- a/gammu/emb/common/device/irda/irda_unx.h
+++ b/gammu/emb/common/device/irda/irda_unx.h
@@ -1,49 +1,49 @@
1/* part of irda.h available in Linux kernel source */ 1/* part of irda.h available in Linux kernel source (www.kernel.org) */
2 2
3/********************************************************************* 3/*********************************************************************
4 * 4 *
5 * Filename: irda.h 5 * Filename: irda.h
6 * Version: 6 * Version:
7 * Description: 7 * Description:
8 * Status: Experimental. 8 * Status: Experimental.
9 * Author: Dag Brattli <dagb@cs.uit.no> 9 * Author: Dag Brattli <dagb@cs.uit.no>
10 * Created at: Mon Mar 8 14:06:12 1999 10 * Created at: Mon Mar 8 14:06:12 1999
11 * Modified at: Sat Dec 25 16:06:42 1999 11 * Modified at: Sat Dec 25 16:06:42 1999
12 * Modified by: Dag Brattli <dagb@cs.uit.no> 12 * Modified by: Dag Brattli <dagb@cs.uit.no>
13 * 13 *
14 * Copyright (c) 1999 Dag Brattli, All Rights Reserved. 14 * Copyright (c) 1999 Dag Brattli, All Rights Reserved.
15 * 15 *
16 * This program is free software; you can redistribute it and/or 16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License as 17 * modify it under the terms of the GNU General Public License as
18 * published by the Free Software Foundation; either version 2 of 18 * published by the Free Software Foundation; either version 2 of
19 * the License, or (at your option) any later version. 19 * the License, or (at your option) any later version.
20 * 20 *
21 * Neither Dag Brattli nor University of Tromsø admit liability nor 21 * Neither Dag Brattli nor University of Tromsø admit liability nor
22 * provide warranty for any of this software. This material is 22 * provide warranty for any of this software. This material is
23 * provided "AS-IS" and at no charge. 23 * provided "AS-IS" and at no charge.
24 * 24 *
25 ********************************************************************/ 25 ********************************************************************/
26 26
27#ifndef __irda_unx_h 27#ifndef __irda_unx_h
28#define __irda_unx_h 28#define __irda_unx_h
29 29
30#include <sys/types.h> 30#include <sys/types.h>
31#include <sys/socket.h> 31#include <sys/socket.h>
32 32
33 #define SOL_IRLMP 266 /* Same as SOL_IRDA for now */ 33 #define SOL_IRLMP 266 /* Same as SOL_IRDA for now */
34 #define IRLMP_ENUMDEVICES 1 /* Return discovery log */ 34 #define IRLMP_ENUMDEVICES 1 /* Return discovery log */
35#define LSAP_ANY 0xff 35#define LSAP_ANY 0xff
36 36
37struct sockaddr_irda { 37struct sockaddr_irda {
38 sa_family_t irdaAddressFamily;/* AF_IRDA */ 38 sa_family_t irdaAddressFamily;/* AF_IRDA */
39 u_int8_t sir_lsap_sel; /* LSAP selector */ 39 u_int8_t sir_lsap_sel; /* LSAP selector */
40 u_int32_t irdaDeviceID; /* Device address */ 40 u_int32_t irdaDeviceID; /* Device address */
41 char irdaServiceName[25]; /* Usually <service>:IrDA:TinyTP */ 41 char irdaServiceName[25]; /* Usually <service>:IrDA:TinyTP */
42}; 42};
43 43
44struct irda_device_info { 44struct irda_device_info {
45 u_int32_t saddr; /* Address of local interface */ 45 u_int32_t saddr; /* Address of local interface */
46 u_int32_t irdaDeviceID; /* Address of remote device */ 46 u_int32_t irdaDeviceID; /* Address of remote device */
47 char irdaDeviceName[22]; /* Description */ 47 char irdaDeviceName[22]; /* Description */
48 u_int8_t charset; /* Charset used for description */ 48 u_int8_t charset; /* Charset used for description */
49 u_int8_t hints[2]; /* Hint bits */ 49 u_int8_t hints[2]; /* Hint bits */
diff --git a/gammu/emb/common/device/serial/ser_djg.c b/gammu/emb/common/device/serial/ser_djg.c
index ac9d7c8..2524187 100644
--- a/gammu/emb/common/device/serial/ser_djg.c
+++ b/gammu/emb/common/device/serial/ser_djg.c
@@ -1,74 +1,74 @@
1 1
2#include "../../gsmstate.h" 2#include "../../gsmstate.h"
3 3
4#ifdef GSM_ENABLE_SERIALDEVICE 4#ifdef GSM_ENABLE_SERIALDEVICE
5#ifdef DJGPP 5#ifdef DJGPP
6 6
7#include "../../gsmcomon.h" 7#include "../../gsmcomon.h"
8#include "ser_djg.h" 8#include "ser_djg.h"
9 9
10static GSM_Error serial_close(GSM_StateMachine *s) 10static GSM_Error serial_close(GSM_StateMachine *s)
11{ 11{
12 GSM_Device_SerialData *d = &s->Device.Data.Serial; 12 GSM_Device_SerialData *d = &s->Device.Data.Serial;
13 13
14 return ERR_NONE; 14 return ERR_NOTIMPLEMENTED;
15} 15}
16 16
17static GSM_Error serial_open (GSM_StateMachine *s) 17static GSM_Error serial_open (GSM_StateMachine *s)
18{ 18{
19 GSM_Device_SerialData *d = &s->Device.Data.Serial; 19 GSM_Device_SerialData *d = &s->Device.Data.Serial;
20 20
21 return ERR_NONE; 21 return ERR_NOTIMPLEMENTED;
22} 22}
23 23
24static GSM_Error serial_setparity(GSM_StateMachine *s, bool parity) 24static GSM_Error serial_setparity(GSM_StateMachine *s, bool parity)
25{ 25{
26 GSM_Device_SerialData *d = &s->Device.Data.Serial; 26 GSM_Device_SerialData *d = &s->Device.Data.Serial;
27 27
28 return ERR_NONE; 28 return ERR_NOTIMPLEMENTED;
29} 29}
30 30
31static GSM_Error serial_setdtrrts(GSM_StateMachine *s, bool dtr, bool rts) 31static GSM_Error serial_setdtrrts(GSM_StateMachine *s, bool dtr, bool rts)
32{ 32{
33 GSM_Device_SerialData *d = &s->Device.Data.Serial; 33 GSM_Device_SerialData *d = &s->Device.Data.Serial;
34 34
35 return ERR_NONE; 35 return ERR_NOTIMPLEMENTED;
36} 36}
37 37
38static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed) 38static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed)
39{ 39{
40 GSM_Device_SerialData *d = &s->Device.Data.Serial; 40 GSM_Device_SerialData *d = &s->Device.Data.Serial;
41 41
42 return ERR_NONE; 42 return ERR_NOTIMPLEMENTED;
43} 43}
44 44
45static int serial_read(GSM_StateMachine *s, void *buf, size_t nbytes) 45static int serial_read(GSM_StateMachine *s, void *buf, size_t nbytes)
46{ 46{
47 GSM_Device_SerialData *d = &s->Device.Data.Serial; 47 GSM_Device_SerialData *d = &s->Device.Data.Serial;
48 48
49 return 0; 49 return 0;
50} 50}
51 51
52static int serial_write(GSM_StateMachine *s, void *buf, size_t nbytes) 52static int serial_write(GSM_StateMachine *s, void *buf, size_t nbytes)
53{ 53{
54 GSM_Device_SerialData *d = &s->Device.Data.Serial; 54 GSM_Device_SerialData *d = &s->Device.Data.Serial;
55 55
56 return 0; 56 return 0;
57} 57}
58 58
59GSM_Device_Functions SerialDevice = { 59GSM_Device_Functions SerialDevice = {
60 serial_open, 60 serial_open,
61 serial_close, 61 serial_close,
62 serial_setparity, 62 serial_setparity,
63 serial_setdtrrts, 63 serial_setdtrrts,
64 serial_setspeed, 64 serial_setspeed,
65 serial_read, 65 serial_read,
66 serial_write 66 serial_write
67}; 67};
68 68
69#endif 69#endif
70#endif 70#endif
71 71
72/* How should editor hadle tabs in this file? Add editor commands here. 72/* How should editor hadle tabs in this file? Add editor commands here.
73 * vim: noexpandtab sw=8 ts=8 sts=8: 73 * vim: noexpandtab sw=8 ts=8 sts=8:
74 */ 74 */
diff --git a/gammu/emb/common/device/serial/ser_unx.c b/gammu/emb/common/device/serial/ser_unx.c
index 2a87b11..69c7515 100644
--- a/gammu/emb/common/device/serial/ser_unx.c
+++ b/gammu/emb/common/device/serial/ser_unx.c
@@ -1,83 +1,107 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2/* locking device and settings all speeds by Michal Cihar */ 2/* locking device and settings all speeds by Michal Cihar */
3/* based on some work from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
6 */
3 7
4#include "../../gsmstate.h" 8#include "../../gsmstate.h"
5 9
6#ifdef GSM_ENABLE_SERIALDEVICE 10#ifdef GSM_ENABLE_SERIALDEVICE
7#ifndef WIN32 11#ifndef WIN32
8#ifndef DJGPP 12#ifndef DJGPP
9 13
10#include <sys/file.h> 14#include <sys/file.h>
11#include <sys/time.h> 15#include <sys/time.h>
12#include <string.h> 16#include <string.h>
13#include <termios.h> 17#include <termios.h>
14#include <errno.h> 18#include <errno.h>
15 19
16#include "../../gsmcomon.h" 20#include "../../gsmcomon.h"
17#include "ser_unx.h" 21#include "ser_unx.h"
18 22
23#ifndef O_NONBLOCK
24# define O_NONBLOCK 0
25#endif
26
27#ifdef __NetBSD__
28# define FNONBLOCK O_NONBLOCK
29
30# define B57600 0010001
31# define B115200 0010002
32# define B230400 0010003
33# define B460800 0010004
34# define B500000 0010005
35# define B576000 0010006
36# define B921600 0010007
37# define B1000000 0010010
38# define B1152000 0010011
39# define B1500000 0010012
40# define B2000000 0010013
41# define B2500000 0010014
42# define B3000000 0010015
43# define B3500000 0010016
44# define B4000000 0010017
45#endif
46
19static GSM_Error serial_close(GSM_StateMachine *s) 47static GSM_Error serial_close(GSM_StateMachine *s)
20{ 48{
21 GSM_Device_SerialData *d = &s->Device.Data.Serial; 49 GSM_Device_SerialData *d = &s->Device.Data.Serial;
22 50
23 /* Restores old settings */ 51 /* Restores old settings */
24 tcsetattr(d->hPhone, TCSANOW, &d->old_settings); 52 tcsetattr(d->hPhone, TCSANOW, &d->old_settings);
25 53
26 /* Closes device */ 54 /* Closes device */
27 close(d->hPhone); 55 close(d->hPhone);
28 56
29 return ERR_NONE; 57 return ERR_NONE;
30} 58}
31 59
32#ifndef O_NONBLOCK
33# define O_NONBLOCK 0
34#endif
35
36static GSM_Error serial_open (GSM_StateMachine *s) 60static GSM_Error serial_open (GSM_StateMachine *s)
37{ 61{
38 GSM_Device_SerialData *d = &s->Device.Data.Serial; 62 GSM_Device_SerialData *d = &s->Device.Data.Serial;
39 struct termios t; 63 struct termios t;
40 int i; 64 int i;
41 65
42 /* O_NONBLOCK MUST is required to avoid waiting for DCD */ 66 /* O_NONBLOCK MUST is required to avoid waiting for DCD */
43 d->hPhone = open(s->CurrentConfig->Device, O_RDWR | O_NOCTTY | O_NONBLOCK); 67 d->hPhone = open(s->CurrentConfig->Device, O_RDWR | O_NOCTTY | O_NONBLOCK);
44 if (d->hPhone < 0) { 68 if (d->hPhone < 0) {
45 i = errno; 69 i = errno;
46 GSM_OSErrorInfo(s,"open in serial_open"); 70 GSM_OSErrorInfo(s,"open in serial_open");
47 if (i == 2) return ERR_DEVICENOTEXIST; //no such file or directory 71 if (i == 2) return ERR_DEVICENOTEXIST; //no such file or directory
48 if (i == 13) return ERR_DEVICENOPERMISSION;//permission denied 72 if (i == 13) return ERR_DEVICENOPERMISSION;//permission denied
49 return ERR_DEVICEOPENERROR; 73 return ERR_DEVICEOPENERROR;
50 } 74 }
51 75
52#ifdef TIOCEXCL 76#ifdef TIOCEXCL
53 /* open() calls from other applications shall fail now */ 77 /* open() calls from other applications shall fail now */
54 ioctl(d->hPhone, TIOCEXCL, (char *) 0); 78 ioctl(d->hPhone, TIOCEXCL, (char *) 0);
55#endif 79#endif
56 80
57 if (tcgetattr(d->hPhone, &d->old_settings) == -1) { 81 if (tcgetattr(d->hPhone, &d->old_settings) == -1) {
58 close(d->hPhone); 82 close(d->hPhone);
59 GSM_OSErrorInfo(s,"tcgetattr in serial_open"); 83 GSM_OSErrorInfo(s,"tcgetattr in serial_open");
60 return ERR_DEVICEREADERROR; 84 return ERR_DEVICEREADERROR;
61 } 85 }
62 86
63 if (tcflush(d->hPhone, TCIOFLUSH) == -1) { 87 if (tcflush(d->hPhone, TCIOFLUSH) == -1) {
64 serial_close(s); 88 serial_close(s);
65 GSM_OSErrorInfo(s,"tcflush in serial_open"); 89 GSM_OSErrorInfo(s,"tcflush in serial_open");
66 return ERR_DEVICEOPENERROR; 90 return ERR_DEVICEOPENERROR;
67 } 91 }
68 92
69 memcpy(&t, &d->old_settings, sizeof(struct termios)); 93 memcpy(&t, &d->old_settings, sizeof(struct termios));
70 94
71 /* Opening without parity */ 95 /* Opening without parity */
72 t.c_iflag = IGNPAR; 96 t.c_iflag = IGNPAR;
73 t.c_oflag = 0; 97 t.c_oflag = 0;
74 /* disconnect line, 8 bits, enable receiver, 98 /* disconnect line, 8 bits, enable receiver,
75 * ignore modem lines,lower modem line after disconnect 99 * ignore modem lines,lower modem line after disconnect
76 */ 100 */
77 t.c_cflag = B0 | CS8 | CREAD | CLOCAL | HUPCL; 101 t.c_cflag = B0 | CS8 | CREAD | CLOCAL | HUPCL;
78 /* enable hardware (RTS/CTS) flow control (NON POSIX) */ 102 /* enable hardware (RTS/CTS) flow control (NON POSIX) */
79 /* t.c_cflag |= CRTSCTS; */ 103 /* t.c_cflag |= CRTSCTS; */
80 t.c_lflag = 0; 104 t.c_lflag = 0;
81 t.c_cc[VMIN] = 1; 105 t.c_cc[VMIN] = 1;
82 t.c_cc[VTIME] = 0; 106 t.c_cc[VTIME] = 0;
83 107
@@ -132,136 +156,140 @@ static GSM_Error serial_setdtrrts(GSM_StateMachine *s, bool dtr, bool rts)
132 if (tcgetattr(d->hPhone, &t)) { 156 if (tcgetattr(d->hPhone, &t)) {
133 GSM_OSErrorInfo(s,"tcgetattr in serial_setdtrrts"); 157 GSM_OSErrorInfo(s,"tcgetattr in serial_setdtrrts");
134 return ERR_DEVICEREADERROR; 158 return ERR_DEVICEREADERROR;
135 } 159 }
136 160
137#ifdef CRTSCTS 161#ifdef CRTSCTS
138 /* Disabling hardware flow control */ 162 /* Disabling hardware flow control */
139 t.c_cflag &= ~CRTSCTS; 163 t.c_cflag &= ~CRTSCTS;
140#endif 164#endif
141 165
142 if (tcsetattr(d->hPhone, TCSANOW, &t) == -1) { 166 if (tcsetattr(d->hPhone, TCSANOW, &t) == -1) {
143 serial_close(s); 167 serial_close(s);
144 GSM_OSErrorInfo(s,"tcsetattr in serial_setdtrrts"); 168 GSM_OSErrorInfo(s,"tcsetattr in serial_setdtrrts");
145 return ERR_DEVICEDTRRTSERROR; 169 return ERR_DEVICEDTRRTSERROR;
146 } 170 }
147 171
148 flags = TIOCM_DTR; 172 flags = TIOCM_DTR;
149 if (dtr) { 173 if (dtr) {
150 ioctl(d->hPhone, TIOCMBIS, &flags); 174 ioctl(d->hPhone, TIOCMBIS, &flags);
151 } else { 175 } else {
152 ioctl(d->hPhone, TIOCMBIC, &flags); 176 ioctl(d->hPhone, TIOCMBIC, &flags);
153 } 177 }
154 178
155 flags = TIOCM_RTS; 179 flags = TIOCM_RTS;
156 if (rts) { 180 if (rts) {
157 ioctl(d->hPhone, TIOCMBIS, &flags); 181 ioctl(d->hPhone, TIOCMBIS, &flags);
158 } else { 182 } else {
159 ioctl(d->hPhone, TIOCMBIC, &flags); 183 ioctl(d->hPhone, TIOCMBIC, &flags);
160 } 184 }
161 185
162 flags = 0; 186 flags = 0;
163 ioctl(d->hPhone, TIOCMGET, &flags); 187 ioctl(d->hPhone, TIOCMGET, &flags);
164 188
165 dbgprintf("Serial device:"); 189 dbgprintf("Serial device:");
166 dbgprintf(" DTR is %s", flags&TIOCM_DTR?"up":"down"); 190 dbgprintf(" DTR is %s", flags&TIOCM_DTR?"up":"down");
167 dbgprintf(", RTS is %s", flags&TIOCM_RTS?"up":"down"); 191 dbgprintf(", RTS is %s", flags&TIOCM_RTS?"up":"down");
168 dbgprintf(", CAR is %s", flags&TIOCM_CAR?"up":"down"); 192 dbgprintf(", CAR is %s", flags&TIOCM_CAR?"up":"down");
169 dbgprintf(", CTS is %s\n", flags&TIOCM_CTS?"up":"down"); 193 dbgprintf(", CTS is %s\n", flags&TIOCM_CTS?"up":"down");
170 if (((flags&TIOCM_DTR)==TIOCM_DTR) != dtr) return ERR_DEVICEDTRRTSERROR; 194 if (((flags&TIOCM_DTR)==TIOCM_DTR) != dtr) return ERR_DEVICEDTRRTSERROR;
171 if (((flags&TIOCM_RTS)==TIOCM_RTS) != rts) return ERR_DEVICEDTRRTSERROR; 195 if (((flags&TIOCM_RTS)==TIOCM_RTS) != rts) return ERR_DEVICEDTRRTSERROR;
172 196
173 return ERR_NONE; 197 return ERR_NONE;
174} 198}
175 199
176static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed) 200static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed)
177{ 201{
178 GSM_Device_SerialData *d = &s->Device.Data.Serial; 202 GSM_Device_SerialData *d = &s->Device.Data.Serial;
179 struct termios t; 203 struct termios t;
180 int speed2 = B19200; 204 int speed2 = B19200;
181 205
182 if (tcgetattr(d->hPhone, &t)) { 206 if (tcgetattr(d->hPhone, &t)) {
183 GSM_OSErrorInfo(s,"tcgetattr in serial_setspeed"); 207 GSM_OSErrorInfo(s,"tcgetattr in serial_setspeed");
184 return ERR_DEVICEREADERROR; 208 return ERR_DEVICEREADERROR;
185 } 209 }
186 210
187 smprintf(s, "Setting speed to %d\n", speed); 211 smprintf(s, "Setting speed to %d\n", speed);
188 212
189 switch (speed) { 213 switch (speed) {
190 case 50: speed2 = B50; break; 214 case 50: speed2 = B50; break;
191 case 75: speed2 = B75; break; 215 case 75: speed2 = B75; break;
192 case 110: speed2 = B110; break; 216 case 110: speed2 = B110; break;
193 case 134: speed2 = B134; break; 217 case 134: speed2 = B134; break;
194 case 150: speed2 = B150; break; 218 case 150: speed2 = B150; break;
195 case 200: speed2 = B200; break; 219 case 200: speed2 = B200; break;
196 case 300: speed2 = B300; break; 220 case 300: speed2 = B300; break;
197 case 600: speed2 = B600; break; 221 case 600: speed2 = B600; break;
198 case 1200: speed2 = B1200; break; 222 case 1200: speed2 = B1200; break;
199 case 1800: speed2 = B1800; break; 223 case 1800: speed2 = B1800; break;
200 case 2400: speed2 = B2400; break; 224 case 2400: speed2 = B2400; break;
201 case 4800: speed2 = B4800; break; 225 case 4800: speed2 = B4800; break;
202 case 9600: speed2 = B9600; break; 226 case 9600: speed2 = B9600; break;
203 case 19200: speed2 = B19200;break; 227 case 19200: speed2 = B19200;break;
204 case 38400: speed2 = B38400;break; 228 case 38400: speed2 = B38400;break;
229#ifdef B57600
205 case 57600: speed2 = B57600;break; 230 case 57600: speed2 = B57600;break;
206 case 115200: speed2 = B115200;break; 231 case 115200: speed2 = B115200;break;
207 case 230400: speed2 = B230400;break; 232 case 230400: speed2 = B230400;break;
208 case 460800: speed2 = B460800;break; 233 case 460800: speed2 = B460800;break;
234#ifdef B500000
209 case 500000: speed2 = B500000;break; 235 case 500000: speed2 = B500000;break;
210 case 576000: speed2 = B576000;break; 236 case 576000: speed2 = B576000;break;
211 case 921600: speed2 = B921600;break; 237 case 921600: speed2 = B921600;break;
212 case 1000000: speed2 = B1000000;break; 238 case 1000000: speed2 = B1000000;break;
213 case 1152000: speed2 = B1152000;break; 239 case 1152000: speed2 = B1152000;break;
214 case 1500000: speed2 = B1500000;break; 240 case 1500000: speed2 = B1500000;break;
215 case 2000000: speed2 = B2000000;break; 241 case 2000000: speed2 = B2000000;break;
216 case 2500000: speed2 = B2500000;break; 242 case 2500000: speed2 = B2500000;break;
217 case 3000000: speed2 = B3000000;break; 243 case 3000000: speed2 = B3000000;break;
218 case 3500000: speed2 = B3500000;break; 244 case 3500000: speed2 = B3500000;break;
219 case 4000000: speed2 = B4000000; break; 245 case 4000000: speed2 = B4000000; break;
246#endif
247#endif
220 } 248 }
221 249
222 /* This should work on all systems because it is done according to POSIX */ 250 /* This should work on all systems because it is done according to POSIX */
223 cfsetispeed(&t, speed2); 251 cfsetispeed(&t, speed2);
224 cfsetospeed(&t, speed2); 252 cfsetospeed(&t, speed2);
225 253
226 if (tcsetattr(d->hPhone, TCSADRAIN, &t) == -1) { 254 if (tcsetattr(d->hPhone, TCSADRAIN, &t) == -1) {
227 serial_close(s); 255 serial_close(s);
228 GSM_OSErrorInfo(s,"tcsetattr in serial_setspeed"); 256 GSM_OSErrorInfo(s,"tcsetattr in serial_setspeed");
229 return ERR_DEVICECHANGESPEEDERROR; 257 return ERR_DEVICECHANGESPEEDERROR;
230 } 258 }
231 259
232 return ERR_NONE; 260 return ERR_NONE;
233} 261}
234 262
235static int serial_read(GSM_StateMachine *s, void *buf, size_t nbytes) 263static int serial_read(GSM_StateMachine *s, void *buf, size_t nbytes)
236{ 264{
237 GSM_Device_SerialData *d = &s->Device.Data.Serial; 265 GSM_Device_SerialData *d = &s->Device.Data.Serial;
238 struct timeval timeout2; 266 struct timeval timeout2;
239 fd_set readfds; 267 fd_set readfds;
240 int actual = 0; 268 int actual = 0;
241 269
242 FD_ZERO(&readfds); 270 FD_ZERO(&readfds);
243 FD_SET(d->hPhone, &readfds); 271 FD_SET(d->hPhone, &readfds);
244 272
245 timeout2.tv_sec = 0; 273 timeout2.tv_sec = 0;
246 timeout2.tv_usec = 1; 274 timeout2.tv_usec = 1;
247 275
248 if (select(d->hPhone+1, &readfds, NULL, NULL, &timeout2)) { 276 if (select(d->hPhone+1, &readfds, NULL, NULL, &timeout2)) {
249 actual = read(d->hPhone, buf, nbytes); 277 actual = read(d->hPhone, buf, nbytes);
250 if (actual == -1) GSM_OSErrorInfo(s,"serial_read"); 278 if (actual == -1) GSM_OSErrorInfo(s,"serial_read");
251 } 279 }
252 return actual; 280 return actual;
253} 281}
254 282
255static int serial_write(GSM_StateMachine *s, void *buf, size_t nbytes) 283static int serial_write(GSM_StateMachine *s, void *buf, size_t nbytes)
256{ 284{
257 GSM_Device_SerialData *d = &s->Device.Data.Serial; 285 GSM_Device_SerialData *d = &s->Device.Data.Serial;
258 int ret; 286 int ret;
259 size_t actual = 0; 287 size_t actual = 0;
260 288
261 do { 289 do {
262 ret = write(d->hPhone, (unsigned char *)buf, nbytes - actual); 290 ret = write(d->hPhone, (unsigned char *)buf, nbytes - actual);
263 if (ret < 0 && errno == EAGAIN) continue; 291 if (ret < 0 && errno == EAGAIN) continue;
264 if (ret < 0) { 292 if (ret < 0) {
265 if (actual != nbytes) GSM_OSErrorInfo(s,"serial_write"); 293 if (actual != nbytes) GSM_OSErrorInfo(s,"serial_write");
266 return actual; 294 return actual;
267 } 295 }
diff --git a/gammu/emb/common/device/serial/ser_w32.c b/gammu/emb/common/device/serial/ser_w32.c
index 9fa0135..7d88fc7 100644
--- a/gammu/emb/common/device/serial/ser_w32.c
+++ b/gammu/emb/common/device/serial/ser_w32.c
@@ -1,50 +1,54 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2/* based on some work from Gnokii, MSDN and others */ 2/* based on some work from MSDN and others */
3/* based on some work from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
6 */
3 7
4#include "../../gsmstate.h" 8#include "../../gsmstate.h"
5 9
6#ifdef GSM_ENABLE_SERIALDEVICE 10#ifdef GSM_ENABLE_SERIALDEVICE
7#ifdef WIN32 11#ifdef WIN32
8 12
9#include <windows.h> 13#include <windows.h>
10#include <string.h> 14#include <string.h>
11#include <stdio.h> 15#include <stdio.h>
12#include <io.h> 16#include <io.h>
13#include <memory.h> 17#include <memory.h>
14 18
15#include "../../gsmcomon.h" 19#include "../../gsmcomon.h"
16#include "ser_w32.h" 20#include "ser_w32.h"
17 21
18static GSM_Error serial_close(GSM_StateMachine *s) 22static GSM_Error serial_close(GSM_StateMachine *s)
19{ 23{
20 GSM_Device_SerialData *d = &s->Device.Data.Serial; 24 GSM_Device_SerialData *d = &s->Device.Data.Serial;
21 25
22 /* Disables all monitored events for device */ 26 /* Disables all monitored events for device */
23 SetCommMask(d->hPhone, 0); 27 SetCommMask(d->hPhone, 0);
24 28
25 /* Discards all characters from input/output buffer and terminates 29 /* Discards all characters from input/output buffer and terminates
26 * pending read/write operations 30 * pending read/write operations
27 */ 31 */
28 PurgeComm(d->hPhone, PURGE_TXABORT | PURGE_RXABORT | 32 PurgeComm(d->hPhone, PURGE_TXABORT | PURGE_RXABORT |
29 PURGE_TXCLEAR | PURGE_RXCLEAR); 33 PURGE_TXCLEAR | PURGE_RXCLEAR);
30 34
31 /* Clears the DTR (data-terminal-ready) signal */ 35 /* Clears the DTR (data-terminal-ready) signal */
32 EscapeCommFunction(d->hPhone, CLRDTR); 36 EscapeCommFunction(d->hPhone, CLRDTR);
33 37
34 /* Restores old settings */ 38 /* Restores old settings */
35 if (SetCommState(d->hPhone, &d->old_settings)==0) { 39 if (SetCommState(d->hPhone, &d->old_settings)==0) {
36 GSM_OSErrorInfo(s, "SetCommState in serial_close"); 40 GSM_OSErrorInfo(s, "SetCommState in serial_close");
37 } 41 }
38 42
39 /* Closes device */ 43 /* Closes device */
40 if (CloseHandle(d->hPhone)==0) { 44 if (CloseHandle(d->hPhone)==0) {
41 GSM_OSErrorInfo(s, "CloseHandle in serial_close"); 45 GSM_OSErrorInfo(s, "CloseHandle in serial_close");
42 } 46 }
43 47
44 return ERR_NONE; 48 return ERR_NONE;
45} 49}
46 50
47static GSM_Error serial_open (GSM_StateMachine *s) 51static GSM_Error serial_open (GSM_StateMachine *s)
48{ 52{
49 GSM_Device_SerialData *d = &s->Device.Data.Serial; 53 GSM_Device_SerialData *d = &s->Device.Data.Serial;
50 DCB dcb; 54 DCB dcb;
diff --git a/gammu/emb/common/gsmcomon.c b/gammu/emb/common/gsmcomon.c
index d094ef3..445c3a6 100644
--- a/gammu/emb/common/gsmcomon.c
+++ b/gammu/emb/common/gsmcomon.c
@@ -76,137 +76,138 @@ unsigned char *GetMsg (INI_Section *cfg, unsigned char *default_string)
76 if (buff[0] == '"') { 76 if (buff[0] == '"') {
77 len = strlen(buff); 77 len = strlen(buff);
78 memmove(buff, buff + 1, len - 1); 78 memmove(buff, buff + 1, len - 1);
79 if (buff[len - 2] == '"') buff[len - 2] = 0; 79 if (buff[len - 2] == '"') buff[len - 2] = 0;
80 } 80 }
81 if (strcmp(buff, def_str) == 0) { 81 if (strcmp(buff, def_str) == 0) {
82 sprintf(buff,"T%04i",num); 82 sprintf(buff,"T%04i",num);
83 EncodeUnicode (buffer, buff, 5); 83 EncodeUnicode (buffer, buff, 5);
84 retval = INI_GetValue(cfg, buff2, buffer, true); 84 retval = INI_GetValue(cfg, buff2, buffer, true);
85 if (retval) { 85 if (retval) {
86 sprintf(buff,"%s",DecodeUnicodeConsole(retval+2)); 86 sprintf(buff,"%s",DecodeUnicodeConsole(retval+2));
87 buff[strlen(buff)-1] = 0; 87 buff[strlen(buff)-1] = 0;
88 /* Set all \n to 0x0a */ 88 /* Set all \n to 0x0a */
89 memset(def_str,0,sizeof(def_str)); 89 memset(def_str,0,sizeof(def_str));
90 num = 0; 90 num = 0;
91 while (num != (int)strlen(buff)) { 91 while (num != (int)strlen(buff)) {
92 if (num < (int)strlen(buff) - 1) { 92 if (num < (int)strlen(buff) - 1) {
93 if (buff[num] == '\\' && buff[num+1] == 'n') { 93 if (buff[num] == '\\' && buff[num+1] == 'n') {
94 def_str[strlen(def_str)] = 0x0a; 94 def_str[strlen(def_str)] = 0x0a;
95 num+=2; 95 num+=2;
96 } else { 96 } else {
97 def_str[strlen(def_str)] = buff[num++]; 97 def_str[strlen(def_str)] = buff[num++];
98 } 98 }
99 } else { 99 } else {
100 def_str[strlen(def_str)] = buff[num++]; 100 def_str[strlen(def_str)] = buff[num++];
101 } 101 }
102 } 102 }
103 retval = def_str; 103 retval = def_str;
104 } else { 104 } else {
105 retval = default_string; 105 retval = default_string;
106 } 106 }
107 return retval; 107 return retval;
108 } 108 }
109 } 109 }
110 e = e->Next; 110 e = e->Next;
111 } 111 }
112 return default_string; 112 return default_string;
113} 113}
114 114
115typedef struct { 115typedef struct {
116 GSM_Error ErrorNum; 116 GSM_Error ErrorNum;
117 unsigned char *ErrorText; 117 unsigned char *ErrorText;
118} PrintErrorEntry; 118} PrintErrorEntry;
119 119
120static PrintErrorEntry PrintErrorEntries[] = { 120static PrintErrorEntry PrintErrorEntries[] = {
121 {ERR_NONE, "No error."}, 121 {ERR_NONE, "No error."},
122 {ERR_DEVICEOPENERROR, "Error opening device. Unknown/busy or no permissions."}, 122 {ERR_DEVICEOPENERROR, "Error opening device. Unknown/busy or no permissions."},
123 {ERR_DEVICELOCKED, "Error opening device. Device locked."}, 123 {ERR_DEVICELOCKED, "Error opening device. Device locked."},
124 {ERR_DEVICENOTEXIST, "Error opening device. Not exist."}, 124 {ERR_DEVICENOTEXIST, "Error opening device. Doesn't exist."},
125 {ERR_DEVICEBUSY, "Error opening device. Already opened by other application."}, 125 {ERR_DEVICEBUSY, "Error opening device. Already opened by other application."},
126 {ERR_DEVICENOPERMISSION,"Error opening device. No permissions."}, 126 {ERR_DEVICENOPERMISSION,"Error opening device. No permissions."},
127 {ERR_DEVICENODRIVER, "Error opening device. No required driver in operating system."}, 127 {ERR_DEVICENODRIVER, "Error opening device. No required driver in operating system."},
128 {ERR_DEVICENOTWORK, "Error opening device. Some hardware not connected/wrong configured."}, 128 {ERR_DEVICENOTWORK, "Error opening device. Some hardware not connected/wrong configured."},
129 {ERR_DEVICEDTRRTSERROR, "Error setting device DTR or RTS."}, 129 {ERR_DEVICEDTRRTSERROR, "Error setting device DTR or RTS."},
130 {ERR_DEVICECHANGESPEEDERROR,"Error setting device speed. Maybe speed not supported."}, 130 {ERR_DEVICECHANGESPEEDERROR,"Error setting device speed. Maybe speed not supported."},
131 {ERR_DEVICEWRITEERROR, "Error writing device."}, 131 {ERR_DEVICEWRITEERROR, "Error writing device."},
132 {ERR_DEVICEREADERROR, "Error during reading device"}, 132 {ERR_DEVICEREADERROR, "Error during reading device."},
133 {ERR_DEVICEPARITYERROR, "Can't set parity on device"}, 133 {ERR_DEVICEPARITYERROR, "Can't set parity on device."},
134 {ERR_TIMEOUT, "No response in specified timeout. Probably phone not connected."}, 134 {ERR_TIMEOUT, "No response in specified timeout. Probably phone not connected."},
135 /* Some missed */ 135 /* Some missed */
136 {ERR_UNKNOWNRESPONSE, "Unknown response from phone. See readme.txt, how to report it."}, 136 {ERR_UNKNOWNRESPONSE, "Unknown response from phone. See readme.txt, how to report it."},
137 /* Some missed */ 137 /* Some missed */
138 {ERR_UNKNOWNCONNECTIONTYPESTRING,"Unknown connection type string. Check config file."}, 138 {ERR_UNKNOWNCONNECTIONTYPESTRING,"Unknown connection type string. Check config file."},
139 {ERR_UNKNOWNMODELSTRING,"Unknown model type string. Check config file."}, 139 {ERR_UNKNOWNMODELSTRING,"Unknown model type string. Check config file."},
140 {ERR_SOURCENOTAVAILABLE,"Some required functions not compiled for your OS. Please contact."}, 140 {ERR_SOURCENOTAVAILABLE,"Some required functions not compiled for your OS. Please contact."},
141 {ERR_NOTSUPPORTED, "Function not supported by phone."}, 141 {ERR_NOTSUPPORTED, "Function not supported by phone."},
142 {ERR_EMPTY, "Entry is empty"}, 142 {ERR_EMPTY, "Entry is empty"},
143 {ERR_SECURITYERROR, "Security error. Maybe no PIN ?"}, 143 {ERR_SECURITYERROR, "Security error. Maybe no PIN ?"},
144 {ERR_INVALIDLOCATION, "Invalid location. Maybe too high ?"}, 144 {ERR_INVALIDLOCATION, "Invalid location. Maybe too high ?"},
145 {ERR_NOTIMPLEMENTED, "Function not implemented. Help required."}, 145 {ERR_NOTIMPLEMENTED, "Function not implemented. Help required."},
146 {ERR_FULL, "Memory full."}, 146 {ERR_FULL, "Memory full."},
147 {ERR_UNKNOWN, "Unknown error."}, 147 {ERR_UNKNOWN, "Unknown error."},
148 /* Some missed */ 148 /* Some missed */
149 {ERR_CANTOPENFILE, "Can't open specified file. Read only ?"}, 149 {ERR_CANTOPENFILE, "Can't open specified file. Read only ?"},
150 {ERR_MOREMEMORY, "More memory required..."}, 150 {ERR_MOREMEMORY, "More memory required..."},
151 {ERR_PERMISSION, "Permission to file/device required..."}, 151 {ERR_PERMISSION, "Permission to file/device required..."},
152 {ERR_EMPTYSMSC, "Empty SMSC number. Set in phone or use -smscnumber"}, 152 {ERR_EMPTYSMSC, "Empty SMSC number. Set in phone or use -smscnumber."},
153 {ERR_INSIDEPHONEMENU, "You're inside phone menu (during editing ?). Leave it and try again."}, 153 {ERR_INSIDEPHONEMENU, "You're inside phone menu (during editing ?). Leave it and try again."},
154 {ERR_WORKINPROGRESS, "Function is during writing. If want help, please contact with authors."}, 154 {ERR_WORKINPROGRESS, "Function is during writing. If want help, please contact with authors."},
155 {ERR_PHONEOFF, "Phone is disabled and connected to charger"}, 155 {ERR_PHONEOFF, "Phone is disabled and connected to charger."},
156 {ERR_FILENOTSUPPORTED, "File format not supported by Gammu"}, 156 {ERR_FILENOTSUPPORTED, "File format not supported by Gammu."},
157 {ERR_BUG, "Nobody is perfect, some bug appeared in protocol implementation. Please contact authors."}, 157 {ERR_BUG, "Nobody is perfect, some bug appeared in protocol implementation. Please contact authors."},
158 {ERR_CANCELED, "Transfer was canceled by phone (you pressed cancel on phone?)."}, 158 {ERR_CANCELED, "Transfer was canceled by phone (you pressed cancel on phone?)"},
159 /* Some missed */ 159 /* Some missed */
160 {ERR_OTHERCONNECTIONREQUIRED,"Current connection type doesn't support called function."}, 160 {ERR_OTHERCONNECTIONREQUIRED,"Current connection type doesn't support called function."},
161 /* Some missed */ 161 {ERR_WRONGCRC, "CRC error."},
162 {ERR_INVALIDDATETIME, "Invalid date or time specified."}, 162 {ERR_INVALIDDATETIME, "Invalid date or time specified."},
163 {ERR_MEMORY, "Phone memory error, maybe it is read only"}, 163 {ERR_MEMORY, "Phone memory error, maybe it is read only."},
164 {ERR_INVALIDDATA, "Invalid data"}, 164 {ERR_INVALIDDATA, "Invalid data."},
165 {ERR_FILEALREADYEXIST, "File with specified name already exist."},
165 166
166 {0, ""} 167 {0, ""}
167}; 168};
168 169
169unsigned char *print_error(GSM_Error e, FILE *df, INI_Section *cfg) 170unsigned char *print_error(GSM_Error e, FILE *df, INI_Section *cfg)
170{ 171{
171 unsigned char *def = NULL; 172 unsigned char *def = NULL;
172 int i= 0; 173 int i= 0;
173 174
174 while (PrintErrorEntries[i].ErrorNum != 0) { 175 while (PrintErrorEntries[i].ErrorNum != 0) {
175 if (PrintErrorEntries[i].ErrorNum == e) { 176 if (PrintErrorEntries[i].ErrorNum == e) {
176 def = PrintErrorEntries[i].ErrorText; 177 def = PrintErrorEntries[i].ErrorText;
177 break; 178 break;
178 } 179 }
179 i++; 180 i++;
180 } 181 }
181 if (def == NULL) def = "Unknown error."; 182 if (def == NULL) def = "Unknown error.";
182 if (df!=NULL && di.dl!=0) fprintf(df,"[ERROR %i: %s]\n",e,def); 183 if (df!=NULL && di.dl!=0) fprintf(df,"[ERROR %i: %s]\n",e,def);
183 184
184 return GetMsg(cfg,def); 185 return GetMsg(cfg,def);
185} 186}
186 187
187const char *GetGammuLocalePath(void) 188const char *GetGammuLocalePath(void)
188{ 189{
189#ifdef LOCALE_PATH 190#ifdef LOCALE_PATH
190 static const char Buffer[] = LOCALE_PATH; 191 static const char Buffer[] = LOCALE_PATH;
191 return Buffer; 192 return Buffer;
192#else 193#else
193 return NULL; 194 return NULL;
194#endif 195#endif
195} 196}
196 197
197const char *GetGammuVersion(void) 198const char *GetGammuVersion(void)
198{ 199{
199 static const char Buffer[] = VERSION; 200 static const char Buffer[] = VERSION;
200 return Buffer; 201 return Buffer;
201} 202}
202 203
203GSM_Error GSM_SetDebugFile(char *info, Debug_Info *privdi) 204GSM_Error GSM_SetDebugFile(char *info, Debug_Info *privdi)
204{ 205{
205 FILE *testfile; 206 FILE *testfile;
206 207
207 /* If we should use global file descriptor, use it */ 208 /* If we should use global file descriptor, use it */
208 if (privdi->use_global) { 209 if (privdi->use_global) {
209 /* Aren't we the changing the global di? */ 210 /* Aren't we the changing the global di? */
210 if (privdi != &di) { 211 if (privdi != &di) {
211 if (privdi->df != di.df && 212 if (privdi->df != di.df &&
212 privdi->dl!=0 && 213 privdi->dl!=0 &&
diff --git a/gammu/emb/common/gsmcomon.h b/gammu/emb/common/gsmcomon.h
index cd36708..e067955 100644
--- a/gammu/emb/common/gsmcomon.h
+++ b/gammu/emb/common/gsmcomon.h
@@ -21,72 +21,73 @@
21 #define GSM_MAX_NUMBER_LENGTH 50 21 #define GSM_MAX_NUMBER_LENGTH 50
22 #define GSM_MAXCALENDARTODONOTES300 22 #define GSM_MAXCALENDARTODONOTES300
23 23
24/* GSM_Error is used to notify about errors */ 24/* GSM_Error is used to notify about errors */
25typedef enum { 25typedef enum {
26 /* 1*/ERR_NONE=1, 26 /* 1*/ERR_NONE=1,
27 ERR_DEVICEOPENERROR, /* Error during opening device */ 27 ERR_DEVICEOPENERROR, /* Error during opening device */
28 ERR_DEVICELOCKED, /* Device locked */ 28 ERR_DEVICELOCKED, /* Device locked */
29 ERR_DEVICENOTEXIST, 29 ERR_DEVICENOTEXIST,
30 ERR_DEVICEBUSY, 30 ERR_DEVICEBUSY,
31 ERR_DEVICENOPERMISSION, 31 ERR_DEVICENOPERMISSION,
32 ERR_DEVICENODRIVER, 32 ERR_DEVICENODRIVER,
33 ERR_DEVICENOTWORK, 33 ERR_DEVICENOTWORK,
34 ERR_DEVICEDTRRTSERROR, /* Error during setting DTR/RTS in device */ 34 ERR_DEVICEDTRRTSERROR, /* Error during setting DTR/RTS in device */
35 /*10*/ ERR_DEVICECHANGESPEEDERROR,/* Error during changing speed in device */ 35 /*10*/ ERR_DEVICECHANGESPEEDERROR,/* Error during changing speed in device */
36 ERR_DEVICEWRITEERROR, /* Error during writing device */ 36 ERR_DEVICEWRITEERROR, /* Error during writing device */
37 ERR_DEVICEREADERROR, /* Error during reading device */ 37 ERR_DEVICEREADERROR, /* Error during reading device */
38 ERR_DEVICEPARITYERROR, /* Can't set parity on device */ 38 ERR_DEVICEPARITYERROR, /* Can't set parity on device */
39 ERR_TIMEOUT, /* Command timed out */ 39 ERR_TIMEOUT, /* Command timed out */
40 ERR_FRAMENOTREQUESTED, /* Frame handled, but not requested in this moment */ 40 ERR_FRAMENOTREQUESTED, /* Frame handled, but not requested in this moment */
41 ERR_UNKNOWNRESPONSE, /* Response not handled by gammu */ 41 ERR_UNKNOWNRESPONSE, /* Response not handled by gammu */
42 ERR_UNKNOWNFRAME, /* Frame not handled by gammu */ 42 ERR_UNKNOWNFRAME, /* Frame not handled by gammu */
43 ERR_UNKNOWNCONNECTIONTYPESTRING,/* Unknown connection type given by user */ 43 ERR_UNKNOWNCONNECTIONTYPESTRING,/* Unknown connection type given by user */
44 ERR_UNKNOWNMODELSTRING, /* Unknown model given by user */ 44 ERR_UNKNOWNMODELSTRING, /* Unknown model given by user */
45 /*20*/ ERR_SOURCENOTAVAILABLE, /* Some functions not compiled in your OS */ 45 /*20*/ ERR_SOURCENOTAVAILABLE, /* Some functions not compiled in your OS */
46 ERR_NOTSUPPORTED, /* Not supported by phone */ 46 ERR_NOTSUPPORTED, /* Not supported by phone */
47 ERR_EMPTY, /* Empty phonebook entry, ... */ 47 ERR_EMPTY, /* Empty phonebook entry, ... */
48 ERR_SECURITYERROR, /* Not allowed */ 48 ERR_SECURITYERROR, /* Not allowed */
49 ERR_INVALIDLOCATION, /* Too high or too low location... */ 49 ERR_INVALIDLOCATION, /* Too high or too low location... */
50 ERR_NOTIMPLEMENTED, /* Function not implemented */ 50 ERR_NOTIMPLEMENTED, /* Function not implemented */
51 ERR_FULL, /* Memory is full */ 51 ERR_FULL, /* Memory is full */
52 ERR_UNKNOWN, 52 ERR_UNKNOWN,
53 ERR_CANTOPENFILE, /* Error during opening file */ 53 ERR_CANTOPENFILE, /* Error during opening file */
54 ERR_MOREMEMORY, /* More memory required */ 54 ERR_MOREMEMORY, /* More memory required */
55 /*30*/ ERR_PERMISSION, /* No permission */ 55 /*30*/ ERR_PERMISSION, /* No permission */
56 ERR_EMPTYSMSC, /* SMSC number is empty */ 56 ERR_EMPTYSMSC, /* SMSC number is empty */
57 ERR_INSIDEPHONEMENU, /* Inside phone menu - can't make something */ 57 ERR_INSIDEPHONEMENU, /* Inside phone menu - can't make something */
58 ERR_NOTCONNECTED, /* Phone NOT connected - can't make something */ 58 ERR_NOTCONNECTED, /* Phone NOT connected - can't make something */
59 ERR_WORKINPROGRESS, /* Work in progress */ 59 ERR_WORKINPROGRESS, /* Work in progress */
60 ERR_PHONEOFF, /* Phone is disabled and connected to charger */ 60 ERR_PHONEOFF, /* Phone is disabled and connected to charger */
61 ERR_FILENOTSUPPORTED, /* File format not supported by Gammu */ 61 ERR_FILENOTSUPPORTED, /* File format not supported by Gammu */
62 ERR_BUG, /* Found bug in implementation or phone */ 62 ERR_BUG, /* Found bug in implementation or phone */
63 ERR_CANCELED, /* Action was canceled by user */ 63 ERR_CANCELED, /* Action was canceled by user */
64 ERR_NEEDANOTHERANSWER, /* Inside Gammu: phone module need to send another answer frame */ 64 ERR_NEEDANOTHERANSWER, /* Inside Gammu: phone module need to send another answer frame */
65 /*40*/ERR_OTHERCONNECTIONREQUIRED, 65 /*40*/ERR_OTHERCONNECTIONREQUIRED,
66 ERR_WRONGCRC, 66 ERR_WRONGCRC,
67 ERR_INVALIDDATETIME, /* Invalid date/time */ 67 ERR_INVALIDDATETIME, /* Invalid date/time */
68 ERR_MEMORY, /* Phone memory error, maybe it is read only */ 68 ERR_MEMORY, /* Phone memory error, maybe it is read only */
69 ERR_INVALIDDATA /* Invalid data */ 69 ERR_INVALIDDATA, /* Invalid data */
70 ERR_FILEALREADYEXIST /* File with specified name already exist */
70} GSM_Error; 71} GSM_Error;
71 72
72 extern GSM_Error NoneFunction (void); 73 extern GSM_Error NoneFunction (void);
73 extern GSM_Error NotImplementedFunction(void); 74 extern GSM_Error NotImplementedFunction(void);
74 extern GSM_Error NotSupportedFunction(void); 75 extern GSM_Error NotSupportedFunction(void);
75 76
76 #define NONEFUNCTION (void *) NoneFunction 77 #define NONEFUNCTION (void *) NoneFunction
77 #define NOTIMPLEMENTED (void *) NotImplementedFunction 78 #define NOTIMPLEMENTED (void *) NotImplementedFunction
78 #define NOTSUPPORTED (void *) NotSupportedFunction 79 #define NOTSUPPORTED (void *) NotSupportedFunction
79 80
80 unsigned char *GetMsg (INI_Section *cfg, unsigned char *default_string); 81 unsigned char *GetMsg (INI_Section *cfg, unsigned char *default_string);
81 unsigned char *print_error(GSM_Error e, FILE *df, INI_Section *cfg); 82 unsigned char *print_error(GSM_Error e, FILE *df, INI_Section *cfg);
82 83
83GSM_Error GSM_SetDebugFile(char *info, Debug_Info *privdi); 84GSM_Error GSM_SetDebugFile(char *info, Debug_Info *privdi);
84 85
85const char *GetGammuLocalePath(void); 86const char *GetGammuLocalePath(void);
86const char *GetGammuVersion(void); 87const char *GetGammuVersion(void);
87 88
88#endif 89#endif
89 90
90/* How should editor hadle tabs in this file? Add editor commands here. 91/* How should editor hadle tabs in this file? Add editor commands here.
91 * vim: noexpandtab sw=8 ts=8 sts=8: 92 * vim: noexpandtab sw=8 ts=8 sts=8:
92 */ 93 */
diff --git a/gammu/emb/common/gsmstate.c b/gammu/emb/common/gsmstate.c
index b8f5f89..31e365d 100644
--- a/gammu/emb/common/gsmstate.c
+++ b/gammu/emb/common/gsmstate.c
@@ -141,172 +141,172 @@ static void GSM_RegisterModule(GSM_StateMachine *s,GSM_Phone_Functions *phone)
141 } 141 }
142 } 142 }
143} 143}
144 144
145GSM_Error GSM_RegisterAllPhoneModules(GSM_StateMachine *s) 145GSM_Error GSM_RegisterAllPhoneModules(GSM_StateMachine *s)
146{ 146{
147 OnePhoneModel *model; 147 OnePhoneModel *model;
148 148
149 /* Auto model */ 149 /* Auto model */
150 if (s->CurrentConfig->Model[0] == 0) { 150 if (s->CurrentConfig->Model[0] == 0) {
151 model = GetModelData(NULL,s->Phone.Data.Model,NULL); 151 model = GetModelData(NULL,s->Phone.Data.Model,NULL);
152#ifdef GSM_ENABLE_ALCATEL 152#ifdef GSM_ENABLE_ALCATEL
153 if (model->model[0] != 0 && IsPhoneFeatureAvailable(model, F_ALCATEL)) { 153 if (model->model[0] != 0 && IsPhoneFeatureAvailable(model, F_ALCATEL)) {
154 smprintf(s,"[Module - \"%s\"]\n",ALCATELPhone.models); 154 smprintf(s,"[Module - \"%s\"]\n",ALCATELPhone.models);
155 s->Phone.Functions = &ALCATELPhone; 155 s->Phone.Functions = &ALCATELPhone;
156 return ERR_NONE; 156 return ERR_NONE;
157 } 157 }
158#endif 158#endif
159#ifdef GSM_ENABLE_ATGEN 159#ifdef GSM_ENABLE_ATGEN
160 /* With ATgen and auto model we can work with unknown models too */ 160 /* With ATgen and auto model we can work with unknown models too */
161 if (s->ConnectionType==GCT_AT || s->ConnectionType==GCT_BLUEAT || s->ConnectionType==GCT_IRDAAT) { 161 if (s->ConnectionType==GCT_AT || s->ConnectionType==GCT_BLUEAT || s->ConnectionType==GCT_IRDAAT) {
162 smprintf(s,"[Module - \"%s\"]\n",ATGENPhone.models); 162 smprintf(s,"[Module - \"%s\"]\n",ATGENPhone.models);
163 s->Phone.Functions = &ATGENPhone; 163 s->Phone.Functions = &ATGENPhone;
164 return ERR_NONE; 164 return ERR_NONE;
165 } 165 }
166#endif 166#endif
167 if (model->model[0] == 0) return ERR_UNKNOWNMODELSTRING; 167 if (model->model[0] == 0) return ERR_UNKNOWNMODELSTRING;
168 } 168 }
169 s->Phone.Functions=NULL; 169 s->Phone.Functions=NULL;
170#ifdef GSM_ENABLE_ATGEN 170#ifdef GSM_ENABLE_ATGEN
171 /* AT module can have the same models ID to "normal" Nokia modules */ 171 /* AT module can have the same models ID to "normal" Nokia modules */
172 if (s->ConnectionType==GCT_AT || s->ConnectionType==GCT_BLUEAT || s->ConnectionType==GCT_IRDAAT) { 172 if (s->ConnectionType==GCT_AT || s->ConnectionType==GCT_BLUEAT || s->ConnectionType==GCT_IRDAAT) {
173 GSM_RegisterModule(s,&ATGENPhone); 173 GSM_RegisterModule(s,&ATGENPhone);
174 if (s->Phone.Functions!=NULL) return ERR_NONE; 174 if (s->Phone.Functions!=NULL) return ERR_NONE;
175 } 175 }
176#endif 176#endif
177#ifdef GSM_ENABLE_OBEXGEN 177#ifdef GSM_ENABLE_OBEXGEN
178 GSM_RegisterModule(s,&OBEXGENPhone); 178 GSM_RegisterModule(s,&OBEXGENPhone);
179#endif 179#endif
180#ifdef GSM_ENABLE_MROUTERGEN 180#ifdef GSM_ENABLE_MROUTERGEN
181 GSM_RegisterModule(s,&MROUTERGENPhone); 181 GSM_RegisterModule(s,&MROUTERGENPhone);
182#endif 182#endif
183#ifdef GSM_ENABLE_NOKIA3320 183#ifdef GSM_ENABLE_NOKIA3320
184 GSM_RegisterModule(s,&N3320Phone); 184 GSM_RegisterModule(s,&N3320Phone);
185#endif 185#endif
186#ifdef GSM_ENABLE_NOKIA3650 186#ifdef GSM_ENABLE_NOKIA3650
187 GSM_RegisterModule(s,&N3650Phone); 187 GSM_RegisterModule(s,&N3650Phone);
188#endif 188#endif
189#ifdef GSM_ENABLE_NOKIA650
190 GSM_RegisterModule(s,&N650Phone);
191#endif
189#ifdef GSM_ENABLE_NOKIA6110 192#ifdef GSM_ENABLE_NOKIA6110
190 GSM_RegisterModule(s,&N6110Phone); 193 GSM_RegisterModule(s,&N6110Phone);
191#endif 194#endif
192#ifdef GSM_ENABLE_NOKIA6510 195#ifdef GSM_ENABLE_NOKIA6510
193 GSM_RegisterModule(s,&N6510Phone); 196 GSM_RegisterModule(s,&N6510Phone);
194#endif 197#endif
195#ifdef GSM_ENABLE_NOKIA7110 198#ifdef GSM_ENABLE_NOKIA7110
196 GSM_RegisterModule(s,&N7110Phone); 199 GSM_RegisterModule(s,&N7110Phone);
197#endif 200#endif
198#ifdef GSM_ENABLE_NOKIA9210 201#ifdef GSM_ENABLE_NOKIA9210
199 GSM_RegisterModule(s,&N9210Phone); 202 GSM_RegisterModule(s,&N9210Phone);
200#endif 203#endif
201#ifdef GSM_ENABLE_ALCATEL 204#ifdef GSM_ENABLE_ALCATEL
202 GSM_RegisterModule(s,&ALCATELPhone); 205 GSM_RegisterModule(s,&ALCATELPhone);
203#endif 206#endif
204 if (s->Phone.Functions==NULL) return ERR_UNKNOWNMODELSTRING; 207 if (s->Phone.Functions==NULL) return ERR_UNKNOWNMODELSTRING;
205 return ERR_NONE; 208 return ERR_NONE;
206} 209}
207 210
208GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum) 211GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum)
209{ 212{
210 GSM_Errorerror; 213 GSM_Errorerror;
211 GSM_DateTimetime; 214 GSM_DateTimetime;
212 int i; 215 int i;
213 char Buffer[80];
214 216
215 for (i=0;i<s->ConfigNum;i++) { 217 for (i=0;i<s->ConfigNum;i++) {
216 s->CurrentConfig = &s->Config[i]; 218 s->CurrentConfig = &s->Config[i];
217 219
218 s->Speed = 0; 220 s->Speed = 0;
219 s->ReplyNum = ReplyNum; 221 s->ReplyNum = ReplyNum;
220 s->Phone.Data.ModelInfo = GetModelData("unknown",NULL,NULL); 222 s->Phone.Data.ModelInfo = GetModelData("unknown",NULL,NULL);
221 s->Phone.Data.Manufacturer[0] = 0; 223 s->Phone.Data.Manufacturer[0] = 0;
222 s->Phone.Data.Model[0] = 0; 224 s->Phone.Data.Model[0] = 0;
223 s->Phone.Data.Version[0] = 0; 225 s->Phone.Data.Version[0] = 0;
224 s->Phone.Data.VerDate[0] = 0; 226 s->Phone.Data.VerDate[0] = 0;
225 s->Phone.Data.VerNum = 0; 227 s->Phone.Data.VerNum = 0;
226 s->Phone.Data.StartInfoCounter = 0; 228 s->Phone.Data.StartInfoCounter = 0;
227 s->Phone.Data.SentMsg = NULL; 229 s->Phone.Data.SentMsg = NULL;
228 230
229 s->Phone.Data.HardwareCache[0] = 0; 231 s->Phone.Data.HardwareCache[0] = 0;
230 s->Phone.Data.ProductCodeCache[0] = 0; 232 s->Phone.Data.ProductCodeCache[0] = 0;
231 s->Phone.Data.EnableIncomingCall = false; 233 s->Phone.Data.EnableIncomingCall = false;
232 s->Phone.Data.EnableIncomingSMS = false; 234 s->Phone.Data.EnableIncomingSMS = false;
233 s->Phone.Data.EnableIncomingCB = false; 235 s->Phone.Data.EnableIncomingCB = false;
234 s->Phone.Data.EnableIncomingUSSD = false; 236 s->Phone.Data.EnableIncomingUSSD = false;
235 s->User.UserReplyFunctions = NULL; 237 s->User.UserReplyFunctions = NULL;
236 s->User.IncomingCall = NULL; 238 s->User.IncomingCall = NULL;
237 s->User.IncomingSMS = NULL; 239 s->User.IncomingSMS = NULL;
238 s->User.IncomingCB = NULL; 240 s->User.IncomingCB = NULL;
239 s->User.IncomingUSSD = NULL; 241 s->User.IncomingUSSD = NULL;
240 s->User.SendSMSStatus = NULL; 242 s->User.SendSMSStatus = NULL;
241 s->LockFile = NULL; 243 s->LockFile = NULL;
242 s->opened = false; 244 s->opened = false;
243 s->Phone.Functions = NULL; 245 s->Phone.Functions = NULL;
244 246
245 s->di = di; 247 s->di = di;
246 s->di.use_global = s->CurrentConfig->UseGlobalDebugFile; 248 s->di.use_global = s->CurrentConfig->UseGlobalDebugFile;
247 GSM_SetDebugLevel(s->CurrentConfig->DebugLevel, &s->di); 249 GSM_SetDebugLevel(s->CurrentConfig->DebugLevel, &s->di);
248 error=GSM_SetDebugFile(s->CurrentConfig->DebugFile, &s->di); 250 error=GSM_SetDebugFile(s->CurrentConfig->DebugFile, &s->di);
249 if (error != ERR_NONE) return error; 251 if (error != ERR_NONE) return error;
250 252
251 if (s->di.dl == DL_TEXTALL || s->di.dl == DL_TEXT || s->di.dl == DL_TEXTERROR || 253 if (s->di.dl == DL_TEXTALL || s->di.dl == DL_TEXT || s->di.dl == DL_TEXTERROR ||
252 s->di.dl == DL_TEXTALLDATE || s->di.dl == DL_TEXTDATE || s->di.dl == DL_TEXTERRORDATE) { 254 s->di.dl == DL_TEXTALLDATE || s->di.dl == DL_TEXTDATE || s->di.dl == DL_TEXTERRORDATE) {
253 smprintf(s,"[Gammu - version %s built %s %s]\n",VERSION,__TIME__,__DATE__); 255 smprintf(s,"[Gammu - %s built %s %s",VERSION,__TIME__,__DATE__);
254 smprintf(s,"[Connection - \"%s\"]\n",s->CurrentConfig->Connection); 256 if (strlen(GetCompiler()) != 0) {
257 smprintf(s," in %s",GetCompiler());
258 }
259 smprintf(s,"]\n[Connection - \"%s\"]\n",s->CurrentConfig->Connection);
255 smprintf(s,"[Model type - \"%s\"]\n",s->CurrentConfig->Model); 260 smprintf(s,"[Model type - \"%s\"]\n",s->CurrentConfig->Model);
256 smprintf(s,"[Device - \"%s\"]\n",s->CurrentConfig->Device); 261 smprintf(s,"[Device - \"%s\"]\n",s->CurrentConfig->Device);
257 262 if (strlen(GetOS()) != 0) {
258 Buffer[0] = 0; 263 smprintf(s,"[Run on - %s]\n",GetOS());
259 if (strlen(GetOS()) != 0) sprintf(Buffer,"%s",GetOS());
260 if (strlen(GetCompiler()) != 0) {
261 if (Buffer[0] != 0) strcat(Buffer+strlen(Buffer),", ");
262 strcat(Buffer+strlen(Buffer),GetCompiler());
263 } 264 }
264 if (Buffer[0] != 0) smprintf(s,"[OS/compiler - %s]\n",Buffer);
265 } 265 }
266 if (s->di.dl==DL_BINARY) { 266 if (s->di.dl==DL_BINARY) {
267 smprintf(s,"%c",((unsigned char)strlen(VERSION))); 267 smprintf(s,"%c",((unsigned char)strlen(VERSION)));
268 smprintf(s,"%s",VERSION); 268 smprintf(s,"%s",VERSION);
269 } 269 }
270 270
271 error=GSM_RegisterAllConnections(s, s->CurrentConfig->Connection); 271 error=GSM_RegisterAllConnections(s, s->CurrentConfig->Connection);
272 if (error!=ERR_NONE) return error; 272 if (error!=ERR_NONE) return error;
273 273
274 /* Model auto */ 274 /* Model auto */
275 if (s->CurrentConfig->Model[0]==0) { 275 if (s->CurrentConfig->Model[0]==0) {
276 if (mystrncasecmp(s->CurrentConfig->LockDevice,"yes",0)) { 276 if (mystrncasecmp(s->CurrentConfig->LockDevice,"yes",0)) {
277 error = lock_device(s->CurrentConfig->Device, &(s->LockFile)); 277 error = lock_device(s->CurrentConfig->Device, &(s->LockFile));
278 if (error != ERR_NONE) return error; 278 if (error != ERR_NONE) return error;
279 } 279 }
280 280
281 /* Irda devices can set now model to some specific and 281 /* Irda devices can set now model to some specific and
282 * we don't have to make auto detection later */ 282 * we don't have to make auto detection later */
283 error=s->Device.Functions->OpenDevice(s); 283 error=s->Device.Functions->OpenDevice(s);
284 if (i != s->ConfigNum - 1) { 284 if (i != s->ConfigNum - 1) {
285 if (error == ERR_DEVICEOPENERROR) continue; 285 if (error == ERR_DEVICEOPENERROR) continue;
286 if (error == ERR_DEVICELOCKED) continue; 286 if (error == ERR_DEVICELOCKED) continue;
287 if (error == ERR_DEVICENOTEXIST) continue; 287 if (error == ERR_DEVICENOTEXIST) continue;
288 if (error == ERR_DEVICEBUSY) continue; 288 if (error == ERR_DEVICEBUSY) continue;
289 if (error == ERR_DEVICENOPERMISSION) continue; 289 if (error == ERR_DEVICENOPERMISSION) continue;
290 if (error == ERR_DEVICENODRIVER) continue; 290 if (error == ERR_DEVICENODRIVER) continue;
291 if (error == ERR_DEVICENOTWORK) continue; 291 if (error == ERR_DEVICENOTWORK) continue;
292 } 292 }
293 if (error!=ERR_NONE) { 293 if (error!=ERR_NONE) {
294 if (s->LockFile!=NULL) unlock_device(&(s->LockFile)); 294 if (s->LockFile!=NULL) unlock_device(&(s->LockFile));
295 return error; 295 return error;
296 } 296 }
297 297
298 s->opened = true; 298 s->opened = true;
299 299
300 error=s->Protocol.Functions->Initialise(s); 300 error=s->Protocol.Functions->Initialise(s);
301 if (error!=ERR_NONE) return error; 301 if (error!=ERR_NONE) return error;
302 302
303 /* If still auto model, try to get model by asking phone for it */ 303 /* If still auto model, try to get model by asking phone for it */
304 if (s->Phone.Data.Model[0]==0) { 304 if (s->Phone.Data.Model[0]==0) {
305 smprintf(s,"[Module - \"auto\"]\n"); 305 smprintf(s,"[Module - \"auto\"]\n");
306 switch (s->ConnectionType) { 306 switch (s->ConnectionType) {
307#ifdef GSM_ENABLE_ATGEN 307#ifdef GSM_ENABLE_ATGEN
308 case GCT_AT: 308 case GCT_AT:
309 case GCT_BLUEAT: 309 case GCT_BLUEAT:
310 case GCT_IRDAAT: 310 case GCT_IRDAAT:
311 s->Phone.Functions = &ATGENPhone; 311 s->Phone.Functions = &ATGENPhone;
312 break; 312 break;
@@ -509,112 +509,123 @@ GSM_Error GSM_WaitForOnce(GSM_StateMachine *s, unsigned char *buffer,
509 } while (i<time); 509 } while (i<time);
510 510
511 return ERR_TIMEOUT; 511 return ERR_TIMEOUT;
512} 512}
513 513
514GSM_Error GSM_WaitFor (GSM_StateMachine *s, unsigned char *buffer, 514GSM_Error GSM_WaitFor (GSM_StateMachine *s, unsigned char *buffer,
515 int length, unsigned char type, int time, 515 int length, unsigned char type, int time,
516 GSM_Phone_RequestID request) 516 GSM_Phone_RequestID request)
517{ 517{
518 GSM_Phone_Data *Phone = &s->Phone.Data; 518 GSM_Phone_Data *Phone = &s->Phone.Data;
519 GSM_Error error; 519 GSM_Error error;
520 int reply; 520 int reply;
521 521
522 if (mystrncasecmp(s->CurrentConfig->StartInfo,"yes",0)) { 522 if (mystrncasecmp(s->CurrentConfig->StartInfo,"yes",0)) {
523 if (Phone->StartInfoCounter > 0) { 523 if (Phone->StartInfoCounter > 0) {
524 Phone->StartInfoCounter--; 524 Phone->StartInfoCounter--;
525 if (Phone->StartInfoCounter == 0) s->Phone.Functions->ShowStartInfo(s,false); 525 if (Phone->StartInfoCounter == 0) s->Phone.Functions->ShowStartInfo(s,false);
526 } 526 }
527 } 527 }
528 528
529 Phone->RequestID= request; 529 Phone->RequestID= request;
530 Phone->DispatchError= ERR_TIMEOUT; 530 Phone->DispatchError= ERR_TIMEOUT;
531 531
532 for (reply=0;reply<s->ReplyNum;reply++) { 532 for (reply=0;reply<s->ReplyNum;reply++) {
533 if (reply!=0) { 533 if (reply!=0) {
534 if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl == DL_TEXTERROR || 534 if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl == DL_TEXTERROR ||
535 s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl == DL_TEXTERRORDATE) 535 s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl == DL_TEXTERRORDATE)
536 { 536 {
537 smprintf(s, "[Retrying %i type 0x%02X]\n", reply, type); 537 smprintf(s, "[Retrying %i type 0x%02X]\n", reply, type);
538 } 538 }
539 } 539 }
540 error = s->Protocol.Functions->WriteMessage(s, buffer, length, type); 540 error = s->Protocol.Functions->WriteMessage(s, buffer, length, type);
541 if (error!=ERR_NONE) return error; 541 if (error!=ERR_NONE) return error;
542 542
543 error = GSM_WaitForOnce(s, buffer, length, type, time); 543 error = GSM_WaitForOnce(s, buffer, length, type, time);
544 if (error != ERR_TIMEOUT) return error; 544 if (error != ERR_TIMEOUT) return error;
545 } 545 }
546 546
547 return Phone->DispatchError; 547 return Phone->DispatchError;
548} 548}
549 549
550static GSM_Error CheckReplyFunctions(GSM_StateMachine *s, GSM_Reply_Function *Reply, int *reply) 550static GSM_Error CheckReplyFunctions(GSM_StateMachine *s, GSM_Reply_Function *Reply, int *reply)
551{ 551{
552 GSM_Phone_Data *Data = &s->Phone.Data; 552 GSM_Phone_Data *Data = &s->Phone.Data;
553 GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg; 553 GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg;
554 bool execute; 554 bool execute;
555 bool available = false; 555 bool available = false;
556 int i = 0; 556 int i = 0;
557 //int j;
557 558
558 while (Reply[i].requestID!=ID_None) { 559 while (Reply[i].requestID!=ID_None) {
559 execute=false; 560 execute=false;
560 /* Binary frames like in Nokia */ 561 /* Binary frames like in Nokia */
561 if (strlen(Reply[i].msgtype) < 2) { 562 if (strlen(Reply[i].msgtype) < 2) {
562 if (Reply[i].msgtype[0]==msg->Type) { 563 if (Reply[i].msgtype[0]==msg->Type) {
563 if (Reply[i].subtypechar!=0) { 564 if (Reply[i].subtypechar!=0) {
564 if (Reply[i].subtypechar<=msg->Length) { 565 if (Reply[i].subtypechar<=msg->Length) {
565 if (msg->Buffer[Reply[i].subtypechar]==Reply[i].subtype) 566 if (msg->Buffer[Reply[i].subtypechar]==Reply[i].subtype)
566 execute=true; 567 execute=true;
567 } 568 }
568 } else execute=true; 569 } else execute=true;
569 } 570 }
570 } else { 571 } else {
571 if (strncmp(Reply[i].msgtype,msg->Buffer,strlen(Reply[i].msgtype))==0) { 572 // printf("msg length %i %i\n",strlen(Reply[i].msgtype),msg->Length);
572 execute=true; 573 if ((int)strlen(Reply[i].msgtype)<msg->Length) {
574 // printf("Comparing \"%s\" and \"",Reply[i].msgtype);
575 // for (j=0;j<strlen(Reply[i].msgtype);j++) {
576 // if (msg->Buffer[j]!=13 && msg->Buffer[j]!=10) {
577 // printf("%c",msg->Buffer[j]);
578 // }
579 // }
580 // printf("\"\n");
581 if (strncmp(Reply[i].msgtype,msg->Buffer,strlen(Reply[i].msgtype))==0) {
582 execute=true;
583 }
573 } 584 }
574 } 585 }
575 586
576 if (execute) { 587 if (execute) {
577 *reply=i; 588 *reply=i;
578 if (Reply[i].requestID == ID_IncomingFrame || 589 if (Reply[i].requestID == ID_IncomingFrame ||
579 Reply[i].requestID == Data->RequestID || 590 Reply[i].requestID == Data->RequestID ||
580 Data->RequestID== ID_EachFrame) { 591 Data->RequestID== ID_EachFrame) {
581 return ERR_NONE; 592 return ERR_NONE;
582 } 593 }
583 available=true; 594 available=true;
584 } 595 }
585 i++; 596 i++;
586 } 597 }
587 598
588 if (available) { 599 if (available) {
589 return ERR_FRAMENOTREQUESTED; 600 return ERR_FRAMENOTREQUESTED;
590 } else { 601 } else {
591 return ERR_UNKNOWNFRAME; 602 return ERR_UNKNOWNFRAME;
592 } 603 }
593} 604}
594 605
595GSM_Error GSM_DispatchMessage(GSM_StateMachine *s) 606GSM_Error GSM_DispatchMessage(GSM_StateMachine *s)
596{ 607{
597 GSM_Error error= ERR_UNKNOWNFRAME; 608 GSM_Error error= ERR_UNKNOWNFRAME;
598 GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg; 609 GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg;
599 GSM_Phone_Data *Phone= &s->Phone.Data; 610 GSM_Phone_Data *Phone= &s->Phone.Data;
600 bool disp = false; 611 bool disp = false;
601 GSM_Reply_Function*Reply; 612 GSM_Reply_Function*Reply;
602 int reply, i; 613 int reply, i;
603 614
604 if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || 615 if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL ||
605 s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) { 616 s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) {
606 smprintf(s, "RECEIVED frame "); 617 smprintf(s, "RECEIVED frame ");
607 smprintf(s, "type 0x%02X/length 0x%02X/%i", msg->Type, msg->Length, msg->Length); 618 smprintf(s, "type 0x%02X/length 0x%02X/%i", msg->Type, msg->Length, msg->Length);
608 DumpMessage(s->di.use_global ? di.df : s->di.df, s->di.dl, msg->Buffer, msg->Length); 619 DumpMessage(s->di.use_global ? di.df : s->di.df, s->di.dl, msg->Buffer, msg->Length);
609 if (msg->Length == 0) smprintf(s, "\n"); 620 if (msg->Length == 0) smprintf(s, "\n");
610 fflush(s->di.df); 621 fflush(s->di.df);
611 } 622 }
612 if (s->di.dl==DL_BINARY) { 623 if (s->di.dl==DL_BINARY) {
613 smprintf(s,"%c",0x02);/* Receiving */ 624 smprintf(s,"%c",0x02);/* Receiving */
614 smprintf(s,"%c",msg->Type); 625 smprintf(s,"%c",msg->Type);
615 smprintf(s,"%c",msg->Length/256); 626 smprintf(s,"%c",msg->Length/256);
616 smprintf(s,"%c",msg->Length%256); 627 smprintf(s,"%c",msg->Length%256);
617 for (i=0;i<msg->Length;i++) { 628 for (i=0;i<msg->Length;i++) {
618 smprintf(s,"%c",msg->Buffer[i]); 629 smprintf(s,"%c",msg->Buffer[i]);
619 } 630 }
620 } 631 }
@@ -800,255 +811,276 @@ bool GSM_ReadConfig(INI_Section *cfg_info, GSM_Config *cfg, int num)
800 cfg->DefaultConnection = false; 811 cfg->DefaultConnection = false;
801 } 812 }
802 cfg->SyncTime = INI_GetValue(cfg_info, section, "synchronizetime",false); 813 cfg->SyncTime = INI_GetValue(cfg_info, section, "synchronizetime",false);
803 if (!cfg->SyncTime) { 814 if (!cfg->SyncTime) {
804 free(cfg->SyncTime); 815 free(cfg->SyncTime);
805 cfg->SyncTime = strdup(DefaultSynchronizeTime); 816 cfg->SyncTime = strdup(DefaultSynchronizeTime);
806 } else { 817 } else {
807 cfg->DefaultSyncTime = false; 818 cfg->DefaultSyncTime = false;
808 } 819 }
809 cfg->DebugFile = INI_GetValue(cfg_info, section, "logfile", false); 820 cfg->DebugFile = INI_GetValue(cfg_info, section, "logfile", false);
810 if (!cfg->DebugFile) { 821 if (!cfg->DebugFile) {
811 free(cfg->DebugFile); 822 free(cfg->DebugFile);
812 cfg->DebugFile = strdup(DefaultDebugFile); 823 cfg->DebugFile = strdup(DefaultDebugFile);
813 } else { 824 } else {
814 cfg->DefaultDebugFile = false; 825 cfg->DefaultDebugFile = false;
815 } 826 }
816 cfg->LockDevice = INI_GetValue(cfg_info, section, "use_locking", false); 827 cfg->LockDevice = INI_GetValue(cfg_info, section, "use_locking", false);
817 if (!cfg->LockDevice) { 828 if (!cfg->LockDevice) {
818 free(cfg->LockDevice); 829 free(cfg->LockDevice);
819 cfg->LockDevice = strdup(DefaultLockDevice); 830 cfg->LockDevice = strdup(DefaultLockDevice);
820 } else { 831 } else {
821 cfg->DefaultLockDevice = false; 832 cfg->DefaultLockDevice = false;
822 } 833 }
823 Temp = INI_GetValue(cfg_info, section, "model", false); 834 Temp = INI_GetValue(cfg_info, section, "model", false);
824 if (!Temp) { 835 if (!Temp) {
825 strcpy(cfg->Model,DefaultModel); 836 strcpy(cfg->Model,DefaultModel);
826 } else { 837 } else {
827 cfg->DefaultModel = false; 838 cfg->DefaultModel = false;
828 strcpy(cfg->Model,Temp); 839 strcpy(cfg->Model,Temp);
829 } 840 }
830 Temp = INI_GetValue(cfg_info, section, "logformat", false); 841 Temp = INI_GetValue(cfg_info, section, "logformat", false);
831 if (!Temp) { 842 if (!Temp) {
832 strcpy(cfg->DebugLevel,DefaultDebugLevel); 843 strcpy(cfg->DebugLevel,DefaultDebugLevel);
833 } else { 844 } else {
834 cfg->DefaultDebugLevel = false; 845 cfg->DefaultDebugLevel = false;
835 strcpy(cfg->DebugLevel,Temp); 846 strcpy(cfg->DebugLevel,Temp);
836 } 847 }
837 cfg->StartInfo = INI_GetValue(cfg_info, section, "startinfo", false); 848 cfg->StartInfo = INI_GetValue(cfg_info, section, "startinfo", false);
838 if (!cfg->StartInfo) { 849 if (!cfg->StartInfo) {
839 free(cfg->StartInfo); 850 free(cfg->StartInfo);
840 cfg->StartInfo = strdup(DefaultStartInfo); 851 cfg->StartInfo = strdup(DefaultStartInfo);
841 } else { 852 } else {
842 cfg->DefaultStartInfo = false; 853 cfg->DefaultStartInfo = false;
843 } 854 }
844 return true; 855 return true;
845} 856}
846 857
847static OnePhoneModel allmodels[] = { 858static OnePhoneModel allmodels[] = {
859#ifdef GSM_ENABLE_NOKIA650
860 {"0650" ,"THF-12","", {0}},
861#endif
848#ifdef GSM_ENABLE_NOKIA6510 862#ifdef GSM_ENABLE_NOKIA6510
849 {"1100", "RH-18" ,"", {0}}, 863 {"1100" ,"RH-18" ,"", {0}},
850 {"1100a","RH-38" ,"", {0}}, 864 {"1100a","RH-38" ,"", {0}},
851 {"1100b","RH-36" ,"", {0}}, 865 {"1100b","RH-36" ,"", {0}},
852#endif 866#endif
853#ifdef GSM_ENABLE_NOKIA6110 867#ifdef GSM_ENABLE_NOKIA6110
854 {"2100" ,"NAM-2" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},//quess 868 {"2100" ,"NAM-2" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},//quess
855#endif 869#endif
856#ifdef GSM_ENABLE_NOKIA6510 870#ifdef GSM_ENABLE_NOKIA6510
857 {"3100" ,"RH-19" ,"", {F_PBKTONEGAL,F_PBKSMSLIST,0}}, 871 {"3100" ,"RH-19" ,"", {F_PBKTONEGAL,F_PBKSMSLIST,0}},//fixme
858 {"3100b","RH-50" ,"", {F_PBKTONEGAL,F_PBKSMSLIST,0}}, 872 {"3100b","RH-50" ,"", {F_PBKTONEGAL,F_PBKSMSLIST,0}},//fixme
859 {"3108", "RH-6", "Nokia 3108",{0}}, //does it have irda ? 873 {"3108", "RH-6", "Nokia 3108",{0}}, //does it have irda ?
860 {"3200", "RH-30" ,"Nokia 3200",{F_PBKTONEGAL,0}}, 874 {"3200", "RH-30" ,"Nokia 3200",{F_PBKTONEGAL,0}},//fixme
861 {"3200a","RH-31" ,"Nokia 3200",{F_PBKTONEGAL,0}}, 875 {"3200a","RH-31" ,"Nokia 3200",{F_PBKTONEGAL,0}},//fixme
862#endif 876#endif
863#ifdef GSM_ENABLE_NOKIA6110 877#ifdef GSM_ENABLE_NOKIA6110
864 {"3210" ,"NSE-8" ,"", {F_NOWAP,F_NOCALLER,F_NOCALENDAR,F_NOPBKUNICODE,F_POWER_BATT,F_PROFILES51,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}}, 878 {"3210" ,"NSE-8" ,"", {F_NOWAP,F_NOCALLER,F_NOCALENDAR,F_NOPBKUNICODE,F_POWER_BATT,F_PROFILES51,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
865 {"3210" ,"NSE-9" ,"", {F_NOWAP,F_NOCALLER,F_NOCALENDAR,F_NOPBKUNICODE,F_POWER_BATT,F_PROFILES51,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}}, 879 {"3210" ,"NSE-9" ,"", {F_NOWAP,F_NOCALLER,F_NOCALENDAR,F_NOPBKUNICODE,F_POWER_BATT,F_PROFILES51,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
866#endif 880#endif
867#ifdef GSM_ENABLE_NOKIA6510 881#ifdef GSM_ENABLE_NOKIA6510
868 {"3300" ,"NEM-1" ,"Nokia 3300", {F_PBKTONEGAL,0}}, 882 {"3300" ,"NEM-1" ,"Nokia 3300", {F_PBKTONEGAL,0}},//fixme
869 {"3300" ,"NEM-2" ,"Nokia 3300", {F_PBKTONEGAL,0}}, 883 {"3300" ,"NEM-2" ,"Nokia 3300", {F_PBKTONEGAL,0}},//fixme
870#endif 884#endif
871#ifdef GSM_ENABLE_NOKIA6110 885#ifdef GSM_ENABLE_NOKIA6110
872 {"3310" ,"NHM-5" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}}, 886 {"3310" ,"NHM-5" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},
873#endif 887#endif
874#ifdef GSM_ENABLE_NOKIA3320 888#ifdef GSM_ENABLE_NOKIA3320
875 {"3320" ,"NPC-1" ,"Nokia 3320", {F_CAL62,F_DAYMONTH,0}},//fixme 889 {"3320" ,"NPC-1" ,"Nokia 3320", {F_CAL62,F_DAYMONTH,0}},//fixme
876#endif 890#endif
877#ifdef GSM_ENABLE_NOKIA6110 891#ifdef GSM_ENABLE_NOKIA6110
878 {"3330" ,"NHM-6" ,"", {F_NOCALLER,F_RING_SM,F_CAL33,F_PROFILES33,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}}, 892 {"3330" ,"NHM-6" ,"", {F_NOCALLER,F_RING_SM,F_CAL33,F_PROFILES33,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
879 {"3390" ,"NPB-1" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_PROFILES33,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}}, 893 {"3390" ,"NPB-1" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_PROFILES33,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
880 {"3410" ,"NHM-2" ,"", {F_RING_SM,F_CAL33,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}}, 894 {"3410" ,"NHM-2" ,"", {F_RING_SM,F_CAL33,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},
881#endif 895#endif
882#ifdef GSM_ENABLE_NOKIA6510 896#ifdef GSM_ENABLE_NOKIA6510
883 {"3510" ,"NHM-8" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}}, 897 {"3510" ,"NHM-8" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}},
884 {"3510i","RH-9" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}}, 898 {"3510i","RH-9" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}},
885 {"3530" ,"RH-9" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}}, 899 {"3530" ,"RH-9" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}},
886 {"3589i","RH-44" ,"", {F_VOICETAGS,0}}, 900 {"3589i","RH-44" ,"", {F_VOICETAGS,0}},
887 {"3590" ,"NPM-8" ,"", {0}},//irda? 901 {"3590" ,"NPM-8" ,"", {0}},//irda?
888 {"3595" ,"NPM-10" ,"", {0}},//irda? 902 {"3595" ,"NPM-10" ,"", {0}},//irda?
889#endif 903#endif
890#ifdef GSM_ENABLE_NOKIA6110 904#ifdef GSM_ENABLE_NOKIA6110
891 {"3610" ,"NAM-1" ,"", {F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},//quess 905 {"3610" ,"NAM-1" ,"", {F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},//quess
892#endif 906#endif
893#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA3650) 907#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA3650)
894 {"3650" ,"NHL-8" ,"Nokia 3650", {0}}, 908 {"3650" ,"NHL-8" ,"Nokia 3650", {0}},
895 {"NGAGE","NEM-4" ,"", {F_RADIO,0}}, 909 {"NGAGE","NEM-4" ,"", {F_RADIO,0}},
896#endif 910#endif
897#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510) 911#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510)
898 {"5100" ,"NPM-6" ,"Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}}, 912 {"5100" ,"NPM-6" ,"Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
899 {"5100" ,"NPM-6U","Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}}, 913 {"5100" ,"NPM-6U","Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
900 {"5100" ,"NPM-6X","Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}}, 914 {"5100" ,"NPM-6X","Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
915 {"5140" ,"NPL-4" ,"Nokia 5140", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKUSER,F_WAPMMSPROXY,0}},
916 {"5140" ,"NPL-5" ,"Nokia 5140", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKUSER,F_WAPMMSPROXY,0}},
901#endif 917#endif
902#ifdef GSM_ENABLE_NOKIA6110 918#ifdef GSM_ENABLE_NOKIA6110
903 {"5110" ,"NSE-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}}, 919 {"5110" ,"NSE-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
904 {"5110i","NSE-2" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}}, 920 {"5110i","NSE-2" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
905 {"5130" ,"NSK-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}}, 921 {"5130" ,"NSK-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
906 {"5190" ,"NSB-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}}, 922 {"5190" ,"NSB-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
907#endif 923#endif
908#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6110) 924#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6110)
909 {"5210" ,"NSM-5" ,"Nokia 5210", {F_CAL52,F_NOSTARTANI,F_NOPICTUREUNI,F_NODTMF,0}}, 925 {"5210" ,"NSM-5" ,"Nokia 5210", {F_CAL52,F_NOSTARTANI,F_NOPICTUREUNI,F_NODTMF,0}},
910#endif 926#endif
911#ifdef GSM_ENABLE_NOKIA6110 927#ifdef GSM_ENABLE_NOKIA6110
912 {"5510" ,"NPM-5" ,"", {F_NOCALLER,F_PROFILES33,F_NOPICTUREUNI,0}}, 928 {"5510" ,"NPM-5" ,"", {F_NOCALLER,F_PROFILES33,F_NOPICTUREUNI,0}},
913#endif 929#endif
914#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510) 930#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510)
915 {"6100" ,"NPL-2" ,"Nokia 6100", {F_PBKTONEGAL,F_TODO66,0}}, 931 {"6100" ,"NPL-2" ,"Nokia 6100", {F_PBKTONEGAL,F_TODO66,0}},
916#endif 932#endif
917#ifdef GSM_ENABLE_NOKIA6110 933#ifdef GSM_ENABLE_NOKIA6110
918 {"6110" ,"NSE-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}}, 934 {"6110" ,"NSE-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}},
919 {"6130" ,"NSK-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}}, 935 {"6130" ,"NSK-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}},
920 {"6150" ,"NSM-1" ,"", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,F_NOPICTUREUNI,0}}, 936 {"6150" ,"NSM-1" ,"", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,F_NOPICTUREUNI,0}},
921 {"6190" ,"NSB-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}}, 937 {"6190" ,"NSB-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}},
922#endif 938#endif
923#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510) 939#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510)
924 {"6200" ,"NPL-3" ,"Nokia 6200", {F_PBKTONEGAL,0}}, 940 {"6200" ,"NPL-3" ,"Nokia 6200", {F_PBKTONEGAL,0}},
925 {"6220" ,"RH-20" ,"Nokia 6220", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,0}}, 941 {"6220" ,"RH-20" ,"Nokia 6220", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,0}},
926#endif 942#endif
927#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA7110) 943#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA7110)
928 {"6210" ,"NPE-3" ,"Nokia 6210", {F_VOICETAGS,F_CAL62,0}}, 944 {"6210" ,"NPE-3" ,"Nokia 6210", {F_VOICETAGS,F_CAL62,0}},
929 {"6250" ,"NHM-3" ,"Nokia 6250", {F_VOICETAGS,F_CAL62,0}}, 945 {"6250" ,"NHM-3" ,"Nokia 6250", {F_VOICETAGS,F_CAL62,0}},
930#endif 946#endif
931#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510) 947#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510)
932 {"6230" ,"RH-12" ,"Nokia 6230", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,0}}, 948 {"6230" ,"RH-12" ,"Nokia 6230", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,0}},
933 {"6310" ,"NPE-4" ,"Nokia 6310", {F_TODO63,F_CAL65,F_NOMIDI,F_NOMMS,F_VOICETAGS,0}}, 949 {"6310" ,"NPE-4" ,"Nokia 6310", {F_TODO63,F_CAL65,F_NOMIDI,F_NOMMS,F_VOICETAGS,0}},
934 {"6310i","NPL-1" ,"Nokia 6310i",{F_TODO63,F_CAL65,F_NOMIDI,F_BLUETOOTH,F_NOMMS,F_VOICETAGS,0}}, 950 {"6310i","NPL-1" ,"Nokia 6310i",{F_TODO63,F_CAL65,F_NOMIDI,F_BLUETOOTH,F_NOMMS,F_VOICETAGS,0}},
935 {"6385" ,"NHP-2AX","Nokia 6385",{F_TODO63,F_CAL65,F_NOMIDI,F_NOMMS,F_VOICETAGS,0}}, 951 {"6385" ,"NHP-2AX","Nokia 6385",{F_TODO63,F_CAL65,F_NOMIDI,F_NOMMS,F_VOICETAGS,0}},
936 {"6510" ,"NPM-9" ,"Nokia 6510", {F_TODO63,F_CAL65,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}}, 952 {"6510" ,"NPM-9" ,"Nokia 6510", {F_TODO63,F_CAL65,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}},
937 {"6610" ,"NHL-4U","Nokia 6610", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}}, 953 {"6610" ,"NHL-4U","Nokia 6610", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
954 {"6610i","RM-37" ,"Nokia 6610i",{F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
938 {"6800" ,"NSB-9" ,"Nokia 6800", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}}, 955 {"6800" ,"NSB-9" ,"Nokia 6800", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}},
939 {"6800" ,"NHL-6" ,"Nokia 6800", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}}, 956 {"6800" ,"NHL-6" ,"Nokia 6800", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}},
957 {"6810" ,"RM-2" ,"Nokia 6810", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}},//quess
958 {"6820" ,"NHL-9" ,"Nokia 6820", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}},//quess
940#endif 959#endif
941#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA7110) 960#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA7110)
942 {"7110" ,"NSE-5" ,"Nokia 7110", {F_CAL62,0}}, 961 {"7110" ,"NSE-5" ,"Nokia 7110", {F_CAL62,0}},
943 {"7190" ,"NSB-5" ,"Nokia 7190", {F_CAL62,0}}, 962 {"7190" ,"NSB-5" ,"Nokia 7190", {F_CAL62,0}},
944#endif 963#endif
945#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510) 964#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510)
965 {"7200" ,"RH-23" ,"Nokia 7200", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,0}},//quess
946 {"7210" ,"NHL-4" ,"Nokia 7210", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}}, 966 {"7210" ,"NHL-4" ,"Nokia 7210", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
947 {"7250" ,"NHL-4J","Nokia 7250", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKIMG,0}}, 967 {"7250" ,"NHL-4J","Nokia 7250", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKIMG,0}},
948 {"7250i","NHL-4JX","Nokia 7250i",{F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKIMG,0}}, 968 {"7250i","NHL-4JX","Nokia 7250i",{F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKIMG,0}},
949 {"7600", "NMM-3", "Nokia 7600", {F_TODO66,0}}, 969 {"7600", "NMM-3", "Nokia 7600", {F_TODO66,0}},
950#endif 970#endif
951#if defined(GSM_ENABLE_ATGEN) 971#if defined(GSM_ENABLE_ATGEN)
952 {"7650" ,"NHL-2" ,"Nokia 7650", {0}}, 972 {"7650" ,"NHL-2" ,"Nokia 7650", {0}},
953#endif 973#endif
954#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6110) 974#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6110)
955 {"8210" ,"NSM-3" ,"Nokia 8210", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_NOPICTUREUNI,0}}, 975 {"8210" ,"NSM-3" ,"Nokia 8210", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_NOPICTUREUNI,0}},
956 {"8250" ,"NSM-3D","Nokia 8250", {F_NOWAP,F_NOSTARTANI,F_CAL82,F_NOPICTUREUNI,0}}, 976 {"8250" ,"NSM-3D","Nokia 8250", {F_NOWAP,F_NOSTARTANI,F_CAL82,F_NOPICTUREUNI,0}},
957 {"8290" ,"NSB-7" ,"Nokia 8290", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_NOPICTUREUNI,0}}, 977 {"8290" ,"NSB-7" ,"Nokia 8290", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_NOPICTUREUNI,0}},
958#endif 978#endif
959#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510) 979#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510)
960 {"8310" ,"NHM-7" ,"Nokia 8310", {F_CAL62,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}}, 980 {"8310" ,"NHM-7" ,"Nokia 8310", {F_CAL62,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}},
961 {"8390" ,"NSB-8" ,"Nokia 8390", {F_CAL62,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}}, 981 {"8390" ,"NSB-8" ,"Nokia 8390", {F_CAL62,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}},
962#endif 982#endif
963#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6110) 983#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6110)
964 {"8850" ,"NSM-2" ,"Nokia 8850", {0}}, 984 {"8850" ,"NSM-2" ,"Nokia 8850", {0}},
965 {"8855" ,"NSM-4" ,"Nokia 8855", {0}}, 985 {"8855" ,"NSM-4" ,"Nokia 8855", {0}},
966 {"8890" ,"NSB-6" ,"Nokia 8890", {0}}, 986 {"8890" ,"NSB-6" ,"Nokia 8890", {0}},
967#endif 987#endif
968#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510) 988#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_NOKIA6510)
969 {"8910" ,"NHM-4" ,"Nokia 8910", {F_CAL62,F_NOMIDI,F_NOFILESYSTEM,F_NOMMS,0}}, 989 {"8910" ,"NHM-4" ,"Nokia 8910", {F_CAL62,F_NOMIDI,F_NOFILESYSTEM,F_NOMMS,0}},
970 {"8910i","NHM-4" ,"Nokia 8910i",{F_CAL62,F_NOMIDI,F_NOFILESYSTEM,F_NOMMS,0}}, 990 {"8910i","NHM-4" ,"Nokia 8910i",{F_CAL62,F_NOMIDI,F_NOFILESYSTEM,F_NOMMS,0}},
971#endif 991#endif
972#ifdef GSM_ENABLE_NOKIA9210 992#ifdef GSM_ENABLE_NOKIA9210
973 {"9210" ,"RAE-3" ,"", {0}}, 993 {"9210" ,"RAE-3" ,"", {0}},
974 {"9210i","RAE-5" ,"", {0}}, 994 {"9210i","RAE-5" ,"", {0}},
975#endif 995#endif
976#ifdef GSM_ENABLE_ATGEN 996#ifdef GSM_ENABLE_ATGEN
977 {"at" , "at", "", {0}}, 997 {"at" , "at", "", {0}},
998 /* Siemens */
978 {"M20" , "M20", "", {F_M20SMS,F_SLOWWRITE,0}}, 999 {"M20" , "M20", "", {F_M20SMS,F_SLOWWRITE,0}},
979 {"MC35" , "MC35", "", {0}}, 1000 {"MC35" , "MC35", "", {0}},
1001 {"TC35" , "TC35", "", {0}},
980 {"S25", "S25", "SIEMENS S25", {0}}, 1002 {"S25", "S25", "SIEMENS S25", {0}},
981 {"C35i" , "C35i", "", {0}}, 1003 {"C35i" , "C35i", "", {0}},
982 {"S35i" , "S35i", "", {0}}, 1004 {"S35i" , "S35i", "", {0}},
983 {"M35i" , "M35i", "", {0}}, 1005 {"M35i" , "M35i", "", {0}},
984 {"S40" , "Siemens S40", "", {0}}, 1006 {"S40" , "Siemens S40", "", {0}},
985 {"C45" , "C45", "", {0}}, 1007 {"C45" , "C45", "", {0}},
986 {"S45" , "S45", "", {0}}, 1008 {"S45" , "S45", "", {0}},
987 {"ME45" , "ME45", "", {0}}, 1009 {"ME45" , "ME45", "", {0}},
988 {"SL45" , "SL45", "", {0}}, 1010 {"SL45" , "SL45", "", {0}},
989 {"SL45i" , "SL45i", "", {0}}, 1011 {"SL45i" , "SL45i", "", {0}},
990 {"M50" , "M50", "", {0}}, 1012 {"M50" , "M50", "", {0}},
991 {"S45" , "6618" , "", {0}}, 1013 {"S45" , "6618" , "", {0}},
992 {"ME45" , "3618" , "", {0}}, 1014 {"ME45" , "3618" , "", {0}},
993 {"S55" , "S55" , "", {0}}, 1015 {"S55" , "S55" , "", {0}},
1016 /* Samsung */
1017 {"S100" , "SGH-S100" , "", {0}},
1018 {"S200" , "SGH-S200" , "", {0}},
1019 {"S300" , "SGH-S300" , "", {0}},
1020 {"S500" , "SGH-S500" , "", {0}},
1021 {"V200" , "SGH-V200" , "", {0}},
1022 {"T100" , "SGH-T100" , "", {0}},
1023 {"E700" , "SGH-E700" , "", {0}},
1024 /* Ericsson/Sony Ericsson */
994 {"T28s", "1101101-BVT28s","", {0}}, 1025 {"T28s", "1101101-BVT28s","", {0}},
995 {"R320s" , "1101201-BV R320s","", {0}}, 1026 {"R320s" , "1101201-BV R320s","", {0}},
996 {"R380s", "7100101-BVR380s" ,"", {0}}, 1027 {"R380s", "7100101-BVR380s" ,"", {0}},
997 {"R520m", "1130101-BVR520m" ,"", {0}}, 1028 {"R520m", "1130101-BVR520m" ,"", {0}},
998 {"T39m", "1130102-BVT39m" ,"", {0}}, 1029 {"T39m", "1130102-BVT39m" ,"", {0}},
999 {"T65", "1101901-BVT65" , "", {0}}, 1030 {"T65", "1101901-BVT65" , "", {0}},
1000 {"T68", "1130201-BVT68" , "", {0}}, 1031 {"T68", "1130201-BVT68" , "", {0}},
1001 {"T68i", "1130202-BVT68" , "", {0}}, 1032 {"T68i", "1130202-BVT68" , "", {0}},
1002 {"R600", "102001-BVR600" , "", {0}}, 1033 {"R600", "102001-BVR600" , "", {0}},
1003 {"T200", "1130501-BVT200" ,"", {0}}, 1034 {"T200", "1130501-BVT200" ,"", {0}},
1004 {"T300", "1130601-BVT300" ,"T300", {0}}, 1035 {"T300", "1130601-BVT300" ,"T300", {0}},
1005 {"T310", "1130602-BVT310" ,"", {0}}, 1036 {"T310", "1130602-BVT310" ,"", {0}},
1006 {"P800", "7130501-BVP800" ,"", {0}}, 1037 {"P800", "7130501-BVP800" ,"", {0}},
1038 /* Other */
1007 {"iPAQ" , "iPAQ" , "" , {0}}, 1039 {"iPAQ" , "iPAQ" , "" , {0}},
1008 {"A2D" , "A2D" , "" , {0}}, 1040 {"A2D" , "A2D" , "" , {0}},
1009 {"9210" , "RAE-3", "Nokia Communicator GSM900/1800",{0}}, 1041 {"9210" , "RAE-3", "Nokia Communicator GSM900/1800",{0}},
1010 {"myV-65", "myV-65 GPRS", "", {F_SMSME900,0}}, 1042 {"myV-65", "myV-65 GPRS", "", {F_SMSME900,0}},
1011#endif 1043#endif
1012#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_ALCATEL) 1044#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_ALCATEL)
1013 {"BE5", "ONE TOUCH 500","", {F_ALCATEL,F_SMSONLYSENT,F_BROKENCPBS,0}}, 1045 {"BE5", "ONE TOUCH 500","", {F_ALCATEL,F_SMSONLYSENT,F_BROKENCPBS,0}},
1014 {"BH4", "ONE TOUCH 535","ALCATEL OT535", {F_ALCATEL,F_SMSONLYSENT,0}}, 1046 {"BH4", "ONE TOUCH 535","ALCATEL OT535", {F_ALCATEL,F_SMSONLYSENT,0}},
1015 {"BF5", "ONE TOUCH 715","ALCATEL OT715", {F_ALCATEL,F_SMSONLYSENT,F_BROKENCPBS,0}}, 1047 {"BF5", "ONE TOUCH 715","ALCATEL OT715", {F_ALCATEL,F_SMSONLYSENT,F_BROKENCPBS,0}},
1016#endif 1048#endif
1017 {"unknown", "" ,"", {0}} 1049 {"unknown", "" ,"", {0}}
1018}; 1050};
1019 1051
1020OnePhoneModel *GetModelData(char *model, char *number, char *irdamodel) 1052OnePhoneModel *GetModelData(char *model, char *number, char *irdamodel)
1021{ 1053{
1022 int i = 0; 1054 int i = 0;
1023 1055
1024 while (strcmp(allmodels[i].number,"") != 0) { 1056 while (strcmp(allmodels[i].number,"") != 0) {
1025 if (model !=NULL) { 1057 if (model !=NULL) {
1026 if (strcmp (model, allmodels[i].model) == 0) { 1058 if (strcmp (model, allmodels[i].model) == 0) {
1027 return (&allmodels[i]); 1059 return (&allmodels[i]);
1028 } 1060 }
1029 } 1061 }
1030 if (number !=NULL) { 1062 if (number !=NULL) {
1031 if (strcmp (number, allmodels[i].number) == 0) { 1063 if (strcmp (number, allmodels[i].number) == 0) {
1032 return (&allmodels[i]); 1064 return (&allmodels[i]);
1033 } 1065 }
1034 } 1066 }
1035 if (irdamodel !=NULL) { 1067 if (irdamodel !=NULL) {
1036 if (strcmp (irdamodel, allmodels[i].irdamodel) == 0) { 1068 if (strcmp (irdamodel, allmodels[i].irdamodel) == 0) {
1037 return (&allmodels[i]); 1069 return (&allmodels[i]);
1038 } 1070 }
1039 } 1071 }
1040 i++; 1072 i++;
1041 } 1073 }
1042 return (&allmodels[i]); 1074 return (&allmodels[i]);
1043} 1075}
1044 1076
1045bool IsPhoneFeatureAvailable(OnePhoneModel *model, Feature feature) 1077bool IsPhoneFeatureAvailable(OnePhoneModel *model, Feature feature)
1046{ 1078{
1047 int i= 0; 1079 int i= 0;
1048 boolretval = false; 1080 boolretval = false;
1049 1081
1050 while (model->features[i] != 0) { 1082 while (model->features[i] != 0) {
1051 if (model->features[i] == feature) { 1083 if (model->features[i] == feature) {
1052 retval = true; 1084 retval = true;
1053 break; 1085 break;
1054 } 1086 }
diff --git a/gammu/emb/common/gsmstate.h b/gammu/emb/common/gsmstate.h
index cb17623..2b4806c 100644
--- a/gammu/emb/common/gsmstate.h
+++ b/gammu/emb/common/gsmstate.h
@@ -1,145 +1,153 @@
1/* (c) 2002-2004 by Marcin Wiacek & Michal Cihar */ 1/* (c) 2002-2004 by Marcin Wiacek & Michal Cihar */
2 2
3#ifndef __gsm_state_h 3#ifndef __gsm_state_h
4#define __gsm_state_h 4#define __gsm_state_h
5 5
6#include <time.h> 6#include <time.h>
7 7
8#include "config.h" 8#include "config.h"
9#include "misc/cfg.h" 9#include "misc/cfg.h"
10 10
11 typedef struct _GSM_StateMachine GSM_StateMachine;
12 typedef struct _GSM_User GSM_User;
13 typedef struct _OnePhoneModel OnePhoneModel;
14 typedef struct _GSM_Reply_FunctionGSM_Reply_Function;
15
11#ifdef GSM_ENABLE_NOKIA3320 16#ifdef GSM_ENABLE_NOKIA3320
12# include "phone/nokia/dct4/n3320.h" 17# include "phone/nokia/dct4/n3320.h"
13#endif 18#endif
14#ifdef GSM_ENABLE_NOKIA3650 19#ifdef GSM_ENABLE_NOKIA3650
15# include "phone/nokia/dct4/n3650.h" 20# include "phone/nokia/dct4/n3650.h"
16#endif 21#endif
22#ifdef GSM_ENABLE_NOKIA650
23# include "phone/nokia/dct3/n0650.h"
24#endif
17#ifdef GSM_ENABLE_NOKIA6110 25#ifdef GSM_ENABLE_NOKIA6110
18# include "phone/nokia/dct3/n6110.h" 26# include "phone/nokia/dct3/n6110.h"
19#endif 27#endif
20#ifdef GSM_ENABLE_NOKIA6510 28#ifdef GSM_ENABLE_NOKIA6510
21# include "phone/nokia/dct4/n6510.h" 29# include "phone/nokia/dct4/n6510.h"
22#endif 30#endif
23#ifdef GSM_ENABLE_NOKIA7110 31#ifdef GSM_ENABLE_NOKIA7110
24# include "phone/nokia/dct3/n7110.h" 32# include "phone/nokia/dct3/n7110.h"
25#endif 33#endif
26#ifdef GSM_ENABLE_NOKIA9210 34#ifdef GSM_ENABLE_NOKIA9210
27# include "phone/nokia/dct3/n9210.h" 35# include "phone/nokia/dct3/n9210.h"
28#endif 36#endif
29#ifdef GSM_ENABLE_ATGEN 37#ifdef GSM_ENABLE_ATGEN
30# include "phone/at/atgen.h" 38# include "phone/at/atgen.h"
31#endif 39#endif
32#ifdef GSM_ENABLE_ALCATEL 40#ifdef GSM_ENABLE_ALCATEL
33# include "phone/alcatel/alcatel.h" 41# include "phone/alcatel/alcatel.h"
34#endif 42#endif
35#ifdef GSM_ENABLE_OBEXGEN 43#ifdef GSM_ENABLE_OBEXGEN
36# include "phone/obex/obexgen.h" 44# include "phone/obex/obexgen.h"
37#endif 45#endif
38#ifdef GSM_ENABLE_MROUTERGEN 46#ifdef GSM_ENABLE_MROUTERGEN
39# include "phone/symbian/mroutgen.h" 47# include "phone/symbian/mroutgen.h"
40#endif 48#endif
41 49
42#ifndef GSM_USED_MBUS2 50#ifndef GSM_USED_MBUS2
43# undef GSM_ENABLE_MBUS2 51# undef GSM_ENABLE_MBUS2
44#endif 52#endif
45#ifndef GSM_USED_FBUS2 53#ifndef GSM_USED_FBUS2
46# undef GSM_ENABLE_FBUS2 54# undef GSM_ENABLE_FBUS2
47#endif 55#endif
48#ifndef GSM_USED_FBUS2DLR3 56#ifndef GSM_USED_FBUS2DLR3
49# undef GSM_ENABLE_FBUS2DLR3 57# undef GSM_ENABLE_FBUS2DLR3
50#endif 58#endif
51#ifndef GSM_USED_FBUS2DKU5 59#ifndef GSM_USED_FBUS2DKU5
52# undef GSM_ENABLE_FBUS2DKU5 60# undef GSM_ENABLE_FBUS2DKU5
53#endif 61#endif
54#ifndef GSM_USED_FBUS2PL2303 62#ifndef GSM_USED_FBUS2PL2303
55# undef GSM_ENABLE_FBUS2PL2303 63# undef GSM_ENABLE_FBUS2PL2303
56#endif 64#endif
57#ifndef GSM_USED_FBUS2BLUE 65#ifndef GSM_USED_FBUS2BLUE
58# undef GSM_ENABLE_FBUS2BLUE 66# undef GSM_ENABLE_FBUS2BLUE
59#endif 67#endif
60#ifndef GSM_USED_FBUS2IRDA 68#ifndef GSM_USED_FBUS2IRDA
61# undef GSM_ENABLE_FBUS2IRDA 69# undef GSM_ENABLE_FBUS2IRDA
62#endif 70#endif
63#ifndef GSM_USED_PHONETBLUE 71#ifndef GSM_USED_PHONETBLUE
64# undef GSM_ENABLE_PHONETBLUE 72# undef GSM_ENABLE_PHONETBLUE
65#endif 73#endif
66#ifndef GSM_USED_AT 74#ifndef GSM_USED_AT
67# undef GSM_ENABLE_AT 75# undef GSM_ENABLE_AT
68#endif 76#endif
69#ifndef GSM_USED_IRDAOBEX 77#ifndef GSM_USED_IRDAOBEX
70# undef GSM_ENABLE_IRDAOBEX 78# undef GSM_ENABLE_IRDAOBEX
71#endif 79#endif
72#ifndef GSM_USED_BLUEOBEX 80#ifndef GSM_USED_BLUEOBEX
73# undef GSM_ENABLE_BLUEOBEX 81# undef GSM_ENABLE_BLUEOBEX
74#endif 82#endif
75#ifndef GSM_USED_ALCABUS 83#ifndef GSM_USED_ALCABUS
76# undef GSM_ENABLE_ALCABUS 84# undef GSM_ENABLE_ALCABUS
77#endif 85#endif
78#ifndef GSM_USED_IRDAPHONET 86#ifndef GSM_USED_IRDAPHONET
79# undef GSM_ENABLE_IRDAPHONET 87# undef GSM_ENABLE_IRDAPHONET
80#endif 88#endif
81#ifndef GSM_USED_BLUEFBUS2 89#ifndef GSM_USED_BLUEFBUS2
82# undef GSM_ENABLE_BLUEFBUS2 90# undef GSM_ENABLE_BLUEFBUS2
83#endif 91#endif
84#ifndef GSM_USED_BLUEPHONET 92#ifndef GSM_USED_BLUEPHONET
85# undef GSM_ENABLE_BLUEPHONET 93# undef GSM_ENABLE_BLUEPHONET
86#endif 94#endif
87#ifndef GSM_USED_BLUEAT 95#ifndef GSM_USED_BLUEAT
88# undef GSM_ENABLE_BLUEAT 96# undef GSM_ENABLE_BLUEAT
89#endif 97#endif
90#ifndef GSM_USED_IRDAAT 98#ifndef GSM_USED_IRDAAT
91# undef GSM_ENABLE_IRDAAT 99# undef GSM_ENABLE_IRDAAT
92#endif 100#endif
93#ifndef GSM_USED_MROUTERBLUE 101#ifndef GSM_USED_MROUTERBLUE
94# undef GSM_ENABLE_MROUTERBLUE 102# undef GSM_ENABLE_MROUTERBLUE
95#endif 103#endif
96 104
97#if defined(GSM_ENABLE_NOKIA3320) || defined(GSM_ENABLE_NOKIA6110) || defined(GSM_ENABLE_NOKIA7110) || defined(GSM_ENABLE_NOKIA9210) 105#if defined(GSM_ENABLE_NOKIA3320) || defined(GSM_ENABLE_NOKIA650) || defined(GSM_ENABLE_NOKIA6110) || defined(GSM_ENABLE_NOKIA7110) || defined(GSM_ENABLE_NOKIA9210)
98# define GSM_ENABLE_NOKIA_DCT3 106# define GSM_ENABLE_NOKIA_DCT3
99#endif 107#endif
100#if defined(GSM_ENABLE_NOKIA3650) || defined(GSM_ENABLE_NOKIA6510) 108#if defined(GSM_ENABLE_NOKIA3650) || defined(GSM_ENABLE_NOKIA6510)
101# define GSM_ENABLE_NOKIA_DCT4 109# define GSM_ENABLE_NOKIA_DCT4
102#endif 110#endif
103 111
104#include "protocol/protocol.h" 112#include "protocol/protocol.h"
105#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2DKU5) || defined(GSM_ENABLE_FBUS2PL2303) 113#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2DKU5) || defined(GSM_ENABLE_FBUS2PL2303)
106# include "protocol/nokia/fbus2.h" 114# include "protocol/nokia/fbus2.h"
107#endif 115#endif
108#ifdef GSM_ENABLE_MBUS2 116#ifdef GSM_ENABLE_MBUS2
109# include "protocol/nokia/mbus2.h" 117# include "protocol/nokia/mbus2.h"
110#endif 118#endif
111#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET) 119#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET)
112# include "protocol/nokia/phonet.h" 120# include "protocol/nokia/phonet.h"
113#endif 121#endif
114#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) 122#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT)
115# include "protocol/at/at.h" 123# include "protocol/at/at.h"
116#endif 124#endif
117#ifdef GSM_ENABLE_ALCABUS 125#ifdef GSM_ENABLE_ALCABUS
118# include "protocol/alcatel/alcabus.h" 126# include "protocol/alcatel/alcabus.h"
119#endif 127#endif
120#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX) 128#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX)
121# include "protocol/obex/obex.h" 129# include "protocol/obex/obex.h"
122#endif 130#endif
123#if defined(GSM_ENABLE_MROUTERBLUE) 131#if defined(GSM_ENABLE_MROUTERBLUE)
124# include "protocol/symbian/mrouter.h" 132# include "protocol/symbian/mrouter.h"
125#endif 133#endif
126 134
127#define GSM_ENABLE_SERIALDEVICE 135#define GSM_ENABLE_SERIALDEVICE
128#ifndef GSM_USED_SERIALDEVICE 136#ifndef GSM_USED_SERIALDEVICE
129# undef GSM_ENABLE_SERIALDEVICE 137# undef GSM_ENABLE_SERIALDEVICE
130#endif 138#endif
131#define GSM_ENABLE_IRDADEVICE 139#define GSM_ENABLE_IRDADEVICE
132#ifndef GSM_USED_IRDADEVICE 140#ifndef GSM_USED_IRDADEVICE
133# undef GSM_ENABLE_IRDADEVICE 141# undef GSM_ENABLE_IRDADEVICE
134#endif 142#endif
135#define GSM_ENABLE_BLUETOOTHDEVICE 143#define GSM_ENABLE_BLUETOOTHDEVICE
136#ifndef GSM_USED_BLUETOOTHDEVICE 144#ifndef GSM_USED_BLUETOOTHDEVICE
137# undef GSM_ENABLE_BLUETOOTHDEVICE 145# undef GSM_ENABLE_BLUETOOTHDEVICE
138#endif 146#endif
139 147
140#ifdef DJGPP 148#ifdef DJGPP
141# undef GSM_ENABLE_IRDADEVICE 149# undef GSM_ENABLE_IRDADEVICE
142# undef GSM_ENABLE_IRDAPHONET 150# undef GSM_ENABLE_IRDAPHONET
143# undef GSM_ENABLE_IRDAOBEX 151# undef GSM_ENABLE_IRDAOBEX
144# undef GSM_ENABLE_IRDAAT 152# undef GSM_ENABLE_IRDAAT
145# undef GSM_ENABLE_FBUS2IRDA 153# undef GSM_ENABLE_FBUS2IRDA
@@ -154,99 +162,96 @@
154# undef GSM_ENABLE_MROUTERBLUE 162# undef GSM_ENABLE_MROUTERBLUE
155#endif 163#endif
156 164
157#ifndef WIN32 165#ifndef WIN32
158# ifdef ENABLE_LGPL 166# ifdef ENABLE_LGPL
159# undef GSM_ENABLE_IRDADEVICE 167# undef GSM_ENABLE_IRDADEVICE
160# undef GSM_ENABLE_IRDAPHONET 168# undef GSM_ENABLE_IRDAPHONET
161# undef GSM_ENABLE_IRDAOBEX 169# undef GSM_ENABLE_IRDAOBEX
162# undef GSM_ENABLE_IRDAAT 170# undef GSM_ENABLE_IRDAAT
163# undef GSM_ENABLE_FBUS2IRDA 171# undef GSM_ENABLE_FBUS2IRDA
164 172
165# undef GSM_ENABLE_BLUETOOTHDEVICE 173# undef GSM_ENABLE_BLUETOOTHDEVICE
166# undef GSM_ENABLE_BLUEPHONET 174# undef GSM_ENABLE_BLUEPHONET
167# undef GSM_ENABLE_BLUEOBEX 175# undef GSM_ENABLE_BLUEOBEX
168# undef GSM_ENABLE_BLUEAT 176# undef GSM_ENABLE_BLUEAT
169# undef GSM_ENABLE_BLUEFBUS2 177# undef GSM_ENABLE_BLUEFBUS2
170# undef GSM_ENABLE_PHONETBLUE 178# undef GSM_ENABLE_PHONETBLUE
171# undef GSM_ENABLE_FBUS2BLUE 179# undef GSM_ENABLE_FBUS2BLUE
172# undef GSM_ENABLE_MROUTERBLUE 180# undef GSM_ENABLE_MROUTERBLUE
173# endif 181# endif
174#endif 182#endif
175 183
176#ifdef GSM_ENABLE_SERIALDEVICE 184#ifdef GSM_ENABLE_SERIALDEVICE
177# include "device/serial/ser_w32.h" 185# include "device/serial/ser_w32.h"
178# include "device/serial/ser_unx.h" 186# include "device/serial/ser_unx.h"
179# include "device/serial/ser_djg.h" 187# include "device/serial/ser_djg.h"
180#endif 188#endif
181#ifdef GSM_ENABLE_IRDADEVICE 189#ifdef GSM_ENABLE_IRDADEVICE
182# include "device/irda/irda.h" 190# include "device/irda/irda.h"
183#endif 191#endif
184#ifdef GSM_ENABLE_BLUETOOTHDEVICE 192#ifdef GSM_ENABLE_BLUETOOTHDEVICE
185# include "device/bluetoth/bluetoth.h" 193# include "device/bluetoth/bluetoth.h"
186#endif 194#endif
187 195
188#include "service/gsmpbk.h" 196#include "service/gsmpbk.h"
189#include "service/gsmnet.h" 197#include "service/gsmnet.h"
190#include "service/gsmring.h" 198#include "service/gsmring.h"
191#include "service/gsmcal.h" 199#include "service/gsmcal.h"
192#include "service/gsmdata.h" 200#include "service/gsmdata.h"
193#include "service/gsmlogo.h" 201#include "service/gsmlogo.h"
194#include "service/gsmmisc.h" 202#include "service/gsmmisc.h"
195#include "service/gsmprof.h" 203#include "service/gsmprof.h"
196#include "service/gsmcall.h" 204#include "service/gsmcall.h"
197#include "service/sms/gsmsms.h" 205#include "service/sms/gsmsms.h"
198#include "service/sms/gsmems.h" 206#include "service/sms/gsmems.h"
199#include "service/sms/gsmmulti.h" 207#include "service/sms/gsmmulti.h"
200#include "service/backup/gsmback.h" 208#include "service/backup/gsmback.h"
201 209
202typedef struct _GSM_StateMachine GSM_StateMachine;
203 typedef struct _GSM_User GSM_User;
204 typedef struct _OnePhoneModel OnePhoneModel;
205 210
206/* ------------------------- Device layer ---------------------------------- */ 211/* ------------------------- Device layer ---------------------------------- */
207 212
208/** 213/**
209 * Device functions, each device has to provide these. 214 * Device functions, each device has to provide these.
210 */ 215 */
211typedef struct { 216typedef struct {
212 /** 217 /**
213 * Opens device. 218 * Opens device.
214 */ 219 */
215 GSM_Error (*OpenDevice) (GSM_StateMachine *s); 220 GSM_Error (*OpenDevice) (GSM_StateMachine *s);
216 /** 221 /**
217 * Closes device. 222 * Closes device.
218 */ 223 */
219 GSM_Error (*CloseDevice) (GSM_StateMachine *s); 224 GSM_Error (*CloseDevice) (GSM_StateMachine *s);
220 /** 225 /**
221 * Sets parity for device. 226 * Sets parity for device.
222 */ 227 */
223 GSM_Error (*DeviceSetParity) (GSM_StateMachine *s, bool parity); 228 GSM_Error (*DeviceSetParity) (GSM_StateMachine *s, bool parity);
224 /** 229 /**
225 * Sets dtr (data to read) and rts (ready to send) flags. 230 * Sets dtr (data to read) and rts (ready to send) flags.
226 */ 231 */
227 GSM_Error (*DeviceSetDtrRts) (GSM_StateMachine *s, bool dtr, bool rts); 232 GSM_Error (*DeviceSetDtrRts) (GSM_StateMachine *s, bool dtr, bool rts);
228 /** 233 /**
229 * Sets device speed. 234 * Sets device speed.
230 */ 235 */
231 GSM_Error (*DeviceSetSpeed) (GSM_StateMachine *s, int speed); 236 GSM_Error (*DeviceSetSpeed) (GSM_StateMachine *s, int speed);
232 /** 237 /**
233 * Attempts to read nbytes from device. 238 * Attempts to read nbytes from device.
234 */ 239 */
235 int (*ReadDevice) (GSM_StateMachine *s, void *buf, size_t nbytes); 240 int (*ReadDevice) (GSM_StateMachine *s, void *buf, size_t nbytes);
236 /** 241 /**
237 * Attempts to read nbytes from device. 242 * Attempts to read nbytes from device.
238 */ 243 */
239 int (*WriteDevice) (GSM_StateMachine *s, void *buf, size_t nbytes); 244 int (*WriteDevice) (GSM_StateMachine *s, void *buf, size_t nbytes);
240} GSM_Device_Functions; 245} GSM_Device_Functions;
241 246
242#ifdef GSM_ENABLE_SERIALDEVICE 247#ifdef GSM_ENABLE_SERIALDEVICE
243 extern GSM_Device_Functions SerialDevice; 248 extern GSM_Device_Functions SerialDevice;
244#endif 249#endif
245#ifdef GSM_ENABLE_IRDADEVICE 250#ifdef GSM_ENABLE_IRDADEVICE
246 extern GSM_Device_Functions IrdaDevice; 251 extern GSM_Device_Functions IrdaDevice;
247#endif 252#endif
248#ifdef GSM_ENABLE_BLUETOOTHDEVICE 253#ifdef GSM_ENABLE_BLUETOOTHDEVICE
249 extern GSM_Device_Functions BlueToothDevice; 254 extern GSM_Device_Functions BlueToothDevice;
250#endif 255#endif
251 256
252/** 257/**
@@ -326,163 +331,166 @@ typedef struct {
326 struct { 331 struct {
327 char fake; 332 char fake;
328#ifdef GSM_ENABLE_MBUS2 333#ifdef GSM_ENABLE_MBUS2
329 GSM_Protocol_MBUS2Data MBUS2; 334 GSM_Protocol_MBUS2Data MBUS2;
330#endif 335#endif
331#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2DKU5) || defined(GSM_ENABLE_FBUS2PL2303) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) 336#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2DKU5) || defined(GSM_ENABLE_FBUS2PL2303) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2)
332 GSM_Protocol_FBUS2Data FBUS2; 337 GSM_Protocol_FBUS2Data FBUS2;
333#endif 338#endif
334#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET) 339#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET)
335 GSM_Protocol_PHONETData PHONET; 340 GSM_Protocol_PHONETData PHONET;
336#endif 341#endif
337#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) 342#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT)
338 GSM_Protocol_ATData AT; 343 GSM_Protocol_ATData AT;
339#endif 344#endif
340#ifdef GSM_ENABLE_ALCABUS 345#ifdef GSM_ENABLE_ALCABUS
341 GSM_Protocol_ALCABUSDataALCABUS; 346 GSM_Protocol_ALCABUSDataALCABUS;
342#endif 347#endif
343#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX) 348#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX)
344 GSM_Protocol_OBEXData OBEX; 349 GSM_Protocol_OBEXData OBEX;
345#endif 350#endif
346#if defined(GSM_ENABLE_MROUTERBLUE) 351#if defined(GSM_ENABLE_MROUTERBLUE)
347 GSM_Protocol_MROUTERDataMROUTER; 352 GSM_Protocol_MROUTERDataMROUTER;
348#endif 353#endif
349 } Data; 354 } Data;
350 GSM_Protocol_Functions *Functions; 355 GSM_Protocol_Functions *Functions;
351} GSM_Protocol; 356} GSM_Protocol;
352 357
353/* -------------------------- Phone layer ---------------------------------- */ 358/* -------------------------- Phone layer ---------------------------------- */
354 359
355/** 360/**
356 * Phone requests identificators, these are used for internally identifying 361 * Phone requests identificators, these are used for internally identifying
357 * which operation is being performed. 362 * which operation is being performed.
358 */ 363 */
359typedef enum { 364typedef enum {
360 ID_None=1, 365 ID_None=1,
361 ID_GetModel, 366 ID_GetModel,
362 ID_GetFirmware, 367 ID_GetFirmware,
363 ID_EnableSecurity, 368 ID_EnableSecurity,
364 ID_GetIMEI, 369 ID_GetIMEI,
365 ID_GetDateTime, 370 ID_GetDateTime,
366 ID_GetAlarm, 371 ID_GetAlarm,
367 ID_GetMemory, 372 ID_GetMemory,
368 ID_GetMemoryStatus, 373 ID_GetMemoryStatus,
369 ID_GetSMSC, 374 ID_GetSMSC,
370 ID_GetSMSMessage, 375 ID_GetSMSMessage,
371 ID_EnableEcho, 376 ID_EnableEcho,
372 ID_EnableErrorInfo, 377 ID_EnableErrorInfo,
373 ID_SetOBEX, 378 ID_SetOBEX,
379 ID_SetUSSD,
380 ID_GetNote,
374 ID_GetSignalQuality, 381 ID_GetSignalQuality,
375 ID_GetBatteryCharge, 382 ID_GetBatteryCharge,
376 ID_GetSMSFolders, 383 ID_GetSMSFolders,
377 ID_GetSMSFolderStatus, 384 ID_GetSMSFolderStatus,
378 ID_GetSMSStatus, 385 ID_GetSMSStatus,
379 ID_AddSMSFolder, 386 ID_AddSMSFolder,
380 ID_GetNetworkInfo, 387 ID_GetNetworkInfo,
381 ID_GetRingtone, 388 ID_GetRingtone,
382 ID_DialVoice, 389 ID_DialVoice,
383 ID_GetCalendarNotesInfo, 390 ID_GetCalendarNotesInfo,
384 ID_GetCalendarNote, 391 ID_GetCalendarNote,
385 ID_GetSecurityCode, 392 ID_GetSecurityCode,
386 ID_GetWAPBookmark, 393 ID_GetWAPBookmark,
387 ID_GetBitmap, 394 ID_GetBitmap,
388 ID_SaveSMSMessage, 395 ID_SaveSMSMessage,
389 ID_CancelCall, 396 ID_CancelCall,
390 ID_SetDateTime, 397 ID_SetDateTime,
391 ID_SetAlarm, 398 ID_SetAlarm,
392 ID_DisableConnectFunc, 399 ID_DisableConnectFunc,
393 ID_EnableConnectFunc, 400 ID_EnableConnectFunc,
394 ID_AnswerCall, 401 ID_AnswerCall,
395 ID_SetBitmap, 402 ID_SetBitmap,
396 ID_SetRingtone, 403 ID_SetRingtone,
397 ID_DeleteSMSMessage, 404 ID_DeleteSMSMessage,
398 ID_DeleteCalendarNote, 405 ID_DeleteCalendarNote,
399 ID_SetPath, 406 ID_SetPath,
400 ID_SetSMSC, 407 ID_SetSMSC,
401 ID_SetProfile, 408 ID_SetProfile,
402 ID_SetMemory, 409 ID_SetMemory,
403 ID_DeleteMemory, 410 ID_DeleteMemory,
404 ID_SetCalendarNote, 411 ID_SetCalendarNote,
405 ID_SetIncomingSMS, 412 ID_SetIncomingSMS,
406 ID_SetIncomingCB, 413 ID_SetIncomingCB,
407 ID_GetCalendarNotePos, 414 ID_GetCalendarNotePos,
408 ID_Initialise, 415 ID_Initialise,
409 ID_GetConnectSet, 416 ID_GetConnectSet,
410 ID_SetWAPBookmark, 417 ID_SetWAPBookmark,
411 ID_GetLocale, 418 ID_GetLocale,
412 ID_SetLocale, 419 ID_SetLocale,
413 ID_GetCalendarSettings, 420 ID_GetCalendarSettings,
414 ID_SetCalendarSettings, 421 ID_SetCalendarSettings,
415 ID_GetGPRSPoint, 422 ID_GetGPRSPoint,
416 ID_SetGPRSPoint, 423 ID_SetGPRSPoint,
417 ID_EnableGPRSPoint, 424 ID_EnableGPRSPoint,
418 ID_DeleteWAPBookmark, 425 ID_DeleteWAPBookmark,
419 ID_Netmonitor, 426 ID_Netmonitor,
420 ID_HoldCall, 427 ID_HoldCall,
421 ID_UnholdCall, 428 ID_UnholdCall,
422 ID_ConferenceCall, 429 ID_ConferenceCall,
423 ID_SplitCall, 430 ID_SplitCall,
424 ID_TransferCall, 431 ID_TransferCall,
425 ID_SwitchCall, 432 ID_SwitchCall,
426 ID_GetManufactureMonth, 433 ID_GetManufactureMonth,
427 ID_GetProductCode, 434 ID_GetProductCode,
428 ID_GetOriginalIMEI, 435 ID_GetOriginalIMEI,
429 ID_GetHardware, 436 ID_GetHardware,
430 ID_GetPPM, 437 ID_GetPPM,
431 ID_GetSMSMode, 438 ID_GetSMSMode,
432 ID_GetSMSMemories, 439 ID_GetSMSMemories,
433 ID_GetManufacturer, 440 ID_GetManufacturer,
434 ID_SetMemoryType, 441 ID_SetMemoryType,
435 ID_SetMemoryCharset, 442 ID_SetMemoryCharset,
436 ID_GetMMSSettings, 443 ID_GetMMSSettings,
437 ID_SetSMSParameters, 444 ID_SetSMSParameters,
438 ID_GetFMStation, 445 ID_GetFMStation,
439 ID_SetFMStation, 446 ID_SetFMStation,
440 ID_GetLanguage, 447 ID_GetLanguage,
448 ID_SetFastSMSSending,
441 ID_Reset, 449 ID_Reset,
442 ID_GetToDo, 450 ID_GetToDo,
443 ID_PressKey, 451 ID_PressKey,
444 ID_DeleteAllToDo, 452 ID_DeleteAllToDo,
445 ID_SetLight, 453 ID_SetLight,
446 ID_Divert, 454 ID_Divert,
447 ID_SetToDo, 455 ID_SetToDo,
448 ID_PlayTone, 456 ID_PlayTone,
449 ID_GetChatSettings, 457 ID_GetChatSettings,
450 ID_GetSyncMLSettings, 458 ID_GetSyncMLSettings,
451 ID_GetSyncMLName, 459 ID_GetSyncMLName,
452 ID_GetSecurityStatus, 460 ID_GetSecurityStatus,
453 ID_EnterSecurityCode, 461 ID_EnterSecurityCode,
454 ID_GetProfile, 462 ID_GetProfile,
455 ID_GetRingtonesInfo, 463 ID_GetRingtonesInfo,
456 ID_MakeAuthentication, 464 ID_MakeAuthentication,
457 ID_GetSpeedDial, 465 ID_GetSpeedDial,
458 ID_ResetPhoneSettings, 466 ID_ResetPhoneSettings,
459 ID_SendDTMF, 467 ID_SendDTMF,
460 ID_GetDisplayStatus, 468 ID_GetDisplayStatus,
461 ID_SetAutoNetworkLogin, 469 ID_SetAutoNetworkLogin,
462 ID_SetConnectSet, 470 ID_SetConnectSet,
463 ID_SetMMSSettings, 471 ID_SetMMSSettings,
464 ID_GetSIMIMSI, 472 ID_GetSIMIMSI,
465 ID_GetFileInfo, 473 ID_GetFileInfo,
466 ID_FileSystemStatus, 474 ID_FileSystemStatus,
467 ID_GetFile, 475 ID_GetFile,
468 ID_AddFile, 476 ID_AddFile,
469 ID_AddFolder, 477 ID_AddFolder,
470 ID_DeleteFile, 478 ID_DeleteFile,
471#ifdef GSM_ENABLE_ALCATEL 479#ifdef GSM_ENABLE_ALCATEL
472 /* AT mode */ 480 /* AT mode */
473 ID_SetFlowControl, 481 ID_SetFlowControl,
474 ID_AlcatelConnect, 482 ID_AlcatelConnect,
475 ID_AlcatelProtocol, 483 ID_AlcatelProtocol,
476 484
477 /* Binary mode */ 485 /* Binary mode */
478 ID_AlcatelAttach, 486 ID_AlcatelAttach,
479 ID_AlcatelDetach, 487 ID_AlcatelDetach,
480 ID_AlcatelCommit, 488 ID_AlcatelCommit,
481 ID_AlcatelCommit2, 489 ID_AlcatelCommit2,
482 ID_AlcatelEnd, 490 ID_AlcatelEnd,
483 ID_AlcatelClose, 491 ID_AlcatelClose,
484 ID_AlcatelStart, 492 ID_AlcatelStart,
485 ID_AlcatelSelect1, 493 ID_AlcatelSelect1,
486 ID_AlcatelSelect2, 494 ID_AlcatelSelect2,
487 ID_AlcatelSelect3, 495 ID_AlcatelSelect3,
488 ID_AlcatelBegin1, 496 ID_AlcatelBegin1,
@@ -624,96 +632,97 @@ typedef struct {
624 /** 632 /**
625 * Pointer to structure used internally by phone drivers. 633 * Pointer to structure used internally by phone drivers.
626 */ 634 */
627 GSM_SignalQuality*SignalQuality; 635 GSM_SignalQuality*SignalQuality;
628 /** 636 /**
629 * Pointer to structure used internally by phone drivers. 637 * Pointer to structure used internally by phone drivers.
630 */ 638 */
631 GSM_BatteryCharge*BatteryCharge; 639 GSM_BatteryCharge*BatteryCharge;
632 /** 640 /**
633 * Pointer to structure used internally by phone drivers. 641 * Pointer to structure used internally by phone drivers.
634 */ 642 */
635 GSM_NetworkInfo *NetworkInfo; 643 GSM_NetworkInfo *NetworkInfo;
636 /** 644 /**
637 * Pointer to structure used internally by phone drivers. 645 * Pointer to structure used internally by phone drivers.
638 */ 646 */
639 GSM_Ringtone *Ringtone; 647 GSM_Ringtone *Ringtone;
640 /** 648 /**
641 * Pointer to structure used internally by phone drivers. 649 * Pointer to structure used internally by phone drivers.
642 */ 650 */
643 GSM_CalendarEntry*Cal; 651 GSM_CalendarEntry*Cal;
644 /** 652 /**
645 * Used internally by phone drivers. 653 * Used internally by phone drivers.
646 */ 654 */
647 unsigned char *SecurityCode; 655 unsigned char *SecurityCode;
648 /** 656 /**
649 * Pointer to structure used internally by phone drivers. 657 * Pointer to structure used internally by phone drivers.
650 */ 658 */
651 GSM_WAPBookmark *WAPBookmark; 659 GSM_WAPBookmark *WAPBookmark;
652 /** 660 /**
653 * Pointer to structure used internally by phone drivers. 661 * Pointer to structure used internally by phone drivers.
654 */ 662 */
655 GSM_MultiWAPSettings*WAPSettings; 663 GSM_MultiWAPSettings*WAPSettings;
656 /** 664 /**
657 * Pointer to structure used internally by phone drivers. 665 * Pointer to structure used internally by phone drivers.
658 */ 666 */
659 GSM_Bitmap *Bitmap; 667 GSM_Bitmap *Bitmap;
660 /** 668 /**
661 * Used internally by phone drivers. 669 * Used internally by phone drivers.
662 */ 670 */
663 unsigned char *Netmonitor; 671 unsigned char *Netmonitor;
664 /** 672 /**
665 * Pointer to structure used internally by phone drivers. 673 * Pointer to structure used internally by phone drivers.
666 */ 674 */
667 GSM_MultiCallDivert*Divert; 675 GSM_MultiCallDivert*Divert;
668 /** 676 /**
669 * Pointer to structure used internally by phone drivers. 677 * Pointer to structure used internally by phone drivers.
670 */ 678 */
671 GSM_ToDoEntry *ToDo; 679 GSM_ToDoEntry *ToDo;
680 GSM_NoteEntry *Note;
672 /** 681 /**
673 * Used internally by phone drivers. 682 * Used internally by phone drivers.
674 */ 683 */
675 bool PressKey; 684 bool PressKey;
676 /** 685 /**
677 * Pointer to structure used internally by phone drivers. 686 * Pointer to structure used internally by phone drivers.
678 */ 687 */
679 GSM_SecurityCodeType*SecurityStatus; 688 GSM_SecurityCodeType*SecurityStatus;
680 /** 689 /**
681 * Pointer to structure used internally by phone drivers. 690 * Pointer to structure used internally by phone drivers.
682 */ 691 */
683 GSM_Profile *Profile; 692 GSM_Profile *Profile;
684 /** 693 /**
685 * Pointer to structure used internally by phone drivers. 694 * Pointer to structure used internally by phone drivers.
686 */ 695 */
687 GSM_AllRingtonesInfo*RingtonesInfo; 696 GSM_AllRingtonesInfo*RingtonesInfo;
688 /** 697 /**
689 * Pointer to structure used internally by phone drivers. 698 * Pointer to structure used internally by phone drivers.
690 */ 699 */
691 GSM_DisplayFeatures*DisplayFeatures; 700 GSM_DisplayFeatures*DisplayFeatures;
692 /** 701 /**
693 * Pointer to structure used internally by phone drivers. 702 * Pointer to structure used internally by phone drivers.
694 */ 703 */
695 GSM_FMStation *FMStation; 704 GSM_FMStation *FMStation;
696 /** 705 /**
697 * Pointer to structure used internally by phone drivers. 706 * Pointer to structure used internally by phone drivers.
698 */ 707 */
699 GSM_Locale *Locale; 708 GSM_Locale *Locale;
700 /** 709 /**
701 * Pointer to structure used internally by phone drivers. 710 * Pointer to structure used internally by phone drivers.
702 */ 711 */
703 GSM_CalendarSettings*CalendarSettings; 712 GSM_CalendarSettings*CalendarSettings;
704 /** 713 /**
705 * Used internally by phone drivers. 714 * Used internally by phone drivers.
706 */ 715 */
707 unsigned char *PhoneString; 716 unsigned char *PhoneString;
708 /** 717 /**
709 * Used internally by phone drivers. 718 * Used internally by phone drivers.
710 */ 719 */
711 int StartPhoneString; 720 int StartPhoneString;
712 /** 721 /**
713 * Pointer to structure used internally by phone drivers. 722 * Pointer to structure used internally by phone drivers.
714 */ 723 */
715 GSM_File *FileInfo; 724 GSM_File *FileInfo;
716 /** 725 /**
717 * Pointer to structure used internally by phone drivers. 726 * Pointer to structure used internally by phone drivers.
718 */ 727 */
719 GSM_File *File; 728 GSM_File *File;
@@ -725,155 +734,158 @@ typedef struct {
725 GSM_SyncMLSettings*SyncMLSettings; 734 GSM_SyncMLSettings*SyncMLSettings;
726 735
727 /** 736 /**
728 * Should phone notify about incoming calls? 737 * Should phone notify about incoming calls?
729 */ 738 */
730 bool EnableIncomingCall; 739 bool EnableIncomingCall;
731 /** 740 /**
732 * Should phone notify about incoming SMSes? 741 * Should phone notify about incoming SMSes?
733 */ 742 */
734 bool EnableIncomingSMS; 743 bool EnableIncomingSMS;
735 /** 744 /**
736 * Should phone notify about incoming CBs? 745 * Should phone notify about incoming CBs?
737 */ 746 */
738 bool EnableIncomingCB; 747 bool EnableIncomingCB;
739 /** 748 /**
740 * Should phone notify about incoming USSDs? 749 * Should phone notify about incoming USSDs?
741 */ 750 */
742 bool EnableIncomingUSSD; 751 bool EnableIncomingUSSD;
743 752
744 /** 753 /**
745 * Last message received from phone. 754 * Last message received from phone.
746 */ 755 */
747 GSM_Protocol_Message*RequestMsg; 756 GSM_Protocol_Message*RequestMsg;
748 /** 757 /**
749 * Last message sent by Gammu. 758 * Last message sent by Gammu.
750 */ 759 */
751 GSM_Protocol_Message*SentMsg; 760 GSM_Protocol_Message*SentMsg;
752 /** 761 /**
753 * What operation is being performed now, see @ref GSM_Phone_RequestID 762 * What operation is being performed now, see @ref GSM_Phone_RequestID
754 * for possible values. 763 * for possible values.
755 */ 764 */
756 GSM_Phone_RequestIDRequestID; 765 GSM_Phone_RequestIDRequestID;
757 /** 766 /**
758 * Error returned by function in phone module. 767 * Error returned by function in phone module.
759 */ 768 */
760 GSM_Error DispatchError; 769 GSM_Error DispatchError;
761 770
762 /** 771 /**
763 * Structure with private phone modules data. 772 * Structure with private phone modules data.
764 */ 773 */
765 struct { 774 struct {
766 int fake; 775 int fake;
767#ifdef GSM_ENABLE_NOKIA3320 776#ifdef GSM_ENABLE_NOKIA3320
768 GSM_Phone_N3320Data N3320; 777 GSM_Phone_N3320Data N3320;
769#endif 778#endif
770#ifdef GSM_ENABLE_NOKIA3650 779#ifdef GSM_ENABLE_NOKIA3650
771 GSM_Phone_N3650Data N3650; 780 GSM_Phone_N3650Data N3650;
772#endif 781#endif
782#ifdef GSM_ENABLE_NOKIA650
783 GSM_Phone_N650Data N650;
784#endif
773#ifdef GSM_ENABLE_NOKIA6110 785#ifdef GSM_ENABLE_NOKIA6110
774 GSM_Phone_N6110Data N6110; 786 GSM_Phone_N6110Data N6110;
775#endif 787#endif
776#ifdef GSM_ENABLE_NOKIA6510 788#ifdef GSM_ENABLE_NOKIA6510
777 GSM_Phone_N6510Data N6510; 789 GSM_Phone_N6510Data N6510;
778#endif 790#endif
779#ifdef GSM_ENABLE_NOKIA7110 791#ifdef GSM_ENABLE_NOKIA7110
780 GSM_Phone_N7110Data N7110; 792 GSM_Phone_N7110Data N7110;
781#endif 793#endif
782#ifdef GSM_ENABLE_ATGEN 794#ifdef GSM_ENABLE_ATGEN
783 GSM_Phone_ATGENData ATGEN; 795 GSM_Phone_ATGENData ATGEN;
784#endif 796#endif
785#ifdef GSM_ENABLE_ALCATEL 797#ifdef GSM_ENABLE_ALCATEL
786 GSM_Phone_ALCATELData ALCATEL; 798 GSM_Phone_ALCATELData ALCATEL;
787#endif 799#endif
788#ifdef GSM_ENABLE_OBEXGEN 800#ifdef GSM_ENABLE_OBEXGEN
789 GSM_Phone_OBEXGENData OBEXGEN; 801 GSM_Phone_OBEXGENData OBEXGEN;
790#endif 802#endif
791#ifdef GSM_ENABLE_MROUTERGEN 803#ifdef GSM_ENABLE_MROUTERGEN
792 GSM_Phone_MROUTERGENData MROUTERGEN; 804 GSM_Phone_MROUTERGENData MROUTERGEN;
793#endif 805#endif
794 } Priv; 806 } Priv;
795} GSM_Phone_Data; 807} GSM_Phone_Data;
796 808
797/** 809/**
798 * Structure for defining reply functions. 810 * Structure for defining reply functions.
799 * 811 *
800 * Function is called when requestID matches current operation or is 812 * Function is called when requestID matches current operation or is
801 * ID_IncomingFrame and msgtype matches start message and (if msgtype is just 813 * ID_IncomingFrame and msgtype matches start message and (if msgtype is just
802 * one character) subtypechar is zero or subtypechar-th character of message 814 * one character) subtypechar is zero or subtypechar-th character of message
803 * matches subtype. 815 * matches subtype.
804 * 816 *
805 * Should be used in array with last element containing ID_None as requestID. 817 * Should be used in array with last element containing ID_None as requestID.
806 */ 818 */
807typedef struct { 819struct _GSM_Reply_Function {
808 /** 820 /**
809 * Pointer to function that should be executed. 821 * Pointer to function that should be executed.
810 */ 822 */
811 GSM_Error (*Function)(GSM_Protocol_Message msg, GSM_StateMachine *s); 823 GSM_Error (*Function)(GSM_Protocol_Message msg, GSM_StateMachine *s);
812 /** 824 /**
813 * Message type, if it is longer than 1 character, it disables subtype 825 * Message type, if it is longer than 1 character, it disables subtype
814 * checking. 826 * checking.
815 */ 827 */
816 unsigned char *msgtype; 828 unsigned char *msgtype;
817 /** 829 /**
818 * Which character of message should be checked as subtype. Zero to 830 * Which character of message should be checked as subtype. Zero to
819 * disable subtype checking. 831 * disable subtype checking.
820 */ 832 */
821 int subtypechar; 833 int subtypechar;
822 /** 834 /**
823 * Subtype to be checked. 835 * Subtype to be checked.
824 */ 836 */
825 unsigned char subtype; 837 unsigned char subtype;
826 /** 838 /**
827 * Phone request when this can be called, use ID_IncomingFrame when 839 * Phone request when this can be called, use ID_IncomingFrame when
828 * you want to use this in any state. 840 * you want to use this in any state.
829 */ 841 */
830 GSM_Phone_RequestIDrequestID; 842 GSM_Phone_RequestIDrequestID;
831} GSM_Reply_Function; 843};
832 844
833/** 845/**
834 * Structure defining phone functions. 846 * Structure defining phone functions.
835 */ 847 */
836typedef struct { 848typedef struct {
837 /** 849 /**
838 * Names of supported models separated by |. Must contain at least one 850 * Names of supported models separated by |. Must contain at least one
839 * name. 851 * name.
840 */ 852 */
841 char *models; 853 char *models;
842 /** 854 /**
843 * Array of reply functions for the phone, see 855 * Array of reply functions for the phone, see
844 * @ref GSM_Reply_Function for details about it. 856 * @ref GSM_Reply_Function for details about it.
845 */ 857 */
846 GSM_Reply_Function *ReplyFunctions; 858 GSM_Reply_Function *ReplyFunctions;
847 /** 859 /**
848 * Initializes phone. 860 * Initializes phone.
849 */ 861 */
850 GSM_Error (*Initialise) (GSM_StateMachine *s); 862 GSM_Error (*Initialise) (GSM_StateMachine *s);
851 /** 863 /**
852 * Terminates phone communication. 864 * Terminates phone communication.
853 */ 865 */
854 GSM_Error (*Terminate) (GSM_StateMachine *s); 866 GSM_Error (*Terminate) (GSM_StateMachine *s);
855 /** 867 /**
856 * Dispatches messages from phone, at the end it should call 868 * Dispatches messages from phone, at the end it should call
857 * @ref GSM_DispatchMessage. 869 * @ref GSM_DispatchMessage.
858 */ 870 */
859 GSM_Error (*DispatchMessage) (GSM_StateMachine *s); 871 GSM_Error (*DispatchMessage) (GSM_StateMachine *s);
860 /** 872 /**
861 * Enables showing information on phone display. 873 * Enables showing information on phone display.
862 */ 874 */
863 GSM_Error (*ShowStartInfo) (GSM_StateMachine *s, bool enable); 875 GSM_Error (*ShowStartInfo) (GSM_StateMachine *s, bool enable);
864 /** 876 /**
865 * Reads manufacturer from phone. 877 * Reads manufacturer from phone.
866 */ 878 */
867 GSM_Error (*GetManufacturer) (GSM_StateMachine *s); 879 GSM_Error (*GetManufacturer) (GSM_StateMachine *s);
868 /** 880 /**
869 * Reads model from phone. 881 * Reads model from phone.
870 */ 882 */
871 GSM_Error (*GetModel) (GSM_StateMachine *s); 883 GSM_Error (*GetModel) (GSM_StateMachine *s);
872 /** 884 /**
873 * Reads firmware information from phone. 885 * Reads firmware information from phone.
874 */ 886 */
875 GSM_Error (*GetFirmware)(GSM_StateMachine *s); 887 GSM_Error (*GetFirmware)(GSM_StateMachine *s);
876 /** 888 /**
877 * Reads IMEI/serial number from phone. 889 * Reads IMEI/serial number from phone.
878 */ 890 */
879 GSM_Error (*GetIMEI) (GSM_StateMachine *s); 891 GSM_Error (*GetIMEI) (GSM_StateMachine *s);
@@ -1014,96 +1026,97 @@ typedef struct {
1014 */ 1026 */
1015 GSM_Error (*GetSpeedDial) (GSM_StateMachine *s, GSM_SpeedDial *Speed); 1027 GSM_Error (*GetSpeedDial) (GSM_StateMachine *s, GSM_SpeedDial *Speed);
1016 /** 1028 /**
1017 * Sets speed dial. 1029 * Sets speed dial.
1018 */ 1030 */
1019 GSM_Error (*SetSpeedDial) (GSM_StateMachine *s, GSM_SpeedDial *Speed); 1031 GSM_Error (*SetSpeedDial) (GSM_StateMachine *s, GSM_SpeedDial *Speed);
1020 /** 1032 /**
1021 * Gets SMS Service Center number and SMS settings. 1033 * Gets SMS Service Center number and SMS settings.
1022 */ 1034 */
1023 GSM_Error (*GetSMSC) (GSM_StateMachine *s, GSM_SMSC *smsc); 1035 GSM_Error (*GetSMSC) (GSM_StateMachine *s, GSM_SMSC *smsc);
1024 /** 1036 /**
1025 * Sets SMS Service Center number and SMS settings. 1037 * Sets SMS Service Center number and SMS settings.
1026 */ 1038 */
1027 GSM_Error (*SetSMSC) (GSM_StateMachine *s, GSM_SMSC *smsc); 1039 GSM_Error (*SetSMSC) (GSM_StateMachine *s, GSM_SMSC *smsc);
1028 /** 1040 /**
1029 * Gets information about SMS memory (read/unread/size of memory for 1041 * Gets information about SMS memory (read/unread/size of memory for
1030 * both SIM and phone). 1042 * both SIM and phone).
1031 */ 1043 */
1032 GSM_Error (*GetSMSStatus) (GSM_StateMachine *s, GSM_SMSMemoryStatus *status); 1044 GSM_Error (*GetSMSStatus) (GSM_StateMachine *s, GSM_SMSMemoryStatus *status);
1033 /** 1045 /**
1034 * Reads SMS message. 1046 * Reads SMS message.
1035 */ 1047 */
1036 GSM_Error (*GetSMS) (GSM_StateMachine *s, GSM_MultiSMSMessage *sms); 1048 GSM_Error (*GetSMS) (GSM_StateMachine *s, GSM_MultiSMSMessage *sms);
1037 /** 1049 /**
1038 * Reads next (or first if start set) SMS message. This might be 1050 * Reads next (or first if start set) SMS message. This might be
1039 * faster for some phones than using @ref GetSMS for each message. 1051 * faster for some phones than using @ref GetSMS for each message.
1040 */ 1052 */
1041 GSM_Error (*GetNextSMS) (GSM_StateMachine *s, GSM_MultiSMSMessage *sms, bool start); 1053 GSM_Error (*GetNextSMS) (GSM_StateMachine *s, GSM_MultiSMSMessage *sms, bool start);
1042 /** 1054 /**
1043 * Sets SMS. 1055 * Sets SMS.
1044 */ 1056 */
1045 GSM_Error (*SetSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms); 1057 GSM_Error (*SetSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
1046 /** 1058 /**
1047 * Adds SMS to specified folder. 1059 * Adds SMS to specified folder.
1048 */ 1060 */
1049 GSM_Error (*AddSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms); 1061 GSM_Error (*AddSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
1050 /** 1062 /**
1051 * Deletes SMS. 1063 * Deletes SMS.
1052 */ 1064 */
1053 GSM_Error (*DeleteSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms); 1065 GSM_Error (*DeleteSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
1054 /** 1066 /**
1055 * Sends SMS. 1067 * Sends SMS.
1056 */ 1068 */
1057 GSM_Error (*SendSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms); 1069 GSM_Error (*SendSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
1058 /** 1070 /**
1059 * Sends SMS already saved in phone. 1071 * Sends SMS already saved in phone.
1060 */ 1072 */
1061 GSM_Error (*SendSavedSMS)(GSM_StateMachine *s, int Folder, int Location); 1073 GSM_Error (*SendSavedSMS)(GSM_StateMachine *s, int Folder, int Location);
1074 GSM_Error (*SetFastSMSSending) (GSM_StateMachine *s, bool enable);
1062 /** 1075 /**
1063 * Enable/disable notification on incoming SMS. 1076 * Enable/disable notification on incoming SMS.
1064 */ 1077 */
1065 GSM_Error (*SetIncomingSMS) (GSM_StateMachine *s, bool enable); 1078 GSM_Error (*SetIncomingSMS) (GSM_StateMachine *s, bool enable);
1066 /** 1079 /**
1067 * Gets network information from phone. 1080 * Gets network information from phone.
1068 */ 1081 */
1069 GSM_Error (*SetIncomingCB) (GSM_StateMachine *s, bool enable); 1082 GSM_Error (*SetIncomingCB) (GSM_StateMachine *s, bool enable);
1070 /** 1083 /**
1071 * Returns SMS folders information. 1084 * Returns SMS folders information.
1072 */ 1085 */
1073 GSM_Error (*GetSMSFolders) (GSM_StateMachine *s, GSM_SMSFolders *folders); 1086 GSM_Error (*GetSMSFolders) (GSM_StateMachine *s, GSM_SMSFolders *folders);
1074 /** 1087 /**
1075 * Creates SMS folder. 1088 * Creates SMS folder.
1076 */ 1089 */
1077 GSM_Error (*AddSMSFolder) (GSM_StateMachine *s, unsigned char *name); 1090 GSM_Error (*AddSMSFolder) (GSM_StateMachine *s, unsigned char *name);
1078 /** 1091 /**
1079 * Deletes SMS folder. 1092 * Deletes SMS folder.
1080 */ 1093 */
1081 GSM_Error (*DeleteSMSFolder) (GSM_StateMachine *s, int ID); 1094 GSM_Error (*DeleteSMSFolder) (GSM_StateMachine *s, int ID);
1082 /** 1095 /**
1083 * Dials number and starts voice call. 1096 * Dials number and starts voice call.
1084 */ 1097 */
1085 GSM_Error (*DialVoice) (GSM_StateMachine *s, char *Number, GSM_CallShowNumber ShowNumber); 1098 GSM_Error (*DialVoice) (GSM_StateMachine *s, char *Number, GSM_CallShowNumber ShowNumber);
1086 /** 1099 /**
1087 * Accept current incoming call. 1100 * Accept current incoming call.
1088 */ 1101 */
1089 GSM_Error (*AnswerCall) (GSM_StateMachine *s, int ID, bool all); 1102 GSM_Error (*AnswerCall) (GSM_StateMachine *s, int ID, bool all);
1090 /** 1103 /**
1091 * Deny current incoming call. 1104 * Deny current incoming call.
1092 */ 1105 */
1093 GSM_Error (*CancelCall) (GSM_StateMachine *s, int ID, bool all); 1106 GSM_Error (*CancelCall) (GSM_StateMachine *s, int ID, bool all);
1094 /** 1107 /**
1095 * Holds call. 1108 * Holds call.
1096 */ 1109 */
1097 GSM_Error (*HoldCall) (GSM_StateMachine *s, int ID); 1110 GSM_Error (*HoldCall) (GSM_StateMachine *s, int ID);
1098 /** 1111 /**
1099 * Unholds call. 1112 * Unholds call.
1100 */ 1113 */
1101 GSM_Error (*UnholdCall) (GSM_StateMachine *s, int ID); 1114 GSM_Error (*UnholdCall) (GSM_StateMachine *s, int ID);
1102 /** 1115 /**
1103 * Initiates conference call. 1116 * Initiates conference call.
1104 */ 1117 */
1105 GSM_Error (*ConferenceCall) (GSM_StateMachine *s, int ID); 1118 GSM_Error (*ConferenceCall) (GSM_StateMachine *s, int ID);
1106 /** 1119 /**
1107 * Splits call. 1120 * Splits call.
1108 */ 1121 */
1109 GSM_Error (*SplitCall) (GSM_StateMachine *s, int ID); 1122 GSM_Error (*SplitCall) (GSM_StateMachine *s, int ID);
@@ -1234,161 +1247,164 @@ typedef struct {
1234 /** 1247 /**
1235 * Deletes ToDo entry in phone. 1248 * Deletes ToDo entry in phone.
1236 */ 1249 */
1237 GSM_Error (*DeleteToDo) (GSM_StateMachine *s, GSM_ToDoEntry *ToDo); 1250 GSM_Error (*DeleteToDo) (GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
1238 /** 1251 /**
1239 * Deletes all todo entries in phone. 1252 * Deletes all todo entries in phone.
1240 */ 1253 */
1241 GSM_Error (*DeleteAllToDo) (GSM_StateMachine *s); 1254 GSM_Error (*DeleteAllToDo) (GSM_StateMachine *s);
1242 /** 1255 /**
1243 * Retrieves calendar status (number of used entries). 1256 * Retrieves calendar status (number of used entries).
1244 */ 1257 */
1245 GSM_Error (*GetCalendarStatus) (GSM_StateMachine *s, GSM_CalendarStatus *Status); 1258 GSM_Error (*GetCalendarStatus) (GSM_StateMachine *s, GSM_CalendarStatus *Status);
1246 /** 1259 /**
1247 * Retrieves calendar entry. 1260 * Retrieves calendar entry.
1248 */ 1261 */
1249 GSM_Error (*GetCalendar)(GSM_StateMachine *s, GSM_CalendarEntry *Note); 1262 GSM_Error (*GetCalendar)(GSM_StateMachine *s, GSM_CalendarEntry *Note);
1250 /** 1263 /**
1251 * Retrieves calendar entry. This is useful for continuous reading of all 1264 * Retrieves calendar entry. This is useful for continuous reading of all
1252 * calendar entries. 1265 * calendar entries.
1253 */ 1266 */
1254 GSM_Error (*GetNextCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start); 1267 GSM_Error (*GetNextCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start);
1255 /** 1268 /**
1256 * Sets calendar entry 1269 * Sets calendar entry
1257 */ 1270 */
1258 GSM_Error (*SetCalendar)(GSM_StateMachine *s, GSM_CalendarEntry *Note); 1271 GSM_Error (*SetCalendar)(GSM_StateMachine *s, GSM_CalendarEntry *Note);
1259 /** 1272 /**
1260 * Adds calendar entry. 1273 * Adds calendar entry.
1261 */ 1274 */
1262 GSM_Error (*AddCalendar)(GSM_StateMachine *s, GSM_CalendarEntry *Note); 1275 GSM_Error (*AddCalendar)(GSM_StateMachine *s, GSM_CalendarEntry *Note);
1263 /** 1276 /**
1264 * Deletes calendar entry. 1277 * Deletes calendar entry.
1265 */ 1278 */
1266 GSM_Error (*DeleteCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note); 1279 GSM_Error (*DeleteCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note);
1267 /** 1280 /**
1268 * Deletes all calendar entries. 1281 * Deletes all calendar entries.
1269 */ 1282 */
1270 GSM_Error (*DeleteAllCalendar) (GSM_StateMachine *s); 1283 GSM_Error (*DeleteAllCalendar) (GSM_StateMachine *s);
1271 /** 1284 /**
1272 * Reads calendar settings. 1285 * Reads calendar settings.
1273 */ 1286 */
1274 GSM_Error (*GetCalendarSettings)(GSM_StateMachine *s, GSM_CalendarSettings *settings); 1287 GSM_Error (*GetCalendarSettings)(GSM_StateMachine *s, GSM_CalendarSettings *settings);
1275 /** 1288 /**
1276 * Sets calendar settings. 1289 * Sets calendar settings.
1277 */ 1290 */
1278 GSM_Error (*SetCalendarSettings)(GSM_StateMachine *s, GSM_CalendarSettings *settings); 1291 GSM_Error (*SetCalendarSettings)(GSM_StateMachine *s, GSM_CalendarSettings *settings);
1279 /** 1292 /**
1280 * Gets note. 1293 * Gets note.
1281 */ 1294 */
1282 GSM_Error (*GetNote) (GSM_StateMachine *s, GSM_NoteEntry *Note, bool refresh); 1295 GSM_Error (*GetNextNote)(GSM_StateMachine *s, GSM_NoteEntry *Note, bool refresh);
1283 /** 1296 /**
1284 * Reads profile. 1297 * Reads profile.
1285 */ 1298 */
1286 GSM_Error (*GetProfile) (GSM_StateMachine *s, GSM_Profile *Profile); 1299 GSM_Error (*GetProfile) (GSM_StateMachine *s, GSM_Profile *Profile);
1287 /** 1300 /**
1288 * Updates profile. 1301 * Updates profile.
1289 */ 1302 */
1290 GSM_Error (*SetProfile) (GSM_StateMachine *s, GSM_Profile *Profile); 1303 GSM_Error (*SetProfile) (GSM_StateMachine *s, GSM_Profile *Profile);
1291 /** 1304 /**
1292 * Reads FM station. 1305 * Reads FM station.
1293 */ 1306 */
1294 GSM_Error (*GetFMStation) (GSM_StateMachine *s, GSM_FMStation *FMStation); 1307 GSM_Error (*GetFMStation) (GSM_StateMachine *s, GSM_FMStation *FMStation);
1295 /** 1308 /**
1296 * Sets FM station. 1309 * Sets FM station.
1297 */ 1310 */
1298 GSM_Error (*SetFMStation) (GSM_StateMachine *s, GSM_FMStation *FMStation); 1311 GSM_Error (*SetFMStation) (GSM_StateMachine *s, GSM_FMStation *FMStation);
1299 /** 1312 /**
1300 * Clears defined FM stations. 1313 * Clears defined FM stations.
1301 */ 1314 */
1302 GSM_Error (*ClearFMStations) (GSM_StateMachine *s); 1315 GSM_Error (*ClearFMStations) (GSM_StateMachine *s);
1303 /** 1316 /**
1304 * Gets next filename from filesystem. 1317 * Gets next filename from filesystem.
1305 */ 1318 */
1306 GSM_Error (*GetNextFileFolder) (GSM_StateMachine *s, GSM_File *File, bool start); 1319 GSM_Error (*GetNextFileFolder) (GSM_StateMachine *s, GSM_File *File, bool start);
1307 /** 1320 /**
1308 * Gets file part from filesystem. 1321 * Gets file part from filesystem.
1309 */ 1322 */
1310 GSM_Error (*GetFilePart)(GSM_StateMachine *s, GSM_File *File); 1323 GSM_Error (*GetFilePart)(GSM_StateMachine *s, GSM_File *File);
1311 /** 1324 /**
1312 * Adds file part to filesystem. 1325 * Adds file part to filesystem.
1313 */ 1326 */
1314 GSM_Error (*AddFilePart)(GSM_StateMachine *s, GSM_File *File, int *Pos); 1327 GSM_Error (*AddFilePart)(GSM_StateMachine *s, GSM_File *File, int *Pos);
1315 /** 1328 /**
1316 * Acquires filesystem status. 1329 * Acquires filesystem status.
1317 */ 1330 */
1318 GSM_Error (*GetFileSystemStatus)(GSM_StateMachine *s, GSM_FileSystemStatus *Status); 1331 GSM_Error (*GetFileSystemStatus)(GSM_StateMachine *s, GSM_FileSystemStatus *Status);
1319 /** 1332 /**
1320 * Deletes file from filessytem. 1333 * Deletes file from filessytem.
1321 */ 1334 */
1322 GSM_Error (*DeleteFile) (GSM_StateMachine *s, unsigned char *ID); 1335 GSM_Error (*DeleteFile) (GSM_StateMachine *s, unsigned char *ID);
1323 /** 1336 /**
1324 * Adds folder to filesystem. 1337 * Adds folder to filesystem.
1325 */ 1338 */
1326 GSM_Error (*AddFolder) (GSM_StateMachine *s, GSM_File *File); 1339 GSM_Error (*AddFolder) (GSM_StateMachine *s, GSM_File *File);
1327 /** 1340 /**
1328 * Gets GPRS access point. 1341 * Gets GPRS access point.
1329 */ 1342 */
1330 GSM_Error (*GetGPRSAccessPoint) (GSM_StateMachine *s, GSM_GPRSAccessPoint *point); 1343 GSM_Error (*GetGPRSAccessPoint) (GSM_StateMachine *s, GSM_GPRSAccessPoint *point);
1331 /** 1344 /**
1332 * Sets GPRS access point. 1345 * Sets GPRS access point.
1333 */ 1346 */
1334 GSM_Error (*SetGPRSAccessPoint) (GSM_StateMachine *s, GSM_GPRSAccessPoint *point); 1347 GSM_Error (*SetGPRSAccessPoint) (GSM_StateMachine *s, GSM_GPRSAccessPoint *point);
1335} GSM_Phone_Functions; 1348} GSM_Phone_Functions;
1336 1349
1337 extern GSM_Phone_Functions NAUTOPhone; 1350 extern GSM_Phone_Functions NAUTOPhone;
1338#ifdef GSM_ENABLE_NOKIA3320 1351#ifdef GSM_ENABLE_NOKIA3320
1339 extern GSM_Phone_Functions N3320Phone; 1352 extern GSM_Phone_Functions N3320Phone;
1340#endif 1353#endif
1341#ifdef GSM_ENABLE_NOKIA3650 1354#ifdef GSM_ENABLE_NOKIA3650
1342 extern GSM_Phone_Functions N3650Phone; 1355 extern GSM_Phone_Functions N3650Phone;
1343#endif 1356#endif
1344#ifdef GSM_ENABLE_NOKIA6110 1357#ifdef GSM_ENABLE_NOKIA6110
1345 extern GSM_Phone_Functions N6110Phone; 1358 extern GSM_Phone_Functions N6110Phone;
1346#endif 1359#endif
1360#ifdef GSM_ENABLE_NOKIA650
1361 extern GSM_Phone_Functions N650Phone;
1362#endif
1347#ifdef GSM_ENABLE_NOKIA6510 1363#ifdef GSM_ENABLE_NOKIA6510
1348 extern GSM_Phone_Functions N6510Phone; 1364 extern GSM_Phone_Functions N6510Phone;
1349#endif 1365#endif
1350#ifdef GSM_ENABLE_NOKIA7110 1366#ifdef GSM_ENABLE_NOKIA7110
1351 extern GSM_Phone_Functions N7110Phone; 1367 extern GSM_Phone_Functions N7110Phone;
1352#endif 1368#endif
1353#ifdef GSM_ENABLE_NOKIA9210 1369#ifdef GSM_ENABLE_NOKIA9210
1354 extern GSM_Phone_Functions N9210Phone; 1370 extern GSM_Phone_Functions N9210Phone;
1355#endif 1371#endif
1356#ifdef GSM_ENABLE_ATGEN 1372#ifdef GSM_ENABLE_ATGEN
1357 extern GSM_Phone_Functions ATGENPhone; 1373 extern GSM_Phone_Functions ATGENPhone;
1358#endif 1374#endif
1359#ifdef GSM_ENABLE_ALCATEL 1375#ifdef GSM_ENABLE_ALCATEL
1360 extern GSM_Phone_Functions ALCATELPhone; 1376 extern GSM_Phone_Functions ALCATELPhone;
1361#endif 1377#endif
1362#ifdef GSM_ENABLE_OBEXGEN 1378#ifdef GSM_ENABLE_OBEXGEN
1363 extern GSM_Phone_Functions OBEXGENPhone; 1379 extern GSM_Phone_Functions OBEXGENPhone;
1364#endif 1380#endif
1365#ifdef GSM_ENABLE_MROUTERGEN 1381#ifdef GSM_ENABLE_MROUTERGEN
1366 extern GSM_Phone_Functions MROUTERGENPhone; 1382 extern GSM_Phone_Functions MROUTERGENPhone;
1367#endif 1383#endif
1368 1384
1369typedef struct { 1385typedef struct {
1370 GSM_Phone_Data Data; 1386 GSM_Phone_Data Data;
1371 GSM_Phone_Functions*Functions; 1387 GSM_Phone_Functions*Functions;
1372} GSM_Phone; 1388} GSM_Phone;
1373 1389
1374/* --------------------------- User layer ---------------------------------- */ 1390/* --------------------------- User layer ---------------------------------- */
1375 1391
1376struct _GSM_User { 1392struct _GSM_User {
1377 GSM_Reply_Function *UserReplyFunctions; 1393 GSM_Reply_Function *UserReplyFunctions;
1378 1394
1379 void (*IncomingCall) (char *Device, GSM_Call call); 1395 void (*IncomingCall) (char *Device, GSM_Call call);
1380 void (*IncomingSMS)(char *Device, GSM_SMSMessage sms); 1396 void (*IncomingSMS)(char *Device, GSM_SMSMessage sms);
1381 void (*IncomingCB) (char *Device, GSM_CBMessage cb); 1397 void (*IncomingCB) (char *Device, GSM_CBMessage cb);
1382 void (*IncomingUSSD) (char *Device, char *Text); 1398 void (*IncomingUSSD) (char *Device, char *Text);
1383 void (*SendSMSStatus) (char *Device, int status, int MessageReference); 1399 void (*SendSMSStatus) (char *Device, int status, int MessageReference);
1384}; 1400};
1385 1401
1386/* --------------------------- Statemachine layer -------------------------- */ 1402/* --------------------------- Statemachine layer -------------------------- */
1387 1403
1388typedef enum { 1404typedef enum {
1389 GCT_MBUS2=1, 1405 GCT_MBUS2=1,
1390 GCT_FBUS2, 1406 GCT_FBUS2,
1391 GCT_FBUS2DLR3, 1407 GCT_FBUS2DLR3,
1392 GCT_FBUS2DKU5, 1408 GCT_FBUS2DKU5,
1393 GCT_FBUS2PL2303, 1409 GCT_FBUS2PL2303,
1394 GCT_FBUS2BLUE, 1410 GCT_FBUS2BLUE,
@@ -1478,85 +1494,86 @@ void GSM_DumpMessageLevel3 (GSM_StateMachine *s, unsigned char *message, int
1478 1494
1479typedef enum { 1495typedef enum {
1480 /* n6110.c */ 1496 /* n6110.c */
1481 F_CAL33 = 1, /* Calendar,3310 style - 10 reminders, Unicode, 3 coding types*/ 1497 F_CAL33 = 1, /* Calendar,3310 style - 10 reminders, Unicode, 3 coding types*/
1482 F_CAL52, /* Calendar,5210 style - full Unicode, etc. */ 1498 F_CAL52, /* Calendar,5210 style - full Unicode, etc. */
1483 F_CAL82, /* Calendar,8250 style - "normal", but with Unicode */ 1499 F_CAL82, /* Calendar,8250 style - "normal", but with Unicode */
1484 F_RING_SM, /* Ringtones returned in SM format - 33xx */ 1500 F_RING_SM, /* Ringtones returned in SM format - 33xx */
1485 F_NORING, /* No ringtones */ 1501 F_NORING, /* No ringtones */
1486 F_NOPBKUNICODE, /* No phonebook in Unicode */ 1502 F_NOPBKUNICODE, /* No phonebook in Unicode */
1487 F_NOWAP, /* No WAP */ 1503 F_NOWAP, /* No WAP */
1488 F_NOCALLER, /* No caller groups */ 1504 F_NOCALLER, /* No caller groups */
1489 F_NOPICTURE, /* No Picture Images */ 1505 F_NOPICTURE, /* No Picture Images */
1490 F_NOPICTUREUNI, /* No Picture Images text in Unicode */ 1506 F_NOPICTUREUNI, /* No Picture Images text in Unicode */
1491 F_NOSTARTUP, /* No startup logo */ 1507 F_NOSTARTUP, /* No startup logo */
1492 F_NOCALENDAR, /* No calendar */ 1508 F_NOCALENDAR, /* No calendar */
1493 F_NOSTARTANI, /* Startup logo is not animated */ 1509 F_NOSTARTANI, /* Startup logo is not animated */
1494 F_POWER_BATT, /* Network and battery level get from netmonitor */ 1510 F_POWER_BATT, /* Network and battery level get from netmonitor */
1495 F_PROFILES33, /* Phone profiles in 3310 style */ 1511 F_PROFILES33, /* Phone profiles in 3310 style */
1496 F_PROFILES51, /* Phone profiles in 5110 style */ 1512 F_PROFILES51, /* Phone profiles in 5110 style */
1497 F_MAGICBYTES, /* Phone can make authentication with magic bytes */ 1513 F_MAGICBYTES, /* Phone can make authentication with magic bytes */
1498 F_NODTMF, /* Phone can't send DTMF */ 1514 F_NODTMF, /* Phone can't send DTMF */
1499 F_DISPSTATUS, /* Phone return display status */ 1515 F_DISPSTATUS, /* Phone return display status */
1500 F_NOCALLINFO, 1516 F_NOCALLINFO,
1501 1517
1502 /* n3320.c */ 1518 /* n3320.c */
1503 F_DAYMONTH, /* Day and month reversed in pbk, when compare to GSM models*/ 1519 F_DAYMONTH, /* Day and month reversed in pbk, when compare to GSM models*/
1504 1520
1505 /* n6510.c */ 1521 /* n6510.c */
1506 F_PBK35, /* Phonebook in 3510 style with ringtones ID */ 1522 F_PBK35, /* Phonebook in 3510 style with ringtones ID */
1507 F_PBKIMG, /* Phonebook in 7250 style with picture ID */ 1523 F_PBKIMG, /* Phonebook in 7250 style with picture ID */
1508 F_PBKTONEGAL,/* Phonebook with selecting ringtones from gallery */ 1524 F_PBKTONEGAL,/* Phonebook with selecting ringtones from gallery */
1509 F_PBKSMSLIST, /* Phonebook with SMS list */ 1525 F_PBKSMSLIST, /* Phonebook with SMS list */
1510 F_PBKUSER, /* Phonebook with user ID */ 1526 F_PBKUSER, /* Phonebook with user ID */
1511 F_RADIO, /* Phone with FM radio */ 1527 F_RADIO, /* Phone with FM radio */
1512 F_TODO63, /* ToDo in 6310 style - 0x55 msg type */ 1528 F_TODO63, /* ToDo in 6310 style - 0x55 msg type */
1513 F_TODO66, /* ToDo in 6610 style - like calendar, with date and other*/ 1529 F_TODO66, /* ToDo in 6610 style - like calendar, with date and other*/
1514 F_NOMIDI, /* No ringtones in MIDI */ 1530 F_NOMIDI, /* No ringtones in MIDI */
1515 F_BLUETOOTH, /* Bluetooth support */ 1531 F_BLUETOOTH, /* Bluetooth support */
1516 F_NOFILESYSTEM, /* No images, ringtones, java saved in special filesystem*/ 1532 F_NOFILESYSTEM, /* No images, ringtones, java saved in special filesystem*/
1517 F_NOMMS, /* No MMS sets in phone */ 1533 F_NOMMS, /* No MMS sets in phone */
1518 F_NOGPRSPOINT, /* GPRS point are not useable */ 1534 F_NOGPRSPOINT, /* GPRS point are not useable */
1519 F_CAL35, /* Calendar,3510 style - Reminder,Call,Birthday */ 1535 F_CAL35, /* Calendar,3510 style - Reminder,Call,Birthday */
1520 F_CAL65, /* Calendar,6510 style - CBMM, method 3 */ 1536 F_CAL65, /* Calendar,6510 style - CBMM, method 3 */
1521 F_WAPMMSPROXY, /* WAP & MMS settings contains first & second proxy */ 1537 F_WAPMMSPROXY, /* WAP & MMS settings contains first & second proxy */
1522 1538
1523 /* n6510.c && n7110.c */ 1539 /* n6510.c && n7110.c */
1524 F_VOICETAGS, /* Voice tags available */ 1540 F_VOICETAGS, /* Voice tags available */
1525 F_CAL62, /* Calendar,6210 style - Call,Birthday,Memo,Meeting */ 1541 F_CAL62, /* Calendar,6210 style - Call,Birthday,Memo,Meeting */
1542 F_NOTES,
1526 1543
1527 /* AT modules */ 1544 /* AT modules */
1528 F_SMSONLYSENT, /* Phone supports only sent/unsent messages */ 1545 F_SMSONLYSENT, /* Phone supports only sent/unsent messages */
1529 F_BROKENCPBS, /* CPBS on some memories can hang phone */ 1546 F_BROKENCPBS, /* CPBS on some memories can hang phone */
1530 F_M20SMS, /* Siemens M20 like SMS handling */ 1547 F_M20SMS, /* Siemens M20 like SMS handling */
1531 F_SLOWWRITE, /* Use slower writing which some phone need */ 1548 F_SLOWWRITE, /* Use slower writing which some phone need */
1532 F_SMSME900, /* SMS in ME start from location 900 - case of Sagem */ 1549 F_SMSME900, /* SMS in ME start from location 900 - case of Sagem */
1533 F_ALCATEL /* Phone supports Alcatel protocol */ 1550 F_ALCATEL /* Phone supports Alcatel protocol */
1534} Feature; 1551} Feature;
1535 1552
1536/* For models table */ 1553/* For models table */
1537struct _OnePhoneModel { 1554struct _OnePhoneModel {
1538 char *model; 1555 char *model;
1539 char *number; 1556 char *number;
1540 char *irdamodel; 1557 char *irdamodel;
1541 Feature features[12]; 1558 Feature features[12];
1542}; 1559};
1543 1560
1544 bool IsPhoneFeatureAvailable(OnePhoneModel *model, Feature feature); 1561 bool IsPhoneFeatureAvailable(OnePhoneModel *model, Feature feature);
1545 OnePhoneModel *GetModelData (char *model, char *number, char *irdamodel); 1562 OnePhoneModel *GetModelData (char *model, char *number, char *irdamodel);
1546 1563
1547#ifdef __GNUC__ 1564#ifdef __GNUC__
1548__attribute__((format(printf, 2, 3))) 1565__attribute__((format(printf, 2, 3)))
1549#endif 1566#endif
1550int smprintf(GSM_StateMachine *s, const char *format, ...); 1567int smprintf(GSM_StateMachine *s, const char *format, ...);
1551 1568
1552void GSM_OSErrorInfo(GSM_StateMachine *s, char *description); 1569void GSM_OSErrorInfo(GSM_StateMachine *s, char *description);
1553 1570
1554#ifdef GSM_ENABLE_BACKUP 1571#ifdef GSM_ENABLE_BACKUP
1555void GSM_GetPhoneFeaturesForBackup(GSM_StateMachine *s, GSM_Backup_Info *info); 1572void GSM_GetPhoneFeaturesForBackup(GSM_StateMachine *s, GSM_Backup_Info *info);
1556#endif 1573#endif
1557 1574
1558#endif 1575#endif
1559 1576
1560/* How should editor hadle tabs in this file? Add editor commands here. 1577/* How should editor hadle tabs in this file? Add editor commands here.
1561 * vim: noexpandtab sw=8 ts=8 sts=8: 1578 * vim: noexpandtab sw=8 ts=8 sts=8:
1562 */ 1579 */
diff --git a/gammu/emb/common/misc/coding/coding.c b/gammu/emb/common/misc/coding/coding.c
index 62543ac..b30b645 100644
--- a/gammu/emb/common/misc/coding/coding.c
+++ b/gammu/emb/common/misc/coding/coding.c
@@ -1,66 +1,219 @@
1/* (c) 2002-2004 by Marcin Wiacek, Michal Cihar and others */ 1/* (c) 2002-2004 by Marcin Wiacek, Michal Cihar and others */
2/* based on some work from MyGnokii and Gnokii */ 2/* based on some work from MyGnokii (www.mwiacek.com) */
3/* based on some work from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
6 */
3 7
4#include <stdio.h> 8#include <stdio.h>
5#include <stdlib.h> 9#include <stdlib.h>
6#include <string.h> 10#include <string.h>
7#include <ctype.h> 11#include <ctype.h>
8#include <locale.h> 12#include <locale.h>
9#ifndef __OpenBSD__ 13#ifndef __OpenBSD__
10# include <wctype.h> 14# include <wctype.h>
11#endif 15#endif
12#ifdef WIN32 16#ifdef WIN32
13# include "windows.h" 17# include "windows.h"
14#endif 18#endif
15 19
16#include "../misc.h" 20#include "../misc.h"
17#include "coding.h" 21#include "coding.h"
18 22
23/* function changes #10 #13 chars to \n \r */
24char *EncodeUnicodeSpecialChars(unsigned char *buffer)
25{
26 int Pos=0, Pos2=0;
27 static unsigned charBuf[20000];
28
29 while (buffer[Pos*2]!=0x00 || buffer[Pos*2+1]!=0x00) {
30 if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 10) {
31 Buf[Pos2*2] = 0x00;
32 Buf[Pos2*2+1] = '\\';
33 Pos2++;
34 Buf[Pos2*2] = 0x00;
35 Buf[Pos2*2+1] = 'n';
36 Pos2++;
37 } else if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 13) {
38 Buf[Pos2*2] = 0x00;
39 Buf[Pos2*2+1] = '\\';
40 Pos2++;
41 Buf[Pos2*2] = 0x00;
42 Buf[Pos2*2+1] = 'r';
43 Pos2++;
44 } else if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == '\\') {
45 Buf[Pos2*2] = 0x00;
46 Buf[Pos2*2+1] = '\\';
47 Pos2++;
48 Buf[Pos2*2] = 0x00;
49 Buf[Pos2*2+1] = '\\';
50 Pos2++;
51 } else {
52 Buf[Pos2*2] = buffer[Pos*2];
53 Buf[Pos2*2+1] = buffer[Pos*2+1];
54 Pos2++;
55 }
56 Pos++;
57 }
58 Buf[Pos2*2] = 0;
59 Buf[Pos2*2+1] = 0;
60 return Buf;
61}
62
63/* function changes #10 #13 chars to \n \r */
64char *EncodeSpecialChars(unsigned char *buffer)
65{
66 int Pos=0, Pos2=0;
67 static unsigned charBuf[10000];
68
69 while (buffer[Pos]!=0x00) {
70 switch (buffer[Pos]) {
71 case 10:
72 Buf[Pos2++] = '\\';
73 Buf[Pos2++] = 'n';
74 break;
75 case 13:
76 Buf[Pos2++] = '\\';
77 Buf[Pos2++] = 'r';
78 break;
79 case '\\':
80 Buf[Pos2++] = '\\';
81 Buf[Pos2++] = '\\';
82 break;
83 default:
84 Buf[Pos2++] = buffer[Pos];
85 }
86 Pos++;
87 }
88 Buf[Pos2] = 0;
89 return Buf;
90}
91
92char *DecodeUnicodeSpecialChars(unsigned char *buffer)
93{
94 int Pos=0, Pos2=0, level=0;
95 static unsigned charBuf[10000];
96
97 while (buffer[Pos*2]!=0x00 || buffer[Pos*2+1]!=0x00) {
98 Buf[Pos2*2] = buffer[Pos*2];
99 Buf[Pos2*2+1] = buffer[Pos*2+1];
100 switch (level) {
101 case 0:
102 if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == '\\') {
103 level = 1;
104 } else {
105 Pos2++;
106 }
107 break;
108 case 1:
109 if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 'n') {
110 Buf[Pos2*2] = 0;
111 Buf[Pos2*2+1] = 10;
112 }
113 if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 'r') {
114 Buf[Pos2*2] = 0;
115 Buf[Pos2*2+1] = 13;
116 }
117 if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == '\\') {
118 Buf[Pos2*2] = 0;
119 Buf[Pos2*2+1] = '\\';
120 }
121 Pos2++;
122 level = 0;
123 }
124 Pos++;
125 }
126 Buf[Pos2*2] = 0;
127 Buf[Pos2*2+1] = 0;
128 return Buf;
129}
130
131char *DecodeSpecialChars(unsigned char *buffer)
132{
133 int Pos=0, Pos2=0, level=0;
134 static unsigned charBuf[10000];
135
136 while (buffer[Pos]!=0x00) {
137 Buf[Pos2] = buffer[Pos];
138 switch (level) {
139 case 0:
140 if (buffer[Pos] == '\\') {
141 level = 1;
142 } else {
143 Pos2++;
144 }
145 break;
146 case 1:
147 if (buffer[Pos] == 'n') Buf[Pos2] = 10;
148 if (buffer[Pos] == 'r') Buf[Pos2] = 13;
149 if (buffer[Pos] == '\\') Buf[Pos2] = '\\';
150 Pos2++;
151 level = 0;
152 }
153 Pos++;
154 }
155 Buf[Pos2] = 0;
156 return Buf;
157}
158
159char *mystrcasestr(unsigned const char *a, unsigned const char *b)
160{
161 unsigned char A[2000], B[200];
162 int i;
163
164 memset(A,0,sizeof(A));
165 memset(B,0,sizeof(B));
166 for (i=0;i<(int)strlen(a);i++) A[i] = tolower(a[i]);
167 for (i=0;i<(int)strlen(b);i++) B[i] = tolower(b[i]);
168
169 return strstr(A,B);
170}
171
19unsigned int UnicodeLength(const unsigned char *str) 172unsigned int UnicodeLength(const unsigned char *str)
20{ 173{
21 unsigned int len = 0; 174 unsigned int len = 0;
22 175
23 if (str == NULL) return 0; 176 if (str == NULL) return 0;
24 177
25 while(str[len*2] != 0 || str[len*2+1] != 0) len++; 178 while(str[len*2] != 0 || str[len*2+1] != 0) len++;
26 179
27 return len; 180 return len;
28} 181}
29 182
30/* Convert Unicode char saved in src to dest */ 183/* Convert Unicode char saved in src to dest */
31unsigned int EncodeWithUnicodeAlphabet(const unsigned char *src, wchar_t *dest) 184unsigned int EncodeWithUnicodeAlphabet(const unsigned char *src, wchar_t *dest)
32{ 185{
33 char retval; 186 char retval;
34 187
35 switch (retval = mbtowc(dest, src, MB_CUR_MAX)) { 188 switch (retval = mbtowc(dest, src, MB_CUR_MAX)) {
36 case -1 : 189 case -1 :
37 case 0 : return 1; 190 case 0 : return 1;
38 default : return retval; 191 default : return retval;
39 } 192 }
40} 193}
41 194
42/* Convert Unicode char saved in src to dest */ 195/* Convert Unicode char saved in src to dest */
43unsigned int DecodeWithUnicodeAlphabet(wchar_t src, unsigned char *dest) 196unsigned int DecodeWithUnicodeAlphabet(wchar_t src, unsigned char *dest)
44{ 197{
45 int retval; 198 int retval;
46 199
47 switch (retval = wctomb(dest, src)) { 200 switch (retval = wctomb(dest, src)) {
48 case -1: 201 case -1:
49 *dest = '?'; 202 *dest = '?';
50 return 1; 203 return 1;
51 default: 204 default:
52 return retval; 205 return retval;
53 } 206 }
54} 207}
55 208
56void DecodeUnicode (const unsigned char *src, unsigned char *dest) 209void DecodeUnicode (const unsigned char *src, unsigned char *dest)
57{ 210{
58 int i=0,o=0; 211 int i=0,o=0;
59 wchar_t wc; 212 wchar_t wc;
60 213
61 while (src[(2*i)+1]!=0x00 || src[2*i]!=0x00) { 214 while (src[(2*i)+1]!=0x00 || src[2*i]!=0x00) {
62 wc = src[(2*i)+1] | (src[2*i] << 8); 215 wc = src[(2*i)+1] | (src[2*i] << 8);
63 o += DecodeWithUnicodeAlphabet(wc, dest + o); 216 o += DecodeWithUnicodeAlphabet(wc, dest + o);
64 i++; 217 i++;
65 } 218 }
66 dest[o]=0; 219 dest[o]=0;
@@ -541,165 +694,165 @@ int GSM_PackSevenBitsToEight(int offset, unsigned char *input, unsigned char *ou
541 unsigned char *OUTPUT = output; /* Current pointer to the output buffer */ 694 unsigned char *OUTPUT = output; /* Current pointer to the output buffer */
542 unsigned char *INPUT = input; /* Current pointer to the input buffer */ 695 unsigned char *INPUT = input; /* Current pointer to the input buffer */
543 int Bits; /* Number of bits directly copied to 696 int Bits; /* Number of bits directly copied to
544 * the output buffer */ 697 * the output buffer */
545 Bits = (7 + offset) % 8; 698 Bits = (7 + offset) % 8;
546 699
547 /* If we don't begin with 0th bit, we will write only a part of the 700 /* If we don't begin with 0th bit, we will write only a part of the
548 first octet */ 701 first octet */
549 if (offset) { 702 if (offset) {
550 *OUTPUT = 0x00; 703 *OUTPUT = 0x00;
551 OUTPUT++; 704 OUTPUT++;
552 } 705 }
553 706
554 while ((INPUT - input) < length) { 707 while ((INPUT - input) < length) {
555 unsigned char Byte = *INPUT; 708 unsigned char Byte = *INPUT;
556 709
557 *OUTPUT = Byte >> (7 - Bits); 710 *OUTPUT = Byte >> (7 - Bits);
558 /* If we don't write at 0th bit of the octet, we should write 711 /* If we don't write at 0th bit of the octet, we should write
559 a second part of the previous octet */ 712 a second part of the previous octet */
560 if (Bits != 7) 713 if (Bits != 7)
561 *(OUTPUT-1) |= (Byte & ((1 << (7-Bits)) - 1)) << (Bits+1); 714 *(OUTPUT-1) |= (Byte & ((1 << (7-Bits)) - 1)) << (Bits+1);
562 715
563 Bits--; 716 Bits--;
564 717
565 if (Bits == -1) Bits = 7; else OUTPUT++; 718 if (Bits == -1) Bits = 7; else OUTPUT++;
566 719
567 INPUT++; 720 INPUT++;
568 } 721 }
569 return (OUTPUT - output); 722 return (OUTPUT - output);
570#else 723#else
571 return 0; 724 return 0;
572#endif 725#endif
573} 726}
574 727
575void GSM_UnpackSemiOctetNumber(unsigned char *retval, unsigned char *Number, bool semioctet) 728void GSM_UnpackSemiOctetNumber(unsigned char *retval, unsigned char *Number, bool semioctet)
576{ 729{
577 unsigned char Buffer[50]= ""; 730 unsigned char Buffer[50]= "";
578 int length = Number[0]; 731 int length = Number[0];
579 732
580 if (semioctet) { 733 if (semioctet) {
581 /* Convert number of semioctets to number of chars */ 734 /* Convert number of semioctets to number of chars */
582 if (length % 2) length++; 735 if (length % 2) length++;
583 length=length / 2 + 1; 736 length=length / 2 + 1;
584 } 737 }
585 738
586 /*without leading byte with format of number*/ 739 /*without leading byte with format of number*/
587 length--; 740 length--;
588 741
589 switch (Number[1]) { 742 switch ((Number[1] & 112)) {
590 case NUMBER_ALPHANUMERIC: 743 case (NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN & 112):
591 if (length > 6) length++; 744 if (length > 6) length++;
592 dbgprintf("Alphanumeric number, length %i\n",length); 745 dbgprintf("Alphanumeric number, length %i\n",length);
593 GSM_UnpackEightBitsToSeven(0, length, length, Number+2, Buffer); 746 GSM_UnpackEightBitsToSeven(0, length, length, Number+2, Buffer);
594 Buffer[length]=0; 747 Buffer[length]=0;
595 break; 748 break;
596 case NUMBER_INTERNATIONAL: 749 case (NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN & 112):
597 dbgprintf("International number\n"); 750 dbgprintf("International number\n");
598 Buffer[0]='+'; 751 Buffer[0]='+';
599 DecodeBCD(Buffer+1,Number+2, length); 752 DecodeBCD(Buffer+1,Number+2, length);
600 break; 753 break;
601 default: 754 default:
602 dbgprintf("Default number %02x\n",Number[1]); 755 dbgprintf("Default number %02x\n",Number[1]);
603 DecodeBCD (Buffer, Number+2, length); 756 DecodeBCD (Buffer, Number+2, length);
604 break; 757 break;
605 } 758 }
606 759
607 EncodeUnicode(retval,Buffer,strlen(Buffer)); 760 EncodeUnicode(retval,Buffer,strlen(Buffer));
608} 761}
609 762
610/** 763/**
611 * Packing some phone numbers (SMSC, SMS destination and others) 764 * Packing some phone numbers (SMSC, SMS destination and others)
612 * 765 *
613 * See GSM 03.40 9.1.1: 766 * See GSM 03.40 9.1.1:
614 * 1 byte - length of number given in semioctets or bytes (when given in 767 * 1 byte - length of number given in semioctets or bytes (when given in
615 * bytes, includes one byte for byte with number format). 768 * bytes, includes one byte for byte with number format).
616 * Returned by function (set semioctet to true, if want result 769 * Returned by function (set semioctet to true, if want result
617 * in semioctets). 770 * in semioctets).
618 * 1 byte - format of number (see GSM_NumberType in coding.h). Returned 771 * 1 byte - format of number (see GSM_NumberType in coding.h). Returned
619 * in unsigned char *Output. 772 * in unsigned char *Output.
620 * n bytes - 2n or 2n-1 semioctets with number. Returned in unsigned char 773 * n bytes - 2n or 2n-1 semioctets with number. Returned in unsigned char
621 * *Output. 774 * *Output.
622 * 775 *
623 * 1 semioctet = 4 bits = half of byte 776 * 1 semioctet = 4 bits = half of byte
624 */ 777 */
625int GSM_PackSemiOctetNumber(unsigned char *Number, unsigned char *Output, bool semioctet) 778int GSM_PackSemiOctetNumber(unsigned char *Number, unsigned char *Output, bool semioctet)
626{ 779{
627 unsigned charformat, buffer[50]; 780 unsigned charformat, buffer[50];
628 int length, i; 781 int length, i;
629 782
630 length=UnicodeLength(Number); 783 length=UnicodeLength(Number);
631 memcpy(buffer,DecodeUnicodeString(Number),length+1); 784 memcpy(buffer,DecodeUnicodeString(Number),length+1);
632 785
633 /* Checking for format number */ 786 /* Checking for format number */
634 format = NUMBER_UNKNOWN; 787 format = NUMBER_UNKNOWN_NUMBERING_PLAN_ISDN;
635 for (i=0;i<length;i++) { 788 for (i=0;i<length;i++) {
636 /* first byte is '+'. Number can be international */ 789 /* first byte is '+'. Number can be international */
637 if (i==0 && buffer[i]=='+') { 790 if (i==0 && buffer[i]=='+') {
638 format=NUMBER_INTERNATIONAL; 791 format=NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN;
639 } else { 792 } else {
640 /*char is not number. It must be alphanumeric*/ 793 /*char is not number. It must be alphanumeric*/
641 if (!isdigit(buffer[i])) format=NUMBER_ALPHANUMERIC; 794 if (!isdigit(buffer[i])) format=NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN;
642 } 795 }
643 } 796 }
644 797
645 /** 798 /**
646 * First byte is used for saving type of number. See GSM 03.40 799 * First byte is used for saving type of number. See GSM 03.40
647 * section 9.1.2.5 800 * section 9.1.2.5
648 */ 801 */
649 Output[0]=format; 802 Output[0]=format;
650 803
651 /* After number type we will have number. GSM 03.40 section 9.1.2 */ 804 /* After number type we will have number. GSM 03.40 section 9.1.2 */
652 switch (format) { 805 switch (format) {
653 case NUMBER_ALPHANUMERIC: 806 case NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN:
654 length=GSM_PackSevenBitsToEight(0, buffer, Output+1, strlen(buffer))*2; 807 length=GSM_PackSevenBitsToEight(0, buffer, Output+1, strlen(buffer))*2;
655 if (strlen(buffer)==7) length--; 808 if (strlen(buffer)==7) length--;
656 break; 809 break;
657 case NUMBER_INTERNATIONAL: 810 case NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN:
658 length--; 811 length--;
659 EncodeBCD (Output+1, buffer+1, length, true); 812 EncodeBCD (Output+1, buffer+1, length, true);
660 break; 813 break;
661 default: 814 default:
662 EncodeBCD (Output+1, buffer, length, true); 815 EncodeBCD (Output+1, buffer, length, true);
663 break; 816 break;
664 } 817 }
665 818
666 if (semioctet) return length; 819 if (semioctet) return length;
667 820
668 /* Convert number of semioctets to number of chars */ 821 /* Convert number of semioctets to number of chars */
669 if (length % 2) length++; 822 if (length % 2) length++;
670 return length / 2 + 1; 823 return length / 2 + 1;
671} 824}
672 825
673void CopyUnicodeString(unsigned char *Dest, unsigned char *Source) 826void CopyUnicodeString(unsigned char *Dest, unsigned char *Source)
674{ 827{
675 int j = 0; 828 int j = 0;
676 829
677 while (Source[j]!=0x00 || Source[j+1]!=0x00) { 830 while (Source[j]!=0x00 || Source[j+1]!=0x00) {
678 Dest[j] = Source[j]; 831 Dest[j] = Source[j];
679 Dest[j+1]= Source[j+1]; 832 Dest[j+1]= Source[j+1];
680 j=j+2; 833 j=j+2;
681 } 834 }
682 Dest[j] = 0; 835 Dest[j] = 0;
683 Dest[j+1]= 0; 836 Dest[j+1]= 0;
684} 837}
685 838
686/* Changes minor/major order in Unicode string */ 839/* Changes minor/major order in Unicode string */
687void ReverseUnicodeString(unsigned char *String) 840void ReverseUnicodeString(unsigned char *String)
688{ 841{
689 int j = 0; 842 int j = 0;
690 unsigned charbyte1, byte2; 843 unsigned charbyte1, byte2;
691 844
692 while (String[j]!=0x00 || String[j+1]!=0x00) { 845 while (String[j]!=0x00 || String[j+1]!=0x00) {
693 byte1 = String[j]; 846 byte1 = String[j];
694 byte2 = String[j+1]; 847 byte2 = String[j+1];
695 String[j+1]= byte1; 848 String[j+1]= byte1;
696 String[j]= byte2; 849 String[j]= byte2;
697 j=j+2; 850 j=j+2;
698 } 851 }
699 String[j]= 0; 852 String[j]= 0;
700 String[j+1]= 0; 853 String[j+1]= 0;
701} 854}
702 855
703/* All input is in Unicode. First char can show Unicode minor/major order. 856/* All input is in Unicode. First char can show Unicode minor/major order.
704 Output is Unicode string in Gammu minor/major order */ 857 Output is Unicode string in Gammu minor/major order */
705void ReadUnicodeFile(unsigned char *Dest, unsigned char *Source) 858void ReadUnicodeFile(unsigned char *Dest, unsigned char *Source)
@@ -874,193 +1027,193 @@ void EncodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *sr
874 } 1027 }
875 } 1028 }
876 if (special) { 1029 if (special) {
877 dest[current++]= 0x00; 1030 dest[current++]= 0x00;
878 dest[current++]= 0x01; 1031 dest[current++]= 0x01;
879 } 1032 }
880 dest[current++] = 0x00; 1033 dest[current++] = 0x00;
881 dest[current++] = 0x00; 1034 dest[current++] = 0x00;
882} 1035}
883 1036
884void DecodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, int len) 1037void DecodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, int len)
885{ 1038{
886 int i=0,current=0; 1039 int i=0,current=0;
887 1040
888 for (i=0;i<len;i++) { 1041 for (i=0;i<len;i++) {
889 switch (src[2*i]) { 1042 switch (src[2*i]) {
890 case 0x00: 1043 case 0x00:
891 switch (src[2*i+1]) { 1044 switch (src[2*i+1]) {
892 case 0x01: 1045 case 0x01:
893 dest[current++] = 0x00; 1046 dest[current++] = 0x00;
894 dest[current++] = '~'; 1047 dest[current++] = '~';
895 break; 1048 break;
896 case '~': 1049 case '~':
897 dest[current++] = 0x00; 1050 dest[current++] = 0x00;
898 dest[current++] = '~'; 1051 dest[current++] = '~';
899 dest[current++] = 0x00; 1052 dest[current++] = 0x00;
900 dest[current++] = '~'; 1053 dest[current++] = '~';
901 break; 1054 break;
902 default: 1055 default:
903 dest[current++] = src[i*2]; 1056 dest[current++] = src[i*2];
904 dest[current++] = src[i*2+1]; 1057 dest[current++] = src[i*2+1];
905 } 1058 }
906 break; 1059 break;
907 default: 1060 default:
908 dest[current++] = src[i*2]; 1061 dest[current++] = src[i*2];
909 dest[current++] = src[i*2+1]; 1062 dest[current++] = src[i*2+1];
910 } 1063 }
911 } 1064 }
912 dest[current++] = 0x00; 1065 dest[current++] = 0x00;
913 dest[current++] = 0x00; 1066 dest[current++] = 0x00;
914} 1067}
915 1068
916bool mystrncasecmp(unsigned const char *a, unsigned const char *b, int num) 1069bool mystrncasecmp(unsigned const char *a, unsigned const char *b, int num)
917{ 1070{
918 int i; 1071 int i;
919 1072
920 if (a == NULL || b == NULL) return false; 1073 if (a == NULL || b == NULL) return false;
921 1074
922 num--; 1075 if (num == 0) num = -1;
923 1076
924 for (i = 0; i != num; i++) { 1077 for (i = 0; i != num; i++) {
925 if (a[i] == 0x00 && b[i] == 0x00) return true; 1078 if (a[i] == 0x00 && b[i] == 0x00) return true;
926 if (a[i] == 0x00 || b[i] == 0x00) return false; 1079 if (a[i] == 0x00 || b[i] == 0x00) return false;
927 if (tolower(a[i]) != tolower(b[i])) return false; 1080 if (tolower(a[i]) != tolower(b[i])) return false;
928 } 1081 }
929 return true; 1082 return true;
930} 1083}
931 1084
932/* Compares two Unicode strings without regarding to case. 1085/* Compares two Unicode strings without regarding to case.
933 * Return true, when they're equal 1086 * Return true, when they're equal
934 */ 1087 */
935bool mywstrncasecmp(unsigned const char *a, unsigned const char *b, int num) 1088bool mywstrncasecmp(unsigned const char *a, unsigned const char *b, int num)
936{ 1089{
937 int i; 1090 int i;
938 wchar_t wc,wc2; 1091 wchar_t wc,wc2;
939 1092
940 if (a == NULL || b == NULL) return false; 1093 if (a == NULL || b == NULL) return false;
941 1094
942 num--; 1095 if (num == 0) num = -1;
943 1096
944 for (i = 0; i != num; i++) { 1097 for (i = 0; i != num; i++) {
945 if ((a[i*2] == 0x00 && a[i*2+1] == 0x00) && (b[i*2] == 0x00 && b[i*2+1] == 0x00)) return true; 1098 if ((a[i*2] == 0x00 && a[i*2+1] == 0x00) && (b[i*2] == 0x00 && b[i*2+1] == 0x00)) return true;
946 if ((a[i*2] == 0x00 && a[i*2+1] == 0x00) || (b[i*2] == 0x00 && b[i*2+1] == 0x00)) return false; 1099 if ((a[i*2] == 0x00 && a[i*2+1] == 0x00) || (b[i*2] == 0x00 && b[i*2+1] == 0x00)) return false;
947 wc = a[i*2+1] | (a[i*2] << 8); 1100 wc = a[i*2+1] | (a[i*2] << 8);
948 wc2 = b[i*2+1] | (b[i*2] << 8); 1101 wc2 = b[i*2+1] | (b[i*2] << 8);
949 if (mytowlower(wc) != mytowlower(wc2)) return false; 1102 if (mytowlower(wc) != mytowlower(wc2)) return false;
950 } 1103 }
951 return true; 1104 return true;
952} 1105}
953 1106
954/* wcscmp in Mandrake 9.0 is wrong */ 1107/* wcscmp in Mandrake 9.0 is wrong */
955bool mywstrncmp(unsigned const char *a, unsigned const char *b, int num) 1108bool mywstrncmp(unsigned const char *a, unsigned const char *b, int num)
956{ 1109{
957 int i=0; 1110 int i=0;
958 1111
959 while (1) { 1112 while (1) {
960 if (a[i*2] != b[i*2] || a[i*2+1] != b[i*2+1]) return false; 1113 if (a[i*2] != b[i*2] || a[i*2+1] != b[i*2+1]) return false;
961 if (a[i*2] == 0x00 && a[i*2+1] == 0x00) return true; 1114 if (a[i*2] == 0x00 && a[i*2+1] == 0x00) return true;
962 i++; 1115 i++;
963 if (num == i) return true; 1116 if (num == i) return true;
964 } 1117 }
965} 1118}
966 1119
967/* FreeBSD boxes 4.7-STABLE does't have it, although it's ANSI standard */ 1120/* FreeBSD boxes 4.7-STABLE does't have it, although it's ANSI standard */
968bool myiswspace(unsigned const char *src) 1121bool myiswspace(unsigned const char *src)
969{ 1122{
970#ifndef HAVE_ISWSPACE 1123#ifndef HAVE_ISWSPACE
971 int o; 1124 int o;
972 unsigned chardest[10]; 1125 unsigned chardest[10];
973#endif 1126#endif
974 wchar_t wc; 1127 wchar_t wc;
975 1128
976 wc = src[1] | (src[0] << 8); 1129 wc = src[1] | (src[0] << 8);
977 1130
978#ifndef HAVE_ISWSPACE 1131#ifndef HAVE_ISWSPACE
979 o = DecodeWithUnicodeAlphabet(wc, dest); 1132 o = DecodeWithUnicodeAlphabet(wc, dest);
980 if (o == 1) { 1133 if (o == 1) {
981 if (isspace(((int)dest[0]))!=0) return true; 1134 if (isspace(((int)dest[0]))!=0) return true;
982 return false; 1135 return false;
983 } 1136 }
984 return false; 1137 return false;
985#else 1138#else
986 return iswspace(wc); 1139 return iswspace(wc);
987#endif 1140#endif
988} 1141}
989 1142
990/* FreeBSD boxes 4.7-STABLE does't have it, although it's ANSI standard */ 1143/* FreeBSD boxes 4.7-STABLE does't have it, although it's ANSI standard */
991int mytowlower(wchar_t c) 1144int mytowlower(wchar_t c)
992{ 1145{
993#ifndef HAVE_TOWLOWER 1146#ifndef HAVE_TOWLOWER
994 unsigned char dest[10]; 1147 unsigned char dest[10];
995 1148
996 DecodeWithUnicodeAlphabet(c, dest); 1149 DecodeWithUnicodeAlphabet(c, dest);
997 return tolower(dest[0]); 1150 return tolower(dest[0]);
998#else 1151#else
999 return towlower(c); 1152 return towlower(c);
1000#endif 1153#endif
1001} 1154}
1002 1155
1003/* 1156/*
1004 * Following code is based on wcsstr from the GNU C Library, original 1157 * Following code is based on wcsstr from the GNU C Library, original
1005 * comment follows: 1158 * comment follows:
1006 */ 1159 */
1007/* 1160/*
1008 * The original strstr() file contains the following comment: 1161 * The original strstr() file contains the following comment:
1009 * 1162 *
1010 * My personal strstr() implementation that beats most other algorithms. 1163 * My personal strstr() implementation that beats most other algorithms.
1011 * Until someone tells me otherwise, I assume that this is the 1164 * Until someone tells me otherwise, I assume that this is the
1012 * fastest implementation of strstr() in C. 1165 * fastest implementation of strstr() in C.
1013 * I deliberately chose not to comment it. You should have at least 1166 * I deliberately chose not to comment it. You should have at least
1014 * as much fun trying to understand it, as I had to write it :-). 1167 * as much fun trying to understand it, as I had to write it :-).
1015 * 1168 *
1016 * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */ 1169 * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
1017 1170
1018unsigned char *mystrstr (const unsigned char *haystack, const unsigned char *needle) 1171unsigned char *mywstrstr (const unsigned char *haystack, const unsigned char *needle)
1019{ 1172{
1020/* One crazy define to convert unicode used in Gammu to standard wchar_t */ 1173/* One crazy define to convert unicode used in Gammu to standard wchar_t */
1021#define tolowerwchar(x) (mytowlower((wchar_t)( (((&(x))[0] & 0xff) << 8) | (((&(x))[1] & 0xff)) ))) 1174#define tolowerwchar(x) (mytowlower((wchar_t)( (((&(x))[0] & 0xff) << 8) | (((&(x))[1] & 0xff)) )))
1022 register wchar_t b, c; 1175 register wchar_t b, c;
1023 1176
1024 if ((b = tolowerwchar(*needle)) != L'\0') { 1177 if ((b = tolowerwchar(*needle)) != L'\0') {
1025 haystack -= 2; /* possible ANSI violation */ 1178 haystack -= 2; /* possible ANSI violation */
1026 do { 1179 do {
1027 haystack += 2; 1180 haystack += 2;
1028 if ((c = tolowerwchar(*haystack)) == L'\0') 1181 if ((c = tolowerwchar(*haystack)) == L'\0')
1029 goto ret0; 1182 goto ret0;
1030 } while (c != b); 1183 } while (c != b);
1031 1184
1032 needle += 2; 1185 needle += 2;
1033 if ((c = tolowerwchar(*needle)) == L'\0') 1186 if ((c = tolowerwchar(*needle)) == L'\0')
1034 goto foundneedle; 1187 goto foundneedle;
1035 needle += 2; 1188 needle += 2;
1036 goto jin; 1189 goto jin;
1037 1190
1038 for (;;) { 1191 for (;;) {
1039 register wchar_t a; 1192 register wchar_t a;
1040 register const unsigned char *rhaystack, *rneedle; 1193 register const unsigned char *rhaystack, *rneedle;
1041 1194
1042 do { 1195 do {
1043 haystack += 2; 1196 haystack += 2;
1044 if ((a = tolowerwchar(*haystack)) == L'\0') 1197 if ((a = tolowerwchar(*haystack)) == L'\0')
1045 goto ret0; 1198 goto ret0;
1046 if (a == b) 1199 if (a == b)
1047 break; 1200 break;
1048 haystack += 2; 1201 haystack += 2;
1049 if ((a = tolowerwchar(*haystack)) == L'\0') 1202 if ((a = tolowerwchar(*haystack)) == L'\0')
1050 goto ret0; 1203 goto ret0;
1051 shloop: ; 1204 shloop: ;
1052 } while (a != b); 1205 } while (a != b);
1053 1206
1054 jin: haystack += 2; 1207 jin: haystack += 2;
1055 if ((a = tolowerwchar(*haystack)) == L'\0') 1208 if ((a = tolowerwchar(*haystack)) == L'\0')
1056 goto ret0; 1209 goto ret0;
1057 1210
1058 if (a != c) 1211 if (a != c)
1059 goto shloop; 1212 goto shloop;
1060 1213
1061 rhaystack = haystack + 2; 1214 rhaystack = haystack + 2;
1062 haystack -= 2; 1215 haystack -= 2;
1063 rneedle = needle; 1216 rneedle = needle;
1064 if (tolowerwchar(*rhaystack) == (a = tolowerwchar(*rneedle))) 1217 if (tolowerwchar(*rhaystack) == (a = tolowerwchar(*rneedle)))
1065 do { 1218 do {
1066 if (a == L'\0') 1219 if (a == L'\0')
diff --git a/gammu/emb/common/misc/coding/coding.h b/gammu/emb/common/misc/coding/coding.h
index d0c334d..4cf0038 100644
--- a/gammu/emb/common/misc/coding/coding.h
+++ b/gammu/emb/common/misc/coding/coding.h
@@ -1,133 +1,148 @@
1/* (c) 2002-2004 by Marcin Wiacek and others */ 1/* (c) 2002-2004 by Marcin Wiacek and others */
2 2
3#ifndef __coding_h 3#ifndef __coding_h
4#define __coding_h 4#define __coding_h
5 5
6#if defined(_MSC_VER) && defined(__cplusplus)
7 extern "C" {
8#endif
9
6#include <stdlib.h> 10#include <stdlib.h>
7 11
8#include "../misc.h" 12#include "../misc.h"
9 13
10#ifdef __OpenBSD__ 14#ifdef __OpenBSD__
11 typedef int wint_t; 15 typedef int wint_t;
12#endif 16#endif
13 17
14/* ---------------------------- Unicode ------------------------------------ */ 18/* ---------------------------- Unicode ------------------------------------ */
15 bool mywstrncasecmp (unsigned const char *a, unsigned const char *b, int num); 19 bool mywstrncasecmp (unsigned const char *a, unsigned const char *b, int num);
16 unsigned char *mystrstr (unsigned const char *haystack, unsigned const char *needle); 20 unsigned char *mywstrstr (unsigned const char *haystack, unsigned const char *needle);
17 bool mywstrncmp (unsigned const char *a, unsigned const char *b, int num); 21 bool mywstrncmp (unsigned const char *a, unsigned const char *b, int num);
18 bool myiswspace (unsigned const char *src); 22 bool myiswspace (unsigned const char *src);
19 int mytowlower (wchar_t c); 23 int mytowlower (wchar_t c);
20 24
21 unsigned int EncodeWithUnicodeAlphabet(const unsigned char *value, wchar_t *dest); 25 unsigned int EncodeWithUnicodeAlphabet(const unsigned char *value, wchar_t *dest);
22 unsigned int DecodeWithUnicodeAlphabet(wchar_t value, unsigned char *dest); 26 unsigned int DecodeWithUnicodeAlphabet(wchar_t value, unsigned char *dest);
23 27
24 unsigned int UnicodeLength (const unsigned char *str); 28 unsigned int UnicodeLength (const unsigned char *str);
25 unsigned char *DecodeUnicodeString (const unsigned char *src); 29 unsigned char *DecodeUnicodeString (const unsigned char *src);
26 unsigned char *DecodeUnicodeConsole (const unsigned char *src); 30 unsigned char *DecodeUnicodeConsole (const unsigned char *src);
27 void DecodeUnicode (const unsigned char *src, unsigned char *dest); 31 void DecodeUnicode (const unsigned char *src, unsigned char *dest);
28 void EncodeUnicode (unsigned char *dest, const unsigned char *src, int len); 32 void EncodeUnicode (unsigned char *dest, const unsigned char *src, int len);
29 33
30 void CopyUnicodeString (unsigned char *Dest, unsigned char *Source); 34 void CopyUnicodeString (unsigned char *Dest, unsigned char *Source);
31 void ReverseUnicodeString (unsigned char *String); 35 void ReverseUnicodeString (unsigned char *String);
32 36
33 void ReadUnicodeFile (unsigned char *Dest, unsigned char *Source); 37 void ReadUnicodeFile (unsigned char *Dest, unsigned char *Source);
34 38
35 void DecodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, int len); 39 void DecodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, int len);
36 void EncodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, int len); 40 void EncodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, int len);
37 41
42 char *EncodeUnicodeSpecialChars(unsigned char *buffer);
43 char *DecodeUnicodeSpecialChars(unsigned char *buffer);
44
38/* ------------------------------- BCD ------------------------------------- */ 45/* ------------------------------- BCD ------------------------------------- */
39 unsigned char EncodeWithBCDAlphabet (int value); 46 unsigned char EncodeWithBCDAlphabet (int value);
40 int DecodeWithBCDAlphabet (unsigned char value); 47 int DecodeWithBCDAlphabet (unsigned char value);
41 48
42 void DecodeBCD (unsigned char *dest, const unsigned char *src, int len); 49 void DecodeBCD (unsigned char *dest, const unsigned char *src, int len);
43 void EncodeBCD (unsigned char *dest, const unsigned char *src, int len, bool fill); 50 void EncodeBCD (unsigned char *dest, const unsigned char *src, int len, bool fill);
44 51
45/* ------------------------------ UTF7 ------------------------------------- */ 52/* ------------------------------ UTF7 ------------------------------------- */
46 void DecodeUTF7 (unsigned char *dest, const unsigned char *src, int len); 53 void DecodeUTF7 (unsigned char *dest, const unsigned char *src, int len);
47 54
48/* ------------------------------ UTF8 ------------------------------------- */ 55/* ------------------------------ UTF8 ------------------------------------- */
49 wchar_t DecodeWithUTF8Alphabet (unsigned char mychar3, unsigned char mychar4); 56 wchar_t DecodeWithUTF8Alphabet (unsigned char mychar3, unsigned char mychar4);
50 bool EncodeWithUTF8Alphabet (unsigned char mychar1, unsigned char mychar2, unsigned char *ret1, unsigned char *ret2); 57 bool EncodeWithUTF8Alphabet (unsigned char mychar1, unsigned char mychar2, unsigned char *ret1, unsigned char *ret2);
51 58
52 bool EncodeUTF8QuotedPrintable(unsigned char *dest, const unsigned char *src); 59 bool EncodeUTF8QuotedPrintable(unsigned char *dest, const unsigned char *src);
53 void DecodeUTF8QuotedPrintable(unsigned char *dest, const unsigned char *src, int len); 60 void DecodeUTF8QuotedPrintable(unsigned char *dest, const unsigned char *src, int len);
54 61
55 bool EncodeUTF8 (unsigned char *dest, const unsigned char *src); 62 bool EncodeUTF8 (unsigned char *dest, const unsigned char *src);
56 void DecodeUTF8 (unsigned char *dest, const unsigned char *src, int len); 63 void DecodeUTF8 (unsigned char *dest, const unsigned char *src, int len);
57 64
58/* ------------------------------- BASE64 ---------------------------------- */ 65/* ------------------------------- BASE64 ---------------------------------- */
59 void EncodeBASE64 (const unsigned char *Input, unsigned char *Output, int Length); 66 void EncodeBASE64 (const unsigned char *Input, unsigned char *Output, int Length);
60 int DecodeBASE64 (const unsigned char *Input, unsigned char *Output, int Length); 67 int DecodeBASE64 (const unsigned char *Input, unsigned char *Output, int Length);
61 68
62/* ----------------------------- HexBin ------------------------------------ */ 69/* ----------------------------- HexBin ------------------------------------ */
63 void DecodeHexBin (unsigned char *dest, const unsigned char *src, int len); 70 void DecodeHexBin (unsigned char *dest, const unsigned char *src, int len);
64 void EncodeHexBin (unsigned char *dest, const unsigned char *src, int len); 71 void EncodeHexBin (unsigned char *dest, const unsigned char *src, int len);
65 72
66/* ----------------------------- HexUnicode -------------------------------- */ 73/* ----------------------------- HexUnicode -------------------------------- */
67 void DecodeHexUnicode (unsigned char *dest, const unsigned char *src, int len); 74 void DecodeHexUnicode (unsigned char *dest, const unsigned char *src, int len);
68 void EncodeHexUnicode (unsigned char *dest, const unsigned char *src, int len); 75 void EncodeHexUnicode (unsigned char *dest, const unsigned char *src, int len);
69 76
70/* ---------------------- DefaultAlphabet for SMS -------------------------- */ 77/* ---------------------- DefaultAlphabet for SMS -------------------------- */
71 void EncodeDefault (unsigned char *dest, const unsigned char *src, int *len, bool UseExtensions, unsigned char *ExtraAlphabet); 78 void EncodeDefault (unsigned char *dest, const unsigned char *src, int *len, bool UseExtensions, unsigned char *ExtraAlphabet);
72 void DecodeDefault (unsigned char *dest, const unsigned char *src, int len, bool UseExtensions, unsigned char *ExtraAlphabet); 79 void DecodeDefault (unsigned char *dest, const unsigned char *src, int len, bool UseExtensions, unsigned char *ExtraAlphabet);
73 void FindDefaultAlphabetLen (const unsigned char *src, int *srclen, int *smslen, int maxlen); 80 void FindDefaultAlphabetLen (const unsigned char *src, int *srclen, int *smslen, int maxlen);
74 81
75 int GSM_PackSevenBitsToEight(int offset, unsigned char *input, unsigned char *output, int length); 82 int GSM_PackSevenBitsToEight(int offset, unsigned char *input, unsigned char *output, int length);
76 int GSM_UnpackEightBitsToSeven(int offset, int in_length, int out_length, 83 int GSM_UnpackEightBitsToSeven(int offset, int in_length, int out_length,
77 unsigned char *input, unsigned char *output); 84 unsigned char *input, unsigned char *output);
78 85
79/* ----------------- Phone numbers according to GSM specs ------------------ */ 86/* ----------------- Phone numbers according to GSM specs ------------------ */
80 87
81/** 88/**
82 * Enum to handle types of phones numbers like 89 * Enum to handle types of phones numbers like
83 * specified in GSM 03.40 section 9.1.2.5 90 * specified in GSM 03.40 section 9.1.2.5
84 */ 91 */
85typedef enum { 92typedef enum {
86 /** 93 /**
87 * Unknown number type 94 * Unknown number type
88 */ 95 */
89 NUMBER_UNKNOWN = 0x81, 96 NUMBER_UNKNOWN_NUMBERING_PLAN_ISDN = 0x81,
90 /** 97 /**
91 * International number (full number with code of country) 98 * International number (full number with code of country)
92 */ 99 */
93 NUMBER_INTERNATIONAL= 0x91, 100 NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN= 0x91,
94 /** 101 /**
95 * Alphanumeric number (with chars too) 102 * Alphanumeric number (with chars too)
96 */ 103 */
97 NUMBER_ALPHANUMERIC= 0xD0 104 NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN= 0xD0
98 105
99 /* specification give also other values */ 106 /* specification give also other values */
100} GSM_NumberType; 107} GSM_NumberType;
101 108
102 void GSM_UnpackSemiOctetNumber(unsigned char *retval, unsigned char *Number, bool semioctet); 109 void GSM_UnpackSemiOctetNumber(unsigned char *retval, unsigned char *Number, bool semioctet);
103 int GSM_PackSemiOctetNumber (unsigned char *Number, unsigned char *Output, bool semioctet); 110 int GSM_PackSemiOctetNumber (unsigned char *Number, unsigned char *Output, bool semioctet);
104 111
105/* ---------------------------- Bits --------------------------------------- */ 112/* ---------------------------- Bits --------------------------------------- */
106 113
107void BufferAlign (unsigned char *Destination, int *CurrentBit); 114void BufferAlign (unsigned char *Destination, int *CurrentBit);
108void BufferAlignNumber(int *CurrentBit); 115void BufferAlignNumber(int *CurrentBit);
109 116
110 void AddBuffer (unsigned char *Destination, int *CurrentBit, unsigned char *Source, int BitsToProcess); 117 void AddBuffer (unsigned char *Destination, int *CurrentBit, unsigned char *Source, int BitsToProcess);
111void AddBufferByte(unsigned char *Destination, int *CurrentBit, unsigned char Source, int BitsToProcess); 118void AddBufferByte(unsigned char *Destination, int *CurrentBit, unsigned char Source, int BitsToProcess);
112 119
113void GetBuffer (unsigned char *Source, int *CurrentBit, unsigned char *Destination, int BitsToProcess); 120void GetBuffer (unsigned char *Source, int *CurrentBit, unsigned char *Destination, int BitsToProcess);
114void GetBufferInt (unsigned char *Source, int *CurrentBit, int *integer, int BitsToProcess); 121void GetBufferInt (unsigned char *Source, int *CurrentBit, int *integer, int BitsToProcess);
115void GetBufferI (unsigned char *Source, int *CurrentBit, int *result, int BitsToProcess); 122void GetBufferI (unsigned char *Source, int *CurrentBit, int *result, int BitsToProcess);
116 123
117int GetBit (unsigned char *Buffer, int BitNum); 124int GetBit (unsigned char *Buffer, int BitNum);
118int SetBit (unsigned char *Buffer, int BitNum); 125int SetBit (unsigned char *Buffer, int BitNum);
119int ClearBit (unsigned char *Buffer, int BitNum); 126int ClearBit (unsigned char *Buffer, int BitNum);
120 127
121/* ---------------------------- Other -------------------------------------- */ 128/* ---------------------------- Other -------------------------------------- */
122 129
123 void StringToDouble(char *text, double *d); 130 void StringToDouble(char *text, double *d);
124 131
125bool mystrncasecmp (unsigned const char *a, unsigned const char *b, int num); 132 bool mystrncasecmp (unsigned const char *a, unsigned const char *b, int num);
133 char *mystrcasestr (unsigned const char *a, unsigned const char *b);
126 134
127void MyGetLine(unsigned char *Buffer, int *Pos, unsigned char *OutBuffer, int MaxLen); 135 void MyGetLine (unsigned char *Buffer, int *Pos, unsigned char *OutBuffer, int MaxLen);
136
137char *EncodeSpecialChars(unsigned char *buffer);
138char *DecodeSpecialChars(unsigned char *buffer);
139
140#if defined(_MSC_VER) && defined(__cplusplus)
141 }
142#endif
128 143
129#endif 144#endif
130 145
131/* How should editor hadle tabs in this file? Add editor commands here. 146/* How should editor hadle tabs in this file? Add editor commands here.
132 * vim: noexpandtab sw=8 ts=8 sts=8: 147 * vim: noexpandtab sw=8 ts=8 sts=8:
133 */ 148 */
diff --git a/gammu/emb/common/misc/coding/md5.c b/gammu/emb/common/misc/coding/md5.c
index 30fe33f..abb61be 100644
--- a/gammu/emb/common/misc/coding/md5.c
+++ b/gammu/emb/common/misc/coding/md5.c
@@ -1,49 +1,49 @@
1/* Taken from ReHash (see http://www.reichlsoft.de.vu/) and released 1/* Taken from ReHash (www.reichlsoft.de.vu) and released
2 * under GPL/LGPL with permission from ReHash author 2 * under GPL/LGPL with permission from ReHash author
3 * Dominik Reichl <dominik.reichl@t-online.de>, Germany 3 * Dominik Reichl <dominik.reichl@t-online.de>, Germany
4 */ 4 */
5 5
6/* 6/*
7 ********************************************************************** 7 **********************************************************************
8 ** MD5.cpp ** 8 ** MD5.cpp **
9 ** ** 9 ** **
10 ** - Style modified by Tony Ray, January 2001 ** 10 ** - Style modified by Tony Ray, January 2001 **
11 ** Added support for randomizing initialization constants ** 11 ** Added support for randomizing initialization constants **
12 ** - Style modified by Dominik Reichl, April 2003 ** 12 ** - Style modified by Dominik Reichl, April 2003 **
13 ** Optimized code ** 13 ** Optimized code **
14 ** ** 14 ** **
15 ** MD5.c ** 15 ** MD5.c **
16 ** RSA Data Security, Inc. MD5 Message Digest Algorithm ** 16 ** RSA Data Security, Inc. MD5 Message Digest Algorithm **
17 ** Created: 2/17/90 RLR ** 17 ** Created: 2/17/90 RLR **
18 ** Revised: 1/91 SRD,AJ,BSK,JT Reference C Version ** 18 ** Revised: 1/91 SRD,AJ,BSK,JT Reference C Version **
19 ********************************************************************** 19 **********************************************************************
20 */ 20 */
21 21
22/* 22/*
23 ********************************************************************** 23 **********************************************************************
24 ** MD5.h -- Header file for implementation of MD5 ** 24 ** MD5.h -- Header file for implementation of MD5 **
25 ** RSA Data Security, Inc. MD5 Message Digest Algorithm ** 25 ** RSA Data Security, Inc. MD5 Message Digest Algorithm **
26 ** Created: 2/17/90 RLR ** 26 ** Created: 2/17/90 RLR **
27 ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** 27 ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version **
28 ** Revised (for MD5): RLR 4/27/91 ** 28 ** Revised (for MD5): RLR 4/27/91 **
29 ** -- G modified to have y&~z instead of y&z ** 29 ** -- G modified to have y&~z instead of y&z **
30 ** -- FF, GG, HH modified to add in last register done ** 30 ** -- FF, GG, HH modified to add in last register done **
31 ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** 31 ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 **
32 ** -- distinct additive constant for each step ** 32 ** -- distinct additive constant for each step **
33 ** -- round 4 added, working mod 7 ** 33 ** -- round 4 added, working mod 7 **
34 ********************************************************************** 34 **********************************************************************
35 */ 35 */
36 36
37/* 37/*
38 ********************************************************************** 38 **********************************************************************
39 ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** 39 ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
40 ** ** 40 ** **
41 ** License to copy and use this software is granted provided that ** 41 ** License to copy and use this software is granted provided that **
42 ** it is identified as the "RSA Data Security, Inc. MD5 Message ** 42 ** it is identified as the "RSA Data Security, Inc. MD5 Message **
43 ** Digest Algorithm" in all material mentioning or referencing this ** 43 ** Digest Algorithm" in all material mentioning or referencing this **
44 ** software or this function. ** 44 ** software or this function. **
45 ** ** 45 ** **
46 ** License is also granted to make and use derivative works ** 46 ** License is also granted to make and use derivative works **
47 ** provided that such works are identified as "derived from the RSA ** 47 ** provided that such works are identified as "derived from the RSA **
48 ** Data Security, Inc. MD5 Message Digest Algorithm" in all ** 48 ** Data Security, Inc. MD5 Message Digest Algorithm" in all **
49 ** material mentioning or referencing the derived work. ** 49 ** material mentioning or referencing the derived work. **
diff --git a/gammu/emb/common/misc/misc.c b/gammu/emb/common/misc/misc.c
index c2f09e4..7227e7b 100644
--- a/gammu/emb/common/misc/misc.c
+++ b/gammu/emb/common/misc/misc.c
@@ -1,61 +1,64 @@
1/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */ 1/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */
2/* Checking used compiler (c) 2002 by Michal Cihar */ 2/* Checking used compiler (c) 2002 by Michal Cihar */
3 3
4#include <string.h> 4#include <string.h>
5#include <ctype.h> 5#include <ctype.h>
6#include <time.h> 6#include <time.h>
7#include <stdarg.h> 7#include <stdarg.h>
8#include <stdio.h> 8#include <stdio.h>
9#include <locale.h> 9#include <locale.h>
10#include <sys/timeb.h> 10#include <sys/timeb.h>
11#ifdef WIN32 11#ifdef WIN32
12# include "windows.h" 12# include "windows.h"
13#endif 13#endif
14#if defined(linux) || defined(__linux) || defined(__linux__)
15# include <sys/utsname.h>
16#endif
14 17
15#include "../gsmstate.h" 18#include "../gsmstate.h"
16#include "misc.h" 19#include "misc.h"
17 20
18/* Based on article in Polish PC-Kurier 8/1998 page 104 21/* Based on article in Polish PC-Kurier 8/1998 page 104
19 * Archive on http://www.pckurier.pl 22 * Archive on http://www.pckurier.pl
20 */ 23 */
21char *DayOfWeek (int year, int month, int day) 24char *DayOfWeek (int year, int month, int day)
22{ 25{
23 int p,q,r,w; 26 int p,q,r,w;
24 static char DayOfWeekChar[10]; 27 static char DayOfWeekChar[10];
25 28
26 p=(14-month) / 12; 29 p=(14-month) / 12;
27 q=month+12*p-2; 30 q=month+12*p-2;
28 r=year-p; 31 r=year-p;
29 w=(day+(31*q) / 12 + r + r / 4 - r / 100 + r / 400) % 7; 32 w=(day+(31*q) / 12 + r + r / 4 - r / 100 + r / 400) % 7;
30 strcpy(DayOfWeekChar,""); 33 strcpy(DayOfWeekChar,"");
31 switch (w) { 34 switch (w) {
32 case 0: strcpy(DayOfWeekChar,"Sun"); break; 35 case 0: strcpy(DayOfWeekChar,"Sun"); break;
33 case 1: strcpy(DayOfWeekChar,"Mon"); break; 36 case 1: strcpy(DayOfWeekChar,"Mon"); break;
34 case 2: strcpy(DayOfWeekChar,"Tue"); break; 37 case 2: strcpy(DayOfWeekChar,"Tue"); break;
35 case 3: strcpy(DayOfWeekChar,"Wed"); break; 38 case 3: strcpy(DayOfWeekChar,"Wed"); break;
36 case 4: strcpy(DayOfWeekChar,"Thu"); break; 39 case 4: strcpy(DayOfWeekChar,"Thu"); break;
37 case 5: strcpy(DayOfWeekChar,"Fri"); break; 40 case 5: strcpy(DayOfWeekChar,"Fri"); break;
38 case 6: strcpy(DayOfWeekChar,"Sat"); break; 41 case 6: strcpy(DayOfWeekChar,"Sat"); break;
39 } 42 }
40 return DayOfWeekChar; 43 return DayOfWeekChar;
41} 44}
42 45
43void Fill_GSM_DateTime(GSM_DateTime *Date, time_t timet) 46void Fill_GSM_DateTime(GSM_DateTime *Date, time_t timet)
44{ 47{
45 struct tm *now; 48 struct tm *now;
46 49
47 now = localtime(&timet); 50 now = localtime(&timet);
48 Date->Year= now->tm_year; 51 Date->Year= now->tm_year;
49 Date->Month= now->tm_mon+1; 52 Date->Month= now->tm_mon+1;
50 Date->Day= now->tm_mday; 53 Date->Day= now->tm_mday;
51 Date->Hour= now->tm_hour; 54 Date->Hour= now->tm_hour;
52 Date->Minute= now->tm_min; 55 Date->Minute= now->tm_min;
53 Date->Second = now->tm_sec; 56 Date->Second = now->tm_sec;
54} 57}
55 58
56void GSM_GetCurrentDateTime (GSM_DateTime *Date) 59void GSM_GetCurrentDateTime (GSM_DateTime *Date)
57{ 60{
58 Fill_GSM_DateTime(Date, time(NULL)); 61 Fill_GSM_DateTime(Date, time(NULL));
59 if (Date->Year<1900) { 62 if (Date->Year<1900) {
60 if (Date->Year>90) Date->Year = Date->Year+1900; 63 if (Date->Year>90) Date->Year = Date->Year+1900;
61 else Date->Year = Date->Year+2000; 64 else Date->Year = Date->Year+2000;
@@ -185,101 +188,103 @@ char *OSDate (GSM_DateTime dt)
185#endif 188#endif
186 189
187 /* Based on article in Polish PC-Kurier 8/1998 page 104 190 /* Based on article in Polish PC-Kurier 8/1998 page 104
188 * Archive on http://www.pckurier.pl 191 * Archive on http://www.pckurier.pl
189 */ 192 */
190 p=(14-dt.Month) / 12; 193 p=(14-dt.Month) / 12;
191 q=dt.Month+12*p-2; 194 q=dt.Month+12*p-2;
192 r=dt.Year-p; 195 r=dt.Year-p;
193 w=(dt.Day+(31*q) / 12 + r + r / 4 - r / 100 + r / 400) % 7; 196 w=(dt.Day+(31*q) / 12 + r + r / 4 - r / 100 + r / 400) % 7;
194 197
195 timeptr.tm_yday = 0; /* FIXME */ 198 timeptr.tm_yday = 0; /* FIXME */
196 timeptr.tm_isdst = -1; /* FIXME */ 199 timeptr.tm_isdst = -1; /* FIXME */
197 timeptr.tm_year = dt.Year - 1900; 200 timeptr.tm_year = dt.Year - 1900;
198 timeptr.tm_mon = dt.Month - 1; 201 timeptr.tm_mon = dt.Month - 1;
199 timeptr.tm_mday = dt.Day; 202 timeptr.tm_mday = dt.Day;
200 timeptr.tm_hour = dt.Hour; 203 timeptr.tm_hour = dt.Hour;
201 timeptr.tm_min = dt.Minute; 204 timeptr.tm_min = dt.Minute;
202 timeptr.tm_sec = dt.Second; 205 timeptr.tm_sec = dt.Second;
203 timeptr.tm_wday = w; 206 timeptr.tm_wday = w;
204#ifdef _BSD_SOURCE 207#ifdef _BSD_SOURCE
205 timeptr.tm_zone = NULL; 208 timeptr.tm_zone = NULL;
206#endif 209#endif
207 210
208#ifdef WIN32 211#ifdef WIN32
209 strftime(retval2, 200, "%#x", &timeptr); 212 strftime(retval2, 200, "%#x", &timeptr);
210#else 213#else
211 strftime(retval2, 200, "%x", &timeptr); 214 strftime(retval2, 200, "%x", &timeptr);
212#endif 215#endif
213 /* If don't have weekday name, include it */ 216 /* If don't have weekday name, include it */
214 strftime(retval, 200, "%A", &timeptr); 217 strftime(retval, 200, "%A", &timeptr);
215 if (strstr(retval2,retval)==NULL) { 218 if (strstr(retval2,retval)==NULL) {
216 /* Check also for short name */ 219 /* Check also for short name */
217 strftime(retval, 200, "%a", &timeptr); 220 strftime(retval, 200, "%a", &timeptr);
218 if (strstr(retval2,retval)==NULL) { 221 if (strstr(retval2,retval)==NULL) {
219 strcat(retval2," ("); 222 strcat(retval2," (");
220 strcat(retval2,retval); 223 strcat(retval2,retval);
221 strcat(retval2,")"); 224 strcat(retval2,")");
222 } 225 }
223 } 226 }
224 227
225#ifdef WIN32 228#ifdef WIN32
226 setlocale(LC_ALL, ".ACP"); 229 setlocale(LC_ALL, ".ACP");
227#endif 230#endif
228 231
229 return retval2; 232 return retval2;
230} 233}
231 234
232bool CheckDate(GSM_DateTime *date) 235bool CheckDate(GSM_DateTime *date)
233{ 236 {
234 /* FIXME: This could also check if day is correct for selected month */ 237 const unsigned int days[]={31,29,31,30,31,30,31,31,30,31,30,31};
238
239 /* FIXME: This could also check for leap years */
235 return date->Year != 0 && 240 return date->Year != 0 &&
236 date->Month >= 1 && date->Month <= 12 && 241 date->Month >= 1 && date->Month <= 12 &&
237 date->Day >= 1 && date->Day <= 31; 242 date->Day >= 1 && date->Day <= days[date->Month];
238} 243}
239 244
240bool CheckTime(GSM_DateTime *date) 245bool CheckTime(GSM_DateTime *date)
241{ 246{
242 return date->Hour <= 23 && date->Hour >= 0 && 247 return date->Hour <= 23 && date->Hour >= 0 &&
243 date->Minute <= 59 && date->Minute >= 0 && 248 date->Minute <= 59 && date->Minute >= 0 &&
244 date->Second <= 59 && date->Second >= 0; 249 date->Second <= 59 && date->Second >= 0;
245} 250}
246 251
247int GetLine(FILE *File, char *Line, int count) 252int GetLine(FILE *File, char *Line, int count)
248{ 253{
249 int num; 254 int num;
250 255
251 if (fgets(Line, count, File) != NULL) { 256 if (fgets(Line, count, File) != NULL) {
252 num = strlen(Line) - 1; 257 num = strlen(Line) - 1;
253 while(1) { 258 while(1) {
254 if (Line[num] != '\n' && Line[num] != '\r') break; 259 if (Line[num] != '\n' && Line[num] != '\r') break;
255 if (num == 0) break; 260 if (num == 0) break;
256 Line[num--] = 0; 261 Line[num--] = 0;
257 } 262 }
258 return strlen(Line); 263 return strlen(Line);
259 } 264 }
260 return -1; 265 return -1;
261} 266}
262 267
263void SplitLines(unsigned char *message, int messagesize, GSM_Lines *lines, unsigned char *whitespaces, int spaceslen, bool eot) 268void SplitLines(unsigned char *message, int messagesize, GSM_Lines *lines, unsigned char *whitespaces, int spaceslen, bool eot)
264{ 269{
265 int i,number=0,j; 270 int i,number=0,j;
266 bool whitespace=true, nowwhite; 271 bool whitespace=true, nowwhite;
267 272
268 for (i=0;i<MAX_LINES*2;i++) lines->numbers[i]=0; 273 for (i=0;i<MAX_LINES*2;i++) lines->numbers[i]=0;
269 274
270 for (i=0;i<messagesize;i++) { 275 for (i=0;i<messagesize;i++) {
271 nowwhite = false; 276 nowwhite = false;
272 for (j=0;j<spaceslen;j++) { 277 for (j=0;j<spaceslen;j++) {
273 if (whitespaces[j] == message[i]) { 278 if (whitespaces[j] == message[i]) {
274 nowwhite = true; 279 nowwhite = true;
275 break; 280 break;
276 } 281 }
277 } 282 }
278 if (whitespace) { 283 if (whitespace) {
279 if (!nowwhite) { 284 if (!nowwhite) {
280 lines->numbers[number]=i; 285 lines->numbers[number]=i;
281 number++; 286 number++;
282 whitespace=false; 287 whitespace=false;
283 } 288 }
284 } else { 289 } else {
285 if (nowwhite) { 290 if (nowwhite) {
@@ -406,166 +411,170 @@ bool GSM_SetDebugLevel(char *info, Debug_Info *di)
406 if (!strcmp(info,"errors")) {di->dl = DL_TEXTERROR; return true;} 411 if (!strcmp(info,"errors")) {di->dl = DL_TEXTERROR; return true;}
407 if (!strcmp(info,"textdate")) {di->dl = DL_TEXTDATE; return true;} 412 if (!strcmp(info,"textdate")) {di->dl = DL_TEXTDATE; return true;}
408 if (!strcmp(info,"textalldate")) {di->dl = DL_TEXTALLDATE; return true;} 413 if (!strcmp(info,"textalldate")) {di->dl = DL_TEXTALLDATE; return true;}
409 if (!strcmp(info,"errorsdate")) {di->dl = DL_TEXTERRORDATE; return true;} 414 if (!strcmp(info,"errorsdate")) {di->dl = DL_TEXTERRORDATE; return true;}
410 return false; 415 return false;
411} 416}
412 417
413/* Dumps a message */ 418/* Dumps a message */
414void DumpMessage(FILE *df, Debug_Level dl, const unsigned char *message, int messagesize) 419void DumpMessage(FILE *df, Debug_Level dl, const unsigned char *message, int messagesize)
415{ 420{
416 int i,j=0,len=16; 421 int i,j=0,len=16;
417 unsigned charbuffer[200]; 422 unsigned charbuffer[200];
418 423
419 if (df==NULL || messagesize == 0) return; 424 if (df==NULL || messagesize == 0) return;
420 425
421 smfprintf(df, dl, "\n"); 426 smfprintf(df, dl, "\n");
422 427
423 memset(buffer,0x20,sizeof(buffer)); 428 memset(buffer,0x20,sizeof(buffer));
424 buffer[len*5-1]=0; 429 buffer[len*5-1]=0;
425 430
426 for (i = 0; i < messagesize; i++) { 431 for (i = 0; i < messagesize; i++) {
427 sprintf(buffer+j*4,"%02X",message[i]); 432 sprintf(buffer+j*4,"%02X",message[i]);
428 buffer[j*4+2] = 0x20; 433 buffer[j*4+2] = 0x20;
429 if (isprint(message[i]) && message[i]!=0x09) { 434 if (isprint(message[i]) && message[i]!=0x09) {
430 if (j != len-1) buffer[j*4+2] = message[i]; 435 if (j != len-1) buffer[j*4+2] = message[i];
431 buffer[(len-1)*4+j+3] = message[i]; 436 buffer[(len-1)*4+j+3] = message[i];
432 } else { 437 } else {
433 buffer[(len-1)*4+j+3] = '.'; 438 buffer[(len-1)*4+j+3] = '.';
434 } 439 }
435 if (j != len-1 && i != messagesize-1) buffer[j*4+3] = '|'; 440 if (j != len-1 && i != messagesize-1) buffer[j*4+3] = '|';
436 if (j == len-1) { 441 if (j == len-1) {
437 smfprintf(df, dl, "%s\n", buffer); 442 smfprintf(df, dl, "%s\n", buffer);
438 memset(buffer,0x20,sizeof(buffer)); 443 memset(buffer,0x20,sizeof(buffer));
439 buffer[len*5-1]=0; 444 buffer[len*5-1]=0;
440 j = 0; 445 j = 0;
441 } else { 446 } else {
442 j++; 447 j++;
443 } 448 }
444 } 449 }
445 if (j != 0) smfprintf(df, dl, "%s\n", buffer); 450 if (j != 0) smfprintf(df, dl, "%s\n", buffer);
446} 451}
447 452
448char *GetOS(void) 453char *GetOS(void)
449{ 454{
450#ifdef WIN32 455#ifdef WIN32
451 OSVERSIONINFOEX Ver; 456 OSVERSIONINFOEX Ver;
452 bool Extended = true; 457 bool Extended = true;
453#endif 458#endif
459#if defined(linux) || defined(__linux) || defined(__linux__)
460 struct utsnameVer;
461#endif
454 static char Buffer[100] = {0x00}; 462 static char Buffer[100] = {0x00};
455 463
456#ifdef WIN32 464#ifdef WIN32
457 memset(&Ver,sizeof(OSVERSIONINFOEX),0); 465 memset(&Ver,sizeof(OSVERSIONINFOEX),0);
458 Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 466 Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
459 467
460 if (!GetVersionEx((OSVERSIONINFO *)&Ver)) { 468 if (!GetVersionEx((OSVERSIONINFO *)&Ver)) {
461 Extended = false; 469 Extended = false;
462 Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 470 Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
463 if (!GetVersionEx((OSVERSIONINFO *)&Ver)) { 471 if (!GetVersionEx((OSVERSIONINFO *)&Ver)) {
464//#ifdef _MSC_VER 472//#ifdef _MSC_VER
465 // Ver.dwMajorVersion = _winmajor; 473 // Ver.dwMajorVersion = _winmajor;
466 // Ver.dwMinorVersion = _winminor; 474 // Ver.dwMinorVersion = _winminor;
467 // Ver.dwBuildNumber = _osver; 475 // Ver.dwBuildNumber = _osver;
468//#else 476//#else
469 sprintf(Buffer, "Windows"); 477 sprintf(Buffer, "Windows");
470 return Buffer; 478 return Buffer;
471//#endif 479//#endif
472 } 480 }
473 } 481 }
474 482
475 /* ----------------- 9x family ------------------ */ 483 /* ----------------- 9x family ------------------ */
476 484
477 /* no info about Win95 SP1, Win95 OSR2.1, Win95 OSR2.5.... */ 485 /* no info about Win95 SP1, Win95 OSR2.1, Win95 OSR2.5.... */
478 if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 950) { 486 if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 950) {
479 sprintf(Buffer,"Win 95"); 487 sprintf(Buffer,"Win 95");
480 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 1111) { 488 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 1111) {
481 sprintf(Buffer,"Win 95 OSR2.x"); 489 sprintf(Buffer,"Win 95 OSR2.x");
482 490
483 /* no info about Win98 SP1.... */ 491 /* no info about Win98 SP1.... */
484 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 10 && Ver.dwBuildNumber == 1998) { 492 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 10 && Ver.dwBuildNumber == 1998) {
485 sprintf(Buffer,"Win 98"); 493 sprintf(Buffer,"Win 98");
486 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 10 && Ver.dwBuildNumber == 2222) { 494 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 10 && Ver.dwBuildNumber == 2222) {
487 sprintf(Buffer,"Win 98 SE"); 495 sprintf(Buffer,"Win 98 SE");
488 496
489 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 90 && Ver.dwBuildNumber == 3000) { 497 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 90 && Ver.dwBuildNumber == 3000) {
490 sprintf(Buffer,"Win ME"); 498 sprintf(Buffer,"Win ME");
491 499
492 /* ---------------- NT family ------------------- */ 500 /* ---------------- NT family ------------------- */
493 501
494 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 1381) { 502 } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 1381) {
495 sprintf(Buffer,"Win NT 4.0"); 503 sprintf(Buffer,"Win NT 4.0");
496 504
497 } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 2195) { 505 } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 2195) {
498 sprintf(Buffer,"Win 2000"); 506 sprintf(Buffer,"Win 2000");
499 507
500 } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 1 && Ver.dwBuildNumber == 2600) { 508 } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 1 && Ver.dwBuildNumber == 2600) {
501 sprintf(Buffer,"Win XP"); 509 sprintf(Buffer,"Win XP");
502#if _MSC_VER > 1200 //6.0 has it undeclared 510#if _MSC_VER > 1200 //6.0 has it undeclared
503 if (Extended) { 511 if (Extended) {
504 if (Ver.wSuiteMask & VER_SUITE_PERSONAL) { 512 if (Ver.wSuiteMask & VER_SUITE_PERSONAL) {
505 sprintf(Buffer+strlen(Buffer)," Home"); 513 sprintf(Buffer+strlen(Buffer)," Home");
506 } else { 514 } else {
507 sprintf(Buffer+strlen(Buffer)," Pro"); 515 sprintf(Buffer+strlen(Buffer)," Pro");
508 } 516 }
509 } 517 }
510#endif 518#endif
511 519
512 } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 2) { 520 } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 2) {
513 sprintf(Buffer,"Win 2003"); 521 sprintf(Buffer,"Win 2003");
514 522
515 } else { 523 } else {
516 sprintf(Buffer, "Windows %i.%i.%i",Ver.dwMajorVersion,Ver.dwMinorVersion,Ver.dwBuildNumber); 524 sprintf(Buffer, "Windows %i.%i.%i",Ver.dwMajorVersion,Ver.dwMinorVersion,Ver.dwBuildNumber);
517 } 525 }
518 526
519 if (Extended && Ver.wServicePackMajor != 0) { 527 if (Extended && Ver.wServicePackMajor != 0) {
520 sprintf(Buffer+strlen(Buffer)," SP%i",Ver.wServicePackMajor); 528 sprintf(Buffer+strlen(Buffer)," SP%i",Ver.wServicePackMajor);
521 } 529 }
522#elif defined(linux) || defined(__linux) || defined(__linux__) 530#elif defined(linux) || defined(__linux) || defined(__linux__)
523 sprintf(Buffer, "Linux"); 531 uname(&Ver);
532 sprintf(Buffer, "Linux, kernel %s",Ver.release);
524#elif defined(__FreeBSD__) 533#elif defined(__FreeBSD__)
525 sprintf(Buffer, "FreeBSD"); 534 sprintf(Buffer, "FreeBSD");
526#elif defined(__NetBSD__) 535#elif defined(__NetBSD__)
527 sprintf(Buffer, "NetBSD"); 536 sprintf(Buffer, "NetBSD");
528#elif defined(__OpenBSD__) 537#elif defined(__OpenBSD__)
529 sprintf(Buffer, "OpenBSD"); 538 sprintf(Buffer, "OpenBSD");
530#elif defined(__GNU__) 539#elif defined(__GNU__)
531 sprintf(Buffer, "GNU/Hurd"); 540 sprintf(Buffer, "GNU/Hurd");
532#elif defined(sun) || defined(__sun) || defined(__sun__) 541#elif defined(sun) || defined(__sun) || defined(__sun__)
533# ifdef __SVR4 542# ifdef __SVR4
534 sprintf(Buffer, "Sun Solaris"); 543 sprintf(Buffer, "Sun Solaris");
535# else 544# else
536 sprintf(Buffer, "SunOS"); 545 sprintf(Buffer, "SunOS");
537# endif 546# endif
538#elif defined(hpux) || defined(__hpux) || defined(__hpux__) 547#elif defined(hpux) || defined(__hpux) || defined(__hpux__)
539 sprintf(Buffer, "HP-UX"); 548 sprintf(Buffer, "HP-UX");
540#elif defined(ultrix) || defined(__ultrix) || defined(__ultrix__) 549#elif defined(ultrix) || defined(__ultrix) || defined(__ultrix__)
541 sprintf(Buffer, "DEC Ultrix"); 550 sprintf(Buffer, "DEC Ultrix");
542#elif defined(sgi) || defined(__sgi) 551#elif defined(sgi) || defined(__sgi)
543 sprintf(Buffer, "SGI Irix"); 552 sprintf(Buffer, "SGI Irix");
544#elif defined(__osf__) 553#elif defined(__osf__)
545 sprintf(Buffer, "OSF Unix"); 554 sprintf(Buffer, "OSF Unix");
546#elif defined(bsdi) || defined(__bsdi__) 555#elif defined(bsdi) || defined(__bsdi__)
547 sprintf(Buffer, "BSDI Unix"); 556 sprintf(Buffer, "BSDI Unix");
548#elif defined(_AIX) 557#elif defined(_AIX)
549 sprintf(Buffer, "AIX Unix"); 558 sprintf(Buffer, "AIX Unix");
550#elif defined(_UNIXWARE) 559#elif defined(_UNIXWARE)
551 sprintf(Buffer, "SCO Unixware"); 560 sprintf(Buffer, "SCO Unixware");
552#elif defined(DGUX) 561#elif defined(DGUX)
553 sprintf(Buffer, "DG Unix"); 562 sprintf(Buffer, "DG Unix");
554#elif defined(__QNX__) 563#elif defined(__QNX__)
555 sprintf(Buffer, "QNX"); 564 sprintf(Buffer, "QNX");
556#endif 565#endif
557 return Buffer; 566 return Buffer;
558} 567}
559 568
560char *GetCompiler(void) 569char *GetCompiler(void)
561{ 570{
562 static char Buffer[100] = {0x00}; 571 static char Buffer[100] = {0x00};
563 572
564#ifdef WIN32 573#ifdef WIN32
565# ifdef _MSC_VER 574# ifdef _MSC_VER
566 if (_MSC_VER == 1200) { //? 575 if (_MSC_VER == 1200) { //?
567 sprintf(Buffer, "MS VC 6.0"); 576 sprintf(Buffer, "MS VC 6.0");
568 } else if (_MSC_VER == 1300) { 577 } else if (_MSC_VER == 1300) {
569 sprintf(Buffer, "MS VC .NET 2002"); 578 sprintf(Buffer, "MS VC .NET 2002");
570 } else if (_MSC_VER == 1310) { 579 } else if (_MSC_VER == 1310) {
571 sprintf(Buffer, "MS VC .NET 2003"); 580 sprintf(Buffer, "MS VC .NET 2003");
diff --git a/gammu/emb/common/misc/misc.h b/gammu/emb/common/misc/misc.h
index 8b46170..c461001 100644
--- a/gammu/emb/common/misc/misc.h
+++ b/gammu/emb/common/misc/misc.h
@@ -1,53 +1,57 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2 2
3#ifndef __misc_h 3#ifndef __misc_h
4#define __misc_h 4#define __misc_h
5 5
6#if defined(_MSC_VER) && defined(__cplusplus)
7 extern "C" {
8#endif
9
6#include <stdio.h> 10#include <stdio.h>
7#include <time.h> 11#include <time.h>
8#ifdef WIN32 12#ifdef WIN32
9# include <windows.h> 13# include <windows.h>
10#endif 14#endif
11 15
12#include "../config.h" 16#include "../config.h"
13 17
14#ifndef __cplusplus 18#ifndef __cplusplus
15#ifndef false 19#ifndef false
16# define false 0 20# define false 0
17#endif 21#endif
18#ifndef true 22#ifndef true
19 # define true !0 23 # define true !0
20#endif 24#endif
21#ifndef bool 25#ifndef bool
22 # define boolchar 26 # define boolchar
23#endif 27#endif
24#endif /* __cplusplus */ 28#endif /* __cplusplus */
25 29
26#ifdef WIN32 30#ifdef WIN32
27# define my_sleep(x) ((x)<1000 ? Sleep(1) : Sleep((x)/1000)) 31# define my_sleep(x) ((x)<1000 ? Sleep(1) : Sleep((x)/1000))
28#else 32#else
29# define my_sleep(x) usleep(x) 33# define my_sleep(x) usleep(x)
30#endif 34#endif
31 35
32#undef MAX 36#undef MAX
33#define MAX(a,b) ((a)>(b) ? (a) : (b)) 37#define MAX(a,b) ((a)>(b) ? (a) : (b))
34#undef MIN 38#undef MIN
35#define MIN(a,b) ((a)<(b) ? (a) : (b)) 39#define MIN(a,b) ((a)<(b) ? (a) : (b))
36 40
37/* ------------------------------------------------------------------------- */ 41/* ------------------------------------------------------------------------- */
38 42
39#define MAX_LINES 50 43#define MAX_LINES 50
40 44
41int GetLine(FILE *File, char *Line, int count); 45int GetLine(FILE *File, char *Line, int count);
42 46
43typedef struct { 47typedef struct {
44 int numbers[MAX_LINES*2]; 48 int numbers[MAX_LINES*2];
45} GSM_Lines; 49} GSM_Lines;
46 50
47void SplitLines(unsigned char *message, int messagesize, GSM_Lines *lines, unsigned char *whitespaces, int spaceslen, bool eot); 51void SplitLines(unsigned char *message, int messagesize, GSM_Lines *lines, unsigned char *whitespaces, int spaceslen, bool eot);
48char *GetLineString(unsigned char *message, GSM_Lines lines, int start); 52char *GetLineString(unsigned char *message, GSM_Lines lines, int start);
49void CopyLineString(unsigned char *dest, unsigned char *src, GSM_Lines lines, int start); 53void CopyLineString(unsigned char *dest, unsigned char *src, GSM_Lines lines, int start);
50 54
51/* ------------------------------------------------------------------------- */ 55/* ------------------------------------------------------------------------- */
52 56
53typedef enum { 57typedef enum {
@@ -85,53 +89,57 @@ int dbgprintf(const char *format, ...);
85#ifdef __GNUC__ 89#ifdef __GNUC__
86__attribute__((format(printf, 3, 4))) 90__attribute__((format(printf, 3, 4)))
87#endif 91#endif
88int smfprintf(FILE *f, Debug_Level dl, const char *format, ...); 92int smfprintf(FILE *f, Debug_Level dl, const char *format, ...);
89 93
90void DumpMessage(FILE *df, Debug_Level dl, const unsigned char *message, int messagesize); 94void DumpMessage(FILE *df, Debug_Level dl, const unsigned char *message, int messagesize);
91 95
92bool GSM_SetDebugLevel(char *info, Debug_Info *di); 96bool GSM_SetDebugLevel(char *info, Debug_Info *di);
93 97
94/* ------------------------------------------------------------------------- */ 98/* ------------------------------------------------------------------------- */
95 99
96/** 100/**
97 * Structure used for saving date and time 101 * Structure used for saving date and time
98 */ 102 */
99typedef struct { 103typedef struct {
100 /** 104 /**
101 * The difference between local time and GMT in hours 105 * The difference between local time and GMT in hours
102 */ 106 */
103 int Timezone; 107 int Timezone;
104 108
105 unsigned int Second; 109 unsigned int Second;
106 unsigned int Minute; 110 unsigned int Minute;
107 unsigned int Hour; 111 unsigned int Hour;
108 112
109 unsigned int Day; 113 unsigned int Day;
110 /** 114 /**
111 * January = 1, February = 2, etc. 115 * January = 1, February = 2, etc.
112 */ 116 */
113 unsigned int Month; 117 unsigned int Month;
114 /** 118 /**
115 * Complete year number. Not 03, but 2003 119 * Complete year number. Not 03, but 2003
116 */ 120 */
117 unsigned int Year; 121 unsigned int Year;
118} GSM_DateTime; 122} GSM_DateTime;
119 123
120 void GSM_GetCurrentDateTime (GSM_DateTime *Date); 124 void GSM_GetCurrentDateTime (GSM_DateTime *Date);
121 char *OSDateTime (GSM_DateTime dt, bool TimeZone); 125 char *OSDateTime (GSM_DateTime dt, bool TimeZone);
122 char *OSDate (GSM_DateTime dt); 126 char *OSDate (GSM_DateTime dt);
123 char *DayOfWeek (int year, int month, int day); 127 char *DayOfWeek (int year, int month, int day);
124 time_t Fill_Time_T (GSM_DateTime DT, int TZ); 128 time_t Fill_Time_T (GSM_DateTime DT, int TZ);
125 void GetTimeDifference (unsigned long diff, GSM_DateTime *DT, bool Plus, int multi); 129 void GetTimeDifference (unsigned long diff, GSM_DateTime *DT, bool Plus, int multi);
126 void Fill_GSM_DateTime (GSM_DateTime *Date, time_t timet); 130 void Fill_GSM_DateTime (GSM_DateTime *Date, time_t timet);
127 bool CheckDate (GSM_DateTime *date); 131 bool CheckDate (GSM_DateTime *date);
128 bool CheckTime (GSM_DateTime *date); 132 bool CheckTime (GSM_DateTime *date);
129 133
130 char *GetCompiler(void); 134 char *GetCompiler(void);
131 char *GetOS(void); 135 char *GetOS(void);
132 136
137#if defined(_MSC_VER) && defined(__cplusplus)
138 }
139#endif
140
133#endif 141#endif
134 142
135/* How should editor hadle tabs in this file? Add editor commands here. 143/* How should editor hadle tabs in this file? Add editor commands here.
136 * vim: noexpandtab sw=8 ts=8 sts=8: 144 * vim: noexpandtab sw=8 ts=8 sts=8:
137 */ 145 */
diff --git a/gammu/emb/common/phone/alcatel/alcatel.c b/gammu/emb/common/phone/alcatel/alcatel.c
index f004ad4..3821f13 100644
--- a/gammu/emb/common/phone/alcatel/alcatel.c
+++ b/gammu/emb/common/phone/alcatel/alcatel.c
@@ -1,494 +1,495 @@
1/* (c) 2002-2004 by Michal Cihar */ 1/* (c) 2002-2004 by Michal Cihar */
2 2
3/* 3/*
4 * High level functions for communication with Alcatel One Touch 501 and 4 * High level functions for communication with Alcatel One Touch 501 and
5 * compatible mobile phone. 5 * compatible mobile phone.
6 * 6 *
7 * This code implements functions to communicate with Alcatel phones, 7 * This code implements functions to communicate with Alcatel phones,
8 * currently seem to work: 8 * currently seem to work:
9 * - BE5 series (501/701) 9 * - BE5 series (501/701)
10 * - BF5 series (715) 10 * - BF5 series (715)
11 * - BH4 series (535/735) 11 * - BH4 series (535/735)
12 * For some functions it uses normal AT mode (not implemented here, look at 12 * For some functions it uses normal AT mode (not implemented here, look at
13 * ../at/atgen.[ch]) for others it switches into binary mode and initialises 13 * ../at/atgen.[ch]) for others it switches into binary mode and initialises
14 * underlaying protocol (see ../../protocol/alcatel/alcabus.[ch]) and 14 * underlaying protocol (see ../../protocol/alcatel/alcabus.[ch]) and
15 * communicates over it. Don't ask me why Alcatel uses such silly thing... 15 * communicates over it. Don't ask me why Alcatel uses such silly thing...
16 * 16 *
17 * Notes for future features: 17 * Notes for future features:
18 * - max phone number length is 61 (BE5) 18 * - max phone number length is 61 (BE5)
19 * - max name length is 50 (BE5) 19 * - max name length is 50 (BE5)
20 */ 20 */
21 21
22#include "../../gsmstate.h" 22#include "../../gsmstate.h"
23 23
24#ifdef GSM_ENABLE_ALCATEL 24#ifdef GSM_ENABLE_ALCATEL
25#ifdef GSM_ENABLE_ATGEN 25#ifdef GSM_ENABLE_ATGEN
26 26
27#include <string.h> 27#include <string.h>
28#include <time.h> 28#include <time.h>
29 29
30#include "../../gsmcomon.h" 30#include "../../gsmcomon.h"
31#include "../../misc/coding/coding.h" 31#include "../../misc/coding/coding.h"
32#include "../../misc/misc.h" 32#include "../../misc/misc.h"
33#include "../../service/sms/gsmsms.h" 33#include "../../service/sms/gsmsms.h"
34#include "../pfunc.h" 34#include "../pfunc.h"
35#include "alcatel.h" 35#include "alcatel.h"
36 36
37/* Timeout for GSM_WaitFor calls. */ 37/* Timeout for GSM_WaitFor calls. */
38 #define ALCATEL_TIMEOUT 64 38 #define ALCATEL_TIMEOUT 64
39 39
40/* Some magic numbers for protocol follow */ 40/* Some magic numbers for protocol follow */
41 41
42/* synchronisation types (for everything except begin transfer): */ 42/* synchronisation types (for everything except begin transfer): */
43 #define ALCATEL_SYNC_TYPE_CALENDAR0x64 43 #define ALCATEL_SYNC_TYPE_CALENDAR0x64
44 #define ALCATEL_SYNC_TYPE_TODO 0x68 44 #define ALCATEL_SYNC_TYPE_TODO 0x68
45 #define ALCATEL_SYNC_TYPE_CONTACTS0x6C 45 #define ALCATEL_SYNC_TYPE_CONTACTS0x6C
46 46
47/* synchronisation types (for begin transfer): */ 47/* synchronisation types (for begin transfer): */
48 #define ALCATEL_BEGIN_SYNC_CALENDAR0x00 48 #define ALCATEL_BEGIN_SYNC_CALENDAR0x00
49 #define ALCATEL_BEGIN_SYNC_TODO 0x02 49 #define ALCATEL_BEGIN_SYNC_TODO 0x02
50 #define ALCATEL_BEGIN_SYNC_CONTACTS0x01 50 #define ALCATEL_BEGIN_SYNC_CONTACTS0x01
51 51
52/* category types */ 52/* category types */
53 #define ALCATEL_LIST_TODO_CAT 0x9B 53 #define ALCATEL_LIST_TODO_CAT 0x9B
54 #define ALCATEL_LIST_CONTACTS_CAT0x96 54 #define ALCATEL_LIST_CONTACTS_CAT0x96
55 55
56 56
57/* We need lot of ATGEN functions, because Alcatel is an AT device. */ 57/* We need lot of ATGEN functions, because Alcatel is an AT device. */
58 58
59extern GSM_Reply_Function ALCATELReplyFunctions[]; 59extern GSM_Reply_Function ALCATELReplyFunctions[];
60extern GSM_Reply_Function ATGENReplyFunctions[]; 60extern GSM_Reply_Function ATGENReplyFunctions[];
61 61
62 extern GSM_Error ATGEN_Initialise (GSM_StateMachine *s); 62 extern GSM_Error ATGEN_Initialise (GSM_StateMachine *s);
63 extern GSM_Error ATGEN_Terminate (GSM_StateMachine *s); 63 extern GSM_Error ATGEN_Terminate (GSM_StateMachine *s);
64 extern GSM_Error ATGEN_GetIMEI (GSM_StateMachine *s); 64 extern GSM_Error ATGEN_GetIMEI (GSM_StateMachine *s);
65 extern GSM_Error ATGEN_GetFirmware (GSM_StateMachine *s); 65 extern GSM_Error ATGEN_GetFirmware (GSM_StateMachine *s);
66 extern GSM_Error ATGEN_GetModel (GSM_StateMachine *s); 66 extern GSM_Error ATGEN_GetModel (GSM_StateMachine *s);
67 extern GSM_Error ATGEN_GetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time); 67 extern GSM_Error ATGEN_GetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time);
68 extern GSM_Error ATGEN_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry); 68 extern GSM_Error ATGEN_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
69 extern GSM_Error ATGEN_GetNextMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry, bool start); 69 extern GSM_Error ATGEN_GetNextMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry, bool start);
70 extern GSM_Error ATGEN_SetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry); 70 extern GSM_Error ATGEN_SetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
71 extern GSM_Error ATGEN_AddMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry); 71 extern GSM_Error ATGEN_AddMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
72 extern GSM_Error ATGEN_DeleteMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry); 72 extern GSM_Error ATGEN_DeleteMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
73 extern GSM_Error ATGEN_GetMemoryStatus (GSM_StateMachine *s, GSM_MemoryStatus *Status); 73 extern GSM_Error ATGEN_GetMemoryStatus (GSM_StateMachine *s, GSM_MemoryStatus *Status);
74 extern GSM_Error ATGEN_GetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc); 74 extern GSM_Error ATGEN_GetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc);
75 extern GSM_Error ATGEN_SetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc); 75 extern GSM_Error ATGEN_SetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc);
76 extern GSM_Error ATGEN_GetSMSFolders (GSM_StateMachine *s, GSM_SMSFolders *folders); 76 extern GSM_Error ATGEN_GetSMSFolders (GSM_StateMachine *s, GSM_SMSFolders *folders);
77 extern GSM_Error ATGEN_GetSMSStatus (GSM_StateMachine *s, GSM_SMSMemoryStatus *status); 77 extern GSM_Error ATGEN_GetSMSStatus (GSM_StateMachine *s, GSM_SMSMemoryStatus *status);
78 extern GSM_Error ATGEN_GetSMS (GSM_StateMachine *s, GSM_MultiSMSMessage *sms); 78 extern GSM_Error ATGEN_GetSMS (GSM_StateMachine *s, GSM_MultiSMSMessage *sms);
79 extern GSM_Error ATGEN_GetNextSMS (GSM_StateMachine *s, GSM_MultiSMSMessage *sms, bool start); 79 extern GSM_Error ATGEN_GetNextSMS (GSM_StateMachine *s, GSM_MultiSMSMessage *sms, bool start);
80 extern GSM_Error ATGEN_SendSavedSMS (GSM_StateMachine *s, int Folder, int Location); 80 extern GSM_Error ATGEN_SendSavedSMS (GSM_StateMachine *s, int Folder, int Location);
81 extern GSM_Error ATGEN_SendSMS (GSM_StateMachine *s, GSM_SMSMessage *sms); 81 extern GSM_Error ATGEN_SendSMS (GSM_StateMachine *s, GSM_SMSMessage *sms);
82 extern GSM_Error ATGEN_DeleteSMS (GSM_StateMachine *s, GSM_SMSMessage *sms); 82 extern GSM_Error ATGEN_DeleteSMS (GSM_StateMachine *s, GSM_SMSMessage *sms);
83 extern GSM_Error ATGEN_AddSMS (GSM_StateMachine *s, GSM_SMSMessage *sms); 83 extern GSM_Error ATGEN_AddSMS (GSM_StateMachine *s, GSM_SMSMessage *sms);
84 extern GSM_Error ATGEN_GetBatteryCharge (GSM_StateMachine *s, GSM_BatteryCharge *bat); 84 extern GSM_Error ATGEN_GetBatteryCharge (GSM_StateMachine *s, GSM_BatteryCharge *bat);
85 extern GSM_Error ATGEN_GetSignalQuality (GSM_StateMachine *s, GSM_SignalQuality *sig); 85 extern GSM_Error ATGEN_GetSignalQuality (GSM_StateMachine *s, GSM_SignalQuality *sig);
86 extern GSM_Error ATGEN_DialVoice (GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber); 86 extern GSM_Error ATGEN_DialVoice (GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber);
87 extern GSM_Error ATGEN_AnswerCall (GSM_StateMachine *s, int ID, bool all); 87 extern GSM_Error ATGEN_AnswerCall (GSM_StateMachine *s, int ID, bool all);
88 extern GSM_Error ATGEN_CancelCall (GSM_StateMachine *s, int ID, bool all); 88 extern GSM_Error ATGEN_CancelCall (GSM_StateMachine *s, int ID, bool all);
89 extern GSM_Error ATGEN_SetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time); 89 extern GSM_Error ATGEN_SetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time);
90 extern GSM_Error ATGEN_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode Code); 90 extern GSM_Error ATGEN_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode Code);
91 extern GSM_Error ATGEN_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status); 91 extern GSM_Error ATGEN_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status);
92 extern GSM_Error ATGEN_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type); 92 extern GSM_Error ATGEN_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type);
93 extern GSM_Error ATGEN_SendDTMF (GSM_StateMachine *s, char *sequence); 93 extern GSM_Error ATGEN_SendDTMF (GSM_StateMachine *s, char *sequence);
94 extern GSM_Error ATGEN_GetSIMIMSI (GSM_StateMachine *s, char *IMSI); 94 extern GSM_Error ATGEN_GetSIMIMSI (GSM_StateMachine *s, char *IMSI);
95 extern GSM_Error ATGEN_HandleCMSError (GSM_StateMachine *s); 95 extern GSM_Error ATGEN_HandleCMSError (GSM_StateMachine *s);
96 extern GSM_Error ATGEN_GetNetworkInfo (GSM_StateMachine *s, GSM_NetworkInfo *netinfo); 96 extern GSM_Error ATGEN_GetNetworkInfo (GSM_StateMachine *s, GSM_NetworkInfo *netinfo);
97 extern GSM_Error ATGEN_Reset (GSM_StateMachine *s, bool hard); 97 extern GSM_Error ATGEN_Reset (GSM_StateMachine *s, bool hard);
98 extern GSM_Error ATGEN_PressKey (GSM_StateMachine *s, GSM_KeyCode Key, bool Press); 98 extern GSM_Error ATGEN_PressKey (GSM_StateMachine *s, GSM_KeyCode Key, bool Press);
99 extern GSM_Error ATGEN_GetDisplayStatus (GSM_StateMachine *s, GSM_DisplayFeatures *features); 99 extern GSM_Error ATGEN_GetDisplayStatus (GSM_StateMachine *s, GSM_DisplayFeatures *features);
100 extern GSM_Error ATGEN_SetAutoNetworkLogin(GSM_StateMachine *s); 100 extern GSM_Error ATGEN_SetAutoNetworkLogin(GSM_StateMachine *s);
101 extern GSM_Error ATGEN_DeleteAllMemory (GSM_StateMachine *s, GSM_MemoryType type); 101 extern GSM_Error ATGEN_DeleteAllMemory (GSM_StateMachine *s, GSM_MemoryType type);
102 102
103 extern GSM_Error ATGEN_DispatchMessage (GSM_StateMachine *s); 103 extern GSM_Error ATGEN_DispatchMessage (GSM_StateMachine *s);
104 extern GSM_Error ATGEN_SetFastSMSSending(GSM_StateMachine *s, bool enable);
104 extern GSM_Error ATGEN_SetIncomingCB (GSM_StateMachine *s, bool enable); 105 extern GSM_Error ATGEN_SetIncomingCB (GSM_StateMachine *s, bool enable);
105 extern GSM_Error ATGEN_SetIncomingSMS (GSM_StateMachine *s, bool enable); 106 extern GSM_Error ATGEN_SetIncomingSMS (GSM_StateMachine *s, bool enable);
106 107
107/** 108/**
108 * Alcatel uses some 8-bit characters in contacts, calendar etc.. This table 109 * Alcatel uses some 8-bit characters in contacts, calendar etc.. This table
109 * attempts to decode it, it is probably not complete, here are just chars 110 * attempts to decode it, it is probably not complete, here are just chars
110 * that I found... 111 * that I found...
111 */ 112 */
112unsigned char GSM_AlcatelAlphabet[] = 113unsigned char GSM_AlcatelAlphabet[] =
113{ 114{
114 /* in phone unicode description*/ 115 /* in phone unicode description*/
115 0x80, 0x00,0x20, /* empty */ 116 0x80, 0x00,0x20, /* empty */
116 0x81, 0x00,0x20, /* empty*/ 117 0x81, 0x00,0x20, /* empty*/
117 0x82, 0x00,0x20, /* empty*/ 118 0x82, 0x00,0x20, /* empty*/
118 0x83, 0x00,0x20, /* empty*/ 119 0x83, 0x00,0x20, /* empty*/
119 120
120 0x84, 0x00,0xe7, /* c cedilla*/ 121 0x84, 0x00,0xe7, /* c cedilla*/
121 0x85, 0x20,0x26, /* ... */ 122 0x85, 0x20,0x26, /* ... */
122 0x86, 0x03,0xc0, /* pi */ 123 0x86, 0x03,0xc0, /* pi */
123 0x87, 0x01,0x3e, /* l caron*/ 124 0x87, 0x01,0x3e, /* l caron*/
124 0x88, 0x00,0xc0, /* A grave*/ 125 0x88, 0x00,0xc0, /* A grave*/
125 0x89, 0x00,0xc1, /* A acute*/ 126 0x89, 0x00,0xc1, /* A acute*/
126 0x8a, 0x00,0xc2, /* A circumflex*/ 127 0x8a, 0x00,0xc2, /* A circumflex*/
127 0x8b, 0x00,0xc3, /* A tilde*/ 128 0x8b, 0x00,0xc3, /* A tilde*/
128 0x8c, 0x00,0xc8, /* E grave*/ 129 0x8c, 0x00,0xc8, /* E grave*/
129 0x8d, 0x00,0xca, /* E circumflex*/ 130 0x8d, 0x00,0xca, /* E circumflex*/
130 0x8e, 0x00,0xcb, /* E diaresis*/ 131 0x8e, 0x00,0xcb, /* E diaresis*/
131 0x8f, 0x00,0xcc, /* I grave*/ 132 0x8f, 0x00,0xcc, /* I grave*/
132 0x90, 0x00,0xcd, /* I acute*/ 133 0x90, 0x00,0xcd, /* I acute*/
133 0x91, 0x00,0xd0, /* ETH */ 134 0x91, 0x00,0xd0, /* ETH */
134 0x92, 0x00,0xd2, /* O grave*/ 135 0x92, 0x00,0xd2, /* O grave*/
135 0x93, 0x00,0xd3, /* O acute*/ 136 0x93, 0x00,0xd3, /* O acute*/
136 0x94, 0x00,0xd4, /* O circumflex*/ 137 0x94, 0x00,0xd4, /* O circumflex*/
137 0x95, 0x00,0xd5, /* O tilde*/ 138 0x95, 0x00,0xd5, /* O tilde*/
138 0x96, 0x00,0xd9, /* U grave*/ 139 0x96, 0x00,0xd9, /* U grave*/
139 0x97, 0x00,0xda, /* U acute*/ 140 0x97, 0x00,0xda, /* U acute*/
140 0x98, 0x00,0xe1, /* a acute*/ 141 0x98, 0x00,0xe1, /* a acute*/
141 0x99, 0x00,0xe2, /* a circumflex*/ 142 0x99, 0x00,0xe2, /* a circumflex*/
142 0x9a, 0x00,0xe3, /* a tilde*/ 143 0x9a, 0x00,0xe3, /* a tilde*/
143 0x9b, 0x00,0xea, /* e circumflex*/ 144 0x9b, 0x00,0xea, /* e circumflex*/
144 0x9c, 0x00,0xeb, /* e diaresis*/ 145 0x9c, 0x00,0xeb, /* e diaresis*/
145 0x9d, 0x00,0xed, /* i acute*/ 146 0x9d, 0x00,0xed, /* i acute*/
146 0x9e, 0x00,0xee, /* i circumflex*/ 147 0x9e, 0x00,0xee, /* i circumflex*/
147 0x9f, 0x00,0xef, /* i diaresis*/ 148 0x9f, 0x00,0xef, /* i diaresis*/
148 0xa0, 0x00,0xf3, /* o acute*/ 149 0xa0, 0x00,0xf3, /* o acute*/
149 0xa1, 0x00,0xf4, /* o circumflex*/ 150 0xa1, 0x00,0xf4, /* o circumflex*/
150 0xa2, 0x00,0xf5, /* o tilde*/ 151 0xa2, 0x00,0xf5, /* o tilde*/
151 0xa3, 0x00,0xfa, /* u acute*/ 152 0xa3, 0x00,0xfa, /* u acute*/
152 0xa4, 0x00,0xa2, /* cent */ 153 0xa4, 0x00,0xa2, /* cent */
153 0xa5, 0x00,0x5b, /* [ */ 154 0xa5, 0x00,0x5b, /* [ */
154 0xa6, 0x01,0x59, /* r caron*/ 155 0xa6, 0x01,0x59, /* r caron*/
155 0xa7, 0x01,0x0d, /* c caron*/ 156 0xa7, 0x01,0x0d, /* c caron*/
156 0xa8, 0x01,0x61, /* s caron*/ 157 0xa8, 0x01,0x61, /* s caron*/
157 0xa9, 0x01,0x1b, /* e caron*/ 158 0xa9, 0x01,0x1b, /* e caron*/
158 0xaa, 0x01,0x6f, /* u ring*/ 159 0xaa, 0x01,0x6f, /* u ring*/
159 0xab, 0x00,0xfd, /* y acute*/ 160 0xab, 0x00,0xfd, /* y acute*/
160 0xac, 0x00,0xf0, /* eth */ 161 0xac, 0x00,0xf0, /* eth */
161 0xad, 0x01,0x07, /* c acute*/ 162 0xad, 0x01,0x07, /* c acute*/
162 0xae, 0x01,0x19, /* e ogonek*/ 163 0xae, 0x01,0x19, /* e ogonek*/
163 0xaf, 0x01,0x05, /* a ogonek*/ 164 0xaf, 0x01,0x05, /* a ogonek*/
164 0xb0, 0x01,0x7c, /* z dot*/ 165 0xb0, 0x01,0x7c, /* z dot*/
165 0xb1, 0x01,0x7a, /* z acute*/ 166 0xb1, 0x01,0x7a, /* z acute*/
166 0xb2, 0x01,0x5b, /* s acute*/ 167 0xb2, 0x01,0x5b, /* s acute*/
167 0xb3, 0x01,0x44, /* n acute*/ 168 0xb3, 0x01,0x44, /* n acute*/
168 0xb4, 0x01,0x42, /* l stroke*/ 169 0xb4, 0x01,0x42, /* l stroke*/
169 170
170 0xb5, 0x00,0x20, /* empty*/ 171 0xb5, 0x00,0x20, /* empty*/
171 172
172 0xb6, 0x01,0x48, /* n caron*/ 173 0xb6, 0x01,0x48, /* n caron*/
173 0xb7, 0x01,0x65, /* t caron*/ 174 0xb7, 0x01,0x65, /* t caron*/
174 175
175 0xb8, 0x00,0x20, /* empty*/ 176 0xb8, 0x00,0x20, /* empty*/
176 177
177 0xb9, 0x01,0x7e, /* z caron*/ 178 0xb9, 0x01,0x7e, /* z caron*/
178 0xba, 0x01,0xe7, /* g caron*/ 179 0xba, 0x01,0xe7, /* g caron*/
179 180
180 0xbb, 0x00,0x20, /* empty*/ 181 0xbb, 0x00,0x20, /* empty*/
181 0xbc, 0x00,0x20, /* empty*/ 182 0xbc, 0x00,0x20, /* empty*/
182 183
183 0xbd, 0x1e,0x20, /* G macron*/ 184 0xbd, 0x1e,0x20, /* G macron*/
184 0xbe, 0x1e,0x21, /* g macron*/ 185 0xbe, 0x1e,0x21, /* g macron*/
185 0xbf, 0x01,0x5e, /* S cedilla*/ 186 0xbf, 0x01,0x5e, /* S cedilla*/
186 0xc0, 0x01,0x5f, /* s cedilla*/ 187 0xc0, 0x01,0x5f, /* s cedilla*/
187 0xc1, 0x01,0x2f, /* i ogonek*/ /* FIXME: not sure with this, it look like normal i */ 188 0xc1, 0x01,0x2f, /* i ogonek*/ /* FIXME: not sure with this, it look like normal i */
188 0xc2, 0x01,0x31, /* i dotless*/ 189 0xc2, 0x01,0x31, /* i dotless*/
189 0xc3, 0x01,0x68, /* U tilde*/ 190 0xc3, 0x01,0x68, /* U tilde*/
190 0xc4, 0x01,0x50, /* O dbl acute*/ 191 0xc4, 0x01,0x50, /* O dbl acute*/
191 0xc5, 0x01,0x69, /* u tilde*/ 192 0xc5, 0x01,0x69, /* u tilde*/
192 0xc6, 0x01,0x51, /* o dbl acute*/ 193 0xc6, 0x01,0x51, /* o dbl acute*/
193 0xc7, 0x27,0xa9, /* => */ 194 0xc7, 0x27,0xa9, /* => */
194 0xc8, 0x27,0xa8, /* filled =>*/ 195 0xc8, 0x27,0xa8, /* filled =>*/
195 0xc9, 0x00,0xd7, /* x */ 196 0xc9, 0x00,0xd7, /* x */
196 0xca, 0x00,0x5d, /* ] */ 197 0xca, 0x00,0x5d, /* ] */
197 0xcb, 0x26,0x0f, /* phone*/ 198 0xcb, 0x26,0x0f, /* phone*/
198 0xcc, 0x01,0x0f, /* d caron*/ 199 0xcc, 0x01,0x0f, /* d caron*/
199 200
200 0xcd, 0x00,0x20, /* empty*/ 201 0xcd, 0x00,0x20, /* empty*/
201 202
202 0xce, 0x00,0x7e, /* ~ */ 203 0xce, 0x00,0x7e, /* ~ */
203 0xcf, 0x00,0x5c, /* \ */ 204 0xcf, 0x00,0x5c, /* \ */
204 0xd0, 0x00,0x5e, /* ^ */ 205 0xd0, 0x00,0x5e, /* ^ */
205 206
206 0xd1, 0x00,0x20, /* empty*/ 207 0xd1, 0x00,0x20, /* empty*/
207 208
208 0xd2, 0x00,0x7b, /* { */ 209 0xd2, 0x00,0x7b, /* { */
209 0xd3, 0x00,0x7c, /* | */ 210 0xd3, 0x00,0x7c, /* | */
210 0xd4, 0x00,0x7d, /* } */ 211 0xd4, 0x00,0x7d, /* } */
211 212
212 0xd5, 0x00,0x20, /* empty*/ 213 0xd5, 0x00,0x20, /* empty*/
213 214
214 0xd6, 0x01,0x63, /* t cedilla*/ 215 0xd6, 0x01,0x63, /* t cedilla*/
215 216
216 0xd7, 0x00,0x20, /* empty*/ 217 0xd7, 0x00,0x20, /* empty*/
217 0xd8, 0x00,0x20, /* empty*/ 218 0xd8, 0x00,0x20, /* empty*/
218 0xd9, 0x00,0x20, /* empty*/ 219 0xd9, 0x00,0x20, /* empty*/
219 0xda, 0x00,0x20, /* empty*/ 220 0xda, 0x00,0x20, /* empty*/
220 0xdb, 0x00,0x20, /* empty*/ 221 0xdb, 0x00,0x20, /* empty*/
221 0xdc, 0x00,0x20, /* empty*/ 222 0xdc, 0x00,0x20, /* empty*/
222 0xdd, 0x00,0x20, /* empty*/ 223 0xdd, 0x00,0x20, /* empty*/
223 0xde, 0x00,0x20, /* empty*/ 224 0xde, 0x00,0x20, /* empty*/
224 0xdf, 0x00,0x20, /* empty*/ 225 0xdf, 0x00,0x20, /* empty*/
225 0xe0, 0x00,0x20, /* empty*/ 226 0xe0, 0x00,0x20, /* empty*/
226 227
227 0xe1, 0x00,0x20, /* two candles*/ /* FIXME */ 228 0xe1, 0x00,0x20, /* two candles*/ /* FIXME */
228 229
229 0xe2, 0x00,0x20, /* empty*/ 230 0xe2, 0x00,0x20, /* empty*/
230 0xe3, 0x00,0x20, /* empty*/ 231 0xe3, 0x00,0x20, /* empty*/
231 0xe4, 0x00,0x20, /* empty*/ 232 0xe4, 0x00,0x20, /* empty*/
232 233
233 0xe5, 0x01,0xce, /* a caron*/ 234 0xe5, 0x01,0xce, /* a caron*/
234 0xe6, 0x01,0x01, /* a macron*/ 235 0xe6, 0x01,0x01, /* a macron*/
235 0xe7, 0x01,0x13, /* e macron*/ 236 0xe7, 0x01,0x13, /* e macron*/
236 0xe8, 0x01,0x2b, /* i macron*/ 237 0xe8, 0x01,0x2b, /* i macron*/
237 0xe9, 0x01,0x4d, /* o macron*/ 238 0xe9, 0x01,0x4d, /* o macron*/
238 0xea, 0x01,0x6b, /* u macron*/ 239 0xea, 0x01,0x6b, /* u macron*/
239 0xeb, 0x00,0x41, /* A */ 240 0xeb, 0x00,0x41, /* A */
240 0xec, 0x00,0x40, /* @ */ 241 0xec, 0x00,0x40, /* @ */
241 0xed, 0x00,0x20,/* some strange char :-) */ /* FIXME */ 242 0xed, 0x00,0x20,/* some strange char :-) */ /* FIXME */
242 243
243 0xee, 0x00,0x20, /* big key stroken*/ /* FIXME */ 244 0xee, 0x00,0x20, /* big key stroken*/ /* FIXME */
244 0xef, 0x00,0x20, /* big key*/ /* FIXME */ 245 0xef, 0x00,0x20, /* big key*/ /* FIXME */
245 246
246 0xf0, 0x00,0x20, /* empty*/ 247 0xf0, 0x00,0x20, /* empty*/
247 248
248 0xf1, 0x00,0x31, /* 1 */ 249 0xf1, 0x00,0x31, /* 1 */
249 0xf2, 0x00,0x21, /* bold !*/ 250 0xf2, 0x00,0x21, /* bold !*/
250 0xf3, 0x26,0x0e, /* black phone*/ 251 0xf3, 0x26,0x0e, /* black phone*/
251 0xf4, 0x00,0x26, /* & */ 252 0xf4, 0x00,0x26, /* & */
252 0xf5, 0x23,0x7e, /* bell */ 253 0xf5, 0x23,0x7e, /* bell */
253 0xf6, 0x26,0x6a, /* note */ 254 0xf6, 0x26,0x6a, /* note */
254 255
255 0xf7, 0x27,0x13, /* okay inv*/ /* FIXME */ 256 0xf7, 0x27,0x13, /* okay inv*/ /* FIXME */
256 0xf8, 0x27,0x13, /* okay */ 257 0xf8, 0x27,0x13, /* okay */
257 258
258 0xf9, 0x00,0x20, /* empty*/ 259 0xf9, 0x00,0x20, /* empty*/
259 260
260 0xfa, 0x00,0x20, /* key */ /* FIXME */ 261 0xfa, 0x00,0x20, /* key */ /* FIXME */
261 262
262 0xfb, 0x00,0x20, /* empty*/ 263 0xfb, 0x00,0x20, /* empty*/
263 264
264 0xfc, 0x20,0xac, /* Euro */ 265 0xfc, 0x20,0xac, /* Euro */
265 0xfd, 0x21,0x97, /* NE arrow*/ 266 0xfd, 0x21,0x97, /* NE arrow*/
266 0xfe, 0x21,0x98, /* SE arrow*/ 267 0xfe, 0x21,0x98, /* SE arrow*/
267 268
268 0xff, 0x00,0x20, /* empty*/ 269 0xff, 0x00,0x20, /* empty*/
269 270
270 0x00, 0x00,0x00 271 0x00, 0x00,0x00
271}; 272};
272 273
273/* This is being called from atgen */ 274/* This is being called from atgen */
274 GSM_Error ALCATEL_ProtocolVersionReply(GSM_Protocol_Message msg, GSM_StateMachine *s) 275 GSM_Error ALCATEL_ProtocolVersionReply(GSM_Protocol_Message msg, GSM_StateMachine *s)
275{ 276{
276 char *str, *str2; 277 char *str, *str2;
277/* 278/*
278 * Reply received here looks like: 279 * Reply received here looks like:
279 * 1 "AT+CPROT=?" 280 * 1 "AT+CPROT=?"
280 * 2 "+CPROT: 0,"V1.0",1" 281 * 2 "+CPROT: 0,"V1.0",1"
281 * 3 "+CPROT: 16,"V1.1",16" 282 * 3 "+CPROT: 16,"V1.1",16"
282 * 4 "OK" 283 * 4 "OK"
283 */ 284 */
284 switch (s->Phone.Data.Priv.ATGEN.ReplyState) { 285 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
285 case AT_Reply_OK: 286 case AT_Reply_OK:
286 str = strstr(msg.Buffer, "\"V"); 287 str = strstr(msg.Buffer, "\"V");
287 if (str == NULL) return ERR_UNKNOWNRESPONSE; 288 if (str == NULL) return ERR_UNKNOWNRESPONSE;
288 str += 2; 289 str += 2;
289 while((str2 = strstr(str, "\"V")) != NULL) str = str2 + 2; 290 while((str2 = strstr(str, "\"V")) != NULL) str = str2 + 2;
290 if (strncmp(str, "1.0", 3) == 0) { 291 if (strncmp(str, "1.0", 3) == 0) {
291 s->Phone.Data.Priv.ALCATEL.ProtocolVersion = V_1_0; 292 s->Phone.Data.Priv.ALCATEL.ProtocolVersion = V_1_0;
292 } else if (strncmp(str, "1.1", 3) == 0) { 293 } else if (strncmp(str, "1.1", 3) == 0) {
293 s->Phone.Data.Priv.ALCATEL.ProtocolVersion = V_1_1; 294 s->Phone.Data.Priv.ALCATEL.ProtocolVersion = V_1_1;
294 } else { 295 } else {
295 smprintf(s, "Unknown protocol version. Please send debug log and phone info to author.\n"); 296 smprintf(s, "Unknown protocol version. Please send debug log and phone info to author.\n");
296 return ERR_NOTIMPLEMENTED; 297 return ERR_NOTIMPLEMENTED;
297 } 298 }
298 return ERR_NONE; 299 return ERR_NONE;
299 case AT_Reply_Error: 300 case AT_Reply_Error:
300 case AT_Reply_CMSError: 301 case AT_Reply_CMSError:
301 return ATGEN_HandleCMSError(s); 302 return ATGEN_HandleCMSError(s);
302 default: 303 default:
303 return ERR_UNKNOWNRESPONSE; 304 return ERR_UNKNOWNRESPONSE;
304 } 305 }
305} 306}
306 307
307static GSM_Error ALCATEL_SetBinaryMode(GSM_StateMachine *s) 308static GSM_Error ALCATEL_SetBinaryMode(GSM_StateMachine *s)
308{ 309{
309 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 310 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
310 GSM_Error error; 311 GSM_Error error;
311 312
312 if (Priv->Mode == ModeBinary) return ERR_NONE; 313 if (Priv->Mode == ModeBinary) return ERR_NONE;
313 314
314 dbgprintf ("Changing to binary mode\n"); 315 dbgprintf ("Changing to binary mode\n");
315 316
316 error=GSM_WaitFor (s, "AT+IFC=2,2\r", 11, 0x02, 4, ID_SetFlowControl); 317 error=GSM_WaitFor (s, "AT+IFC=2,2\r", 11, 0x02, 4, ID_SetFlowControl);
317 if (error != ERR_NONE) return error; 318 if (error != ERR_NONE) return error;
318 319
319 error=GSM_WaitFor (s, "AT+CPROT=?\r", 11, 0x02, 4, ID_AlcatelProtocol); 320 error=GSM_WaitFor (s, "AT+CPROT=?\r", 11, 0x02, 4, ID_AlcatelProtocol);
320 if (error != ERR_NONE) return error; 321 if (error != ERR_NONE) return error;
321 322
322 if (Priv->ProtocolVersion == V_1_0) { 323 if (Priv->ProtocolVersion == V_1_0) {
323 error=GSM_WaitFor (s, "AT+CPROT=16,\"V1.0\",16\r", 22, 0x00, 4, ID_AlcatelConnect); 324 error=GSM_WaitFor (s, "AT+CPROT=16,\"V1.0\",16\r", 22, 0x00, 4, ID_AlcatelConnect);
324 } else { 325 } else {
325 error=GSM_WaitFor (s, "AT+CPROT=16,\"V1.1\",16\r", 22, 0x00, 4, ID_AlcatelConnect); 326 error=GSM_WaitFor (s, "AT+CPROT=16,\"V1.1\",16\r", 22, 0x00, 4, ID_AlcatelConnect);
326 } 327 }
327 328
328 if (error == ERR_TIMEOUT && s->Speed != 19200) { 329 if (error == ERR_TIMEOUT && s->Speed != 19200) {
329 smprintf(s, "HINT: Try changing speed to 19200, it is sometimes needed for Alcatel binary mode.\n"); 330 smprintf(s, "HINT: Try changing speed to 19200, it is sometimes needed for Alcatel binary mode.\n");
330 } 331 }
331 332
332 if (error != ERR_NONE) return error; 333 if (error != ERR_NONE) return error;
333 334
334 dbgprintf ("Changing protocol to Alcabus\n"); 335 dbgprintf ("Changing protocol to Alcabus\n");
335 336
336 s->Protocol.Functions = &ALCABUSProtocol; 337 s->Protocol.Functions = &ALCABUSProtocol;
337 error = s->Protocol.Functions->Initialise(s); 338 error = s->Protocol.Functions->Initialise(s);
338 if (error != ERR_NONE) { 339 if (error != ERR_NONE) {
339 s->Protocol.Functions = &ATProtocol; 340 s->Protocol.Functions = &ATProtocol;
340 return error; 341 return error;
341 } 342 }
342 s->Phone.Functions->ReplyFunctions= ALCATELReplyFunctions; 343 s->Phone.Functions->ReplyFunctions= ALCATELReplyFunctions;
343 Priv->Mode = ModeBinary; 344 Priv->Mode = ModeBinary;
344 Priv->BinaryItem = 0; 345 Priv->BinaryItem = 0;
345 Priv->BinaryType = 0; 346 Priv->BinaryType = 0;
346 Priv->BinaryState = StateAttached; 347 Priv->BinaryState = StateAttached;
347 return ERR_NONE; 348 return ERR_NONE;
348} 349}
349 350
350static GSM_Error ALCATEL_GoToBinaryState(GSM_StateMachine *s, GSM_Alcatel_BinaryState state, GSM_Alcatel_BinaryType type, int item) { 351static GSM_Error ALCATEL_GoToBinaryState(GSM_StateMachine *s, GSM_Alcatel_BinaryState state, GSM_Alcatel_BinaryType type, int item) {
351 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 352 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
352 GSM_Error error; 353 GSM_Error error;
353 unsigned char attach_buffer[] = {0x00, 0x00, 0x7C ,0x20}; 354 unsigned char attach_buffer[] = {0x00, 0x00, 0x7C ,0x20};
354 unsigned char detach_buffer[] = {0x00, 0x01, 0x7C ,0x00}; 355 unsigned char detach_buffer[] = {0x00, 0x01, 0x7C ,0x00};
355 unsigned char start_buffer[] = 356 unsigned char start_buffer[] =
356 {0x00, 0x04, 0x7C, 0x80, /* 4 byte database id follows */ 357 {0x00, 0x04, 0x7C, 0x80, /* 4 byte database id follows */
357 0x12, 0x34, 0x56, 0x78}; 358 0x12, 0x34, 0x56, 0x78};
358 unsigned char end_buffer[] = 359 unsigned char end_buffer[] =
359 {0x00, 0x04, 0x7C, 0x82, 360 {0x00, 0x04, 0x7C, 0x82,
360 0x00, /* type */ 361 0x00, /* type */
361 0x00, 0x00, 0x00, 0x00}; /* TimeStamp */ 362 0x00, 0x00, 0x00, 0x00}; /* TimeStamp */
362 unsigned char close_buffer[] = 363 unsigned char close_buffer[] =
363 {0x00, 0x04, 364 {0x00, 0x04,
364 0x00, /*type */ 365 0x00, /*type */
365 0x23, 0x01}; 366 0x23, 0x01};
366 unsigned char select1_buffer[] = 367 unsigned char select1_buffer[] =
367 {0x00, 0x00, 368 {0x00, 0x00,
368 0x00, /*type */ 369 0x00, /*type */
369 0x20}; 370 0x20};
370 unsigned char select2_buffer[] = 371 unsigned char select2_buffer[] =
371 {0x00, 0x04, 372 {0x00, 0x04,
372 0x00, /*type */ 373 0x00, /*type */
373 0x22, 0x01, 0x00}; 374 0x22, 0x01, 0x00};
374 unsigned char begin_buffer[] = 375 unsigned char begin_buffer[] =
375 {0x00, 0x04, 0x7C, 0x81, 376 {0x00, 0x04, 0x7C, 0x81,
376 0x00, /*type */ 377 0x00, /*type */
377 0x00, 0x85, 0x00}; 378 0x00, 0x85, 0x00};
378 unsigned char commit_buffer[] = 379 unsigned char commit_buffer[] =
379 {0x00, 0x04, 380 {0x00, 0x04,
380 0x00, /*type */ 381 0x00, /*type */
381 0x20, 0x01}; 382 0x20, 0x01};
382 383
383 smprintf(s, "Alcatel state switcher: %d -> %d, %d -> %d, %d -> %d\n", Priv->BinaryState, state, Priv->BinaryType, type, Priv->BinaryItem, item); 384 smprintf(s, "Alcatel state switcher: %d -> %d, %d -> %d, %d -> %d\n", Priv->BinaryState, state, Priv->BinaryType, type, Priv->BinaryItem, item);
384 error = ALCATEL_SetBinaryMode(s); 385 error = ALCATEL_SetBinaryMode(s);
385 if (error != ERR_NONE) return error; 386 if (error != ERR_NONE) return error;
386 387
387 /* Do we need to do anything? */ 388 /* Do we need to do anything? */
388 if ((state == Priv->BinaryState) && (type == Priv->BinaryType) && (item == Priv->BinaryItem)) return ERR_NONE; 389 if ((state == Priv->BinaryState) && (type == Priv->BinaryType) && (item == Priv->BinaryItem)) return ERR_NONE;
389 390
390 /* We're editing, but the next state is not the same. so commit editing */ 391 /* We're editing, but the next state is not the same. so commit editing */
391 if (Priv->BinaryState == StateEdit) { 392 if (Priv->BinaryState == StateEdit) {
392 /* Something has changed, we will have to reread fields! */ 393 /* Something has changed, we will have to reread fields! */
393 Priv->CurrentFieldsItem = -1; 394 Priv->CurrentFieldsItem = -1;
394 switch (Priv->BinaryType) { 395 switch (Priv->BinaryType) {
395 case TypeCalendar: 396 case TypeCalendar:
396 commit_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 397 commit_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
397 break; 398 break;
398 case TypeContacts: 399 case TypeContacts:
399 commit_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 400 commit_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
400 break; 401 break;
401 case TypeToDo: 402 case TypeToDo:
402 commit_buffer[2] = ALCATEL_SYNC_TYPE_TODO; 403 commit_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
403 break; 404 break;
404 } 405 }
405 dbgprintf ("Commiting edited record\n"); 406 dbgprintf ("Commiting edited record\n");
406 error=GSM_WaitFor (s, commit_buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelCommit); 407 error=GSM_WaitFor (s, commit_buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelCommit);
407 if (error != ERR_NONE) return error; 408 if (error != ERR_NONE) return error;
408 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelCommit2); 409 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelCommit2);
409 if (error != ERR_NONE) return error; 410 if (error != ERR_NONE) return error;
410 Priv->BinaryState = StateSession; 411 Priv->BinaryState = StateSession;
411 Priv->BinaryItem = 0; 412 Priv->BinaryItem = 0;
412 } 413 }
413 414
414 /* Do we want to edit something of same type? */ 415 /* Do we want to edit something of same type? */
415 if ((state == StateEdit) && (type == Priv->BinaryType)) { 416 if ((state == StateEdit) && (type == Priv->BinaryType)) {
416 /* Edit state doesn't need any switching, it is needed only for 417 /* Edit state doesn't need any switching, it is needed only for
417 * indication that e have to commit record before we switch to other 418 * indication that e have to commit record before we switch to other
418 * mode. 419 * mode.
419 */ 420 */
420 Priv->BinaryState = StateEdit; 421 Priv->BinaryState = StateEdit;
421 Priv->BinaryItem = item; 422 Priv->BinaryItem = item;
422 return ERR_NONE; 423 return ERR_NONE;
423 } 424 }
424 425
425 /* Now we can be only in Attached or Session state, so if states and types matches, just keep them as they are */ 426 /* Now we can be only in Attached or Session state, so if states and types matches, just keep them as they are */
426 if ((state == Priv->BinaryState) && (type == Priv->BinaryType)) { 427 if ((state == Priv->BinaryState) && (type == Priv->BinaryType)) {
427 return ERR_NONE; 428 return ERR_NONE;
428 } 429 }
429 430
430 /* Do we need to close session? */ 431 /* Do we need to close session? */
431 if (Priv->BinaryState == StateSession) { 432 if (Priv->BinaryState == StateSession) {
432 dbgprintf ("Ending session\n"); 433 dbgprintf ("Ending session\n");
433 switch (Priv->BinaryType) { 434 switch (Priv->BinaryType) {
434 case TypeCalendar: 435 case TypeCalendar:
435 end_buffer[4] = ALCATEL_BEGIN_SYNC_CALENDAR; 436 end_buffer[4] = ALCATEL_BEGIN_SYNC_CALENDAR;
436 break; 437 break;
437 case TypeContacts: 438 case TypeContacts:
438 end_buffer[4] = ALCATEL_BEGIN_SYNC_CONTACTS; 439 end_buffer[4] = ALCATEL_BEGIN_SYNC_CONTACTS;
439 break; 440 break;
440 case TypeToDo: 441 case TypeToDo:
441 end_buffer[4] = ALCATEL_BEGIN_SYNC_TODO; 442 end_buffer[4] = ALCATEL_BEGIN_SYNC_TODO;
442 break; 443 break;
443 } 444 }
444 error=GSM_WaitFor (s, end_buffer, 9, 0x02, ALCATEL_TIMEOUT, ID_AlcatelEnd); 445 error=GSM_WaitFor (s, end_buffer, 9, 0x02, ALCATEL_TIMEOUT, ID_AlcatelEnd);
445 if (error != ERR_NONE) return error; 446 if (error != ERR_NONE) return error;
446 447
447 switch (Priv->BinaryType) { 448 switch (Priv->BinaryType) {
448 case TypeCalendar: 449 case TypeCalendar:
449 close_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 450 close_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
450 break; 451 break;
451 case TypeContacts: 452 case TypeContacts:
452 close_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 453 close_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
453 break; 454 break;
454 case TypeToDo: 455 case TypeToDo:
455 close_buffer[2] = ALCATEL_SYNC_TYPE_TODO; 456 close_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
456 break; 457 break;
457 } 458 }
458 dbgprintf ("Closing session\n"); 459 dbgprintf ("Closing session\n");
459 error=GSM_WaitFor (s, close_buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelClose); 460 error=GSM_WaitFor (s, close_buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelClose);
460 if (error != ERR_NONE) return error; 461 if (error != ERR_NONE) return error;
461 462
462 dbgprintf ("Detaching binary mode\n"); 463 dbgprintf ("Detaching binary mode\n");
463 GSM_WaitFor (s, detach_buffer, 4, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDetach); 464 GSM_WaitFor (s, detach_buffer, 4, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDetach);
464 465
465 Priv->BinaryState = StateAttached; 466 Priv->BinaryState = StateAttached;
466 Priv->BinaryType = 0; 467 Priv->BinaryType = 0;
467 } 468 }
468 469
469 /* Do we need to open session? */ 470 /* Do we need to open session? */
470 if (state == StateSession || state == StateEdit) { 471 if (state == StateSession || state == StateEdit) {
471 dbgprintf ("Starting session for %s\n", 472 dbgprintf ("Starting session for %s\n",
472 (type == TypeCalendar ? "Calendar" : 473 (type == TypeCalendar ? "Calendar" :
473 (type == TypeToDo ? "Todo" : 474 (type == TypeToDo ? "Todo" :
474 (type == TypeContacts ? "Contacts" : 475 (type == TypeContacts ? "Contacts" :
475 "Unknown!")))); 476 "Unknown!"))));
476 /* Fill up buffers */ 477 /* Fill up buffers */
477 switch (type) { 478 switch (type) {
478 case TypeCalendar: 479 case TypeCalendar:
479 select1_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 480 select1_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
480 select2_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 481 select2_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
481 begin_buffer[4] = ALCATEL_BEGIN_SYNC_CALENDAR; 482 begin_buffer[4] = ALCATEL_BEGIN_SYNC_CALENDAR;
482 break; 483 break;
483 case TypeContacts: 484 case TypeContacts:
484 select1_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 485 select1_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
485 select2_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 486 select2_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
486 begin_buffer[4] = ALCATEL_BEGIN_SYNC_CONTACTS; 487 begin_buffer[4] = ALCATEL_BEGIN_SYNC_CONTACTS;
487 break; 488 break;
488 case TypeToDo: 489 case TypeToDo:
489 select1_buffer[2] = ALCATEL_SYNC_TYPE_TODO; 490 select1_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
490 select2_buffer[2] = ALCATEL_SYNC_TYPE_TODO; 491 select2_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
491 begin_buffer[4] = ALCATEL_BEGIN_SYNC_TODO; 492 begin_buffer[4] = ALCATEL_BEGIN_SYNC_TODO;
492 break; 493 break;
493 } 494 }
494 dbgprintf ("Attaching in binary mode\n"); 495 dbgprintf ("Attaching in binary mode\n");
@@ -499,185 +500,187 @@ static GSM_Error ALCATEL_GoToBinaryState(GSM_StateMachine *s, GSM_Alcatel_Binary
499 500
500 smprintf(s,"Start session\n"); 501 smprintf(s,"Start session\n");
501 error=GSM_WaitFor (s, start_buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelStart); 502 error=GSM_WaitFor (s, start_buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelStart);
502 if (error != ERR_NONE) return error; 503 if (error != ERR_NONE) return error;
503 504
504 smprintf(s,"Select type\n"); 505 smprintf(s,"Select type\n");
505 error=GSM_WaitFor (s, select1_buffer, 4, 0x02, ALCATEL_TIMEOUT, ID_AlcatelSelect1); 506 error=GSM_WaitFor (s, select1_buffer, 4, 0x02, ALCATEL_TIMEOUT, ID_AlcatelSelect1);
506 if (error != ERR_NONE) return error; 507 if (error != ERR_NONE) return error;
507 error=GSM_WaitFor (s, select2_buffer, 6, 0x02, ALCATEL_TIMEOUT, ID_AlcatelSelect2); 508 error=GSM_WaitFor (s, select2_buffer, 6, 0x02, ALCATEL_TIMEOUT, ID_AlcatelSelect2);
508 if (error != ERR_NONE) return error; 509 if (error != ERR_NONE) return error;
509 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelSelect3); 510 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelSelect3);
510 if (error != ERR_NONE) return error; 511 if (error != ERR_NONE) return error;
511 512
512 smprintf(s,"Begin transfer\n"); 513 smprintf(s,"Begin transfer\n");
513 error=GSM_WaitFor (s, begin_buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelBegin1); 514 error=GSM_WaitFor (s, begin_buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelBegin1);
514 if (error != ERR_NONE) return error; 515 if (error != ERR_NONE) return error;
515 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelBegin2); 516 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelBegin2);
516 if (error != ERR_NONE) return error; 517 if (error != ERR_NONE) return error;
517 518
518 Priv->BinaryState = StateSession; 519 Priv->BinaryState = StateSession;
519 Priv->BinaryType = type; 520 Priv->BinaryType = type;
520 /* Do we want to edit something of same type? */ 521 /* Do we want to edit something of same type? */
521 if ((state == StateEdit) && (type == Priv->BinaryType)) { 522 if ((state == StateEdit) && (type == Priv->BinaryType)) {
522 Priv->BinaryState = StateEdit; 523 Priv->BinaryState = StateEdit;
523 Priv->BinaryItem = item; 524 Priv->BinaryItem = item;
524 return ERR_NONE; 525 return ERR_NONE;
525 } 526 }
526 } 527 }
527 return ERR_NONE; 528 return ERR_NONE;
528} 529}
529 530
530static GSM_Error ALCATEL_SetATMode(GSM_StateMachine *s) 531static GSM_Error ALCATEL_SetATMode(GSM_StateMachine *s)
531{ 532{
532 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 533 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
533 GSM_Error error; 534 GSM_Error error;
534 535
535 if (Priv->Mode == ModeAT) return ERR_NONE; 536 if (Priv->Mode == ModeAT) return ERR_NONE;
536 537
537 error = ALCATEL_GoToBinaryState(s, StateAttached, 0, 0); 538 error = ALCATEL_GoToBinaryState(s, StateAttached, 0, 0);
538 if (error != ERR_NONE) return error; 539 if (error != ERR_NONE) return error;
539 540
540 error = s->Protocol.Functions->Terminate(s); 541 error = s->Protocol.Functions->Terminate(s);
541 if (error != ERR_NONE) return error; 542 if (error != ERR_NONE) return error;
542 543
543 dbgprintf ("Changing protocol to AT\n"); 544 dbgprintf ("Changing protocol to AT\n");
544 s->Protocol.Functions = &ATProtocol; 545 s->Protocol.Functions = &ATProtocol;
545 s->Phone.Functions->ReplyFunctions= ATGENReplyFunctions; 546 s->Phone.Functions->ReplyFunctions= ATGENReplyFunctions;
546 Priv->Mode = ModeAT; 547 Priv->Mode = ModeAT;
548 s->Phone.Data.Priv.ATGEN.PBKCharset= 0;
549 s->Phone.Data.Priv.ATGEN.PBKMemory= 0;
547 550
548 my_sleep(100); 551 my_sleep(100);
549 552
550 /* In case we don't send AT command short after closing binary mode, 553 /* In case we don't send AT command short after closing binary mode,
551 * phone takes VERY long to react next time. The error code in 554 * phone takes VERY long to react next time. The error code in
552 * intetionally ignored. 555 * intetionally ignored.
553 */ 556 */
554 GSM_WaitFor (s, "AT\r", 3, 0x00, 0, ID_IncomingFrame); 557 GSM_WaitFor (s, "AT\r", 3, 0x00, 0, ID_IncomingFrame);
555 558
556 return ERR_NONE; 559 return ERR_NONE;
557} 560}
558 561
559static GSM_Error ALCATEL_Initialise(GSM_StateMachine *s) 562static GSM_Error ALCATEL_Initialise(GSM_StateMachine *s)
560{ 563{
561 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 564 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
562 GSM_Error error; 565 GSM_Error error;
563 566
564 Priv->Mode = ModeAT; 567 Priv->Mode = ModeAT;
565 568
566 Priv->CalendarItems = NULL; 569 Priv->CalendarItems = NULL;
567 Priv->ContactsItems = NULL; 570 Priv->ContactsItems = NULL;
568 Priv->ToDoItems = NULL; 571 Priv->ToDoItems = NULL;
569 Priv->CalendarItemsCount = 0; 572 Priv->CalendarItemsCount = 0;
570 Priv->ToDoItemsCount = 0; 573 Priv->ToDoItemsCount = 0;
571 Priv->ContactsItemsCount = 0; 574 Priv->ContactsItemsCount = 0;
572 Priv->CurrentFields[0] = 0; 575 Priv->CurrentFields[0] = 0;
573 Priv->CurrentFieldsCount = 0; 576 Priv->CurrentFieldsCount = 0;
574 Priv->CurrentFieldsItem = 0; 577 Priv->CurrentFieldsItem = 0;
575 Priv->CurrentFieldsType = 0; 578 Priv->CurrentFieldsType = 0;
576 Priv->ProtocolVersion = V_1_0; 579 Priv->ProtocolVersion = V_1_0;
577 Priv->CurrentFieldsItem = -1; 580 Priv->CurrentFieldsItem = -1;
578 581
579 Priv->CurrentCategoriesCount = 0; 582 Priv->CurrentCategoriesCount = 0;
580 Priv->CurrentCategoriesType = 0; 583 Priv->CurrentCategoriesType = 0;
581 584
582 s->Protocol.Functions = &ATProtocol; 585 s->Protocol.Functions = &ATProtocol;
583 s->Phone.Functions->ReplyFunctions= ATGENReplyFunctions; 586 s->Phone.Functions->ReplyFunctions= ATGENReplyFunctions;
584 587
585 if (ATGEN_Initialise(s) != ERR_NONE || GSM_WaitFor (s, "AT\r", 3, 0x00, 2, ID_IncomingFrame) != ERR_NONE) { 588 if (ATGEN_Initialise(s) != ERR_NONE || GSM_WaitFor (s, "AT\r", 3, 0x00, 2, ID_IncomingFrame) != ERR_NONE) {
586 smprintf(s,"AT initialisation failed, trying to stop binary mode...\n"); 589 smprintf(s,"AT initialisation failed, trying to stop binary mode...\n");
587 s->Protocol.Functions = &ALCABUSProtocol; 590 s->Protocol.Functions = &ALCABUSProtocol;
588 error = s->Protocol.Functions->Terminate(s); 591 error = s->Protocol.Functions->Terminate(s);
589 s->Protocol.Functions = &ATProtocol; 592 s->Protocol.Functions = &ATProtocol;
590 593
591 error = ATGEN_Initialise(s); 594 error = ATGEN_Initialise(s);
592 if (error != ERR_NONE) return error; 595 if (error != ERR_NONE) return error;
593 } 596 }
594 597
595 return ERR_NONE; 598 return ERR_NONE;
596} 599}
597 600
598static GSM_Error ALCATEL_Terminate(GSM_StateMachine *s) 601static GSM_Error ALCATEL_Terminate(GSM_StateMachine *s)
599{ 602{
600 GSM_Error error; 603 GSM_Error error;
601 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 604 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
602 605
603 free(Priv->CalendarItems); 606 free(Priv->CalendarItems);
604 free(Priv->ContactsItems); 607 free(Priv->ContactsItems);
605 free(Priv->ToDoItems); 608 free(Priv->ToDoItems);
606 error = ALCATEL_SetATMode(s); 609 error = ALCATEL_SetATMode(s);
607 return ATGEN_Terminate(s); 610 return ATGEN_Terminate(s);
608} 611}
609 612
610/* finds whether id is set in the phone */ 613/* finds whether id is set in the phone */
611static GSM_Error ALCATEL_IsIdAvailable(GSM_StateMachine *s, int id) { 614static GSM_Error ALCATEL_IsIdAvailable(GSM_StateMachine *s, int id) {
612 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 615 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
613 int i; 616 int i;
614 617
615 if (id > ALCATEL_MAX_LOCATION) return ERR_INVALIDLOCATION; 618 if (id > ALCATEL_MAX_LOCATION) return ERR_INVALIDLOCATION;
616 619
617 switch (Priv->BinaryType) { 620 switch (Priv->BinaryType) {
618 case TypeCalendar: 621 case TypeCalendar:
619 Priv->CurrentList = &(Priv->CalendarItems); 622 Priv->CurrentList = &(Priv->CalendarItems);
620 Priv->CurrentCount = &(Priv->CalendarItemsCount); 623 Priv->CurrentCount = &(Priv->CalendarItemsCount);
621 break; 624 break;
622 case TypeContacts: 625 case TypeContacts:
623 Priv->CurrentList = &(Priv->ContactsItems); 626 Priv->CurrentList = &(Priv->ContactsItems);
624 Priv->CurrentCount = &(Priv->ContactsItemsCount); 627 Priv->CurrentCount = &(Priv->ContactsItemsCount);
625 break; 628 break;
626 case TypeToDo: 629 case TypeToDo:
627 Priv->CurrentList = &(Priv->ToDoItems); 630 Priv->CurrentList = &(Priv->ToDoItems);
628 Priv->CurrentCount = &(Priv->ToDoItemsCount); 631 Priv->CurrentCount = &(Priv->ToDoItemsCount);
629 break; 632 break;
630 } 633 }
631 634
632 for (i=0; i<*Priv->CurrentCount; i++) { 635 for (i=0; i<*Priv->CurrentCount; i++) {
633 if ((*Priv->CurrentList)[i] == id) return ERR_NONE; 636 if ((*Priv->CurrentList)[i] == id) return ERR_NONE;
634 } 637 }
635 638
636 return ERR_EMPTY; 639 return ERR_EMPTY;
637} 640}
638 641
639/* finds next id that is available in the phone */ 642/* finds next id that is available in the phone */
640static GSM_Error ALCATEL_GetNextId(GSM_StateMachine *s, int *id) { 643static GSM_Error ALCATEL_GetNextId(GSM_StateMachine *s, int *id) {
641 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 644 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
642 int i = 0; 645 int i = 0;
643 int next = ALCATEL_MAX_LOCATION; 646 int next = ALCATEL_MAX_LOCATION;
644 647
645 switch (Priv->BinaryType) { 648 switch (Priv->BinaryType) {
646 case TypeCalendar: 649 case TypeCalendar:
647 Priv->CurrentList = &(Priv->CalendarItems); 650 Priv->CurrentList = &(Priv->CalendarItems);
648 Priv->CurrentCount = &(Priv->CalendarItemsCount); 651 Priv->CurrentCount = &(Priv->CalendarItemsCount);
649 break; 652 break;
650 case TypeContacts: 653 case TypeContacts:
651 Priv->CurrentList = &(Priv->ContactsItems); 654 Priv->CurrentList = &(Priv->ContactsItems);
652 Priv->CurrentCount = &(Priv->ContactsItemsCount); 655 Priv->CurrentCount = &(Priv->ContactsItemsCount);
653 break; 656 break;
654 case TypeToDo: 657 case TypeToDo:
655 Priv->CurrentList = &(Priv->ToDoItems); 658 Priv->CurrentList = &(Priv->ToDoItems);
656 Priv->CurrentCount = &(Priv->ToDoItemsCount); 659 Priv->CurrentCount = &(Priv->ToDoItemsCount);
657 break; 660 break;
658 } 661 }
659 662
660 for (i=0; i<*Priv->CurrentCount; i++) { 663 for (i=0; i<*Priv->CurrentCount; i++) {
661 if (((*Priv->CurrentList)[i] > *id) && ((*Priv->CurrentList)[i] < next )) { 664 if (((*Priv->CurrentList)[i] > *id) && ((*Priv->CurrentList)[i] < next )) {
662 next = (*Priv->CurrentList)[i]; 665 next = (*Priv->CurrentList)[i];
663 } 666 }
664 } 667 }
665 if (next == ALCATEL_MAX_LOCATION) { 668 if (next == ALCATEL_MAX_LOCATION) {
666 return ERR_EMPTY; 669 return ERR_EMPTY;
667 } else { 670 } else {
668 *id = next; 671 *id = next;
669 return ERR_NONE; 672 return ERR_NONE;
670 } 673 }
671} 674}
672 675
673static GSM_Error ALCATEL_ReplyGetIds(GSM_Protocol_Message msg, GSM_StateMachine *s) 676static GSM_Error ALCATEL_ReplyGetIds(GSM_Protocol_Message msg, GSM_StateMachine *s)
674{ 677{
675 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL; 678 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
676 int count,i,pos; 679 int count,i,pos;
677 680
678 count = msg.Buffer[10]; 681 count = msg.Buffer[10];
679 *Priv->CurrentCount += count; 682 *Priv->CurrentCount += count;
680 683
681 *Priv->CurrentList = (int *)realloc(*Priv->CurrentList, (*Priv->CurrentCount + 1)* sizeof(int)); 684 *Priv->CurrentList = (int *)realloc(*Priv->CurrentList, (*Priv->CurrentCount + 1)* sizeof(int));
682 if (*Priv->CurrentList == NULL) return ERR_MOREMEMORY; 685 if (*Priv->CurrentList == NULL) return ERR_MOREMEMORY;
683 686
@@ -801,97 +804,97 @@ static GSM_Error ALCATEL_GetFields(GSM_StateMachine *s, int id) {
801 case TypeContacts: 804 case TypeContacts:
802 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 805 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
803 break; 806 break;
804 case TypeToDo: 807 case TypeToDo:
805 buffer[2] = ALCATEL_SYNC_TYPE_TODO; 808 buffer[2] = ALCATEL_SYNC_TYPE_TODO;
806 break; 809 break;
807 } 810 }
808 811
809 Priv->CurrentFieldsItem = id; 812 Priv->CurrentFieldsItem = id;
810 Priv->CurrentFieldsType = Priv->BinaryType; 813 Priv->CurrentFieldsType = Priv->BinaryType;
811 814
812 error=GSM_WaitFor (s, buffer, 9, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetFields1); 815 error=GSM_WaitFor (s, buffer, 9, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetFields1);
813 if (error != ERR_NONE) return error; 816 if (error != ERR_NONE) return error;
814 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetFields2); 817 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetFields2);
815 if (error != ERR_NONE) return error; 818 if (error != ERR_NONE) return error;
816 819
817 i = 0; 820 i = 0;
818 smprintf(s,"Received %d fields: ", Priv->CurrentFieldsCount); 821 smprintf(s,"Received %d fields: ", Priv->CurrentFieldsCount);
819 for (i=0; i < Priv->CurrentFieldsCount; i++) { 822 for (i=0; i < Priv->CurrentFieldsCount; i++) {
820 smprintf(s,"%x ", Priv->CurrentFields[i]); 823 smprintf(s,"%x ", Priv->CurrentFields[i]);
821 } 824 }
822 smprintf(s,"\n"); 825 smprintf(s,"\n");
823 826
824 return ERR_NONE; 827 return ERR_NONE;
825} 828}
826 829
827static GSM_Error ALCATEL_ReplyGetFieldValue(GSM_Protocol_Message msg, GSM_StateMachine *s) 830static GSM_Error ALCATEL_ReplyGetFieldValue(GSM_Protocol_Message msg, GSM_StateMachine *s)
828{ 831{
829 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL; 832 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
830 unsigned char *buffer = &(msg.Buffer[16]); 833 unsigned char *buffer = &(msg.Buffer[16]);
831 834
832 if (buffer[1] == 0x05 && buffer[2] == 0x67) { 835 if (buffer[1] == 0x05 && buffer[2] == 0x67) {
833 /* date */ 836 /* date */
834 Priv->ReturnType = Alcatel_date; 837 Priv->ReturnType = Alcatel_date;
835 Priv->ReturnDateTime.Day= buffer[4]; 838 Priv->ReturnDateTime.Day= buffer[4];
836 Priv->ReturnDateTime.Month= buffer[5]; 839 Priv->ReturnDateTime.Month= buffer[5];
837 Priv->ReturnDateTime.Year= buffer[7] + (buffer[6] << 8); 840 Priv->ReturnDateTime.Year= buffer[7] + (buffer[6] << 8);
838 Priv->ReturnDateTime.Timezone= 0; /* FIXME: how to acquire this? */ 841 Priv->ReturnDateTime.Timezone= 0; /* FIXME: how to acquire this? */
839 842
840 Priv->ReturnDateTime.Hour= 0; 843 Priv->ReturnDateTime.Hour= 0;
841 Priv->ReturnDateTime.Minute= 0; 844 Priv->ReturnDateTime.Minute= 0;
842 Priv->ReturnDateTime.Second= 0; 845 Priv->ReturnDateTime.Second= 0;
843 } else if (buffer[1] == 0x06 && buffer[2] == 0x68) { 846 } else if (buffer[1] == 0x06 && buffer[2] == 0x68) {
844 /* time */ 847 /* time */
845 Priv->ReturnType = Alcatel_time; 848 Priv->ReturnType = Alcatel_time;
846 Priv->ReturnDateTime.Hour= buffer[4]; 849 Priv->ReturnDateTime.Hour= buffer[4];
847 Priv->ReturnDateTime.Minute= buffer[5]; 850 Priv->ReturnDateTime.Minute= buffer[5];
848 Priv->ReturnDateTime.Second= buffer[6]; 851 Priv->ReturnDateTime.Second= buffer[6];
849 852
850 Priv->ReturnDateTime.Day= 0; 853 Priv->ReturnDateTime.Day= 0;
851 Priv->ReturnDateTime.Month= 0; 854 Priv->ReturnDateTime.Month= 0;
852 Priv->ReturnDateTime.Year= 0; 855 Priv->ReturnDateTime.Year= 0;
853 Priv->ReturnDateTime.Timezone= 0; 856 Priv->ReturnDateTime.Timezone= 0;
854 } else if (buffer[1] == 0x08 && buffer[2] == 0x3C) { 857 } else if (buffer[1] == 0x08 && buffer[2] == 0x3C) {
855 /* string */ 858 /* string */
856 Priv->ReturnType = Alcatel_string; 859 Priv->ReturnType = Alcatel_string;
857 if (GSM_PHONEBOOK_TEXT_LENGTH < buffer[3]) 860 if (GSM_PHONEBOOK_TEXT_LENGTH < buffer[3])
858 smprintf(s, "WARNING: Text truncated, you should increase GSM_PHONEBOOK_TEXT_LENGTH to at least %d\n", buffer[3] + 1); 861 smprintf(s, "WARNING: Text truncated, you should increase GSM_PHONEBOOK_TEXT_LENGTH to at least %d\n", buffer[3] + 1);
859 if (Priv->ProtocolVersion == V_1_0) { 862 if (Priv->ProtocolVersion == V_1_0) {
860 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet); 863 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet);
861 } else if(Priv->ProtocolVersion == V_1_1 && (buffer[4] & 0x80)) { 864 } else if(Priv->ProtocolVersion == V_1_1 && (buffer[4] & 0x80)) {
862 memcpy(Priv->ReturnString, buffer + 5, buffer[3]); 865 memcpy(Priv->ReturnString, buffer + 5, buffer[3]);
863 Priv->ReturnString[buffer[3] + 1] = 0; 866 Priv->ReturnString[buffer[3] + 1] = 0;
864 Priv->ReturnString[buffer[3] + 2] = 0; 867 Priv->ReturnString[buffer[3] + 2] = 0;
865 ReverseUnicodeString(Priv->ReturnString); 868 ReverseUnicodeString(Priv->ReturnString);
866 } else { 869 } else {
867 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet); 870 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet);
868 } 871 }
869 } else if (buffer[1] == 0x07 && buffer[2] == 0x3C) { 872 } else if (buffer[1] == 0x07 && buffer[2] == 0x3C) {
870 /* phone */ 873 /* phone */
871 Priv->ReturnType = Alcatel_phone; 874 Priv->ReturnType = Alcatel_phone;
872 if (GSM_PHONEBOOK_TEXT_LENGTH < buffer[3]) 875 if (GSM_PHONEBOOK_TEXT_LENGTH < buffer[3])
873 smprintf(s, "WARNING: Text truncated, you should increase GSM_PHONEBOOK_TEXT_LENGTH to at least %d\n", buffer[3] + 1); 876 smprintf(s, "WARNING: Text truncated, you should increase GSM_PHONEBOOK_TEXT_LENGTH to at least %d\n", buffer[3] + 1);
874 if (Priv->ProtocolVersion == V_1_0) { 877 if (Priv->ProtocolVersion == V_1_0) {
875 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet); 878 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet);
876 } else if(Priv->ProtocolVersion == V_1_1 && (buffer[4] & 0x80)) { 879 } else if(Priv->ProtocolVersion == V_1_1 && (buffer[4] & 0x80)) {
877 memcpy(Priv->ReturnString, buffer + 5, buffer[3]); 880 memcpy(Priv->ReturnString, buffer + 5, buffer[3]);
878 Priv->ReturnString[buffer[3] + 1] = 0; 881 Priv->ReturnString[buffer[3] + 1] = 0;
879 Priv->ReturnString[buffer[3] + 2] = 0; 882 Priv->ReturnString[buffer[3] + 2] = 0;
880 ReverseUnicodeString(Priv->ReturnString); 883 ReverseUnicodeString(Priv->ReturnString);
881 } else { 884 } else {
882 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet); 885 DecodeDefault( Priv->ReturnString, buffer + 4, MIN(GSM_PHONEBOOK_TEXT_LENGTH, buffer[3]), false, GSM_AlcatelAlphabet);
883 } 886 }
884 } else if (buffer[1] == 0x03 && buffer[2] == 0x3B) { 887 } else if (buffer[1] == 0x03 && buffer[2] == 0x3B) {
885 /* boolean */ 888 /* boolean */
886 Priv->ReturnType = Alcatel_bool; 889 Priv->ReturnType = Alcatel_bool;
887 Priv->ReturnInt = buffer[3]; 890 Priv->ReturnInt = buffer[3];
888 } else if (buffer[1] == 0x02 && buffer[2] == 0x3A) { 891 } else if (buffer[1] == 0x02 && buffer[2] == 0x3A) {
889 /* integer */ 892 /* integer */
890 Priv->ReturnType = Alcatel_int; 893 Priv->ReturnType = Alcatel_int;
891 Priv->ReturnInt = buffer[6] + (buffer[5] << 8) + (buffer[4] << 16) + (buffer[3] << 24); 894 Priv->ReturnInt = buffer[6] + (buffer[5] << 8) + (buffer[4] << 16) + (buffer[3] << 24);
892 } else if (buffer[1] == 0x04 && buffer[2] == 0x38) { 895 } else if (buffer[1] == 0x04 && buffer[2] == 0x38) {
893 /* enumeration */ 896 /* enumeration */
894 Priv->ReturnType = Alcatel_enum; 897 Priv->ReturnType = Alcatel_enum;
895 Priv->ReturnInt = buffer[3]; 898 Priv->ReturnInt = buffer[3];
896 } else if (buffer[1] == 0x00 && buffer[2] == 0x38) { 899 } else if (buffer[1] == 0x00 && buffer[2] == 0x38) {
897 /* byte */ 900 /* byte */
@@ -1051,216 +1054,216 @@ static GSM_Error ALCATEL_AddCategoryText(GSM_StateMachine *s, const unsigned cha
1051 case TypeContacts: 1054 case TypeContacts:
1052 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 1055 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
1053 buffer[4] = ALCATEL_LIST_CONTACTS_CAT; 1056 buffer[4] = ALCATEL_LIST_CONTACTS_CAT;
1054 break; 1057 break;
1055 case TypeToDo: 1058 case TypeToDo:
1056 buffer[2] = ALCATEL_SYNC_TYPE_TODO; 1059 buffer[2] = ALCATEL_SYNC_TYPE_TODO;
1057 buffer[4] = ALCATEL_LIST_TODO_CAT; 1060 buffer[4] = ALCATEL_LIST_TODO_CAT;
1058 break; 1061 break;
1059 default: 1062 default:
1060 return ERR_NOTSUPPORTED; 1063 return ERR_NOTSUPPORTED;
1061 } 1064 }
1062 1065
1063 error=GSM_WaitFor (s, buffer, 8 + len, 0x02, ALCATEL_TIMEOUT, ID_AlcatelAddCategoryText1); 1066 error=GSM_WaitFor (s, buffer, 8 + len, 0x02, ALCATEL_TIMEOUT, ID_AlcatelAddCategoryText1);
1064 if (error != ERR_NONE) return error; 1067 if (error != ERR_NONE) return error;
1065 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelAddCategoryText2); 1068 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelAddCategoryText2);
1066 if (error != ERR_NONE) return error; 1069 if (error != ERR_NONE) return error;
1067 1070
1068 /* Refresh list */ 1071 /* Refresh list */
1069 Priv->CurrentCategoriesType = 0; 1072 Priv->CurrentCategoriesType = 0;
1070 return ALCATEL_GetAvailableCategoryIds(s); 1073 return ALCATEL_GetAvailableCategoryIds(s);
1071} 1074}
1072 1075
1073static GSM_Error ALCATEL_ReplyGetCategoryText(GSM_Protocol_Message msg, GSM_StateMachine *s) 1076static GSM_Error ALCATEL_ReplyGetCategoryText(GSM_Protocol_Message msg, GSM_StateMachine *s)
1074{ 1077{
1075 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL; 1078 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
1076 int len; 1079 int len;
1077 1080
1078 len = msg.Buffer[14]; 1081 len = msg.Buffer[14];
1079 if (len > GSM_MAX_CATEGORY_NAME_LENGTH) { 1082 if (len > GSM_MAX_CATEGORY_NAME_LENGTH) {
1080 smprintf(s, "WARNING: Category name truncated, you should increase GSM_MAX_CATEGORY_NAME_LENGTH to at least %d\n", len); 1083 smprintf(s, "WARNING: Category name truncated, you should increase GSM_MAX_CATEGORY_NAME_LENGTH to at least %d\n", len);
1081 } 1084 }
1082 if (Priv->ProtocolVersion == V_1_0) { 1085 if (Priv->ProtocolVersion == V_1_0) {
1083 DecodeDefault( Priv->ReturnString, msg.Buffer + 15, MIN(GSM_MAX_CATEGORY_NAME_LENGTH, len), false, GSM_AlcatelAlphabet); 1086 DecodeDefault( Priv->ReturnString, msg.Buffer + 15, MIN(GSM_MAX_CATEGORY_NAME_LENGTH, len), false, GSM_AlcatelAlphabet);
1084 } else if(Priv->ProtocolVersion == V_1_1 && (msg.Buffer[15] & 0x80)) { 1087 } else if(Priv->ProtocolVersion == V_1_1 && (msg.Buffer[15] & 0x80)) {
1085 memcpy(Priv->ReturnString, msg.Buffer + 16, len); 1088 memcpy(Priv->ReturnString, msg.Buffer + 16, len);
1086 Priv->ReturnString[len + 1] = 0; 1089 Priv->ReturnString[len + 1] = 0;
1087 Priv->ReturnString[len + 2] = 0; 1090 Priv->ReturnString[len + 2] = 0;
1088 ReverseUnicodeString(Priv->ReturnString); 1091 ReverseUnicodeString(Priv->ReturnString);
1089 } else { 1092 } else {
1090 DecodeDefault( Priv->ReturnString, msg.Buffer + 15, MIN(GSM_MAX_CATEGORY_NAME_LENGTH, len), false, GSM_AlcatelAlphabet); 1093 DecodeDefault( Priv->ReturnString, msg.Buffer + 15, MIN(GSM_MAX_CATEGORY_NAME_LENGTH, len), false, GSM_AlcatelAlphabet);
1091 } 1094 }
1092 return ERR_NONE; 1095 return ERR_NONE;
1093} 1096}
1094 1097
1095static GSM_Error ALCATEL_GetCategoryText(GSM_StateMachine *s, int id) { 1098static GSM_Error ALCATEL_GetCategoryText(GSM_StateMachine *s, int id) {
1096 unsigned char buffer[] = {0x00, 0x04, 0x00 /*type*/, 0x0c, 0x00 /*list*/, 0x0A, 0x01, 0x00 /*item*/ }; 1099 unsigned char buffer[] = {0x00, 0x04, 0x00 /*type*/, 0x0c, 0x00 /*list*/, 0x0A, 0x01, 0x00 /*item*/ };
1097 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1100 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1098 GSM_Error error; 1101 GSM_Error error;
1099 1102
1100 if (Priv->CurrentCategoriesCache[id][0] != '\000' || Priv->CurrentCategoriesCache[id][1] != '\000') { 1103 if (Priv->CurrentCategoriesCache[id][0] != '\000' || Priv->CurrentCategoriesCache[id][1] != '\000') {
1101 CopyUnicodeString(Priv->ReturnString, Priv->CurrentCategoriesCache[id]); 1104 CopyUnicodeString(Priv->ReturnString, Priv->CurrentCategoriesCache[id]);
1102 return ERR_NONE; 1105 return ERR_NONE;
1103 } 1106 }
1104 1107
1105 smprintf(s,"Reading category %d\n", id); 1108 smprintf(s,"Reading category %d\n", id);
1106 1109
1107 switch (Priv->BinaryType) { 1110 switch (Priv->BinaryType) {
1108 case TypeContacts: 1111 case TypeContacts:
1109 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 1112 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
1110 buffer[4] = ALCATEL_LIST_CONTACTS_CAT; 1113 buffer[4] = ALCATEL_LIST_CONTACTS_CAT;
1111 break; 1114 break;
1112 case TypeToDo: 1115 case TypeToDo:
1113 buffer[2] = ALCATEL_SYNC_TYPE_TODO; 1116 buffer[2] = ALCATEL_SYNC_TYPE_TODO;
1114 buffer[4] = ALCATEL_LIST_TODO_CAT; 1117 buffer[4] = ALCATEL_LIST_TODO_CAT;
1115 break; 1118 break;
1116 default: 1119 default:
1117 return ERR_NOTSUPPORTED; 1120 return ERR_NOTSUPPORTED;
1118 } 1121 }
1119 1122
1120 buffer[7] = (id & 0xff); 1123 buffer[7] = (id & 0xff);
1121 1124
1122 error=GSM_WaitFor (s, buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetCategoryText1); 1125 error=GSM_WaitFor (s, buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetCategoryText1);
1123 if (error != ERR_NONE) return error; 1126 if (error != ERR_NONE) return error;
1124 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetCategoryText2); 1127 error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetCategoryText2);
1125 if (error != ERR_NONE) return error; 1128 if (error != ERR_NONE) return error;
1126 1129
1127 CopyUnicodeString(Priv->CurrentCategoriesCache[id], Priv->ReturnString); 1130 CopyUnicodeString(Priv->CurrentCategoriesCache[id], Priv->ReturnString);
1128 1131
1129 return ERR_NONE; 1132 return ERR_NONE;
1130} 1133}
1131 1134
1132static GSM_Error ALCATEL_DeleteField(GSM_StateMachine *s, int id, int field) { 1135static GSM_Error ALCATEL_DeleteField(GSM_StateMachine *s, int id, int field) {
1133 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1136 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1134 GSM_Error error; 1137 GSM_Error error;
1135 unsigned char buffer[] = 1138 unsigned char buffer[] =
1136 {0x00, 0x04, 1139 {0x00, 0x04,
1137 0x00, /* type */ 1140 0x00, /* type */
1138 0x26, 0x01, 1141 0x26, 0x01,
1139 0x00, 0x00, 0x00, 0x00,/* here follows 4byte id */ 1142 0x00, 0x00, 0x00, 0x00,/* here follows 4byte id */
1140 0x65, 0x01, 1143 0x65, 0x01,
1141 0x00, /* field */ 1144 0x00, /* field */
1142 0x01}; 1145 0x01};
1143 1146
1144 smprintf(s,"Deleting field (%08x.%02x)\n", id, field); 1147 smprintf(s,"Deleting field (%08x.%02x)\n", id, field);
1145 1148
1146 switch (Priv->BinaryType) { 1149 switch (Priv->BinaryType) {
1147 case TypeCalendar: 1150 case TypeCalendar:
1148 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 1151 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
1149 break; 1152 break;
1150 case TypeContacts: 1153 case TypeContacts:
1151 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 1154 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
1152 break; 1155 break;
1153 case TypeToDo: 1156 case TypeToDo:
1154 buffer[2] = ALCATEL_SYNC_TYPE_TODO; 1157 buffer[2] = ALCATEL_SYNC_TYPE_TODO;
1155 break; 1158 break;
1156 } 1159 }
1157 1160
1158 buffer[5] = (id >> 24); 1161 buffer[5] = (id >> 24);
1159 buffer[6] = ((id >> 16) & 0xff); 1162 buffer[6] = ((id >> 16) & 0xff);
1160 buffer[7] = ((id >> 8) & 0xff); 1163 buffer[7] = ((id >> 8) & 0xff);
1161 buffer[8] = (id & 0xff); 1164 buffer[8] = (id & 0xff);
1162 buffer[11] = (field & 0xff); 1165 buffer[11] = (field & 0xff);
1163 1166
1164 error=GSM_WaitFor (s, buffer, 13, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDeleteField); 1167 error=GSM_WaitFor (s, buffer, 13, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDeleteField);
1165 if (error != ERR_NONE) return error; 1168 if (error != ERR_NONE) return error;
1166 1169
1167 return ERR_NONE; 1170 return ERR_NONE;
1168} 1171}
1169 1172
1170static GSM_Error ALCATEL_DeleteItem(GSM_StateMachine *s, int id) { 1173static GSM_Error ALCATEL_DeleteItem(GSM_StateMachine *s, int id) {
1171 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1174 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1172 GSM_Error error; 1175 GSM_Error error;
1173 unsigned char buffer[] = 1176 unsigned char buffer[] =
1174 {0x00, 0x04, 1177 {0x00, 0x04,
1175 0x00, /* type */ 1178 0x00, /* type */
1176 0x27, 0x01, 1179 0x27, 0x01,
1177 0x00, 0x00, 0x00, 0x00,/* here follows 4byte id */ 1180 0x00, 0x00, 0x00, 0x00,/* here follows 4byte id */
1178 0x42}; 1181 0x42};
1179 1182
1180 smprintf(s,"Deleting item (%08x)\n", id); 1183 smprintf(s,"Deleting item (%08x)\n", id);
1181 1184
1182 switch (Priv->BinaryType) { 1185 switch (Priv->BinaryType) {
1183 case TypeCalendar: 1186 case TypeCalendar:
1184 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 1187 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
1185 break; 1188 break;
1186 case TypeContacts: 1189 case TypeContacts:
1187 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 1190 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
1188 break; 1191 break;
1189 case TypeToDo: 1192 case TypeToDo:
1190 buffer[2] = ALCATEL_SYNC_TYPE_TODO; 1193 buffer[2] = ALCATEL_SYNC_TYPE_TODO;
1191 break; 1194 break;
1192 } 1195 }
1193 1196
1194 buffer[5] = (id >> 24); 1197 buffer[5] = (id >> 24);
1195 buffer[6] = ((id >> 16) & 0xff); 1198 buffer[6] = ((id >> 16) & 0xff);
1196 buffer[7] = ((id >> 8) & 0xff); 1199 buffer[7] = ((id >> 8) & 0xff);
1197 buffer[8] = (id & 0xff); 1200 buffer[8] = (id & 0xff);
1198 1201
1199 error=GSM_WaitFor (s, buffer, 10, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDeleteItem1); 1202 error=GSM_WaitFor (s, buffer, 10, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDeleteItem1);
1200 if (error != ERR_NONE) return error; 1203 if (error != ERR_NONE) return error;
1201 1204
1202 error=GSM_WaitFor (s, 0, 0, 0x0, ALCATEL_TIMEOUT, ID_AlcatelDeleteItem2); 1205 error=GSM_WaitFor (s, 0, 0, 0x0, ALCATEL_TIMEOUT, ID_AlcatelDeleteItem2);
1203 if (error != ERR_NONE) return error; 1206 if (error != ERR_NONE) return error;
1204 1207
1205 return ERR_NONE; 1208 return ERR_NONE;
1206} 1209}
1207 1210
1208static GSM_Error ALCATEL_ReplyDeleteItem(GSM_Protocol_Message msg, GSM_StateMachine *s) 1211static GSM_Error ALCATEL_ReplyDeleteItem(GSM_Protocol_Message msg, GSM_StateMachine *s)
1209{ 1212{
1210 if (msg.Buffer[8] != 0x25) return ERR_UNKNOWNRESPONSE; 1213 if (msg.Buffer[8] != 0x25) return ERR_UNKNOWNRESPONSE;
1211 return ERR_NONE; 1214 return ERR_NONE;
1212} 1215}
1213 1216
1214static GSM_Error ALCATEL_BuildWriteBuffer(unsigned char * buffer, GSM_Alcatel_FieldType type, int field, void *data) { 1217static GSM_Error ALCATEL_BuildWriteBuffer(unsigned char * buffer, GSM_Alcatel_FieldType type, int field, void *data) {
1215 int len; 1218 int len;
1216 1219
1217 buffer[1] = field & 0xff; 1220 buffer[1] = field & 0xff;
1218 1221
1219 switch(type) { 1222 switch(type) {
1220 case Alcatel_date: 1223 case Alcatel_date:
1221 if (!CheckDate((GSM_DateTime *)data)) return ERR_INVALIDDATETIME; 1224 if (!CheckDate((GSM_DateTime *)data)) return ERR_INVALIDDATETIME;
1222 1225
1223 buffer[3] = 0x05; 1226 buffer[3] = 0x05;
1224 buffer[4] = 0x67; 1227 buffer[4] = 0x67;
1225 1228
1226 buffer[0] = 0x09; 1229 buffer[0] = 0x09;
1227 buffer[5] = 0x04; 1230 buffer[5] = 0x04;
1228 buffer[6] = ((GSM_DateTime *)data)->Day & 0xff; 1231 buffer[6] = ((GSM_DateTime *)data)->Day & 0xff;
1229 buffer[7] = ((GSM_DateTime *)data)->Month & 0xff; 1232 buffer[7] = ((GSM_DateTime *)data)->Month & 0xff;
1230 buffer[8] = ((GSM_DateTime *)data)->Year >> 8; 1233 buffer[8] = ((GSM_DateTime *)data)->Year >> 8;
1231 buffer[9] = ((GSM_DateTime *)data)->Year & 0xff; 1234 buffer[9] = ((GSM_DateTime *)data)->Year & 0xff;
1232 buffer[10] = 0x00; 1235 buffer[10] = 0x00;
1233 break; 1236 break;
1234 case Alcatel_time: 1237 case Alcatel_time:
1235 if (!CheckTime((GSM_DateTime *)data)) return ERR_INVALIDDATETIME; 1238 if (!CheckTime((GSM_DateTime *)data)) return ERR_INVALIDDATETIME;
1236 1239
1237 buffer[3] = 0x06; 1240 buffer[3] = 0x06;
1238 buffer[4] = 0x68; 1241 buffer[4] = 0x68;
1239 1242
1240 buffer[0] = 0x08; 1243 buffer[0] = 0x08;
1241 buffer[5] = 0x03; 1244 buffer[5] = 0x03;
1242 buffer[6] = ((GSM_DateTime *)data)->Hour & 0xff; 1245 buffer[6] = ((GSM_DateTime *)data)->Hour & 0xff;
1243 buffer[7] = ((GSM_DateTime *)data)->Minute & 0xff; 1246 buffer[7] = ((GSM_DateTime *)data)->Minute & 0xff;
1244 buffer[8] = ((GSM_DateTime *)data)->Second & 0xff; 1247 buffer[8] = ((GSM_DateTime *)data)->Second & 0xff;
1245 buffer[9] = 0x00; 1248 buffer[9] = 0x00;
1246 break; 1249 break;
1247 case Alcatel_string: 1250 case Alcatel_string:
1248 buffer[3] = 0x08; 1251 buffer[3] = 0x08;
1249 buffer[4] = 0x3c; 1252 buffer[4] = 0x3c;
1250 1253
1251 len = MIN(UnicodeLength((char *)data),62); 1254 len = MIN(UnicodeLength((char *)data),62);
1252 EncodeDefault(buffer + 6, (char *)data, &len, true, GSM_AlcatelAlphabet); 1255 EncodeDefault(buffer + 6, (char *)data, &len, true, GSM_AlcatelAlphabet);
1253 buffer[5] = len; 1256 buffer[5] = len;
1254 buffer[0] = 5 + len; 1257 buffer[0] = 5 + len;
1255 buffer[6 + len] = 0x00; 1258 buffer[6 + len] = 0x00;
1256 break; 1259 break;
1257 case Alcatel_phone: 1260 case Alcatel_phone:
1258 buffer[3] = 0x07; 1261 buffer[3] = 0x07;
1259 buffer[4] = 0x3c; 1262 buffer[4] = 0x3c;
1260 1263
1261 len = MIN(UnicodeLength((char *)data),50); 1264 len = MIN(UnicodeLength((char *)data),50);
1262 EncodeDefault(buffer + 6, (char *)data, &len, true, GSM_AlcatelAlphabet); 1265 EncodeDefault(buffer + 6, (char *)data, &len, true, GSM_AlcatelAlphabet);
1263 buffer[5] = len; 1266 buffer[5] = len;
1264 buffer[0] = 5 + len; 1267 buffer[0] = 5 + len;
1265 buffer[6 + len] = 0x00; 1268 buffer[6 + len] = 0x00;
1266 break; 1269 break;
@@ -1284,140 +1287,140 @@ static GSM_Error ALCATEL_BuildWriteBuffer(unsigned char * buffer, GSM_Alcatel_Fi
1284 buffer[3] = 0x02; 1287 buffer[3] = 0x02;
1285 buffer[4] = 0x3a; 1288 buffer[4] = 0x3a;
1286 1289
1287 buffer[0] = 0x08; 1290 buffer[0] = 0x08;
1288 buffer[5] = *(unsigned int *)data >> 24; 1291 buffer[5] = *(unsigned int *)data >> 24;
1289 buffer[6] = (*(unsigned int *)data >> 16) & 0xff; 1292 buffer[6] = (*(unsigned int *)data >> 16) & 0xff;
1290 buffer[7] = (*(unsigned int *)data >> 8) & 0xff; 1293 buffer[7] = (*(unsigned int *)data >> 8) & 0xff;
1291 buffer[8] = *(unsigned int *)data & 0xff; 1294 buffer[8] = *(unsigned int *)data & 0xff;
1292 buffer[9] = 0x00; 1295 buffer[9] = 0x00;
1293 break; 1296 break;
1294 case Alcatel_byte: 1297 case Alcatel_byte:
1295 buffer[3] = 0x00; 1298 buffer[3] = 0x00;
1296 buffer[4] = 0x38; 1299 buffer[4] = 0x38;
1297 1300
1298 buffer[0] = 0x05; 1301 buffer[0] = 0x05;
1299 buffer[5] = *(int *)data & 0xff; 1302 buffer[5] = *(int *)data & 0xff;
1300 buffer[6] = 0x00; 1303 buffer[6] = 0x00;
1301 break; 1304 break;
1302 } 1305 }
1303 return ERR_NONE; 1306 return ERR_NONE;
1304} 1307}
1305 1308
1306static GSM_Error ALCATEL_CreateField(GSM_StateMachine *s, GSM_Alcatel_FieldType type, int field, void *data) { 1309static GSM_Error ALCATEL_CreateField(GSM_StateMachine *s, GSM_Alcatel_FieldType type, int field, void *data) {
1307 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1310 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1308 GSM_Error error; 1311 GSM_Error error;
1309 unsigned char buffer[200] = 1312 unsigned char buffer[200] =
1310 {0x00, 0x04, 1313 {0x00, 0x04,
1311 0x00, /* type */ 1314 0x00, /* type */
1312 0x25, 0x01, 0x65, 1315 0x25, 0x01, 0x65,
1313 0x00, /* length of remaining part */ 1316 0x00, /* length of remaining part */
1314 0x00, /* field */ 1317 0x00, /* field */
1315 0x37}; /* data follows here */ 1318 0x37}; /* data follows here */
1316 1319
1317 smprintf(s,"Creating field (%02x)\n", field); 1320 smprintf(s,"Creating field (%02x)\n", field);
1318 1321
1319 switch (Priv->BinaryType) { 1322 switch (Priv->BinaryType) {
1320 case TypeCalendar: 1323 case TypeCalendar:
1321 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 1324 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
1322 break; 1325 break;
1323 case TypeContacts: 1326 case TypeContacts:
1324 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 1327 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
1325 break; 1328 break;
1326 case TypeToDo: 1329 case TypeToDo:
1327 buffer[2] = ALCATEL_SYNC_TYPE_TODO; 1330 buffer[2] = ALCATEL_SYNC_TYPE_TODO;
1328 break; 1331 break;
1329 } 1332 }
1330 error = ALCATEL_BuildWriteBuffer(buffer + 6, type, field, data); 1333 error = ALCATEL_BuildWriteBuffer(buffer + 6, type, field, data);
1331 if (error != ERR_NONE) return error; 1334 if (error != ERR_NONE) return error;
1332 1335
1333 error = GSM_WaitFor (s, buffer, 8 + buffer[6], 0x02, ALCATEL_TIMEOUT, ID_AlcatelCreateField); 1336 error = GSM_WaitFor (s, buffer, 8 + buffer[6], 0x02, ALCATEL_TIMEOUT, ID_AlcatelCreateField);
1334 if (error != ERR_NONE) return error; 1337 if (error != ERR_NONE) return error;
1335 1338
1336 return ERR_NONE; 1339 return ERR_NONE;
1337} 1340}
1338 1341
1339static GSM_Error ALCATEL_UpdateField(GSM_StateMachine *s, GSM_Alcatel_FieldType type, int id, int field, void *data) { 1342static GSM_Error ALCATEL_UpdateField(GSM_StateMachine *s, GSM_Alcatel_FieldType type, int id, int field, void *data) {
1340 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1343 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1341 GSM_Error error; 1344 GSM_Error error;
1342 unsigned char buffer[200] = 1345 unsigned char buffer[200] =
1343 {0x00, 0x04, 1346 {0x00, 0x04,
1344 0x00, /* type */ 1347 0x00, /* type */
1345 0x26, 0x01, 1348 0x26, 0x01,
1346 0x00, 0x00, 0x00, 0x00,/* id */ 1349 0x00, 0x00, 0x00, 0x00,/* id */
1347 0x65, 1350 0x65,
1348 0x00, /* length of remaining part */ 1351 0x00, /* length of remaining part */
1349 0x00, /* field */ 1352 0x00, /* field */
1350 0x37}; /* data follows here */ 1353 0x37}; /* data follows here */
1351 1354
1352 smprintf(s,"Updating field (%08x.%02x)\n", id, field); 1355 smprintf(s,"Updating field (%08x.%02x)\n", id, field);
1353 1356
1354 buffer[5] = (id >> 24); 1357 buffer[5] = (id >> 24);
1355 buffer[6] = ((id >> 16) & 0xff); 1358 buffer[6] = ((id >> 16) & 0xff);
1356 buffer[7] = ((id >> 8) & 0xff); 1359 buffer[7] = ((id >> 8) & 0xff);
1357 buffer[8] = (id & 0xff); 1360 buffer[8] = (id & 0xff);
1358 1361
1359 switch (Priv->BinaryType) { 1362 switch (Priv->BinaryType) {
1360 case TypeCalendar: 1363 case TypeCalendar:
1361 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR; 1364 buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
1362 break; 1365 break;
1363 case TypeContacts: 1366 case TypeContacts:
1364 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS; 1367 buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
1365 break; 1368 break;
1366 case TypeToDo: 1369 case TypeToDo:
1367 buffer[2] = ALCATEL_SYNC_TYPE_TODO; 1370 buffer[2] = ALCATEL_SYNC_TYPE_TODO;
1368 break; 1371 break;
1369 } 1372 }
1370 error = ALCATEL_BuildWriteBuffer(buffer + 10, type, field, data); 1373 error = ALCATEL_BuildWriteBuffer(buffer + 10, type, field, data);
1371 if (error != ERR_NONE) return error; 1374 if (error != ERR_NONE) return error;
1372 1375
1373 error = GSM_WaitFor (s, buffer, 12 + buffer[10], 0x02, ALCATEL_TIMEOUT, ID_AlcatelUpdateField); 1376 error = GSM_WaitFor (s, buffer, 12 + buffer[10], 0x02, ALCATEL_TIMEOUT, ID_AlcatelUpdateField);
1374 if (error != ERR_NONE) return error; 1377 if (error != ERR_NONE) return error;
1375 1378
1376 return ERR_NONE; 1379 return ERR_NONE;
1377} 1380}
1378 1381
1379static GSM_Error ALCATEL_GetManufacturer(GSM_StateMachine *s) 1382static GSM_Error ALCATEL_GetManufacturer(GSM_StateMachine *s)
1380{ 1383{
1381 strcpy(s->Phone.Data.Manufacturer, "Alcatel"); 1384 strcpy(s->Phone.Data.Manufacturer, "Alcatel");
1382 return ERR_NONE; 1385 return ERR_NONE;
1383} 1386}
1384 1387
1385static GSM_Error ALCATEL_GetIMEI (GSM_StateMachine *s) 1388static GSM_Error ALCATEL_GetIMEI (GSM_StateMachine *s)
1386{ 1389{
1387 GSM_Error error; 1390 GSM_Error error;
1388 1391
1389 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 1392 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
1390 return ATGEN_GetIMEI(s); 1393 return ATGEN_GetIMEI(s);
1391} 1394}
1392 1395
1393static GSM_Error ALCATEL_GetFirmware(GSM_StateMachine *s) 1396static GSM_Error ALCATEL_GetFirmware(GSM_StateMachine *s)
1394{ 1397{
1395 GSM_Error error; 1398 GSM_Error error;
1396 1399
1397 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 1400 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
1398 return ATGEN_GetFirmware(s); 1401 return ATGEN_GetFirmware(s);
1399} 1402}
1400 1403
1401static GSM_Error ALCATEL_GetModel(GSM_StateMachine *s) 1404static GSM_Error ALCATEL_GetModel(GSM_StateMachine *s)
1402{ 1405{
1403 GSM_Error error; 1406 GSM_Error error;
1404 1407
1405 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 1408 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
1406 return ATGEN_GetModel(s); 1409 return ATGEN_GetModel(s);
1407} 1410}
1408 1411
1409static GSM_Error ALCATEL_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time) 1412static GSM_Error ALCATEL_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
1410{ 1413{
1411 GSM_Error error; 1414 GSM_Error error;
1412 1415
1413 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 1416 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
1414 return ATGEN_GetDateTime(s, date_time); 1417 return ATGEN_GetDateTime(s, date_time);
1415} 1418}
1416 1419
1417static GSM_Error ALCATEL_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 1420static GSM_Error ALCATEL_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
1418{ 1421{
1419 GSM_Error error; 1422 GSM_Error error;
1420 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1423 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1421 int i; 1424 int i;
1422 int j = 0; 1425 int j = 0;
1423 1426
@@ -1698,427 +1701,427 @@ static GSM_Error ALCATEL_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
1698 entry->Entries[i - j].EntryType = PBK_PictureID; 1701 entry->Entries[i - j].EntryType = PBK_PictureID;
1699 entry->Entries[i - j].Number = Priv->ReturnInt; 1702 entry->Entries[i - j].Number = Priv->ReturnInt;
1700 } else { 1703 } else {
1701 entry->EntriesNum--; 1704 entry->EntriesNum--;
1702 j++; 1705 j++;
1703 } 1706 }
1704 break; 1707 break;
1705 default: 1708 default:
1706 entry->EntriesNum--; 1709 entry->EntriesNum--;
1707 j++; 1710 j++;
1708 smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType); 1711 smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType);
1709 switch (Priv->ReturnType) { 1712 switch (Priv->ReturnType) {
1710 case Alcatel_date: 1713 case Alcatel_date:
1711 smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year); 1714 smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year);
1712 break; 1715 break;
1713 case Alcatel_time: 1716 case Alcatel_time:
1714 smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second); 1717 smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second);
1715 break; 1718 break;
1716 case Alcatel_string: 1719 case Alcatel_string:
1717 case Alcatel_phone: 1720 case Alcatel_phone:
1718 smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString)); 1721 smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString));
1719 break; 1722 break;
1720 case Alcatel_enum: 1723 case Alcatel_enum:
1721 case Alcatel_bool: 1724 case Alcatel_bool:
1722 case Alcatel_int: 1725 case Alcatel_int:
1723 case Alcatel_byte: 1726 case Alcatel_byte:
1724 smprintf(s, "%d", Priv->ReturnInt); 1727 smprintf(s, "%d", Priv->ReturnInt);
1725 break; 1728 break;
1726 } 1729 }
1727 smprintf(s,"\n"); 1730 smprintf(s,"\n");
1728 } 1731 }
1729 } 1732 }
1730 return ERR_NONE; 1733 return ERR_NONE;
1731 } else { 1734 } else {
1732 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 1735 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
1733 return ATGEN_GetMemory(s, entry); 1736 return ATGEN_GetMemory(s, entry);
1734 } 1737 }
1735} 1738}
1736 1739
1737static GSM_Error ALCATEL_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry, bool start) 1740static GSM_Error ALCATEL_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry, bool start)
1738{ 1741{
1739 GSM_Error error; 1742 GSM_Error error;
1740 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1743 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1741 1744
1742 if (entry->MemoryType == MEM_ME) { 1745 if (entry->MemoryType == MEM_ME) {
1743 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 1746 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
1744 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 1747 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
1745 if (Priv->ContactsItemsCount == 0) return ERR_EMPTY; 1748 if (Priv->ContactsItemsCount == 0) return ERR_EMPTY;
1746 1749
1747 if (start) entry->Location = 0; 1750 if (start) entry->Location = 0;
1748 if ((error = ALCATEL_GetNextId(s, &(entry->Location))) != ERR_NONE) return error; 1751 if ((error = ALCATEL_GetNextId(s, &(entry->Location))) != ERR_NONE) return error;
1749 1752
1750 return ALCATEL_GetMemory(s, entry); 1753 return ALCATEL_GetMemory(s, entry);
1751 } else { 1754 } else {
1752 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 1755 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
1753 return ATGEN_GetNextMemory(s, entry, start); 1756 return ATGEN_GetNextMemory(s, entry, start);
1754 } 1757 }
1755} 1758}
1756 1759
1757static GSM_Error ALCATEL_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 1760static GSM_Error ALCATEL_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
1758{ 1761{
1759 GSM_Error error; 1762 GSM_Error error;
1760 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1763 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1761 int NamePosition = -1; 1764 int NamePosition = -1;
1762 bool NameSet = false; 1765 bool NameSet = false;
1763 int i; 1766 int i;
1764 1767
1765 1768
1766 if (entry->MemoryType == MEM_ME) { 1769 if (entry->MemoryType == MEM_ME) {
1767 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 1770 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
1768 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeContacts, 0))!= ERR_NONE) return error; 1771 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeContacts, 0))!= ERR_NONE) return error;
1769 for (i = 0; i < entry->EntriesNum; i++) { 1772 for (i = 0; i < entry->EntriesNum; i++) {
1770 switch (entry->Entries[i].EntryType) { 1773 switch (entry->Entries[i].EntryType) {
1771 case PBK_Number_General: 1774 case PBK_Number_General:
1772 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 8, entry->Entries[i].Text)) != ERR_NONE) return error; 1775 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 8, entry->Entries[i].Text)) != ERR_NONE) return error;
1773 break; 1776 break;
1774 case PBK_Number_Mobile: 1777 case PBK_Number_Mobile:
1775 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 12, entry->Entries[i].Text)) != ERR_NONE) return error; 1778 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 12, entry->Entries[i].Text)) != ERR_NONE) return error;
1776 break; 1779 break;
1777 case PBK_Number_Work: 1780 case PBK_Number_Work:
1778 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 7, entry->Entries[i].Text)) != ERR_NONE) return error; 1781 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 7, entry->Entries[i].Text)) != ERR_NONE) return error;
1779 break; 1782 break;
1780 case PBK_Number_Fax: 1783 case PBK_Number_Fax:
1781 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, entry->Entries[i].Text)) != ERR_NONE) return error; 1784 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, entry->Entries[i].Text)) != ERR_NONE) return error;
1782 break; 1785 break;
1783 case PBK_Number_Home: 1786 case PBK_Number_Home:
1784 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 13, entry->Entries[i].Text)) != ERR_NONE) return error; 1787 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 13, entry->Entries[i].Text)) != ERR_NONE) return error;
1785 break; 1788 break;
1786 case PBK_Number_Pager: 1789 case PBK_Number_Pager:
1787 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 11, entry->Entries[i].Text)) != ERR_NONE) return error; 1790 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 11, entry->Entries[i].Text)) != ERR_NONE) return error;
1788 break; 1791 break;
1789 case PBK_Number_Other: 1792 case PBK_Number_Other:
1790 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 10, entry->Entries[i].Text)) != ERR_NONE) return error; 1793 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 10, entry->Entries[i].Text)) != ERR_NONE) return error;
1791 break; 1794 break;
1792 case PBK_Text_Note: 1795 case PBK_Text_Note:
1793 if ((error = ALCATEL_CreateField(s, Alcatel_string, 4, entry->Entries[i].Text)) != ERR_NONE) return error; 1796 if ((error = ALCATEL_CreateField(s, Alcatel_string, 4, entry->Entries[i].Text)) != ERR_NONE) return error;
1794 break; 1797 break;
1795 case PBK_Text_Email: 1798 case PBK_Text_Email:
1796 if ((error = ALCATEL_CreateField(s, Alcatel_string, 14, entry->Entries[i].Text)) != ERR_NONE) return error; 1799 if ((error = ALCATEL_CreateField(s, Alcatel_string, 14, entry->Entries[i].Text)) != ERR_NONE) return error;
1797 break; 1800 break;
1798 case PBK_Text_Email2: 1801 case PBK_Text_Email2:
1799 if ((error = ALCATEL_CreateField(s, Alcatel_string, 15, entry->Entries[i].Text)) != ERR_NONE) return error; 1802 if ((error = ALCATEL_CreateField(s, Alcatel_string, 15, entry->Entries[i].Text)) != ERR_NONE) return error;
1800 break; 1803 break;
1801 case PBK_Text_LastName: 1804 case PBK_Text_LastName:
1802 if ((error = ALCATEL_CreateField(s, Alcatel_string, 0, entry->Entries[i].Text)) != ERR_NONE) return error; 1805 if ((error = ALCATEL_CreateField(s, Alcatel_string, 0, entry->Entries[i].Text)) != ERR_NONE) return error;
1803 NameSet = true; 1806 NameSet = true;
1804 break; 1807 break;
1805 case PBK_Text_FirstName: 1808 case PBK_Text_FirstName:
1806 if ((error = ALCATEL_CreateField(s, Alcatel_string, 1, entry->Entries[i].Text)) != ERR_NONE) return error; 1809 if ((error = ALCATEL_CreateField(s, Alcatel_string, 1, entry->Entries[i].Text)) != ERR_NONE) return error;
1807 NameSet = true; 1810 NameSet = true;
1808 break; 1811 break;
1809 case PBK_Text_Company: 1812 case PBK_Text_Company:
1810 if ((error = ALCATEL_CreateField(s, Alcatel_string, 2, entry->Entries[i].Text)) != ERR_NONE) return error; 1813 if ((error = ALCATEL_CreateField(s, Alcatel_string, 2, entry->Entries[i].Text)) != ERR_NONE) return error;
1811 break; 1814 break;
1812 case PBK_Text_JobTitle: 1815 case PBK_Text_JobTitle:
1813 if ((error = ALCATEL_CreateField(s, Alcatel_string, 3, entry->Entries[i].Text)) != ERR_NONE) return error; 1816 if ((error = ALCATEL_CreateField(s, Alcatel_string, 3, entry->Entries[i].Text)) != ERR_NONE) return error;
1814 break; 1817 break;
1815 case PBK_Category: 1818 case PBK_Category:
1816 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 5, &(entry->Entries[i].Number))) != ERR_NONE) return error; 1819 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 5, &(entry->Entries[i].Number))) != ERR_NONE) return error;
1817 break; 1820 break;
1818 case PBK_Private: 1821 case PBK_Private:
1819 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 6, &(entry->Entries[i].Number))) != ERR_NONE) return error; 1822 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 6, &(entry->Entries[i].Number))) != ERR_NONE) return error;
1820 break; 1823 break;
1821 case PBK_Text_StreetAddress: 1824 case PBK_Text_StreetAddress:
1822 if ((error = ALCATEL_CreateField(s, Alcatel_string, 16, entry->Entries[i].Text)) != ERR_NONE) return error; 1825 if ((error = ALCATEL_CreateField(s, Alcatel_string, 16, entry->Entries[i].Text)) != ERR_NONE) return error;
1823 break; 1826 break;
1824 case PBK_Text_City: 1827 case PBK_Text_City:
1825 if ((error = ALCATEL_CreateField(s, Alcatel_string, 17, entry->Entries[i].Text)) != ERR_NONE) return error; 1828 if ((error = ALCATEL_CreateField(s, Alcatel_string, 17, entry->Entries[i].Text)) != ERR_NONE) return error;
1826 break; 1829 break;
1827 case PBK_Text_State: 1830 case PBK_Text_State:
1828 if ((error = ALCATEL_CreateField(s, Alcatel_string, 18, entry->Entries[i].Text)) != ERR_NONE) return error; 1831 if ((error = ALCATEL_CreateField(s, Alcatel_string, 18, entry->Entries[i].Text)) != ERR_NONE) return error;
1829 break; 1832 break;
1830 case PBK_Text_Zip: 1833 case PBK_Text_Zip:
1831 if ((error = ALCATEL_CreateField(s, Alcatel_string, 19, entry->Entries[i].Text)) != ERR_NONE) return error; 1834 if ((error = ALCATEL_CreateField(s, Alcatel_string, 19, entry->Entries[i].Text)) != ERR_NONE) return error;
1832 break; 1835 break;
1833 case PBK_Text_Country: 1836 case PBK_Text_Country:
1834 if ((error = ALCATEL_CreateField(s, Alcatel_string, 20, entry->Entries[i].Text)) != ERR_NONE) return error; 1837 if ((error = ALCATEL_CreateField(s, Alcatel_string, 20, entry->Entries[i].Text)) != ERR_NONE) return error;
1835 break; 1838 break;
1836 case PBK_Text_Custom1: 1839 case PBK_Text_Custom1:
1837 if ((error = ALCATEL_CreateField(s, Alcatel_string, 21, entry->Entries[i].Text)) != ERR_NONE) return error; 1840 if ((error = ALCATEL_CreateField(s, Alcatel_string, 21, entry->Entries[i].Text)) != ERR_NONE) return error;
1838 break; 1841 break;
1839 case PBK_Text_Custom2: 1842 case PBK_Text_Custom2:
1840 if ((error = ALCATEL_CreateField(s, Alcatel_string, 22, entry->Entries[i].Text)) != ERR_NONE) return error; 1843 if ((error = ALCATEL_CreateField(s, Alcatel_string, 22, entry->Entries[i].Text)) != ERR_NONE) return error;
1841 break; 1844 break;
1842 case PBK_Text_Custom3: 1845 case PBK_Text_Custom3:
1843 if ((error = ALCATEL_CreateField(s, Alcatel_string, 23, entry->Entries[i].Text)) != ERR_NONE) return error; 1846 if ((error = ALCATEL_CreateField(s, Alcatel_string, 23, entry->Entries[i].Text)) != ERR_NONE) return error;
1844 break; 1847 break;
1845 case PBK_Text_Custom4: 1848 case PBK_Text_Custom4:
1846 if ((error = ALCATEL_CreateField(s, Alcatel_string, 24, entry->Entries[i].Text)) != ERR_NONE) return error; 1849 if ((error = ALCATEL_CreateField(s, Alcatel_string, 24, entry->Entries[i].Text)) != ERR_NONE) return error;
1847 break; 1850 break;
1848 case PBK_PictureID: 1851 case PBK_PictureID:
1849 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) { 1852 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
1850 if ((error = ALCATEL_CreateField(s, Alcatel_int, 25, &(entry->Entries[i].Number))) != ERR_NONE) return error; 1853 if ((error = ALCATEL_CreateField(s, Alcatel_int, 25, &(entry->Entries[i].Number))) != ERR_NONE) return error;
1851 } else { 1854 } else {
1852 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType); 1855 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
1853 } 1856 }
1854 break; 1857 break;
1855 1858
1856 case PBK_Text_Name: NamePosition = i; break; 1859 case PBK_Text_Name: NamePosition = i; break;
1857 /* Following fields are not supported: */ 1860 /* Following fields are not supported: */
1858 case PBK_Text_UserID: 1861 case PBK_Text_UserID:
1859 case PBK_SMSListID: 1862 case PBK_SMSListID:
1860 case PBK_RingtoneFileSystemID: 1863 case PBK_RingtoneFileSystemID:
1861 case PBK_Date: 1864 case PBK_Date:
1862 case PBK_Caller_Group: 1865 case PBK_Caller_Group:
1863 case PBK_RingtoneID: 1866 case PBK_RingtoneID:
1864 case PBK_Text_Postal: 1867 case PBK_Text_Postal:
1865 case PBK_Text_URL: 1868 case PBK_Text_URL:
1866 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType); 1869 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
1867 break; 1870 break;
1868 } 1871 }
1869 } 1872 }
1870 if (NamePosition != -1) { 1873 if (NamePosition != -1) {
1871 if (NameSet) { 1874 if (NameSet) {
1872 smprintf(s,"WARNING: Ignoring name, not supported by phone\n"); 1875 smprintf(s,"WARNING: Ignoring name, not supported by phone\n");
1873 } else { 1876 } else {
1874 if ((error = ALCATEL_CreateField(s, Alcatel_string, 1, entry->Entries[i].Text)) != ERR_NONE) return error; 1877 if ((error = ALCATEL_CreateField(s, Alcatel_string, 1, entry->Entries[i].Text)) != ERR_NONE) return error;
1875 } 1878 }
1876 } 1879 }
1877 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 1880 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
1878 entry->Location = Priv->CommitedRecord; 1881 entry->Location = Priv->CommitedRecord;
1879 /* Refresh list */ 1882 /* Refresh list */
1880 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 1883 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
1881 return ERR_NONE; 1884 return ERR_NONE;
1882 } else { 1885 } else {
1883 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 1886 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
1884 return ATGEN_AddMemory(s, entry); 1887 return ATGEN_AddMemory(s, entry);
1885 } 1888 }
1886} 1889}
1887 1890
1888static GSM_Error ALCATEL_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 1891static GSM_Error ALCATEL_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
1889{ 1892{
1890 GSM_Error error; 1893 GSM_Error error;
1891 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 1894 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
1892 int NamePosition = -1; 1895 int NamePosition = -1;
1893 bool NameSet = false; 1896 bool NameSet = false;
1894 int i; 1897 int i;
1895 bool UpdatedFields[26]; 1898 bool UpdatedFields[26];
1896 1899
1897 if (entry->Location == 0) return ERR_INVALIDLOCATION; 1900 if (entry->Location == 0) return ERR_INVALIDLOCATION;
1898 1901
1899 if (entry->MemoryType == MEM_ME) { 1902 if (entry->MemoryType == MEM_ME) {
1900 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 1903 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
1901 /* Save modified entry */ 1904 /* Save modified entry */
1902 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 1905 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
1903 if ((error = ALCATEL_IsIdAvailable(s, entry->Location))!= ERR_NONE) { 1906 if ((error = ALCATEL_IsIdAvailable(s, entry->Location))!= ERR_NONE) {
1904 /* Entry doesn't exist, we will create new one */ 1907 /* Entry doesn't exist, we will create new one */
1905 return ALCATEL_AddMemory(s, entry); 1908 return ALCATEL_AddMemory(s, entry);
1906 } 1909 }
1907 /* Get fields for current item */ 1910 /* Get fields for current item */
1908 if ((error = ALCATEL_GetFields(s, entry->Location))!= ERR_NONE) return error; 1911 if ((error = ALCATEL_GetFields(s, entry->Location))!= ERR_NONE) return error;
1909 1912
1910 for (i = 0; i < 26; i++) { UpdatedFields[i] = false; } 1913 for (i = 0; i < 26; i++) { UpdatedFields[i] = false; }
1911 1914
1912 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeContacts, entry->Location))!= ERR_NONE) return error; 1915 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeContacts, entry->Location))!= ERR_NONE) return error;
1913 for (i = 0; i < entry->EntriesNum; i++) { 1916 for (i = 0; i < entry->EntriesNum; i++) {
1914 switch (entry->Entries[i].EntryType) { 1917 switch (entry->Entries[i].EntryType) {
1915 case PBK_Number_General: 1918 case PBK_Number_General:
1916 UpdatedFields[8] = true; 1919 UpdatedFields[8] = true;
1917 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 8, entry->Entries[i].Text)) != ERR_NONE) return error; 1920 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 8, entry->Entries[i].Text)) != ERR_NONE) return error;
1918 break; 1921 break;
1919 case PBK_Number_Mobile: 1922 case PBK_Number_Mobile:
1920 UpdatedFields[12] = true; 1923 UpdatedFields[12] = true;
1921 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 12, entry->Entries[i].Text)) != ERR_NONE) return error; 1924 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 12, entry->Entries[i].Text)) != ERR_NONE) return error;
1922 break; 1925 break;
1923 case PBK_Number_Work: 1926 case PBK_Number_Work:
1924 UpdatedFields[7] = true; 1927 UpdatedFields[7] = true;
1925 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 7, entry->Entries[i].Text)) != ERR_NONE) return error; 1928 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 7, entry->Entries[i].Text)) != ERR_NONE) return error;
1926 break; 1929 break;
1927 case PBK_Number_Fax: 1930 case PBK_Number_Fax:
1928 UpdatedFields[9] = true; 1931 UpdatedFields[9] = true;
1929 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 9, entry->Entries[i].Text)) != ERR_NONE) return error; 1932 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 9, entry->Entries[i].Text)) != ERR_NONE) return error;
1930 break; 1933 break;
1931 case PBK_Number_Home: 1934 case PBK_Number_Home:
1932 UpdatedFields[13] = true; 1935 UpdatedFields[13] = true;
1933 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 13, entry->Entries[i].Text)) != ERR_NONE) return error; 1936 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 13, entry->Entries[i].Text)) != ERR_NONE) return error;
1934 break; 1937 break;
1935 case PBK_Number_Pager: 1938 case PBK_Number_Pager:
1936 UpdatedFields[11] = true; 1939 UpdatedFields[11] = true;
1937 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 11, entry->Entries[i].Text)) != ERR_NONE) return error; 1940 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 11, entry->Entries[i].Text)) != ERR_NONE) return error;
1938 break; 1941 break;
1939 case PBK_Number_Other: 1942 case PBK_Number_Other:
1940 UpdatedFields[10] = true; 1943 UpdatedFields[10] = true;
1941 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 10, entry->Entries[i].Text)) != ERR_NONE) return error; 1944 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 10, entry->Entries[i].Text)) != ERR_NONE) return error;
1942 break; 1945 break;
1943 case PBK_Text_Note: 1946 case PBK_Text_Note:
1944 UpdatedFields[4] = true; 1947 UpdatedFields[4] = true;
1945 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 4, entry->Entries[i].Text)) != ERR_NONE) return error; 1948 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 4, entry->Entries[i].Text)) != ERR_NONE) return error;
1946 break; 1949 break;
1947 case PBK_Text_Email: 1950 case PBK_Text_Email:
1948 UpdatedFields[14] = true; 1951 UpdatedFields[14] = true;
1949 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 14, entry->Entries[i].Text)) != ERR_NONE) return error; 1952 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 14, entry->Entries[i].Text)) != ERR_NONE) return error;
1950 break; 1953 break;
1951 case PBK_Text_Email2: 1954 case PBK_Text_Email2:
1952 UpdatedFields[15] = true; 1955 UpdatedFields[15] = true;
1953 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 15, entry->Entries[i].Text)) != ERR_NONE) return error; 1956 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 15, entry->Entries[i].Text)) != ERR_NONE) return error;
1954 break; 1957 break;
1955 case PBK_Text_LastName: 1958 case PBK_Text_LastName:
1956 UpdatedFields[0] = true; 1959 UpdatedFields[0] = true;
1957 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 0, entry->Entries[i].Text)) != ERR_NONE) return error; NameSet = true; 1960 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 0, entry->Entries[i].Text)) != ERR_NONE) return error; NameSet = true;
1958 break; 1961 break;
1959 case PBK_Text_FirstName: 1962 case PBK_Text_FirstName:
1960 UpdatedFields[1] = true; 1963 UpdatedFields[1] = true;
1961 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 1, entry->Entries[i].Text)) != ERR_NONE) return error; NameSet = true; 1964 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 1, entry->Entries[i].Text)) != ERR_NONE) return error; NameSet = true;
1962 break; 1965 break;
1963 case PBK_Text_Company: 1966 case PBK_Text_Company:
1964 UpdatedFields[2] = true; 1967 UpdatedFields[2] = true;
1965 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 2, entry->Entries[i].Text)) != ERR_NONE) return error; 1968 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 2, entry->Entries[i].Text)) != ERR_NONE) return error;
1966 break; 1969 break;
1967 case PBK_Text_JobTitle: 1970 case PBK_Text_JobTitle:
1968 UpdatedFields[3] = true; 1971 UpdatedFields[3] = true;
1969 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 3, entry->Entries[i].Text)) != ERR_NONE) return error; 1972 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 3, entry->Entries[i].Text)) != ERR_NONE) return error;
1970 break; 1973 break;
1971 case PBK_Category: 1974 case PBK_Category:
1972 UpdatedFields[5] = true; 1975 UpdatedFields[5] = true;
1973 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, entry->Location, 5, &(entry->Entries[i].Number))) != ERR_NONE) return error; 1976 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, entry->Location, 5, &(entry->Entries[i].Number))) != ERR_NONE) return error;
1974 break; 1977 break;
1975 case PBK_Private: 1978 case PBK_Private:
1976 UpdatedFields[6] = true; 1979 UpdatedFields[6] = true;
1977 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, entry->Location, 6, &(entry->Entries[i].Number))) != ERR_NONE) return error; 1980 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, entry->Location, 6, &(entry->Entries[i].Number))) != ERR_NONE) return error;
1978 break; 1981 break;
1979 case PBK_Text_StreetAddress: 1982 case PBK_Text_StreetAddress:
1980 UpdatedFields[16] = true; 1983 UpdatedFields[16] = true;
1981 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 16, entry->Entries[i].Text)) != ERR_NONE) return error; 1984 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 16, entry->Entries[i].Text)) != ERR_NONE) return error;
1982 break; 1985 break;
1983 case PBK_Text_City: 1986 case PBK_Text_City:
1984 UpdatedFields[17] = true; 1987 UpdatedFields[17] = true;
1985 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 17, entry->Entries[i].Text)) != ERR_NONE) return error; 1988 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 17, entry->Entries[i].Text)) != ERR_NONE) return error;
1986 break; 1989 break;
1987 case PBK_Text_State: 1990 case PBK_Text_State:
1988 UpdatedFields[18] = true; 1991 UpdatedFields[18] = true;
1989 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 18, entry->Entries[i].Text)) != ERR_NONE) return error; 1992 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 18, entry->Entries[i].Text)) != ERR_NONE) return error;
1990 break; 1993 break;
1991 case PBK_Text_Zip: 1994 case PBK_Text_Zip:
1992 UpdatedFields[19] = true; 1995 UpdatedFields[19] = true;
1993 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 19, entry->Entries[i].Text)) != ERR_NONE) return error; 1996 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 19, entry->Entries[i].Text)) != ERR_NONE) return error;
1994 break; 1997 break;
1995 case PBK_Text_Country: 1998 case PBK_Text_Country:
1996 UpdatedFields[20] = true; 1999 UpdatedFields[20] = true;
1997 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 20, entry->Entries[i].Text)) != ERR_NONE) return error; 2000 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 20, entry->Entries[i].Text)) != ERR_NONE) return error;
1998 break; 2001 break;
1999 case PBK_Text_Custom1: 2002 case PBK_Text_Custom1:
2000 UpdatedFields[21] = true; 2003 UpdatedFields[21] = true;
2001 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 21, entry->Entries[i].Text)) != ERR_NONE) return error; 2004 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 21, entry->Entries[i].Text)) != ERR_NONE) return error;
2002 break; 2005 break;
2003 case PBK_Text_Custom2: 2006 case PBK_Text_Custom2:
2004 UpdatedFields[22] = true; 2007 UpdatedFields[22] = true;
2005 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 22, entry->Entries[i].Text)) != ERR_NONE) return error; 2008 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 22, entry->Entries[i].Text)) != ERR_NONE) return error;
2006 break; 2009 break;
2007 case PBK_Text_Custom3: 2010 case PBK_Text_Custom3:
2008 UpdatedFields[23] = true; 2011 UpdatedFields[23] = true;
2009 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 23, entry->Entries[i].Text)) != ERR_NONE) return error; 2012 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 23, entry->Entries[i].Text)) != ERR_NONE) return error;
2010 break; 2013 break;
2011 case PBK_Text_Custom4: 2014 case PBK_Text_Custom4:
2012 UpdatedFields[24] = true; 2015 UpdatedFields[24] = true;
2013 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 24, entry->Entries[i].Text)) != ERR_NONE) return error 2016 if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 24, entry->Entries[i].Text)) != ERR_NONE) return error
2014 ; break; 2017 ; break;
2015 case PBK_PictureID: 2018 case PBK_PictureID:
2016 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) { 2019 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
2017 UpdatedFields[25] = true; 2020 UpdatedFields[25] = true;
2018 if ((error = ALCATEL_UpdateField(s, Alcatel_int, entry->Location, 25, &(entry->Entries[i].Number))) != ERR_NONE) return error; 2021 if ((error = ALCATEL_UpdateField(s, Alcatel_int, entry->Location, 25, &(entry->Entries[i].Number))) != ERR_NONE) return error;
2019 } else { 2022 } else {
2020 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType); 2023 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
2021 } 2024 }
2022 break; 2025 break;
2023 2026
2024 case PBK_Text_Name: NamePosition = i; break; 2027 case PBK_Text_Name: NamePosition = i; break;
2025 /* Following fields are not supported: */ 2028 /* Following fields are not supported: */
2026 case PBK_SMSListID: 2029 case PBK_SMSListID:
2027 case PBK_Text_UserID: 2030 case PBK_Text_UserID:
2028 case PBK_RingtoneFileSystemID: 2031 case PBK_RingtoneFileSystemID:
2029 case PBK_Date: 2032 case PBK_Date:
2030 case PBK_Caller_Group: 2033 case PBK_Caller_Group:
2031 case PBK_RingtoneID: 2034 case PBK_RingtoneID:
2032 case PBK_Text_Postal: 2035 case PBK_Text_Postal:
2033 case PBK_Text_URL: 2036 case PBK_Text_URL:
2034 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType); 2037 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
2035 break; 2038 break;
2036 } 2039 }
2037 } 2040 }
2038 if (NamePosition != -1) { 2041 if (NamePosition != -1) {
2039 if (NameSet) { 2042 if (NameSet) {
2040 smprintf(s,"WARNING: Ignoring name, not supported by phone\n"); 2043 smprintf(s,"WARNING: Ignoring name, not supported by phone\n");
2041 } else { 2044 } else {
2042 UpdatedFields[1] = true; if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 1, entry->Entries[i].Text)) != ERR_NONE) return error; 2045 UpdatedFields[1] = true; if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 1, entry->Entries[i].Text)) != ERR_NONE) return error;
2043 } 2046 }
2044 } 2047 }
2045 /* If we didn't update some field, we have to delete it... */ 2048 /* If we didn't update some field, we have to delete it... */
2046 for (i=0; i<Priv->CurrentFieldsCount; i++) { 2049 for (i=0; i<Priv->CurrentFieldsCount; i++) {
2047 if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, entry->Location, Priv->CurrentFields[i])) != ERR_NONE) return error; 2050 if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, entry->Location, Priv->CurrentFields[i])) != ERR_NONE) return error;
2048 } 2051 }
2049 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 2052 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
2050 entry->Location = Priv->CommitedRecord; 2053 entry->Location = Priv->CommitedRecord;
2051 return ERR_NONE; 2054 return ERR_NONE;
2052 } else { 2055 } else {
2053 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2056 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2054 return ATGEN_SetMemory(s, entry); 2057 return ATGEN_SetMemory(s, entry);
2055 } 2058 }
2056} 2059}
2057 2060
2058static GSM_Error ALCATEL_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 2061static GSM_Error ALCATEL_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
2059{ 2062{
2060 GSM_Error error; 2063 GSM_Error error;
2061 2064
2062 if (entry->MemoryType == MEM_ME) { 2065 if (entry->MemoryType == MEM_ME) {
2063 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 2066 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
2064 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 2067 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
2065 if ((error = ALCATEL_IsIdAvailable(s, entry->Location))!= ERR_NONE) { 2068 if ((error = ALCATEL_IsIdAvailable(s, entry->Location))!= ERR_NONE) {
2066 /* Entry was empty => no error */ 2069 /* Entry was empty => no error */
2067 return ERR_NONE; 2070 return ERR_NONE;
2068 } 2071 }
2069 /* Do real delete */ 2072 /* Do real delete */
2070 error = ALCATEL_DeleteItem(s, entry->Location); 2073 error = ALCATEL_DeleteItem(s, entry->Location);
2071 if (error != ERR_NONE) return error; 2074 if (error != ERR_NONE) return error;
2072 2075
2073 /* Refresh list */ 2076 /* Refresh list */
2074 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 2077 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
2075 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 2078 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
2076 2079
2077 return ERR_NONE; 2080 return ERR_NONE;
2078 } else { 2081 } else {
2079 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2082 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2080 return ATGEN_DeleteMemory(s, entry); 2083 return ATGEN_DeleteMemory(s, entry);
2081 } 2084 }
2082} 2085}
2083 2086
2084static GSM_Error ALCATEL_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType type) 2087static GSM_Error ALCATEL_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType type)
2085{ 2088{
2086 GSM_Error error; 2089 GSM_Error error;
2087 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 2090 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
2088 int i; 2091 int i;
2089 2092
2090 if (type == MEM_ME) { 2093 if (type == MEM_ME) {
2091 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 2094 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
2092 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 2095 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
2093 2096
2094 for (i=0; i<Priv->ContactsItemsCount; i++) { 2097 for (i=0; i<Priv->ContactsItemsCount; i++) {
2095 error = ALCATEL_DeleteItem(s, Priv->ContactsItems[i]); 2098 error = ALCATEL_DeleteItem(s, Priv->ContactsItems[i]);
2096 if (error != ERR_NONE) return error; 2099 if (error != ERR_NONE) return error;
2097 } 2100 }
2098 2101
2099 /* Refresh list */ 2102 /* Refresh list */
2100 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error; 2103 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
2101 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 2104 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
2102 2105
2103 return ERR_NONE; 2106 return ERR_NONE;
2104 } else { 2107 } else {
2105 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2108 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2106 return ATGEN_DeleteAllMemory(s, type); 2109 return ATGEN_DeleteAllMemory(s, type);
2107 } 2110 }
2108} 2111}
2109 2112
2110static GSM_Error ALCATEL_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc) 2113static GSM_Error ALCATEL_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
2111{ 2114{
2112 GSM_Error error; 2115 GSM_Error error;
2113 2116
2114 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2117 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2115 return ATGEN_GetSMSC(s, smsc); 2118 return ATGEN_GetSMSC(s, smsc);
2116} 2119}
2117 2120
2118 2121
2119static GSM_Error ALCATEL_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status) 2122static GSM_Error ALCATEL_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
2120{ 2123{
2121 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL; 2124 GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
2122 GSM_Error error; 2125 GSM_Error error;
2123 2126
2124 if (Status->MemoryType == MEM_ME) { 2127 if (Status->MemoryType == MEM_ME) {
@@ -2183,97 +2186,97 @@ static GSM_Error ALCATEL_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *fold
2183 2186
2184static GSM_Error ALCATEL_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, bool start) 2187static GSM_Error ALCATEL_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, bool start)
2185{ 2188{
2186 GSM_Error error; 2189 GSM_Error error;
2187 2190
2188 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2191 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2189 return ATGEN_GetNextSMS(s, sms, start); 2192 return ATGEN_GetNextSMS(s, sms, start);
2190} 2193}
2191 2194
2192static GSM_Error ALCATEL_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status) 2195static GSM_Error ALCATEL_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
2193{ 2196{
2194 GSM_Error error; 2197 GSM_Error error;
2195 2198
2196 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2199 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2197 return ATGEN_GetSMSStatus(s, status); 2200 return ATGEN_GetSMSStatus(s, status);
2198} 2201}
2199 2202
2200static GSM_Error ALCATEL_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber) 2203static GSM_Error ALCATEL_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
2201{ 2204{
2202 GSM_Error error; 2205 GSM_Error error;
2203 2206
2204 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2207 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2205 return ATGEN_DialVoice(s, number, ShowNumber); 2208 return ATGEN_DialVoice(s, number, ShowNumber);
2206} 2209}
2207 2210
2208static GSM_Error ALCATEL_AnswerCall(GSM_StateMachine *s, int ID, bool all) 2211static GSM_Error ALCATEL_AnswerCall(GSM_StateMachine *s, int ID, bool all)
2209{ 2212{
2210 GSM_Error error; 2213 GSM_Error error;
2211 2214
2212 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2215 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2213 return ATGEN_AnswerCall(s,ID,all); 2216 return ATGEN_AnswerCall(s,ID,all);
2214} 2217}
2215 2218
2216static GSM_Error ALCATEL_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo) 2219static GSM_Error ALCATEL_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
2217{ 2220{
2218 GSM_Error error; 2221 GSM_Error error;
2219 2222
2220 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2223 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2221 return ATGEN_GetNetworkInfo(s, netinfo); 2224 return ATGEN_GetNetworkInfo(s, netinfo);
2222} 2225}
2223 2226
2224static GSM_Error ALCATEL_GetDisplayStatus(GSM_StateMachine *s, GSM_DisplayFeatures *features) 2227static GSM_Error ALCATEL_GetDisplayStatus(GSM_StateMachine *s, GSM_DisplayFeatures *features)
2225{ 2228{
2226 GSM_Error error; 2229 GSM_Error error;
2227 2230
2228 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2231 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2229 return ATGEN_GetDisplayStatus(s, features); 2232 return ATGEN_GetDisplayStatus(s, features);
2230} 2233}
2231 2234
2232static GSM_Error ALCATEL_SetAutoNetworkLogin(GSM_StateMachine *s) 2235static GSM_Error ALCATEL_SetAutoNetworkLogin(GSM_StateMachine *s)
2233{ 2236{
2234 GSM_Error error; 2237 GSM_Error error;
2235 2238
2236 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2239 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2237 return ATGEN_SetAutoNetworkLogin(s); 2240 return ATGEN_SetAutoNetworkLogin(s);
2238} 2241}
2239 2242
2240static GSM_Error ALCATEL_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, bool Press) 2243static GSM_Error ALCATEL_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, bool Press)
2241{ 2244{
2242 GSM_Error error; 2245 GSM_Error error;
2243 2246
2244 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2247 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2245 return ATGEN_PressKey(s, Key, Press); 2248 return ATGEN_PressKey(s, Key, Press);
2246} 2249}
2247 2250
2248static GSM_Error ALCATEL_Reset(GSM_StateMachine *s, bool hard) 2251static GSM_Error ALCATEL_Reset(GSM_StateMachine *s, bool hard)
2249{ 2252{
2250 GSM_Error error; 2253 GSM_Error error;
2251 2254
2252 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2255 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2253 return ATGEN_Reset(s, hard); 2256 return ATGEN_Reset(s, hard);
2254} 2257}
2255 2258
2256static GSM_Error ALCATEL_CancelCall(GSM_StateMachine *s, int ID, bool all) 2259static GSM_Error ALCATEL_CancelCall(GSM_StateMachine *s, int ID, bool all)
2257{ 2260{
2258 GSM_Error error; 2261 GSM_Error error;
2259 2262
2260 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2263 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2261 return ATGEN_CancelCall(s,ID,all); 2264 return ATGEN_CancelCall(s,ID,all);
2262} 2265}
2263 2266
2264static GSM_Error ALCATEL_SendSavedSMS(GSM_StateMachine *s, int Folder, int Location) 2267static GSM_Error ALCATEL_SendSavedSMS(GSM_StateMachine *s, int Folder, int Location)
2265{ 2268{
2266 GSM_Error error; 2269 GSM_Error error;
2267 2270
2268 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2271 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2269 return ATGEN_SendSavedSMS(s, Folder, Location); 2272 return ATGEN_SendSavedSMS(s, Folder, Location);
2270} 2273}
2271 2274
2272static GSM_Error ALCATEL_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms) 2275static GSM_Error ALCATEL_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
2273{ 2276{
2274 GSM_Error error; 2277 GSM_Error error;
2275 2278
2276 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2279 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2277 return ATGEN_SendSMS(s, sms); 2280 return ATGEN_SendSMS(s, sms);
2278} 2281}
2279 2282
@@ -2292,99 +2295,99 @@ static GSM_Error ALCATEL_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
2292 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2295 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2293 return ATGEN_SetSMSC(s, smsc); 2296 return ATGEN_SetSMSC(s, smsc);
2294} 2297}
2295 2298
2296static GSM_Error ALCATEL_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode Code) 2299static GSM_Error ALCATEL_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode Code)
2297{ 2300{
2298 GSM_Error error; 2301 GSM_Error error;
2299 2302
2300 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2303 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2301 return ATGEN_EnterSecurityCode(s, Code); 2304 return ATGEN_EnterSecurityCode(s, Code);
2302} 2305}
2303 2306
2304static GSM_Error ALCATEL_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status) 2307static GSM_Error ALCATEL_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
2305{ 2308{
2306 GSM_Error error; 2309 GSM_Error error;
2307 2310
2308 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2311 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2309 return ATGEN_GetSecurityStatus(s, Status); 2312 return ATGEN_GetSecurityStatus(s, Status);
2310} 2313}
2311 2314
2312static GSM_Error ALCATEL_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type) 2315static GSM_Error ALCATEL_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type)
2313{ 2316{
2314 GSM_Error error; 2317 GSM_Error error;
2315 2318
2316 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2319 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2317 return ATGEN_ResetPhoneSettings(s, Type); 2320 return ATGEN_ResetPhoneSettings(s, Type);
2318} 2321}
2319 2322
2320static GSM_Error ALCATEL_SendDTMF(GSM_StateMachine *s, char *sequence) 2323static GSM_Error ALCATEL_SendDTMF(GSM_StateMachine *s, char *sequence)
2321{ 2324{
2322 GSM_Error error; 2325 GSM_Error error;
2323 2326
2324 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2327 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2325 return ATGEN_SendDTMF(s, sequence); 2328 return ATGEN_SendDTMF(s, sequence);
2326} 2329}
2327 2330
2328static GSM_Error ALCATEL_GetSIMIMSI(GSM_StateMachine *s, char *IMSI) 2331static GSM_Error ALCATEL_GetSIMIMSI(GSM_StateMachine *s, char *IMSI)
2329{ 2332{
2330 GSM_Error error; 2333 GSM_Error error;
2331 2334
2332 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 2335 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
2333 return ATGEN_GetSIMIMSI(s, IMSI); 2336 return ATGEN_GetSIMIMSI(s, IMSI);
2334} 2337}
2335 2338
2336static GSM_Error ALCATEL_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *status) 2339static GSM_Error ALCATEL_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *status)
2337{ 2340{
2338 GSM_Error error; 2341 GSM_Error error;
2339 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 2342 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
2340 2343
2341 status->Used = 0; 2344 status->Used = 0;
2342 2345
2343 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2346 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2344 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 2347 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
2345 2348
2346 status->Used = Priv->CalendarItemsCount; 2349 status->Used = Priv->CalendarItemsCount;
2347 return ERR_NONE; 2350 return ERR_NONE;
2348} 2351}
2349 2352
2350static GSM_Error ALCATEL_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note) 2353static GSM_Error ALCATEL_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
2351{ 2354{
2352 GSM_Error error; 2355 GSM_Error error;
2353 GSM_DateTime *dt = NULL; 2356 GSM_DateTime *dt = NULL;
2354 GSM_DateTime evdate; 2357 GSM_DateTime evdate;
2355 bool evdateused = true; 2358 bool evdateused = true;
2356 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 2359 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
2357 int i; 2360 int i;
2358 int j=0; 2361 int j=0;
2359 2362
2360 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2363 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2361 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 2364 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
2362 if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) { 2365 if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) {
2363 Note->EntriesNum = 0; 2366 Note->EntriesNum = 0;
2364 return error; 2367 return error;
2365 } 2368 }
2366 if ((error = ALCATEL_GetFields(s, Note->Location))!= ERR_NONE) return error; 2369 if ((error = ALCATEL_GetFields(s, Note->Location))!= ERR_NONE) return error;
2367 2370
2368 Note->EntriesNum = Priv->CurrentFieldsCount; 2371 Note->EntriesNum = Priv->CurrentFieldsCount;
2369 2372
2370 for (i=0; i < Priv->CurrentFieldsCount; i++) { 2373 for (i=0; i < Priv->CurrentFieldsCount; i++) {
2371 if ((error = ALCATEL_GetFieldValue(s, Note->Location, Priv->CurrentFields[i]))!= ERR_NONE) return error; 2374 if ((error = ALCATEL_GetFieldValue(s, Note->Location, Priv->CurrentFields[i]))!= ERR_NONE) return error;
2372 switch (Priv->CurrentFields[i]) { 2375 switch (Priv->CurrentFields[i]) {
2373 case 0: 2376 case 0:
2374 if (Priv->ReturnType != Alcatel_date) { 2377 if (Priv->ReturnType != Alcatel_date) {
2375 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType); 2378 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
2376 Note->EntriesNum--; 2379 Note->EntriesNum--;
2377 j++; 2380 j++;
2378 break; 2381 break;
2379 } 2382 }
2380 if (!CheckDate(&(Priv->ReturnDateTime))) { 2383 if (!CheckDate(&(Priv->ReturnDateTime))) {
2381 smprintf(s,"WARNING: Invalid date in phone, ignoring\n"); 2384 smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
2382 Note->EntriesNum--; 2385 Note->EntriesNum--;
2383 j++; 2386 j++;
2384 break; 2387 break;
2385 } 2388 }
2386 j++; 2389 j++;
2387 Note->EntriesNum--; 2390 Note->EntriesNum--;
2388 evdate = Priv->ReturnDateTime; 2391 evdate = Priv->ReturnDateTime;
2389 evdateused = false; 2392 evdateused = false;
2390 break; 2393 break;
@@ -2682,556 +2685,556 @@ static GSM_Error ALCATEL_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Not
2682 break; 2685 break;
2683 } 2686 }
2684 /* This entry had always same value as the 4th (alarm time) */ 2687 /* This entry had always same value as the 4th (alarm time) */
2685 j++; 2688 j++;
2686 Note->EntriesNum--; 2689 Note->EntriesNum--;
2687 break; 2690 break;
2688 default: 2691 default:
2689 Note->EntriesNum--; 2692 Note->EntriesNum--;
2690 j++; 2693 j++;
2691 smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType); 2694 smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType);
2692 switch (Priv->ReturnType) { 2695 switch (Priv->ReturnType) {
2693 case Alcatel_date: 2696 case Alcatel_date:
2694 smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year); 2697 smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year);
2695 break; 2698 break;
2696 case Alcatel_time: 2699 case Alcatel_time:
2697 smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second); 2700 smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second);
2698 break; 2701 break;
2699 case Alcatel_string: 2702 case Alcatel_string:
2700 case Alcatel_phone: 2703 case Alcatel_phone:
2701 smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString)); 2704 smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString));
2702 break; 2705 break;
2703 case Alcatel_enum: 2706 case Alcatel_enum:
2704 case Alcatel_bool: 2707 case Alcatel_bool:
2705 case Alcatel_int: 2708 case Alcatel_int:
2706 case Alcatel_byte: 2709 case Alcatel_byte:
2707 smprintf(s, "%d", Priv->ReturnInt); 2710 smprintf(s, "%d", Priv->ReturnInt);
2708 break; 2711 break;
2709 } 2712 }
2710 smprintf(s,"\n"); 2713 smprintf(s,"\n");
2711 } 2714 }
2712 } 2715 }
2713 /* The event didn't have start/stop time -> we need only date */ 2716 /* The event didn't have start/stop time -> we need only date */
2714 if (!evdateused) { 2717 if (!evdateused) {
2715 Note->EntriesNum++; 2718 Note->EntriesNum++;
2716 Note->Entries[i-j].EntryType = CAL_START_DATETIME; 2719 Note->Entries[i-j].EntryType = CAL_START_DATETIME;
2717 Note->Entries[i-j].Date = evdate; 2720 Note->Entries[i-j].Date = evdate;
2718 } 2721 }
2719 return ERR_NONE; 2722 return ERR_NONE;
2720} 2723}
2721 2724
2722static GSM_Error ALCATEL_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start) 2725static GSM_Error ALCATEL_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start)
2723{ 2726{
2724 GSM_Error error; 2727 GSM_Error error;
2725 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 2728 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
2726 2729
2727 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2730 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2728 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 2731 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
2729 if (Priv->CalendarItemsCount == 0) return ERR_EMPTY; 2732 if (Priv->CalendarItemsCount == 0) return ERR_EMPTY;
2730 2733
2731 if (start) Note->Location = 0; 2734 if (start) Note->Location = 0;
2732 if ((error = ALCATEL_GetNextId(s, &(Note->Location))) != ERR_NONE) return error; 2735 if ((error = ALCATEL_GetNextId(s, &(Note->Location))) != ERR_NONE) return error;
2733 2736
2734 return ALCATEL_GetCalendar(s, Note); 2737 return ALCATEL_GetCalendar(s, Note);
2735} 2738}
2736 2739
2737 2740
2738static GSM_Error ALCATEL_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note) 2741static GSM_Error ALCATEL_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
2739{ 2742{
2740 GSM_Error error; 2743 GSM_Error error;
2741 2744
2742 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2745 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2743 /* Delete Calendar */ 2746 /* Delete Calendar */
2744 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 2747 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
2745 if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) { 2748 if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) {
2746 /* Entry was empty => no error */ 2749 /* Entry was empty => no error */
2747 return ERR_NONE; 2750 return ERR_NONE;
2748 } 2751 }
2749 error = ALCATEL_DeleteItem(s, Note->Location); 2752 error = ALCATEL_DeleteItem(s, Note->Location);
2750 if (error != ERR_NONE) return error; 2753 if (error != ERR_NONE) return error;
2751 /* Refresh list */ 2754 /* Refresh list */
2752 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2755 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2753 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 2756 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
2754 return ERR_NONE; 2757 return ERR_NONE;
2755} 2758}
2756 2759
2757 2760
2758static GSM_Error ALCATEL_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note) 2761static GSM_Error ALCATEL_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
2759{ 2762{
2760 GSM_Error error; 2763 GSM_Error error;
2761 unsigned int val; 2764 unsigned int val;
2762 bool contact_set = false; 2765 bool contact_set = false;
2763 bool phone_set = false; 2766 bool phone_set = false;
2764 bool date_set = false; 2767 bool date_set = false;
2765 bool repeating = false; 2768 bool repeating = false;
2766 int i; 2769 int i;
2767 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 2770 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
2768 2771
2769 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2772 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2770 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeCalendar, 0))!= ERR_NONE) return error; 2773 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeCalendar, 0))!= ERR_NONE) return error;
2771 2774
2772 for (i = 0; i < Note->EntriesNum; i++) { 2775 for (i = 0; i < Note->EntriesNum; i++) {
2773 switch (Note->Entries[i].EntryType) { 2776 switch (Note->Entries[i].EntryType) {
2774 case CAL_START_DATETIME: 2777 case CAL_START_DATETIME:
2775 if (!date_set) { 2778 if (!date_set) {
2776 if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2779 if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2777 date_set = true; 2780 date_set = true;
2778 } 2781 }
2779 if ((error = ALCATEL_CreateField(s, Alcatel_time, 1, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2782 if ((error = ALCATEL_CreateField(s, Alcatel_time, 1, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2780 break; 2783 break;
2781 case CAL_END_DATETIME: 2784 case CAL_END_DATETIME:
2782 if (!date_set) { 2785 if (!date_set) {
2783 if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2786 if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2784 date_set = true; 2787 date_set = true;
2785 } 2788 }
2786 if ((error = ALCATEL_CreateField(s, Alcatel_time, 2, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2789 if ((error = ALCATEL_CreateField(s, Alcatel_time, 2, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2787 break; 2790 break;
2788 case CAL_ALARM_DATETIME: 2791 case CAL_ALARM_DATETIME:
2789 if ((error = ALCATEL_CreateField(s, Alcatel_date, 3, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2792 if ((error = ALCATEL_CreateField(s, Alcatel_date, 3, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2790 if ((error = ALCATEL_CreateField(s, Alcatel_time, 4, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2793 if ((error = ALCATEL_CreateField(s, Alcatel_time, 4, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2791 if (Note->Type == GSM_CAL_ALARM || Note->Type == GSM_CAL_DAILY_ALARM) { 2794 if (Note->Type == GSM_CAL_ALARM || Note->Type == GSM_CAL_DAILY_ALARM) {
2792 if ((error = ALCATEL_CreateField(s, Alcatel_date, 20, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2795 if ((error = ALCATEL_CreateField(s, Alcatel_date, 20, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2793 if ((error = ALCATEL_CreateField(s, Alcatel_time, 21, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2796 if ((error = ALCATEL_CreateField(s, Alcatel_time, 21, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2794 } 2797 }
2795 break; 2798 break;
2796 case CAL_TEXT: 2799 case CAL_TEXT:
2797 if ((error = ALCATEL_CreateField(s, Alcatel_string, 5, Note->Entries[i].Text)) != ERR_NONE) return error; 2800 if ((error = ALCATEL_CreateField(s, Alcatel_string, 5, Note->Entries[i].Text)) != ERR_NONE) return error;
2798 break; 2801 break;
2799 case CAL_PRIVATE: 2802 case CAL_PRIVATE:
2800 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 6, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2803 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 6, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2801 break; 2804 break;
2802 case CAL_CONTACTID: 2805 case CAL_CONTACTID:
2803 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2806 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2804 contact_set = true; 2807 contact_set = true;
2805 break; 2808 break;
2806 case CAL_PHONE: 2809 case CAL_PHONE:
2807 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, Note->Entries[i].Text)) != ERR_NONE) return error; 2810 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, Note->Entries[i].Text)) != ERR_NONE) return error;
2808 phone_set = true; 2811 phone_set = true;
2809 break; 2812 break;
2810 case CAL_REPEAT_DAYOFWEEK: 2813 case CAL_REPEAT_DAYOFWEEK:
2811 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 10, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2814 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 10, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2812 repeating = true; 2815 repeating = true;
2813 break; 2816 break;
2814 case CAL_REPEAT_DAY: 2817 case CAL_REPEAT_DAY:
2815 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 11, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2818 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 11, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2816 repeating = true; 2819 repeating = true;
2817 break; 2820 break;
2818 case CAL_REPEAT_WEEKOFMONTH: 2821 case CAL_REPEAT_WEEKOFMONTH:
2819 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 12, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2822 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 12, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2820 repeating = true; 2823 repeating = true;
2821 break; 2824 break;
2822 case CAL_REPEAT_MONTH: 2825 case CAL_REPEAT_MONTH:
2823 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 13, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2826 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 13, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2824 repeating = true; 2827 repeating = true;
2825 break; 2828 break;
2826 case CAL_REPEAT_FREQUENCY: 2829 case CAL_REPEAT_FREQUENCY:
2827 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 17, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2830 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 17, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2828 repeating = true; 2831 repeating = true;
2829 break; 2832 break;
2830 case CAL_REPEAT_STARTDATE: 2833 case CAL_REPEAT_STARTDATE:
2831 if ((error = ALCATEL_CreateField(s, Alcatel_date, 18, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2834 if ((error = ALCATEL_CreateField(s, Alcatel_date, 18, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2832 repeating = true; 2835 repeating = true;
2833 break; 2836 break;
2834 case CAL_REPEAT_STOPDATE: 2837 case CAL_REPEAT_STOPDATE:
2835 if ((error = ALCATEL_CreateField(s, Alcatel_date, 19, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2838 if ((error = ALCATEL_CreateField(s, Alcatel_date, 19, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2836 repeating = true; 2839 repeating = true;
2837 break; 2840 break;
2838 case CAL_SILENT_ALARM_DATETIME: 2841 case CAL_SILENT_ALARM_DATETIME:
2839 case CAL_RECURRANCE: 2842 case CAL_RECURRANCE:
2840 case CAL_LOCATION: 2843 case CAL_LOCATION:
2841 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", Note->Entries[i].EntryType); 2844 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", Note->Entries[i].EntryType);
2842 break; 2845 break;
2843 } 2846 }
2844 } 2847 }
2845 2848
2846 switch (Note->Type) { 2849 switch (Note->Type) {
2847 case GSM_CAL_CALL: 2850 case GSM_CAL_CALL:
2848 val = 3; 2851 val = 3;
2849 break; 2852 break;
2850 case GSM_CAL_BIRTHDAY: 2853 case GSM_CAL_BIRTHDAY:
2851 val = 2; 2854 val = 2;
2852 break; 2855 break;
2853 case GSM_CAL_ALARM: 2856 case GSM_CAL_ALARM:
2854 val = 4; 2857 val = 4;
2855 break; 2858 break;
2856 case GSM_CAL_DAILY_ALARM: 2859 case GSM_CAL_DAILY_ALARM:
2857 val = 5; 2860 val = 5;
2858 break; 2861 break;
2859 default: 2862 default:
2860 if (repeating) { 2863 if (repeating) {
2861 val = 9; 2864 val = 9;
2862 } else { 2865 } else {
2863 val = 0; 2866 val = 0;
2864 } 2867 }
2865 } 2868 }
2866 if ((error = ALCATEL_CreateField(s, Alcatel_enum, 7, &val)) != ERR_NONE) return error; 2869 if ((error = ALCATEL_CreateField(s, Alcatel_enum, 7, &val)) != ERR_NONE) return error;
2867 2870
2868 if (!contact_set) { 2871 if (!contact_set) {
2869 if (phone_set) { 2872 if (phone_set) {
2870 val = 0xffffffff; 2873 val = 0xffffffff;
2871 } else { 2874 } else {
2872 val = 0; 2875 val = 0;
2873 } 2876 }
2874 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &val)) != ERR_NONE) return error; 2877 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &val)) != ERR_NONE) return error;
2875 } 2878 }
2876 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2879 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2877 Note->Location = Priv->CommitedRecord; 2880 Note->Location = Priv->CommitedRecord;
2878 /* Refresh list */ 2881 /* Refresh list */
2879 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 2882 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
2880 return ERR_NONE; 2883 return ERR_NONE;
2881} 2884}
2882 2885
2883static GSM_Error ALCATEL_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note) 2886static GSM_Error ALCATEL_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
2884{ 2887{
2885 GSM_Error error; 2888 GSM_Error error;
2886 unsigned int val; 2889 unsigned int val;
2887 bool contact_set = false; 2890 bool contact_set = false;
2888 bool phone_set = false; 2891 bool phone_set = false;
2889 bool date_set = false; 2892 bool date_set = false;
2890 bool repeating = false; 2893 bool repeating = false;
2891 int i; 2894 int i;
2892 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 2895 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
2893 bool UpdatedFields[22]; 2896 bool UpdatedFields[22];
2894 2897
2895 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 2898 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
2896 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 2899 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
2897 if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) { 2900 if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) {
2898 /* Entry doesn't exist, we will create new one */ 2901 /* Entry doesn't exist, we will create new one */
2899 return ALCATEL_AddCalendar(s, Note); 2902 return ALCATEL_AddCalendar(s, Note);
2900 } 2903 }
2901 /* Get fields for current item */ 2904 /* Get fields for current item */
2902 if ((error = ALCATEL_GetFields(s, Note->Location))!= ERR_NONE) return error; 2905 if ((error = ALCATEL_GetFields(s, Note->Location))!= ERR_NONE) return error;
2903 2906
2904 for (i = 0; i < 22; i++) { UpdatedFields[i] = false; } 2907 for (i = 0; i < 22; i++) { UpdatedFields[i] = false; }
2905 2908
2906 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeCalendar, Note->Location))!= ERR_NONE) return error; 2909 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeCalendar, Note->Location))!= ERR_NONE) return error;
2907 2910
2908 for (i = 0; i < Note->EntriesNum; i++) { 2911 for (i = 0; i < Note->EntriesNum; i++) {
2909 switch (Note->Entries[i].EntryType) { 2912 switch (Note->Entries[i].EntryType) {
2910 case CAL_START_DATETIME: 2913 case CAL_START_DATETIME:
2911 if (!date_set) { 2914 if (!date_set) {
2912 UpdatedFields[0] = true; 2915 UpdatedFields[0] = true;
2913 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2916 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2914 date_set = true; 2917 date_set = true;
2915 } 2918 }
2916 UpdatedFields[1] = true; 2919 UpdatedFields[1] = true;
2917 if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 1, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2920 if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 1, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2918 break; 2921 break;
2919 case CAL_END_DATETIME: 2922 case CAL_END_DATETIME:
2920 if (!date_set) { 2923 if (!date_set) {
2921 UpdatedFields[0] = true; 2924 UpdatedFields[0] = true;
2922 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2925 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2923 date_set = true; 2926 date_set = true;
2924 } 2927 }
2925 UpdatedFields[2] = true; if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 2, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2928 UpdatedFields[2] = true; if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 2, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2926 break; 2929 break;
2927 case CAL_ALARM_DATETIME: 2930 case CAL_ALARM_DATETIME:
2928 UpdatedFields[3] = true; 2931 UpdatedFields[3] = true;
2929 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 3, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2932 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 3, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2930 UpdatedFields[4] = true; 2933 UpdatedFields[4] = true;
2931 if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 4, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2934 if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 4, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2932 if (Note->Type == GSM_CAL_ALARM || Note->Type == GSM_CAL_DAILY_ALARM) { 2935 if (Note->Type == GSM_CAL_ALARM || Note->Type == GSM_CAL_DAILY_ALARM) {
2933 UpdatedFields[20] = true; 2936 UpdatedFields[20] = true;
2934 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 20, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2937 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 20, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2935 UpdatedFields[21] = true; 2938 UpdatedFields[21] = true;
2936 if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 21, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2939 if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 21, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2937 } 2940 }
2938 break; 2941 break;
2939 case CAL_TEXT: 2942 case CAL_TEXT:
2940 UpdatedFields[5] = true; 2943 UpdatedFields[5] = true;
2941 if ((error = ALCATEL_UpdateField(s, Alcatel_string, Note->Location, 5, Note->Entries[i].Text)) != ERR_NONE) return error; 2944 if ((error = ALCATEL_UpdateField(s, Alcatel_string, Note->Location, 5, Note->Entries[i].Text)) != ERR_NONE) return error;
2942 break; 2945 break;
2943 case CAL_PRIVATE: 2946 case CAL_PRIVATE:
2944 UpdatedFields[6] = true; 2947 UpdatedFields[6] = true;
2945 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, Note->Location, 6, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2948 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, Note->Location, 6, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2946 break; 2949 break;
2947 case CAL_CONTACTID: 2950 case CAL_CONTACTID:
2948 UpdatedFields[8] = true; 2951 UpdatedFields[8] = true;
2949 if ((error = ALCATEL_UpdateField(s, Alcatel_int, Note->Location, 8, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2952 if ((error = ALCATEL_UpdateField(s, Alcatel_int, Note->Location, 8, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2950 contact_set = true; 2953 contact_set = true;
2951 break; 2954 break;
2952 case CAL_PHONE: 2955 case CAL_PHONE:
2953 UpdatedFields[9] = true; 2956 UpdatedFields[9] = true;
2954 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, Note->Location, 9, Note->Entries[i].Text)) != ERR_NONE) return error; 2957 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, Note->Location, 9, Note->Entries[i].Text)) != ERR_NONE) return error;
2955 phone_set = true; 2958 phone_set = true;
2956 break; 2959 break;
2957 case CAL_REPEAT_DAYOFWEEK: 2960 case CAL_REPEAT_DAYOFWEEK:
2958 UpdatedFields[10] = true; 2961 UpdatedFields[10] = true;
2959 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 10, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2962 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 10, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2960 repeating = true; 2963 repeating = true;
2961 break; 2964 break;
2962 case CAL_REPEAT_DAY: 2965 case CAL_REPEAT_DAY:
2963 UpdatedFields[11] = true; 2966 UpdatedFields[11] = true;
2964 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 11, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2967 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 11, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2965 repeating = true; 2968 repeating = true;
2966 break; 2969 break;
2967 case CAL_REPEAT_WEEKOFMONTH: 2970 case CAL_REPEAT_WEEKOFMONTH:
2968 UpdatedFields[12] = true; 2971 UpdatedFields[12] = true;
2969 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 12, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2972 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 12, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2970 repeating = true; 2973 repeating = true;
2971 break; 2974 break;
2972 case CAL_REPEAT_MONTH: 2975 case CAL_REPEAT_MONTH:
2973 UpdatedFields[13] = true; 2976 UpdatedFields[13] = true;
2974 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 13, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2977 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 13, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2975 repeating = true; 2978 repeating = true;
2976 break; 2979 break;
2977 case CAL_REPEAT_FREQUENCY: 2980 case CAL_REPEAT_FREQUENCY:
2978 UpdatedFields[17] = true; 2981 UpdatedFields[17] = true;
2979 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 17, &(Note->Entries[i].Number))) != ERR_NONE) return error; 2982 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 17, &(Note->Entries[i].Number))) != ERR_NONE) return error;
2980 repeating = true; 2983 repeating = true;
2981 break; 2984 break;
2982 case CAL_REPEAT_STARTDATE: 2985 case CAL_REPEAT_STARTDATE:
2983 UpdatedFields[18] = true; 2986 UpdatedFields[18] = true;
2984 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 18, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2987 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 18, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2985 repeating = true; 2988 repeating = true;
2986 break; 2989 break;
2987 case CAL_REPEAT_STOPDATE: 2990 case CAL_REPEAT_STOPDATE:
2988 UpdatedFields[19] = true; 2991 UpdatedFields[19] = true;
2989 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 19, &(Note->Entries[i].Date))) != ERR_NONE) return error; 2992 if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 19, &(Note->Entries[i].Date))) != ERR_NONE) return error;
2990 repeating = true; 2993 repeating = true;
2991 break; 2994 break;
2992 case CAL_SILENT_ALARM_DATETIME: 2995 case CAL_SILENT_ALARM_DATETIME:
2993 case CAL_RECURRANCE: 2996 case CAL_RECURRANCE:
2994 case CAL_LOCATION: 2997 case CAL_LOCATION:
2995 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", Note->Entries[i].EntryType); 2998 smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", Note->Entries[i].EntryType);
2996 break; 2999 break;
2997 } 3000 }
2998 } 3001 }
2999 3002
3000 switch (Note->Type) { 3003 switch (Note->Type) {
3001 case GSM_CAL_CALL: 3004 case GSM_CAL_CALL:
3002 val = 3; 3005 val = 3;
3003 break; 3006 break;
3004 case GSM_CAL_BIRTHDAY: 3007 case GSM_CAL_BIRTHDAY:
3005 val = 2; 3008 val = 2;
3006 break; 3009 break;
3007 case GSM_CAL_ALARM: 3010 case GSM_CAL_ALARM:
3008 val = 4; 3011 val = 4;
3009 break; 3012 break;
3010 case GSM_CAL_DAILY_ALARM: 3013 case GSM_CAL_DAILY_ALARM:
3011 val = 5; 3014 val = 5;
3012 break; 3015 break;
3013 default: 3016 default:
3014 if (repeating) { 3017 if (repeating) {
3015 val = 9; 3018 val = 9;
3016 } else { 3019 } else {
3017 val = 0; 3020 val = 0;
3018 } 3021 }
3019 } 3022 }
3020 UpdatedFields[7] = true; 3023 UpdatedFields[7] = true;
3021 if ((error = ALCATEL_UpdateField(s, Alcatel_enum, Note->Location, 7, &val)) != ERR_NONE) return error; 3024 if ((error = ALCATEL_UpdateField(s, Alcatel_enum, Note->Location, 7, &val)) != ERR_NONE) return error;
3022 3025
3023 if (!contact_set) { 3026 if (!contact_set) {
3024 if (phone_set) { 3027 if (phone_set) {
3025 val = 0xffffffff; 3028 val = 0xffffffff;
3026 } else { 3029 } else {
3027 val = 0; 3030 val = 0;
3028 } 3031 }
3029 UpdatedFields[8] = true; 3032 UpdatedFields[8] = true;
3030 if ((error = ALCATEL_UpdateField(s, Alcatel_int, Note->Location, 8, &val)) != ERR_NONE) return error; 3033 if ((error = ALCATEL_UpdateField(s, Alcatel_int, Note->Location, 8, &val)) != ERR_NONE) return error;
3031 } 3034 }
3032 /* If we didn't update some field, we have to delete it... */ 3035 /* If we didn't update some field, we have to delete it... */
3033 for (i=0; i<Priv->CurrentFieldsCount; i++) { 3036 for (i=0; i<Priv->CurrentFieldsCount; i++) {
3034 if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, Note->Location, Priv->CurrentFields[i])) != ERR_NONE) return error; 3037 if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, Note->Location, Priv->CurrentFields[i])) != ERR_NONE) return error;
3035 } 3038 }
3036 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 3039 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
3037 return ERR_NONE; 3040 return ERR_NONE;
3038} 3041}
3039 3042
3040static GSM_Error ALCATEL_DeleteAllCalendar (GSM_StateMachine *s) 3043static GSM_Error ALCATEL_DeleteAllCalendar (GSM_StateMachine *s)
3041{ 3044{
3042 GSM_Error error; 3045 GSM_Error error;
3043 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3046 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3044 int i; 3047 int i;
3045 3048
3046 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 3049 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
3047 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3050 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3048 3051
3049 for (i=0; i<Priv->CalendarItemsCount; i++) { 3052 for (i=0; i<Priv->CalendarItemsCount; i++) {
3050 error = ALCATEL_DeleteItem(s, Priv->CalendarItems[i]); 3053 error = ALCATEL_DeleteItem(s, Priv->CalendarItems[i]);
3051 if (error != ERR_NONE) return error; 3054 if (error != ERR_NONE) return error;
3052 } 3055 }
3053 3056
3054 /* Refresh list */ 3057 /* Refresh list */
3055 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 3058 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
3056 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 3059 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
3057 3060
3058 return ERR_NONE; 3061 return ERR_NONE;
3059} 3062}
3060 3063
3061 3064
3062static GSM_Error ALCATEL_GetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm) 3065static GSM_Error ALCATEL_GetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm)
3063{ 3066{
3064 GSM_Error error; 3067 GSM_Error error;
3065 GSM_CalendarEntryNote; 3068 GSM_CalendarEntryNote;
3066 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3069 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3067 int i; 3070 int i;
3068 bool Found = false; 3071 bool Found = false;
3069 bool DateSet = false; 3072 bool DateSet = false;
3070 int alarm_number = alarm->Location; 3073 int alarm_number = alarm->Location;
3071 static GSM_DateTimenulldt = {0,0,0,0,0,0,0}; 3074 static GSM_DateTimenulldt = {0,0,0,0,0,0,0};
3072 3075
3073 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 3076 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
3074 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3077 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3075 3078
3076 for (i=0; i<Priv->CalendarItemsCount; i++) { 3079 for (i=0; i<Priv->CalendarItemsCount; i++) {
3077 if ((error = ALCATEL_GetFieldValue(s, Priv->CalendarItems[i], 7))!= ERR_NONE) return error; 3080 if ((error = ALCATEL_GetFieldValue(s, Priv->CalendarItems[i], 7))!= ERR_NONE) return error;
3078 if (Priv->ReturnType != Alcatel_enum) { 3081 if (Priv->ReturnType != Alcatel_enum) {
3079 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType); 3082 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
3080 continue; 3083 continue;
3081 } 3084 }
3082 if (Priv->ReturnInt == 4 || Priv->ReturnInt == 5) { 3085 if (Priv->ReturnInt == 4 || Priv->ReturnInt == 5) {
3083 alarm_number--; 3086 alarm_number--;
3084 if (alarm_number == 0) { 3087 if (alarm_number == 0) {
3085 Found = true; 3088 Found = true;
3086 break; 3089 break;
3087 } 3090 }
3088 } 3091 }
3089 } 3092 }
3090 3093
3091 if (!Found) return ERR_EMPTY; 3094 if (!Found) return ERR_EMPTY;
3092 3095
3093 Note.Location = Priv->CalendarItems[i]; 3096 Note.Location = Priv->CalendarItems[i];
3094 3097
3095 if ((error = ALCATEL_GetCalendar(s, &Note))!= ERR_NONE) return error; 3098 if ((error = ALCATEL_GetCalendar(s, &Note))!= ERR_NONE) return error;
3096 3099
3097 if (Note.Type == GSM_CAL_ALARM) { 3100 if (Note.Type == GSM_CAL_ALARM) {
3098 alarm->Repeating = false; 3101 alarm->Repeating = false;
3099 } else { 3102 } else {
3100 alarm->Repeating = true; 3103 alarm->Repeating = true;
3101 } 3104 }
3102 3105
3103 alarm->Text[0] = 0; alarm->Text[1] = 0; 3106 alarm->Text[0] = 0; alarm->Text[1] = 0;
3104 3107
3105 3108
3106 for (i = 0; i < Note.EntriesNum; i++) { 3109 for (i = 0; i < Note.EntriesNum; i++) {
3107 if (Note.Entries[i].EntryType == CAL_TEXT) { 3110 if (Note.Entries[i].EntryType == CAL_TEXT) {
3108 CopyUnicodeString(alarm->Text, Note.Entries[i].Text); 3111 CopyUnicodeString(alarm->Text, Note.Entries[i].Text);
3109 } else if (Note.Entries[i].EntryType == CAL_ALARM_DATETIME) { 3112 } else if (Note.Entries[i].EntryType == CAL_ALARM_DATETIME) {
3110 alarm->DateTime = Note.Entries[i].Date; 3113 alarm->DateTime = Note.Entries[i].Date;
3111 DateSet = false; 3114 DateSet = false;
3112 } 3115 }
3113 } 3116 }
3114 if (!DateSet) { 3117 if (!DateSet) {
3115 alarm->DateTime = nulldt; 3118 alarm->DateTime = nulldt;
3116 } 3119 }
3117 3120
3118 return ERR_NONE; 3121 return ERR_NONE;
3119} 3122}
3120 3123
3121 3124
3122static GSM_Error ALCATEL_SetAlarm (GSM_StateMachine *s, GSM_Alarm *alarm) 3125static GSM_Error ALCATEL_SetAlarm (GSM_StateMachine *s, GSM_Alarm *alarm)
3123{ 3126{
3124 GSM_Error error; 3127 GSM_Error error;
3125 GSM_CalendarEntryNote; 3128 GSM_CalendarEntryNote;
3126 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3129 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3127 GSM_DateTime dt; 3130 GSM_DateTime dt;
3128 int i; 3131 int i;
3129 bool Found = false; 3132 bool Found = false;
3130 int alarm_number = alarm->Location; 3133 int alarm_number = alarm->Location;
3131 3134
3132 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error; 3135 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
3133 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3136 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3134 3137
3135 for (i=0; i<Priv->CalendarItemsCount; i++) { 3138 for (i=0; i<Priv->CalendarItemsCount; i++) {
3136 if ((error = ALCATEL_GetFieldValue(s, Priv->CalendarItems[i], 7))!= ERR_NONE) return error; 3139 if ((error = ALCATEL_GetFieldValue(s, Priv->CalendarItems[i], 7))!= ERR_NONE) return error;
3137 if (Priv->ReturnType != Alcatel_enum) { 3140 if (Priv->ReturnType != Alcatel_enum) {
3138 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType); 3141 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
3139 continue; 3142 continue;
3140 } 3143 }
3141 if (Priv->ReturnInt == 4 || Priv->ReturnInt == 5) { 3144 if (Priv->ReturnInt == 4 || Priv->ReturnInt == 5) {
3142 alarm_number--; 3145 alarm_number--;
3143 if (alarm_number == 0) { 3146 if (alarm_number == 0) {
3144 Found = true; 3147 Found = true;
3145 break; 3148 break;
3146 } 3149 }
3147 } 3150 }
3148 } 3151 }
3149 3152
3150 if (Found) { 3153 if (Found) {
3151 Note.Location = Priv->CalendarItems[i]; 3154 Note.Location = Priv->CalendarItems[i];
3152 } 3155 }
3153 3156
3154 Note.EntriesNum = 1; 3157 Note.EntriesNum = 1;
3155 3158
3156 Note.Entries[0].EntryType = CAL_ALARM_DATETIME; 3159 Note.Entries[0].EntryType = CAL_ALARM_DATETIME;
3157 Note.Entries[0].Date = alarm->DateTime; 3160 Note.Entries[0].Date = alarm->DateTime;
3158 3161
3159 if (alarm->Repeating) { 3162 if (alarm->Repeating) {
3160 Note.Type = GSM_CAL_DAILY_ALARM; 3163 Note.Type = GSM_CAL_DAILY_ALARM;
3161 GSM_GetCurrentDateTime(&dt); 3164 GSM_GetCurrentDateTime(&dt);
3162 Note.Entries[0].Date.Day = dt.Day; 3165 Note.Entries[0].Date.Day = dt.Day;
3163 Note.Entries[0].Date.Month = dt.Month; 3166 Note.Entries[0].Date.Month = dt.Month;
3164 Note.Entries[0].Date.Year = dt.Year; 3167 Note.Entries[0].Date.Year = dt.Year;
3165 } else { 3168 } else {
3166 Note.Type = GSM_CAL_ALARM; 3169 Note.Type = GSM_CAL_ALARM;
3167 } 3170 }
3168 3171
3169 if (alarm->Text[0] != 0 || alarm->Text[1] != 0) { 3172 if (alarm->Text[0] != 0 || alarm->Text[1] != 0) {
3170 Note.EntriesNum++; 3173 Note.EntriesNum++;
3171 Note.Entries[1].EntryType = CAL_TEXT; 3174 Note.Entries[1].EntryType = CAL_TEXT;
3172 CopyUnicodeString(Note.Entries[1].Text, alarm->Text); 3175 CopyUnicodeString(Note.Entries[1].Text, alarm->Text);
3173 } 3176 }
3174 3177
3175 if (Found) { 3178 if (Found) {
3176 return ALCATEL_SetCalendar(s, &Note); 3179 return ALCATEL_SetCalendar(s, &Note);
3177 } else { 3180 } else {
3178 return ALCATEL_AddCalendar(s, &Note); 3181 return ALCATEL_AddCalendar(s, &Note);
3179 } 3182 }
3180} 3183}
3181 3184
3182 3185
3183static GSM_Error ALCATEL_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status) 3186static GSM_Error ALCATEL_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
3184{ 3187{
3185 GSM_Error error; 3188 GSM_Error error;
3186 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3189 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3187 3190
3188 status->Used = 0; 3191 status->Used = 0;
3189 3192
3190 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3193 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3191 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 3194 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
3192 3195
3193 status->Used = Priv->ToDoItemsCount; 3196 status->Used = Priv->ToDoItemsCount;
3194 return ERR_NONE; 3197 return ERR_NONE;
3195} 3198}
3196 3199
3197static GSM_Error ALCATEL_GetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo) 3200static GSM_Error ALCATEL_GetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
3198{ 3201{
3199 GSM_Error error; 3202 GSM_Error error;
3200 GSM_DateTime *dt = NULL; 3203 GSM_DateTime *dt = NULL;
3201 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3204 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3202 int i; 3205 int i;
3203 int j=0; 3206 int j=0;
3204 3207
3205 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3208 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3206 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3209 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3207 if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) { 3210 if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) {
3208 ToDo->EntriesNum = 0; 3211 ToDo->EntriesNum = 0;
3209 return error; 3212 return error;
3210 } 3213 }
3211 if ((error = ALCATEL_GetFields(s, ToDo->Location))!= ERR_NONE) return error; 3214 if ((error = ALCATEL_GetFields(s, ToDo->Location))!= ERR_NONE) return error;
3212 3215
3213 ToDo->EntriesNum = Priv->CurrentFieldsCount; 3216 ToDo->EntriesNum = Priv->CurrentFieldsCount;
3214 3217
3215 for (i=0; i < Priv->CurrentFieldsCount; i++) { 3218 for (i=0; i < Priv->CurrentFieldsCount; i++) {
3216 if ((error = ALCATEL_GetFieldValue(s, ToDo->Location, Priv->CurrentFields[i]))!= ERR_NONE) return error; 3219 if ((error = ALCATEL_GetFieldValue(s, ToDo->Location, Priv->CurrentFields[i]))!= ERR_NONE) return error;
3217 switch (Priv->CurrentFields[i]) { 3220 switch (Priv->CurrentFields[i]) {
3218 case 0: 3221 case 0:
3219 if (Priv->ReturnType != Alcatel_date) { 3222 if (Priv->ReturnType != Alcatel_date) {
3220 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType); 3223 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
3221 ToDo->EntriesNum--; 3224 ToDo->EntriesNum--;
3222 j++; 3225 j++;
3223 break; 3226 break;
3224 } 3227 }
3225 if (!CheckDate(&(Priv->ReturnDateTime))) { 3228 if (!CheckDate(&(Priv->ReturnDateTime))) {
3226 smprintf(s,"WARNING: Invalid date in phone, ignoring\n"); 3229 smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
3227 ToDo->EntriesNum--; 3230 ToDo->EntriesNum--;
3228 j++; 3231 j++;
3229 break; 3232 break;
3230 } 3233 }
3231 ToDo->Entries[i-j].EntryType = TODO_END_DATETIME; 3234 ToDo->Entries[i-j].EntryType = TODO_END_DATETIME;
3232 ToDo->Entries[i-j].Date = Priv->ReturnDateTime; 3235 ToDo->Entries[i-j].Date = Priv->ReturnDateTime;
3233 break; 3236 break;
3234 case 1: 3237 case 1:
3235 if (Priv->ReturnType != Alcatel_bool) { 3238 if (Priv->ReturnType != Alcatel_bool) {
3236 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType); 3239 smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
3237 ToDo->EntriesNum--; 3240 ToDo->EntriesNum--;
@@ -3406,289 +3409,289 @@ static GSM_Error ALCATEL_GetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
3406 break; 3409 break;
3407 } 3410 }
3408 if (!CheckTime(&(Priv->ReturnDateTime))) { 3411 if (!CheckTime(&(Priv->ReturnDateTime))) {
3409 smprintf(s,"WARNING: Invalid time in phone, ignoring\n"); 3412 smprintf(s,"WARNING: Invalid time in phone, ignoring\n");
3410 ToDo->EntriesNum--; 3413 ToDo->EntriesNum--;
3411 j++; 3414 j++;
3412 break; 3415 break;
3413 } 3416 }
3414 /* This entry had always same value as the 3rd (alarm time) */ 3417 /* This entry had always same value as the 3rd (alarm time) */
3415 j++; 3418 j++;
3416 ToDo->EntriesNum--; 3419 ToDo->EntriesNum--;
3417 break; 3420 break;
3418 default: 3421 default:
3419 ToDo->EntriesNum--; 3422 ToDo->EntriesNum--;
3420 j++; 3423 j++;
3421 smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType); 3424 smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType);
3422 switch (Priv->ReturnType) { 3425 switch (Priv->ReturnType) {
3423 case Alcatel_date: 3426 case Alcatel_date:
3424 smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year); 3427 smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year);
3425 break; 3428 break;
3426 case Alcatel_time: 3429 case Alcatel_time:
3427 smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second); 3430 smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second);
3428 break; 3431 break;
3429 case Alcatel_string: 3432 case Alcatel_string:
3430 case Alcatel_phone: 3433 case Alcatel_phone:
3431 smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString)); 3434 smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString));
3432 break; 3435 break;
3433 case Alcatel_enum: 3436 case Alcatel_enum:
3434 case Alcatel_bool: 3437 case Alcatel_bool:
3435 case Alcatel_int: 3438 case Alcatel_int:
3436 case Alcatel_byte: 3439 case Alcatel_byte:
3437 smprintf(s, "%d", Priv->ReturnInt); 3440 smprintf(s, "%d", Priv->ReturnInt);
3438 break; 3441 break;
3439 } 3442 }
3440 smprintf(s,"\n"); 3443 smprintf(s,"\n");
3441 } 3444 }
3442 } 3445 }
3443 return ERR_NONE; 3446 return ERR_NONE;
3444} 3447}
3445 3448
3446static GSM_Error ALCATEL_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool start) 3449static GSM_Error ALCATEL_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool start)
3447{ 3450{
3448 GSM_Error error; 3451 GSM_Error error;
3449 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3452 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3450 3453
3451 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3454 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3452 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3455 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3453 if (Priv->ToDoItemsCount == 0) return ERR_EMPTY; 3456 if (Priv->ToDoItemsCount == 0) return ERR_EMPTY;
3454 3457
3455 if (start) ToDo->Location = 0; 3458 if (start) ToDo->Location = 0;
3456 if ((error = ALCATEL_GetNextId(s, &(ToDo->Location))) != ERR_NONE) return error; 3459 if ((error = ALCATEL_GetNextId(s, &(ToDo->Location))) != ERR_NONE) return error;
3457 3460
3458 return ALCATEL_GetToDo(s, ToDo); 3461 return ALCATEL_GetToDo(s, ToDo);
3459} 3462}
3460 3463
3461static GSM_Error ALCATEL_DeleteAllToDo (GSM_StateMachine *s) 3464static GSM_Error ALCATEL_DeleteAllToDo (GSM_StateMachine *s)
3462{ 3465{
3463 GSM_Error error; 3466 GSM_Error error;
3464 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3467 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3465 int i; 3468 int i;
3466 3469
3467 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3470 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3468 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3471 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3469 3472
3470 for (i=0; i<Priv->ToDoItemsCount; i++) { 3473 for (i=0; i<Priv->ToDoItemsCount; i++) {
3471 error = ALCATEL_DeleteItem(s, Priv->ToDoItems[i]); 3474 error = ALCATEL_DeleteItem(s, Priv->ToDoItems[i]);
3472 if (error != ERR_NONE) return error; 3475 if (error != ERR_NONE) return error;
3473 } 3476 }
3474 3477
3475 /* Refresh list */ 3478 /* Refresh list */
3476 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3479 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3477 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 3480 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
3478 3481
3479 return ERR_NONE; 3482 return ERR_NONE;
3480} 3483}
3481 3484
3482static GSM_Error ALCATEL_AddToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo) 3485static GSM_Error ALCATEL_AddToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
3483{ 3486{
3484 GSM_Error error; 3487 GSM_Error error;
3485 unsigned int val; 3488 unsigned int val;
3486 bool contact_set = false; 3489 bool contact_set = false;
3487 bool phone_set = false; 3490 bool phone_set = false;
3488 int i; 3491 int i;
3489 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3492 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3490 3493
3491 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3494 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3492 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeToDo, 0))!= ERR_NONE) return error; 3495 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeToDo, 0))!= ERR_NONE) return error;
3493 3496
3494 switch (ToDo->Priority) { 3497 switch (ToDo->Priority) {
3495 case GSM_Priority_High: 3498 case GSM_Priority_High:
3496 val = 0; 3499 val = 0;
3497 break; 3500 break;
3498 case GSM_Priority_Low: 3501 case GSM_Priority_Low:
3499 val = 2; 3502 val = 2;
3500 break; 3503 break;
3501 case GSM_Priority_Medium: 3504 case GSM_Priority_Medium:
3502 default: 3505 default:
3503 val = 1; 3506 val = 1;
3504 break; 3507 break;
3505 } 3508 }
3506 /* This one seems to be byte for BF5 and enum for BE5 */ 3509 /* This one seems to be byte for BF5 and enum for BE5 */
3507 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) { 3510 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
3508 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 7, &val)) != ERR_NONE) return error; 3511 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 7, &val)) != ERR_NONE) return error;
3509 } else { 3512 } else {
3510 if ((error = ALCATEL_CreateField(s, Alcatel_enum, 7, &val)) != ERR_NONE) return error; 3513 if ((error = ALCATEL_CreateField(s, Alcatel_enum, 7, &val)) != ERR_NONE) return error;
3511 } 3514 }
3512 3515
3513 for (i = 0; i < ToDo->EntriesNum; i++) { 3516 for (i = 0; i < ToDo->EntriesNum; i++) {
3514 switch (ToDo->Entries[i].EntryType) { 3517 switch (ToDo->Entries[i].EntryType) {
3515 case TODO_END_DATETIME: 3518 case TODO_END_DATETIME:
3516 if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3519 if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3517 break; 3520 break;
3518 case TODO_COMPLETED: 3521 case TODO_COMPLETED:
3519 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 1, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3522 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 1, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3520 break; 3523 break;
3521 case TODO_ALARM_DATETIME: 3524 case TODO_ALARM_DATETIME:
3522 if ((error = ALCATEL_CreateField(s, Alcatel_date, 2, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3525 if ((error = ALCATEL_CreateField(s, Alcatel_date, 2, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3523 if ((error = ALCATEL_CreateField(s, Alcatel_time, 3, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3526 if ((error = ALCATEL_CreateField(s, Alcatel_time, 3, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3524 if ((error = ALCATEL_CreateField(s, Alcatel_date, 10, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3527 if ((error = ALCATEL_CreateField(s, Alcatel_date, 10, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3525 if ((error = ALCATEL_CreateField(s, Alcatel_time, 11, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3528 if ((error = ALCATEL_CreateField(s, Alcatel_time, 11, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3526 break; 3529 break;
3527 case TODO_TEXT: 3530 case TODO_TEXT:
3528 if ((error = ALCATEL_CreateField(s, Alcatel_string, 4, ToDo->Entries[i].Text)) != ERR_NONE) return error; 3531 if ((error = ALCATEL_CreateField(s, Alcatel_string, 4, ToDo->Entries[i].Text)) != ERR_NONE) return error;
3529 break; 3532 break;
3530 case TODO_PRIVATE: 3533 case TODO_PRIVATE:
3531 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 5, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3534 if ((error = ALCATEL_CreateField(s, Alcatel_bool, 5, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3532 break; 3535 break;
3533 case TODO_CATEGORY: 3536 case TODO_CATEGORY:
3534 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 6, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3537 if ((error = ALCATEL_CreateField(s, Alcatel_byte, 6, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3535 break; 3538 break;
3536 case TODO_CONTACTID: 3539 case TODO_CONTACTID:
3537 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3540 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3538 contact_set = true; 3541 contact_set = true;
3539 break; 3542 break;
3540 case TODO_PHONE: 3543 case TODO_PHONE:
3541 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, ToDo->Entries[i].Text)) != ERR_NONE) return error; 3544 if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, ToDo->Entries[i].Text)) != ERR_NONE) return error;
3542 phone_set = true; 3545 phone_set = true;
3543 break; 3546 break;
3544 default: 3547 default:
3545 break; 3548 break;
3546 } 3549 }
3547 } 3550 }
3548 if (!contact_set) { 3551 if (!contact_set) {
3549 if (phone_set) { 3552 if (phone_set) {
3550 val = 0xffffffff; 3553 val = 0xffffffff;
3551 } else { 3554 } else {
3552 val = 0; 3555 val = 0;
3553 } 3556 }
3554 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &val)) != ERR_NONE) return error; 3557 if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &val)) != ERR_NONE) return error;
3555 } 3558 }
3556 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3559 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3557 ToDo->Location = Priv->CommitedRecord; 3560 ToDo->Location = Priv->CommitedRecord;
3558 /* Refresh list */ 3561 /* Refresh list */
3559 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 3562 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
3560 return ERR_NONE; 3563 return ERR_NONE;
3561} 3564}
3562 3565
3563static GSM_Error ALCATEL_SetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo) 3566static GSM_Error ALCATEL_SetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
3564{ 3567{
3565 GSM_Error error; 3568 GSM_Error error;
3566 unsigned int val; 3569 unsigned int val;
3567 bool contact_set = false; 3570 bool contact_set = false;
3568 bool phone_set = false; 3571 bool phone_set = false;
3569 bool UpdatedFields[12]; 3572 bool UpdatedFields[12];
3570 int i; 3573 int i;
3571 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL; 3574 GSM_Phone_ALCATELData*Priv = &s->Phone.Data.Priv.ALCATEL;
3572 3575
3573 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3576 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3574 /* Save modified ToDo */ 3577 /* Save modified ToDo */
3575 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3578 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3576 if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) { 3579 if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) {
3577 /* Entry doesn't exist, we will create new one */ 3580 /* Entry doesn't exist, we will create new one */
3578 return ALCATEL_AddToDo(s, ToDo); 3581 return ALCATEL_AddToDo(s, ToDo);
3579 } 3582 }
3580 /* Get fields for current item */ 3583 /* Get fields for current item */
3581 if ((error = ALCATEL_GetFields(s, ToDo->Location))!= ERR_NONE) return error; 3584 if ((error = ALCATEL_GetFields(s, ToDo->Location))!= ERR_NONE) return error;
3582 3585
3583 for (i = 0; i < 12; i++) { UpdatedFields[i] = false; } 3586 for (i = 0; i < 12; i++) { UpdatedFields[i] = false; }
3584 3587
3585 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeToDo, ToDo->Location))!= ERR_NONE) return error; 3588 if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeToDo, ToDo->Location))!= ERR_NONE) return error;
3586 3589
3587 switch (ToDo->Priority) { 3590 switch (ToDo->Priority) {
3588 case GSM_Priority_High: 3591 case GSM_Priority_High:
3589 val = 0; 3592 val = 0;
3590 break; 3593 break;
3591 case GSM_Priority_Low: 3594 case GSM_Priority_Low:
3592 val = 2; 3595 val = 2;
3593 break; 3596 break;
3594 case GSM_Priority_Medium: 3597 case GSM_Priority_Medium:
3595 default: 3598 default:
3596 val = 1; 3599 val = 1;
3597 break; 3600 break;
3598 } 3601 }
3599 /* This one seems to be byte for BF5 and enum for BE5 */ 3602 /* This one seems to be byte for BF5 and enum for BE5 */
3600 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) { 3603 if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
3601 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, ToDo->Location, 7, &val)) != ERR_NONE) return error; 3604 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, ToDo->Location, 7, &val)) != ERR_NONE) return error;
3602 } else { 3605 } else {
3603 if ((error = ALCATEL_UpdateField(s, Alcatel_enum, ToDo->Location, 7, &val)) != ERR_NONE) return error; 3606 if ((error = ALCATEL_UpdateField(s, Alcatel_enum, ToDo->Location, 7, &val)) != ERR_NONE) return error;
3604 } 3607 }
3605 UpdatedFields[7] = true; 3608 UpdatedFields[7] = true;
3606 3609
3607 for (i = 0; i < ToDo->EntriesNum; i++) { 3610 for (i = 0; i < ToDo->EntriesNum; i++) {
3608 switch (ToDo->Entries[i].EntryType) { 3611 switch (ToDo->Entries[i].EntryType) {
3609 case TODO_END_DATETIME: 3612 case TODO_END_DATETIME:
3610 if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 0, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3613 if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 0, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3611 UpdatedFields[0] = true; 3614 UpdatedFields[0] = true;
3612 break; 3615 break;
3613 case TODO_COMPLETED: 3616 case TODO_COMPLETED:
3614 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, ToDo->Location, 1, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3617 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, ToDo->Location, 1, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3615 UpdatedFields[1] = true; 3618 UpdatedFields[1] = true;
3616 break; 3619 break;
3617 case TODO_ALARM_DATETIME: 3620 case TODO_ALARM_DATETIME:
3618 if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 2, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3621 if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 2, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3619 UpdatedFields[2] = true; 3622 UpdatedFields[2] = true;
3620 if ((error = ALCATEL_UpdateField(s, Alcatel_time, ToDo->Location, 3, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3623 if ((error = ALCATEL_UpdateField(s, Alcatel_time, ToDo->Location, 3, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3621 UpdatedFields[3] = true; 3624 UpdatedFields[3] = true;
3622 if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 10, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3625 if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 10, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3623 UpdatedFields[10] = true; 3626 UpdatedFields[10] = true;
3624 if ((error = ALCATEL_UpdateField(s, Alcatel_time, ToDo->Location, 11, &(ToDo->Entries[i].Date))) != ERR_NONE) return error; 3627 if ((error = ALCATEL_UpdateField(s, Alcatel_time, ToDo->Location, 11, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
3625 UpdatedFields[11] = true; 3628 UpdatedFields[11] = true;
3626 break; 3629 break;
3627 case TODO_TEXT: 3630 case TODO_TEXT:
3628 if ((error = ALCATEL_UpdateField(s, Alcatel_string, ToDo->Location, 4, ToDo->Entries[i].Text)) != ERR_NONE) return error; 3631 if ((error = ALCATEL_UpdateField(s, Alcatel_string, ToDo->Location, 4, ToDo->Entries[i].Text)) != ERR_NONE) return error;
3629 UpdatedFields[4] = true; 3632 UpdatedFields[4] = true;
3630 break; 3633 break;
3631 case TODO_PRIVATE: 3634 case TODO_PRIVATE:
3632 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, ToDo->Location, 5, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3635 if ((error = ALCATEL_UpdateField(s, Alcatel_bool, ToDo->Location, 5, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3633 UpdatedFields[5] = true; 3636 UpdatedFields[5] = true;
3634 break; 3637 break;
3635 case TODO_CATEGORY: 3638 case TODO_CATEGORY:
3636 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, ToDo->Location, 6, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3639 if ((error = ALCATEL_UpdateField(s, Alcatel_byte, ToDo->Location, 6, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3637 UpdatedFields[6] = true; 3640 UpdatedFields[6] = true;
3638 break; 3641 break;
3639 case TODO_CONTACTID: 3642 case TODO_CONTACTID:
3640 if ((error = ALCATEL_UpdateField(s, Alcatel_int, ToDo->Location, 8, &(ToDo->Entries[i].Number))) != ERR_NONE) return error; 3643 if ((error = ALCATEL_UpdateField(s, Alcatel_int, ToDo->Location, 8, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
3641 UpdatedFields[8] = true; 3644 UpdatedFields[8] = true;
3642 contact_set = true; 3645 contact_set = true;
3643 break; 3646 break;
3644 case TODO_PHONE: 3647 case TODO_PHONE:
3645 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, ToDo->Location, 9, ToDo->Entries[i].Text)) != ERR_NONE) return error; 3648 if ((error = ALCATEL_UpdateField(s, Alcatel_phone, ToDo->Location, 9, ToDo->Entries[i].Text)) != ERR_NONE) return error;
3646 UpdatedFields[9] = true; 3649 UpdatedFields[9] = true;
3647 phone_set = true; 3650 phone_set = true;
3648 break; 3651 break;
3649 default: 3652 default:
3650 break; 3653 break;
3651 } 3654 }
3652 } 3655 }
3653 if (!contact_set) { 3656 if (!contact_set) {
3654 if (phone_set) { 3657 if (phone_set) {
3655 val = 0xffffffff; 3658 val = 0xffffffff;
3656 } else { 3659 } else {
3657 val = 0; 3660 val = 0;
3658 } 3661 }
3659 if ((error = ALCATEL_UpdateField(s, Alcatel_int, ToDo->Location, 8, &val)) != ERR_NONE) return error; 3662 if ((error = ALCATEL_UpdateField(s, Alcatel_int, ToDo->Location, 8, &val)) != ERR_NONE) return error;
3660 UpdatedFields[8] = true; 3663 UpdatedFields[8] = true;
3661 } 3664 }
3662 3665
3663 3666
3664 /* If we didn't update some field, we have to delete it... */ 3667 /* If we didn't update some field, we have to delete it... */
3665 for (i=0; i<Priv->CurrentFieldsCount; i++) { 3668 for (i=0; i<Priv->CurrentFieldsCount; i++) {
3666 if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, ToDo->Location, Priv->CurrentFields[i])) != ERR_NONE) return error; 3669 if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, ToDo->Location, Priv->CurrentFields[i])) != ERR_NONE) return error;
3667 } 3670 }
3668 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3671 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3669 return ERR_NONE; 3672 return ERR_NONE;
3670} 3673}
3671 3674
3672static GSM_Error ALCATEL_DeleteToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo) 3675static GSM_Error ALCATEL_DeleteToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
3673{ 3676{
3674 GSM_Error error; 3677 GSM_Error error;
3675 3678
3676 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3679 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3677 /* Delete ToDo */ 3680 /* Delete ToDo */
3678 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error; 3681 if ((error = ALCATEL_GetAvailableIds(s, false))!= ERR_NONE) return error;
3679 if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) { 3682 if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) {
3680 /* Entry was empty => no error */ 3683 /* Entry was empty => no error */
3681 return ERR_NONE; 3684 return ERR_NONE;
3682 } 3685 }
3683 error = ALCATEL_DeleteItem(s, ToDo->Location); 3686 error = ALCATEL_DeleteItem(s, ToDo->Location);
3684 if (error != ERR_NONE) return error; 3687 if (error != ERR_NONE) return error;
3685 /* Refresh list */ 3688 /* Refresh list */
3686 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error; 3689 if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
3687 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error; 3690 if ((error = ALCATEL_GetAvailableIds(s, true))!= ERR_NONE) return error;
3688 return ERR_NONE; 3691 return ERR_NONE;
3689} 3692}
3690 3693
3691static GSM_Error ALCATEL_GetCategoryStatus(GSM_StateMachine *s, GSM_CategoryStatus *Status) 3694static GSM_Error ALCATEL_GetCategoryStatus(GSM_StateMachine *s, GSM_CategoryStatus *Status)
3692{ 3695{
3693 GSM_Alcatel_BinaryTypetype; 3696 GSM_Alcatel_BinaryTypetype;
3694 GSM_Error error; 3697 GSM_Error error;
@@ -3777,215 +3780,224 @@ static GSM_Error ALCATEL_ReplyGeneric(GSM_Protocol_Message msg, GSM_StateMachine
3777 *- phone needs PIN code 3780 *- phone needs PIN code
3778 *- we want to close not opened session 3781 *- we want to close not opened session
3779 * For normal users the second case shouldn't occur... 3782 * For normal users the second case shouldn't occur...
3780 */ 3783 */
3781 return ERR_SECURITYERROR; 3784 return ERR_SECURITYERROR;
3782 case 0x14: /* Bad data */ 3785 case 0x14: /* Bad data */
3783 case 0x2f: /* Closing session when not opened */ 3786 case 0x2f: /* Closing session when not opened */
3784 case 0x1f: /* Bad in/out counter in packet/ack */ 3787 case 0x1f: /* Bad in/out counter in packet/ack */
3785 case 0x0e: /* Openning session when not closed */ 3788 case 0x0e: /* Openning session when not closed */
3786 case 0x0C: /* Bad id (item/database) */ 3789 case 0x0C: /* Bad id (item/database) */
3787 case 0x11: /* Bad list id */ 3790 case 0x11: /* Bad list id */
3788 case 0x2A: /* Nonexistant field/item id */ 3791 case 0x2A: /* Nonexistant field/item id */
3789 case 0x35: /* Too long text */ 3792 case 0x35: /* Too long text */
3790 return ERR_BUG; 3793 return ERR_BUG;
3791 case 0x23: /* Session opened */ 3794 case 0x23: /* Session opened */
3792 case 0x80: /* Transfer started */ 3795 case 0x80: /* Transfer started */
3793 return ERR_NONE; 3796 return ERR_NONE;
3794 case 0x82: /* Transfer canceled */ 3797 case 0x82: /* Transfer canceled */
3795 return ERR_CANCELED; 3798 return ERR_CANCELED;
3796 default: 3799 default:
3797 smprintf(s, "WARNING: Packet seems to indicate some status by %02X, ignoring!\n", msg.Buffer[8]); 3800 smprintf(s, "WARNING: Packet seems to indicate some status by %02X, ignoring!\n", msg.Buffer[8]);
3798 return ERR_NONE; 3801 return ERR_NONE;
3799 } 3802 }
3800} 3803}
3801 3804
3802static GSM_Error ALCATEL_ReplyCommit(GSM_Protocol_Message msg, GSM_StateMachine *s) 3805static GSM_Error ALCATEL_ReplyCommit(GSM_Protocol_Message msg, GSM_StateMachine *s)
3803{ 3806{
3804 s->Phone.Data.Priv.ALCATEL.CommitedRecord = msg.Buffer[12] + (msg.Buffer[11] << 8) + (msg.Buffer[10] << 16) + (msg.Buffer[9] << 24); 3807 s->Phone.Data.Priv.ALCATEL.CommitedRecord = msg.Buffer[12] + (msg.Buffer[11] << 8) + (msg.Buffer[10] << 16) + (msg.Buffer[9] << 24);
3805 smprintf(s, "Created record %08x\n", s->Phone.Data.Priv.ALCATEL.CommitedRecord); 3808 smprintf(s, "Created record %08x\n", s->Phone.Data.Priv.ALCATEL.CommitedRecord);
3806 return ERR_NONE; 3809 return ERR_NONE;
3807} 3810}
3808 3811
3809static GSM_Error ALCATEL_SetIncomingCB (GSM_StateMachine *s, bool enable) 3812static GSM_Error ALCATEL_SetIncomingCB (GSM_StateMachine *s, bool enable)
3810{ 3813{
3811 GSM_Error error; 3814 GSM_Error error;
3812 3815
3813 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 3816 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
3814 return ATGEN_SetIncomingCB(s, enable); 3817 return ATGEN_SetIncomingCB(s, enable);
3815} 3818}
3816 3819
3817static GSM_Error ALCATEL_SetIncomingSMS (GSM_StateMachine *s, bool enable) 3820static GSM_Error ALCATEL_SetIncomingSMS (GSM_StateMachine *s, bool enable)
3818{ 3821{
3819 GSM_Error error; 3822 GSM_Error error;
3820 3823
3821 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error; 3824 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
3822 return ATGEN_SetIncomingSMS(s, enable); 3825 return ATGEN_SetIncomingSMS(s, enable);
3823} 3826}
3824 3827
3828static GSM_Error ALCATEL_SetFastSMSSending(GSM_StateMachine *s, bool enable)
3829{
3830 GSM_Error error;
3831
3832 if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
3833 return ATGEN_SetFastSMSSending(s, enable);
3834}
3835
3825static GSM_Reply_Function ALCATELReplyFunctions[] = { 3836static GSM_Reply_Function ALCATELReplyFunctions[] = {
3826 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelAttach }, 3837 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelAttach },
3827 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDetach }, 3838 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDetach },
3828 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelCommit }, 3839 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelCommit },
3829 {ALCATEL_ReplyCommit, "\x02",0x00,0x00, ID_AlcatelCommit2 }, 3840 {ALCATEL_ReplyCommit, "\x02",0x00,0x00, ID_AlcatelCommit2 },
3830 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelEnd }, 3841 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelEnd },
3831 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelClose }, 3842 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelClose },
3832 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelStart }, 3843 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelStart },
3833 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect1 }, 3844 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect1 },
3834 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect2 }, 3845 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect2 },
3835 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect3 }, 3846 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect3 },
3836 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelBegin1 }, 3847 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelBegin1 },
3837 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelBegin2 }, 3848 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelBegin2 },
3838 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetIds1 }, 3849 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetIds1 },
3839 {ALCATEL_ReplyGetIds, "\x02",0x00,0x00, ID_AlcatelGetIds2 }, 3850 {ALCATEL_ReplyGetIds, "\x02",0x00,0x00, ID_AlcatelGetIds2 },
3840 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetCategories1}, 3851 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetCategories1},
3841 {ALCATEL_ReplyGetCategories, "\x02",0x00,0x00, ID_AlcatelGetCategories2}, 3852 {ALCATEL_ReplyGetCategories, "\x02",0x00,0x00, ID_AlcatelGetCategories2},
3842 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetCategoryText1}, 3853 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetCategoryText1},
3843 {ALCATEL_ReplyGetCategoryText, "\x02",0x00,0x00, ID_AlcatelGetCategoryText2}, 3854 {ALCATEL_ReplyGetCategoryText, "\x02",0x00,0x00, ID_AlcatelGetCategoryText2},
3844 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelAddCategoryText1}, 3855 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelAddCategoryText1},
3845 {ALCATEL_ReplyAddCategoryText, "\x02",0x00,0x00, ID_AlcatelAddCategoryText2}, 3856 {ALCATEL_ReplyAddCategoryText, "\x02",0x00,0x00, ID_AlcatelAddCategoryText2},
3846 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetFields1 }, 3857 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetFields1 },
3847 {ALCATEL_ReplyGetFields, "\x02",0x00,0x00, ID_AlcatelGetFields2 }, 3858 {ALCATEL_ReplyGetFields, "\x02",0x00,0x00, ID_AlcatelGetFields2 },
3848 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetFieldValue1}, 3859 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetFieldValue1},
3849 {ALCATEL_ReplyGetFieldValue, "\x02",0x00,0x00, ID_AlcatelGetFieldValue2}, 3860 {ALCATEL_ReplyGetFieldValue, "\x02",0x00,0x00, ID_AlcatelGetFieldValue2},
3850 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDeleteField }, 3861 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDeleteField },
3851 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDeleteItem1 }, 3862 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDeleteItem1 },
3852 {ALCATEL_ReplyDeleteItem, "\x02",0x00,0x00, ID_AlcatelDeleteItem2 }, 3863 {ALCATEL_ReplyDeleteItem, "\x02",0x00,0x00, ID_AlcatelDeleteItem2 },
3853 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelCreateField }, 3864 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelCreateField },
3854 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelUpdateField }, 3865 {ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelUpdateField },
3855 {NULL, "\x00",0x00,0x00, ID_None } 3866 {NULL, "\x00",0x00,0x00, ID_None }
3856}; 3867};
3857 3868
3858GSM_Phone_Functions ALCATELPhone = { 3869GSM_Phone_Functions ALCATELPhone = {
3859 /* AFAIK, any 50[0123] phone should work, but I'm not sure whether all 3870 /* AFAIK, any 50[0123] phone should work, but I'm not sure whether all
3860 * they were ever really released, if yes add them here also. 3871 * they were ever really released, if yes add them here also.
3861 */ 3872 */
3862 "alcatel|OT501|OT701|OT715|OT535|OT735|BE5|BF5|BH4", 3873 "alcatel|OT501|OT701|OT715|OT535|OT735|BE5|BF5|BH4",
3863 ALCATELReplyFunctions, 3874 ALCATELReplyFunctions,
3864 ALCATEL_Initialise, 3875 ALCATEL_Initialise,
3865 ALCATEL_Terminate, 3876 ALCATEL_Terminate,
3866 ALCATEL_DispatchMessage, 3877 ALCATEL_DispatchMessage,
3867 NOTSUPPORTED, /* ShowStartInfo */ 3878 NOTSUPPORTED, /* ShowStartInfo */
3868 ALCATEL_GetManufacturer, 3879 ALCATEL_GetManufacturer,
3869 ALCATEL_GetModel, 3880 ALCATEL_GetModel,
3870 ALCATEL_GetFirmware, 3881 ALCATEL_GetFirmware,
3871 ALCATEL_GetIMEI, 3882 ALCATEL_GetIMEI,
3872 NOTSUPPORTED, /* GetOriginalIMEI */ 3883 NOTSUPPORTED, /* GetOriginalIMEI */
3873 NOTSUPPORTED, /* GetManufactureMonth*/ 3884 NOTSUPPORTED, /* GetManufactureMonth*/
3874 ALCATEL_GetProductCode, 3885 ALCATEL_GetProductCode,
3875 NOTSUPPORTED, /* GetHardware */ 3886 NOTSUPPORTED, /* GetHardware */
3876 NOTSUPPORTED, /* GetPPM */ 3887 NOTSUPPORTED, /* GetPPM */
3877 ALCATEL_GetSIMIMSI, 3888 ALCATEL_GetSIMIMSI,
3878 ALCATEL_GetDateTime, 3889 ALCATEL_GetDateTime,
3879 ALCATEL_SetDateTime, 3890 ALCATEL_SetDateTime,
3880 ALCATEL_GetAlarm, 3891 ALCATEL_GetAlarm,
3881 ALCATEL_SetAlarm, 3892 ALCATEL_SetAlarm,
3882 NOTSUPPORTED, /* GetLocale */ 3893 NOTSUPPORTED, /* GetLocale */
3883 NOTSUPPORTED, /* SetLocale */ 3894 NOTSUPPORTED, /* SetLocale */
3884 ALCATEL_PressKey, 3895 ALCATEL_PressKey,
3885 ALCATEL_Reset, 3896 ALCATEL_Reset,
3886 ALCATEL_ResetPhoneSettings, 3897 ALCATEL_ResetPhoneSettings,
3887 ALCATEL_EnterSecurityCode, 3898 ALCATEL_EnterSecurityCode,
3888 ALCATEL_GetSecurityStatus, 3899 ALCATEL_GetSecurityStatus,
3889 ALCATEL_GetDisplayStatus, 3900 ALCATEL_GetDisplayStatus,
3890 ALCATEL_SetAutoNetworkLogin, 3901 ALCATEL_SetAutoNetworkLogin,
3891 ALCATEL_GetBatteryCharge, 3902 ALCATEL_GetBatteryCharge,
3892 ALCATEL_GetSignalStrength, 3903 ALCATEL_GetSignalStrength,
3893 ALCATEL_GetNetworkInfo, 3904 ALCATEL_GetNetworkInfo,
3894 ALCATEL_GetCategory, 3905 ALCATEL_GetCategory,
3895 ALCATEL_AddCategory, 3906 ALCATEL_AddCategory,
3896 ALCATEL_GetCategoryStatus, 3907 ALCATEL_GetCategoryStatus,
3897 ALCATEL_GetMemoryStatus, 3908 ALCATEL_GetMemoryStatus,
3898 ALCATEL_GetMemory, 3909 ALCATEL_GetMemory,
3899 ALCATEL_GetNextMemory, 3910 ALCATEL_GetNextMemory,
3900 ALCATEL_SetMemory, 3911 ALCATEL_SetMemory,
3901 ALCATEL_AddMemory, 3912 ALCATEL_AddMemory,
3902 ALCATEL_DeleteMemory, 3913 ALCATEL_DeleteMemory,
3903 ALCATEL_DeleteAllMemory, 3914 ALCATEL_DeleteAllMemory,
3904 NOTSUPPORTED, /* GetSpeedDial */ 3915 NOTSUPPORTED, /* GetSpeedDial */
3905 NOTSUPPORTED, /* SetSpeedDial */ 3916 NOTSUPPORTED, /* SetSpeedDial */
3906 ALCATEL_GetSMSC, 3917 ALCATEL_GetSMSC,
3907 ALCATEL_SetSMSC, 3918 ALCATEL_SetSMSC,
3908 ALCATEL_GetSMSStatus, 3919 ALCATEL_GetSMSStatus,
3909 ALCATEL_GetSMS, 3920 ALCATEL_GetSMS,
3910 ALCATEL_GetNextSMS, 3921 ALCATEL_GetNextSMS,
3911 NOTSUPPORTED, /* SetSMS */ 3922 NOTSUPPORTED, /* SetSMS */
3912 ALCATEL_AddSMS, 3923 ALCATEL_AddSMS,
3913 ALCATEL_DeleteSMS, 3924 ALCATEL_DeleteSMS,
3914 ALCATEL_SendSMS, 3925 ALCATEL_SendSMS,
3915 ALCATEL_SendSavedSMS, 3926 ALCATEL_SendSavedSMS,
3927 ALCATEL_SetFastSMSSending,
3916 ALCATEL_SetIncomingSMS, 3928 ALCATEL_SetIncomingSMS,
3917 ALCATEL_SetIncomingCB, 3929 ALCATEL_SetIncomingCB,
3918 ALCATEL_GetSMSFolders, 3930 ALCATEL_GetSMSFolders,
3919 NOTSUPPORTED, /* AddSMSFolder */ 3931 NOTSUPPORTED, /* AddSMSFolder */
3920 NOTSUPPORTED, /* DeleteSMSFolder */ 3932 NOTSUPPORTED, /* DeleteSMSFolder */
3921 ALCATEL_DialVoice, 3933 ALCATEL_DialVoice,
3922 ALCATEL_AnswerCall, 3934 ALCATEL_AnswerCall,
3923 ALCATEL_CancelCall, 3935 ALCATEL_CancelCall,
3924 NOTSUPPORTED, /* HoldCall */ 3936 NOTSUPPORTED, /* HoldCall */
3925 NOTSUPPORTED, /* UnholdCall */ 3937 NOTSUPPORTED, /* UnholdCall */
3926 NOTSUPPORTED, /* ConferenceCall */ 3938 NOTSUPPORTED, /* ConferenceCall */
3927 NOTSUPPORTED, /* SplitCall */ 3939 NOTSUPPORTED, /* SplitCall */
3928 NOTSUPPORTED, /* TransferCall */ 3940 NOTSUPPORTED, /* TransferCall */
3929 NOTSUPPORTED, /* SwitchCall */ 3941 NOTSUPPORTED, /* SwitchCall */
3930 NOTSUPPORTED, /* GetCallDivert */ 3942 NOTSUPPORTED, /* GetCallDivert */
3931 NOTSUPPORTED, /* SetCallDivert */ 3943 NOTSUPPORTED, /* SetCallDivert */
3932 NOTSUPPORTED, /* CancelAllDiverts*/ 3944 NOTSUPPORTED, /* CancelAllDiverts*/
3933 NONEFUNCTION, /* SetIncomingCall */ 3945 NONEFUNCTION, /* SetIncomingCall */
3934 NOTSUPPORTED, /* SetIncomingUSSD */ 3946 NOTSUPPORTED, /* SetIncomingUSSD */
3935 ALCATEL_SendDTMF, 3947 ALCATEL_SendDTMF,
3936 NOTSUPPORTED, /* GetRingtone */ 3948 NOTSUPPORTED, /* GetRingtone */
3937 NOTSUPPORTED, /* SetRingtone */ 3949 NOTSUPPORTED, /* SetRingtone */
3938 NOTSUPPORTED, /* GetRingtonesInfo*/ 3950 NOTSUPPORTED, /* GetRingtonesInfo*/
3939 NOTSUPPORTED, /* DeleteUserRingtones*/ 3951 NOTSUPPORTED, /* DeleteUserRingtones*/
3940 NOTSUPPORTED, /* PlayTone */ 3952 NOTSUPPORTED, /* PlayTone */
3941 NOTSUPPORTED, /* GetWAPBookmark */ 3953 NOTSUPPORTED, /* GetWAPBookmark */
3942 NOTSUPPORTED, /* SetWAPBookmark */ 3954 NOTSUPPORTED, /* SetWAPBookmark */
3943 NOTSUPPORTED, /* DeleteWAPBookmark*/ 3955 NOTSUPPORTED, /* DeleteWAPBookmark*/
3944 NOTSUPPORTED, /* GetWAPSettings */ 3956 NOTSUPPORTED, /* GetWAPSettings */
3945 NOTSUPPORTED, /* SetWAPSettings */ 3957 NOTSUPPORTED, /* SetWAPSettings */
3946 NOTSUPPORTED, /* GetMMSSettings */ 3958 NOTSUPPORTED, /* GetMMSSettings */
3947 NOTSUPPORTED, /* SetMMSSettings */ 3959 NOTSUPPORTED, /* SetMMSSettings */
3948 NOTSUPPORTED, /* GetSyncMLSettings*/ 3960 NOTSUPPORTED, /* GetSyncMLSettings*/
3949 NOTSUPPORTED, /* SetSyncMLSettings*/ 3961 NOTSUPPORTED, /* SetSyncMLSettings*/
3950 NOTSUPPORTED, /* GetChatSettings */ 3962 NOTSUPPORTED, /* GetChatSettings */
3951 NOTSUPPORTED, /* SetChatSettings */ 3963 NOTSUPPORTED, /* SetChatSettings */
3952 NOTSUPPORTED, /* GetBitmap */ 3964 NOTSUPPORTED, /* GetBitmap */
3953 NOTSUPPORTED, /* SetBitmap */ 3965 NOTSUPPORTED, /* SetBitmap */
3954 ALCATEL_GetToDoStatus, 3966 ALCATEL_GetToDoStatus,
3955 ALCATEL_GetToDo, 3967 ALCATEL_GetToDo,
3956 ALCATEL_GetNextToDo, 3968 ALCATEL_GetNextToDo,
3957 ALCATEL_SetToDo, 3969 ALCATEL_SetToDo,
3958 ALCATEL_AddToDo, 3970 ALCATEL_AddToDo,
3959 ALCATEL_DeleteToDo, 3971 ALCATEL_DeleteToDo,
3960 ALCATEL_DeleteAllToDo, 3972 ALCATEL_DeleteAllToDo,
3961 ALCATEL_GetCalendarStatus, 3973 ALCATEL_GetCalendarStatus,
3962 ALCATEL_GetCalendar, 3974 ALCATEL_GetCalendar,
3963 ALCATEL_GetNextCalendar, 3975 ALCATEL_GetNextCalendar,
3964 ALCATEL_SetCalendar, 3976 ALCATEL_SetCalendar,
3965 ALCATEL_AddCalendar, 3977 ALCATEL_AddCalendar,
3966 ALCATEL_DeleteCalendar, 3978 ALCATEL_DeleteCalendar,
3967 ALCATEL_DeleteAllCalendar, 3979 ALCATEL_DeleteAllCalendar,
3968 NOTSUPPORTED, /* GetCalendarSettings*/ 3980 NOTSUPPORTED, /* GetCalendarSettings*/
3969 NOTSUPPORTED, /* SetCalendarSettings*/ 3981 NOTSUPPORTED, /* SetCalendarSettings*/
3970 NOTSUPPORTED, /* GetNote */ 3982 NOTSUPPORTED, /* GetNextNote */
3971 NOTSUPPORTED, /* GetProfile */ 3983 NOTSUPPORTED, /* GetProfile */
3972 NOTSUPPORTED, /* SetProfile */ 3984 NOTSUPPORTED, /* SetProfile */
3973 NOTSUPPORTED, /* GetFMStation */ 3985 NOTSUPPORTED, /* GetFMStation */
3974 NOTSUPPORTED, /* SetFMStation */ 3986 NOTSUPPORTED, /* SetFMStation */
3975 NOTSUPPORTED, /* ClearFMStations */ 3987 NOTSUPPORTED, /* ClearFMStations */
3976 NOTSUPPORTED, /* GetNextFileFolder*/ 3988 NOTSUPPORTED, /* GetNextFileFolder*/
3977 NOTSUPPORTED, /* GetFilePart */ 3989 NOTSUPPORTED, /* GetFilePart */
3978 NOTSUPPORTED, /* AddFilePart */ 3990 NOTSUPPORTED, /* AddFilePart */
3979 NOTSUPPORTED, /* GetFileSystemStatus*/ 3991 NOTSUPPORTED, /* GetFileSystemStatus*/
3980 NOTSUPPORTED, /* DeleteFile */ 3992 NOTSUPPORTED, /* DeleteFile */
3981 NOTSUPPORTED, /* AddFolder */ 3993 NOTSUPPORTED, /* AddFolder */
3982 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 3994 NOTSUPPORTED, /* GetGPRSAccessPoint*/
3983 NOTSUPPORTED /* SetGPRSAccessPoint*/ 3995 NOTSUPPORTED /* SetGPRSAccessPoint*/
3984}; 3996};
3985 3997
3986#endif 3998#endif
3987#endif 3999#endif
3988 4000
3989/* How should editor hadle tabs in this file? Add editor commands here. 4001/* How should editor hadle tabs in this file? Add editor commands here.
3990 * vim: noexpandtab sw=8 ts=8 sts=8: 4002 * vim: noexpandtab sw=8 ts=8 sts=8:
3991 */ 4003 */
diff --git a/gammu/emb/common/phone/at/atgen.c b/gammu/emb/common/phone/at/atgen.c
index 1834f15..ba23eb2 100644
--- a/gammu/emb/common/phone/at/atgen.c
+++ b/gammu/emb/common/phone/at/atgen.c
@@ -1,93 +1,73 @@
1/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */ 1/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */
2 2
3#include "../../gsmstate.h" 3#include "../../gsmstate.h"
4 4
5#ifdef GSM_ENABLE_ATGEN 5#ifdef GSM_ENABLE_ATGEN
6 6
7#include <string.h> 7#include <string.h>
8#include <time.h> 8#include <time.h>
9#include <ctype.h> 9#include <ctype.h>
10 10
11#include "../../gsmcomon.h" 11#include "../../gsmcomon.h"
12#include "../../misc/coding/coding.h" 12#include "../../misc/coding/coding.h"
13#include "../../service/sms/gsmsms.h" 13#include "../../service/sms/gsmsms.h"
14#include "../pfunc.h" 14#include "../pfunc.h"
15
15#include "atgen.h" 16#include "atgen.h"
16 17
18#include "samsung.h"
19#include "siemens.h"
20#include "sonyeric.h"
21
17#ifdef GSM_ENABLE_ALCATEL 22#ifdef GSM_ENABLE_ALCATEL
18 extern GSM_Error ALCATEL_ProtocolVersionReply(GSM_Protocol_Message msg, GSM_StateMachine *s); 23GSM_Error ALCATEL_ProtocolVersionReply (GSM_Protocol_Message, GSM_StateMachine *);
19#endif 24#endif
20 25
21 extern GSM_Error ATGEN_CMS35ReplyGetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s);
22 extern GSM_Error ATGEN_CMS35ReplySetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s);
23 extern GSM_Error ATGEN_CMS35ReplyGetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s);
24 extern GSM_Error ATGEN_CMS35ReplySetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s);
25 extern GSM_Error ATGEN_CMS35ReplyGetNextCal(GSM_Protocol_Message msg, GSM_StateMachine *s);
26 extern GSM_Error ATGEN_CMS35ReplySetCalendar(GSM_Protocol_Message msg, GSM_StateMachine *s);
27 extern GSM_Error ATGEN_CMS35ReplyDeleteCalendar(GSM_Protocol_Message msg, GSM_StateMachine *s);
28 extern GSM_Error ATGEN_SL45ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s);
29
30 extern GSM_Error ATGEN_GetRingtone (GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone);
31 extern GSM_Error ATGEN_SetRingtone (GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength);
32 extern GSM_Error ATGEN_GetBitmap (GSM_StateMachine *s, GSM_Bitmap *Bitmap);
33 extern GSM_Error ATGEN_SetBitmap (GSM_StateMachine *s, GSM_Bitmap *Bitmap);
34 extern GSM_Error SIEMENS_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start);
35 extern GSM_Error SIEMENS_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note);
36 extern GSM_Error SIEMENS_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note);
37
38 extern GSM_Error SONYERIC_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start);
39 extern GSM_Error SONYERIC_GetNextToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool start);
40 extern GSM_Error SONYERIC_GetToDoStatus (GSM_StateMachine *s, GSM_ToDoStatus *status);
41 extern GSM_Error SONYERIC_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note);
42 extern GSM_Error SONYERIC_AddToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
43 extern GSM_Error SONYERIC_DeleteAllToDo (GSM_StateMachine *s);
44 extern GSM_Error SONYERIC_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note);
45 extern GSM_Error SONYERIC_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status);
46 26
47typedef struct { 27typedef struct {
48 int Number; 28 int Number;
49 char Text[60]; 29 char Text[60];
50} ATErrorCode; 30} ATErrorCode;
51 31
52static ATErrorCode CMSErrorCodes[] = { 32static ATErrorCode CMSErrorCodes[] = {
53 /* 33 /*
54 * Error codes not specified here were either undefined or reserved in my 34 * Error codes not specified here were either undefined or reserved in my
55 * copy of specifications, if you have newer one, please fill in the gaps. 35 * copy of specifications, if you have newer one, please fill in the gaps.
56 */ 36 */
57 /* 0...127 from GSM 04.11 Annex E-2 */ 37 /* 0...127 from GSM 04.11 Annex E-2 */
58 {1, "Unassigned (unallocated) number"}, 38 {1, "Unassigned (unallocated) number"},
59 {8, "Operator determined barring"}, 39 {8, "Operator determined barring"},
60 {10, "Call barred"}, 40 {10, "Call barred"},
61 {21, "Short message transfer rejected"}, 41 {21, "Short message transfer rejected"},
62 {27, "Destination out of service"}, 42 {27, "Destination out of service"},
63 {28, "Unidentified subscriber"}, 43 {28, "Unidentified subscriber"},
64 {29, "Facility rejected"}, 44 {29, "Facility rejected"},
65 {30, "Unknown subscriber"}, 45 {30, "Unknown subscriber"},
66 {38, "Network out of order"}, 46 {38, "Network out of order"},
67 {41, "Temporary failure"}, 47 {41, "Temporary failure"},
68 {42, "Congestion"}, 48 {42, "Congestion"},
69 {47, "Resources unavailable, unspecified"}, 49 {47, "Resources unavailable, unspecified"},
70 {50, "Requested facility not subscribed"}, 50 {50, "Requested facility not subscribed"},
71 {69, "Requested facility not implemented"}, 51 {69, "Requested facility not implemented"},
72 {81, "Invalid short message transfer reference value"}, 52 {81, "Invalid short message transfer reference value"},
73 {95, "Invalid message, unspecified"}, 53 {95, "Invalid message, unspecified"},
74 {96, "Invalid mandatory information"}, 54 {96, "Invalid mandatory information"},
75 {97, "Message type non-existent or not implemented"}, 55 {97, "Message type non-existent or not implemented"},
76 {98, "Message not compatible with short message protocol state"}, 56 {98, "Message not compatible with short message protocol state"},
77 {99, "Information element non-existent or not implemented"}, 57 {99, "Information element non-existent or not implemented"},
78 {111, "Protocol error, unspecified"}, 58 {111, "Protocol error, unspecified"},
79 {127, "Interworking, unspecified"}, 59 {127, "Interworking, unspecified"},
80 /* 128...255 from GSM 03.40 subclause 9.2.3.22 */ 60 /* 128...255 from GSM 03.40 subclause 9.2.3.22 */
81 {0x80, "Telematic interworking not supported"}, 61 {0x80, "Telematic interworking not supported"},
82 {0x81, "Short message Type 0 not supported"}, 62 {0x81, "Short message Type 0 not supported"},
83 {0x82, "Cannot replace short message"}, 63 {0x82, "Cannot replace short message"},
84 {0x8F, "Unspecified TP-PID error"}, 64 {0x8F, "Unspecified TP-PID error"},
85 {0x90, "Data coding scheme (alphabet) not supported"}, 65 {0x90, "Data coding scheme (alphabet) not supported"},
86 {0x91, "Message class not supported"}, 66 {0x91, "Message class not supported"},
87 {0x9F, "Unspecified TP-DCS error"}, 67 {0x9F, "Unspecified TP-DCS error"},
88 {0xA0, "Command cannot be actioned"}, 68 {0xA0, "Command cannot be actioned"},
89 {0xA1, "Command unsupported"}, 69 {0xA1, "Command unsupported"},
90 {0xAF, "Unspecified TP-Command error"}, 70 {0xAF, "Unspecified TP-Command error"},
91 {0xB0, "TPDU not supported"}, 71 {0xB0, "TPDU not supported"},
92 {0xC0, "SC busy"}, 72 {0xC0, "SC busy"},
93 {0xC1, "No SC subscription"}, 73 {0xC1, "No SC subscription"},
@@ -130,402 +110,467 @@ static ATErrorCode CMSErrorCodes[] = {
130 /* > 512 are manufacturer specific according to GSM 07.05 subclause 3.2.5 */ 110 /* > 512 are manufacturer specific according to GSM 07.05 subclause 3.2.5 */
131 {-1, ""} 111 {-1, ""}
132}; 112};
133 113
134static ATErrorCode CMEErrorCodes[] = { 114static ATErrorCode CMEErrorCodes[] = {
135 /* CME Error codes from GSM 07.07 section 9.2 */ 115 /* CME Error codes from GSM 07.07 section 9.2 */
136 {0, "phone failure"}, 116 {0, "phone failure"},
137 {1, "no connection to phone"}, 117 {1, "no connection to phone"},
138 {2, "phone-adaptor link reserved"}, 118 {2, "phone-adaptor link reserved"},
139 {3, "operation not allowed"}, 119 {3, "operation not allowed"},
140 {4, "operation not supported"}, 120 {4, "operation not supported"},
141 {5, "PH-SIM PIN required"}, 121 {5, "PH-SIM PIN required"},
142 {10, "SIM not inserted"}, 122 {10, "SIM not inserted"},
143 {11, "SIM PIN required"}, 123 {11, "SIM PIN required"},
144 {12, "SIM PUK required"}, 124 {12, "SIM PUK required"},
145 {13, "SIM failure"}, 125 {13, "SIM failure"},
146 {14, "SIM busy"}, 126 {14, "SIM busy"},
147 {15, "SIM wrong"}, 127 {15, "SIM wrong"},
148 {16, "incorrect password"}, 128 {16, "incorrect password"},
149 {17, "SIM PIN2 required"}, 129 {17, "SIM PIN2 required"},
150 {18, "SIM PUK2 required"}, 130 {18, "SIM PUK2 required"},
151 {20, "memory full"}, 131 {20, "memory full"},
152 {21, "invalid index"}, 132 {21, "invalid index"},
153 {22, "not found"}, 133 {22, "not found"},
154 {23, "memory failure"}, 134 {23, "memory failure"},
155 {24, "text string too long"}, 135 {24, "text string too long"},
156 {25, "invalid characters in text string"}, 136 {25, "invalid characters in text string"},
157 {26, "dial string too long"}, 137 {26, "dial string too long"},
158 {27, "invalid characters in dial string"}, 138 {27, "invalid characters in dial string"},
159 {30, "no network service"}, 139 {30, "no network service"},
160 {31, "network timeout"}, 140 {31, "network timeout"},
161 {100, "unknown"}, 141 {100, "unknown"},
162}; 142};
163 143
164 144
165GSM_Error ATGEN_HandleCMEError(GSM_StateMachine *s) 145GSM_Error ATGEN_HandleCMEError(GSM_StateMachine *s)
166{ 146{
167 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 147 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
168 148
169 if (Priv->ErrorCode == 0) { 149 if (Priv->ErrorCode == 0) {
170 smprintf(s, "CME Error occured, but it's type not detected\n"); 150 smprintf(s, "CME Error occured, but it's type not detected\n");
171 } else if (Priv->ErrorText == NULL) { 151 } else if (Priv->ErrorText == NULL) {
172 smprintf(s, "CME Error %i, no description available\n", Priv->ErrorCode); 152 smprintf(s, "CME Error %i, no description available\n", Priv->ErrorCode);
173 } else { 153 } else {
174 smprintf(s, "CME Error %i: \"%s\"\n", Priv->ErrorCode, Priv->ErrorText); 154 smprintf(s, "CME Error %i: \"%s\"\n", Priv->ErrorCode, Priv->ErrorText);
175 } 155 }
176 /* For error codes descriptions see table a bit above */ 156 /* For error codes descriptions see table a bit above */
177 switch (Priv->ErrorCode) { 157 switch (Priv->ErrorCode) {
158 case -1:
159 return ERR_EMPTY;
178 case 3: 160 case 3:
179 return ERR_PERMISSION; 161 return ERR_PERMISSION;
180 case 4: 162 case 4:
181 return ERR_NOTSUPPORTED; 163 return ERR_NOTSUPPORTED;
182 case 5: 164 case 5:
183 case 11: 165 case 11:
184 case 12: 166 case 12:
185 case 16: 167 case 16:
186 case 17: 168 case 17:
187 case 18: 169 case 18:
188 return ERR_SECURITYERROR; 170 return ERR_SECURITYERROR;
189 case 20: 171 case 20:
190 return ERR_FULL; 172 return ERR_FULL;
191 case 21: 173 case 21:
192 return ERR_INVALIDLOCATION; 174 return ERR_INVALIDLOCATION;
193 case 22: 175 case 22:
194 return ERR_EMPTY; 176 return ERR_EMPTY;
195 case 23: 177 case 23:
196 return ERR_MEMORY; 178 return ERR_MEMORY;
197 case 24: 179 case 24:
198 case 25: 180 case 25:
199 case 26: 181 case 26:
200 case 27: 182 case 27:
201 return ERR_INVALIDDATA; 183 return ERR_INVALIDDATA;
202 default: 184 default:
203 return ERR_UNKNOWN; 185 return ERR_UNKNOWN;
204 } 186 }
205} 187}
206 188
207GSM_Error ATGEN_HandleCMSError(GSM_StateMachine *s) 189GSM_Error ATGEN_HandleCMSError(GSM_StateMachine *s)
208{ 190{
209 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 191 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
210 192
211 if (Priv->ErrorCode == 0) { 193 if (Priv->ErrorCode == 0) {
212 smprintf(s, "CMS Error occured, but it's type not detected\n"); 194 smprintf(s, "CMS Error occured, but it's type not detected\n");
213 } else if (Priv->ErrorText == NULL) { 195 } else if (Priv->ErrorText == NULL) {
214 smprintf(s, "CMS Error %i, no description available\n", Priv->ErrorCode); 196 smprintf(s, "CMS Error %i, no description available\n", Priv->ErrorCode);
215 } else { 197 } else {
216 smprintf(s, "CMS Error %i: \"%s\"\n", Priv->ErrorCode, Priv->ErrorText); 198 smprintf(s, "CMS Error %i: \"%s\"\n", Priv->ErrorCode, Priv->ErrorText);
217 } 199 }
218 /* For error codes descriptions see table a bit above */ 200 /* For error codes descriptions see table a bit above */
219 switch (Priv->ErrorCode) { 201 switch (Priv->ErrorCode) {
220 case 304: 202 case 304:
221 return ERR_NOTSUPPORTED; 203 return ERR_NOTSUPPORTED;
222 case 305: 204 case 305:
223 return ERR_BUG; 205 return ERR_BUG;
224 case 311: 206 case 311:
225 case 312: 207 case 312:
226 case 316: 208 case 316:
227 case 317: 209 case 317:
228 case 318: 210 case 318:
229 return ERR_SECURITYERROR; 211 return ERR_SECURITYERROR;
230 case 322: 212 case 322:
231 return ERR_FULL; 213 return ERR_FULL;
232 case 321: 214 case 321:
233 return ERR_INVALIDLOCATION; 215 return ERR_INVALIDLOCATION;
234 default: 216 default:
235 return ERR_UNKNOWN; 217 return ERR_UNKNOWN;
236 } 218 }
237} 219}
238 220
239/* FIXME: Function doesn't respect quoting of parameters and thus +FOO: 221/* FIXME: Function doesn't respect quoting of parameters and thus +FOO:
240 * "ab","cd,ef" will consider as three arguments: "ab" >> "cd >> ef" 222 * "ab","cd,ef" will consider as three arguments: "ab" >> "cd >> ef"
241 */ 223 */
242int ATGEN_ExtractOneParameter(unsigned char *input, unsigned char *output) 224int ATGEN_ExtractOneParameter(unsigned char *input, unsigned char *output)
243{ 225{
244 int position=0; 226 int position=0;
245 227
246 while (*input!=',' && *input!=0x0d && *input!=0x00) { 228 while (*input!=',' && *input!=0x0d && *input!=0x00) {
247 *output=*input; 229 *output=*input;
248 input++; 230 input++;
249 output++; 231 output++;
250 position++; 232 position++;
251 } 233 }
252 *output=0; 234 *output=0;
253 position++; 235 position++;
254 return position; 236 return position;
255} 237}
256 238
257void ATGEN_DecodeDateTime(GSM_DateTime *dt, unsigned char *input) 239void ATGEN_DecodeDateTime(GSM_DateTime *dt, unsigned char *input)
258{ 240{
259 dt->Year=2000+(*input-'0')*10; input++; 241 /* Samsung phones report year as %d instead of %02d */
242 if (input[2] == '/') {
243 dt->Year=(*input-'0')*10;
244 input++;
245 } else {
246 dt->Year=0;
247 }
248
260 dt->Year=dt->Year+(*input-'0'); input++; 249 dt->Year=dt->Year+(*input-'0'); input++;
250 dt->Year+=2000;
261 251
262 input++; 252 input++;
263 dt->Month=(*input-'0')*10; input++; 253 dt->Month=(*input-'0')*10; input++;
264 dt->Month=dt->Month+(*input-'0'); input++; 254 dt->Month=dt->Month+(*input-'0'); input++;
265 255
266 input++; 256 input++;
267 dt->Day=(*input-'0')*10; input++; 257 dt->Day=(*input-'0')*10; input++;
268 dt->Day=dt->Day+(*input-'0'); input++; 258 dt->Day=dt->Day+(*input-'0'); input++;
269 259
270 input++; 260 input++;
271 dt->Hour=(*input-'0')*10; input++; 261 dt->Hour=(*input-'0')*10; input++;
272 dt->Hour=dt->Hour+(*input-'0'); input++; 262 dt->Hour=dt->Hour+(*input-'0'); input++;
273 263
274 input++; 264 input++;
275 dt->Minute=(*input-'0')*10; input++; 265 dt->Minute=(*input-'0')*10; input++;
276 dt->Minute=dt->Minute+(*input-'0');input++; 266 dt->Minute=dt->Minute+(*input-'0');input++;
277 267
278 input++; 268 input++;
279 dt->Second=(*input-'0')*10; input++; 269 dt->Second=(*input-'0')*10; input++;
280 dt->Second=dt->Second+(*input-'0');input++; 270 dt->Second=dt->Second+(*input-'0');input++;
281 271
282 if (input!=NULL) { 272 if (input!=NULL) {
283 input++; 273 input++;
284 dt->Timezone=(*input-'0')*10; input++; 274 dt->Timezone=(*input-'0')*10; input++;
285 dt->Timezone=dt->Timezone+(*input-'0');input++; 275 dt->Timezone=dt->Timezone+(*input-'0');input++;
286 input=input-2; 276 input=input-2;
287 if (*input=='-') dt->Timezone=-dt->Timezone; 277 if (*input=='-') dt->Timezone=-dt->Timezone;
288 } 278 }
289} 279}
290 280
291GSM_Error ATGEN_DispatchMessage(GSM_StateMachine *s) 281GSM_Error ATGEN_DispatchMessage(GSM_StateMachine *s)
292{ 282{
293 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 283 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
294 GSM_Protocol_Message *msg= s->Phone.Data.RequestMsg; 284 GSM_Protocol_Message *msg= s->Phone.Data.RequestMsg;
295 int i= 0, j, k; 285 int i= 0, j, k;
296 char *err, *line; 286 char *err, *line;
297 ATErrorCode *ErrorCodes = NULL; 287 ATErrorCode *ErrorCodes = NULL;
298 288
299 SplitLines(msg->Buffer, msg->Length, &Priv->Lines, "\x0D\x0A", 2, true); 289 SplitLines(msg->Buffer, msg->Length, &Priv->Lines, "\x0D\x0A", 2, true);
300 290
301 /* Find number of lines */ 291 /* Find number of lines */
302 while (Priv->Lines.numbers[i*2+1] != 0) { 292 while (Priv->Lines.numbers[i*2+1] != 0) {
303 /* FIXME: handle special chars correctly */ 293 /* FIXME: handle special chars correctly */
304 smprintf(s, "%i \"%s\"\n",i+1,GetLineString(msg->Buffer,Priv->Lines,i+1)); 294 smprintf(s, "%i \"%s\"\n",i+1,GetLineString(msg->Buffer,Priv->Lines,i+1));
305 i++; 295 i++;
306 } 296 }
307 297
308 Priv->ReplyState = AT_Reply_Unknown; 298 Priv->ReplyState = AT_Reply_Unknown;
309 Priv->ErrorText = NULL; 299 Priv->ErrorText = NULL;
310 Priv->ErrorCode = 0; 300 Priv->ErrorCode = 0;
311 301
312 line = GetLineString(msg->Buffer,Priv->Lines,i); 302 line = GetLineString(msg->Buffer,Priv->Lines,i);
313 if (!strcmp(line,"OK")) Priv->ReplyState = AT_Reply_OK; 303 if (!strcmp(line,"OK")) Priv->ReplyState = AT_Reply_OK;
314 if (!strcmp(line,"> ")) Priv->ReplyState = AT_Reply_SMSEdit; 304 if (!strcmp(line,"> ")) Priv->ReplyState = AT_Reply_SMSEdit;
315 if (!strcmp(line,"CONNECT"))Priv->ReplyState = AT_Reply_Connect; 305 if (!strcmp(line,"CONNECT"))Priv->ReplyState = AT_Reply_Connect;
316 if (!strcmp(line,"ERROR" ))Priv->ReplyState = AT_Reply_Error; 306 if (!strcmp(line,"ERROR" ))Priv->ReplyState = AT_Reply_Error;
317 if (!strncmp(line,"+CME ERROR:",11)) { 307 if (!strncmp(line,"+CME ERROR:",11)) {
318 Priv->ReplyState = AT_Reply_CMEError; 308 Priv->ReplyState = AT_Reply_CMEError;
319 ErrorCodes = CMEErrorCodes; 309 ErrorCodes = CMEErrorCodes;
320 } 310 }
321 if (!strncmp(line,"+CMS ERROR:",11)) { 311 if (!strncmp(line,"+CMS ERROR:",11)) {
322 Priv->ReplyState = AT_Reply_CMSError; 312 Priv->ReplyState = AT_Reply_CMSError;
323 ErrorCodes = CMSErrorCodes; 313 ErrorCodes = CMSErrorCodes;
324 } 314 }
315
316 /* FIXME: Samsung phones can answer +CME ERROR:-1 meaning empty location */
317 if (Priv->ReplyState == AT_Reply_CMEError && Priv->Manufacturer == AT_Samsung) {
318 err = line + 11;
319 Priv->ErrorCode = atoi(err);
320
321 if (Priv->ErrorCode == -1) {
322 Priv->ErrorText = "[Samsung] Empty location";
323 return GSM_DispatchMessage(s);
324 }
325 }
326
325 if (Priv->ReplyState == AT_Reply_CMEError || Priv->ReplyState == AT_Reply_CMSError) { 327 if (Priv->ReplyState == AT_Reply_CMEError || Priv->ReplyState == AT_Reply_CMSError) {
326 j = 0; 328 j = 0;
327 /* One char behind +CM[SE] ERROR */ 329 /* One char behind +CM[SE] ERROR */
328 err = line + 12; 330 err = line + 12;
329 while (err[j] && !isalnum(err[j])) j++; 331 while (err[j] && !isalnum(err[j])) j++;
330 if (isdigit(err[j])) { 332 if (isdigit(err[j])) {
331 Priv->ErrorCode = atoi(&(err[j])); 333 Priv->ErrorCode = atoi(&(err[j]));
332 k = 0; 334 k = 0;
333 while (ErrorCodes[k].Number != -1) { 335 while (ErrorCodes[k].Number != -1) {
334 if (ErrorCodes[k].Number == Priv->ErrorCode) { 336 if (ErrorCodes[k].Number == Priv->ErrorCode) {
335 Priv->ErrorText = (char *)&(ErrorCodes[k].Text); 337 Priv->ErrorText = (char *)&(ErrorCodes[k].Text);
336 break; 338 break;
337 } 339 }
338 k++; 340 k++;
339 } 341 }
340 } else if (isalpha(err[j])) { 342 } else if (isalpha(err[j])) {
341 k = 0; 343 k = 0;
342 while (ErrorCodes[k].Number != -1) { 344 while (ErrorCodes[k].Number != -1) {
343 if (!strncmp(err + j, ErrorCodes[k].Text, strlen(ErrorCodes[k].Text))) { 345 if (!strncmp(err + j, ErrorCodes[k].Text, strlen(ErrorCodes[k].Text))) {
344 Priv->ErrorCode = ErrorCodes[k].Number; 346 Priv->ErrorCode = ErrorCodes[k].Number;
345 Priv->ErrorText = (char *)&(ErrorCodes[k].Text); 347 Priv->ErrorText = (char *)&(ErrorCodes[k].Text);
346 break; 348 break;
347 } 349 }
348 k++; 350 k++;
349 } 351 }
350 } 352 }
351 } 353 }
352 return GSM_DispatchMessage(s); 354 return GSM_DispatchMessage(s);
353} 355}
354 356
355GSM_Error ATGEN_GenericReply(GSM_Protocol_Message msg, GSM_StateMachine *s) 357GSM_Error ATGEN_GenericReply(GSM_Protocol_Message msg, GSM_StateMachine *s)
356{ 358{
357 switch (s->Phone.Data.Priv.ATGEN.ReplyState) { 359 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
358 case AT_Reply_OK: 360 case AT_Reply_OK:
359 case AT_Reply_Connect: 361 case AT_Reply_Connect:
360 return ERR_NONE; 362 return ERR_NONE;
361 case AT_Reply_Error: 363 case AT_Reply_Error:
362 return ERR_UNKNOWN; 364 return ERR_UNKNOWN;
363 case AT_Reply_CMSError: 365 case AT_Reply_CMSError:
364 return ATGEN_HandleCMSError(s); 366 return ATGEN_HandleCMSError(s);
365 case AT_Reply_CMEError: 367 case AT_Reply_CMEError:
366 return ATGEN_HandleCMEError(s); 368 return ATGEN_HandleCMEError(s);
367 default: 369 default:
368 break; 370 break;
369 } 371 }
370 return ERR_UNKNOWNRESPONSE; 372 return ERR_UNKNOWNRESPONSE;
371} 373}
372 374
375GSM_Error ATGEN_ReplyGetUSSD(GSM_Protocol_Message msg, GSM_StateMachine *s)
376{
377 unsigned char buffer[2000],buffer2[4000];
378 int i = 10;
379
380 /* Ugly hack */
381 while (msg.Buffer[i]!=13) i++;
382 i = i - 6;
383 memcpy(buffer,msg.Buffer+10,i-11);
384 buffer[i-11] = 0x00;
385
386 smprintf(s, "USSD reply: \"%s\"\n",buffer);
387
388 if (s->Phone.Data.EnableIncomingUSSD && s->User.IncomingUSSD!=NULL) {
389 EncodeUnicode(buffer2,buffer,strlen(buffer));
390 s->User.IncomingUSSD(s->CurrentConfig->Device, buffer2);
391 }
392
393 return ERR_NONE;
394}
395
396GSM_Error ATGEN_SetIncomingUSSD(GSM_StateMachine *s, bool enable)
397{
398 GSM_Error error;
399
400 if (enable) {
401 smprintf(s, "Enabling incoming USSD\n");
402 error=GSM_WaitFor (s, "AT+CUSD=1\r", 10, 0x00, 3, ID_SetUSSD);
403 } else {
404 smprintf(s, "Disabling incoming USSD\n");
405 error=GSM_WaitFor (s, "AT+CUSD=0\r", 10, 0x00, 3, ID_SetUSSD);
406 }
407 if (error==ERR_NONE) s->Phone.Data.EnableIncomingUSSD = enable;
408 return error;
409}
410
373GSM_Error ATGEN_ReplyGetModel(GSM_Protocol_Message msg, GSM_StateMachine *s) 411GSM_Error ATGEN_ReplyGetModel(GSM_Protocol_Message msg, GSM_StateMachine *s)
374{ 412{
375 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 413 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
376 GSM_Phone_Data *Data = &s->Phone.Data; 414 GSM_Phone_Data *Data = &s->Phone.Data;
377 415
378 if (s->Phone.Data.Priv.ATGEN.ReplyState != AT_Reply_OK) return ERR_NOTSUPPORTED; 416 if (s->Phone.Data.Priv.ATGEN.ReplyState != AT_Reply_OK) return ERR_NOTSUPPORTED;
379 417
380 if (strlen(GetLineString(msg.Buffer, Priv->Lines, 2)) <= MAX_MODEL_LENGTH) { 418 if (strlen(GetLineString(msg.Buffer, Priv->Lines, 2)) <= MAX_MODEL_LENGTH) {
381 CopyLineString(Data->Model, msg.Buffer, Priv->Lines, 2); 419 CopyLineString(Data->Model, msg.Buffer, Priv->Lines, 2);
382 420
383 /* Sometimes phone adds this before manufacturer (Sagem) */ 421 /* Sometimes phone adds this before manufacturer (Sagem) */
384 if (strncmp("+CGMM: ", Data->Model, 7) == 0) { 422 if (strncmp("+CGMM: ", Data->Model, 7) == 0) {
385 memmove(Data->Model, Data->Model + 7, strlen(Data->Model + 7) + 1); 423 memmove(Data->Model, Data->Model + 7, strlen(Data->Model + 7) + 1);
386 } 424 }
387 425
388 Data->ModelInfo = GetModelData(NULL,Data->Model,NULL); 426 Data->ModelInfo = GetModelData(NULL,Data->Model,NULL);
389 if (Data->ModelInfo->number[0] == 0) Data->ModelInfo = GetModelData(NULL,NULL,Data->Model); 427 if (Data->ModelInfo->number[0] == 0) Data->ModelInfo = GetModelData(NULL,NULL,Data->Model);
390 if (Data->ModelInfo->number[0] == 0) Data->ModelInfo = GetModelData(Data->Model,NULL,NULL); 428 if (Data->ModelInfo->number[0] == 0) Data->ModelInfo = GetModelData(Data->Model,NULL,NULL);
391 429
392 if (Data->ModelInfo->number[0] != 0) strcpy(Data->Model,Data->ModelInfo->number); 430 if (Data->ModelInfo->number[0] != 0) strcpy(Data->Model,Data->ModelInfo->number);
393 431
394 if (strstr(msg.Buffer,"Nokia")) Priv->Manufacturer = AT_Nokia; 432 if (strstr(msg.Buffer,"Nokia")) Priv->Manufacturer = AT_Nokia;
395 else if (strstr(msg.Buffer,"M20")) Priv->Manufacturer = AT_Siemens; 433 else if (strstr(msg.Buffer,"M20")) Priv->Manufacturer = AT_Siemens;
396 else if (strstr(msg.Buffer,"MC35")) Priv->Manufacturer = AT_Siemens; 434 else if (strstr(msg.Buffer,"MC35")) Priv->Manufacturer = AT_Siemens;
435 else if (strstr(msg.Buffer,"TC35")) Priv->Manufacturer = AT_Siemens;
397 else if (strstr(msg.Buffer, "iPAQ")) Priv->Manufacturer = AT_HP; 436 else if (strstr(msg.Buffer, "iPAQ")) Priv->Manufacturer = AT_HP;
398 437
399 if (strstr(msg.Buffer,"M20")) strcpy(Data->Model,"M20"); 438 if (strstr(msg.Buffer,"M20")) strcpy(Data->Model,"M20");
400 else if (strstr(msg.Buffer,"MC35")) strcpy(Data->Model,"MC35"); 439 else if (strstr(msg.Buffer,"MC35")) strcpy(Data->Model,"MC35");
440 else if (strstr(msg.Buffer,"TC35")) strcpy(Data->Model,"TC35");
401 else if (strstr(msg.Buffer, "iPAQ")) strcpy(Data->Model,"iPAQ"); 441 else if (strstr(msg.Buffer, "iPAQ")) strcpy(Data->Model,"iPAQ");
402 } else { 442 } else {
403 smprintf(s, "WARNING: Model name too long, increase MAX_MODEL_LENGTH to at least %zd\n", strlen(GetLineString(msg.Buffer, Priv->Lines, 2))); 443 smprintf(s, "WARNING: Model name too long, increase MAX_MODEL_LENGTH to at least %zd\n", strlen(GetLineString(msg.Buffer, Priv->Lines, 2)));
404 } 444 }
405 445
406 return ERR_NONE; 446 return ERR_NONE;
407} 447}
408 448
409GSM_Error ATGEN_GetModel(GSM_StateMachine *s) 449GSM_Error ATGEN_GetModel(GSM_StateMachine *s)
410{ 450{
411 GSM_Error error; 451 GSM_Error error;
412 452
413 if (s->Phone.Data.Model[0] != 0) return ERR_NONE; 453 if (s->Phone.Data.Model[0] != 0) return ERR_NONE;
414 454
415 smprintf(s, "Getting model\n"); 455 smprintf(s, "Getting model\n");
416 error=GSM_WaitFor (s, "AT+CGMM\r", 8, 0x00, 3, ID_GetModel); 456 error=GSM_WaitFor (s, "AT+CGMM\r", 8, 0x00, 3, ID_GetModel);
417 if (error==ERR_NONE) { 457 if (error==ERR_NONE) {
418 if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || 458 if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL ||
419 s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) { 459 s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) {
420 smprintf(s, "[Connected model - \"%s\"]\n",s->Phone.Data.Model); 460 smprintf(s, "[Connected model - \"%s\"]\n",s->Phone.Data.Model);
421 } 461 }
422 } 462 }
423 return error; 463 return error;
424} 464}
425 465
426GSM_Error ATGEN_ReplyGetManufacturer(GSM_Protocol_Message msg, GSM_StateMachine *s) 466GSM_Error ATGEN_ReplyGetManufacturer(GSM_Protocol_Message msg, GSM_StateMachine *s)
427{ 467{
428 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 468 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
429 469
430 switch (Priv->ReplyState) { 470 switch (Priv->ReplyState) {
431 case AT_Reply_OK: 471 case AT_Reply_OK:
432 smprintf(s, "Manufacturer info received\n"); 472 smprintf(s, "Manufacturer info received\n");
433 Priv->Manufacturer = AT_Unknown; 473 Priv->Manufacturer = AT_Unknown;
434 if (strlen(GetLineString(msg.Buffer, Priv->Lines, 2)) <= MAX_MANUFACTURER_LENGTH) { 474 if (strlen(GetLineString(msg.Buffer, Priv->Lines, 2)) <= MAX_MANUFACTURER_LENGTH) {
435 CopyLineString(s->Phone.Data.Manufacturer, msg.Buffer, Priv->Lines, 2); 475 CopyLineString(s->Phone.Data.Manufacturer, msg.Buffer, Priv->Lines, 2);
436 } else { 476 } else {
437 smprintf(s, "WARNING: Manufacturer name too long, increase MAX_MANUFACTURER_LENGTH to at least %zd\n", strlen(GetLineString(msg.Buffer, Priv->Lines, 2))); 477 smprintf(s, "WARNING: Manufacturer name too long, increase MAX_MANUFACTURER_LENGTH to at least %zd\n", strlen(GetLineString(msg.Buffer, Priv->Lines, 2)));
438 s->Phone.Data.Manufacturer[0] = 0; 478 s->Phone.Data.Manufacturer[0] = 0;
439 } 479 }
440 /* Sometimes phone adds this before manufacturer (Sagem) */ 480 /* Sometimes phone adds this before manufacturer (Sagem) */
441 if (strncmp("+CGMI: ", s->Phone.Data.Manufacturer, 7) == 0) { 481 if (strncmp("+CGMI: ", s->Phone.Data.Manufacturer, 7) == 0) {
442 memmove(s->Phone.Data.Manufacturer, s->Phone.Data.Manufacturer + 7, strlen(s->Phone.Data.Manufacturer + 7) + 1); 482 memmove(s->Phone.Data.Manufacturer, s->Phone.Data.Manufacturer + 7, strlen(s->Phone.Data.Manufacturer + 7) + 1);
443 } 483 }
444 if (strstr(msg.Buffer,"Falcom")) { 484 if (strstr(msg.Buffer,"Falcom")) {
445 smprintf(s, "Falcom\n"); 485 smprintf(s, "Falcom\n");
446 strcpy(s->Phone.Data.Manufacturer,"Falcom"); 486 strcpy(s->Phone.Data.Manufacturer,"Falcom");
447 Priv->Manufacturer = AT_Falcom; 487 Priv->Manufacturer = AT_Falcom;
448 if (strstr(msg.Buffer,"A2D")) { 488 if (strstr(msg.Buffer,"A2D")) {
449 strcpy(s->Phone.Data.Model,"A2D"); 489 strcpy(s->Phone.Data.Model,"A2D");
450 s->Phone.Data.ModelInfo = GetModelData(NULL,s->Phone.Data.Model,NULL); 490 s->Phone.Data.ModelInfo = GetModelData(NULL,s->Phone.Data.Model,NULL);
451 smprintf(s, "Model A2D\n"); 491 smprintf(s, "Model A2D\n");
452 } 492 }
453 } 493 }
454 if (strstr(msg.Buffer,"Nokia")) { 494 if (strstr(msg.Buffer,"Nokia")) {
455 smprintf(s, "Nokia\n"); 495 smprintf(s, "Nokia\n");
456 strcpy(s->Phone.Data.Manufacturer,"Nokia"); 496 strcpy(s->Phone.Data.Manufacturer,"Nokia");
457 Priv->Manufacturer = AT_Nokia; 497 Priv->Manufacturer = AT_Nokia;
458 } 498 }
459 if (strstr(msg.Buffer,"SIEMENS")) { 499 if (strstr(msg.Buffer,"SIEMENS")) {
460 smprintf(s, "Siemens\n"); 500 smprintf(s, "Siemens\n");
461 strcpy(s->Phone.Data.Manufacturer,"Siemens"); 501 strcpy(s->Phone.Data.Manufacturer,"Siemens");
462 Priv->Manufacturer = AT_Siemens; 502 Priv->Manufacturer = AT_Siemens;
463 } 503 }
464 if (strstr(msg.Buffer,"ERICSSON")) { 504 if (strstr(msg.Buffer,"ERICSSON")) {
465 smprintf(s, "Ericsson\n"); 505 smprintf(s, "Ericsson\n");
466 strcpy(s->Phone.Data.Manufacturer,"Ericsson"); 506 strcpy(s->Phone.Data.Manufacturer,"Ericsson");
467 Priv->Manufacturer = AT_Ericsson; 507 Priv->Manufacturer = AT_Ericsson;
468 } 508 }
469 if (strstr(msg.Buffer,"iPAQ")) { 509 if (strstr(msg.Buffer,"iPAQ")) {
470 smprintf(s, "iPAQ\n"); 510 smprintf(s, "iPAQ\n");
471 strcpy(s->Phone.Data.Manufacturer,"HP"); 511 strcpy(s->Phone.Data.Manufacturer,"HP");
472 Priv->Manufacturer = AT_HP; 512 Priv->Manufacturer = AT_HP;
473 } 513 }
474 if (strstr(msg.Buffer,"ALCATEL")) { 514 if (strstr(msg.Buffer,"ALCATEL")) {
475 smprintf(s, "Alcatel\n"); 515 smprintf(s, "Alcatel\n");
476 strcpy(s->Phone.Data.Manufacturer,"Alcatel"); 516 strcpy(s->Phone.Data.Manufacturer,"Alcatel");
477 Priv->Manufacturer = AT_Alcatel; 517 Priv->Manufacturer = AT_Alcatel;
478 } 518 }
479 if (strstr(msg.Buffer,"SAGEM")) { 519 if (strstr(msg.Buffer,"SAGEM")) {
480 smprintf(s, "Sagem\n"); 520 smprintf(s, "Sagem\n");
481 strcpy(s->Phone.Data.Manufacturer,"Sagem"); 521 strcpy(s->Phone.Data.Manufacturer,"Sagem");
482 Priv->Manufacturer = AT_Sagem; 522 Priv->Manufacturer = AT_Sagem;
483 } 523 }
524 if (strstr(msg.Buffer,"Samsung")) {
525 smprintf(s, "Samsung\n");
526 strcpy(s->Phone.Data.Manufacturer,"Samsung");
527 Priv->Manufacturer = AT_Samsung;
528 }
484 return ERR_NONE; 529 return ERR_NONE;
485 case AT_Reply_CMSError: 530 case AT_Reply_CMSError:
486 return ATGEN_HandleCMSError(s); 531 return ATGEN_HandleCMSError(s);
487 default: 532 default:
488 break; 533 break;
489 } 534 }
490 return ERR_UNKNOWNRESPONSE; 535 return ERR_UNKNOWNRESPONSE;
491} 536}
492 537
493GSM_Error ATGEN_GetManufacturer(GSM_StateMachine *s) 538GSM_Error ATGEN_GetManufacturer(GSM_StateMachine *s)
494{ 539{
495 if (s->Phone.Data.Manufacturer[0] != 0) return ERR_NONE; 540 if (s->Phone.Data.Manufacturer[0] != 0) return ERR_NONE;
496 541
497 return GSM_WaitFor (s, "AT+CGMI\r", 8, 0x00, 4, ID_GetManufacturer); 542 return GSM_WaitFor (s, "AT+CGMI\r", 8, 0x00, 4, ID_GetManufacturer);
498} 543}
499 544
500GSM_Error ATGEN_ReplyGetFirmwareCGMR(GSM_Protocol_Message msg, GSM_StateMachine *s) 545GSM_Error ATGEN_ReplyGetFirmwareCGMR(GSM_Protocol_Message msg, GSM_StateMachine *s)
501{ 546{
502 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 547 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
503 unsigned int i = 0; 548 unsigned int i = 0;
504 549
505 strcpy(s->Phone.Data.Version,"unknown"); 550 strcpy(s->Phone.Data.Version,"unknown");
506 s->Phone.Data.VerNum = 0; 551 s->Phone.Data.VerNum = 0;
507 if (Priv->ReplyState == AT_Reply_OK) { 552 if (Priv->ReplyState == AT_Reply_OK) {
508 CopyLineString(s->Phone.Data.Version, msg.Buffer, Priv->Lines, 2); 553 CopyLineString(s->Phone.Data.Version, msg.Buffer, Priv->Lines, 2);
509 /* Sometimes phone adds this before manufacturer (Sagem) */ 554 /* Sometimes phone adds this before manufacturer (Sagem) */
510 if (strncmp("+CGMR: ", s->Phone.Data.Version, 7) == 0) { 555 if (strncmp("+CGMR: ", s->Phone.Data.Version, 7) == 0) {
511 memmove(s->Phone.Data.Version, s->Phone.Data.Version + 7, strlen(s->Phone.Data.Version + 7) + 1); 556 memmove(s->Phone.Data.Version, s->Phone.Data.Version + 7, strlen(s->Phone.Data.Version + 7) + 1);
512 } 557 }
513 } 558 }
514 if (Priv->Manufacturer == AT_Ericsson) { 559 if (Priv->Manufacturer == AT_Ericsson) {
515 while (1) { 560 while (1) {
516 if (s->Phone.Data.Version[i] == 0x20) { 561 if (s->Phone.Data.Version[i] == 0x20) {
517 s->Phone.Data.Version[i] = 0x00; 562 s->Phone.Data.Version[i] = 0x00;
518 break; 563 break;
519 } 564 }
520 if (i == strlen(s->Phone.Data.Version)) break; 565 if (i == strlen(s->Phone.Data.Version)) break;
521 i++; 566 i++;
522 } 567 }
523 } 568 }
524 smprintf(s, "Received firmware version: \"%s\"\n",s->Phone.Data.Version); 569 smprintf(s, "Received firmware version: \"%s\"\n",s->Phone.Data.Version);
525 GSM_CreateFirmwareNumber(s); 570 GSM_CreateFirmwareNumber(s);
526 return ERR_NONE; 571 return ERR_NONE;
527} 572}
528 573
529GSM_Error ATGEN_ReplyGetFirmwareATI(GSM_Protocol_Message msg, GSM_StateMachine *s) 574GSM_Error ATGEN_ReplyGetFirmwareATI(GSM_Protocol_Message msg, GSM_StateMachine *s)
530{ 575{
531 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 576 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
@@ -629,106 +674,116 @@ GSM_Error ATGEN_Initialise(GSM_StateMachine *s)
629 if (error != ERR_NONE) return error; 674 if (error != ERR_NONE) return error;
630 675
631 smprintf(s, "Enabling CME errors\n"); 676 smprintf(s, "Enabling CME errors\n");
632 /* Try numeric errors */ 677 /* Try numeric errors */
633 if (GSM_WaitFor (s, "AT+CMEE=1\r", 10, 0x00, 3, ID_EnableErrorInfo) != ERR_NONE) { 678 if (GSM_WaitFor (s, "AT+CMEE=1\r", 10, 0x00, 3, ID_EnableErrorInfo) != ERR_NONE) {
634 /* Try textual errors */ 679 /* Try textual errors */
635 if (GSM_WaitFor (s, "AT+CMEE=2\r", 10, 0x00, 3, ID_EnableErrorInfo) != ERR_NONE) { 680 if (GSM_WaitFor (s, "AT+CMEE=2\r", 10, 0x00, 3, ID_EnableErrorInfo) != ERR_NONE) {
636 smprintf(s, "CME errors could not be enabled, some error types won't be detected.\n"); 681 smprintf(s, "CME errors could not be enabled, some error types won't be detected.\n");
637 } 682 }
638 } 683 }
639 684
640 error = ATGEN_GetModel(s); 685 error = ATGEN_GetModel(s);
641 if (error != ERR_NONE) return error; 686 if (error != ERR_NONE) return error;
642 687
643 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SLOWWRITE)) { 688 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SLOWWRITE)) {
644 s->Protocol.Data.AT.FastWrite = true; 689 s->Protocol.Data.AT.FastWrite = true;
645 } 690 }
646 691
647 return error; 692 return error;
648} 693}
649 694
650GSM_Error ATGEN_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc) 695GSM_Error ATGEN_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
651{ 696{
652 unsigned char req[50]; 697 unsigned char req[50];
653 698
654 if (smsc->Location!=1) return ERR_NOTSUPPORTED; 699 if (smsc->Location!=1) return ERR_NOTSUPPORTED;
655 700
656 sprintf(req, "AT+CSCA=\"%s\"\r",DecodeUnicodeString(smsc->Number)); 701 sprintf(req, "AT+CSCA=\"%s\"\r",DecodeUnicodeString(smsc->Number));
657 702
658 smprintf(s, "Setting SMSC\n"); 703 smprintf(s, "Setting SMSC\n");
659 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_SetSMSC); 704 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_SetSMSC);
660} 705}
661 706
662GSM_Error ATGEN_ReplyGetSMSMemories(GSM_Protocol_Message msg, GSM_StateMachine *s) 707GSM_Error ATGEN_ReplyGetSMSMemories(GSM_Protocol_Message msg, GSM_StateMachine *s)
663{ 708{
664 switch (s->Phone.Data.Priv.ATGEN.ReplyState) { 709 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
665 case AT_Reply_OK: 710 case AT_Reply_OK:
666 /* Reply here is: 711 /* Reply here is:
667 * (memories for reading)[, (memories for writing)[, (memories for storing received messages)]] 712 * (memories for reading)[, (memories for writing)[, (memories for storing received messages)]]
668 * each memory is in quotes, 713 * each memory is in quotes,
669 * Example: ("SM"), ("SM"), ("SM") 714 * Example: ("SM"), ("SM"), ("SM")
670 * 715 *
671 * We need to get from this supported memories. For this case 716 * We need to get from this supported memories. For this case
672 * we assume, that just appearence of memory makes it 717 * we assume, that just appearence of memory makes it
673 * available for everything. Then we need to find out whether 718 * available for everything. Then we need to find out whether
674 * phone supports writing to memory. This is done by searching 719 * phone supports writing to memory. This is done by searching
675 * for "), (", which will appear between lists. 720 * for "), (", which will appear between lists.
676 */ 721 */
677 s->Phone.Data.Priv.ATGEN.CanSaveSMS = (strstr(msg.Buffer, "), (") != NULL); 722 s->Phone.Data.Priv.ATGEN.CanSaveSMS = false;
723 if (strstr(msg.Buffer, "), (") != NULL || strstr(msg.Buffer, "),(") != NULL) {
724 s->Phone.Data.Priv.ATGEN.CanSaveSMS = true;
725 }
726
678 if (strstr(msg.Buffer, "\"SM\"") != NULL) s->Phone.Data.Priv.ATGEN.SIMSMSMemory = AT_AVAILABLE; 727 if (strstr(msg.Buffer, "\"SM\"") != NULL) s->Phone.Data.Priv.ATGEN.SIMSMSMemory = AT_AVAILABLE;
679 else s->Phone.Data.Priv.ATGEN.SIMSMSMemory = AT_NOTAVAILABLE; 728 else s->Phone.Data.Priv.ATGEN.SIMSMSMemory = AT_NOTAVAILABLE;
729
680 if (strstr(msg.Buffer, "\"ME\"") != NULL) s->Phone.Data.Priv.ATGEN.PhoneSMSMemory = AT_AVAILABLE; 730 if (strstr(msg.Buffer, "\"ME\"") != NULL) s->Phone.Data.Priv.ATGEN.PhoneSMSMemory = AT_AVAILABLE;
681 else s->Phone.Data.Priv.ATGEN.PhoneSMSMemory = AT_NOTAVAILABLE; 731 else s->Phone.Data.Priv.ATGEN.PhoneSMSMemory = AT_NOTAVAILABLE;
682 smprintf(s, "Available SMS memories received, ME = %d, SM = %d\n", s->Phone.Data.Priv.ATGEN.PhoneSMSMemory, s->Phone.Data.Priv.ATGEN.SIMSMSMemory); 732
733 smprintf(s, "Available SMS memories received, ME = %d, SM = %d, cansavesms =", s->Phone.Data.Priv.ATGEN.PhoneSMSMemory, s->Phone.Data.Priv.ATGEN.SIMSMSMemory);
734 if (s->Phone.Data.Priv.ATGEN.CanSaveSMS) smprintf(s, "true");
735 smprintf(s, "\n");
683 return ERR_NONE; 736 return ERR_NONE;
684 case AT_Reply_Error: 737 case AT_Reply_Error:
685 case AT_Reply_CMSError: 738 case AT_Reply_CMSError:
686 return ATGEN_HandleCMSError(s); 739 return ATGEN_HandleCMSError(s);
740 case AT_Reply_CMEError:
741 return ATGEN_HandleCMEError(s);
687 default: 742 default:
688 return ERR_UNKNOWNRESPONSE; 743 return ERR_UNKNOWNRESPONSE;
689 } 744 }
690} 745}
691 746
692GSM_Error ATGEN_GetSMSMemories(GSM_StateMachine *s) 747GSM_Error ATGEN_GetSMSMemories(GSM_StateMachine *s)
693{ 748{
694 smprintf(s, "Getting available SMS memories\n"); 749 smprintf(s, "Getting available SMS memories\n");
695 return GSM_WaitFor (s, "AT+CPMS=?\r", 10, 0x00, 4, ID_GetSMSMemories); 750 return GSM_WaitFor (s, "AT+CPMS=?\r", 10, 0x00, 4, ID_GetSMSMemories);
696} 751}
697 752
698GSM_Error ATGEN_SetSMSMemory(GSM_StateMachine *s, bool SIM) 753GSM_Error ATGEN_SetSMSMemory(GSM_StateMachine *s, bool SIM)
699{ 754{
700 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 755 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
701 char req[] = "AT+CPMS=\"XX\",\"XX\"\r"; 756 char req[] = "AT+CPMS=\"XX\",\"XX\"\r";
702 int reqlen = 18; 757 int reqlen = 18;
703 GSM_Error error; 758 GSM_Error error;
704 759
705 if ((SIM && Priv->SIMSMSMemory == 0) || (!SIM && Priv->PhoneSMSMemory == 0)) { 760 if ((SIM && Priv->SIMSMSMemory == 0) || (!SIM && Priv->PhoneSMSMemory == 0)) {
706 /* We silently ignore error here, because when this fails, we can try to setmemory anyway */ 761 /* We silently ignore error here, because when this fails, we can try to setmemory anyway */
707 ATGEN_GetSMSMemories(s); 762 ATGEN_GetSMSMemories(s);
708 } 763 }
709 764
710 /* If phone can not save SMS, don't try to set memory for saving */ 765 /* If phone can not save SMS, don't try to set memory for saving */
711 if (!Priv->CanSaveSMS) { 766 if (!Priv->CanSaveSMS) {
712 req[12] = '\r'; 767 req[12] = '\r';
713 reqlen = 13; 768 reqlen = 13;
714 } 769 }
715 770
716 if (SIM) { 771 if (SIM) {
717 if (Priv->SMSMemory == MEM_SM) return ERR_NONE; 772 if (Priv->SMSMemory == MEM_SM) return ERR_NONE;
718 if (Priv->SIMSMSMemory == AT_NOTAVAILABLE) return ERR_NOTSUPPORTED; 773 if (Priv->SIMSMSMemory == AT_NOTAVAILABLE) return ERR_NOTSUPPORTED;
719 774
720 req[9] = 'S'; req[10] = 'M'; 775 req[9] = 'S'; req[10] = 'M';
721 req[14] = 'S'; req[15] = 'M'; 776 req[14] = 'S'; req[15] = 'M';
722 777
723 smprintf(s, "Setting SMS memory type to SM\n"); 778 smprintf(s, "Setting SMS memory type to SM\n");
724 error=GSM_WaitFor (s, req, reqlen, 0x00, 3, ID_SetMemoryType); 779 error=GSM_WaitFor (s, req, reqlen, 0x00, 3, ID_SetMemoryType);
725 if (Priv->SIMSMSMemory == 0 && error == ERR_NONE) { 780 if (Priv->SIMSMSMemory == 0 && error == ERR_NONE) {
726 Priv->SIMSMSMemory = AT_AVAILABLE; 781 Priv->SIMSMSMemory = AT_AVAILABLE;
727 } 782 }
728 if (error == ERR_NOTSUPPORTED) { 783 if (error == ERR_NOTSUPPORTED) {
729 smprintf(s, "Can't access SIM card?\n"); 784 smprintf(s, "Can't access SIM card?\n");
730 return ERR_SECURITYERROR; 785 return ERR_SECURITYERROR;
731 } 786 }
732 if (error != ERR_NONE) return error; 787 if (error != ERR_NONE) return error;
733 Priv->SMSMemory = MEM_SM; 788 Priv->SMSMemory = MEM_SM;
734 } else { 789 } else {
@@ -813,188 +868,189 @@ GSM_Error ATGEN_GetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigne
813 } 868 }
814 smprintf(s, "SMS folder %i & location %i -> ATGEN folder %i & location %i\n", 869 smprintf(s, "SMS folder %i & location %i -> ATGEN folder %i & location %i\n",
815 sms->Folder,sms->Location,*folderid,*location); 870 sms->Folder,sms->Location,*folderid,*location);
816 871
817 if (Priv->SIMSMSMemory == AT_AVAILABLE && *folderid == 1) { 872 if (Priv->SIMSMSMemory == AT_AVAILABLE && *folderid == 1) {
818 return ATGEN_SetSMSMemory(s, true); 873 return ATGEN_SetSMSMemory(s, true);
819 } else { 874 } else {
820 return ATGEN_SetSMSMemory(s, false); 875 return ATGEN_SetSMSMemory(s, false);
821 } 876 }
822} 877}
823 878
824void ATGEN_SetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char folderid, int location) 879void ATGEN_SetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char folderid, int location)
825{ 880{
826 sms->Folder= 0; 881 sms->Folder= 0;
827 sms->Location= (folderid - 1) * PHONE_MAXSMSINFOLDER + location; 882 sms->Location= (folderid - 1) * PHONE_MAXSMSINFOLDER + location;
828 smprintf(s, "ATGEN folder %i & location %i -> SMS folder %i & location %i\n", 883 smprintf(s, "ATGEN folder %i & location %i -> SMS folder %i & location %i\n",
829 folderid,location,sms->Folder,sms->Location); 884 folderid,location,sms->Folder,sms->Location);
830} 885}
831 886
832GSM_Error ATGEN_ReplyGetSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s) 887GSM_Error ATGEN_ReplyGetSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s)
833{ 888{
834 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 889 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
835 GSM_SMSMessage *sms= &s->Phone.Data.GetSMSMessage->SMS[0]; 890 GSM_SMSMessage *sms= &s->Phone.Data.GetSMSMessage->SMS[0];
836 int current = 0, current2, i; 891 int current = 0, current2, i;
837 unsigned char buffer[300],smsframe[800]; 892 unsigned char buffer[300],smsframe[800];
838 unsigned char firstbyte, TPDCS, TPUDL, TPStatus; 893 unsigned char firstbyte, TPDCS, TPUDL, TPStatus;
839 GSM_Error error; 894 GSM_Error error;
840 895
841 switch (Priv->ReplyState) { 896 switch (Priv->ReplyState) {
842 case AT_Reply_OK: 897 case AT_Reply_OK:
843 if (Priv->Lines.numbers[4] == 0x00) return ERR_EMPTY; 898 if (Priv->Lines.numbers[4] == 0x00) return ERR_EMPTY;
844 s->Phone.Data.GetSMSMessage->Number = 1; 899 s->Phone.Data.GetSMSMessage->Number = 1;
845 s->Phone.Data.GetSMSMessage->SMS[0].Name[0] = 0; 900 s->Phone.Data.GetSMSMessage->SMS[0].Name[0] = 0;
846 s->Phone.Data.GetSMSMessage->SMS[0].Name[1]= 0; 901 s->Phone.Data.GetSMSMessage->SMS[0].Name[1]= 0;
847 switch (Priv->SMSMode) { 902 switch (Priv->SMSMode) {
848 case SMS_AT_PDU: 903 case SMS_AT_PDU:
849 CopyLineString(buffer, msg.Buffer, Priv->Lines, 2); 904 CopyLineString(buffer, msg.Buffer, Priv->Lines, 2);
850 switch (buffer[7]) { 905 switch (buffer[7]) {
851 case '0': sms->State = SMS_UnRead; break; 906 case '0': sms->State = SMS_UnRead; break;
852 case '1': sms->State = SMS_Read;break; 907 case '1': sms->State = SMS_Read;break;
853 case '2': sms->State = SMS_UnSent;break; 908 case '2': sms->State = SMS_UnSent;break;
854 default : sms->State = SMS_Sent;break;//case '3' 909 default : sms->State = SMS_Sent;break;//case '3'
855 } 910 }
856 DecodeHexBin (buffer, GetLineString(msg.Buffer,Priv->Lines,3), strlen(GetLineString(msg.Buffer,Priv->Lines,3))); 911 DecodeHexBin (buffer, GetLineString(msg.Buffer,Priv->Lines,3), strlen(GetLineString(msg.Buffer,Priv->Lines,3)));
857 /* Siemens MC35 (only ?) */ 912 /* Siemens MC35 (only ?) */
858 if (strstr(msg.Buffer,"+CMGR: 0,,0")!=NULL) return ERR_EMPTY; 913 if (strstr(msg.Buffer,"+CMGR: 0,,0")!=NULL) return ERR_EMPTY;
859 /* Siemens M20 */ 914 /* Siemens M20 */
860 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_M20SMS)) { 915 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_M20SMS)) {
861 if (buffer[1]!=NUMBER_UNKNOWN && buffer[1]!=NUMBER_INTERNATIONAL && 916 /* we check for the most often visible */
862 buffer[1]!=NUMBER_ALPHANUMERIC) { 917 if (buffer[1]!=NUMBER_UNKNOWN_NUMBERING_PLAN_ISDN && buffer[1]!=NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN &&
918 buffer[1]!=NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN) {
863 /* Seems to be Delivery Report */ 919 /* Seems to be Delivery Report */
864 smprintf(s, "SMS type - status report (M20 style)\n"); 920 smprintf(s, "SMS type - status report (M20 style)\n");
865 sms->PDU = SMS_Status_Report; 921 sms->PDU = SMS_Status_Report;
866 sms->Folder = 1;/*INBOX SIM*/ 922 sms->Folder = 1;/*INBOX SIM*/
867 sms->InboxFolder = true; 923 sms->InboxFolder = true;
868 924
869 smsframe[12]=buffer[current++]; 925 smsframe[12]=buffer[current++];
870 smsframe[PHONE_SMSStatusReport.TPMR]=buffer[current++]; 926 smsframe[PHONE_SMSStatusReport.TPMR]=buffer[current++];
871 current2=((buffer[current])+1)/2+1; 927 current2=((buffer[current])+1)/2+1;
872 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSStatusReport.Number+i]=buffer[current++]; 928 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSStatusReport.Number+i]=buffer[current++];
873 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.DateTime+i]=buffer[current++]; 929 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.DateTime+i]=buffer[current++];
874 smsframe[0] = 0; 930 smsframe[0] = 0;
875 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.SMSCTime+i]=buffer[current++]; 931 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.SMSCTime+i]=buffer[current++];
876 smsframe[PHONE_SMSStatusReport.TPStatus]=buffer[current]; 932 smsframe[PHONE_SMSStatusReport.TPStatus]=buffer[current];
877 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSStatusReport); 933 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSStatusReport);
878 return ERR_NONE; 934 return ERR_NONE;
879 } 935 }
880 } 936 }
881 /* We use locations from SMS layouts like in ../phone2.c(h) */ 937 /* We use locations from SMS layouts like in ../phone2.c(h) */
882 for(i=0;i<buffer[0]+1;i++) smsframe[i]=buffer[current++]; 938 for(i=0;i<buffer[0]+1;i++) smsframe[i]=buffer[current++];
883 smsframe[12]=buffer[current++]; 939 smsframe[12]=buffer[current++];
884 /* See GSM 03.40 section 9.2.3.1 */ 940 /* See GSM 03.40 section 9.2.3.1 */
885 switch (smsframe[12] & 0x03) { 941 switch (smsframe[12] & 0x03) {
886 case 0x00: 942 case 0x00:
887 smprintf(s, "SMS type - deliver\n"); 943 smprintf(s, "SMS type - deliver\n");
888 sms->PDU = SMS_Deliver; 944 sms->PDU = SMS_Deliver;
889 if (Priv->SMSMemory == MEM_SM) { 945 if (Priv->SMSMemory == MEM_SM) {
890 sms->Folder = 1; /*INBOX SIM*/ 946 sms->Folder = 1; /*INBOX SIM*/
891 } else { 947 } else {
892 sms->Folder = 3; /*INBOX ME*/ 948 sms->Folder = 3; /*INBOX ME*/
893 } 949 }
894 sms->InboxFolder = true; 950 sms->InboxFolder = true;
895 current2=((buffer[current])+1)/2+1; 951 current2=((buffer[current])+1)/2+1;
896 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_M20SMS)) { 952 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_M20SMS)) {
897 if (buffer[current+1]==NUMBER_ALPHANUMERIC) { 953 if (buffer[current+1]==NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN) {
898 smprintf(s, "Trying to read alphanumeric number\n"); 954 smprintf(s, "Trying to read alphanumeric number\n");
899 for(i=0;i<4;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++]; 955 for(i=0;i<4;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++];
900 current+=6; 956 current+=6;
901 for(i=0;i<current2-3;i++) smsframe[PHONE_SMSDeliver.Number+i+4]=buffer[current++]; 957 for(i=0;i<current2-3;i++) smsframe[PHONE_SMSDeliver.Number+i+4]=buffer[current++];
902 } else { 958 } else {
903 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++]; 959 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++];
904 } 960 }
905 } else { 961 } else {
906 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++]; 962 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++];
907 } 963 }
908 smsframe[PHONE_SMSDeliver.TPPID] = buffer[current++]; 964 smsframe[PHONE_SMSDeliver.TPPID] = buffer[current++];
909 smsframe[PHONE_SMSDeliver.TPDCS] = buffer[current++]; 965 smsframe[PHONE_SMSDeliver.TPDCS] = buffer[current++];
910 for(i=0;i<7;i++) smsframe[PHONE_SMSDeliver.DateTime+i]=buffer[current++]; 966 for(i=0;i<7;i++) smsframe[PHONE_SMSDeliver.DateTime+i]=buffer[current++];
911 smsframe[PHONE_SMSDeliver.TPUDL] = buffer[current++]; 967 smsframe[PHONE_SMSDeliver.TPUDL] = buffer[current++];
912 for(i=0;i<smsframe[PHONE_SMSDeliver.TPUDL];i++) smsframe[i+PHONE_SMSDeliver.Text]=buffer[current++]; 968 for(i=0;i<smsframe[PHONE_SMSDeliver.TPUDL];i++) smsframe[i+PHONE_SMSDeliver.Text]=buffer[current++];
913 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSDeliver); 969 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSDeliver);
914 return ERR_NONE; 970 return ERR_NONE;
915 case 0x01: 971 case 0x01:
916 smprintf(s, "SMS type - submit\n"); 972 smprintf(s, "SMS type - submit\n");
917 sms->PDU = SMS_Submit; 973 sms->PDU = SMS_Submit;
918 if (Priv->SMSMemory == MEM_SM) { 974 if (Priv->SMSMemory == MEM_SM) {
919 sms->Folder = 2; /*OUTBOX SIM*/ 975 sms->Folder = 2; /*OUTBOX SIM*/
920 smprintf(s, "Outbox SIM\n"); 976 smprintf(s, "Outbox SIM\n");
921 } else { 977 } else {
922 sms->Folder = 4; /*OUTBOX ME*/ 978 sms->Folder = 4; /*OUTBOX ME*/
923 } 979 }
924 sms->InboxFolder = false; 980 sms->InboxFolder = false;
925 smsframe[PHONE_SMSSubmit.TPMR] = buffer[current++]; 981 smsframe[PHONE_SMSSubmit.TPMR] = buffer[current++];
926 current2=((buffer[current])+1)/2+1; 982 current2=((buffer[current])+1)/2+1;
927 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_M20SMS)) { 983 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_M20SMS)) {
928 if (buffer[current+1]==NUMBER_ALPHANUMERIC) { 984 if (buffer[current+1]==NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN) {
929 smprintf(s, "Trying to read alphanumeric number\n"); 985 smprintf(s, "Trying to read alphanumeric number\n");
930 for(i=0;i<4;i++) smsframe[PHONE_SMSSubmit.Number+i]=buffer[current++]; 986 for(i=0;i<4;i++) smsframe[PHONE_SMSSubmit.Number+i]=buffer[current++];
931 current+=6; 987 current+=6;
932 for(i=0;i<current2-3;i++) smsframe[PHONE_SMSSubmit.Number+i+4]=buffer[current++]; 988 for(i=0;i<current2-3;i++) smsframe[PHONE_SMSSubmit.Number+i+4]=buffer[current++];
933 } else { 989 } else {
934 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSSubmit.Number+i]=buffer[current++]; 990 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSSubmit.Number+i]=buffer[current++];
935 } 991 }
936 } else { 992 } else {
937 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSSubmit.Number+i]=buffer[current++]; 993 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSSubmit.Number+i]=buffer[current++];
938 } 994 }
939 smsframe[PHONE_SMSSubmit.TPPID] = buffer[current++]; 995 smsframe[PHONE_SMSSubmit.TPPID] = buffer[current++];
940 smsframe[PHONE_SMSSubmit.TPDCS] = buffer[current++]; 996 smsframe[PHONE_SMSSubmit.TPDCS] = buffer[current++];
941 /* See GSM 03.40 9.2.3.3 - TPVP can not exist in frame */ 997 /* See GSM 03.40 9.2.3.3 - TPVP can not exist in frame */
942 if ((smsframe[12] & 0x18)!=0) current++; //TPVP is ignored now 998 if ((smsframe[12] & 0x18)!=0) current++; //TPVP is ignored now
943 smsframe[PHONE_SMSSubmit.TPUDL] = buffer[current++]; 999 smsframe[PHONE_SMSSubmit.TPUDL] = buffer[current++];
944 for(i=0;i<smsframe[PHONE_SMSSubmit.TPUDL];i++) smsframe[i+PHONE_SMSSubmit.Text]=buffer[current++]; 1000 for(i=0;i<smsframe[PHONE_SMSSubmit.TPUDL];i++) smsframe[i+PHONE_SMSSubmit.Text]=buffer[current++];
945 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSSubmit); 1001 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSSubmit);
946 return ERR_NONE; 1002 return ERR_NONE;
947 case 0x02: 1003 case 0x02:
948 smprintf(s, "SMS type - status report\n"); 1004 smprintf(s, "SMS type - status report\n");
949 sms->PDU = SMS_Status_Report; 1005 sms->PDU = SMS_Status_Report;
950 sms->Folder = 1;/*INBOX SIM*/ 1006 sms->Folder = 1;/*INBOX SIM*/
951 sms->InboxFolder = true; 1007 sms->InboxFolder = true;
952 smprintf(s, "TPMR is %02x\n",buffer[current]); 1008 smprintf(s, "TPMR is %d\n",buffer[current]);
953 smsframe[PHONE_SMSStatusReport.TPMR] = buffer[current++]; 1009 smsframe[PHONE_SMSStatusReport.TPMR] = buffer[current++];
954 current2=((buffer[current])+1)/2+1; 1010 current2=((buffer[current])+1)/2+1;
955 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSStatusReport.Number+i]=buffer[current++]; 1011 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSStatusReport.Number+i]=buffer[current++];
956 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.DateTime+i]=buffer[current++]; 1012 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.DateTime+i]=buffer[current++];
957 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.SMSCTime+i]=buffer[current++]; 1013 for(i=0;i<7;i++) smsframe[PHONE_SMSStatusReport.SMSCTime+i]=buffer[current++];
958 smsframe[PHONE_SMSStatusReport.TPStatus]=buffer[current]; 1014 smsframe[PHONE_SMSStatusReport.TPStatus]=buffer[current];
959 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSStatusReport); 1015 GSM_DecodeSMSFrame(sms,smsframe,PHONE_SMSStatusReport);
960 return ERR_NONE; 1016 return ERR_NONE;
961 } 1017 }
962 break; 1018 break;
963 case SMS_AT_TXT: 1019 case SMS_AT_TXT:
964 current = 0; 1020 current = 0;
965 while (msg.Buffer[current]!='"') current++; 1021 while (msg.Buffer[current]!='"') current++;
966 current+=ATGEN_ExtractOneParameter(msg.Buffer+current, buffer); 1022 current+=ATGEN_ExtractOneParameter(msg.Buffer+current, buffer);
967 if (!strcmp(buffer,"\"0\"") || !strcmp(buffer,"\"REC UNREAD\"")) { 1023 if (!strcmp(buffer,"\"0\"") || !strcmp(buffer,"\"REC UNREAD\"")) {
968 smprintf(s, "SMS type - deliver\n"); 1024 smprintf(s, "SMS type - deliver\n");
969 sms->State = SMS_UnRead; 1025 sms->State = SMS_UnRead;
970 sms->PDU = SMS_Deliver; 1026 sms->PDU = SMS_Deliver;
971 if (Priv->SMSMemory == MEM_SM) { 1027 if (Priv->SMSMemory == MEM_SM) {
972 sms->Folder = 1; /*INBOX SIM*/ 1028 sms->Folder = 1; /*INBOX SIM*/
973 } else { 1029 } else {
974 sms->Folder = 3; /*INBOX ME*/ 1030 sms->Folder = 3; /*INBOX ME*/
975 } 1031 }
976 sms->InboxFolder = true; 1032 sms->InboxFolder = true;
977 } else if (!strcmp(buffer,"\"1\"") || !strcmp(buffer,"\"REC READ\"")) { 1033 } else if (!strcmp(buffer,"\"1\"") || !strcmp(buffer,"\"REC READ\"")) {
978 smprintf(s, "SMS type - deliver\n"); 1034 smprintf(s, "SMS type - deliver\n");
979 sms->State = SMS_Read; 1035 sms->State = SMS_Read;
980 sms->PDU = SMS_Deliver; 1036 sms->PDU = SMS_Deliver;
981 if (Priv->SMSMemory == MEM_SM) { 1037 if (Priv->SMSMemory == MEM_SM) {
982 sms->Folder = 1; /*INBOX SIM*/ 1038 sms->Folder = 1; /*INBOX SIM*/
983 } else { 1039 } else {
984 sms->Folder = 3; /*INBOX ME*/ 1040 sms->Folder = 3; /*INBOX ME*/
985 } 1041 }
986 sms->InboxFolder = true; 1042 sms->InboxFolder = true;
987 } else if (!strcmp(buffer,"\"2\"") || !strcmp(buffer,"\"STO UNSENT\"")) { 1043 } else if (!strcmp(buffer,"\"2\"") || !strcmp(buffer,"\"STO UNSENT\"")) {
988 smprintf(s, "SMS type - submit\n"); 1044 smprintf(s, "SMS type - submit\n");
989 sms->State = SMS_UnSent; 1045 sms->State = SMS_UnSent;
990 sms->PDU = SMS_Submit; 1046 sms->PDU = SMS_Submit;
991 if (Priv->SMSMemory == MEM_SM) { 1047 if (Priv->SMSMemory == MEM_SM) {
992 sms->Folder = 2; /*OUTBOX SIM*/ 1048 sms->Folder = 2; /*OUTBOX SIM*/
993 } else { 1049 } else {
994 sms->Folder = 4; /*OUTBOX ME*/ 1050 sms->Folder = 4; /*OUTBOX ME*/
995 } 1051 }
996 sms->InboxFolder = false; 1052 sms->InboxFolder = false;
997 } else if (!strcmp(buffer,"\"3\"") || !strcmp(buffer,"\"STO SENT\"")) { 1053 } else if (!strcmp(buffer,"\"3\"") || !strcmp(buffer,"\"STO SENT\"")) {
998 smprintf(s, "SMS type - submit\n"); 1054 smprintf(s, "SMS type - submit\n");
999 sms->State = SMS_Sent; 1055 sms->State = SMS_Sent;
1000 sms->PDU = SMS_Submit; 1056 sms->PDU = SMS_Submit;
@@ -1595,107 +1651,107 @@ GSM_Error ATGEN_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
1595 } 1651 }
1596 } 1652 }
1597 s->Protocol.Data.AT.EditMode = true; 1653 s->Protocol.Data.AT.EditMode = true;
1598 Replies = s->ReplyNum; 1654 Replies = s->ReplyNum;
1599 s->ReplyNum = 1; 1655 s->ReplyNum = 1;
1600 smprintf(s,"Waiting for modem prompt\n"); 1656 smprintf(s,"Waiting for modem prompt\n");
1601 error=GSM_WaitFor (s, buffer, strlen(buffer), 0x00, 3, ID_SaveSMSMessage); 1657 error=GSM_WaitFor (s, buffer, strlen(buffer), 0x00, 3, ID_SaveSMSMessage);
1602 s->ReplyNum = Replies; 1658 s->ReplyNum = Replies;
1603 if (error == ERR_NONE) { 1659 if (error == ERR_NONE) {
1604 Phone->DispatchError = ERR_TIMEOUT; 1660 Phone->DispatchError = ERR_TIMEOUT;
1605 Phone->RequestID = ID_SaveSMSMessage; 1661 Phone->RequestID = ID_SaveSMSMessage;
1606 smprintf(s, "Saving SMS\n"); 1662 smprintf(s, "Saving SMS\n");
1607 error = s->Protocol.Functions->WriteMessage(s, hexreq, current2, 0x00); 1663 error = s->Protocol.Functions->WriteMessage(s, hexreq, current2, 0x00);
1608 if (error!=ERR_NONE) return error; 1664 if (error!=ERR_NONE) return error;
1609 my_sleep(500); 1665 my_sleep(500);
1610 /* CTRL+Z ends entering */ 1666 /* CTRL+Z ends entering */
1611 error = s->Protocol.Functions->WriteMessage(s, "\x1A", 1, 0x00); 1667 error = s->Protocol.Functions->WriteMessage(s, "\x1A", 1, 0x00);
1612 if (error!=ERR_NONE) return error; 1668 if (error!=ERR_NONE) return error;
1613 error = GSM_WaitForOnce(s, NULL, 0x00, 0x00, 4); 1669 error = GSM_WaitForOnce(s, NULL, 0x00, 0x00, 4);
1614 if (error != ERR_TIMEOUT) return error; 1670 if (error != ERR_TIMEOUT) return error;
1615 } else { 1671 } else {
1616 smprintf(s, "Escaping SMS mode\n"); 1672 smprintf(s, "Escaping SMS mode\n");
1617 error2 = s->Protocol.Functions->WriteMessage(s, "\x1B\r", 2, 0x00); 1673 error2 = s->Protocol.Functions->WriteMessage(s, "\x1B\r", 2, 0x00);
1618 if (error2 != ERR_NONE) return error2; 1674 if (error2 != ERR_NONE) return error2;
1619 return error; 1675 return error;
1620 } 1676 }
1621 } 1677 }
1622 1678
1623 return Phone->DispatchError; 1679 return Phone->DispatchError;
1624} 1680}
1625 1681
1626GSM_Error ATGEN_ReplySendSMS(GSM_Protocol_Message msg, GSM_StateMachine *s) 1682GSM_Error ATGEN_ReplySendSMS(GSM_Protocol_Message msg, GSM_StateMachine *s)
1627{ 1683{
1628 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 1684 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
1629 char *start; 1685 char *start;
1630 1686
1631 if (s->Protocol.Data.AT.EditMode) { 1687 if (s->Protocol.Data.AT.EditMode) {
1632 if (s->Phone.Data.Priv.ATGEN.ReplyState != AT_Reply_SMSEdit) { 1688 if (s->Phone.Data.Priv.ATGEN.ReplyState != AT_Reply_SMSEdit) {
1633 return ERR_UNKNOWN; 1689 return ERR_UNKNOWN;
1634 } 1690 }
1635 s->Protocol.Data.AT.EditMode = false; 1691 s->Protocol.Data.AT.EditMode = false;
1636 return ERR_NONE; 1692 return ERR_NONE;
1637 } 1693 }
1638 1694
1639 switch (Priv->ReplyState) { 1695 switch (Priv->ReplyState) {
1640 case AT_Reply_OK: 1696 case AT_Reply_OK:
1641 smprintf(s, "SMS sent OK\n"); 1697 smprintf(s, "SMS sent OK\n");
1642 if (s->User.SendSMSStatus!=NULL) { 1698 if (s->User.SendSMSStatus!=NULL) {
1643 start = strstr(msg.Buffer, "+CMGW: "); 1699 start = strstr(msg.Buffer, "+CMGS: ");
1644 if (start != NULL) { 1700 if (start != NULL) {
1645 s->User.SendSMSStatus(s->CurrentConfig->Device,0,atoi(start+7)); 1701 s->User.SendSMSStatus(s->CurrentConfig->Device,0,atoi(start+7));
1646 } else { 1702 } else {
1647 s->User.SendSMSStatus(s->CurrentConfig->Device,0,0); 1703 s->User.SendSMSStatus(s->CurrentConfig->Device,0,-1);
1648 } 1704 }
1649 } 1705 }
1650 return ERR_NONE; 1706 return ERR_NONE;
1651 case AT_Reply_CMSError: 1707 case AT_Reply_CMSError:
1652 smprintf(s, "Error %i\n",Priv->ErrorCode); 1708 smprintf(s, "Error %i\n",Priv->ErrorCode);
1653 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,Priv->ErrorCode,0); 1709 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,Priv->ErrorCode,-1);
1654 return ATGEN_HandleCMSError(s); 1710 return ATGEN_HandleCMSError(s);
1655 case AT_Reply_Error: 1711 case AT_Reply_Error:
1656 return ERR_UNKNOWN; 1712 return ERR_UNKNOWN;
1657 default: 1713 default:
1658 return ERR_UNKNOWNRESPONSE; 1714 return ERR_UNKNOWNRESPONSE;
1659 } 1715 }
1660} 1716}
1661 1717
1662GSM_Error ATGEN_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms) 1718GSM_Error ATGEN_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
1663{ 1719{
1664 GSM_Error error,error2; 1720 GSM_Error error,error2;
1665 int current, current2, Replies; 1721 int current, current2, Replies;
1666 unsigned char buffer[1000], hexreq[1000]; 1722 unsigned char buffer[1000], hexreq[1000];
1667 GSM_Phone_Data *Phone = &s->Phone.Data; 1723 GSM_Phone_Data *Phone = &s->Phone.Data;
1668 1724
1669 if (sms->PDU == SMS_Deliver) sms->PDU = SMS_Submit; 1725 if (sms->PDU == SMS_Deliver) sms->PDU = SMS_Submit;
1670 1726
1671 error = ATGEN_MakeSMSFrame(s, sms, hexreq, &current, &current2); 1727 error = ATGEN_MakeSMSFrame(s, sms, hexreq, &current, &current2);
1672 if (error != ERR_NONE) return error; 1728 if (error != ERR_NONE) return error;
1673 1729
1674 switch (Phone->Priv.ATGEN.SMSMode) { 1730 switch (Phone->Priv.ATGEN.SMSMode) {
1675 case SMS_AT_PDU: 1731 case SMS_AT_PDU:
1676 sprintf(buffer, "AT+CMGS=%i\r",current); 1732 sprintf(buffer, "AT+CMGS=%i\r",current);
1677 break; 1733 break;
1678 case SMS_AT_TXT: 1734 case SMS_AT_TXT:
1679 sprintf(buffer, "AT+CMGS=\"%s\"\r",DecodeUnicodeString(sms->Number)); 1735 sprintf(buffer, "AT+CMGS=\"%s\"\r",DecodeUnicodeString(sms->Number));
1680 } 1736 }
1681 1737
1682 s->Protocol.Data.AT.EditMode = true; 1738 s->Protocol.Data.AT.EditMode = true;
1683 Replies = s->ReplyNum; 1739 Replies = s->ReplyNum;
1684 s->ReplyNum = 1; 1740 s->ReplyNum = 1;
1685 smprintf(s,"Waiting for modem prompt\n"); 1741 smprintf(s,"Waiting for modem prompt\n");
1686 error=GSM_WaitFor (s, buffer, strlen(buffer), 0x00, 3, ID_IncomingFrame); 1742 error=GSM_WaitFor (s, buffer, strlen(buffer), 0x00, 3, ID_IncomingFrame);
1687 s->ReplyNum = Replies; 1743 s->ReplyNum = Replies;
1688 if (error == ERR_NONE) { 1744 if (error == ERR_NONE) {
1689 smprintf(s, "Sending SMS\n"); 1745 smprintf(s, "Sending SMS\n");
1690 error = s->Protocol.Functions->WriteMessage(s, hexreq, current2, 0x00); 1746 error = s->Protocol.Functions->WriteMessage(s, hexreq, current2, 0x00);
1691 if (error!=ERR_NONE) return error; 1747 if (error!=ERR_NONE) return error;
1692 my_sleep(500); 1748 my_sleep(500);
1693 /* CTRL+Z ends entering */ 1749 /* CTRL+Z ends entering */
1694 error=s->Protocol.Functions->WriteMessage(s, "\x1A", 1, 0x00); 1750 error=s->Protocol.Functions->WriteMessage(s, "\x1A", 1, 0x00);
1695 my_sleep(100); 1751 my_sleep(100);
1696 return error; 1752 return error;
1697 } else { 1753 } else {
1698 smprintf(s, "Escaping SMS mode\n"); 1754 smprintf(s, "Escaping SMS mode\n");
1699 error2=s->Protocol.Functions->WriteMessage(s, "\x1B\r", 2, 0x00); 1755 error2=s->Protocol.Functions->WriteMessage(s, "\x1B\r", 2, 0x00);
1700 if (error2 != ERR_NONE) return error2; 1756 if (error2 != ERR_NONE) return error2;
1701 } 1757 }
@@ -1742,96 +1798,109 @@ GSM_Error ATGEN_ReplyGetDateTime_Alarm(GSM_Protocol_Message msg, GSM_StateMachin
1742 if (Data->RequestID == ID_GetDateTime) { 1798 if (Data->RequestID == ID_GetDateTime) {
1743 ATGEN_DecodeDateTime(Data->DateTime, msg.Buffer+current); 1799 ATGEN_DecodeDateTime(Data->DateTime, msg.Buffer+current);
1744 } else { 1800 } else {
1745 ATGEN_DecodeDateTime(&(Data->Alarm->DateTime), msg.Buffer+current); 1801 ATGEN_DecodeDateTime(&(Data->Alarm->DateTime), msg.Buffer+current);
1746 } 1802 }
1747 return ERR_NONE; 1803 return ERR_NONE;
1748 } 1804 }
1749 case AT_Reply_Error: 1805 case AT_Reply_Error:
1750 return ERR_NOTSUPPORTED; 1806 return ERR_NOTSUPPORTED;
1751 case AT_Reply_CMSError: 1807 case AT_Reply_CMSError:
1752 return ATGEN_HandleCMSError(s); 1808 return ATGEN_HandleCMSError(s);
1753 default: 1809 default:
1754 break; 1810 break;
1755 } 1811 }
1756 return ERR_UNKNOWNRESPONSE; 1812 return ERR_UNKNOWNRESPONSE;
1757} 1813}
1758 1814
1759GSM_Error ATGEN_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time) 1815GSM_Error ATGEN_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
1760{ 1816{
1761 s->Phone.Data.DateTime=date_time; 1817 s->Phone.Data.DateTime=date_time;
1762 smprintf(s, "Getting date & time\n"); 1818 smprintf(s, "Getting date & time\n");
1763 return GSM_WaitFor (s, "AT+CCLK?\r", 9, 0x00, 4, ID_GetDateTime); 1819 return GSM_WaitFor (s, "AT+CCLK?\r", 9, 0x00, 4, ID_GetDateTime);
1764} 1820}
1765 1821
1766GSM_Error ATGEN_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time) 1822GSM_Error ATGEN_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
1767{ 1823{
1768 char req[128]; 1824 char req[128];
1769 1825
1770 sprintf(req, "AT+CCLK=\"%02i/%02i/%02i,%02i:%02i:%02i+00\"\r", 1826 sprintf(req, "AT+CCLK=\"%02i/%02i/%02i,%02i:%02i:%02i+00\"\r",
1771 date_time->Year-2000,date_time->Month,date_time->Day, 1827 date_time->Year-2000,date_time->Month,date_time->Day,
1772 date_time->Hour,date_time->Minute,date_time->Second); 1828 date_time->Hour,date_time->Minute,date_time->Second);
1773 1829
1774 smprintf(s, "Setting date & time\n"); 1830 smprintf(s, "Setting date & time\n");
1775 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_SetDateTime); 1831 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_SetDateTime);
1776} 1832}
1777 1833
1778GSM_Error ATGEN_GetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm) 1834GSM_Error ATGEN_GetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm)
1779{ 1835{
1780 if (alarm->Location != 1) return ERR_NOTSUPPORTED; 1836 if (alarm->Location != 1) return ERR_NOTSUPPORTED;
1781 1837
1782 alarm->Repeating = true; 1838 alarm->Repeating = true;
1783 alarm->Text[0] = 0; alarm->Text[1] = 0; 1839 alarm->Text[0] = 0; alarm->Text[1] = 0;
1784 1840
1785 s->Phone.Data.Alarm = alarm; 1841 s->Phone.Data.Alarm = alarm;
1786 smprintf(s, "Getting alarm\n"); 1842 smprintf(s, "Getting alarm\n");
1787 return GSM_WaitFor (s, "AT+CALA?\r", 9, 0x00, 4, ID_GetAlarm); 1843 return GSM_WaitFor (s, "AT+CALA?\r", 9, 0x00, 4, ID_GetAlarm);
1788} 1844}
1789 1845
1846/* R320 only takes HH:MM. Do other phones understand full date? */
1847GSM_Error ATGEN_SetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm)
1848{
1849 char req[20];
1850
1851 if (alarm->Location != 1) return ERR_INVALIDLOCATION;
1852
1853 sprintf(req, "AT+CALA=\"%02i:%02i\"\r",alarm->DateTime.Hour,alarm->DateTime.Minute);
1854
1855 smprintf(s, "Setting Alarm\n");
1856 return GSM_WaitFor (s, req, strlen(req), 0x00, 3, ID_SetAlarm);
1857}
1858
1790GSM_Error ATGEN_ReplyGetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s) 1859GSM_Error ATGEN_ReplyGetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s)
1791{ 1860{
1792 GSM_SMSC *SMSC = s->Phone.Data.SMSC; 1861 GSM_SMSC *SMSC = s->Phone.Data.SMSC;
1793 int current; 1862 int current;
1794 int len; 1863 int len;
1795 unsigned char buffer[100]; 1864 unsigned char buffer[100];
1796 1865
1797 switch (s->Phone.Data.Priv.ATGEN.ReplyState) { 1866 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
1798 case AT_Reply_OK: 1867 case AT_Reply_OK:
1799 smprintf(s, "SMSC info received\n"); 1868 smprintf(s, "SMSC info received\n");
1800 1869
1801 current = 0; 1870 current = 0;
1802 while (msg.Buffer[current]!='"') current++; 1871 while (msg.Buffer[current]!='"') current++;
1803 1872
1804 /* SMSC number */ 1873 /* SMSC number */
1805 /* FIXME: support for all formats */ 1874 /* FIXME: support for all formats */
1806 current+=ATGEN_ExtractOneParameter(msg.Buffer+current, buffer); 1875 current+=ATGEN_ExtractOneParameter(msg.Buffer+current, buffer);
1807 /* 1876 /*
1808 * Some phones return this as unicode encoded when they are 1877 * Some phones return this as unicode encoded when they are
1809 * switched to UCS2 mode, so we try to solve this correctly. 1878 * switched to UCS2 mode, so we try to solve this correctly.
1810 */ 1879 */
1811 len = strlen(buffer + 1) - 1; 1880 len = strlen(buffer + 1) - 1;
1812 buffer[len + 1] = 0; 1881 buffer[len + 1] = 0;
1813 if ((len > 20) && (len % 4 == 0) && (strchr(buffer + 1, '+') == NULL)) { 1882 if ((len > 20) && (len % 4 == 0) && (strchr(buffer + 1, '+') == NULL)) {
1814 /* This is probably unicode encoded number */ 1883 /* This is probably unicode encoded number */
1815 DecodeHexUnicode(SMSC->Number,buffer + 1,len); 1884 DecodeHexUnicode(SMSC->Number,buffer + 1,len);
1816 } else { 1885 } else {
1817 EncodeUnicode(SMSC->Number,buffer + 1,len); 1886 EncodeUnicode(SMSC->Number,buffer + 1,len);
1818 } 1887 }
1819 smprintf(s, "Number: \"%s\"\n",DecodeUnicodeString(SMSC->Number)); 1888 smprintf(s, "Number: \"%s\"\n",DecodeUnicodeString(SMSC->Number));
1820 1889
1821 /* Format of SMSC number */ 1890 /* Format of SMSC number */
1822 current+=ATGEN_ExtractOneParameter(msg.Buffer+current, buffer); 1891 current+=ATGEN_ExtractOneParameter(msg.Buffer+current, buffer);
1823 smprintf(s, "Format %s\n",buffer); 1892 smprintf(s, "Format %s\n",buffer);
1824 /* International number */ 1893 /* International number */
1825 if (!strcmp(buffer,"145")) { 1894 if (!strcmp(buffer,"145")) {
1826 sprintf(buffer+1,"%s",DecodeUnicodeString(SMSC->Number)); 1895 sprintf(buffer+1,"%s",DecodeUnicodeString(SMSC->Number));
1827 if (strlen(buffer+1)!=0 && buffer[1] != '+') { 1896 if (strlen(buffer+1)!=0 && buffer[1] != '+') {
1828 /* Sony Ericsson issue */ 1897 /* Sony Ericsson issue */
1829 /* International number is without + */ 1898 /* International number is without + */
1830 buffer[0] = '+'; 1899 buffer[0] = '+';
1831 EncodeUnicode(SMSC->Number,buffer,strlen(buffer)); 1900 EncodeUnicode(SMSC->Number,buffer,strlen(buffer));
1832 } 1901 }
1833 } 1902 }
1834 1903
1835 SMSC->Format = SMS_FORMAT_Text; 1904 SMSC->Format = SMS_FORMAT_Text;
1836 SMSC->Validity.Format = SMS_Validity_RelativeFormat; 1905 SMSC->Validity.Format = SMS_Validity_RelativeFormat;
1837 SMSC->Validity.Relative= SMS_VALID_Max_Time; 1906 SMSC->Validity.Relative= SMS_VALID_Max_Time;
@@ -2157,162 +2226,170 @@ GSM_Error ATGEN_ReplyGetCPBRMemoryStatus(GSM_Protocol_Message msg, GSM_StateMach
2157{ 2226{
2158 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 2227 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
2159 GSM_MemoryStatus*MemoryStatus = s->Phone.Data.MemoryStatus; 2228 GSM_MemoryStatus*MemoryStatus = s->Phone.Data.MemoryStatus;
2160 int line=0; 2229 int line=0;
2161 char *str; 2230 char *str;
2162 int cur; 2231 int cur;
2163 2232
2164 switch (Priv->ReplyState) { 2233 switch (Priv->ReplyState) {
2165 case AT_Reply_OK: 2234 case AT_Reply_OK:
2166 smprintf(s, "Memory entries received\n"); 2235 smprintf(s, "Memory entries received\n");
2167 /* Walk through lines with +CPBR: */ 2236 /* Walk through lines with +CPBR: */
2168 while (Priv->Lines.numbers[line*2+1]!=0) { 2237 while (Priv->Lines.numbers[line*2+1]!=0) {
2169 str = GetLineString(msg.Buffer,Priv->Lines,line+1); 2238 str = GetLineString(msg.Buffer,Priv->Lines,line+1);
2170 if (strncmp(str, "+CPBR: ", 7) == 0) { 2239 if (strncmp(str, "+CPBR: ", 7) == 0) {
2171 MemoryStatus->MemoryUsed++; 2240 MemoryStatus->MemoryUsed++;
2172 if (sscanf(str, "+CPBR: %d,", &cur) == 1) { 2241 if (sscanf(str, "+CPBR: %d,", &cur) == 1) {
2173 cur -= Priv->FirstMemoryEntry - 1; 2242 cur -= Priv->FirstMemoryEntry - 1;
2174 if (cur == Priv->NextMemoryEntry || Priv->NextMemoryEntry == 0) 2243 if (cur == Priv->NextMemoryEntry || Priv->NextMemoryEntry == 0)
2175 Priv->NextMemoryEntry = cur + 1; 2244 Priv->NextMemoryEntry = cur + 1;
2176 } 2245 }
2177 } 2246 }
2178 line++; 2247 line++;
2179 } 2248 }
2180 return ERR_NONE; 2249 return ERR_NONE;
2181 case AT_Reply_Error: 2250 case AT_Reply_Error:
2182 return ERR_UNKNOWN; 2251 return ERR_UNKNOWN;
2183 case AT_Reply_CMSError: 2252 case AT_Reply_CMSError:
2184 return ATGEN_HandleCMSError(s); 2253 return ATGEN_HandleCMSError(s);
2185 default: 2254 default:
2186 return ERR_UNKNOWNRESPONSE; 2255 return ERR_UNKNOWNRESPONSE;
2187 } 2256 }
2188} 2257}
2189 2258
2190GSM_Error ATGEN_GetMemoryInfo(GSM_StateMachine *s, GSM_MemoryStatus *Status, GSM_AT_NeededMemoryInfo NeededInfo) 2259GSM_Error ATGEN_GetMemoryInfo(GSM_StateMachine *s, GSM_MemoryStatus *Status, GSM_AT_NeededMemoryInfo NeededInfo)
2191{ 2260{
2192 GSM_Error error; 2261 GSM_Error error;
2193 char req[20]; 2262 char req[20];
2194 int start; 2263 int start;
2195 int end; 2264 int end;
2196 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 2265 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
2197 2266
2198 smprintf(s, "Getting memory information\n"); 2267 smprintf(s, "Getting memory information\n");
2199 2268
2200 Priv->MemorySize = 0; 2269 Priv->MemorySize = 0;
2201 Priv->TextLength = 0; 2270 Priv->TextLength = 0;
2202 Priv->NumberLength = 0; 2271 Priv->NumberLength = 0;
2203 2272
2204 error = GSM_WaitFor (s, "AT+CPBR=?\r", 10, 0x00, 4, ID_GetMemoryStatus); 2273 error = GSM_WaitFor (s, "AT+CPBR=?\r", 10, 0x00, 4, ID_GetMemoryStatus);
2274 if (Priv->Manufacturer == AT_Samsung)
2275 error = GSM_WaitFor (s, "", 0, 0x00, 4, ID_GetMemoryStatus);
2205 if (error != ERR_NONE) return error; 2276 if (error != ERR_NONE) return error;
2206 if (NeededInfo == AT_Total || NeededInfo == AT_Sizes || NeededInfo == AT_First) return ERR_NONE; 2277 if (NeededInfo == AT_Total || NeededInfo == AT_Sizes || NeededInfo == AT_First) return ERR_NONE;
2207 2278
2208 smprintf(s, "Getting memory status by reading values\n"); 2279 smprintf(s, "Getting memory status by reading values\n");
2209 2280
2210 s->Phone.Data.MemoryStatus= Status; 2281 s->Phone.Data.MemoryStatus= Status;
2211 Status->MemoryUsed = 0; 2282 Status->MemoryUsed = 0;
2212 Status->MemoryFree = 0; 2283 Status->MemoryFree = 0;
2213 start = Priv->FirstMemoryEntry; 2284 start = Priv->FirstMemoryEntry;
2214 Priv->NextMemoryEntry = 0; 2285 Priv->NextMemoryEntry = 0;
2215 while (1) { 2286 while (1) {
2216 end= start + 20; 2287 end= start + 20;
2217 if (end > Priv->MemorySize) end = Priv->MemorySize; 2288 if (end > Priv->MemorySize) end = Priv->MemorySize;
2218 sprintf(req, "AT+CPBR=%i,%i\r", start, end); 2289 sprintf(req, "AT+CPBR=%i,%i\r", start, end);
2219 error= GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetMemoryStatus); 2290 error= GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetMemoryStatus);
2220 if (error != ERR_NONE) return error; 2291 if (error != ERR_NONE) return error;
2221 if (NeededInfo == AT_NextEmpty && Priv->NextMemoryEntry != 0 && Priv->NextMemoryEntry != end + 1) return ERR_NONE; 2292 if (NeededInfo == AT_NextEmpty && Priv->NextMemoryEntry != 0 && Priv->NextMemoryEntry != end + 1) return ERR_NONE;
2222 if (end == Priv->MemorySize) { 2293 if (end == Priv->MemorySize) {
2223 Status->MemoryFree = Priv->MemorySize - Status->MemoryUsed; 2294 Status->MemoryFree = Priv->MemorySize - Status->MemoryUsed;
2224 return ERR_NONE; 2295 return ERR_NONE;
2225 } 2296 }
2226 start = end + 1; 2297 start = end + 1;
2227 } 2298 }
2228} 2299}
2229 2300
2230GSM_Error ATGEN_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status) 2301GSM_Error ATGEN_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
2231{ 2302{
2232 GSM_Error error; 2303 GSM_Error error;
2233 2304
2234 error = ATGEN_SetPBKMemory(s, Status->MemoryType); 2305 error = ATGEN_SetPBKMemory(s, Status->MemoryType);
2235 if (error != ERR_NONE) return error; 2306 if (error != ERR_NONE) return error;
2236 2307
2237 s->Phone.Data.MemoryStatus=Status; 2308 s->Phone.Data.MemoryStatus=Status;
2238 2309
2239 /* in some phones doesn't work or doesn't return memory status inside */ 2310 /* in some phones doesn't work or doesn't return memory status inside */
2240 /* Some workaround for buggy mobile, that hangs after "AT+CPBS?" for other 2311 /* Some workaround for buggy mobile, that hangs after "AT+CPBS?" for other
2241 * memory than SM. 2312 * memory than SM.
2242 */ 2313 */
2243 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_BROKENCPBS) || (Status->MemoryType == MEM_SM)) { 2314 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_BROKENCPBS) || (Status->MemoryType == MEM_SM)) {
2244 smprintf(s, "Getting memory status\n"); 2315 smprintf(s, "Getting memory status\n");
2245 error=GSM_WaitFor (s, "AT+CPBS?\r", 9, 0x00, 4, ID_GetMemoryStatus); 2316 error=GSM_WaitFor (s, "AT+CPBS?\r", 9, 0x00, 4, ID_GetMemoryStatus);
2246 if (error == ERR_NONE) return ERR_NONE; 2317 if (error == ERR_NONE) return ERR_NONE;
2247 } 2318 }
2248 2319
2249 return ATGEN_GetMemoryInfo(s, Status, AT_Status); 2320 return ATGEN_GetMemoryInfo(s, Status, AT_Status);
2250} 2321}
2251 2322
2252GSM_Error ATGEN_SetPBKCharset(GSM_StateMachine *s, bool PreferUnicode) 2323GSM_Error ATGEN_SetPBKCharset(GSM_StateMachine *s, bool PreferUnicode)
2253{ 2324{
2254 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 2325 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
2255 GSM_Error error; 2326 GSM_Error error;
2256 2327
2257 /* Have we already selected something? */ 2328 /* Have we already selected something? */
2258 if (Priv->PBKCharset!=0) { 2329 if (Priv->PBKCharset!=0) {
2259 /* If we want unicode charset and we have it already or setting of it 2330 /* If we want unicode charset and we have it already or setting of it
2260 * failed, we have nothing to do. */ 2331 * failed, we have nothing to do. */
2261 if (PreferUnicode && (Priv->PBKCharset==AT_PBK_UCS2 || Priv->UCS2CharsetFailed)) return ERR_NONE; 2332 if (PreferUnicode && (Priv->PBKCharset==AT_PBK_UCS2 || Priv->UCS2CharsetFailed)) return ERR_NONE;
2262 2333
2263 /* If we don't need unicode charset and we have some (or have unicode 2334 /* If we don't need unicode charset and we have some (or have unicode
2264 * charset when other failed), we have nothing to do. */ 2335 * charset when other failed), we have nothing to do. */
2265 if (!PreferUnicode && (Priv->PBKCharset!=AT_PBK_UCS2 || Priv->NonUCS2CharsetFailed)) return ERR_NONE; 2336 if (!PreferUnicode && (Priv->PBKCharset!=AT_PBK_UCS2 || Priv->NonUCS2CharsetFailed)) return ERR_NONE;
2266 } 2337 }
2267 2338
2268 error=ATGEN_GetManufacturer(s); 2339 error=ATGEN_GetManufacturer(s);
2269 if (error != ERR_NONE) return error; 2340 if (error != ERR_NONE) return error;
2270 2341
2342 /* Samsung (and Sagem?) phones use only PCCP437? */
2343 if (Priv->Manufacturer == AT_Samsung) {
2344 Priv->PBKCharset = AT_PBK_PCCP437;
2345 return ERR_NONE;
2346 }
2347
2271 if (PreferUnicode && !Priv->UCS2CharsetFailed) { 2348 if (PreferUnicode && !Priv->UCS2CharsetFailed) {
2272 smprintf(s, "Setting charset to UCS2\n"); 2349 smprintf(s, "Setting charset to UCS2\n");
2273 error=GSM_WaitFor (s, "AT+CSCS=\"UCS2\"\r", 15, 0x00, 3, ID_SetMemoryCharset); 2350 error=GSM_WaitFor (s, "AT+CSCS=\"UCS2\"\r", 15, 0x00, 3, ID_SetMemoryCharset);
2274 if (error == ERR_NONE) { 2351 if (error == ERR_NONE) {
2275 Priv->PBKCharset = AT_PBK_UCS2; 2352 Priv->PBKCharset = AT_PBK_UCS2;
2276 return ERR_NONE; 2353 return ERR_NONE;
2277 } else { 2354 } else {
2278 Priv->UCS2CharsetFailed = true; 2355 Priv->UCS2CharsetFailed = true;
2279 } 2356 }
2280 } 2357 }
2281 2358
2282 smprintf(s, "Setting charset to HEX\n"); 2359 smprintf(s, "Setting charset to HEX\n");
2283 error=GSM_WaitFor (s, "AT+CSCS=\"HEX\"\r", 14, 0x00, 3, ID_SetMemoryCharset); 2360 error=GSM_WaitFor (s, "AT+CSCS=\"HEX\"\r", 14, 0x00, 3, ID_SetMemoryCharset);
2284 /* Falcom replies OK for HEX mode and send everything 2361 /* Falcom replies OK for HEX mode and send everything
2285 * in normal format */ 2362 * in normal format */
2286 if (error == ERR_NONE && Priv->Manufacturer != AT_Falcom) { 2363 if (error == ERR_NONE && Priv->Manufacturer != AT_Falcom) {
2287 Priv->PBKCharset = AT_PBK_HEX; 2364 Priv->PBKCharset = AT_PBK_HEX;
2288 return ERR_NONE; 2365 return ERR_NONE;
2289 } 2366 }
2290 2367
2291 smprintf(s, "Setting charset to GSM\n"); 2368 smprintf(s, "Setting charset to GSM\n");
2292 error=GSM_WaitFor (s, "AT+CSCS=\"GSM\"\r", 14, 0x00, 3, ID_SetMemoryCharset); 2369 error=GSM_WaitFor (s, "AT+CSCS=\"GSM\"\r", 14, 0x00, 3, ID_SetMemoryCharset);
2293 if (error == ERR_NONE) { 2370 if (error == ERR_NONE) {
2294 Priv->PBKCharset = AT_PBK_GSM; 2371 Priv->PBKCharset = AT_PBK_GSM;
2295 return ERR_NONE; 2372 return ERR_NONE;
2296 } 2373 }
2297 2374
2298 if (!Priv->UCS2CharsetFailed) { 2375 if (!Priv->UCS2CharsetFailed) {
2299 Priv->NonUCS2CharsetFailed = true; 2376 Priv->NonUCS2CharsetFailed = true;
2300 smprintf(s, "Setting charset to UCS2\n"); 2377 smprintf(s, "Setting charset to UCS2\n");
2301 error=GSM_WaitFor (s, "AT+CSCS=\"UCS2\"\r", 15, 0x00, 3, ID_SetMemoryCharset); 2378 error=GSM_WaitFor (s, "AT+CSCS=\"UCS2\"\r", 15, 0x00, 3, ID_SetMemoryCharset);
2302 if (error == ERR_NONE) { 2379 if (error == ERR_NONE) {
2303 Priv->PBKCharset = AT_PBK_UCS2; 2380 Priv->PBKCharset = AT_PBK_UCS2;
2304 return ERR_NONE; 2381 return ERR_NONE;
2305 } else { 2382 } else {
2306 Priv->UCS2CharsetFailed = true; 2383 Priv->UCS2CharsetFailed = true;
2307 } 2384 }
2308 } 2385 }
2309 2386
2310 return error; 2387 return error;
2311} 2388}
2312 2389
2313GSM_Error ATGEN_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s) 2390GSM_Error ATGEN_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s)
2314{ 2391{
2315 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 2392 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
2316 GSM_MemoryEntry *Memory = s->Phone.Data.Memory; 2393 GSM_MemoryEntry *Memory = s->Phone.Data.Memory;
2317 char *pos; 2394 char *pos;
2318 unsigned char buffer[500],buffer2[500]; 2395 unsigned char buffer[500],buffer2[500];
@@ -2340,97 +2417,127 @@ GSM_Error ATGEN_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s)
2340 Memory->EntriesNum++; 2417 Memory->EntriesNum++;
2341 Memory->Entries[0].EntryType = PBK_Number_General; 2418 Memory->Entries[0].EntryType = PBK_Number_General;
2342 Memory->Entries[0].VoiceTag = 0; 2419 Memory->Entries[0].VoiceTag = 0;
2343 Memory->Entries[0].SMSList[0] = 0; 2420 Memory->Entries[0].SMSList[0] = 0;
2344 2421
2345 len = strlen(buffer + 1) - 1; 2422 len = strlen(buffer + 1) - 1;
2346 if (Priv->PBKCharset == AT_PBK_HEX && (len > 10) && (len % 2 == 0) && (strchr(buffer + 1, '+') == NULL)) { 2423 if (Priv->PBKCharset == AT_PBK_HEX && (len > 10) && (len % 2 == 0) && (strchr(buffer + 1, '+') == NULL)) {
2347 /* This is probably hex encoded number */ 2424 /* This is probably hex encoded number */
2348 DecodeHexBin(buffer2, buffer+1, len); 2425 DecodeHexBin(buffer2, buffer+1, len);
2349 DecodeDefault(Memory->Entries[0].Text ,buffer2, strlen(buffer2), false, NULL); 2426 DecodeDefault(Memory->Entries[0].Text ,buffer2, strlen(buffer2), false, NULL);
2350 } else if (Priv->PBKCharset == AT_PBK_UCS2 && (len > 20) && (len % 4 == 0) && (strchr(buffer + 1, '+') == NULL)) { 2427 } else if (Priv->PBKCharset == AT_PBK_UCS2 && (len > 20) && (len % 4 == 0) && (strchr(buffer + 1, '+') == NULL)) {
2351 /* This is probably unicode encoded number */ 2428 /* This is probably unicode encoded number */
2352 DecodeHexUnicode(Memory->Entries[0].Text, buffer + 1,len); 2429 DecodeHexUnicode(Memory->Entries[0].Text, buffer + 1,len);
2353 } else { 2430 } else {
2354 EncodeUnicode(Memory->Entries[0].Text, buffer + 1, len); 2431 EncodeUnicode(Memory->Entries[0].Text, buffer + 1, len);
2355 } 2432 }
2356 2433
2357 /* Number format */ 2434 /* Number format */
2358 pos += ATGEN_ExtractOneParameter(pos, buffer); 2435 pos += ATGEN_ExtractOneParameter(pos, buffer);
2359 smprintf(s, "Number format: %s\n",buffer); 2436 smprintf(s, "Number format: %s\n",buffer);
2360 2437
2361 /* International number */ 2438 /* International number */
2362 if (!strcmp(buffer,"145")) { 2439 if (!strcmp(buffer,"145")) {
2363 sprintf(buffer+1,"%s",DecodeUnicodeString(Memory->Entries[0].Text)); 2440 sprintf(buffer+1,"%s",DecodeUnicodeString(Memory->Entries[0].Text));
2364 if (strlen(buffer+1)!=0 && buffer[1] != '+') { 2441 if (strlen(buffer+1)!=0 && buffer[1] != '+') {
2365 /* Sony Ericsson issue */ 2442 /* Sony Ericsson issue */
2366 /* International number is without + */ 2443 /* International number is without + */
2367 buffer[0] = '+'; 2444 buffer[0] = '+';
2368 EncodeUnicode(Memory->Entries[0].Text,buffer,strlen(buffer)); 2445 EncodeUnicode(Memory->Entries[0].Text,buffer,strlen(buffer));
2369 } 2446 }
2370 } 2447 }
2371 2448
2372 /* Name */ 2449 /* Name */
2373 pos += ATGEN_ExtractOneParameter(pos, buffer); 2450 pos += ATGEN_ExtractOneParameter(pos, buffer);
2374 smprintf(s, "Name text: %s\n",buffer); 2451 smprintf(s, "Name text: %s\n",buffer);
2375 Memory->EntriesNum++; 2452 Memory->EntriesNum++;
2376 Memory->Entries[1].EntryType=PBK_Text_Name; 2453 Memory->Entries[1].EntryType=PBK_Text_Name;
2377 switch (Priv->PBKCharset) { 2454 switch (Priv->PBKCharset) {
2378 case AT_PBK_HEX: 2455 case AT_PBK_HEX:
2379 DecodeHexBin(buffer2,buffer+1,strlen(buffer)-2); 2456 DecodeHexBin(buffer2,buffer+1,strlen(buffer)-2);
2380 DecodeDefault(Memory->Entries[1].Text,buffer2,strlen(buffer2),false,NULL); 2457 DecodeDefault(Memory->Entries[1].Text,buffer2,strlen(buffer2),false,NULL);
2381 break; 2458 break;
2382 case AT_PBK_GSM: 2459 case AT_PBK_GSM:
2383 DecodeDefault(Memory->Entries[1].Text,buffer+1,strlen(buffer)-2,false,NULL); 2460 DecodeDefault(Memory->Entries[1].Text,buffer+1,strlen(buffer)-2,false,NULL);
2384 break; 2461 break;
2385 case AT_PBK_UCS2: 2462 case AT_PBK_UCS2:
2386 DecodeHexUnicode(Memory->Entries[1].Text,buffer+1,strlen(buffer+1) - 1); 2463 DecodeHexUnicode(Memory->Entries[1].Text,buffer+1,strlen(buffer+1) - 1);
2387 break; 2464 break;
2465 case AT_PBK_PCCP437:
2466 /* FIXME: correctly decode PCCP437 */
2467 DecodeDefault(Memory->Entries[1].Text,buffer+1,strlen(buffer)-2,false,NULL);
2468 break;
2469 }
2470
2471 /* Samsung number type */
2472 if (Priv->Manufacturer == AT_Samsung) {
2473 int type;
2474
2475 pos += ATGEN_ExtractOneParameter(pos, buffer);
2476 smprintf(s, "Number type: %s\n",buffer);
2477 type = strtoul(buffer, NULL, 0);
2478 switch (type) {
2479 case 0:
2480 Memory->Entries[0].EntryType = PBK_Number_Mobile;
2481 break;
2482 case 1:
2483 Memory->Entries[0].EntryType = PBK_Number_Work;
2484 break;
2485 case 2:
2486 Memory->Entries[0].EntryType = PBK_Number_Home;
2487 break;
2488 case 3:
2489 Memory->Entries[0].EntryType = PBK_Text_Email;
2490 break;
2491 default:
2492 Memory->Entries[0].EntryType = PBK_Number_General;
2493 }
2388 } 2494 }
2495
2389 return ERR_NONE; 2496 return ERR_NONE;
2390 case AT_Reply_CMEError: 2497 case AT_Reply_CMEError:
2391 return ATGEN_HandleCMEError(s); 2498 return ATGEN_HandleCMEError(s);
2392 case AT_Reply_Error: 2499 case AT_Reply_Error:
2393 smprintf(s, "Error - too high location ?\n"); 2500 smprintf(s, "Error - too high location ?\n");
2394 return ERR_INVALIDLOCATION; 2501 return ERR_INVALIDLOCATION;
2395 case AT_Reply_CMSError: 2502 case AT_Reply_CMSError:
2396 return ATGEN_HandleCMSError(s); 2503 return ATGEN_HandleCMSError(s);
2397 default: 2504 default:
2398 break; 2505 break;
2399 } 2506 }
2400 return ERR_UNKNOWNRESPONSE; 2507 return ERR_UNKNOWNRESPONSE;
2401} 2508}
2402 2509
2403GSM_Error ATGEN_PrivGetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry, int endlocation) 2510GSM_Error ATGEN_PrivGetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry, int endlocation)
2404{ 2511{
2405 GSM_Error error; 2512 GSM_Error error;
2406 unsigned char req[20]; 2513 unsigned char req[20];
2407 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 2514 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
2408 2515
2409 if (entry->Location==0x00) return ERR_INVALIDLOCATION; 2516 if (entry->Location==0x00) return ERR_INVALIDLOCATION;
2410 2517
2411 if (entry->MemoryType == MEM_ME) { 2518 if (entry->MemoryType == MEM_ME) {
2412 if (Priv->PBKSBNR == 0) { 2519 if (Priv->PBKSBNR == 0) {
2413 sprintf(req, "AT^SBNR=?\r"); 2520 sprintf(req, "AT^SBNR=?\r");
2414 smprintf(s, "Checking availablity of SBNR\n"); 2521 smprintf(s, "Checking availablity of SBNR\n");
2415 error=GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetMemory); 2522 error=GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetMemory);
2416 switch (error) { 2523 switch (error) {
2417 case ERR_NONE: 2524 case ERR_NONE:
2418 Priv->PBKSBNR = AT_SBNR_AVAILABLE; 2525 Priv->PBKSBNR = AT_SBNR_AVAILABLE;
2419 break; 2526 break;
2420 case ERR_UNKNOWN: 2527 case ERR_UNKNOWN:
2421 case ERR_NOTSUPPORTED: 2528 case ERR_NOTSUPPORTED:
2422 Priv->PBKSBNR = AT_SBNR_NOTAVAILABLE; 2529 Priv->PBKSBNR = AT_SBNR_NOTAVAILABLE;
2423 break; 2530 break;
2424 default: 2531 default:
2425 return error; 2532 return error;
2426 } 2533 }
2427 } 2534 }
2428 if (Priv->PBKSBNR == AT_SBNR_AVAILABLE) { 2535 if (Priv->PBKSBNR == AT_SBNR_AVAILABLE) {
2429 sprintf(req, "AT^SBNR=vcf,%i\r",entry->Location-1); 2536 sprintf(req, "AT^SBNR=vcf,%i\r",entry->Location-1);
2430 s->Phone.Data.Memory=entry; 2537 s->Phone.Data.Memory=entry;
2431 smprintf(s, "Getting phonebook entry\n"); 2538 smprintf(s, "Getting phonebook entry\n");
2432 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetMemory); 2539 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetMemory);
2433 } 2540 }
2434 } 2541 }
2435 2542
2436 error=ATGEN_GetManufacturer(s); 2543 error=ATGEN_GetManufacturer(s);
@@ -2517,96 +2624,98 @@ GSM_Error ATGEN_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType type)
2517 error = GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_SetMemory); 2624 error = GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_SetMemory);
2518 if (error != ERR_NONE) return error; 2625 if (error != ERR_NONE) return error;
2519 } 2626 }
2520 return ERR_NONE; 2627 return ERR_NONE;
2521} 2628}
2522 2629
2523GSM_Error ATGEN_ReplyDialVoice(GSM_Protocol_Message msg, GSM_StateMachine *s) 2630GSM_Error ATGEN_ReplyDialVoice(GSM_Protocol_Message msg, GSM_StateMachine *s)
2524{ 2631{
2525 switch (s->Phone.Data.Priv.ATGEN.ReplyState) { 2632 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
2526 case AT_Reply_OK: 2633 case AT_Reply_OK:
2527 smprintf(s, "Dial voice OK\n"); 2634 smprintf(s, "Dial voice OK\n");
2528 return ERR_NONE; 2635 return ERR_NONE;
2529 case AT_Reply_Error: 2636 case AT_Reply_Error:
2530 smprintf(s, "Dial voice error\n"); 2637 smprintf(s, "Dial voice error\n");
2531 return ERR_UNKNOWN; 2638 return ERR_UNKNOWN;
2532 case AT_Reply_CMSError: 2639 case AT_Reply_CMSError:
2533 return ATGEN_HandleCMSError(s); 2640 return ATGEN_HandleCMSError(s);
2534 default: 2641 default:
2535 break; 2642 break;
2536 } 2643 }
2537 return ERR_UNKNOWNRESPONSE; 2644 return ERR_UNKNOWNRESPONSE;
2538} 2645}
2539 2646
2540GSM_Error ATGEN_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber) 2647GSM_Error ATGEN_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
2541{ 2648{
2542 char req[39] = "ATDT"; 2649 char req[39] = "ATDT";
2543 2650
2544 if (ShowNumber != GSM_CALL_DefaultNumberPresence) return ERR_NOTSUPPORTED; 2651 if (ShowNumber != GSM_CALL_DefaultNumberPresence) return ERR_NOTSUPPORTED;
2545 if (strlen(number) > 32) return (ERR_UNKNOWN); 2652 if (strlen(number) > 32) return (ERR_UNKNOWN);
2546 2653
2547 strcat(req, number); 2654 strcat(req, number);
2548 strcat(req, ";\r"); 2655 strcat(req, ";\r");
2549 2656
2550 smprintf(s, "Making voice call\n"); 2657 smprintf(s, "Making voice call\n");
2551 return GSM_WaitFor (s, req, 4+2+strlen(number), 0x00, 5, ID_DialVoice); 2658 return GSM_WaitFor (s, req, 4+2+strlen(number), 0x00, 5, ID_DialVoice);
2552} 2659}
2553 2660
2554GSM_Error ATGEN_ReplyEnterSecurityCode(GSM_Protocol_Message msg, GSM_StateMachine *s) 2661GSM_Error ATGEN_ReplyEnterSecurityCode(GSM_Protocol_Message msg, GSM_StateMachine *s)
2555{ 2662{
2556 switch (s->Phone.Data.Priv.ATGEN.ReplyState) { 2663 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
2557 case AT_Reply_OK: 2664 case AT_Reply_OK:
2558 smprintf(s, "Security code was OK\n"); 2665 smprintf(s, "Security code was OK\n");
2559 return ERR_NONE; 2666 return ERR_NONE;
2560 case AT_Reply_Error: 2667 case AT_Reply_Error:
2561 smprintf(s, "Incorrect security code\n"); 2668 smprintf(s, "Incorrect security code\n");
2562 return ERR_SECURITYERROR; 2669 return ERR_SECURITYERROR;
2563 case AT_Reply_CMSError: 2670 case AT_Reply_CMSError:
2564 return ATGEN_HandleCMSError(s); 2671 return ATGEN_HandleCMSError(s);
2672 case AT_Reply_CMEError:
2673 return ATGEN_HandleCMEError(s);
2565 default: 2674 default:
2566 break; 2675 break;
2567 } 2676 }
2568 return ERR_UNKNOWNRESPONSE; 2677 return ERR_UNKNOWNRESPONSE;
2569} 2678}
2570 2679
2571GSM_Error ATGEN_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode Code) 2680GSM_Error ATGEN_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode Code)
2572{ 2681{
2573 unsigned char req[50]; 2682 unsigned char req[50];
2574 2683
2575 switch (Code.Type) { 2684 switch (Code.Type) {
2576 case SEC_Pin : 2685 case SEC_Pin :
2577 sprintf(req, "AT+CPIN=\"%s\"\r" , Code.Code); 2686 sprintf(req, "AT+CPIN=\"%s\"\r" , Code.Code);
2578 break; 2687 break;
2579 case SEC_Pin2 : 2688 case SEC_Pin2 :
2580 if (s->Phone.Data.Priv.ATGEN.Manufacturer == AT_Siemens) { 2689 if (s->Phone.Data.Priv.ATGEN.Manufacturer == AT_Siemens) {
2581 sprintf(req, "AT+CPIN2=\"%s\"\r", Code.Code); 2690 sprintf(req, "AT+CPIN2=\"%s\"\r", Code.Code);
2582 } else { 2691 } else {
2583 sprintf(req, "AT+CPIN=\"%s\"\r" , Code.Code); 2692 sprintf(req, "AT+CPIN=\"%s\"\r" , Code.Code);
2584 } 2693 }
2585 break; 2694 break;
2586 default : return ERR_NOTIMPLEMENTED; 2695 default : return ERR_NOTIMPLEMENTED;
2587 } 2696 }
2588 2697
2589 smprintf(s, "Entering security code\n"); 2698 smprintf(s, "Entering security code\n");
2590 return GSM_WaitFor (s, req, strlen(req), 0x00, 6, ID_EnterSecurityCode); 2699 return GSM_WaitFor (s, req, strlen(req), 0x00, 6, ID_EnterSecurityCode);
2591} 2700}
2592 2701
2593GSM_Error ATGEN_ReplyGetSecurityStatus(GSM_Protocol_Message msg, GSM_StateMachine *s) 2702GSM_Error ATGEN_ReplyGetSecurityStatus(GSM_Protocol_Message msg, GSM_StateMachine *s)
2594{ 2703{
2595 GSM_SecurityCodeType *Status = s->Phone.Data.SecurityStatus; 2704 GSM_SecurityCodeType *Status = s->Phone.Data.SecurityStatus;
2596 2705
2597 smprintf(s, "Security status received - "); 2706 smprintf(s, "Security status received - ");
2598 if (strstr(msg.Buffer,"READY")) { 2707 if (strstr(msg.Buffer,"READY")) {
2599 *Status = SEC_None; 2708 *Status = SEC_None;
2600 smprintf(s, "nothing to enter\n"); 2709 smprintf(s, "nothing to enter\n");
2601 return ERR_NONE; 2710 return ERR_NONE;
2602 } 2711 }
2603 if (strstr(msg.Buffer,"PH_SIM PIN")) { 2712 if (strstr(msg.Buffer,"PH_SIM PIN")) {
2604 smprintf(s, "no SIM inside or other error\n"); 2713 smprintf(s, "no SIM inside or other error\n");
2605 return ERR_UNKNOWN; 2714 return ERR_UNKNOWN;
2606 } 2715 }
2607 if (strstr(msg.Buffer,"SIM PIN2")) { 2716 if (strstr(msg.Buffer,"SIM PIN2")) {
2608 *Status = SEC_Pin2; 2717 *Status = SEC_Pin2;
2609 smprintf(s, "waiting for PIN2\n"); 2718 smprintf(s, "waiting for PIN2\n");
2610 return ERR_NONE; 2719 return ERR_NONE;
2611 } 2720 }
2612 if (strstr(msg.Buffer,"SIM PUK2")) { 2721 if (strstr(msg.Buffer,"SIM PUK2")) {
@@ -2879,96 +2988,102 @@ GSM_Error ATGEN_PrivSetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
2879 if (entry->Location == 0) return ERR_INVALIDLOCATION; 2988 if (entry->Location == 0) return ERR_INVALIDLOCATION;
2880 2989
2881 error = ATGEN_SetPBKMemory(s, entry->MemoryType); 2990 error = ATGEN_SetPBKMemory(s, entry->MemoryType);
2882 if (error != ERR_NONE) return error; 2991 if (error != ERR_NONE) return error;
2883 2992
2884 GSM_PhonebookFindDefaultNameNumberGroup(entry, &Name, &Number, &Group); 2993 GSM_PhonebookFindDefaultNameNumberGroup(entry, &Name, &Number, &Group);
2885 2994
2886 name[0] = 0; 2995 name[0] = 0;
2887 if (Name != -1) { 2996 if (Name != -1) {
2888 len = UnicodeLength(entry->Entries[Name].Text); 2997 len = UnicodeLength(entry->Entries[Name].Text);
2889 2998
2890 /* Compare if we would loose some information when not using 2999 /* Compare if we would loose some information when not using
2891 * unicode */ 3000 * unicode */
2892 EncodeDefault(name, entry->Entries[Name].Text, &len, true, NULL); 3001 EncodeDefault(name, entry->Entries[Name].Text, &len, true, NULL);
2893 DecodeDefault(uname, name, len, true, NULL); 3002 DecodeDefault(uname, name, len, true, NULL);
2894 if (!mywstrncmp(uname, entry->Entries[Name].Text, len)) { 3003 if (!mywstrncmp(uname, entry->Entries[Name].Text, len)) {
2895 /* Get maximal text length */ 3004 /* Get maximal text length */
2896 if (Priv->TextLength == 0) { 3005 if (Priv->TextLength == 0) {
2897 ATGEN_GetMemoryInfo(s, NULL, AT_Sizes); 3006 ATGEN_GetMemoryInfo(s, NULL, AT_Sizes);
2898 } 3007 }
2899 3008
2900 /* I char stored in GSM alphabet takes 7 bits, one 3009 /* I char stored in GSM alphabet takes 7 bits, one
2901 * unicode 16, if storing in unicode would truncate 3010 * unicode 16, if storing in unicode would truncate
2902 * text, do not use it, otherwise we will use it */ 3011 * text, do not use it, otherwise we will use it */
2903 if ((Priv->TextLength != 0) && ((Priv->TextLength * 7 / 16) <= len)) { 3012 if ((Priv->TextLength != 0) && ((Priv->TextLength * 7 / 16) <= len)) {
2904 PreferUnicode = false; 3013 PreferUnicode = false;
2905 } else { 3014 } else {
2906 PreferUnicode = true; 3015 PreferUnicode = true;
2907 } 3016 }
2908 } 3017 }
2909 3018
2910 error = ATGEN_SetPBKCharset(s, PreferUnicode); 3019 error = ATGEN_SetPBKCharset(s, PreferUnicode);
2911 if (error != ERR_NONE) return error; 3020 if (error != ERR_NONE) return error;
2912 3021
2913 switch (Priv->PBKCharset) { 3022 switch (Priv->PBKCharset) {
2914 case AT_PBK_HEX: 3023 case AT_PBK_HEX:
2915 EncodeHexBin(name, DecodeUnicodeString(entry->Entries[Name].Text), UnicodeLength(entry->Entries[Name].Text)); 3024 EncodeHexBin(name, DecodeUnicodeString(entry->Entries[Name].Text), UnicodeLength(entry->Entries[Name].Text));
2916 len = strlen(name); 3025 len = strlen(name);
2917 break; 3026 break;
2918 case AT_PBK_GSM: 3027 case AT_PBK_GSM:
2919 smprintf(s, "str: %s\n", DecodeUnicodeString(entry->Entries[Name].Text)); 3028 smprintf(s, "str: %s\n", DecodeUnicodeString(entry->Entries[Name].Text));
2920 len = UnicodeLength(entry->Entries[Name].Text); 3029 len = UnicodeLength(entry->Entries[Name].Text);
2921 EncodeDefault(name, entry->Entries[Name].Text, &len, true, NULL); 3030 EncodeDefault(name, entry->Entries[Name].Text, &len, true, NULL);
2922 break; 3031 break;
2923 case AT_PBK_UCS2: 3032 case AT_PBK_UCS2:
2924 EncodeHexUnicode(name, entry->Entries[Name].Text, UnicodeLength(entry->Entries[Name].Text)); 3033 EncodeHexUnicode(name, entry->Entries[Name].Text, UnicodeLength(entry->Entries[Name].Text));
2925 len = strlen(name); 3034 len = strlen(name);
2926 break; 3035 break;
3036 case AT_PBK_PCCP437:
3037 /* FIXME: correctly decode PCCP437 */
3038 smprintf(s, "str: %s\n", DecodeUnicodeString(entry->Entries[Name].Text));
3039 len = UnicodeLength(entry->Entries[Name].Text);
3040 EncodeDefault(name, entry->Entries[Name].Text, &len, true, NULL);
3041 break;
2927 } 3042 }
2928 } else { 3043 } else {
2929 smprintf(s, "WARNING: No usable name found!\n"); 3044 smprintf(s, "WARNING: No usable name found!\n");
2930 len = 0; 3045 len = 0;
2931 } 3046 }
2932 3047
2933 if (Number != -1) { 3048 if (Number != -1) {
2934 GSM_PackSemiOctetNumber(entry->Entries[Number].Text, number, false); 3049 GSM_PackSemiOctetNumber(entry->Entries[Number].Text, number, false);
2935 NumberType = number[0]; 3050 NumberType = number[0];
2936 sprintf(number,"%s",DecodeUnicodeString(entry->Entries[Number].Text)); 3051 sprintf(number,"%s",DecodeUnicodeString(entry->Entries[Number].Text));
2937 } else { 3052 } else {
2938 smprintf(s, "WARNING: No usable number found!\n"); 3053 smprintf(s, "WARNING: No usable number found!\n");
2939 number[0] = 0; 3054 number[0] = 0;
2940 } 3055 }
2941 3056
2942 if (Priv->FirstMemoryEntry == 0) { 3057 if (Priv->FirstMemoryEntry == 0) {
2943 error = ATGEN_GetMemoryInfo(s, NULL, AT_First); 3058 error = ATGEN_GetMemoryInfo(s, NULL, AT_First);
2944 if (error != ERR_NONE) return error; 3059 if (error != ERR_NONE) return error;
2945 } 3060 }
2946 3061
2947 /* We can't use here: 3062 /* We can't use here:
2948 * sprintf(req, "AT+CPBW=%d, \"%s\", %i, \"%s\"\r", 3063 * sprintf(req, "AT+CPBW=%d, \"%s\", %i, \"%s\"\r",
2949 * entry->Location, number, NumberType, name); 3064 * entry->Location, number, NumberType, name);
2950 * because name can contain 0 when using GSM alphabet. 3065 * because name can contain 0 when using GSM alphabet.
2951 */ 3066 */
2952 sprintf(req, "AT+CPBW=%d, \"%s\", %i, \"", entry->Location + Priv->FirstMemoryEntry - 1, number, NumberType); 3067 sprintf(req, "AT+CPBW=%d, \"%s\", %i, \"", entry->Location + Priv->FirstMemoryEntry - 1, number, NumberType);
2953 reqlen = strlen(req); 3068 reqlen = strlen(req);
2954 if (reqlen + len > REQUEST_SIZE - 2) { 3069 if (reqlen + len > REQUEST_SIZE - 2) {
2955 smprintf(s, "WARNING: Text truncated to fit in buffer!\n"); 3070 smprintf(s, "WARNING: Text truncated to fit in buffer!\n");
2956 len = REQUEST_SIZE - 2 - reqlen; 3071 len = REQUEST_SIZE - 2 - reqlen;
2957 } 3072 }
2958 memcpy(req + reqlen, name, len); 3073 memcpy(req + reqlen, name, len);
2959 reqlen += len; 3074 reqlen += len;
2960 memcpy(req + reqlen, "\"\r", 2); 3075 memcpy(req + reqlen, "\"\r", 2);
2961 reqlen += 2; 3076 reqlen += 2;
2962 3077
2963 smprintf(s, "Writing phonebook entry\n"); 3078 smprintf(s, "Writing phonebook entry\n");
2964 return GSM_WaitFor (s, req, reqlen, 0x00, 4, ID_SetMemory); 3079 return GSM_WaitFor (s, req, reqlen, 0x00, 4, ID_SetMemory);
2965#undef REQUEST_SIZE 3080#undef REQUEST_SIZE
2966} 3081}
2967 3082
2968GSM_Error ATGEN_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 3083GSM_Error ATGEN_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
2969{ 3084{
2970 if (entry->Location == 0) return ERR_INVALIDLOCATION; 3085 if (entry->Location == 0) return ERR_INVALIDLOCATION;
2971 return ATGEN_PrivSetMemory(s, entry); 3086 return ATGEN_PrivSetMemory(s, entry);
2972} 3087}
2973 3088
2974GSM_Error ATGEN_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 3089GSM_Error ATGEN_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
@@ -3207,463 +3322,541 @@ GSM_Error ATGEN_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
3207 return GSM_WaitFor (s, "AT+CSQ\r", 7, 0x00, 4, ID_GetSignalQuality); 3322 return GSM_WaitFor (s, "AT+CSQ\r", 7, 0x00, 4, ID_GetSignalQuality);
3208} 3323}
3209 3324
3210/* When use AT+CPIN?, A2D returns it without OK and because of it Gammu 3325/* When use AT+CPIN?, A2D returns it without OK and because of it Gammu
3211 parses answer without it. 3326 parses answer without it.
3212 MC35 and other return OK after answer for AT+CPIN?. Here we handle it. 3327 MC35 and other return OK after answer for AT+CPIN?. Here we handle it.
3213 Any better idea ? 3328 Any better idea ?
3214 */ 3329 */
3215GSM_Error ATGEN_ReplyOK(GSM_Protocol_Message msg, GSM_StateMachine *s) 3330GSM_Error ATGEN_ReplyOK(GSM_Protocol_Message msg, GSM_StateMachine *s)
3216{ 3331{
3217 return ERR_NONE; 3332 return ERR_NONE;
3218} 3333}
3219 3334
3220static GSM_Error ATGEN_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start) 3335static GSM_Error ATGEN_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start)
3221{ 3336{
3222 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 3337 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
3223 3338
3224 if (Priv->Manufacturer==AT_Siemens ) return SIEMENS_GetNextCalendar(s,Note,start); 3339 if (Priv->Manufacturer==AT_Siemens ) return SIEMENS_GetNextCalendar(s,Note,start);
3225 if (Priv->Manufacturer==AT_Ericsson) return SONYERIC_GetNextCalendar(s,Note,start); 3340 if (Priv->Manufacturer==AT_Ericsson) return SONYERIC_GetNextCalendar(s,Note,start);
3226 return ERR_NOTSUPPORTED; 3341 return ERR_NOTSUPPORTED;
3227} 3342}
3228 3343
3229GSM_Error ATGEN_Terminate(GSM_StateMachine *s) 3344GSM_Error ATGEN_Terminate(GSM_StateMachine *s)
3230{ 3345{
3231 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 3346 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
3232 3347
3233 free(Priv->file.Buffer); 3348 free(Priv->file.Buffer);
3234 return ERR_NONE; 3349 return ERR_NONE;
3235} 3350}
3236 3351
3237GSM_Error ATGEN_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note) 3352GSM_Error ATGEN_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
3238{ 3353{
3239 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 3354 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
3240 3355
3241 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_AddCalendarNote(s, Note); 3356 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_AddCalendarNote(s, Note);
3242 if (Priv->Manufacturer==AT_Ericsson) return SONYERIC_AddCalendarNote(s, Note); 3357 if (Priv->Manufacturer==AT_Ericsson) return SONYERIC_AddCalendarNote(s, Note);
3243 return ERR_NOTSUPPORTED; 3358 return ERR_NOTSUPPORTED;
3244} 3359}
3245 3360
3246GSM_Error ATGEN_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note) 3361GSM_Error ATGEN_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
3247{ 3362{
3248 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 3363 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
3249 3364
3250 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_DelCalendarNote(s, Note); 3365 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_DelCalendarNote(s, Note);
3251 if (Priv->Manufacturer==AT_Ericsson) return SONYERIC_DelCalendarNote(s, Note); 3366 if (Priv->Manufacturer==AT_Ericsson) return SONYERIC_DelCalendarNote(s, Note);
3252 return ERR_NOTSUPPORTED; 3367 return ERR_NOTSUPPORTED;
3253} 3368}
3254 3369
3370
3371GSM_Error ATGEN_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
3372{
3373 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
3374
3375 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_GetBitmap(s, Bitmap);
3376 if (Priv->Manufacturer==AT_Samsung) return SAMSUNG_GetBitmap(s, Bitmap);
3377 return ERR_NOTSUPPORTED;
3378}
3379
3380GSM_Error ATGEN_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
3381{
3382 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
3383
3384 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_SetBitmap(s, Bitmap);
3385 if (Priv->Manufacturer==AT_Samsung) return SAMSUNG_SetBitmap(s, Bitmap);
3386 return ERR_NOTSUPPORTED;
3387}
3388
3389GSM_Error ATGEN_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone)
3390{
3391 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
3392
3393 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_GetRingtone(s, Ringtone, PhoneRingtone);
3394 if (Priv->Manufacturer==AT_Samsung) return SAMSUNG_GetRingtone(s, Ringtone, PhoneRingtone);
3395 return ERR_NOTSUPPORTED;
3396}
3397
3398GSM_Error ATGEN_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
3399{
3400 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
3401
3402 if (Priv->Manufacturer==AT_Siemens) return SIEMENS_SetRingtone(s, Ringtone, maxlength);
3403 if (Priv->Manufacturer==AT_Samsung) return SAMSUNG_SetRingtone(s, Ringtone, maxlength);
3404 return ERR_NOTSUPPORTED;
3405}
3406
3255GSM_Error ATGEN_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, bool Press) 3407GSM_Error ATGEN_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, bool Press)
3256{ 3408{
3257 GSM_Errorerror; 3409 GSM_Errorerror;
3258 unsigned char Frame[] = "AT+CKPD=\"?\"\r"; 3410 unsigned char Frame[] = "AT+CKPD=\"?\"\r";
3259 3411
3260 if (Press) { 3412 if (Press) {
3261 switch (Key) { 3413 switch (Key) {
3262 case GSM_KEY_1 : Frame[9] = '1'; break; 3414 case GSM_KEY_1 : Frame[9] = '1'; break;
3263 case GSM_KEY_2 : Frame[9] = '2'; break; 3415 case GSM_KEY_2 : Frame[9] = '2'; break;
3264 case GSM_KEY_3 : Frame[9] = '3'; break; 3416 case GSM_KEY_3 : Frame[9] = '3'; break;
3265 case GSM_KEY_4 : Frame[9] = '4'; break; 3417 case GSM_KEY_4 : Frame[9] = '4'; break;
3266 case GSM_KEY_5 : Frame[9] = '5'; break; 3418 case GSM_KEY_5 : Frame[9] = '5'; break;
3267 case GSM_KEY_6 : Frame[9] = '6'; break; 3419 case GSM_KEY_6 : Frame[9] = '6'; break;
3268 case GSM_KEY_7 : Frame[9] = '7'; break; 3420 case GSM_KEY_7 : Frame[9] = '7'; break;
3269 case GSM_KEY_8 : Frame[9] = '8'; break; 3421 case GSM_KEY_8 : Frame[9] = '8'; break;
3270 case GSM_KEY_9 : Frame[9] = '9'; break; 3422 case GSM_KEY_9 : Frame[9] = '9'; break;
3271 case GSM_KEY_0 : Frame[9] = '0'; break; 3423 case GSM_KEY_0 : Frame[9] = '0'; break;
3272 case GSM_KEY_HASH : Frame[9] = '#'; break; 3424 case GSM_KEY_HASH : Frame[9] = '#'; break;
3273 case GSM_KEY_ASTERISK : Frame[9] = '*'; break; 3425 case GSM_KEY_ASTERISK : Frame[9] = '*'; break;
3274 case GSM_KEY_POWER : return ERR_NOTSUPPORTED; 3426 case GSM_KEY_POWER : return ERR_NOTSUPPORTED;
3275 case GSM_KEY_GREEN : Frame[9] = 'S'; break; 3427 case GSM_KEY_GREEN : Frame[9] = 'S'; break;
3276 case GSM_KEY_RED : Frame[9] = 'E'; break; 3428 case GSM_KEY_RED : Frame[9] = 'E'; break;
3277 case GSM_KEY_INCREASEVOLUME: Frame[9] = 'U'; break; 3429 case GSM_KEY_INCREASEVOLUME: Frame[9] = 'U'; break;
3278 case GSM_KEY_DECREASEVOLUME: Frame[9] = 'D'; break; 3430 case GSM_KEY_DECREASEVOLUME: Frame[9] = 'D'; break;
3279 case GSM_KEY_UP : Frame[9] = '^'; break; 3431 case GSM_KEY_UP : Frame[9] = '^'; break;
3280 case GSM_KEY_DOWN : Frame[9] = 'V'; break; 3432 case GSM_KEY_DOWN : Frame[9] = 'V'; break;
3281 case GSM_KEY_MENU : Frame[9] = 'F'; break; 3433 case GSM_KEY_MENU : Frame[9] = 'F'; break;
3282 case GSM_KEY_NAMES : Frame[9] = 'C'; break; 3434 case GSM_KEY_NAMES : Frame[9] = 'C'; break;
3283 default : return ERR_NOTSUPPORTED; 3435 default : return ERR_NOTSUPPORTED;
3284 } 3436 }
3285 smprintf(s, "Pressing key\n"); 3437 smprintf(s, "Pressing key\n");
3286 error = GSM_WaitFor (s, Frame, 12, 0x00, 4, ID_PressKey); 3438 error = GSM_WaitFor (s, Frame, 12, 0x00, 4, ID_PressKey);
3287 if (error != ERR_NONE) return error; 3439 if (error != ERR_NONE) return error;
3288 3440
3289 /* Strange. My T310 needs it */ 3441 /* Strange. My T310 needs it */
3290 return GSM_WaitFor (s, "ATE1\r", 5, 0x00, 4, ID_EnableEcho); 3442 return GSM_WaitFor (s, "ATE1\r", 5, 0x00, 4, ID_EnableEcho);
3291 } else { 3443 } else {
3292 return ERR_NONE; 3444 return ERR_NONE;
3293 } 3445 }
3294} 3446}
3295 3447
3296#ifdef GSM_ENABLE_CELLBROADCAST 3448#ifdef GSM_ENABLE_CELLBROADCAST
3297 3449
3298GSM_Error ATGEN_ReplyIncomingCB(GSM_Protocol_Message msg, GSM_StateMachine *s) 3450GSM_Error ATGEN_ReplyIncomingCB(GSM_Protocol_Message msg, GSM_StateMachine *s)
3299{ 3451{
3300 GSM_CBMessage CB; 3452 GSM_CBMessage CB;
3301 int i,j; 3453 int i,j;
3302 char Buffer[300],Buffer2[300]; 3454 char Buffer[300],Buffer2[300];
3303 3455
3304 smprintf(s, "CB received\n"); 3456 smprintf(s, "CB received\n");
3305 return ERR_NONE; 3457 return ERR_NONE;
3306 3458
3307 DecodeHexBin (Buffer,msg.Buffer+6,msg.Length-6); 3459 DecodeHexBin (Buffer,msg.Buffer+6,msg.Length-6);
3308 DumpMessage(stdout, di.dl ,Buffer,msg.Length-6); 3460 DumpMessage(stdout, di.dl ,Buffer,msg.Length-6);
3309 3461
3310 CB.Channel = Buffer[4]; 3462 CB.Channel = Buffer[4];
3311 3463
3312 for (j=0;j<msg.Length;j++) { 3464 for (j=0;j<msg.Length;j++) {
3313 smprintf(s, "j=%i\n",j); 3465 smprintf(s, "j=%i\n",j);
3314 i=GSM_UnpackEightBitsToSeven(0, msg.Buffer[6], msg.Buffer[6], msg.Buffer+j, Buffer2); 3466 i=GSM_UnpackEightBitsToSeven(0, msg.Buffer[6], msg.Buffer[6], msg.Buffer+j, Buffer2);
3315 //i = msg.Buffer[6] - 1; 3467 //i = msg.Buffer[6] - 1;
3316 //while (i!=0) { 3468 //while (i!=0) {
3317 // if (Buffer[i] == 13) i = i - 1; else break; 3469 // if (Buffer[i] == 13) i = i - 1; else break;
3318 //} 3470 //}
3319 DecodeDefault(CB.Text, Buffer2, msg.Buffer[6], false, NULL); 3471 DecodeDefault(CB.Text, Buffer2, msg.Buffer[6], false, NULL);
3320 smprintf(s, "Channel %i, text \"%s\"\n",CB.Channel,DecodeUnicodeString(CB.Text)); 3472 smprintf(s, "Channel %i, text \"%s\"\n",CB.Channel,DecodeUnicodeString(CB.Text));
3321 } 3473 }
3322 if (s->Phone.Data.EnableIncomingCB && s->User.IncomingCB!=NULL) { 3474 if (s->Phone.Data.EnableIncomingCB && s->User.IncomingCB!=NULL) {
3323 s->User.IncomingCB(s->CurrentConfig->Device,CB); 3475 s->User.IncomingCB(s->CurrentConfig->Device,CB);
3324 } 3476 }
3325 return ERR_NONE; 3477 return ERR_NONE;
3326} 3478}
3327 3479
3328#endif 3480#endif
3329 3481
3330GSM_Error ATGEN_SetIncomingCB(GSM_StateMachine *s, bool enable) 3482GSM_Error ATGEN_SetIncomingCB(GSM_StateMachine *s, bool enable)
3331{ 3483{
3332#ifdef GSM_ENABLE_CELLBROADCAST 3484#ifdef GSM_ENABLE_CELLBROADCAST
3333 if (s->Phone.Data.EnableIncomingCB!=enable) { 3485 if (s->Phone.Data.EnableIncomingCB!=enable) {
3334 s->Phone.Data.EnableIncomingCB = enable; 3486 s->Phone.Data.EnableIncomingCB = enable;
3335 if (enable) { 3487 if (enable) {
3336 smprintf(s, "Enabling incoming CB\n"); 3488 smprintf(s, "Enabling incoming CB\n");
3337 return GSM_WaitFor(s, "AT+CNMI=3,,2\r", 13, 0x00, 4, ID_SetIncomingCB); 3489 return GSM_WaitFor(s, "AT+CNMI=3,,2\r", 13, 0x00, 4, ID_SetIncomingCB);
3338 } else { 3490 } else {
3339 smprintf(s, "Disabling incoming CB\n"); 3491 smprintf(s, "Disabling incoming CB\n");
3340 return GSM_WaitFor(s, "AT+CNMI=3,,0\r", 13, 0x00, 4, ID_SetIncomingCB); 3492 return GSM_WaitFor(s, "AT+CNMI=3,,0\r", 13, 0x00, 4, ID_SetIncomingCB);
3341 } 3493 }
3342 } 3494 }
3343 return ERR_NONE; 3495 return ERR_NONE;
3344#else 3496#else
3345 return ERR_SOURCENOTAVAILABLE; 3497 return ERR_SOURCENOTAVAILABLE;
3346#endif 3498#endif
3347} 3499}
3348 3500
3501GSM_Error ATGEN_SetFastSMSSending(GSM_StateMachine *s, bool enable)
3502{
3503 if (enable) {
3504 smprintf(s, "Enabling fast SMS sending\n");
3505 return GSM_WaitFor(s, "AT+CMMS=2\r", 10, 0x00, 4, ID_SetFastSMSSending);
3506 } else {
3507 smprintf(s, "Disabling fast SMS sending\n");
3508 return GSM_WaitFor(s, "AT+CMMS=0\r", 10, 0x00, 4, ID_SetFastSMSSending);
3509 }
3510}
3511
3349GSM_Error ATGEN_IncomingSMSInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) 3512GSM_Error ATGEN_IncomingSMSInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
3350{ 3513{
3351 smprintf(s, "Incoming SMS\n"); 3514 smprintf(s, "Incoming SMS\n");
3352 return ERR_NONE; 3515 return ERR_NONE;
3353} 3516}
3354 3517
3355GSM_Error ATGEN_IncomingSMSDeliver(GSM_Protocol_Message msg, GSM_StateMachine *s) 3518GSM_Error ATGEN_IncomingSMSDeliver(GSM_Protocol_Message msg, GSM_StateMachine *s)
3356{ 3519{
3357 GSM_Phone_Data *Data = &s->Phone.Data; 3520 GSM_Phone_Data *Data = &s->Phone.Data;
3358 GSM_SMSMessage sms; 3521 GSM_SMSMessage sms;
3359 int current = 0, current2, i=0; 3522 int current = 0, current2, i=0;
3360 unsigned char buffer[300],smsframe[800]; 3523 unsigned char buffer[300],smsframe[800];
3361 3524
3362 smprintf(s, "Incoming SMS received (Deliver)\n"); 3525 smprintf(s, "Incoming SMS received (Deliver)\n");
3363 if (Data->EnableIncomingSMS && s->User.IncomingSMS!=NULL) { 3526 if (Data->EnableIncomingSMS && s->User.IncomingSMS!=NULL) {
3364 sms.State = SMS_UnRead; 3527 sms.State = SMS_UnRead;
3365 sms.InboxFolder = true; 3528 sms.InboxFolder = true;
3366 sms.PDU = SMS_Deliver; 3529 sms.PDU = SMS_Deliver;
3367 3530
3368 /* T310 with larger SMS goes crazy and mix this incoming 3531 /* T310 with larger SMS goes crazy and mix this incoming
3369 * frame with normal answers. PDU is always last frame 3532 * frame with normal answers. PDU is always last frame
3370 * We find its' number and parse it */ 3533 * We find its' number and parse it */
3371 while (Data->Priv.ATGEN.Lines.numbers[i*2+1] != 0) { 3534 while (Data->Priv.ATGEN.Lines.numbers[i*2+1] != 0) {
3372 /* FIXME: handle special chars correctly */ 3535 /* FIXME: handle special chars correctly */
3373 i++; 3536 i++;
3374 } 3537 }
3375 DecodeHexBin (buffer, 3538 DecodeHexBin (buffer,
3376 GetLineString(msg.Buffer,Data->Priv.ATGEN.Lines,i), 3539 GetLineString(msg.Buffer,Data->Priv.ATGEN.Lines,i),
3377 strlen(GetLineString(msg.Buffer,Data->Priv.ATGEN.Lines,i))); 3540 strlen(GetLineString(msg.Buffer,Data->Priv.ATGEN.Lines,i)));
3378 3541
3379 /* We use locations from SMS layouts like in ../phone2.c(h) */ 3542 /* We use locations from SMS layouts like in ../phone2.c(h) */
3380 for(i=0;i<buffer[0]+1;i++) smsframe[i]=buffer[current++]; 3543 for(i=0;i<buffer[0]+1;i++) smsframe[i]=buffer[current++];
3381 smsframe[12]=buffer[current++]; 3544 smsframe[12]=buffer[current++];
3382 3545
3383 current2=((buffer[current])+1)/2+1; 3546 current2=((buffer[current])+1)/2+1;
3384 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++]; 3547 for(i=0;i<current2+1;i++) smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++];
3385 smsframe[PHONE_SMSDeliver.TPPID] = buffer[current++]; 3548 smsframe[PHONE_SMSDeliver.TPPID] = buffer[current++];
3386 smsframe[PHONE_SMSDeliver.TPDCS] = buffer[current++]; 3549 smsframe[PHONE_SMSDeliver.TPDCS] = buffer[current++];
3387 for(i=0;i<7;i++) smsframe[PHONE_SMSDeliver.DateTime+i]=buffer[current++]; 3550 for(i=0;i<7;i++) smsframe[PHONE_SMSDeliver.DateTime+i]=buffer[current++];
3388 smsframe[PHONE_SMSDeliver.TPUDL] = buffer[current++]; 3551 smsframe[PHONE_SMSDeliver.TPUDL] = buffer[current++];
3389 for(i=0;i<smsframe[PHONE_SMSDeliver.TPUDL];i++) smsframe[i+PHONE_SMSDeliver.Text]=buffer[current++]; 3552 for(i=0;i<smsframe[PHONE_SMSDeliver.TPUDL];i++) smsframe[i+PHONE_SMSDeliver.Text]=buffer[current++];
3390 GSM_DecodeSMSFrame(&sms,smsframe,PHONE_SMSDeliver); 3553 GSM_DecodeSMSFrame(&sms,smsframe,PHONE_SMSDeliver);
3391 3554
3392 s->User.IncomingSMS(s->CurrentConfig->Device,sms); 3555 s->User.IncomingSMS(s->CurrentConfig->Device,sms);
3393 } 3556 }
3394 return ERR_NONE; 3557 return ERR_NONE;
3395} 3558}
3396 3559
3397/* I don't have phone able to do it and can't fill it */ 3560/* I don't have phone able to do it and can't fill it */
3398GSM_Error ATGEN_IncomingSMSReport(GSM_Protocol_Message msg, GSM_StateMachine *s) 3561GSM_Error ATGEN_IncomingSMSReport(GSM_Protocol_Message msg, GSM_StateMachine *s)
3399{ 3562{
3400 smprintf(s, "Incoming SMS received (Report)\n"); 3563 smprintf(s, "Incoming SMS received (Report)\n");
3401 return ERR_NONE; 3564 return ERR_NONE;
3402} 3565}
3403 3566
3404GSM_Error ATGEN_SetIncomingSMS(GSM_StateMachine *s, bool enable) 3567GSM_Error ATGEN_SetIncomingSMS(GSM_StateMachine *s, bool enable)
3405{ 3568{
3406 /* Nokia returns OK, but doesn't return anything */ 3569 /* Nokia returns OK, but doesn't return anything */
3407 if (s->Phone.Data.Priv.ATGEN.Manufacturer == AT_Nokia) return ERR_NOTSUPPORTED; 3570 if (s->Phone.Data.Priv.ATGEN.Manufacturer == AT_Nokia) return ERR_NOTSUPPORTED;
3408 3571
3409 if (s->Phone.Data.EnableIncomingSMS!=enable) { 3572 if (s->Phone.Data.EnableIncomingSMS!=enable) {
3410 s->Phone.Data.EnableIncomingSMS = enable; 3573 s->Phone.Data.EnableIncomingSMS = enable;
3411 if (enable) { 3574 if (enable) {
3412 smprintf(s, "Enabling incoming SMS\n"); 3575 smprintf(s, "Enabling incoming SMS\n");
3413 3576
3414 /* Delivery reports */ 3577 /* Delivery reports */
3415 GSM_WaitFor(s, "AT+CNMI=3,,,1\r", 14, 0x00, 4, ID_SetIncomingSMS); 3578 GSM_WaitFor(s, "AT+CNMI=3,,,1\r", 14, 0x00, 4, ID_SetIncomingSMS);
3416 3579
3417 /* SMS deliver */ 3580 /* SMS deliver */
3418 return GSM_WaitFor(s, "AT+CNMI=3,3\r", 12, 0x00, 4, ID_SetIncomingSMS); 3581 return GSM_WaitFor(s, "AT+CNMI=3,3\r", 12, 0x00, 4, ID_SetIncomingSMS);
3419 } else { 3582 } else {
3420 smprintf(s, "Disabling incoming SMS\n"); 3583 smprintf(s, "Disabling incoming SMS\n");
3421 return GSM_WaitFor(s, "AT+CNMI=3,0\r", 12, 0x00, 4, ID_SetIncomingSMS); 3584 return GSM_WaitFor(s, "AT+CNMI=3,0\r", 12, 0x00, 4, ID_SetIncomingSMS);
3422 } 3585 }
3423 } 3586 }
3424 return ERR_NONE; 3587 return ERR_NONE;
3425} 3588}
3426 3589
3590GSM_Error ATGEN_GetLocale(GSM_StateMachine *s, GSM_Locale *locale)
3591{
3592 if (s->Phone.Data.Priv.ATGEN.Manufacturer==AT_Ericsson) return ERICSSON_GetLocale(s,locale);
3593 return ERR_NOTSUPPORTED;
3594}
3595
3596GSM_Error ATGEN_SetLocale(GSM_StateMachine *s, GSM_Locale *locale)
3597{
3598 if (s->Phone.Data.Priv.ATGEN.Manufacturer==AT_Ericsson) return ERICSSON_SetLocale(s,locale);
3599 return ERR_NOTSUPPORTED;
3600}
3601
3427GSM_Reply_Function ATGENReplyFunctions[] = { 3602GSM_Reply_Function ATGENReplyFunctions[] = {
3428 {ATGEN_GenericReply, "AT\r" ,0x00,0x00,ID_IncomingFrame }, 3603 {ATGEN_GenericReply, "AT\r" ,0x00,0x00,ID_IncomingFrame },
3429 {ATGEN_GenericReply, "ATE1" ,0x00,0x00,ID_EnableEcho }, 3604 {ATGEN_GenericReply, "ATE1" ,0x00,0x00,ID_EnableEcho },
3430 {ATGEN_GenericReply, "AT+CMEE=" ,0x00,0x00,ID_EnableErrorInfo }, 3605 {ATGEN_GenericReply, "AT+CMEE=" ,0x00,0x00,ID_EnableErrorInfo },
3431 {ATGEN_GenericReply, "AT+CKPD=" ,0x00,0x00,ID_PressKey }, 3606 {ATGEN_GenericReply, "AT+CKPD=" ,0x00,0x00,ID_PressKey },
3432 {ATGEN_ReplyGetSIMIMSI, "AT+CIMI" ,0x00,0x00,ID_GetSIMIMSI }, 3607 {ATGEN_ReplyGetSIMIMSI, "AT+CIMI" ,0x00,0x00,ID_GetSIMIMSI },
3433 {ATGEN_GenericReply, "AT*EOBEX" ,0x00,0x00,ID_SetOBEX }, 3608 {ATGEN_GenericReply, "AT*EOBEX" ,0x00,0x00,ID_SetOBEX },
3434 3609
3610 {ERICSSON_ReplyGetDateLocale, "*ESDF:" ,0x00,0x00,ID_GetLocale },
3611 {ERICSSON_ReplyGetTimeLocale, "*ESTF:" ,0x00,0x00,ID_GetLocale },
3612 {ATGEN_GenericReply, "AT*ESDF=" ,0x00,0x00,ID_SetLocale },
3613 {ATGEN_GenericReply, "AT*ESTF=" ,0x00,0x00,ID_SetLocale },
3614
3435#ifdef GSM_ENABLE_CELLBROADCAST 3615#ifdef GSM_ENABLE_CELLBROADCAST
3436 {ATGEN_ReplyIncomingCB, "+CBM:" ,0x00,0x00,ID_IncomingFrame }, 3616 {ATGEN_ReplyIncomingCB, "+CBM:" ,0x00,0x00,ID_IncomingFrame },
3437 {ATGEN_GenericReply, "AT+CNMI" ,0x00,0x00,ID_SetIncomingCB }, 3617 {ATGEN_GenericReply, "AT+CNMI" ,0x00,0x00,ID_SetIncomingCB },
3438#endif 3618#endif
3439 3619
3440 {ATGEN_IncomingBattery, "_OBS:" ,0x00,0x00,ID_IncomingFrame }, 3620 {ATGEN_IncomingBattery, "_OBS:" ,0x00,0x00,ID_IncomingFrame },
3441 {ATGEN_ReplyGetBatteryCharge, "AT+CBC" ,0x00,0x00,ID_GetBatteryCharge }, 3621 {ATGEN_ReplyGetBatteryCharge, "AT+CBC" ,0x00,0x00,ID_GetBatteryCharge },
3442 3622
3443 {ATGEN_ReplyGetModel, "AT+CGMM" ,0x00,0x00,ID_GetModel }, 3623 {ATGEN_ReplyGetModel, "AT+CGMM" ,0x00,0x00,ID_GetModel },
3444 {ATGEN_ReplyGetManufacturer, "AT+CGMI" ,0x00,0x00,ID_GetManufacturer }, 3624 {ATGEN_ReplyGetManufacturer, "AT+CGMI" ,0x00,0x00,ID_GetManufacturer },
3445 {ATGEN_ReplyGetFirmwareCGMR, "AT+CGMR" ,0x00,0x00,ID_GetFirmware }, 3625 {ATGEN_ReplyGetFirmwareCGMR, "AT+CGMR" ,0x00,0x00,ID_GetFirmware },
3446 {ATGEN_ReplyGetFirmwareATI, "ATI" ,0x00,0x00,ID_GetFirmware }, 3626 {ATGEN_ReplyGetFirmwareATI, "ATI" ,0x00,0x00,ID_GetFirmware },
3447 {ATGEN_ReplyGetIMEI, "AT+CGSN" ,0x00,0x00,ID_GetIMEI }, 3627 {ATGEN_ReplyGetIMEI, "AT+CGSN" ,0x00,0x00,ID_GetIMEI },
3448 3628
3449 {ATGEN_ReplySendSMS, "AT+CMGS" ,0x00,0x00,ID_IncomingFrame }, 3629 {ATGEN_ReplySendSMS, "AT+CMGS" ,0x00,0x00,ID_IncomingFrame },
3450 {ATGEN_ReplySendSMS, "AT+CMSS" ,0x00,0x00,ID_IncomingFrame }, 3630 {ATGEN_ReplySendSMS, "AT+CMSS" ,0x00,0x00,ID_IncomingFrame },
3451 {ATGEN_GenericReply, "AT+CNMI" ,0x00,0x00,ID_SetIncomingSMS }, 3631 {ATGEN_GenericReply, "AT+CNMI" ,0x00,0x00,ID_SetIncomingSMS },
3452 {ATGEN_GenericReply, "AT+CMGF" ,0x00,0x00,ID_GetSMSMode }, 3632 {ATGEN_GenericReply, "AT+CMGF" ,0x00,0x00,ID_GetSMSMode },
3453 {ATGEN_GenericReply, "AT+CSDH" ,0x00,0x00,ID_GetSMSMode }, 3633 {ATGEN_GenericReply, "AT+CSDH" ,0x00,0x00,ID_GetSMSMode },
3454 {ATGEN_ReplyGetSMSMessage, "AT+CMGR" ,0x00,0x00,ID_GetSMSMessage }, 3634 {ATGEN_ReplyGetSMSMessage, "AT+CMGR" ,0x00,0x00,ID_GetSMSMessage },
3455 {ATGEN_GenericReply, "AT+CPMS" ,0x00,0x00,ID_SetMemoryType }, 3635 {ATGEN_GenericReply, "AT+CPMS" ,0x00,0x00,ID_SetMemoryType },
3456 {ATGEN_ReplyGetSMSStatus, "AT+CPMS" ,0x00,0x00,ID_GetSMSStatus }, 3636 {ATGEN_ReplyGetSMSStatus, "AT+CPMS" ,0x00,0x00,ID_GetSMSStatus },
3457 {ATGEN_ReplyGetSMSMemories, "AT+CPMS=?" ,0x00,0x00,ID_GetSMSMemories }, 3637 {ATGEN_ReplyGetSMSMemories, "AT+CPMS=?" ,0x00,0x00,ID_GetSMSMemories },
3458 {ATGEN_ReplyAddSMSMessage, "AT+CMGW" ,0x00,0x00,ID_SaveSMSMessage }, 3638 {ATGEN_ReplyAddSMSMessage, "AT+CMGW" ,0x00,0x00,ID_SaveSMSMessage },
3459 {ATGEN_GenericReply, "AT+CSMP" ,0x00,0x00,ID_SetSMSParameters }, 3639 {ATGEN_GenericReply, "AT+CSMP" ,0x00,0x00,ID_SetSMSParameters },
3460 {ATGEN_GenericReply, "AT+CSCA" ,0x00,0x00,ID_SetSMSC }, 3640 {ATGEN_GenericReply, "AT+CSCA" ,0x00,0x00,ID_SetSMSC },
3461 {ATGEN_ReplyGetSMSC, "AT+CSCA?" ,0x00,0x00,ID_GetSMSC }, 3641 {ATGEN_ReplyGetSMSC, "AT+CSCA?" ,0x00,0x00,ID_GetSMSC },
3462 {ATGEN_ReplyDeleteSMSMessage, "AT+CMGD" ,0x00,0x00,ID_DeleteSMSMessage }, 3642 {ATGEN_ReplyDeleteSMSMessage, "AT+CMGD" ,0x00,0x00,ID_DeleteSMSMessage },
3463 {ATGEN_GenericReply, "ATE1" ,0x00,0x00,ID_SetSMSParameters }, 3643 {ATGEN_GenericReply, "ATE1" ,0x00,0x00,ID_SetSMSParameters },
3464 {ATGEN_GenericReply, "\x1b\x0D" ,0x00,0x00,ID_SetSMSParameters }, 3644 {ATGEN_GenericReply, "\x1b\x0D" ,0x00,0x00,ID_SetSMSParameters },
3645 {ATGEN_GenericReply, "AT+CMMS" ,0x00,0x00,ID_SetFastSMSSending },
3465 {ATGEN_IncomingSMSInfo, "+CMTI:" ,0x00,0x00,ID_IncomingFrame }, 3646 {ATGEN_IncomingSMSInfo, "+CMTI:" ,0x00,0x00,ID_IncomingFrame },
3466 {ATGEN_IncomingSMSDeliver, "+CMT:" ,0x00,0x00,ID_IncomingFrame }, 3647 {ATGEN_IncomingSMSDeliver, "+CMT:" ,0x00,0x00,ID_IncomingFrame },
3467 {ATGEN_IncomingSMSReport, "+CDS:" ,0x00,0x00,ID_IncomingFrame }, 3648 {ATGEN_IncomingSMSReport, "+CDS:" ,0x00,0x00,ID_IncomingFrame },
3468 {ATGEN_IncomingSMSCInfo, "^SCN:" ,0x00,0x00,ID_IncomingFrame }, 3649 {ATGEN_IncomingSMSCInfo, "^SCN:" ,0x00,0x00,ID_IncomingFrame },
3469 3650
3470 {ATGEN_ReplyGetDateTime_Alarm, "AT+CCLK?" ,0x00,0x00,ID_GetDateTime }, 3651 {ATGEN_ReplyGetDateTime_Alarm, "AT+CCLK?" ,0x00,0x00,ID_GetDateTime },
3471 {ATGEN_GenericReply, "AT+CCLK=" ,0x00,0x00,ID_SetDateTime }, 3652 {ATGEN_GenericReply, "AT+CCLK=" ,0x00,0x00,ID_SetDateTime },
3653 {ATGEN_GenericReply, "AT+CALA=" ,0x00,0x00,ID_SetAlarm },
3472 {ATGEN_ReplyGetDateTime_Alarm, "AT+CALA?" ,0x00,0x00,ID_GetAlarm }, 3654 {ATGEN_ReplyGetDateTime_Alarm, "AT+CALA?" ,0x00,0x00,ID_GetAlarm },
3473 3655
3474 {ATGEN_ReplyGetNetworkLAC_CID, "AT+CREG?" ,0x00,0x00,ID_GetNetworkInfo }, 3656 {ATGEN_ReplyGetNetworkLAC_CID, "AT+CREG?" ,0x00,0x00,ID_GetNetworkInfo },
3475 {ATGEN_GenericReply, "AT+CREG=2" ,0x00,0x00,ID_GetNetworkInfo }, 3657 {ATGEN_GenericReply, "AT+CREG=2" ,0x00,0x00,ID_GetNetworkInfo },
3476 {ATGEN_GenericReply, "AT+COPS=" ,0x00,0x00,ID_GetNetworkInfo }, 3658 {ATGEN_GenericReply, "AT+COPS=" ,0x00,0x00,ID_GetNetworkInfo },
3477 {ATGEN_GenericReply, "AT+COPS=" ,0x00,0x00,ID_SetAutoNetworkLogin}, 3659 {ATGEN_GenericReply, "AT+COPS=" ,0x00,0x00,ID_SetAutoNetworkLogin},
3478 {ATGEN_ReplyGetNetworkCode, "AT+COPS" ,0x00,0x00,ID_GetNetworkInfo }, 3660 {ATGEN_ReplyGetNetworkCode, "AT+COPS" ,0x00,0x00,ID_GetNetworkInfo },
3479 {ATGEN_ReplyGetSignalQuality, "AT+CSQ" ,0x00,0x00,ID_GetSignalQuality }, 3661 {ATGEN_ReplyGetSignalQuality, "AT+CSQ" ,0x00,0x00,ID_GetSignalQuality },
3480 {ATGEN_IncomingNetworkLevel, "_OSIGQ:" ,0x00,0x00,ID_IncomingFrame }, 3662 {ATGEN_IncomingNetworkLevel, "_OSIGQ:" ,0x00,0x00,ID_IncomingFrame },
3481 {ATGEN_IncomingGPRS, "+CGREG:" ,0x00,0x00,ID_IncomingFrame }, 3663 {ATGEN_IncomingGPRS, "+CGREG:" ,0x00,0x00,ID_IncomingFrame },
3482 {ATGEN_ReplyGetNetworkLAC_CID, "+CREG:" ,0x00,0x00,ID_IncomingFrame }, 3664 {ATGEN_ReplyGetNetworkLAC_CID, "+CREG:" ,0x00,0x00,ID_IncomingFrame },
3483 3665
3484 {ATGEN_ReplyGetPBKMemories, "AT+CPBS=?" ,0x00,0x00,ID_SetMemoryType }, 3666 {ATGEN_ReplyGetPBKMemories, "AT+CPBS=?" ,0x00,0x00,ID_SetMemoryType },
3485 {ATGEN_GenericReply, "AT+CPBS=" ,0x00,0x00,ID_SetMemoryType }, 3667 {ATGEN_GenericReply, "AT+CPBS=" ,0x00,0x00,ID_SetMemoryType },
3486 {ATGEN_ReplyGetCPBSMemoryStatus,"AT+CPBS?" ,0x00,0x00,ID_GetMemoryStatus }, 3668 {ATGEN_ReplyGetCPBSMemoryStatus,"AT+CPBS?" ,0x00,0x00,ID_GetMemoryStatus },
3669// /* Samsung phones reply +CPBR: after OK --claudio*/
3487 {ATGEN_ReplyGetCPBRMemoryInfo, "AT+CPBR=?" ,0x00,0x00,ID_GetMemoryStatus }, 3670 {ATGEN_ReplyGetCPBRMemoryInfo, "AT+CPBR=?" ,0x00,0x00,ID_GetMemoryStatus },
3671 {ATGEN_ReplyGetCPBRMemoryInfo, "+CPBR:" ,0x00,0x00,ID_GetMemoryStatus },
3488 {ATGEN_ReplyGetCPBRMemoryStatus,"AT+CPBR=" ,0x00,0x00,ID_GetMemoryStatus }, 3672 {ATGEN_ReplyGetCPBRMemoryStatus,"AT+CPBR=" ,0x00,0x00,ID_GetMemoryStatus },
3489 {ATGEN_GenericReply, "AT+CSCS=" ,0x00,0x00,ID_SetMemoryCharset }, 3673 {ATGEN_GenericReply, "AT+CSCS=" ,0x00,0x00,ID_SetMemoryCharset },
3490 {ATGEN_ReplyGetMemory, "AT+CPBR=" ,0x00,0x00,ID_GetMemory }, 3674 {ATGEN_ReplyGetMemory, "AT+CPBR=" ,0x00,0x00,ID_GetMemory },
3491 {ATGEN_GenericReply, "AT^SBNR=?" ,0x00,0x00,ID_GetMemory }, 3675 {ATGEN_GenericReply, "AT^SBNR=?" ,0x00,0x00,ID_GetMemory },
3492 {ATGEN_SL45ReplyGetMemory, "AT^SBNR" ,0x00,0x00,ID_GetMemory }, 3676 {SIEMENS_ReplyGetMemory, "AT^SBNR" ,0x00,0x00,ID_GetMemory },
3493 {ATGEN_ReplySetMemory, "AT+CPBW" ,0x00,0x00,ID_SetMemory }, 3677 {ATGEN_ReplySetMemory, "AT+CPBW" ,0x00,0x00,ID_SetMemory },
3494 3678
3495 {ATGEN_CMS35ReplyGetBitmap, "AT^SBNR=\"bmp\"" ,0x00,0x00,ID_GetBitmap }, 3679 {SIEMENS_ReplyGetBitmap, "AT^SBNR=\"bmp\"" ,0x00,0x00,ID_GetBitmap },
3496 {ATGEN_CMS35ReplySetBitmap, "AT^SBNW=\"bmp\"" ,0x00,0x00,ID_SetBitmap }, 3680 {SIEMENS_ReplySetBitmap, "AT^SBNW=\"bmp\"" ,0x00,0x00,ID_SetBitmap },
3497 3681
3498 {ATGEN_CMS35ReplyGetRingtone, "AT^SBNR=\"mid\"" ,0x00,0x00,ID_GetRingtone }, 3682 {SIEMENS_ReplyGetRingtone, "AT^SBNR=\"mid\"" ,0x00,0x00,ID_GetRingtone },
3499 {ATGEN_CMS35ReplySetRingtone, "AT^SBNW=\"mid\"" ,0x00,0x00,ID_SetRingtone }, 3683 {SIEMENS_ReplySetRingtone, "AT^SBNW=\"mid\"" ,0x00,0x00,ID_SetRingtone },
3500 3684
3501 {ATGEN_CMS35ReplyGetNextCal, "AT^SBNR=\"vcs\"" ,0x00,0x00,ID_GetCalendarNote }, 3685 {SIEMENS_ReplyGetNextCalendar, "AT^SBNR=\"vcs\"" ,0x00,0x00,ID_GetCalendarNote },
3502 {ATGEN_CMS35ReplySetCalendar, "AT^SBNW=\"vcs\"" ,0x00,0x00,ID_SetCalendarNote }, 3686 {SIEMENS_ReplyAddCalendarNote, "AT^SBNW=\"vcs\"" ,0x00,0x00,ID_SetCalendarNote },
3503 {ATGEN_CMS35ReplyDeleteCalendar,"AT^SBNW=\"vcs\"",0x00,0x00,ID_DeleteCalendarNote }, 3687 {SIEMENS_ReplyDelCalendarNote, "AT^SBNW=\"vcs\"",0x00,0x00,ID_DeleteCalendarNote },
3504 3688
3505 {ATGEN_ReplyEnterSecurityCode, "AT+CPIN=" ,0x00,0x00,ID_EnterSecurityCode }, 3689 {ATGEN_ReplyEnterSecurityCode, "AT+CPIN=" ,0x00,0x00,ID_EnterSecurityCode },
3506 {ATGEN_ReplyEnterSecurityCode, "AT+CPIN2=" ,0x00,0x00,ID_EnterSecurityCode }, 3690 {ATGEN_ReplyEnterSecurityCode, "AT+CPIN2=" ,0x00,0x00,ID_EnterSecurityCode },
3507 {ATGEN_ReplyGetSecurityStatus, "AT+CPIN?" ,0x00,0x00,ID_GetSecurityStatus }, 3691 {ATGEN_ReplyGetSecurityStatus, "AT+CPIN?" ,0x00,0x00,ID_GetSecurityStatus },
3508 {ATGEN_ReplyOK, "OK" ,0x00,0x00,ID_IncomingFrame }, 3692 {ATGEN_ReplyOK, "OK" ,0x00,0x00,ID_IncomingFrame },
3509 3693
3510 {ATGEN_GenericReply, "AT+VTS" ,0x00,0x00,ID_SendDTMF }, 3694 {ATGEN_GenericReply, "AT+VTS" ,0x00,0x00,ID_SendDTMF },
3511 {ATGEN_ReplyCancelCall, "AT+CHUP" ,0x00,0x00,ID_CancelCall }, 3695 {ATGEN_ReplyCancelCall, "AT+CHUP" ,0x00,0x00,ID_CancelCall },
3512 {ATGEN_ReplyDialVoice, "ATDT" ,0x00,0x00,ID_DialVoice }, 3696 {ATGEN_ReplyDialVoice, "ATDT" ,0x00,0x00,ID_DialVoice },
3513 {ATGEN_ReplyCancelCall, "ATH" ,0x00,0x00,ID_CancelCall }, 3697 {ATGEN_ReplyCancelCall, "ATH" ,0x00,0x00,ID_CancelCall },
3698 {ATGEN_GenericReply, "AT+CUSD" ,0x00,0x00,ID_SetUSSD },
3699 {ATGEN_ReplyGetUSSD, "+CUSD" ,0x00,0x00,ID_IncomingFrame },
3514 {ATGEN_GenericReply, "AT+CLIP=1" ,0x00,0x00,ID_IncomingFrame }, 3700 {ATGEN_GenericReply, "AT+CLIP=1" ,0x00,0x00,ID_IncomingFrame },
3515 {ATGEN_ReplyIncomingCallInfo, "+CLIP" ,0x00,0x00,ID_IncomingFrame }, 3701 {ATGEN_ReplyIncomingCallInfo, "+CLIP" ,0x00,0x00,ID_IncomingFrame },
3516 {ATGEN_ReplyIncomingCallInfo, "+COLP" ,0x00,0x00,ID_IncomingFrame }, 3702 {ATGEN_ReplyIncomingCallInfo, "+COLP" ,0x00,0x00,ID_IncomingFrame },
3517 {ATGEN_ReplyIncomingCallInfo, "RING" ,0x00,0x00,ID_IncomingFrame }, 3703 {ATGEN_ReplyIncomingCallInfo, "RING" ,0x00,0x00,ID_IncomingFrame },
3518 {ATGEN_ReplyIncomingCallInfo, "NO CARRIER" ,0x00,0x00,ID_IncomingFrame }, 3704 {ATGEN_ReplyIncomingCallInfo, "NO CARRIER" ,0x00,0x00,ID_IncomingFrame },
3519 3705
3520 {ATGEN_ReplyReset, "AT^SRESET" ,0x00,0x00,ID_Reset }, 3706 {ATGEN_ReplyReset, "AT^SRESET" ,0x00,0x00,ID_Reset },
3521 {ATGEN_ReplyReset, "AT+CFUN=1,1" ,0x00,0x00,ID_Reset }, 3707 {ATGEN_ReplyReset, "AT+CFUN=1,1" ,0x00,0x00,ID_Reset },
3522 {ATGEN_ReplyResetPhoneSettings, "AT&F" ,0x00,0x00,ID_ResetPhoneSettings }, 3708 {ATGEN_ReplyResetPhoneSettings, "AT&F" ,0x00,0x00,ID_ResetPhoneSettings },
3523 3709
3710 {SAMSUNG_ReplyGetBitmap, "AT+IMGR=" ,0x00,0x00,ID_GetBitmap },
3711 {SAMSUNG_ReplySetBitmap, "SDNDCRC =" ,0x00,0x00,ID_SetBitmap },
3712
3713 {SAMSUNG_ReplyGetRingtone, "AT+MELR=" ,0x00,0x00,ID_GetRingtone },
3714 {SAMSUNG_ReplySetRingtone, "SDNDCRC =" ,0x00,0x00,ID_SetRingtone },
3715
3524#ifdef GSM_ENABLE_ALCATEL 3716#ifdef GSM_ENABLE_ALCATEL
3525/* Why do I give Alcatel specific things here? It's simple, Alcatel needs 3717/* Why do I give Alcatel specific things here? It's simple, Alcatel needs
3526 * some AT commands to start it's binary mode, so this needs to be in AT 3718 * some AT commands to start it's binary mode, so this needs to be in AT
3527 * related stuff. 3719 * related stuff.
3528 * 3720 *
3529 * XXX: AT+IFC could later move outside this ifdef, because it is not Alcatel 3721 * XXX: AT+IFC could later move outside this ifdef, because it is not Alcatel
3530 * specific and it's part of ETSI specifications 3722 * specific and it's part of ETSI specifications
3531 */ 3723 */
3532 {ATGEN_GenericReply, "AT+IFC" ,0x00,0x00,ID_SetFlowControl }, 3724 {ATGEN_GenericReply, "AT+IFC" ,0x00,0x00,ID_SetFlowControl },
3533 {ALCATEL_ProtocolVersionReply, "AT+CPROT=?" ,0x00,0x00,ID_AlcatelProtocol }, 3725 {ALCATEL_ProtocolVersionReply, "AT+CPROT=?" ,0x00,0x00,ID_AlcatelProtocol },
3534 {ATGEN_GenericReply, "AT+CPROT" ,0x00,0x00,ID_AlcatelConnect }, 3726 {ATGEN_GenericReply, "AT+CPROT" ,0x00,0x00,ID_AlcatelConnect },
3535#endif 3727#endif
3536 3728
3537 {NULL, "\x00" ,0x00,0x00,ID_None } 3729 {NULL, "\x00" ,0x00,0x00,ID_None }
3538}; 3730};
3539 3731
3540GSM_Phone_Functions ATGENPhone = { 3732GSM_Phone_Functions ATGENPhone = {
3541 "A2D|iPAQ|at|M20|S25|MC35|C35i|5110|5130|5190|5210|6110|6130|6150|6190|6210|6250|6310|6310i|6510|7110|8210|8250|8290|8310|8390|8850|8855|8890|8910|9110|9210", 3733 "A2D|iPAQ|at|M20|S25|MC35|TC35|C35i|S300|5110|5130|5190|5210|6110|6130|6150|6190|6210|6250|6310|6310i|6510|7110|8210|8250|8290|8310|8390|8850|8855|8890|8910|9110|9210",
3542 ATGENReplyFunctions, 3734 ATGENReplyFunctions,
3543 ATGEN_Initialise, 3735 ATGEN_Initialise,
3544 ATGEN_Terminate, 3736 ATGEN_Terminate,
3545 ATGEN_DispatchMessage, 3737 ATGEN_DispatchMessage,
3546 NOTSUPPORTED, /* ShowStartInfo */ 3738 NOTSUPPORTED, /* ShowStartInfo */
3547 ATGEN_GetManufacturer, 3739 ATGEN_GetManufacturer,
3548 ATGEN_GetModel, 3740 ATGEN_GetModel,
3549 ATGEN_GetFirmware, 3741 ATGEN_GetFirmware,
3550 ATGEN_GetIMEI, 3742 ATGEN_GetIMEI,
3551 NOTSUPPORTED, /* GetOriginalIMEI */ 3743 NOTSUPPORTED, /* GetOriginalIMEI */
3552 NOTSUPPORTED, /* GetManufactureMonth*/ 3744 NOTSUPPORTED, /* GetManufactureMonth*/
3553 NOTSUPPORTED, /* GetProductCode */ 3745 NOTSUPPORTED, /* GetProductCode */
3554 NOTSUPPORTED, /* GetHardware */ 3746 NOTSUPPORTED, /* GetHardware */
3555 NOTSUPPORTED, /* GetPPM */ 3747 NOTSUPPORTED, /* GetPPM */
3556 ATGEN_GetSIMIMSI, 3748 ATGEN_GetSIMIMSI,
3557 ATGEN_GetDateTime, 3749 ATGEN_GetDateTime,
3558 ATGEN_SetDateTime, 3750 ATGEN_SetDateTime,
3559 ATGEN_GetAlarm, 3751 ATGEN_GetAlarm,
3560 NOTIMPLEMENTED, /* SetAlarm */ 3752 ATGEN_SetAlarm,
3561 NOTSUPPORTED, /* GetLocale */ 3753 ATGEN_GetLocale,
3562 NOTSUPPORTED, /* SetLocale */ 3754 ATGEN_SetLocale,
3563 ATGEN_PressKey, 3755 ATGEN_PressKey,
3564 ATGEN_Reset, 3756 ATGEN_Reset,
3565 ATGEN_ResetPhoneSettings, 3757 ATGEN_ResetPhoneSettings,
3566 ATGEN_EnterSecurityCode, 3758 ATGEN_EnterSecurityCode,
3567 ATGEN_GetSecurityStatus, 3759 ATGEN_GetSecurityStatus,
3568 ATGEN_GetDisplayStatus, 3760 ATGEN_GetDisplayStatus,
3569 ATGEN_SetAutoNetworkLogin, 3761 ATGEN_SetAutoNetworkLogin,
3570 ATGEN_GetBatteryCharge, 3762 ATGEN_GetBatteryCharge,
3571 ATGEN_GetSignalQuality, 3763 ATGEN_GetSignalQuality,
3572 ATGEN_GetNetworkInfo, 3764 ATGEN_GetNetworkInfo,
3573 NOTSUPPORTED, /* GetCategory */ 3765 NOTSUPPORTED, /* GetCategory */
3574 NOTSUPPORTED, /* AddCategory */ 3766 NOTSUPPORTED, /* AddCategory */
3575 NOTSUPPORTED, /* GetCategoryStatus */ 3767 NOTSUPPORTED, /* GetCategoryStatus */
3576 ATGEN_GetMemoryStatus, 3768 ATGEN_GetMemoryStatus,
3577 ATGEN_GetMemory, 3769 ATGEN_GetMemory,
3578 ATGEN_GetNextMemory, 3770 ATGEN_GetNextMemory,
3579 ATGEN_SetMemory, 3771 ATGEN_SetMemory,
3580 ATGEN_AddMemory, 3772 ATGEN_AddMemory,
3581 ATGEN_DeleteMemory, 3773 ATGEN_DeleteMemory,
3582 ATGEN_DeleteAllMemory, 3774 ATGEN_DeleteAllMemory,
3583 NOTSUPPORTED, /* GetSpeedDial */ 3775 NOTSUPPORTED, /* GetSpeedDial */
3584 NOTSUPPORTED, /* SetSpeedDial */ 3776 NOTSUPPORTED, /* SetSpeedDial */
3585 ATGEN_GetSMSC, 3777 ATGEN_GetSMSC,
3586 ATGEN_SetSMSC, 3778 ATGEN_SetSMSC,
3587 ATGEN_GetSMSStatus, 3779 ATGEN_GetSMSStatus,
3588 ATGEN_GetSMS, 3780 ATGEN_GetSMS,
3589 ATGEN_GetNextSMS, 3781 ATGEN_GetNextSMS,
3590 NOTSUPPORTED, /* SetSMS */ 3782 NOTSUPPORTED, /* SetSMS */
3591 ATGEN_AddSMS, 3783 ATGEN_AddSMS,
3592 ATGEN_DeleteSMS, 3784 ATGEN_DeleteSMS,
3593 ATGEN_SendSMS, 3785 ATGEN_SendSMS,
3594 ATGEN_SendSavedSMS, 3786 ATGEN_SendSavedSMS,
3787 ATGEN_SetFastSMSSending,
3595 ATGEN_SetIncomingSMS, 3788 ATGEN_SetIncomingSMS,
3596 ATGEN_SetIncomingCB, 3789 ATGEN_SetIncomingCB,
3597 ATGEN_GetSMSFolders, 3790 ATGEN_GetSMSFolders,
3598 NOTSUPPORTED, /* AddSMSFolder */ 3791 NOTSUPPORTED, /* AddSMSFolder */
3599 NOTSUPPORTED, /* DeleteSMSFolder */ 3792 NOTSUPPORTED, /* DeleteSMSFolder */
3600 ATGEN_DialVoice, 3793 ATGEN_DialVoice,
3601 ATGEN_AnswerCall, 3794 ATGEN_AnswerCall,
3602 ATGEN_CancelCall, 3795 ATGEN_CancelCall,
3603 NOTSUPPORTED, /* HoldCall */ 3796 NOTSUPPORTED, /* HoldCall */
3604 NOTSUPPORTED, /* UnholdCall */ 3797 NOTSUPPORTED, /* UnholdCall */
3605 NOTSUPPORTED, /* ConferenceCall */ 3798 NOTSUPPORTED, /* ConferenceCall */
3606 NOTSUPPORTED, /* SplitCall */ 3799 NOTSUPPORTED, /* SplitCall */
3607 NOTSUPPORTED, /* TransferCall */ 3800 NOTSUPPORTED, /* TransferCall */
3608 NOTSUPPORTED, /* SwitchCall */ 3801 NOTSUPPORTED, /* SwitchCall */
3609 NOTSUPPORTED, /* GetCallDivert */ 3802 NOTSUPPORTED, /* GetCallDivert */
3610 NOTSUPPORTED, /* SetCallDivert */ 3803 NOTSUPPORTED, /* SetCallDivert */
3611 NOTSUPPORTED, /* CancelAllDiverts*/ 3804 NOTSUPPORTED, /* CancelAllDiverts*/
3612 NONEFUNCTION, /* SetIncomingCall */ 3805 NONEFUNCTION, /* SetIncomingCall */
3613 NOTSUPPORTED, /* SetIncomingUSSD */ 3806 ATGEN_SetIncomingUSSD,
3614 ATGEN_SendDTMF, 3807 ATGEN_SendDTMF,
3615 ATGEN_GetRingtone, 3808 ATGEN_GetRingtone,
3616 ATGEN_SetRingtone, 3809 ATGEN_SetRingtone,
3617 NOTSUPPORTED, /* GetRingtonesInfo*/ 3810 NOTSUPPORTED, /* GetRingtonesInfo*/
3618 NOTSUPPORTED, /* DeleteUserRingtones*/ 3811 NOTSUPPORTED, /* DeleteUserRingtones*/
3619 NOTSUPPORTED, /* PlayTone */ 3812 NOTSUPPORTED, /* PlayTone */
3620 NOTSUPPORTED, /* GetWAPBookmark */ 3813 NOTSUPPORTED, /* GetWAPBookmark */
3621 NOTSUPPORTED, /* SetWAPBookmark */ 3814 NOTSUPPORTED, /* SetWAPBookmark */
3622 NOTSUPPORTED, /* DeleteWAPBookmark */ 3815 NOTSUPPORTED, /* DeleteWAPBookmark */
3623 NOTSUPPORTED, /* GetWAPSettings */ 3816 NOTSUPPORTED, /* GetWAPSettings */
3624 NOTSUPPORTED, /* SetWAPSettings */ 3817 NOTSUPPORTED, /* SetWAPSettings */
3625 NOTSUPPORTED, /* GetMMSSettings */ 3818 NOTSUPPORTED, /* GetMMSSettings */
3626 NOTSUPPORTED, /* SetMMSSettings */ 3819 NOTSUPPORTED, /* SetMMSSettings */
3627 NOTSUPPORTED, /* GetSyncMLSettings*/ 3820 NOTSUPPORTED, /* GetSyncMLSettings*/
3628 NOTSUPPORTED, /* SetSyncMLSettings*/ 3821 NOTSUPPORTED, /* SetSyncMLSettings*/
3629 NOTSUPPORTED, /* GetChatSettings */ 3822 NOTSUPPORTED, /* GetChatSettings */
3630 NOTSUPPORTED, /* SetChatSettings */ 3823 NOTSUPPORTED, /* SetChatSettings */
3631 ATGEN_GetBitmap, /* GetBitmap */ 3824 ATGEN_GetBitmap, /* GetBitmap */
3632 ATGEN_SetBitmap, /* SetBitmap */ 3825 ATGEN_SetBitmap, /* SetBitmap */
3633 SONYERIC_GetToDoStatus, 3826 SONYERIC_GetToDoStatus,
3634 NOTSUPPORTED, /* GetToDo */ 3827 NOTSUPPORTED, /* GetToDo */
3635 SONYERIC_GetNextToDo, 3828 SONYERIC_GetNextToDo,
3636 NOTSUPPORTED, /* SetToDo */ 3829 NOTSUPPORTED, /* SetToDo */
3637 SONYERIC_AddToDo, 3830 SONYERIC_AddToDo,
3638 NOTSUPPORTED, /* DeleteToDo */ 3831 NOTSUPPORTED, /* DeleteToDo */
3639 SONYERIC_DeleteAllToDo, 3832 SONYERIC_DeleteAllToDo,
3640 SONYERIC_GetCalendarStatus, 3833 SONYERIC_GetCalendarStatus,
3641 NOTIMPLEMENTED, /* GetCalendar */ 3834 NOTIMPLEMENTED, /* GetCalendar */
3642 ATGEN_GetNextCalendar, 3835 ATGEN_GetNextCalendar,
3643 NOTIMPLEMENTED, /* SetCalendar */ 3836 NOTIMPLEMENTED, /* SetCalendar */
3644 ATGEN_AddCalendarNote, 3837 ATGEN_AddCalendarNote,
3645 ATGEN_DelCalendarNote, 3838 ATGEN_DelCalendarNote,
3646 NOTIMPLEMENTED, /* DeleteAllCalendar*/ 3839 NOTIMPLEMENTED, /* DeleteAllCalendar*/
3647 NOTSUPPORTED, /* GetCalendarSettings*/ 3840 NOTSUPPORTED, /* GetCalendarSettings*/
3648 NOTSUPPORTED, /* SetCalendarSettings*/ 3841 NOTSUPPORTED, /* SetCalendarSettings*/
3649 NOTSUPPORTED, /* GetNote */ 3842 NOTSUPPORTED, /* GetNextNote */
3650 NOTSUPPORTED, /* GetProfile */ 3843 NOTSUPPORTED, /* GetProfile */
3651 NOTSUPPORTED, /* SetProfile */ 3844 NOTSUPPORTED, /* SetProfile */
3652 NOTSUPPORTED, /* GetFMStation */ 3845 NOTSUPPORTED, /* GetFMStation */
3653 NOTSUPPORTED, /* SetFMStation */ 3846 NOTSUPPORTED, /* SetFMStation */
3654 NOTSUPPORTED, /* ClearFMStations */ 3847 NOTSUPPORTED, /* ClearFMStations */
3655 NOTSUPPORTED, /* GetNextFileFolder*/ 3848 NOTSUPPORTED, /* GetNextFileFolder*/
3656 NOTSUPPORTED, /* GetFilePart */ 3849 NOTSUPPORTED, /* GetFilePart */
3657 NOTSUPPORTED, /* AddFile */ 3850 NOTSUPPORTED, /* AddFile */
3658 NOTSUPPORTED, /* GetFileSystemStatus*/ 3851 NOTSUPPORTED, /* GetFileSystemStatus*/
3659 NOTSUPPORTED, /* DeleteFile */ 3852 NOTSUPPORTED, /* DeleteFile */
3660 NOTSUPPORTED, /* AddFolder */ 3853 NOTSUPPORTED, /* AddFolder */
3661 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 3854 NOTSUPPORTED, /* GetGPRSAccessPoint*/
3662 NOTSUPPORTED /* SetGPRSAccessPoint*/ 3855 NOTSUPPORTED /* SetGPRSAccessPoint*/
3663}; 3856};
3664 3857
3665#endif 3858#endif
3666 3859
3667/* How should editor hadle tabs in this file? Add editor commands here. 3860/* How should editor hadle tabs in this file? Add editor commands here.
3668 * vim: noexpandtab sw=8 ts=8 sts=8: 3861 * vim: noexpandtab sw=8 ts=8 sts=8:
3669 */ 3862 */
diff --git a/gammu/emb/common/phone/at/atgen.h b/gammu/emb/common/phone/at/atgen.h
index 0e08ee4..bb5c559 100644
--- a/gammu/emb/common/phone/at/atgen.h
+++ b/gammu/emb/common/phone/at/atgen.h
@@ -1,110 +1,116 @@
1/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */ 1/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */
2 2
3#ifndef atgen_h 3#ifndef atgen_h
4#define atgen_h 4#define atgen_h
5 5
6#include "../../gsmcomon.h" 6#include "../../gsmcomon.h"
7#include "../../gsmstate.h" 7#include "../../gsmstate.h"
8#include "../../service/sms/gsmsms.h" 8#include "../../service/sms/gsmsms.h"
9 9
10#ifndef GSM_USED_AT 10#ifndef GSM_USED_AT
11# define GSM_USED_AT 11# define GSM_USED_AT
12#endif 12#endif
13#ifndef GSM_USED_BLUEAT 13#ifndef GSM_USED_BLUEAT
14# define GSM_USED_BLUEAT 14# define GSM_USED_BLUEAT
15#endif 15#endif
16#ifndef GSM_USED_IRDAAT 16#ifndef GSM_USED_IRDAAT
17# define GSM_USED_IRDAAT 17# define GSM_USED_IRDAAT
18#endif 18#endif
19 19
20#define MAX_VCALENDAR_LOCATION 50 20#define MAX_VCALENDAR_LOCATION 50
21 21
22typedef enum { 22typedef enum {
23 SMS_AT_PDU = 1, 23 SMS_AT_PDU = 1,
24 SMS_AT_TXT 24 SMS_AT_TXT
25} GSM_AT_SMS_Modes; 25} GSM_AT_SMS_Modes;
26 26
27typedef enum { 27typedef enum {
28 AT_Reply_OK = 1, 28 AT_Reply_OK = 1,
29 AT_Reply_Connect, 29 AT_Reply_Connect,
30 AT_Reply_Error, 30 AT_Reply_Error,
31 AT_Reply_Unknown, 31 AT_Reply_Unknown,
32 AT_Reply_CMSError, 32 AT_Reply_CMSError,
33 AT_Reply_CMEError, 33 AT_Reply_CMEError,
34 AT_Reply_SMSEdit 34 AT_Reply_SMSEdit
35} GSM_AT_Reply_State; 35} GSM_AT_Reply_State;
36 36
37typedef enum { 37typedef enum {
38 AT_Nokia = 1, 38 AT_Nokia = 1,
39 AT_Alcatel, 39 AT_Alcatel,
40 AT_Siemens, 40 AT_Siemens,
41 AT_HP, 41 AT_HP,
42 AT_Falcom, 42 AT_Falcom,
43 AT_Ericsson, 43 AT_Ericsson,
44 AT_Sagem, 44 AT_Sagem,
45 AT_Samsung,
45 AT_Unknown 46 AT_Unknown
46} GSM_AT_Manufacturer; 47} GSM_AT_Manufacturer;
47 48
48typedef enum { 49typedef enum {
49 AT_PBK_HEX = 1, 50 AT_PBK_HEX = 1,
50 AT_PBK_GSM, 51 AT_PBK_GSM,
51 AT_PBK_UCS2 52 AT_PBK_UCS2,
53 AT_PBK_PCCP437
52} GSM_AT_PBK_Charset; 54} GSM_AT_PBK_Charset;
53 55
54typedef enum { 56typedef enum {
55 AT_AVAILABLE = 1, 57 AT_AVAILABLE = 1,
56 AT_NOTAVAILABLE 58 AT_NOTAVAILABLE
57} GSM_AT_SMSMemory; 59} GSM_AT_SMSMemory;
58 60
59typedef enum { 61typedef enum {
60 AT_SBNR_AVAILABLE = 1, 62 AT_SBNR_AVAILABLE = 1,
61 AT_SBNR_NOTAVAILABLE 63 AT_SBNR_NOTAVAILABLE
62} GSM_AT_SBNR; 64} GSM_AT_SBNR;
63 65
64typedef enum { 66typedef enum {
65 AT_Status, 67 AT_Status,
66 AT_NextEmpty, 68 AT_NextEmpty,
67 AT_Total, 69 AT_Total,
68 AT_First, 70 AT_First,
69 AT_Sizes 71 AT_Sizes
70} GSM_AT_NeededMemoryInfo; 72} GSM_AT_NeededMemoryInfo;
71 73
72 #define AT_PBK_MAX_MEMORIES200 74 #define AT_PBK_MAX_MEMORIES200
73 75
74typedef struct { 76typedef struct {
75 GSM_AT_Manufacturer Manufacturer; /* Who is manufacturer */ 77 GSM_AT_Manufacturer Manufacturer; /* Who is manufacturer */
76 GSM_Lines Lines; /* Allow to simply get each line in response */ 78 GSM_Lines Lines; /* Allow to simply get each line in response */
77 GSM_AT_Reply_State ReplyState; /* What response type - error, OK, etc. */ 79 GSM_AT_Reply_State ReplyState; /* What response type - error, OK, etc. */
78 int ErrorCode; /* Error codes from responses */ 80 int ErrorCode; /* Error codes from responses */
79 char *ErrorText; /* Error description */ 81 char *ErrorText; /* Error description */
80 82
81 GSM_MemoryType PBKMemory; /* Last read PBK memory */ 83 GSM_MemoryType PBKMemory; /* Last read PBK memory */
82 char PBKMemories[AT_PBK_MAX_MEMORIES + 1]; /* Supported by phone PBK memories */ 84 char PBKMemories[AT_PBK_MAX_MEMORIES + 1]; /* Supported by phone PBK memories */
83 int NextMemoryEntry; /* Next empty memory entry */ 85 int NextMemoryEntry; /* Next empty memory entry */
84 int FirstMemoryEntry; /* First memory entry to be read */ 86 int FirstMemoryEntry; /* First memory entry to be read */
85 GSM_AT_PBK_Charset PBKCharset; /* Last read PBK charset */ 87 GSM_AT_PBK_Charset PBKCharset; /* Last read PBK charset */
86 bool UCS2CharsetFailed; /* Whether setting of UCS2 charset has already failed */ 88 bool UCS2CharsetFailed; /* Whether setting of UCS2 charset has already failed */
87 bool NonUCS2CharsetFailed; /* Whether setting of non-UCS2 charset has already failed */ 89 bool NonUCS2CharsetFailed; /* Whether setting of non-UCS2 charset has already failed */
88 GSM_AT_SBNR PBKSBNR; 90 GSM_AT_SBNR PBKSBNR;
89 int NumberLength; 91 int NumberLength;
90 int TextLength; 92 int TextLength;
91 int MemorySize; 93 int MemorySize;
92 94
93 GSM_SMSMemoryStatusLastSMSStatus; 95 GSM_SMSMemoryStatusLastSMSStatus;
94 int LastSMSRead; 96 int LastSMSRead;
95 int FirstCalendarPos; 97 int FirstCalendarPos;
96 bool CanSaveSMS; 98 bool CanSaveSMS;
97 GSM_AT_SMSMemory PhoneSMSMemory; /* Is phone SMS memory available ? */ 99 GSM_AT_SMSMemory PhoneSMSMemory; /* Is phone SMS memory available ? */
98 GSM_AT_SMSMemory SIMSMSMemory; /* Is SIM SMS memory available ? */ 100 GSM_AT_SMSMemory SIMSMSMemory; /* Is SIM SMS memory available ? */
99 GSM_MemoryType SMSMemory; /* Last read SMS memory */ 101 GSM_MemoryType SMSMemory; /* Last read SMS memory */
100 GSM_AT_SMS_Modes SMSMode; /* PDU or TEXT mode for SMS ? */ 102 GSM_AT_SMS_Modes SMSMode; /* PDU or TEXT mode for SMS ? */
101 103
102 bool OBEX; 104 bool OBEX;
103 GSM_File file; 105 GSM_File file;
104} GSM_Phone_ATGENData; 106} GSM_Phone_ATGENData;
105 107
108 GSM_Error ATGEN_HandleCMSError(GSM_StateMachine *);
109 GSM_Error ATGEN_HandleCMEError(GSM_StateMachine *);
110 GSM_Error ATGEN_DispatchMessage(GSM_StateMachine *);
111
106#endif 112#endif
107 113
108/* How should editor hadle tabs in this file? Add editor commands here. 114/* How should editor hadle tabs in this file? Add editor commands here.
109 * vim: noexpandtab sw=8 ts=8 sts=8: 115 * vim: noexpandtab sw=8 ts=8 sts=8:
110 */ 116 */
diff --git a/gammu/emb/common/phone/at/samsung.c b/gammu/emb/common/phone/at/samsung.c
new file mode 100644
index 0000000..55a42e5
--- a/dev/null
+++ b/gammu/emb/common/phone/at/samsung.c
@@ -0,0 +1,447 @@
1/* Samsung-specific functions
2 * Copyright (C) 2004 Claudio Matsuoka <cmatsuoka@gmail.com>
3 * Tested with S300 only!
4 */
5
6#include "../../gsmstate.h"
7
8#ifdef GSM_ENABLE_ATGEN
9
10#include <string.h>
11#include <time.h>
12#include <ctype.h>
13
14#include "../../misc/coding/coding.h"
15#include "../../gsmcomon.h"
16#include "../../service/sms/gsmsms.h"
17#include "../pfunc.h"
18
19#include "atgen.h"
20#include "samsung.h"
21
22/* Binary frame size */
23#define BLKSZ 1024
24
25struct ModelRes {
26 char *model;
27 int width;
28 int height;
29};
30
31static struct ModelRes modres[] = {
32 { "S100", 128, 128 },
33 { "S200", 128, 113 },
34 { "S300", 128, 97 },
35 { "S500", 128, 128 },
36 { "T100", 128, 128 },
37 { "E700", 128, 128 },
38 { NULL, 0, 0 }
39};
40
41/*
42 * CRC functions from the Granch SBNI12 Linux driver by
43 * Denis I. Timofeev <timofeev@granch.ru>
44 */
45static unsigned int crc32tab[] = {
46 0xD202EF8D, 0xA505DF1B, 0x3C0C8EA1, 0x4B0BBE37,
47 0xD56F2B94, 0xA2681B02, 0x3B614AB8, 0x4C667A2E,
48 0xDCD967BF, 0xABDE5729, 0x32D70693, 0x45D03605,
49 0xDBB4A3A6, 0xACB39330, 0x35BAC28A, 0x42BDF21C,
50 0xCFB5FFE9, 0xB8B2CF7F, 0x21BB9EC5, 0x56BCAE53,
51 0xC8D83BF0, 0xBFDF0B66, 0x26D65ADC, 0x51D16A4A,
52 0xC16E77DB, 0xB669474D, 0x2F6016F7, 0x58672661,
53 0xC603B3C2, 0xB1048354, 0x280DD2EE, 0x5F0AE278,
54 0xE96CCF45, 0x9E6BFFD3, 0x0762AE69, 0x70659EFF,
55 0xEE010B5C, 0x99063BCA, 0x000F6A70, 0x77085AE6,
56 0xE7B74777, 0x90B077E1, 0x09B9265B, 0x7EBE16CD,
57 0xE0DA836E, 0x97DDB3F8, 0x0ED4E242, 0x79D3D2D4,
58 0xF4DBDF21, 0x83DCEFB7, 0x1AD5BE0D, 0x6DD28E9B,
59 0xF3B61B38, 0x84B12BAE, 0x1DB87A14, 0x6ABF4A82,
60 0xFA005713, 0x8D076785, 0x140E363F, 0x630906A9,
61 0xFD6D930A, 0x8A6AA39C, 0x1363F226, 0x6464C2B0,
62 0xA4DEAE1D, 0xD3D99E8B, 0x4AD0CF31, 0x3DD7FFA7,
63 0xA3B36A04, 0xD4B45A92, 0x4DBD0B28, 0x3ABA3BBE,
64 0xAA05262F, 0xDD0216B9, 0x440B4703, 0x330C7795,
65 0xAD68E236, 0xDA6FD2A0, 0x4366831A, 0x3461B38C,
66 0xB969BE79, 0xCE6E8EEF, 0x5767DF55, 0x2060EFC3,
67 0xBE047A60, 0xC9034AF6, 0x500A1B4C, 0x270D2BDA,
68 0xB7B2364B, 0xC0B506DD, 0x59BC5767, 0x2EBB67F1,
69 0xB0DFF252, 0xC7D8C2C4, 0x5ED1937E, 0x29D6A3E8,
70 0x9FB08ED5, 0xE8B7BE43, 0x71BEEFF9, 0x06B9DF6F,
71 0x98DD4ACC, 0xEFDA7A5A, 0x76D32BE0, 0x01D41B76,
72 0x916B06E7, 0xE66C3671, 0x7F6567CB, 0x0862575D,
73 0x9606C2FE, 0xE101F268, 0x7808A3D2, 0x0F0F9344,
74 0x82079EB1, 0xF500AE27, 0x6C09FF9D, 0x1B0ECF0B,
75 0x856A5AA8, 0xF26D6A3E, 0x6B643B84, 0x1C630B12,
76 0x8CDC1683, 0xFBDB2615, 0x62D277AF, 0x15D54739,
77 0x8BB1D29A, 0xFCB6E20C, 0x65BFB3B6, 0x12B88320,
78 0x3FBA6CAD, 0x48BD5C3B, 0xD1B40D81, 0xA6B33D17,
79 0x38D7A8B4, 0x4FD09822, 0xD6D9C998, 0xA1DEF90E,
80 0x3161E49F, 0x4666D409, 0xDF6F85B3, 0xA868B525,
81 0x360C2086, 0x410B1010, 0xD80241AA, 0xAF05713C,
82 0x220D7CC9, 0x550A4C5F, 0xCC031DE5, 0xBB042D73,
83 0x2560B8D0, 0x52678846, 0xCB6ED9FC, 0xBC69E96A,
84 0x2CD6F4FB, 0x5BD1C46D, 0xC2D895D7, 0xB5DFA541,
85 0x2BBB30E2, 0x5CBC0074, 0xC5B551CE, 0xB2B26158,
86 0x04D44C65, 0x73D37CF3, 0xEADA2D49, 0x9DDD1DDF,
87 0x03B9887C, 0x74BEB8EA, 0xEDB7E950, 0x9AB0D9C6,
88 0x0A0FC457, 0x7D08F4C1, 0xE401A57B, 0x930695ED,
89 0x0D62004E, 0x7A6530D8, 0xE36C6162, 0x946B51F4,
90 0x19635C01, 0x6E646C97, 0xF76D3D2D, 0x806A0DBB,
91 0x1E0E9818, 0x6909A88E, 0xF000F934, 0x8707C9A2,
92 0x17B8D433, 0x60BFE4A5, 0xF9B6B51F, 0x8EB18589,
93 0x10D5102A, 0x67D220BC, 0xFEDB7106, 0x89DC4190,
94 0x49662D3D, 0x3E611DAB, 0xA7684C11, 0xD06F7C87,
95 0x4E0BE924, 0x390CD9B2, 0xA0058808, 0xD702B89E,
96 0x47BDA50F, 0x30BA9599, 0xA9B3C423, 0xDEB4F4B5,
97 0x40D06116, 0x37D75180, 0xAEDE003A, 0xD9D930AC,
98 0x54D13D59, 0x23D60DCF, 0xBADF5C75, 0xCDD86CE3,
99 0x53BCF940, 0x24BBC9D6, 0xBDB2986C, 0xCAB5A8FA,
100 0x5A0AB56B, 0x2D0D85FD, 0xB404D447, 0xC303E4D1,
101 0x5D677172, 0x2A6041E4, 0xB369105E, 0xC46E20C8,
102 0x72080DF5, 0x050F3D63, 0x9C066CD9, 0xEB015C4F,
103 0x7565C9EC, 0x0262F97A, 0x9B6BA8C0, 0xEC6C9856,
104 0x7CD385C7, 0x0BD4B551, 0x92DDE4EB, 0xE5DAD47D,
105 0x7BBE41DE, 0x0CB97148, 0x95B020F2, 0xE2B71064,
106 0x6FBF1D91, 0x18B82D07, 0x81B17CBD, 0xF6B64C2B,
107 0x68D2D988, 0x1FD5E91E, 0x86DCB8A4, 0xF1DB8832,
108 0x616495A3, 0x1663A535, 0x8F6AF48F, 0xF86DC419,
109 0x660951BA, 0x110E612C, 0x88073096, 0xFF000000
110};
111
112static unsigned int GetCRC(char *data, int size)
113{
114 unsigned int crc = 0;
115
116 while (size--)
117 crc = crc32tab[(crc ^ *data++) & 0xff] ^ ((crc >> 8) & 0x00FFFFFF);
118
119 return crc;
120}
121
122/*
123 * Frame transfer
124 */
125
126static GSM_Error WaitFor(GSM_StateMachine *s, char *t, int ttl)
127{
128 char readbuf[100];
129 int n;
130 unsigned int sec;
131 GSM_DateTime Date;
132
133 GSM_GetCurrentDateTime (&Date);
134 sec = Date.Second;
135
136 n = s->Device.Functions->ReadDevice(s, readbuf, 80);
137 readbuf[n] = 0;
138 while (strstr(readbuf, t) == NULL && (sec + ttl) >= Date.Second) {
139 my_sleep(5000);
140 n = s->Device.Functions->ReadDevice(s, readbuf, 80);
141 readbuf[n] = 0;
142 GSM_GetCurrentDateTime (&Date);
143 }
144
145 return (sec + ttl) >= Date.Second ? ERR_NONE : ERR_TIMEOUT;
146}
147
148static GSM_Error SetSamsungFrame(GSM_StateMachine *s, unsigned char *buff, int size, GSM_Phone_RequestID id)
149{
150 GSM_Phone_Data *Phone = &s->Phone.Data;
151 GSM_Error error;
152 int i, count;
153
154 count = size / BLKSZ;
155
156 for (i = 0; i < count; i++) {
157 error = WaitFor(s, ">", 4);
158 if (error!=ERR_NONE) return error;
159
160 error = s->Protocol.Functions->WriteMessage(s,
161 buff + i * BLKSZ, BLKSZ, 0x00);
162 if (error!=ERR_NONE) return error;
163 }
164
165 error = WaitFor(s, ">", 4);
166 if (error!=ERR_NONE) return error;
167 error = s->Protocol.Functions->WriteMessage(s,
168 buff + i * BLKSZ, size%BLKSZ, 0x00);
169 if (error!=ERR_NONE) return error;
170
171 error = GSM_WaitFor(s, "", 0, 0x00, 4, id);
172 if (error!=ERR_NONE) return error;
173
174 return Phone->DispatchError;
175}
176
177/* Answer format for binary data transfer
178 *
179 * SDNDCRC = 0xa : RECEIVECRC = 0xcbf53a1c : BINSIZE = 5
180 * CRCERR
181 */
182static GSM_Error ReplySetSamsungFrame(GSM_Protocol_Message msg, GSM_StateMachine *s)
183{
184 unsigned long txcrc, rxcrc;
185 int binsize;
186 char *pos;
187
188 /* Parse SDNDCRC */
189 pos = strchr(msg.Buffer, '=');
190 if (!pos) return ERR_UNKNOWN;
191 pos++;
192 txcrc = strtoul(pos, NULL, 0);
193 smprintf(s, "Sent CRC : 0x%lx\n", txcrc);
194
195 /* Parse RECEIVECRC */
196 pos = strchr(pos, '=');
197 if (!pos) return ERR_UNKNOWN;
198 pos++;
199 rxcrc = strtoul(pos, NULL, 0);
200 smprintf(s, "Reveived CRC : 0x%lx\n", rxcrc);
201
202 /* Parse BINSIZE */
203 pos = strchr(pos, '=');
204 if (!pos) return ERR_UNKNOWN;
205 pos++;
206 binsize = strtoul(pos, NULL, 0);
207 smprintf(s, "Binary size : %d\n", binsize);
208
209 return txcrc == rxcrc ? ERR_NONE : ERR_WRONGCRC;
210}
211
212/*
213 * Bitmaps
214 */
215
216GSM_Error SAMSUNG_ReplyGetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s)
217{
218 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
219 unsigned char buffer[32];
220 char *pos;
221 int location, count;
222
223 switch (Priv->ReplyState) {
224 case AT_Reply_OK:
225 smprintf(s, "Bitmap info received\n");
226 /* Parse +IMGR:location,name,0,0,0,0 */
227
228 /* Parse location */
229 pos = strchr(msg.Buffer, ':');
230 if (!pos) return ERR_UNKNOWN;
231 pos++;
232 location = atoi(pos);
233 smprintf(s, "Location : %d\n", location);
234
235 /* Parse name */
236 pos = strchr(pos, '"');
237 if (!pos) return ERR_UNKNOWN;
238 pos++;
239 for (count = 0; count < 31; count++) {
240 if (pos[count] == '"')
241 break;
242 buffer[count] = pos[count];
243 }
244 buffer[count] = 0;
245 smprintf(s, "Name : %s\n", buffer);
246 s->Phone.Data.Bitmap->Name = malloc((strlen(buffer) + 1) * 2);
247 if (s->Phone.Data.Bitmap->Name == NULL)
248 return ERR_MOREMEMORY;
249 EncodeUnicode(s->Phone.Data.Bitmap->Name, buffer, strlen(buffer));
250
251 s->Phone.Data.Bitmap->Location = location;
252
253 return ERR_NONE;
254 case AT_Reply_Error:
255 return ERR_UNKNOWN;
256 case AT_Reply_CMSError:
257 return ATGEN_HandleCMSError(s);
258 case AT_Reply_CMEError:
259 return ATGEN_HandleCMEError(s);
260 default:
261 return ERR_UNKNOWNRESPONSE;
262 }
263}
264
265GSM_Error SAMSUNG_ReplySetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s)
266{
267 smprintf(s, "Bitmap sent\n");
268 return ReplySetSamsungFrame(msg, s);
269}
270
271GSM_Error SAMSUNG_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
272{
273 unsigned char req[100];
274
275 s->Phone.Data.Bitmap=Bitmap;
276 smprintf(s, "Getting bitmap\n");
277 sprintf(req, "AT+IMGR=%d\r", Bitmap->Location-1);
278 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetBitmap);
279}
280
281GSM_Error SAMSUNG_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
282{
283 unsigned charreq[100];
284 unsigned longcrc;
285 GSM_Errorerror;
286 char name[50], *dot, *model;
287 GSM_Phone_Data *Data = &s->Phone.Data;
288 int i;
289
290 s->Phone.Data.Bitmap = Bitmap;
291 smprintf(s, "Setting bitmap\n");
292
293 if (Bitmap->Type != GSM_PictureBinary) {
294 smprintf(s, "Invalid picture type\n");
295 return ERR_INVALIDDATA;
296 }
297
298 if (Bitmap->BinaryPic.Type != PICTURE_GIF) {
299 smprintf(s, "Invalid binary picture type\n");
300 return ERR_INVALIDDATA;
301 }
302
303 /* Check if picture size matches phone model */
304 model = GetModelData(NULL,Data->Model,NULL)->model;
305 smprintf(s, "Checking picture size for %s\n", model);
306 for (i = 0; modres[i].model; i++) {
307 if (!strcmp(model, modres[i].model)) {
308 if (Bitmap->BitmapWidth != modres[i].width ||
309 Bitmap->BitmapHeight != modres[i].height) {
310 smprintf(s, "Model %s must use %d x %d picture size\n",
311 modres[i].model, modres[i].width,
312 modres[i].height);
313 return ERR_INVALIDDATA;
314 }
315 break;
316 }
317 }
318 if (modres[i].model == NULL) {
319 smprintf(s, "Model \"%s\" is not supported.\n", Data->Model);
320 return ERR_NOTSUPPORTED;
321 }
322
323 crc = GetCRC(Bitmap->BinaryPic.Buffer, Bitmap->BinaryPic.Length);
324
325 /* Remove extension from file name */
326 strncpy(name, DecodeUnicodeString(Bitmap->Name), 50);
327 if ((dot = strrchr(name, '.')) != NULL)
328 *dot = 0;
329
330 sprintf(req, "AT+IMGW=0,\"%s\",2,0,0,0,0,100,%d,%u\r", name,
331 Bitmap->BinaryPic.Length, (unsigned int)crc);
332
333 error = s->Protocol.Functions->WriteMessage(s, req, strlen(req), 0x00);
334 if (error!=ERR_NONE) return error;
335
336 return SetSamsungFrame(s, Bitmap->BinaryPic.Buffer,
337 Bitmap->BinaryPic.Length, ID_SetBitmap);
338}
339
340/*
341 * Ringtones
342 */
343
344GSM_Error SAMSUNG_ReplyGetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s)
345{
346 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
347 unsigned char buffer[32];
348 char *pos;
349 int location, length, count;
350
351 switch (Priv->ReplyState) {
352 case AT_Reply_OK:
353 smprintf(s, "Ringtone info received\n");
354 /* Parse +MELR:location,name,size */
355
356 /* Parse location */
357 pos = strchr(msg.Buffer, ':');
358 if (!pos) return ERR_UNKNOWN;
359 pos++;
360 location = atoi(pos);
361 smprintf(s, "Location : %d\n", location);
362
363 /* Parse name */
364 pos = strchr(pos, '"');
365 if (!pos) return ERR_UNKNOWN;
366 pos++;
367 /* Ringtone.Name size is 20 chars */
368 for (count = 0; count < 19; count++) {
369 if (pos[count] == '"')
370 break;
371 buffer[count] = pos[count];
372 }
373 buffer[count] = 0;
374 smprintf(s, "Name : %s\n", buffer);
375 EncodeUnicode(s->Phone.Data.Ringtone->Name,buffer,strlen(buffer));
376
377 /* Parse ringtone length */
378 pos = strchr(pos, ',');
379 if (!pos) return ERR_UNKNOWN;
380 pos++;
381 length = atoi(pos);
382 smprintf(s, "Length : %d\n", length);
383
384 /* S300 ringtones are always MMF */
385 s->Phone.Data.Ringtone->Format = RING_MMF;
386 s->Phone.Data.Ringtone->Location = location;
387 s->Phone.Data.Ringtone->BinaryTone.Length = length;
388
389 return ERR_NONE;
390 case AT_Reply_Error:
391 return ERR_UNKNOWN;
392 case AT_Reply_CMSError:
393 return ATGEN_HandleCMSError(s);
394 case AT_Reply_CMEError:
395 return ATGEN_HandleCMEError(s);
396 default:
397 return ERR_UNKNOWNRESPONSE;
398 }
399}
400
401GSM_Error SAMSUNG_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone)
402{
403 unsigned char req[100];
404
405 s->Phone.Data.Ringtone = Ringtone;
406 smprintf(s, "Getting ringtone\n");
407 sprintf(req, "AT+MELR=%d\r", Ringtone->Location-1);
408 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetRingtone);
409}
410
411GSM_Error SAMSUNG_ReplySetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s)
412{
413 smprintf(s, "Ringtone sent\n");
414 return ReplySetSamsungFrame(msg, s);
415}
416
417GSM_Error SAMSUNG_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
418{
419 unsigned charreq[100];
420 unsigned longcrc;
421 GSM_Errorerror;
422 char name[50], *dot;
423
424 s->Phone.Data.Ringtone = Ringtone;
425 smprintf(s, "Setting ringtone\n");
426
427 if (Ringtone->Format != RING_MMF) {
428 smprintf(s, "Not MMF ringtone\n");
429 return ERR_INVALIDDATA;
430 }
431
432 /* Remove extension from file name */
433 strncpy(name, DecodeUnicodeString(Ringtone->Name), 50);
434 if ((dot = strrchr(name, '.')) != NULL) *dot = 0;
435
436 crc = GetCRC(Ringtone->BinaryTone.Buffer, Ringtone->BinaryTone.Length);
437 sprintf(req, "AT+MELW=0,\"%s\",4,%d,%u\r", name,
438 Ringtone->BinaryTone.Length, (unsigned int)crc);
439
440 error = s->Protocol.Functions->WriteMessage(s, req, strlen(req), 0x00);
441 if (error!=ERR_NONE) return error;
442
443 return SetSamsungFrame(s, Ringtone->BinaryTone.Buffer,
444 Ringtone->BinaryTone.Length, ID_SetRingtone);
445}
446
447#endif
diff --git a/gammu/emb/common/phone/at/samsung.h b/gammu/emb/common/phone/at/samsung.h
new file mode 100644
index 0000000..3b2947c
--- a/dev/null
+++ b/gammu/emb/common/phone/at/samsung.h
@@ -0,0 +1,16 @@
1#ifndef samsung_h
2#define samsung_h
3
4#include "../../gsmstate.h"
5
6 GSM_Error SAMSUNG_ReplyGetRingtone(GSM_Protocol_Message, GSM_StateMachine *);
7 GSM_Error SAMSUNG_ReplySetRingtone(GSM_Protocol_Message, GSM_StateMachine *);
8 GSM_Error SAMSUNG_ReplyGetBitmap(GSM_Protocol_Message, GSM_StateMachine *);
9 GSM_Error SAMSUNG_ReplySetBitmap(GSM_Protocol_Message, GSM_StateMachine *);
10 GSM_Error SAMSUNG_GetRingtone (GSM_StateMachine *, GSM_Ringtone *, bool);
11 GSM_Error SAMSUNG_SetRingtone (GSM_StateMachine *, GSM_Ringtone *, int *);
12 GSM_Error SAMSUNG_GetBitmap (GSM_StateMachine *, GSM_Bitmap *);
13 GSM_Error SAMSUNG_SetBitmap (GSM_StateMachine *, GSM_Bitmap *);
14 GSM_Error SAMSUNG_GetCallLogs (GSM_StateMachine *, GSM_MemoryEntry *, int);
15
16#endif
diff --git a/gammu/emb/common/phone/at/siemens.c b/gammu/emb/common/phone/at/siemens.c
index ab7dd2c..7f66cf8 100644
--- a/gammu/emb/common/phone/at/siemens.c
+++ b/gammu/emb/common/phone/at/siemens.c
@@ -1,320 +1,316 @@
1/* (c) 2002-2003 by Walek */ 1/* (c) 2002-2003 by Walek */
2 2
3#include "../../gsmstate.h" 3#include "../../gsmstate.h"
4 4
5#ifdef GSM_ENABLE_ATGEN 5#ifdef GSM_ENABLE_ATGEN
6 6
7#include <string.h> 7#include <string.h>
8#include <time.h> 8#include <time.h>
9#include <ctype.h> 9#include <ctype.h>
10 10
11#include "../../misc/coding/coding.h" 11#include "../../misc/coding/coding.h"
12#include "../../gsmcomon.h" 12#include "../../gsmcomon.h"
13#include "../../service/sms/gsmsms.h" 13#include "../../service/sms/gsmsms.h"
14#include "../pfunc.h" 14#include "../pfunc.h"
15 15
16extern GSM_Error ATGEN_HandleCMSError(GSM_StateMachine *s); 16#include "atgen.h"
17#include "siemens.h"
17 18
18GSM_Error ATGEN_CMS35ReplySetFunction (GSM_Protocol_Message msg, GSM_StateMachine *s,char *function)
19{
20 if (s->Protocol.Data.AT.EditMode) {
21 s->Protocol.Data.AT.EditMode = false;
22 return ERR_NONE;
23 }
24 dbgprintf ("Written %s",function);
25 if (s->Phone.Data.Priv.ATGEN.ReplyState == AT_Reply_OK){
26 dbgprintf (" - OK\n");
27 return ERR_NONE;
28 } else {
29 dbgprintf (" - error\n");
30 return ERR_UNKNOWN;
31 }
32}
33 19
34GSM_Error GetSiemensFrame(GSM_Protocol_Message msg, GSM_StateMachine *s, char *templ, 20static GSM_Error GetSiemensFrame(GSM_Protocol_Message msg, GSM_StateMachine *s, char *templ,
35 unsigned char *buffer, int *len) 21 unsigned char *buffer, int *len)
36{ 22{
37 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 23 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
38 int i=2, pos=0, length=0; 24 int i=2, pos=0, length=0;
39 unsigned char buf[512]; 25 unsigned char buf[512];
40 26
41 if (strstr(GetLineString(msg.Buffer,Priv->Lines,2),"OK")) return ERR_EMPTY; 27 if (strstr(GetLineString(msg.Buffer,Priv->Lines,2),"OK")) return ERR_EMPTY;
42 if (!strstr(GetLineString(msg.Buffer,Priv->Lines,2),templ)) return ERR_UNKNOWN; 28 if (!strstr(GetLineString(msg.Buffer,Priv->Lines,2),templ)) return ERR_UNKNOWN;
43 29
44 while (1) { 30 while (1) {
45 if (Priv->Lines.numbers[i*2+1]==0) break; 31 if (Priv->Lines.numbers[i*2+1]==0) break;
46 if ((!strstr(GetLineString(msg.Buffer,Priv->Lines,i+1),templ)) && 32 if ((!strstr(GetLineString(msg.Buffer,Priv->Lines,i+1),templ)) &&
47 (strstr(GetLineString(msg.Buffer,Priv->Lines,i),templ))){ 33 (strstr(GetLineString(msg.Buffer,Priv->Lines,i),templ))){
48 length = strlen(GetLineString(msg.Buffer,Priv->Lines,i+1)); 34 length = strlen(GetLineString(msg.Buffer,Priv->Lines,i+1));
49 DecodeHexBin(buf, GetLineString(msg.Buffer,Priv->Lines,i+1),length); 35 DecodeHexBin(buf, GetLineString(msg.Buffer,Priv->Lines,i+1),length);
50 length = length/2; 36 length = length/2;
51 memcpy (buffer+pos,buf,length); 37 memcpy (buffer+pos,buf,length);
52 pos+=length; 38 pos+=length;
53 } 39 }
54 i++; 40 i++;
55 } 41 }
56 *len = pos; 42 *len = pos;
57 return ERR_NONE; 43 return ERR_NONE;
58} 44}
59 45
60GSM_Error SetSiemensFrame (GSM_StateMachine *s, unsigned char *buff, char *templ, 46static GSM_Error SetSiemensFrame (GSM_StateMachine *s, unsigned char *buff, char *templ,
61 int Location, GSM_Phone_RequestID RequestID, int len) 47 int Location, GSM_Phone_RequestID RequestID, int len)
62{ 48{
63 GSM_Phone_Data *Phone = &s->Phone.Data; 49 GSM_Phone_Data *Phone = &s->Phone.Data;
64 GSM_Error error; 50 GSM_Error error;
65 unsigned char req[20],req1[512],hexreq[2096]; 51 unsigned char req[20],req1[512],hexreq[2096];
66 int MaxFrame,CurrentFrame,size,sz,pos=0; 52 int MaxFrame,CurrentFrame,size,sz,pos=0;
67 53
68 EncodeHexBin(hexreq,buff,len); 54 EncodeHexBin(hexreq,buff,len);
69 size = len * 2; 55 size = len * 2;
70 MaxFrame = size / 352; 56 MaxFrame = size / 352;
71 if (size % 352) MaxFrame++; 57 if (size % 352) MaxFrame++;
72 58
73 for (CurrentFrame=0;CurrentFrame<MaxFrame;CurrentFrame++) { 59 for (CurrentFrame=0;CurrentFrame<MaxFrame;CurrentFrame++) {
74 pos=CurrentFrame*352; 60 pos=CurrentFrame*352;
75 if (pos+352 < size) sz = 352; else sz = size - pos; 61 if (pos+352 < size) sz = 352; else sz = size - pos;
76 sprintf(req, "AT^SBNW=\"%s\",%i,%i,%i\r",templ,Location,CurrentFrame+1,MaxFrame); 62 sprintf(req, "AT^SBNW=\"%s\",%i,%i,%i\r",templ,Location,CurrentFrame+1,MaxFrame);
77 s->Protocol.Data.AT.EditMode = true; 63 s->Protocol.Data.AT.EditMode = true;
78 error = GSM_WaitFor (s, req, strlen(req), 0x00, 3, RequestID); 64 error = GSM_WaitFor (s, req, strlen(req), 0x00, 3, RequestID);
79 s->Phone.Data.DispatchError=ERR_TIMEOUT; 65 s->Phone.Data.DispatchError=ERR_TIMEOUT;
80 s->Phone.Data.RequestID=RequestID; 66 s->Phone.Data.RequestID=RequestID;
81 if (error!=ERR_NONE) return error; 67 if (error!=ERR_NONE) return error;
82 memcpy (req1,hexreq+pos,sz); 68 memcpy (req1,hexreq+pos,sz);
83 error = s->Protocol.Functions->WriteMessage(s, req1, sz, 0x00); 69 error = s->Protocol.Functions->WriteMessage(s, req1, sz, 0x00);
84 if (error!=ERR_NONE) return error; 70 if (error!=ERR_NONE) return error;
85 error = s->Protocol.Functions->WriteMessage(s,"\x1A", 1, 0x00); 71 error = s->Protocol.Functions->WriteMessage(s,"\x1A", 1, 0x00);
86 if (error!=ERR_NONE) return error; 72 if (error!=ERR_NONE) return error;
87 error = GSM_WaitForOnce(s, NULL, 0x00, 0x00, 4); 73 error = GSM_WaitForOnce(s, NULL, 0x00, 0x00, 4);
88 if (error == ERR_TIMEOUT) return error; 74 if (error == ERR_TIMEOUT) return error;
89 } 75 }
90 return Phone->DispatchError; 76 return Phone->DispatchError;
91} 77}
92 78
93GSM_Error ATGEN_CMS35ReplyGetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s) 79GSM_Error SIEMENS_ReplyGetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s)
94{ 80{
95 unsigned char buffer[4096]; 81 unsigned char buffer[4096];
96 int length; 82 int length;
97 GSM_Error error; 83 GSM_Error error;
98 84
99 error = GetSiemensFrame(msg,s,"bmp",buffer,&length); 85 error = GetSiemensFrame(msg,s,"bmp",buffer,&length);
100 if (error!=ERR_NONE) return error; 86 if (error!=ERR_NONE) return error;
101 dbgprintf ("Operator logo received lenght=%i\n",length); 87 dbgprintf ("Operator logo received lenght=%i\n",length);
102 error = BMP2Bitmap (buffer,NULL,s->Phone.Data.Bitmap); 88 error = BMP2Bitmap (buffer,NULL,s->Phone.Data.Bitmap);
103 if (error==ERR_NONE) return error; 89 if (error==ERR_NONE) return error;
104 else return ERR_UNKNOWN; 90 else return ERR_UNKNOWN;
105} 91}
106 92
107GSM_Error ATGEN_CMS35ReplySetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s) 93GSM_Error SIEMENS_ReplySetFunction (GSM_Protocol_Message msg, GSM_StateMachine *s,char *function)
108{ 94{
109 return ATGEN_CMS35ReplySetFunction (msg, s, "Operator Logo"); 95 if (s->Protocol.Data.AT.EditMode) {
96 s->Protocol.Data.AT.EditMode = false;
97 return ERR_NONE;
98 }
99 dbgprintf ("Written %s",function);
100 if (s->Phone.Data.Priv.ATGEN.ReplyState == AT_Reply_OK){
101 dbgprintf (" - OK\n");
102 return ERR_NONE;
103 } else {
104 dbgprintf (" - error\n");
105 return ERR_UNKNOWN;
106 }
110} 107}
111 108
112GSM_Error ATGEN_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap) 109GSM_Error SIEMENS_ReplySetBitmap(GSM_Protocol_Message msg, GSM_StateMachine *s)
110{
111 return SIEMENS_ReplySetFunction (msg, s, "Operator Logo");
112}
113
114GSM_Error SIEMENS_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
113{ 115{
114 unsigned char req[32]; 116 unsigned char req[32];
115 117
116 if (s->Phone.Data.Priv.ATGEN.Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
117 if (Bitmap->Type!=GSM_OperatorLogo) return ERR_NOTSUPPORTED; 118 if (Bitmap->Type!=GSM_OperatorLogo) return ERR_NOTSUPPORTED;
118 if (Bitmap->Location-1 < 0) Bitmap->Location++; 119 if (Bitmap->Location-1 < 0) Bitmap->Location++;
119 s->Phone.Data.Bitmap=Bitmap; 120 s->Phone.Data.Bitmap=Bitmap;
120 sprintf(req, "AT^SBNR=\"bmp\",%i\r", Bitmap->Location-1); 121 sprintf(req, "AT^SBNR=\"bmp\",%i\r", Bitmap->Location-1);
121 smprintf(s, "Getting Bitmap\n"); 122 smprintf(s, "Getting Bitmap\n");
122 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetBitmap); 123 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetBitmap);
123} 124}
124 125
125GSM_Error ATGEN_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap) 126GSM_Error SIEMENS_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
126{ 127{
127 unsigned char buffer[4096]; 128 unsigned char buffer[4096];
128 int length; 129 int length;
129 GSM_Errorerror; 130 GSM_Errorerror;
130 131
131 if (s->Phone.Data.Priv.ATGEN.Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
132 if (Bitmap->Type!=GSM_OperatorLogo) return ERR_NOTSUPPORTED; 132 if (Bitmap->Type!=GSM_OperatorLogo) return ERR_NOTSUPPORTED;
133 133
134 error = Bitmap2BMP (buffer,NULL,Bitmap); 134 error = Bitmap2BMP (buffer,NULL,Bitmap);
135 if (error!=ERR_NONE) return error; 135 if (error!=ERR_NONE) return error;
136 length = 0x100 * buffer[3] + buffer[2]; 136 length = 0x100 * buffer[3] + buffer[2];
137 buffer[58]=0xff; buffer[59]=0xff; buffer[60]=0xff; 137 buffer[58]=0xff; buffer[59]=0xff; buffer[60]=0xff;
138 if (Bitmap->Location-1 < 0) Bitmap->Location++; 138 if (Bitmap->Location-1 < 0) Bitmap->Location++;
139 s->Phone.Data.Bitmap=Bitmap; 139 s->Phone.Data.Bitmap=Bitmap;
140 return SetSiemensFrame(s, buffer,"bmp",Bitmap->Location-1, 140 return SetSiemensFrame(s, buffer,"bmp",Bitmap->Location-1,
141 ID_SetBitmap,length); 141 ID_SetBitmap,length);
142} 142}
143 143
144GSM_Error ATGEN_CMS35ReplyGetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s) 144GSM_Error SIEMENS_ReplyGetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s)
145{ 145{
146 unsigned char buffer[32]; 146 unsigned char buffer[32];
147 int length; 147 int length;
148 GSM_Error error; 148 GSM_Error error;
149 149
150 error = GetSiemensFrame(msg,s,"mid",s->Phone.Data.Ringtone->NokiaBinary.Frame,&length); 150 error = GetSiemensFrame(msg,s,"mid",s->Phone.Data.Ringtone->NokiaBinary.Frame,&length);
151 if (error!=ERR_NONE) return error; 151 if (error!=ERR_NONE) return error;
152 dbgprintf ("Midi ringtone received\n"); 152 dbgprintf ("Midi ringtone received\n");
153 153
154 s->Phone.Data.Ringtone->Format = RING_MIDI; 154 s->Phone.Data.Ringtone->Format = RING_MIDI;
155 s->Phone.Data.Ringtone->NokiaBinary.Length= length; 155 s->Phone.Data.Ringtone->NokiaBinary.Length= length;
156 sprintf(buffer,"Individual"); 156 sprintf(buffer,"Individual");
157 EncodeUnicode (s->Phone.Data.Ringtone->Name,buffer,strlen(buffer)); 157 EncodeUnicode (s->Phone.Data.Ringtone->Name,buffer,strlen(buffer));
158 return ERR_NONE; 158 return ERR_NONE;
159} 159}
160 160
161GSM_Error ATGEN_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone) 161GSM_Error SIEMENS_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone)
162{ 162{
163 unsigned char req[32]; 163 unsigned char req[32];
164 164
165 if (s->Phone.Data.Priv.ATGEN.Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
166
167 s->Phone.Data.Ringtone=Ringtone; 165 s->Phone.Data.Ringtone=Ringtone;
168 sprintf(req, "AT^SBNR=\"mid\",%i\r", Ringtone->Location-1); 166 sprintf(req, "AT^SBNR=\"mid\",%i\r", Ringtone->Location-1);
169 smprintf(s, "Getting RingTone\n"); 167 smprintf(s, "Getting RingTone\n");
170 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetRingtone); 168 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetRingtone);
171} 169}
172 170
173GSM_Error ATGEN_CMS35ReplySetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s) 171GSM_Error SIEMENS_ReplySetRingtone(GSM_Protocol_Message msg, GSM_StateMachine *s)
174{ 172{
175 return ATGEN_CMS35ReplySetFunction (msg, s, "Ringtone"); 173 return SIEMENS_ReplySetFunction (msg, s, "Ringtone");
176} 174}
177 175
178GSM_Error ATGEN_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength) 176GSM_Error SIEMENS_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
179{ 177{
180 GSM_Phone_Data *Phone = &s->Phone.Data; 178 GSM_Phone_Data *Phone = &s->Phone.Data;
181 179
182 if (s->Phone.Data.Priv.ATGEN.Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
183
184 if (Ringtone->Location==255) Ringtone->Location=1; 180 if (Ringtone->Location==255) Ringtone->Location=1;
185 if (Ringtone->Location-1 > 1) return ERR_INVALIDLOCATION; 181 if (Ringtone->Location-1 > 1) return ERR_INVALIDLOCATION;
186 182
187 s->Phone.Data.Ringtone= Ringtone; 183 s->Phone.Data.Ringtone= Ringtone;
188 Phone->Ringtone = Ringtone; 184 Phone->Ringtone = Ringtone;
189 return SetSiemensFrame(s, Ringtone->NokiaBinary.Frame,"mid",Ringtone->Location-1, 185 return SetSiemensFrame(s, Ringtone->NokiaBinary.Frame,"mid",Ringtone->Location-1,
190 ID_SetRingtone,Ringtone->NokiaBinary.Length); 186 ID_SetRingtone,Ringtone->NokiaBinary.Length);
191} 187}
192 188
193GSM_Error ATGEN_CMS35ReplyGetNextCal(GSM_Protocol_Message msg, GSM_StateMachine *s) 189GSM_Error SIEMENS_ReplyGetNextCalendar(GSM_Protocol_Message msg, GSM_StateMachine *s)
194{ 190{
195 GSM_Phone_Data *Data = &s->Phone.Data; 191 GSM_Phone_Data *Data = &s->Phone.Data;
196 GSM_CalendarEntry*Calendar = Data->Cal; 192 GSM_CalendarEntry*Calendar = Data->Cal;
197 GSM_ToDoEntry ToDo; 193 GSM_ToDoEntry ToDo;
198 GSM_Error error; 194 GSM_Error error;
199 unsigned char buffer[354]; 195 unsigned char buffer[354];
200 int len, pos=0; 196 int len, pos=0;
201 197
202 if (Data->Priv.ATGEN.ReplyState != AT_Reply_OK) return ERR_UNKNOWN; 198 if (Data->Priv.ATGEN.ReplyState != AT_Reply_OK) return ERR_UNKNOWN;
203 199
204 error = GetSiemensFrame(msg,s,"vcs",buffer,&len); 200 error = GetSiemensFrame(msg,s,"vcs",buffer,&len);
205 if (error!=ERR_NONE) return error; 201 if (error!=ERR_NONE) return error;
206 error=GSM_DecodeVCALENDAR_VTODO(buffer,&pos,Calendar,&ToDo,Siemens_VCalendar,0); 202 error=GSM_DecodeVCALENDAR_VTODO(buffer,&pos,Calendar,&ToDo,Siemens_VCalendar,0);
207 203
208 return error; 204 return error;
209} 205}
210 206
211GSM_Error SIEMENS_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start) 207GSM_Error SIEMENS_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start)
212{ 208{
213 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 209 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
214 GSM_Error error; 210 GSM_Error error;
215 unsigned char req[32]; 211 unsigned char req[32];
216 int Location; 212 int Location;
217 213
218 if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED; 214 if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
219 215
220 if (start) Note->Location=Priv->FirstCalendarPos; 216 if (start) Note->Location=Priv->FirstCalendarPos;
221 s->Phone.Data.Cal = Note; 217 s->Phone.Data.Cal = Note;
222 Note->EntriesNum = 0; 218 Note->EntriesNum = 0;
223 smprintf(s, "Getting VCALENDAR\n"); 219 smprintf(s, "Getting VCALENDAR\n");
224 Location = Note->Location; 220 Location = Note->Location;
225 while (1){ 221 while (1){
226 Location++; 222 Location++;
227 sprintf(req, "AT^SBNR=\"vcs\",%i\r",Location); 223 sprintf(req, "AT^SBNR=\"vcs\",%i\r",Location);
228 error = GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetCalendarNote); 224 error = GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_GetCalendarNote);
229 if ((error!=ERR_NONE) && (error!=ERR_EMPTY)) return ERR_INVALIDLOCATION; 225 if ((error!=ERR_NONE) && (error!=ERR_EMPTY)) return ERR_INVALIDLOCATION;
230 Note->Location = Location; 226 Note->Location = Location;
231 Priv->FirstCalendarPos = Location; 227 Priv->FirstCalendarPos = Location;
232 if (Location > MAX_VCALENDAR_LOCATION) return ERR_EMPTY; 228 if (Location > MAX_VCALENDAR_LOCATION) return ERR_EMPTY;
233 if (error==ERR_NONE) return error; 229 if (error==ERR_NONE) return error;
234 } 230 }
235 return error; 231 return error;
236} 232}
237 233
238GSM_Error ATGEN_CMS35ReplySetCalendar(GSM_Protocol_Message msg, GSM_StateMachine *s) 234GSM_Error SIEMENS_ReplyAddCalendarNote(GSM_Protocol_Message msg, GSM_StateMachine *s)
239{ 235{
240 return ATGEN_CMS35ReplySetFunction (msg, s, "Calendar Note"); 236 return SIEMENS_ReplySetFunction (msg, s, "Calendar Note");
241} 237}
242 238
243GSM_Error ATGEN_CMS35ReplyDeleteCalendar(GSM_Protocol_Message msg, GSM_StateMachine *s) 239GSM_Error SIEMENS_ReplyDelCalendarNote(GSM_Protocol_Message msg, GSM_StateMachine *s)
244{ 240{
245 GSM_Phone_Data *Data = &s->Phone.Data; 241 GSM_Phone_Data *Data = &s->Phone.Data;
246 242
247 if (Data->Cal->Location > MAX_VCALENDAR_LOCATION) return ERR_UNKNOWN; 243 if (Data->Cal->Location > MAX_VCALENDAR_LOCATION) return ERR_UNKNOWN;
248 244
249 if (Data->Priv.ATGEN.ReplyState== AT_Reply_OK) { 245 if (Data->Priv.ATGEN.ReplyState== AT_Reply_OK) {
250 smprintf(s, "Calendar note deleted\n"); 246 smprintf(s, "Calendar note deleted\n");
251 return ERR_NONE; 247 return ERR_NONE;
252 } else { 248 } else {
253 smprintf(s, "Can't delete calendar note\n"); 249 smprintf(s, "Can't delete calendar note\n");
254 return ERR_UNKNOWN; 250 return ERR_UNKNOWN;
255 } 251 }
256} 252}
257 253
258GSM_Error SIEMENS_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note) 254GSM_Error SIEMENS_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
259{ 255{
260 unsigned char req[32]; 256 unsigned char req[32];
261 257
262 if (s->Phone.Data.Priv.ATGEN.Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED; 258 if (s->Phone.Data.Priv.ATGEN.Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
263 s->Phone.Data.Cal = Note; 259 s->Phone.Data.Cal = Note;
264 sprintf(req, "AT^SBNW=\"vcs\",%i,0\r",Note->Location); 260 sprintf(req, "AT^SBNW=\"vcs\",%i,0\r",Note->Location);
265 smprintf(s, "Deleting calendar note\n"); 261 smprintf(s, "Deleting calendar note\n");
266 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_DeleteCalendarNote); 262 return GSM_WaitFor (s, req, strlen(req), 0x00, 4, ID_DeleteCalendarNote);
267} 263}
268 264
269GSM_Error SIEMENS_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note) 265GSM_Error SIEMENS_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
270{ 266{
271 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 267 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
272 GSM_Error error; 268 GSM_Error error;
273 unsigned char req[500]; 269 unsigned char req[500];
274 int size=0; 270 int size=0;
275 271
276 if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED; 272 if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
277 // if (Note->Location==0x00) return ERR_INVALIDLOCATION; 273 // if (Note->Location==0x00) return ERR_INVALIDLOCATION;
278 274
279 s->Phone.Data.Cal = Note; 275 s->Phone.Data.Cal = Note;
280 error=GSM_EncodeVCALENDAR(req,&size,Note,true,Siemens_VCalendar); 276 error=GSM_EncodeVCALENDAR(req,&size,Note,true,Siemens_VCalendar);
281 277
282 return SetSiemensFrame (s,req,"vcs",Note->Location,ID_SetCalendarNote,size); 278 return SetSiemensFrame (s,req,"vcs",Note->Location,ID_SetCalendarNote,size);
283} 279}
284 280
285/* (c) by Timo Teras */ 281/* (c) by Timo Teras */
286GSM_Error ATGEN_SL45ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s) 282GSM_Error SIEMENS_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s)
287{ 283{
288#ifndef ENABLE_LGPL 284#ifndef ENABLE_LGPL
289 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN; 285 GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
290 GSM_MemoryEntry *Memory = s->Phone.Data.Memory; 286 GSM_MemoryEntry *Memory = s->Phone.Data.Memory;
291 unsigned char buffer[500],buffer2[500]; 287 unsigned char buffer[500],buffer2[500];
292 288
293 switch (Priv->ReplyState) { 289 switch (Priv->ReplyState) {
294 case AT_Reply_OK: 290 case AT_Reply_OK:
295 smprintf(s, "Phonebook entry received\n"); 291 smprintf(s, "Phonebook entry received\n");
296 CopyLineString(buffer, msg.Buffer, Priv->Lines, 3); 292 CopyLineString(buffer, msg.Buffer, Priv->Lines, 3);
297 DecodeHexBin(buffer2,buffer,strlen(buffer)); 293 DecodeHexBin(buffer2,buffer,strlen(buffer));
298 Memory->EntriesNum = 0; 294 Memory->EntriesNum = 0;
299 DecodeVCARD21Text(buffer2, Memory); 295 DecodeVCARD21Text(buffer2, Memory);
300 if (Memory->EntriesNum == 0) return ERR_EMPTY; 296 if (Memory->EntriesNum == 0) return ERR_EMPTY;
301 return ERR_NONE; 297 return ERR_NONE;
302 case AT_Reply_Error: 298 case AT_Reply_Error:
303 smprintf(s, "Error - too high location ?\n"); 299 smprintf(s, "Error - too high location ?\n");
304 return ERR_INVALIDLOCATION; 300 return ERR_INVALIDLOCATION;
305 case AT_Reply_CMSError: 301 case AT_Reply_CMSError:
306 return ATGEN_HandleCMSError(s); 302 return ATGEN_HandleCMSError(s);
307 default: 303 default:
308 break; 304 break;
309 } 305 }
310 return ERR_UNKNOWNRESPONSE; 306 return ERR_UNKNOWNRESPONSE;
311#else 307#else
312 return ERR_NOTIMPLEMENTED; 308 return ERR_NOTIMPLEMENTED;
313#endif 309#endif
314} 310}
315 311
316#endif 312#endif
317 313
318/* How should editor hadle tabs in this file? Add editor commands here. 314/* How should editor hadle tabs in this file? Add editor commands here.
319 * vim: noexpandtab sw=8 ts=8 sts=8: 315 * vim: noexpandtab sw=8 ts=8 sts=8:
320 */ 316 */
diff --git a/gammu/emb/common/phone/at/sonyeric.c b/gammu/emb/common/phone/at/sonyeric.c
index 4b2670a..8eeb39b 100644
--- a/gammu/emb/common/phone/at/sonyeric.c
+++ b/gammu/emb/common/phone/at/sonyeric.c
@@ -1,72 +1,70 @@
1/* (c) 2003 by Marcin Wiacek */ 1/* (c) 2003 by Marcin Wiacek */
2 2
3#include "../../gsmstate.h" 3#include "../../gsmstate.h"
4 4
5#ifdef GSM_ENABLE_ATGEN 5#ifdef GSM_ENABLE_ATGEN
6 6
7#include <string.h> 7#include <string.h>
8#include <time.h> 8#include <time.h>
9#include <ctype.h> 9#include <ctype.h>
10 10
11#include "../../gsmcomon.h" 11#include "../../gsmcomon.h"
12#include "../../misc/coding/coding.h" 12#include "../../misc/coding/coding.h"
13 13
14 extern GSM_Reply_Function ATGENReplyFunctions[]; 14#include "atgen.h"
15 extern GSM_Error ATGEN_DispatchMessage(GSM_StateMachine *s); 15#include "sonyeric.h"
16 16
17#ifdef GSM_ENABLE_OBEXGEN 17#ifdef GSM_ENABLE_OBEXGEN
18 18
19 extern GSM_Reply_Function OBEXGENReplyFunctions[]; 19#include "../obex/obexgen.h"
20 extern GSM_Error OBEXGEN_GetFilePart(GSM_StateMachine *s, GSM_File *File);
21 extern GSM_Error OBEXGEN_AddFilePart(GSM_StateMachine *s, GSM_File *File, int *Pos);
22 extern GSM_Error OBEXGEN_Disconnect(GSM_StateMachine *s);
23 20
24#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 21 extern GSM_Reply_FunctionOBEXGENReplyFunctions[];
22 extern GSM_Reply_FunctionATGENReplyFunctions[];
25 23
26static GSM_Error SONYERIC_SetOBEXMode(GSM_StateMachine *s) 24static GSM_Error SONYERIC_SetOBEXMode(GSM_StateMachine *s)
27{ 25{
28 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 26 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
29 GSM_Error error; 27 GSM_Error error;
30 28
31 if (Priv->OBEX) return ERR_NONE; 29 if (Priv->OBEX) return ERR_NONE;
32 30
33 dbgprintf ("Changing to OBEX\n"); 31 dbgprintf ("Changing to OBEX\n");
34 32
35 error=GSM_WaitFor (s, "AT*EOBEX\r", 9, 0x00, 4, ID_SetOBEX); 33 error=GSM_WaitFor (s, "AT*EOBEX\r", 9, 0x00, 4, ID_SetOBEX);
36 if (error != ERR_NONE) return error; 34 if (error != ERR_NONE) return error;
37 35
38 error = s->Protocol.Functions->Terminate(s); 36 error = s->Protocol.Functions->Terminate(s);
39 if (error != ERR_NONE) return error; 37 if (error != ERR_NONE) return error;
40 38
41 s->Protocol.Functions = &OBEXProtocol; 39 s->Protocol.Functions = &OBEXProtocol;
42 error = s->Protocol.Functions->Initialise(s); 40 error = s->Protocol.Functions->Initialise(s);
43 if (error != ERR_NONE) { 41 if (error != ERR_NONE) {
44 s->Protocol.Functions = &ATProtocol; 42 s->Protocol.Functions = &ATProtocol;
45 return error; 43 return error;
46 } 44 }
47 strcpy(s->CurrentConfig->Model,"seobex"); 45 strcpy(s->CurrentConfig->Model,"seobex");
48 s->Phone.Data.Priv.OBEXGEN.Service = 0; 46 s->Phone.Data.Priv.OBEXGEN.Service = 0;
49 s->Phone.Functions->DispatchMessage= GSM_DispatchMessage; 47 s->Phone.Functions->DispatchMessage= GSM_DispatchMessage;
50 s->Phone.Functions->ReplyFunctions= OBEXGENReplyFunctions; 48 s->Phone.Functions->ReplyFunctions= OBEXGENReplyFunctions;
51 Priv->OBEX = true; 49 Priv->OBEX = true;
52 return ERR_NONE; 50 return ERR_NONE;
53} 51}
54 52
55static GSM_Error SONYERIC_SetATMode(GSM_StateMachine *s) 53static GSM_Error SONYERIC_SetATMode(GSM_StateMachine *s)
56{ 54{
57 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 55 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
58 GSM_Error error; 56 GSM_Error error;
59 57
60 if (!Priv->OBEX) return ERR_NONE; 58 if (!Priv->OBEX) return ERR_NONE;
61 59
62 dbgprintf ("Changing to AT\n"); 60 dbgprintf ("Changing to AT\n");
63 61
64 error = OBEXGEN_Disconnect(s); 62 error = OBEXGEN_Disconnect(s);
65 if (error != ERR_NONE) return error; 63 if (error != ERR_NONE) return error;
66 64
67 error = s->Protocol.Functions->Terminate(s); 65 error = s->Protocol.Functions->Terminate(s);
68 if (error != ERR_NONE) return error; 66 if (error != ERR_NONE) return error;
69 67
70 s->Protocol.Functions = &ATProtocol; 68 s->Protocol.Functions = &ATProtocol;
71 error = s->Protocol.Functions->Initialise(s); 69 error = s->Protocol.Functions->Initialise(s);
72 if (error != ERR_NONE) { 70 if (error != ERR_NONE) {
@@ -81,331 +79,442 @@ static GSM_Error SONYERIC_SetATMode(GSM_StateMachine *s)
81} 79}
82 80
83static GSM_Error SONYERIC_GetFile(GSM_StateMachine *s, GSM_File *File, unsigned char *FileName) 81static GSM_Error SONYERIC_GetFile(GSM_StateMachine *s, GSM_File *File, unsigned char *FileName)
84{ 82{
85 GSM_Error error; 83 GSM_Error error;
86 84
87 strcpy(File->ID_FullName,FileName); 85 strcpy(File->ID_FullName,FileName);
88 File->Used = 0; 86 File->Used = 0;
89 if (File->Buffer != NULL) free(File->Buffer); 87 if (File->Buffer != NULL) free(File->Buffer);
90 File->Buffer = NULL; 88 File->Buffer = NULL;
91 89
92 error = SONYERIC_SetOBEXMode(s); 90 error = SONYERIC_SetOBEXMode(s);
93 if (error != ERR_NONE) return error; 91 if (error != ERR_NONE) return error;
94 92
95 error = ERR_NONE; 93 error = ERR_NONE;
96 while (error == ERR_NONE) error = OBEXGEN_GetFilePart(s,File); 94 while (error == ERR_NONE) error = OBEXGEN_GetFilePart(s,File);
97 if (error != ERR_EMPTY) return error; 95 if (error != ERR_EMPTY) return error;
98 96
99 return SONYERIC_SetATMode(s); 97 return SONYERIC_SetATMode(s);
100} 98}
101 99
102static GSM_Error SONYERIC_SetFile(GSM_StateMachine *s, unsigned char *FileName, unsigned char *Buffer, int Length) 100static GSM_Error SONYERIC_SetFile(GSM_StateMachine *s, unsigned char *FileName, unsigned char *Buffer, int Length)
103{ 101{
104 GSM_Errorerror; 102 GSM_Errorerror;
105 GSM_File File; 103 GSM_File File;
106 int Pos = 0; 104 int Pos = 0;
107 105
108 error = SONYERIC_SetOBEXMode(s); 106 error = SONYERIC_SetOBEXMode(s);
109 if (error != ERR_NONE) return error; 107 if (error != ERR_NONE) return error;
110 108
111 strcpy(File.ID_FullName,FileName); 109 strcpy(File.ID_FullName,FileName);
112 EncodeUnicode(File.Name,FileName,strlen(FileName)); 110 EncodeUnicode(File.Name,FileName,strlen(FileName));
113 File.Used = Length; 111 File.Used = Length;
114 File.Buffer = malloc(Length); 112 File.Buffer = malloc(Length);
115 memcpy(File.Buffer,Buffer,Length); 113 memcpy(File.Buffer,Buffer,Length);
116 114
117 error = ERR_NONE; 115 error = ERR_NONE;
118 while (error == ERR_NONE) error = OBEXGEN_AddFilePart(s,&File,&Pos); 116 while (error == ERR_NONE) error = OBEXGEN_AddFilePart(s,&File,&Pos);
119 free(File.Buffer); 117 free(File.Buffer);
120 if (error != ERR_EMPTY) return error; 118 if (error != ERR_EMPTY) return error;
121 119
122 return SONYERIC_SetATMode(s); 120 return SONYERIC_SetATMode(s);
123} 121}
124 122
125#endif 123#endif
126 124
127GSM_Error SONYERIC_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start) 125GSM_Error SONYERIC_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start)
128{ 126{
129#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 127#ifdef GSM_ENABLE_OBEXGEN
130 GSM_Error error; 128 GSM_Error error;
131 GSM_ToDoEntry ToDo; 129 GSM_ToDoEntry ToDo;
132 int Pos, num, Loc; 130 int Pos, num, Loc;
133 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 131 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
134 132
135 if (start) { 133 if (start) {
136 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs"); 134 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs");
137 if (error != ERR_NONE) return error; 135 if (error != ERR_NONE) return error;
138 136
139 Note->Location = 1; 137 Note->Location = 1;
140 } else { 138 } else {
141 Note->Location++; 139 Note->Location++;
142 } 140 }
143 smprintf(s, "Getting calendar note %i\n",Note->Location); 141 smprintf(s, "Getting calendar note %i\n",Note->Location);
144 142
145 Loc = Note->Location; 143 Loc = Note->Location;
146 Pos = 0; 144 Pos = 0;
147 num = 0; 145 num = 0;
148 while (1) { 146 while (1) {
149 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, Note, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo); 147 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, Note, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
150 if (error == ERR_EMPTY) break; 148 if (error == ERR_EMPTY) break;
151 if (error != ERR_NONE) return error; 149 if (error != ERR_NONE) return error;
152 if (Note->EntriesNum != 0) { 150 if (Note->EntriesNum != 0) {
153 num++; 151 num++;
154 if (num == Loc) return ERR_NONE; 152 if (num == Loc) return ERR_NONE;
155 } 153 }
156 } 154 }
157 return ERR_EMPTY; 155 return ERR_EMPTY;
158#else 156#else
159 return ERR_SOURCENOTAVAILABLE; 157 return ERR_SOURCENOTAVAILABLE;
160#endif 158#endif
161} 159}
162 160
163GSM_Error SONYERIC_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool start) 161GSM_Error SONYERIC_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool start)
164{ 162{
165#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 163#ifdef GSM_ENABLE_OBEXGEN
166 GSM_Error error; 164 GSM_Error error;
167 GSM_CalendarEntryCalendar; 165 GSM_CalendarEntryCalendar;
168 int Pos, num, Loc; 166 int Pos, num, Loc;
169 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 167 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
170 168
171 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED; 169 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED;
172 170
173 if (start) { 171 if (start) {
174 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs"); 172 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs");
175 if (error != ERR_NONE) return error; 173 if (error != ERR_NONE) return error;
176 174
177 ToDo->Location = 1; 175 ToDo->Location = 1;
178 } else { 176 } else {
179 ToDo->Location++; 177 ToDo->Location++;
180 } 178 }
181 smprintf(s,"Getting ToDo %i\n",ToDo->Location); 179 smprintf(s,"Getting ToDo %i\n",ToDo->Location);
182 180
183 Loc = ToDo->Location; 181 Loc = ToDo->Location;
184 Pos = 0; 182 Pos = 0;
185 num = 0; 183 num = 0;
186 while (1) { 184 while (1) {
187 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, &Calendar, ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo); 185 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, &Calendar, ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
188 if (error == ERR_EMPTY) break; 186 if (error == ERR_EMPTY) break;
189 if (error != ERR_NONE) return error; 187 if (error != ERR_NONE) return error;
190 if (ToDo->EntriesNum != 0) { 188 if (ToDo->EntriesNum != 0) {
191 num++; 189 num++;
192 if (num == Loc) return ERR_NONE; 190 if (num == Loc) return ERR_NONE;
193 } 191 }
194 } 192 }
195 193
196 return ERR_EMPTY; 194 return ERR_EMPTY;
197#else 195#else
198 return ERR_SOURCENOTAVAILABLE; 196 return ERR_SOURCENOTAVAILABLE;
199#endif 197#endif
200} 198}
201 199
202GSM_Error SONYERIC_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status) 200GSM_Error SONYERIC_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
203{ 201{
204#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 202#ifdef GSM_ENABLE_OBEXGEN
205 GSM_Error error; 203 GSM_Error error;
206 GSM_ToDoEntry ToDo; 204 GSM_ToDoEntry ToDo;
207 GSM_CalendarEntry Calendar; 205 GSM_CalendarEntry Calendar;
208 int Pos; 206 int Pos;
209 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 207 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
210 208
211 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED; 209 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED;
212 210
213 smprintf(s,"Getting ToDo status\n"); 211 smprintf(s,"Getting ToDo status\n");
214 212
215 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs"); 213 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs");
216 if (error != ERR_NONE) return error; 214 if (error != ERR_NONE) return error;
217 215
218 status->Used = 0; 216 status->Used = 0;
219 Pos = 0; 217 Pos = 0;
220 while (1) { 218 while (1) {
221 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, &Calendar, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo); 219 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, &Calendar, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
222 if (error == ERR_EMPTY) break; 220 if (error == ERR_EMPTY) break;
223 if (error != ERR_NONE) return error; 221 if (error != ERR_NONE) return error;
224 if (ToDo.EntriesNum != 0) status->Used++; 222 if (ToDo.EntriesNum != 0) status->Used++;
225 } 223 }
226 224
227 return ERR_NONE; 225 return ERR_NONE;
228#else 226#else
229 return ERR_SOURCENOTAVAILABLE; 227 return ERR_SOURCENOTAVAILABLE;
230#endif 228#endif
231} 229}
232 230
233GSM_Error SONYERIC_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note) 231GSM_Error SONYERIC_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
234{ 232{
235#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 233#ifdef GSM_ENABLE_OBEXGEN
236 unsigned char req[5000]; 234 unsigned char req[5000];
237 int size=0; 235 int size=0;
238 236
239 smprintf(s,"Adding calendar note\n"); 237 smprintf(s,"Adding calendar note\n");
240 238
241 GSM_EncodeVCALENDAR(req,&size,Note,true,SonyEricsson_VCalendar); 239 GSM_EncodeVCALENDAR(req,&size,Note,true,SonyEricsson_VCalendar);
242 240
243 return SONYERIC_SetFile(s, "telecom/cal/luid/.vcs", req, size); 241 return SONYERIC_SetFile(s, "telecom/cal/luid/.vcs", req, size);
244#else 242#else
245 return ERR_SOURCENOTAVAILABLE; 243 return ERR_SOURCENOTAVAILABLE;
246#endif 244#endif
247} 245}
248 246
249GSM_Error SONYERIC_AddToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo) 247GSM_Error SONYERIC_AddToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
250{ 248{
251#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 249#ifdef GSM_ENABLE_OBEXGEN
252 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 250 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
253 unsigned char req[5000]; 251 unsigned char req[5000];
254 int size=0; 252 int size=0;
255 253
256 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED; 254 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED;
257 255
258 smprintf(s,"Adding ToDo\n"); 256 smprintf(s,"Adding ToDo\n");
259 257
260 GSM_EncodeVTODO(req,&size,ToDo,true,SonyEricsson_VToDo); 258 GSM_EncodeVTODO(req,&size,ToDo,true,SonyEricsson_VToDo);
261 259
262 return SONYERIC_SetFile(s, "telecom/cal/luid/.vcs", req, size); 260 return SONYERIC_SetFile(s, "telecom/cal/luid/.vcs", req, size);
263#else 261#else
264 return ERR_SOURCENOTAVAILABLE; 262 return ERR_SOURCENOTAVAILABLE;
265#endif 263#endif
266} 264}
267 265
268GSM_Error SONYERIC_DeleteAllToDo(GSM_StateMachine *s) 266GSM_Error SONYERIC_DeleteAllToDo(GSM_StateMachine *s)
269{ 267{
270#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 268#ifdef GSM_ENABLE_OBEXGEN
271 GSM_Error error; 269 GSM_Error error;
272 int Pos,Level = 0,Used; 270 int Pos,Level = 0,Used;
273 unsigned char *Buf; 271 unsigned char *Buf;
274 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 272 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
275 unsigned char Line[2000]; 273 unsigned char Line[2000];
276 274
277 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED; 275 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED;
278 276
279 smprintf(s,"Deleting all ToDo\n"); 277 smprintf(s,"Deleting all ToDo\n");
280 278
281 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs"); 279 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs");
282 if (error != ERR_NONE) return error; 280 if (error != ERR_NONE) return error;
283 281
284 Pos = 0; 282 Pos = 0;
285 Buf = NULL; 283 Buf = NULL;
286 Used = 0; 284 Used = 0;
287 while (1) { 285 while (1) {
288 MyGetLine(Priv->file.Buffer, &Pos, Line, Priv->file.Used); 286 MyGetLine(Priv->file.Buffer, &Pos, Line, Priv->file.Used);
289 if (strlen(Line) == 0) break; 287 if (strlen(Line) == 0) break;
290 dbgprintf("Line is %s,%i,%i\n",Line,Priv->file.Used,Pos); 288 dbgprintf("Line is %s,%i,%i\n",Line,Priv->file.Used,Pos);
291 switch (Level) { 289 switch (Level) {
292 case 0: 290 case 0:
293 if (strstr(Line,"BEGIN:VTODO")) { 291 if (strstr(Line,"BEGIN:VTODO")) {
294 Level = 2; 292 Level = 2;
295 break; 293 break;
296 } 294 }
297 Buf=(unsigned char *)realloc(Buf,Used+strlen(Line)+3); 295 Buf=(unsigned char *)realloc(Buf,Used+strlen(Line)+3);
298 strcpy(Buf+Used,Line); 296 strcpy(Buf+Used,Line);
299 Used=Used+strlen(Line)+3; 297 Used=Used+strlen(Line)+3;
300 Buf[Used-3] = 13; 298 Buf[Used-3] = 13;
301 Buf[Used-2] = 10; 299 Buf[Used-2] = 10;
302 Buf[Used-1] = 0x00; 300 Buf[Used-1] = 0x00;
303 break; 301 break;
304 case 2: /* ToDo note */ 302 case 2: /* ToDo note */
305 if (strstr(Line,"END:VTODO")) { 303 if (strstr(Line,"END:VTODO")) {
306 Level = 0; 304 Level = 0;
307 } 305 }
308 break; 306 break;
309 } 307 }
310 } 308 }
311 309
312 error = SONYERIC_SetFile(s, "telecom/cal.vcs", Buf, Used); 310 error = SONYERIC_SetFile(s, "telecom/cal.vcs", Buf, Used);
313 //if (Buf != NULL) free(Buf); 311 //if (Buf != NULL) free(Buf);
314 return error; 312 return error;
315#else 313#else
316 return ERR_SOURCENOTAVAILABLE; 314 return ERR_SOURCENOTAVAILABLE;
317#endif 315#endif
318} 316}
319 317
320GSM_Error SONYERIC_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note) 318GSM_Error SONYERIC_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
321{ 319{
322#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 320#ifdef GSM_ENABLE_OBEXGEN
323 GSM_Error error; 321 GSM_Error error;
324 int Pos,Level = 0,Loc=0,Used; 322 int Pos,Level = 0,Loc=0,Used;
325 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 323 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
326 unsigned char Line[2000]; 324 unsigned char Line[2000];
327 unsigned char *Buf; 325 unsigned char *Buf;
328 326
329 smprintf(s, "Deleting calendar note %i\n",Note->Location); 327 smprintf(s, "Deleting calendar note %i\n",Note->Location);
330 328
331 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs"); 329 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs");
332 if (error != ERR_NONE) return error; 330 if (error != ERR_NONE) return error;
333 331
334 Pos = 0; 332 Pos = 0;
335 Buf = NULL; 333 Buf = NULL;
336 Used = 0; 334 Used = 0;
337 while (1) { 335 while (1) {
338 MyGetLine(Priv->file.Buffer, &Pos, Line, Priv->file.Used); 336 MyGetLine(Priv->file.Buffer, &Pos, Line, Priv->file.Used);
339 if (strlen(Line) == 0) break; 337 if (strlen(Line) == 0) break;
340 dbgprintf("Line is %s,%i,%i\n",Line,Priv->file.Used,Pos); 338 dbgprintf("Line is %s,%i,%i\n",Line,Priv->file.Used,Pos);
341 switch (Level) { 339 switch (Level) {
342 case 0: 340 case 0:
343 if (strstr(Line,"BEGIN:VEVENT")) { 341 if (strstr(Line,"BEGIN:VEVENT")) {
344 Loc++; 342 Loc++;
345 if (Loc == Note->Location) { 343 if (Loc == Note->Location) {
346 Level = 1; 344 Level = 1;
347 break; 345 break;
348 } 346 }
349 } 347 }
350 Buf=(unsigned char *)realloc(Buf,Used+strlen(Line)+3); 348 Buf=(unsigned char *)realloc(Buf,Used+strlen(Line)+3);
351 strcpy(Buf+Used,Line); 349 strcpy(Buf+Used,Line);
352 Used=Used+strlen(Line)+3; 350 Used=Used+strlen(Line)+3;
353 Buf[Used-3] = 13; 351 Buf[Used-3] = 13;
354 Buf[Used-2] = 10; 352 Buf[Used-2] = 10;
355 Buf[Used-1] = 0x00; 353 Buf[Used-1] = 0x00;
356 break; 354 break;
357 case 1: /* Calendar note */ 355 case 1: /* Calendar note */
358 if (strstr(Line,"END:VEVENT")) { 356 if (strstr(Line,"END:VEVENT")) {
359 Level = 0; 357 Level = 0;
360 } 358 }
361 break; 359 break;
362 } 360 }
363 } 361 }
364 362
365 DumpMessage(s->di.df, s->di.dl, Buf, Used); 363 DumpMessage(s->di.df, s->di.dl, Buf, Used);
366 364
367 error = SONYERIC_SetFile(s, "telecom/cal.vcs", Buf, Used); 365 error = SONYERIC_SetFile(s, "telecom/cal.vcs", Buf, Used);
368 if (Buf != NULL) free(Buf); 366 if (Buf != NULL) free(Buf);
369 return error; 367 return error;
370#else 368#else
371 return ERR_SOURCENOTAVAILABLE; 369 return ERR_SOURCENOTAVAILABLE;
372#endif 370#endif
373} 371}
374 372
375GSM_Error SONYERIC_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status) 373GSM_Error SONYERIC_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
376{ 374{
377#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) 375#ifdef GSM_ENABLE_OBEXGEN
378 GSM_Error error; 376 GSM_Error error;
379 GSM_ToDoEntry ToDo; 377 GSM_ToDoEntry ToDo;
380 GSM_CalendarEntry Calendar; 378 GSM_CalendarEntry Calendar;
381 int Pos; 379 int Pos;
382 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN; 380 GSM_Phone_ATGENData*Priv = &s->Phone.Data.Priv.ATGEN;
383 381
384 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED; 382 if (Priv->Manufacturer!=AT_Ericsson) return ERR_NOTSUPPORTED;
385 383
386 smprintf(s, "Getting calendar status\n"); 384 smprintf(s, "Getting calendar status\n");
387 385
388 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs"); 386 error = SONYERIC_GetFile(s, &Priv->file, "telecom/cal.vcs");
389 if (error != ERR_NONE) return error; 387 if (error != ERR_NONE) return error;
390 388
391 Status->Used = 0; 389 Status->Used = 0;
392 Pos = 0; 390 Pos = 0;
393 while (1) { 391 while (1) {
394 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, &Calendar, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo); 392 error = GSM_DecodeVCALENDAR_VTODO(Priv->file.Buffer, &Pos, &Calendar, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
395 if (error == ERR_EMPTY) break; 393 if (error == ERR_EMPTY) break;
396 if (error != ERR_NONE) return error; 394 if (error != ERR_NONE) return error;
397 if (Calendar.EntriesNum != 0) Status->Used++; 395 if (Calendar.EntriesNum != 0) Status->Used++;
398 } 396 }
399 397
400 return ERR_NONE; 398 return ERR_NONE;
401#else 399#else
402 return ERR_SOURCENOTAVAILABLE; 400 return ERR_SOURCENOTAVAILABLE;
403#endif 401#endif
404} 402}
405 403
406#endif 404GSM_Error ERICSSON_ReplyGetDateLocale(GSM_Protocol_Message msg, GSM_StateMachine *s)
405 { /*Author: Peter Ondraska, based on code by Marcin Wiacek and Michal Cihar
406 License: Whatever the current maintainer of gammulib chooses, as long as there
407 is an easy way to obtain the source under GPL, otherwise the author's parts
408 of this function are GPL 2.0.
409 */
410 GSM_Locale*locale = s->Phone.Data.Locale;
411 char format;
412
413 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
414 case AT_Reply_OK:
415 smprintf(s, "Date settings received\n");
416 format=atoi(msg.Buffer);
417 switch (format) {
418 case 0: locale->DateFormat = GSM_Date_OFF;
419 locale->DateSeparator = 0;
420 break;
421 case 1: locale->DateFormat = GSM_Date_DDMMMYY;
422 locale->DateSeparator = '-';
423 break;
424 case 2: locale->DateFormat = GSM_Date_DDMMYY;
425 locale->DateSeparator = '-';
426 break;
427 case 3: locale->DateFormat = GSM_Date_MMDDYY;
428 locale->DateSeparator = '/';
429 break;
430 case 4: locale->DateFormat = GSM_Date_DDMMYY;
431 locale->DateSeparator = '/';
432 break;
433 case 5: locale->DateFormat = GSM_Date_DDMMYY;
434 locale->DateSeparator = '.';
435 break;
436 case 6: locale->DateFormat = GSM_Date_YYMMDD;
437 locale->DateSeparator = 0;
438 break;
439 case 7: locale->DateFormat = GSM_Date_YYMMDD;
440 locale->DateSeparator = '-';
441 break;
442 default:return ERR_UNKNOWNRESPONSE;
443 }
444 default:
445 return ERR_NOTSUPPORTED;
446 }
447}
448
449GSM_Error ERICSSON_ReplyGetTimeLocale(GSM_Protocol_Message msg, GSM_StateMachine *s)
450 { /*Author: Peter Ondraska
451 License: Whatever the current maintainer of gammulib chooses, as long as there
452 is an easy way to obtain the source under GPL, otherwise the author's parts
453 of this function are GPL 2.0.
454 */
455 char format;
456
457 switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
458 case AT_Reply_OK:
459 smprintf(s, "Time settings received\n");
460 format=atoi(msg.Buffer);
461 switch (format) {
462 case 1:
463 case 2: s->Phone.Data.Locale->AMPMTime=(format==2);
464 return ERR_NONE;
465 default:return ERR_UNKNOWNRESPONSE;
466 }
467 default: return ERR_NOTSUPPORTED;
468 }
469}
470
471GSM_Error ERICSSON_GetLocale(GSM_StateMachine *s, GSM_Locale *locale)
472{
473 GSM_Error error;
474
475 s->Phone.Data.Locale = locale;
476
477 smprintf(s, "Getting date format\n");
478 error=GSM_WaitFor (s, "AT+ESDF?\r", 9, 0x00, 3, ID_GetLocale);
479 if (error!=ERR_NONE) return error;
480
481 smprintf(s, "Getting time format\n");
482 return GSM_WaitFor (s, "AT+ESTF?\r", 9, 0x00, 3, ID_GetLocale);
483}
484
485
486GSM_Error ERICSSON_SetLocale(GSM_StateMachine *s, GSM_Locale *locale)
487 { /*Author: Peter Ondraska
488 License: Whatever the current maintainer of gammulib chooses, as long as there
489 is an easy way to obtain the source under GPL, otherwise the author's parts
490 of this function are GPL 2.0.
491 */
492 /* this is not yet supported by gammu.c */
493 intformat=0;
494 charreq[12];
495
496 if (locale->DateFormat==GSM_Date_OFF) { format=0; } else
497 if ((locale->DateFormat==GSM_Date_DDMMMYY)&&(locale->DateSeparator=='-')) { format=1; } else
498 if ((locale->DateFormat==GSM_Date_DDMMYY)&&(locale->DateSeparator=='-')) { format=2; } else
499 if ((locale->DateFormat==GSM_Date_MMDDYY)&&(locale->DateSeparator=='/')) { format=3; } else
500 if ((locale->DateFormat==GSM_Date_DDMMYY)&&(locale->DateSeparator=='/')) { format=4; } else
501 if ((locale->DateFormat==GSM_Date_DDMMYY)&&(locale->DateSeparator=='.')) { format=5; } else
502 if ((locale->DateFormat==GSM_Date_YYMMDD)&&(locale->DateSeparator==0)) { format=6; } else
503 if ((locale->DateFormat==GSM_Date_YYMMDD)&&(locale->DateSeparator=='-')) { format=7; }
504 else { return ERR_NOTSUPPORTED; } /* ERR_WRONGINPUT */
505
506 sprintf(req,"AT+ESDF=%i\r",format);
507 smprintf(s, "Setting date format\n");
508 return GSM_WaitFor (s, req, strlen(req), 0x00, 3, ID_SetLocale);
509
510 if (locale->AMPMTime) { format=2; } else { format=1; }
511 sprintf(req,"AT+ESTF=%i\r",format);
512 smprintf(s, "Setting time format\n");
513 return GSM_WaitFor (s, req, strlen(req), 0x00, 3, ID_SetLocale);
514}
515
407#endif 516#endif
408 517
409/* How should editor hadle tabs in this file? Add editor commands here. 518/* How should editor hadle tabs in this file? Add editor commands here.
410 * vim: noexpandtab sw=8 ts=8 sts=8: 519 * vim: noexpandtab sw=8 ts=8 sts=8:
411 */ 520 */
diff --git a/gammu/emb/common/phone/nokia/dct3/dct3func.c b/gammu/emb/common/phone/nokia/dct3/dct3func.c
index beef33c..17cd0a4 100644
--- a/gammu/emb/common/phone/nokia/dct3/dct3func.c
+++ b/gammu/emb/common/phone/nokia/dct3/dct3func.c
@@ -1,51 +1,54 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2/* based on some work from Markus Plail, Pavel Janik, others and Gnokii */
3/* resetting DCT4 phones settings (c) by Walek */ 2/* resetting DCT4 phones settings (c) by Walek */
3/* based on some Markus Plail, Pavel Janik & others work from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
6 */
4 7
5#include <string.h> /* memcpy only */ 8#include <string.h> /* memcpy only */
6#include <stdio.h> 9#include <stdio.h>
7#include <ctype.h> 10#include <ctype.h>
8 11
9#include "../../../gsmstate.h" 12#include "../../../gsmstate.h"
10#include "../../../misc/coding/coding.h" 13#include "../../../misc/coding/coding.h"
11#include "../../../service/sms/gsmsms.h" 14#include "../../../service/sms/gsmsms.h"
12#include "../../pfunc.h" 15#include "../../pfunc.h"
13#include "../nfunc.h" 16#include "../nfunc.h"
14#include "dct3func.h" 17#include "dct3func.h"
15 18
16#ifdef GSM_ENABLE_NOKIA_DCT3 19#ifdef GSM_ENABLE_NOKIA_DCT3
17 20
18GSM_Error DCT3_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark) 21GSM_Error DCT3_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
19{ 22{
20 GSM_Error error; 23 GSM_Error error;
21 24
22 /* We have to enable WAP frames in phone */ 25 /* We have to enable WAP frames in phone */
23 error=DCT3DCT4_EnableWAPFunctions(s); 26 error=DCT3DCT4_EnableWAPFunctions(s);
24 if (error!=ERR_NONE) return error; 27 if (error!=ERR_NONE) return error;
25 28
26 return DCT3DCT4_DeleteWAPBookmarkPart(s,bookmark); 29 return DCT3DCT4_DeleteWAPBookmarkPart(s,bookmark);
27} 30}
28 31
29GSM_Error DCT3_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark) 32GSM_Error DCT3_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
30{ 33{
31 GSM_Error error; 34 GSM_Error error;
32 35
33 /* We have to enable WAP frames in phone */ 36 /* We have to enable WAP frames in phone */
34 error=DCT3DCT4_EnableWAPFunctions(s); 37 error=DCT3DCT4_EnableWAPFunctions(s);
35 if (error!=ERR_NONE) return error; 38 if (error!=ERR_NONE) return error;
36 39
37 return DCT3DCT4_GetWAPBookmarkPart(s,bookmark); 40 return DCT3DCT4_GetWAPBookmarkPart(s,bookmark);
38} 41}
39 42
40GSM_Error DCT3_ReplyPressKey(GSM_Protocol_Message msg, GSM_StateMachine *s) 43GSM_Error DCT3_ReplyPressKey(GSM_Protocol_Message msg, GSM_StateMachine *s)
41{ 44{
42 GSM_Phone_Data *Data = &s->Phone.Data; 45 GSM_Phone_Data *Data = &s->Phone.Data;
43 46
44 switch (msg.Buffer[2]) { 47 switch (msg.Buffer[2]) {
45 case 0x46: 48 case 0x46:
46 smprintf(s, "Pressing key OK\n"); 49 smprintf(s, "Pressing key OK\n");
47 if (Data->PressKey) return ERR_NONE; 50 if (Data->PressKey) return ERR_NONE;
48 break; 51 break;
49 case 0x47: 52 case 0x47:
50 smprintf(s, "Releasing key OK\n"); 53 smprintf(s, "Releasing key OK\n");
51 if (!Data->PressKey) return ERR_NONE; 54 if (!Data->PressKey) return ERR_NONE;
@@ -349,163 +352,164 @@ GSM_Error DCT3_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time, unsigne
349 return GSM_WaitFor (s, req, 14, msgtype, 4, ID_SetDateTime); 352 return GSM_WaitFor (s, req, 14, msgtype, 4, ID_SetDateTime);
350} 353}
351 354
352GSM_Error DCT3_ReplySetAlarm(GSM_Protocol_Message msg, GSM_StateMachine *s) 355GSM_Error DCT3_ReplySetAlarm(GSM_Protocol_Message msg, GSM_StateMachine *s)
353{ 356{
354 smprintf(s, "Alarm: "); 357 smprintf(s, "Alarm: ");
355 if (msg.Buffer[4]==0x01) { 358 if (msg.Buffer[4]==0x01) {
356 smprintf(s, "set OK\n"); 359 smprintf(s, "set OK\n");
357 return ERR_NONE; 360 return ERR_NONE;
358 } 361 }
359 smprintf(s, "error setting\n"); 362 smprintf(s, "error setting\n");
360 return ERR_UNKNOWN; 363 return ERR_UNKNOWN;
361} 364}
362 365
363GSM_Error DCT3_SetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm, unsigned char msgtype) 366GSM_Error DCT3_SetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm, unsigned char msgtype)
364{ 367{
365 unsigned char req[] = {N6110_FRAME_HEADER, 0x6b, 0x01, 0x20, 0x03, 368 unsigned char req[] = {N6110_FRAME_HEADER, 0x6b, 0x01, 0x20, 0x03,
366 0x02, /* Unknown. Not for enabling/disabling */ 369 0x02, /* Unknown. Not for enabling/disabling */
367 0x00, /* Hour */ 370 0x00, /* Hour */
368 0x00, /* Minute */ 371 0x00, /* Minute */
369 0x00}; /* Unknown. Not seconds */ 372 0x00}; /* Unknown. Not seconds */
370 373
371 if (alarm->Location != 1) return ERR_NOTSUPPORTED; 374 if (alarm->Location != 1) return ERR_NOTSUPPORTED;
372 375
373 req[8] = alarm->DateTime.Hour; 376 req[8] = alarm->DateTime.Hour;
374 req[9] = alarm->DateTime.Minute; 377 req[9] = alarm->DateTime.Minute;
375 378
376 smprintf(s, "Setting alarm\n"); 379 smprintf(s, "Setting alarm\n");
377 return GSM_WaitFor (s, req, 11, msgtype, 4, ID_SetAlarm); 380 return GSM_WaitFor (s, req, 11, msgtype, 4, ID_SetAlarm);
378} 381}
379 382
380GSM_Error DCT3_ReplyGetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s) 383GSM_Error DCT3_ReplyGetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s)
381{ 384{
382 int i; 385 int i;
383 GSM_Phone_Data*Data = &s->Phone.Data; 386 GSM_Phone_Data*Data = &s->Phone.Data;
384 387
385 switch (msg.Buffer[3]) { 388 switch (msg.Buffer[3]) {
386 case 0x34: 389 case 0x34:
387 smprintf(s, "SMSC received\n"); 390 smprintf(s, "SMSC received\n");
388 Data->SMSC->Format = SMS_FORMAT_Text; 391 Data->SMSC->Format = SMS_FORMAT_Text;
389 switch (msg.Buffer[6]) { 392 switch (msg.Buffer[6]) {
390 case 0x00: Data->SMSC->Format = SMS_FORMAT_Text; break; 393 case 0x00: Data->SMSC->Format = SMS_FORMAT_Text; break;
391 case 0x22: Data->SMSC->Format = SMS_FORMAT_Fax; break; 394 case 0x22: Data->SMSC->Format = SMS_FORMAT_Fax; break;
392 case 0x26: Data->SMSC->Format = SMS_FORMAT_Pager;break; 395 case 0x26: Data->SMSC->Format = SMS_FORMAT_Pager;break;
393 case 0x32: Data->SMSC->Format = SMS_FORMAT_Email;break; 396 case 0x32: Data->SMSC->Format = SMS_FORMAT_Email;break;
394 } 397 }
395 Data->SMSC->Validity.Format = SMS_Validity_RelativeFormat; 398 Data->SMSC->Validity.Format = SMS_Validity_RelativeFormat;
396 Data->SMSC->Validity.Relative= msg.Buffer[8]; 399 Data->SMSC->Validity.Relative= msg.Buffer[8];
400 if (msg.Buffer[8] == 0x00) Data->SMSC->Validity.Relative = SMS_VALID_Max_Time;
397 401
398 i=33; 402 i=33;
399 while (msg.Buffer[i]!=0) {i++;} 403 while (msg.Buffer[i]!=0) {i++;}
400 i=i-33; 404 i=i-33;
401 if (i>GSM_MAX_SMSC_NAME_LENGTH) { 405 if (i>GSM_MAX_SMSC_NAME_LENGTH) {
402 smprintf(s, "Too long name\n"); 406 smprintf(s, "Too long name\n");
403 return ERR_UNKNOWNRESPONSE; 407 return ERR_UNKNOWNRESPONSE;
404 } 408 }
405 EncodeUnicode(Data->SMSC->Name,msg.Buffer+33,i); 409 EncodeUnicode(Data->SMSC->Name,msg.Buffer+33,i);
406 smprintf(s, "Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name)); 410 smprintf(s, "Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name));
407 411
408 GSM_UnpackSemiOctetNumber(Data->SMSC->DefaultNumber,msg.Buffer+9,true); 412 GSM_UnpackSemiOctetNumber(Data->SMSC->DefaultNumber,msg.Buffer+9,true);
409 smprintf(s, "Default number \"%s\"\n", DecodeUnicodeString(Data->SMSC->DefaultNumber)); 413 smprintf(s, "Default number \"%s\"\n", DecodeUnicodeString(Data->SMSC->DefaultNumber));
410 414
411 GSM_UnpackSemiOctetNumber(Data->SMSC->Number,msg.Buffer+21,false); 415 GSM_UnpackSemiOctetNumber(Data->SMSC->Number,msg.Buffer+21,false);
412 smprintf(s, "Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number)); 416 smprintf(s, "Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number));
413 417
414 return ERR_NONE; 418 return ERR_NONE;
415 case 0x35: 419 case 0x35:
416 smprintf(s, "Getting SMSC failed\n"); 420 smprintf(s, "Getting SMSC failed\n");
417 return ERR_INVALIDLOCATION; 421 return ERR_INVALIDLOCATION;
418 } 422 }
419 return ERR_UNKNOWNRESPONSE; 423 return ERR_UNKNOWNRESPONSE;
420} 424}
421 425
422GSM_Error DCT3_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc) 426GSM_Error DCT3_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
423{ 427{
424 unsigned char req[] = {N6110_FRAME_HEADER, 0x33, 0x64, 428 unsigned char req[] = {N6110_FRAME_HEADER, 0x33, 0x64,
425 0x00}; /* Location */ 429 0x00}; /* Location */
426 430
427 if (smsc->Location==0x00) return ERR_INVALIDLOCATION; 431 if (smsc->Location==0x00) return ERR_INVALIDLOCATION;
428 432
429 req[5]=smsc->Location; 433 req[5]=smsc->Location;
430 434
431 s->Phone.Data.SMSC=smsc; 435 s->Phone.Data.SMSC=smsc;
432 smprintf(s, "Getting SMSC\n"); 436 smprintf(s, "Getting SMSC\n");
433 return GSM_WaitFor (s, req, 6, 0x02, 4, ID_GetSMSC); 437 return GSM_WaitFor (s, req, 6, 0x02, 4, ID_GetSMSC);
434} 438}
435 439
436GSM_Error DCT3_ReplyGetNetworkInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) 440GSM_Error DCT3_ReplyGetNetworkInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
437{ 441{
438 int count; 442 int count;
439 GSM_Phone_Data*Data = &s->Phone.Data; 443 GSM_Phone_Data*Data = &s->Phone.Data;
440#ifdef DEBUG 444#ifdef DEBUG
441 GSM_NetworkInfo NetInfo; 445 GSM_NetworkInfo NetInfo;
442 char name[100]; 446 char name[100];
443 447
444 smprintf(s, "Network info received\n"); 448 smprintf(s, "Network info received\n");
445 smprintf(s, " Status : "); 449 smprintf(s, "Status : ");
446 switch (msg.Buffer[8]) { 450 switch (msg.Buffer[8]) {
447 case 0x01: smprintf(s, "home network"); break; 451 case 0x01: smprintf(s, "home network"); break;
448 case 0x02: smprintf(s, "roaming network"); break; 452 case 0x02: smprintf(s, "roaming network"); break;
449 case 0x03: smprintf(s, "requesting network"); break; 453 case 0x03: smprintf(s, "requesting network"); break;
450 case 0x04: smprintf(s, "not registered in the network");break; 454 case 0x04: smprintf(s, "not registered in the network");break;
451 default : smprintf(s, "unknown"); 455 default : smprintf(s, "unknown");
452 } 456 }
453 smprintf(s, "\n"); 457 smprintf(s, "\n");
454 smprintf(s, "Network selection : %s\n", msg.Buffer[9]==1?"manual":"automatic"); 458 smprintf(s, "Network selection : %s\n", msg.Buffer[9]==1?"manual":"automatic");
455 if (msg.Buffer[8]<0x03) { 459 if (msg.Buffer[8]<0x03) {
456 sprintf(NetInfo.CID, "%02x%02x", msg.Buffer[10], msg.Buffer[11]); 460 sprintf(NetInfo.CID, "%02x%02x", msg.Buffer[10], msg.Buffer[11]);
457 smprintf(s, "CID : %s\n", NetInfo.CID); 461 smprintf(s, "CID : %s\n", NetInfo.CID);
458 462
459 sprintf(NetInfo.LAC, "%02x%02x", msg.Buffer[12], msg.Buffer[13]); 463 sprintf(NetInfo.LAC, "%02x%02x", msg.Buffer[12], msg.Buffer[13]);
460 smprintf(s, "LAC : %s\n", NetInfo.LAC); 464 smprintf(s, "LAC : %s\n", NetInfo.LAC);
461 465
462 smprintf(s, "Network code : %s\n", NetInfo.NetworkCode);
463 NOKIA_DecodeNetworkCode(msg.Buffer+14,NetInfo.NetworkCode); 466 NOKIA_DecodeNetworkCode(msg.Buffer+14,NetInfo.NetworkCode);
467 smprintf(s, "Network code : %s\n", NetInfo.NetworkCode);
464 smprintf(s, "Network name for Gammu : %s ", 468 smprintf(s, "Network name for Gammu : %s ",
465 DecodeUnicodeString(GSM_GetNetworkName(NetInfo.NetworkCode))); 469 DecodeUnicodeString(GSM_GetNetworkName(NetInfo.NetworkCode)));
466 smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(NetInfo.NetworkCode))); 470 smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(NetInfo.NetworkCode)));
467 471
468 if (msg.Length>18) { 472 if (msg.Length>18) {
469 if (msg.Buffer[18]==0x00) { 473 if (msg.Buffer[18]==0x00) {
470 /* In 6210 name is in "normal" Unicode */ 474 /* In 6210 name is in "normal" Unicode */
471 memcpy(name,msg.Buffer+18,msg.Buffer[17]*2); 475 memcpy(name,msg.Buffer+18,msg.Buffer[17]*2);
472 name[msg.Buffer[17]*2]=0x00; 476 name[msg.Buffer[17]*2]=0x00;
473 name[msg.Buffer[17]*2+1]=0x00; 477 name[msg.Buffer[17]*2+1]=0x00;
474 smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name)); 478 smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name));
475 } else { 479 } else {
476 /* In 9210 first 0x00 is cut from Unicode string */ 480 /* In 9210 first 0x00 is cut from Unicode string */
477 name[0] = 0; 481 name[0] = 0;
478 memcpy(name+1,msg.Buffer+18,msg.Buffer[17]*2); 482 memcpy(name+1,msg.Buffer+18,msg.Buffer[17]*2);
479 name[msg.Buffer[17]*2+1]=0x00; 483 name[msg.Buffer[17]*2+1]=0x00;
480 name[msg.Buffer[17]*2+2]=0x00; 484 name[msg.Buffer[17]*2+2]=0x00;
481 smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name)); 485 smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name));
482 } 486 }
483 } 487 }
484 } 488 }
485#endif 489#endif
486 if (Data->RequestID==ID_GetNetworkInfo) { 490 if (Data->RequestID==ID_GetNetworkInfo) {
487 Data->NetworkInfo->NetworkName[0] = 0x00; 491 Data->NetworkInfo->NetworkName[0] = 0x00;
488 Data->NetworkInfo->NetworkName[1] = 0x00; 492 Data->NetworkInfo->NetworkName[1] = 0x00;
489 Data->NetworkInfo->State = 0; 493 Data->NetworkInfo->State = 0;
490 switch (msg.Buffer[8]) { 494 switch (msg.Buffer[8]) {
491 case 0x01: Data->NetworkInfo->State = GSM_HomeNetwork; break; 495 case 0x01: Data->NetworkInfo->State = GSM_HomeNetwork; break;
492 case 0x02: Data->NetworkInfo->State = GSM_RoamingNetwork;break; 496 case 0x02: Data->NetworkInfo->State = GSM_RoamingNetwork;break;
493 case 0x03: Data->NetworkInfo->State = GSM_RequestingNetwork;break; 497 case 0x03: Data->NetworkInfo->State = GSM_RequestingNetwork;break;
494 case 0x04: Data->NetworkInfo->State = GSM_NoNetwork; break; 498 case 0x04: Data->NetworkInfo->State = GSM_NoNetwork; break;
495 } 499 }
496 if (Data->NetworkInfo->State == GSM_HomeNetwork || Data->NetworkInfo->State == GSM_RoamingNetwork) { 500 if (Data->NetworkInfo->State == GSM_HomeNetwork || Data->NetworkInfo->State == GSM_RoamingNetwork) {
497 if (msg.Buffer[18]==0x00) { 501 if (msg.Buffer[18]==0x00) {
498 /* In 6210 name is in "normal" Unicode */ 502 /* In 6210 name is in "normal" Unicode */
499 memcpy(Data->NetworkInfo->NetworkName,msg.Buffer+18,msg.Buffer[17]*2); 503 memcpy(Data->NetworkInfo->NetworkName,msg.Buffer+18,msg.Buffer[17]*2);
500 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2] = 0x00; 504 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2] = 0x00;
501 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+1] = 0x00; 505 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+1] = 0x00;
502 } else { 506 } else {
503 /* In 9210 first 0x00 is cut from Unicode string */ 507 /* In 9210 first 0x00 is cut from Unicode string */
504 Data->NetworkInfo->NetworkName[0] = 0; 508 Data->NetworkInfo->NetworkName[0] = 0;
505 memcpy(Data->NetworkInfo->NetworkName+1,msg.Buffer+18,msg.Buffer[17]*2); 509 memcpy(Data->NetworkInfo->NetworkName+1,msg.Buffer+18,msg.Buffer[17]*2);
506 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+1]=0x00; 510 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+1]=0x00;
507 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+2]=0x00; 511 Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+2]=0x00;
508 } 512 }
509 NOKIA_DecodeNetworkCode(msg.Buffer+14,Data->NetworkInfo->NetworkCode); 513 NOKIA_DecodeNetworkCode(msg.Buffer+14,Data->NetworkInfo->NetworkCode);
510 sprintf(Data->NetworkInfo->CID, "%02x%02x", msg.Buffer[10], msg.Buffer[11]); 514 sprintf(Data->NetworkInfo->CID, "%02x%02x", msg.Buffer[10], msg.Buffer[11]);
511 sprintf(Data->NetworkInfo->LAC, "%02x%02x", msg.Buffer[12], msg.Buffer[13]); 515 sprintf(Data->NetworkInfo->LAC, "%02x%02x", msg.Buffer[12], msg.Buffer[13]);
@@ -1163,101 +1167,101 @@ GSM_Error DCT3_SetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *setting
1163 SetReq2[pos++] = 0x02; 1167 SetReq2[pos++] = 0x02;
1164 SetReq2[pos++] = 0x00; /* SMS */ 1168 SetReq2[pos++] = 0x00; /* SMS */
1165 if (loc2 != -1) { 1169 if (loc2 != -1) {
1166 /* Service number */ 1170 /* Service number */
1167 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Service, false); 1171 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Service, false);
1168 /* Server number */ 1172 /* Server number */
1169 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Server, false); 1173 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Server, false);
1170 } else pos += 2; 1174 } else pos += 2;
1171 memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8); 1175 memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8);
1172 pos += 8; 1176 pos += 8;
1173 smprintf(s, "Writing WAP settings part 2 (SMS bearer)\n"); 1177 smprintf(s, "Writing WAP settings part 2 (SMS bearer)\n");
1174 error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet); 1178 error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet);
1175 if (error != ERR_NONE) return error; 1179 if (error != ERR_NONE) return error;
1176 } 1180 }
1177 /* USSD */ 1181 /* USSD */
1178 if (phone3 != -1) { 1182 if (phone3 != -1) {
1179 pos = 4; 1183 pos = 4;
1180 memset(SetReq2 + pos, 0, 200 - pos); 1184 memset(SetReq2 + pos, 0, 200 - pos);
1181 SetReq2[pos++] = phone3; 1185 SetReq2[pos++] = phone3;
1182 SetReq2[pos++] = 0x02; 1186 SetReq2[pos++] = 0x02;
1183 SetReq2[pos++] = 0x02; /* USSD */ 1187 SetReq2[pos++] = 0x02; /* USSD */
1184 if (loc3 != -1) { 1188 if (loc3 != -1) {
1185 if (!settings->Settings[loc3].IsIP) SetReq2[pos] = 0x01; 1189 if (!settings->Settings[loc3].IsIP) SetReq2[pos] = 0x01;
1186 } 1190 }
1187 pos++; 1191 pos++;
1188 if (loc3 != -1) { 1192 if (loc3 != -1) {
1189 /* Service number or IP address */ 1193 /* Service number or IP address */
1190 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Service, false); 1194 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Service, false);
1191 /* Code number */ 1195 /* Code number */
1192 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Code, false); 1196 pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Code, false);
1193 } else pos+=2; 1197 } else pos+=2;
1194 memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8); 1198 memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8);
1195 pos += 8; 1199 pos += 8;
1196 smprintf(s, "Writing WAP settings part 2 (USSD bearer)\n"); 1200 smprintf(s, "Writing WAP settings part 2 (USSD bearer)\n");
1197 error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet); 1201 error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet);
1198 if (error != ERR_NONE) return error; 1202 if (error != ERR_NONE) return error;
1199 } 1203 }
1200 error = DCT3DCT4_SetActiveConnectSet(s, settings); 1204 error = DCT3DCT4_SetActiveConnectSet(s, settings);
1201 if (error != ERR_NONE) return error; 1205 if (error != ERR_NONE) return error;
1202 1206
1203 return DCT3DCT4_DisableConnectionFunctions(s); 1207 return DCT3DCT4_DisableConnectionFunctions(s);
1204} 1208}
1205 1209
1206GSM_Error DCT3_ReplySendSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s) 1210GSM_Error DCT3_ReplySendSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s)
1207{ 1211{
1208 switch (msg.Buffer[3]) { 1212 switch (msg.Buffer[3]) {
1209 case 0x02: 1213 case 0x02:
1210 smprintf(s, "SMS sent OK\n"); 1214 smprintf(s, "SMS sent OK\n");
1211 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,0,0); 1215 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,0,msg.Buffer[5]);
1212 return ERR_NONE; 1216 return ERR_NONE;
1213 case 0x03: 1217 case 0x03:
1214 smprintf(s, "Error %i\n",msg.Buffer[6]); 1218 smprintf(s, "Error %i\n",msg.Buffer[6]);
1215 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,msg.Buffer[6],0); 1219 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,msg.Buffer[6],-1);
1216 return ERR_NONE; 1220 return ERR_NONE;
1217 } 1221 }
1218 return ERR_UNKNOWNRESPONSE; 1222 return ERR_UNKNOWNRESPONSE;
1219} 1223}
1220 1224
1221GSM_Error DCT3_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms) 1225GSM_Error DCT3_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
1222{ 1226{
1223 int length; 1227 int length;
1224 GSM_Error error; 1228 GSM_Error error;
1225 unsigned char req[256] = {N6110_FRAME_HEADER, 0x01, 0x02, 0x00}; 1229 unsigned char req[256] = {N6110_FRAME_HEADER, 0x01, 0x02, 0x00};
1226 1230
1227 error=PHONE_EncodeSMSFrame(s,sms,req+6,PHONE_SMSSubmit,&length, true); 1231 error=PHONE_EncodeSMSFrame(s,sms,req+6,PHONE_SMSSubmit,&length, true);
1228 if (error != ERR_NONE) return error; 1232 if (error != ERR_NONE) return error;
1229 1233
1230 smprintf(s, "Sending sms\n"); 1234 smprintf(s, "Sending sms\n");
1231 return s->Protocol.Functions->WriteMessage(s, req, 6+length, 0x02); 1235 return s->Protocol.Functions->WriteMessage(s, req, 6+length, 0x02);
1232} 1236}
1233 1237
1234GSM_Error DCT3_ReplyNetmonitor(GSM_Protocol_Message msg, GSM_StateMachine *s) 1238GSM_Error DCT3_ReplyNetmonitor(GSM_Protocol_Message msg, GSM_StateMachine *s)
1235{ 1239{
1236 switch (msg.Buffer[3]) { 1240 switch (msg.Buffer[3]) {
1237 case 0x00: 1241 case 0x00:
1238 smprintf(s, "Netmonitor correctly set\n"); 1242 smprintf(s, "Netmonitor correctly set\n");
1239 break; 1243 break;
1240 default: 1244 default:
1241 smprintf(s, "Menu %i\n",msg.Buffer[3]); 1245 smprintf(s, "Menu %i\n",msg.Buffer[3]);
1242 smprintf(s, "%s\n",msg.Buffer+4); 1246 smprintf(s, "%s\n",msg.Buffer+4);
1243 strcpy(s->Phone.Data.Netmonitor,msg.Buffer+4); 1247 strcpy(s->Phone.Data.Netmonitor,msg.Buffer+4);
1244 break; 1248 break;
1245 } 1249 }
1246 return ERR_NONE; 1250 return ERR_NONE;
1247} 1251}
1248 1252
1249GSM_Error DCT3_Netmonitor(GSM_StateMachine *s, int testnumber, char *value) 1253GSM_Error DCT3_Netmonitor(GSM_StateMachine *s, int testnumber, char *value)
1250{ 1254{
1251 GSM_Error error; 1255 GSM_Error error;
1252 unsigned char req[] = {0x00, 0x01, 0x7e, 1256 unsigned char req[] = {0x00, 0x01, 0x7e,
1253 0x00}; /* Test number */ 1257 0x00}; /* Test number */
1254 1258
1255 value[0] = 0; 1259 value[0] = 0;
1256 1260
1257 error=DCT3_EnableSecurity (s, 0x01); 1261 error=DCT3_EnableSecurity (s, 0x01);
1258 if (error != ERR_NONE) return error; 1262 if (error != ERR_NONE) return error;
1259 1263
1260 req[3] = testnumber; 1264 req[3] = testnumber;
1261 1265
1262 smprintf(s, "Getting netmonitor test\n"); 1266 smprintf(s, "Getting netmonitor test\n");
1263 s->Phone.Data.Netmonitor = value; 1267 s->Phone.Data.Netmonitor = value;
diff --git a/gammu/emb/common/phone/nokia/dct3/dct3func.h b/gammu/emb/common/phone/nokia/dct3/dct3func.h
index 66b67ec..18b2026 100644
--- a/gammu/emb/common/phone/nokia/dct3/dct3func.h
+++ b/gammu/emb/common/phone/nokia/dct3/dct3func.h
@@ -1,53 +1,55 @@
1/* (c) 2002-2003 by Marcin Wiacek */ 1/* (c) 2002-2003 by Marcin Wiacek */
2 2
3#ifndef phone_nokia_dct3_h 3#ifndef phone_nokia_dct3_h
4#define phone_nokia_dct3_h 4#define phone_nokia_dct3_h
5 5
6#include "../ncommon.h"
7
6 GSM_Error DCT3_ReplyPressKey (GSM_Protocol_Message msg, GSM_StateMachine *s); 8 GSM_Error DCT3_ReplyPressKey (GSM_Protocol_Message msg, GSM_StateMachine *s);
7 GSM_Error DCT3_ReplyPlayTone (GSM_Protocol_Message msg, GSM_StateMachine *s); 9 GSM_Error DCT3_ReplyPlayTone (GSM_Protocol_Message msg, GSM_StateMachine *s);
8 GSM_Error DCT3_ReplyEnableSecurity(GSM_Protocol_Message msg, GSM_StateMachine *s); 10 GSM_Error DCT3_ReplyEnableSecurity(GSM_Protocol_Message msg, GSM_StateMachine *s);
9 GSM_Error DCT3_ReplyGetIMEI (GSM_Protocol_Message msg, GSM_StateMachine *s); 11 GSM_Error DCT3_ReplyGetIMEI (GSM_Protocol_Message msg, GSM_StateMachine *s);
10 GSM_Error DCT3_ReplyGetSMSC (GSM_Protocol_Message msg, GSM_StateMachine *s); 12 GSM_Error DCT3_ReplyGetSMSC (GSM_Protocol_Message msg, GSM_StateMachine *s);
11 GSM_Error DCT3_ReplySIMLogin (GSM_Protocol_Message msg, GSM_StateMachine *s); 13 GSM_Error DCT3_ReplySIMLogin (GSM_Protocol_Message msg, GSM_StateMachine *s);
12 GSM_Error DCT3_ReplySIMLogout (GSM_Protocol_Message msg, GSM_StateMachine *s); 14 GSM_Error DCT3_ReplySIMLogout (GSM_Protocol_Message msg, GSM_StateMachine *s);
13 GSM_Error DCT3_ReplyGetDateTime (GSM_Protocol_Message msg, GSM_StateMachine *s); 15 GSM_Error DCT3_ReplyGetDateTime (GSM_Protocol_Message msg, GSM_StateMachine *s);
14 GSM_Error DCT3_ReplyGetAlarm (GSM_Protocol_Message msg, GSM_StateMachine *s); 16 GSM_Error DCT3_ReplyGetAlarm (GSM_Protocol_Message msg, GSM_StateMachine *s);
15 GSM_Error DCT3_ReplySetDateTime (GSM_Protocol_Message msg, GSM_StateMachine *s); 17 GSM_Error DCT3_ReplySetDateTime (GSM_Protocol_Message msg, GSM_StateMachine *s);
16 GSM_Error DCT3_ReplySetAlarm (GSM_Protocol_Message msg, GSM_StateMachine *s); 18 GSM_Error DCT3_ReplySetAlarm (GSM_Protocol_Message msg, GSM_StateMachine *s);
17 GSM_Error DCT3_ReplyDialCommand (GSM_Protocol_Message msg, GSM_StateMachine *s); 19 GSM_Error DCT3_ReplyDialCommand (GSM_Protocol_Message msg, GSM_StateMachine *s);
18 GSM_Error DCT3_ReplyGetWAPBookmark(GSM_Protocol_Message msg, GSM_StateMachine *s); 20 GSM_Error DCT3_ReplyGetWAPBookmark(GSM_Protocol_Message msg, GSM_StateMachine *s);
19 GSM_Error DCT3_ReplyGetNetworkInfo(GSM_Protocol_Message msg, GSM_StateMachine *s); 21 GSM_Error DCT3_ReplyGetNetworkInfo(GSM_Protocol_Message msg, GSM_StateMachine *s);
20 GSM_Error DCT3_ReplySendSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s); 22 GSM_Error DCT3_ReplySendSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s);
21 GSM_Error DCT3_ReplySetSMSC (GSM_Protocol_Message msg, GSM_StateMachine *s); 23 GSM_Error DCT3_ReplySetSMSC (GSM_Protocol_Message msg, GSM_StateMachine *s);
22 GSM_Error DCT3_ReplyGetWAPSettings(GSM_Protocol_Message msg, GSM_StateMachine *s); 24 GSM_Error DCT3_ReplyGetWAPSettings(GSM_Protocol_Message msg, GSM_StateMachine *s);
23 GSM_Error DCT3_ReplySetWAPSettings(GSM_Protocol_Message msg, GSM_StateMachine *s); 25 GSM_Error DCT3_ReplySetWAPSettings(GSM_Protocol_Message msg, GSM_StateMachine *s);
24 GSM_Error DCT3_ReplyNetmonitor (GSM_Protocol_Message msg, GSM_StateMachine *s); 26 GSM_Error DCT3_ReplyNetmonitor (GSM_Protocol_Message msg, GSM_StateMachine *s);
25 GSM_Error DCT3_ReplyDeleteSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s); 27 GSM_Error DCT3_ReplyDeleteSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s);
26 GSM_Error N71_92_ReplyGetSignalQuality(GSM_Protocol_Message msg, GSM_StateMachine *s); 28 GSM_Error N71_92_ReplyGetSignalQuality(GSM_Protocol_Message msg, GSM_StateMachine *s);
27 GSM_Error N71_92_ReplyGetBatteryCharge(GSM_Protocol_Message msg, GSM_StateMachine *s); 29 GSM_Error N71_92_ReplyGetBatteryCharge(GSM_Protocol_Message msg, GSM_StateMachine *s);
28 GSM_Error N71_92_ReplyPhoneSetting(GSM_Protocol_Message msg, GSM_StateMachine *s); 30 GSM_Error N71_92_ReplyPhoneSetting(GSM_Protocol_Message msg, GSM_StateMachine *s);
29GSM_Error N61_71_ReplyResetPhoneSettings(GSM_Protocol_Message msg, GSM_StateMachine *s); 31GSM_Error N61_71_ReplyResetPhoneSettings(GSM_Protocol_Message msg, GSM_StateMachine *s);
30 GSM_Error N61_91_ReplySetOpLogo (GSM_Protocol_Message msg, GSM_StateMachine *s); 32 GSM_Error N61_91_ReplySetOpLogo (GSM_Protocol_Message msg, GSM_StateMachine *s);
31#ifdef GSM_ENABLE_CELLBROADCAST 33#ifdef GSM_ENABLE_CELLBROADCAST
32 GSM_Error DCT3_ReplySetIncomingCB(GSM_Protocol_Message msg, GSM_StateMachine *s); 34 GSM_Error DCT3_ReplySetIncomingCB(GSM_Protocol_Message msg, GSM_StateMachine *s);
33 GSM_Error DCT3_ReplyIncomingCB (GSM_Protocol_Message msg, GSM_StateMachine *s); 35 GSM_Error DCT3_ReplyIncomingCB (GSM_Protocol_Message msg, GSM_StateMachine *s);
34#endif 36#endif
35 37
36 GSM_Error DCT3_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark); 38 GSM_Error DCT3_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
37 GSM_Error DCT3_GetWAPBookmark (GSM_StateMachine *s, GSM_WAPBookmark *bookmark); 39 GSM_Error DCT3_GetWAPBookmark (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
38 GSM_Error DCT3_PressKey (GSM_StateMachine *s, GSM_KeyCode Key, bool Press); 40 GSM_Error DCT3_PressKey (GSM_StateMachine *s, GSM_KeyCode Key, bool Press);
39 GSM_Error DCT3_PlayTone (GSM_StateMachine *s, int Herz, unsigned char Volume, bool start); 41 GSM_Error DCT3_PlayTone (GSM_StateMachine *s, int Herz, unsigned char Volume, bool start);
40 GSM_Error DCT3_EnableSecurity (GSM_StateMachine *s, unsigned char status); 42 GSM_Error DCT3_EnableSecurity (GSM_StateMachine *s, unsigned char status);
41 GSM_Error DCT3_GetIMEI (GSM_StateMachine *s); 43 GSM_Error DCT3_GetIMEI (GSM_StateMachine *s);
42 GSM_Error DCT3_GetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc ); 44 GSM_Error DCT3_GetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc );
43 GSM_Error DCT3_GetNetworkInfo (GSM_StateMachine *s, GSM_NetworkInfo *netinfo); 45 GSM_Error DCT3_GetNetworkInfo (GSM_StateMachine *s, GSM_NetworkInfo *netinfo);
44 GSM_Error DCT3_DialVoice (GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber); 46 GSM_Error DCT3_DialVoice (GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber);
45 GSM_Error DCT3_Reset (GSM_StateMachine *s, bool hard ); 47 GSM_Error DCT3_Reset (GSM_StateMachine *s, bool hard );
46 GSM_Error DCT3_CancelCall (GSM_StateMachine *s, int ID, bool all); 48 GSM_Error DCT3_CancelCall (GSM_StateMachine *s, int ID, bool all);
47 GSM_Error DCT3_AnswerAllCalls (GSM_StateMachine *s); 49 GSM_Error DCT3_AnswerAllCalls (GSM_StateMachine *s);
48 GSM_Error DCT3_SendSMSMessage (GSM_StateMachine *s, GSM_SMSMessage *sms ); 50 GSM_Error DCT3_SendSMSMessage (GSM_StateMachine *s, GSM_SMSMessage *sms );
49 GSM_Error DCT3_GetAlarm (GSM_StateMachine *s, GSM_Alarm *alarm,unsigned char msgtype); 51 GSM_Error DCT3_GetAlarm (GSM_StateMachine *s, GSM_Alarm *alarm,unsigned char msgtype);
50 GSM_Error DCT3_GetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype); 52 GSM_Error DCT3_GetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype);
51 GSM_Error DCT3_SetAlarm (GSM_StateMachine *s, GSM_Alarm *alarm, unsigned char msgtype); 53 GSM_Error DCT3_SetAlarm (GSM_StateMachine *s, GSM_Alarm *alarm, unsigned char msgtype);
52 GSM_Error DCT3_SetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype); 54 GSM_Error DCT3_SetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype);
53 GSM_Error DCT3_SetIncomingCB (GSM_StateMachine *s, bool enable); 55 GSM_Error DCT3_SetIncomingCB (GSM_StateMachine *s, bool enable);
diff --git a/gammu/emb/common/phone/nokia/dct3/n6110.c b/gammu/emb/common/phone/nokia/dct3/n6110.c
index 263d12b..dac6c12 100644
--- a/gammu/emb/common/phone/nokia/dct3/n6110.c
+++ b/gammu/emb/common/phone/nokia/dct3/n6110.c
@@ -1,52 +1,54 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2/* based on some work from Markus Plail and Gnokii */
3/* Authentication function (c) 1999 or earlier by Pavel Janik */
4/* 5210 calendar IDs by Frederick Ros */ 2/* 5210 calendar IDs by Frederick Ros */
3/* based on some Markus Plail, Pavel Janik & others work from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
6 */
5 7
6#include "../../../gsmstate.h" 8#include "../../../gsmstate.h"
7 9
8#ifdef GSM_ENABLE_NOKIA6110 10#ifdef GSM_ENABLE_NOKIA6110
9 11
10#include <string.h> 12#include <string.h>
11 13
12#include "../../../../cfg/config.h" 14#include "../../../../cfg/config.h"
13#include "../../../misc/coding/coding.h" 15#include "../../../misc/coding/coding.h"
14#include "../../../service/sms/gsmsms.h" 16#include "../../../service/sms/gsmsms.h"
15#include "../../../gsmcomon.h" 17#include "../../../gsmcomon.h"
16#include "../../pfunc.h" 18#include "../../pfunc.h"
17#include "../nfunc.h" 19#include "../nfunc.h"
18#include "n6110.h" 20#include "n6110.h"
19#include "dct3func.h" 21#include "dct3func.h"
20 22
21static unsigned char N6110_MEMORY_TYPES[] = { 23static unsigned char N6110_MEMORY_TYPES[] = {
22 MEM_ME, 0x02, 24 MEM_ME, 0x02,
23 MEM_SM, 0x03, 25 MEM_SM, 0x03,
24 MEM_ON, 0x05, 26 MEM_ON, 0x05,
25 MEM_DC, 0x07, 27 MEM_DC, 0x07,
26 MEM_RC, 0x08, 28 MEM_RC, 0x08,
27 MEM_MC, 0x09, 29 MEM_MC, 0x09,
28 MEM_VM, 0x0b, 30 MEM_VM, 0x0b,
29 0x00, 0x00 31 0x00, 0x00
30}; 32};
31 33
32static GSM_Error N6110_ReplyGetPhoneLanguage(GSM_Protocol_Message msg, GSM_StateMachine *s) 34static GSM_Error N6110_ReplyGetPhoneLanguage(GSM_Protocol_Message msg, GSM_StateMachine *s)
33{ 35{
34 N6110_Language lang = N6110_Auto; 36 N6110_Language lang = N6110_Auto;
35 37
36 if (msg.Buffer[3] == 0x15) return ERR_NONE; 38 if (msg.Buffer[3] == 0x15) return ERR_NONE;
37 39
38 smprintf(s, "Phone language is %02x\n",msg.Buffer[6]); 40 smprintf(s, "Phone language is %02x\n",msg.Buffer[6]);
39 switch (msg.Buffer[6]) { 41 switch (msg.Buffer[6]) {
40 case 0x21: lang = N6110_Europe; break; //Polish 42 case 0x21: lang = N6110_Europe; break; //Polish
41 } 43 }
42 s->Phone.Data.Priv.N6110.PhoneLanguage = lang; 44 s->Phone.Data.Priv.N6110.PhoneLanguage = lang;
43 return ERR_NONE; 45 return ERR_NONE;
44} 46}
45 47
46static GSM_Error N6110_GetPhoneLanguage(GSM_StateMachine *s) 48static GSM_Error N6110_GetPhoneLanguage(GSM_StateMachine *s)
47{ 49{
48 unsigned char feat_req[] = {N6110_FRAME_HEADER, 0x13, 0x01, 50 unsigned char feat_req[] = {N6110_FRAME_HEADER, 0x13, 0x01,
49 0x00, /* Profile location */ 51 0x00, /* Profile location */
50 0x00}; /* Feature number */ 52 0x00}; /* Feature number */
51 53
52 s->Phone.Data.Priv.N6110.PhoneLanguage = N6110_Auto; 54 s->Phone.Data.Priv.N6110.PhoneLanguage = N6110_Auto;
@@ -82,96 +84,97 @@ static struct N6110_Lang_Char N6110_Lang_Table[] = {
82{N6110_Europe,0x93,0x01,0x44},//Latin small letter n with acute 84{N6110_Europe,0x93,0x01,0x44},//Latin small letter n with acute
83{N6110_Europe,0x9A,0x00,0xF3},//Latin small letter o with acute 85{N6110_Europe,0x9A,0x00,0xF3},//Latin small letter o with acute
84{N6110_Europe,0xB2,0x20,0xAC},//euro 86{N6110_Europe,0xB2,0x20,0xAC},//euro
85{N6110_Europe,0xB5,0x01,0x5A},//Latin capital letter s with acute 87{N6110_Europe,0xB5,0x01,0x5A},//Latin capital letter s with acute
86{N6110_Europe,0xB6,0x01,0x5B},//Latin small letter s with acute 88{N6110_Europe,0xB6,0x01,0x5B},//Latin small letter s with acute
87{N6110_Europe,0xE7,0x01,0x79},//Latin capital letter z with acute 89{N6110_Europe,0xE7,0x01,0x79},//Latin capital letter z with acute
88{N6110_Europe,0xEE,0x01,0x7A},//Latin small letter z with acute 90{N6110_Europe,0xEE,0x01,0x7A},//Latin small letter z with acute
89{N6110_Europe,0xF4,0x01,0x7C},//Latin small letter z with dot above 91{N6110_Europe,0xF4,0x01,0x7C},//Latin small letter z with dot above
90{N6110_Europe,0xF0,0x01,0x7B},//Latin capital letter z with dot above 92{N6110_Europe,0xF0,0x01,0x7B},//Latin capital letter z with dot above
91{0,0,0,0} 93{0,0,0,0}
92}; 94};
93 95
94static void N6110_EncodeUnicode(GSM_StateMachine *s, unsigned char *dest, const unsigned char *src, int len) 96static void N6110_EncodeUnicode(GSM_StateMachine *s, unsigned char *dest, const unsigned char *src, int len)
95{ 97{
96 int i_len = 0, o_len, i; 98 int i_len = 0, o_len, i;
97 wchar_t wc; 99 wchar_t wc;
98 GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110; 100 GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110;
99 bool found; 101 bool found;
100 102
101 for (o_len = 0; i_len < len; o_len++) { 103 for (o_len = 0; i_len < len; o_len++) {
102 found = false; 104 found = false;
103 if (Priv->PhoneLanguage != N6110_Auto) { 105 if (Priv->PhoneLanguage != N6110_Auto) {
104 i = 0; 106 i = 0;
105 while(1) { 107 while(1) {
106 if (N6110_Lang_Table[i].Lang == 0) break; 108 if (N6110_Lang_Table[i].Lang == 0) break;
107 if (N6110_Lang_Table[i].Lang == Priv->PhoneLanguage && 109 if (N6110_Lang_Table[i].Lang == Priv->PhoneLanguage &&
108 N6110_Lang_Table[i].Phone == src[i_len]) { 110 N6110_Lang_Table[i].Phone == src[i_len]) {
109 dest[o_len*2] = N6110_Lang_Table[i].Unicode1; 111 dest[o_len*2] = N6110_Lang_Table[i].Unicode1;
110 dest[(o_len*2)+1] = N6110_Lang_Table[i].Unicode2; 112 dest[(o_len*2)+1] = N6110_Lang_Table[i].Unicode2;
111 i_len++; 113 i_len++;
112 found = true; 114 found = true;
113 break; 115 break;
114 } 116 }
115 i++; 117 i++;
116 } 118 }
117 } 119 }
118 if (!found) { 120 if (!found) {
119 i_len += EncodeWithUnicodeAlphabet(&src[i_len], &wc); 121 i_len += EncodeWithUnicodeAlphabet(&src[i_len], &wc);
120 dest[o_len*2] = (wc >> 8) & 0xff; 122 dest[o_len*2] = (wc >> 8) & 0xff;
121 dest[(o_len*2)+1] = wc & 0xff; 123 dest[(o_len*2)+1] = wc & 0xff;
122 } 124 }
123 } 125 }
124 dest[o_len*2] = 0; 126 dest[o_len*2] = 0;
125 dest[(o_len*2)+1] = 0; 127 dest[(o_len*2)+1] = 0;
126} 128}
127 129
128#ifndef ENABLE_LGPL 130#ifndef ENABLE_LGPL
129 131
132/* Pavel Janik */
130/* This function provides Nokia authentication protocol. 133/* This function provides Nokia authentication protocol.
131 * Nokia authentication protocol is used in the communication between Nokia 134 * Nokia authentication protocol is used in the communication between Nokia
132 * mobile phones (e.g. Nokia 6110) and Nokia Cellular Data Suite software, 135 * mobile phones (e.g. Nokia 6110) and Nokia Cellular Data Suite software,
133 * commercially sold by Nokia Corp. 136 * commercially sold by Nokia Corp.
134 * The authentication scheme is based on the token send by the phone to the 137 * The authentication scheme is based on the token send by the phone to the
135 * software. The software does it's magic (see the function 138 * software. The software does it's magic (see the function
136 * N6110_GetNokiaAuthentication) and returns the result back to the phone. 139 * N6110_GetNokiaAuthentication) and returns the result back to the phone.
137 * If the result is correct the phone responds with the message "Accessory 140 * If the result is correct the phone responds with the message "Accessory
138 * connected!" displayed on the LCD. Otherwise it will display "Accessory not 141 * connected!" displayed on the LCD. Otherwise it will display "Accessory not
139 * supported" and some functions will not be available for use (?). 142 * supported" and some functions will not be available for use (?).
140 * The specification of the protocol is not publicly available, no comment. 143 * The specification of the protocol is not publicly available, no comment.
141 */ 144 */
142static void N6110_GetNokiaAuthentication(unsigned char *Imei, unsigned char *MagicBytes, unsigned char *MagicResponse) 145static void N6110_GetNokiaAuthentication(unsigned char *Imei, unsigned char *MagicBytes, unsigned char *MagicResponse)
143{ 146{
144 int i, j, CRC=0; 147 int i, j, CRC=0;
145 unsigned char Temp[16]; /* This is our temporary working area. */ 148 unsigned char Temp[16]; /* This is our temporary working area. */
146 149
147 /* Here we put FAC (Final Assembly Code) and serial number into our area. */ 150 /* Here we put FAC (Final Assembly Code) and serial number into our area. */
148 Temp[0] = Imei[6]; Temp[1] = Imei[7]; 151 Temp[0] = Imei[6]; Temp[1] = Imei[7];
149 Temp[2] = Imei[8]; Temp[3] = Imei[9]; 152 Temp[2] = Imei[8]; Temp[3] = Imei[9];
150 Temp[4] = Imei[10]; Temp[5] = Imei[11]; 153 Temp[4] = Imei[10]; Temp[5] = Imei[11];
151 Temp[6] = Imei[12]; Temp[7] = Imei[13]; 154 Temp[6] = Imei[12]; Temp[7] = Imei[13];
152 155
153 /* And now the TAC (Type Approval Code). */ 156 /* And now the TAC (Type Approval Code). */
154 Temp[8] = Imei[2]; Temp[9] = Imei[3]; 157 Temp[8] = Imei[2]; Temp[9] = Imei[3];
155 Temp[10] = Imei[4]; Temp[11] = Imei[5]; 158 Temp[10] = Imei[4]; Temp[11] = Imei[5];
156 159
157 /* And now we pack magic bytes from the phone. */ 160 /* And now we pack magic bytes from the phone. */
158 Temp[12] = MagicBytes[0]; Temp[13] = MagicBytes[1]; 161 Temp[12] = MagicBytes[0]; Temp[13] = MagicBytes[1];
159 Temp[14] = MagicBytes[2]; Temp[15] = MagicBytes[3]; 162 Temp[14] = MagicBytes[2]; Temp[15] = MagicBytes[3];
160 163
161 for (i=0; i<=11; i++) if (Temp[i + 1]& 1) Temp[i]<<=1; 164 for (i=0; i<=11; i++) if (Temp[i + 1]& 1) Temp[i]<<=1;
162 switch (Temp[15] & 0x03) { 165 switch (Temp[15] & 0x03) {
163 case 1: 166 case 1:
164 case 2: j = Temp[13] & 0x07; 167 case 2: j = Temp[13] & 0x07;
165 for (i=0; i<=3; i++) Temp[i+j] ^= Temp[i+12]; 168 for (i=0; i<=3; i++) Temp[i+j] ^= Temp[i+12];
166 break; 169 break;
167 default: j = Temp[14] & 0x07; 170 default: j = Temp[14] & 0x07;
168 for (i=0; i<=3; i++) Temp[i + j] |= Temp[i + 12]; 171 for (i=0; i<=3; i++) Temp[i + j] |= Temp[i + 12];
169 } 172 }
170 for (i=0; i<=15; i++) CRC ^= Temp[i]; 173 for (i=0; i<=15; i++) CRC ^= Temp[i];
171 for (i=0; i<=15; i++) { 174 for (i=0; i<=15; i++) {
172 switch (Temp[15 - i] & 0x06) { 175 switch (Temp[15 - i] & 0x06) {
173 case 0: j = Temp[i] | CRC; break; 176 case 0: j = Temp[i] | CRC; break;
174 case 2: 177 case 2:
175 case 4: j = Temp[i] ^ CRC; break; 178 case 4: j = Temp[i] ^ CRC; break;
176 case 6: j = Temp[i] & CRC; break; 179 case 6: j = Temp[i] & CRC; break;
177 } 180 }
@@ -779,96 +782,97 @@ static GSM_Error N6110_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone,
779 0x00,0x78}; 782 0x00,0x78};
780 unsigned char reqBin[1000] = {0x00,0x01,0xa0,0x00,0x00,0x0c,0x01,0x2c}; 783 unsigned char reqBin[1000] = {0x00,0x01,0xa0,0x00,0x00,0x0c,0x01,0x2c};
781 784
782 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NORING)) return ERR_NOTSUPPORTED; 785 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NORING)) return ERR_NOTSUPPORTED;
783 if (Ringtone->Location == 0) return ERR_INVALIDLOCATION; 786 if (Ringtone->Location == 0) return ERR_INVALIDLOCATION;
784 787
785 switch (Ringtone->Format) { 788 switch (Ringtone->Format) {
786 case RING_NOTETONE: 789 case RING_NOTETONE:
787 if (Ringtone->Location==255) { 790 if (Ringtone->Location==255) {
788 /* Only 6110, 6130 and 6150 support it */ 791 /* Only 6110, 6130 and 6150 support it */
789 if (strcmp(s->Phone.Data.Model,"NSE-3") == 0 || strcmp(s->Phone.Data.Model,"NSK-3") == 0 || 792 if (strcmp(s->Phone.Data.Model,"NSE-3") == 0 || strcmp(s->Phone.Data.Model,"NSK-3") == 0 ||
790 strcmp(s->Phone.Data.Model,"NSM-1") == 0) { 793 strcmp(s->Phone.Data.Model,"NSM-1") == 0) {
791 req[0] = 0x0c; 794 req[0] = 0x0c;
792 req[1] = 0x01; 795 req[1] = 0x01;
793 UDHHeader.Type = UDH_NokiaRingtone; 796 UDHHeader.Type = UDH_NokiaRingtone;
794 GSM_EncodeUDHHeader(&UDHHeader); 797 GSM_EncodeUDHHeader(&UDHHeader);
795 /* We copy UDH now */ 798 /* We copy UDH now */
796 memcpy(req+2,UDHHeader.Text,UDHHeader.Length); 799 memcpy(req+2,UDHHeader.Text,UDHHeader.Length);
797 *maxlength=GSM_EncodeNokiaRTTLRingtone(*Ringtone, req+2+UDHHeader.Length, &size); 800 *maxlength=GSM_EncodeNokiaRTTLRingtone(*Ringtone, req+2+UDHHeader.Length, &size);
798 error = s->Protocol.Functions->WriteMessage(s, req, 2+UDHHeader.Length+size, 0x12); 801 error = s->Protocol.Functions->WriteMessage(s, req, 2+UDHHeader.Length+size, 0x12);
799 if (error!=ERR_NONE) return error; 802 if (error!=ERR_NONE) return error;
800 my_sleep(1000); 803 my_sleep(1000);
801 /* We have to make something (not important, what) now */ 804 /* We have to make something (not important, what) now */
802 /* no answer from phone*/ 805 /* no answer from phone*/
803 return DCT3_GetNetworkInfo(s,&NetInfo); 806 return DCT3_GetNetworkInfo(s,&NetInfo);
804 } else { 807 } else {
805 return ERR_NOTSUPPORTED; 808 return ERR_NOTSUPPORTED;
806 } 809 }
807 } 810 }
808 *maxlength=GSM_EncodeNokiaRTTLRingtone(*Ringtone, req+7, &size); 811 *maxlength=GSM_EncodeNokiaRTTLRingtone(*Ringtone, req+7, &size);
809 req[4] = Ringtone->Location - 1; 812 req[4] = Ringtone->Location - 1;
810 smprintf(s, "Setting ringtone\n"); 813 smprintf(s, "Setting ringtone\n");
811 return GSM_WaitFor (s, req, 7 + size, 0x05, 4, ID_SetRingtone); 814 return GSM_WaitFor (s, req, 7 + size, 0x05, 4, ID_SetRingtone);
812 case RING_NOKIABINARY: 815 case RING_NOKIABINARY:
813 error=DCT3_EnableSecurity (s, 0x01); 816 error=DCT3_EnableSecurity (s, 0x01);
814 if (error!=ERR_NONE) return error; 817 if (error!=ERR_NONE) return error;
815 memcpy(reqBin+current,DecodeUnicodeString(Ringtone->Name),UnicodeLength(Ringtone->Name)); 818 memcpy(reqBin+current,DecodeUnicodeString(Ringtone->Name),UnicodeLength(Ringtone->Name));
816 current += UnicodeLength(Ringtone->Name); 819 current += UnicodeLength(Ringtone->Name);
817 reqBin[current++] = 0x00; 820 reqBin[current++] = 0x00;
818 reqBin[current++] = 0x00; 821 reqBin[current++] = 0x00;
819 reqBin[current++] = 0x00;/*xxx*/ 822 reqBin[current++] = 0x00;/*xxx*/
820 memcpy(reqBin+current,Ringtone->NokiaBinary.Frame,Ringtone->NokiaBinary.Length); 823 memcpy(reqBin+current,Ringtone->NokiaBinary.Frame,Ringtone->NokiaBinary.Length);
821 current=current+Ringtone->NokiaBinary.Length; 824 current=current+Ringtone->NokiaBinary.Length;
822 reqBin[3]=Ringtone->Location-1; 825 reqBin[3]=Ringtone->Location-1;
823 if (!strcmp(s->Phone.Data.ModelInfo->model,"3210")) reqBin[5]=0x10; 826 if (!strcmp(s->Phone.Data.ModelInfo->model,"3210")) reqBin[5]=0x10;
824 smprintf(s, "Setting binary ringtone\n"); 827 smprintf(s, "Setting binary ringtone\n");
825 return GSM_WaitFor (s, reqBin, current, 0x40, 4, ID_SetRingtone); 828 return GSM_WaitFor (s, reqBin, current, 0x40, 4, ID_SetRingtone);
826 case RING_MIDI: 829 case RING_MIDI:
830 case RING_MMF:
827 return ERR_NOTSUPPORTED; 831 return ERR_NOTSUPPORTED;
828 } 832 }
829 return ERR_NOTSUPPORTED; 833 return ERR_NOTSUPPORTED;
830} 834}
831 835
832static GSM_Error N6110_ReplyGetOpLogo(GSM_Protocol_Message msg, GSM_StateMachine *s) 836static GSM_Error N6110_ReplyGetOpLogo(GSM_Protocol_Message msg, GSM_StateMachine *s)
833{ 837{
834 int count=5; 838 int count=5;
835 GSM_Phone_Data *Data = &s->Phone.Data; 839 GSM_Phone_Data *Data = &s->Phone.Data;
836 840
837 smprintf(s, "Operator logo received\n"); 841 smprintf(s, "Operator logo received\n");
838 NOKIA_DecodeNetworkCode(msg.Buffer+count,Data->Bitmap->NetworkCode); 842 NOKIA_DecodeNetworkCode(msg.Buffer+count,Data->Bitmap->NetworkCode);
839 count = count + 3; 843 count = count + 3;
840 smprintf(s, "Network code : %s\n", Data->Bitmap->NetworkCode); 844 smprintf(s, "Network code : %s\n", Data->Bitmap->NetworkCode);
841 smprintf(s, "Network name for Gammu : %s ", 845 smprintf(s, "Network name for Gammu : %s ",
842 DecodeUnicodeString(GSM_GetNetworkName(Data->Bitmap->NetworkCode))); 846 DecodeUnicodeString(GSM_GetNetworkName(Data->Bitmap->NetworkCode)));
843 smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(Data->Bitmap->NetworkCode))); 847 smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(Data->Bitmap->NetworkCode)));
844 848
845 count = count + 3; /* We ignore size */ 849 count = count + 3; /* We ignore size */
846 Data->Bitmap->BitmapWidth = msg.Buffer[count++]; 850 Data->Bitmap->BitmapWidth = msg.Buffer[count++];
847 Data->Bitmap->BitmapHeight = msg.Buffer[count++]; 851 Data->Bitmap->BitmapHeight = msg.Buffer[count++];
848 count++; 852 count++;
849 PHONE_DecodeBitmap(GSM_NokiaOperatorLogo,msg.Buffer+count,Data->Bitmap); 853 PHONE_DecodeBitmap(GSM_NokiaOperatorLogo,msg.Buffer+count,Data->Bitmap);
850 return ERR_NONE; 854 return ERR_NONE;
851} 855}
852 856
853static GSM_Error N6110_ReplyGetStartup(GSM_Protocol_Message msg, GSM_StateMachine *s) 857static GSM_Error N6110_ReplyGetStartup(GSM_Protocol_Message msg, GSM_StateMachine *s)
854{ 858{
855 int i, count = 5; 859 int i, count = 5;
856 GSM_Phone_Data *Data = &s->Phone.Data; 860 GSM_Phone_Data *Data = &s->Phone.Data;
857 861
858 smprintf(s, "Startup logo & notes received\n"); 862 smprintf(s, "Startup logo & notes received\n");
859 for (i=0;i<msg.Buffer[4];i++) { 863 for (i=0;i<msg.Buffer[4];i++) {
860 switch (msg.Buffer[count++]) { 864 switch (msg.Buffer[count++]) {
861 case 0x01: 865 case 0x01:
862 smprintf(s, "Startup logo\n"); 866 smprintf(s, "Startup logo\n");
863 if (Data->Bitmap->Type == GSM_StartupLogo) { 867 if (Data->Bitmap->Type == GSM_StartupLogo) {
864 Data->Bitmap->BitmapHeight = msg.Buffer[count++]; 868 Data->Bitmap->BitmapHeight = msg.Buffer[count++];
865 Data->Bitmap->BitmapWidth = msg.Buffer[count++]; 869 Data->Bitmap->BitmapWidth = msg.Buffer[count++];
866 PHONE_DecodeBitmap(GSM_NokiaStartupLogo, msg.Buffer + count, Data->Bitmap); 870 PHONE_DecodeBitmap(GSM_NokiaStartupLogo, msg.Buffer + count, Data->Bitmap);
867 } else { 871 } else {
868 count = count + 2; 872 count = count + 2;
869 } 873 }
870 count = count + PHONE_GetBitmapSize(GSM_NokiaStartupLogo,0,0); 874 count = count + PHONE_GetBitmapSize(GSM_NokiaStartupLogo,0,0);
871 break; 875 break;
872 case 0x02: 876 case 0x02:
873 smprintf(s, "Welcome note\n"); 877 smprintf(s, "Welcome note\n");
874 if (Data->Bitmap->Type == GSM_WelcomeNote_Text) { 878 if (Data->Bitmap->Type == GSM_WelcomeNote_Text) {
@@ -1479,133 +1483,135 @@ static GSM_Error N6110_ReplyGetRingtone(GSM_Protocol_Message msg, GSM_StateMachi
1479 int i,end,start; 1483 int i,end,start;
1480 1484
1481 smprintf(s, "Ringtone received\n"); 1485 smprintf(s, "Ringtone received\n");
1482 switch (msg.Buffer[4]) { 1486 switch (msg.Buffer[4]) {
1483 case 0x00: 1487 case 0x00:
1484 switch (Data->Ringtone->Format) { 1488 switch (Data->Ringtone->Format) {
1485 case RING_NOTETONE: 1489 case RING_NOTETONE:
1486 memcpy(buffer,msg.Buffer,msg.Length); 1490 memcpy(buffer,msg.Buffer,msg.Length);
1487 i=7; 1491 i=7;
1488 if (buffer[9]==0x4a && buffer[10]==0x3a) i=8; 1492 if (buffer[9]==0x4a && buffer[10]==0x3a) i=8;
1489 buffer[i]=0x02; 1493 buffer[i]=0x02;
1490 error=GSM_DecodeNokiaRTTLRingtone(Data->Ringtone, buffer+i, msg.Length-i); 1494 error=GSM_DecodeNokiaRTTLRingtone(Data->Ringtone, buffer+i, msg.Length-i);
1491 if (error!=ERR_NONE) return ERR_EMPTY; 1495 if (error!=ERR_NONE) return ERR_EMPTY;
1492 return ERR_NONE; 1496 return ERR_NONE;
1493 case RING_NOKIABINARY: 1497 case RING_NOKIABINARY:
1494 i=8; 1498 i=8;
1495 while (msg.Buffer[i]!=0) { 1499 while (msg.Buffer[i]!=0) {
1496 i++; 1500 i++;
1497 if (i>msg.Length) return ERR_EMPTY; 1501 if (i>msg.Length) return ERR_EMPTY;
1498 } 1502 }
1499 EncodeUnicode(Data->Ringtone->Name,msg.Buffer+8,i-8); 1503 EncodeUnicode(Data->Ringtone->Name,msg.Buffer+8,i-8);
1500 smprintf(s, "Name \"%s\"\n",DecodeUnicodeString(Data->Ringtone->Name)); 1504 smprintf(s, "Name \"%s\"\n",DecodeUnicodeString(Data->Ringtone->Name));
1501 /* Looking for start && end */ 1505 /* Looking for start && end */
1502 end=0;start=0;i=0; 1506 end=0;start=0;i=0;
1503 while (true) { 1507 while (true) {
1504 if (start!=0) { 1508 if (start!=0) {
1505 if (msg.Buffer[i]==0x07 && msg.Buffer[i+1]==0x0b) { 1509 if (msg.Buffer[i]==0x07 && msg.Buffer[i+1]==0x0b) {
1506 end=i+2; break; 1510 end=i+2; break;
1507 } 1511 }
1508 if (msg.Buffer[i]==0x0e && msg.Buffer[i+1]==0x0b) { 1512 if (msg.Buffer[i]==0x0e && msg.Buffer[i+1]==0x0b) {
1509 end=i+2; break; 1513 end=i+2; break;
1510 } 1514 }
1511 } else { 1515 } else {
1512 if (msg.Buffer[i]==0x02 && msg.Buffer[i+1]==0xfc && msg.Buffer[i+2]==0x09) { 1516 if (msg.Buffer[i]==0x02 && msg.Buffer[i+1]==0xfc && msg.Buffer[i+2]==0x09) {
1513 start = i; 1517 start = i;
1514 } 1518 }
1515 } 1519 }
1516 i++; 1520 i++;
1517 if (i==msg.Length-3) return ERR_EMPTY; 1521 if (i==msg.Length-3) return ERR_EMPTY;
1518 } 1522 }
1519 /* Copying frame */ 1523 /* Copying frame */
1520 memcpy(Data->Ringtone->NokiaBinary.Frame,msg.Buffer+start,end-start); 1524 memcpy(Data->Ringtone->NokiaBinary.Frame,msg.Buffer+start,end-start);
1521 Data->Ringtone->NokiaBinary.Length=end-start; 1525 Data->Ringtone->NokiaBinary.Length=end-start;
1522#ifdef DEBUG 1526#ifdef DEBUG
1523 if (di.dl == DL_TEXTALL || di.dl == DL_TEXTALLDATE) DumpMessage(di.df, di.dl, Data->Ringtone->NokiaBinary.Frame, Data->Ringtone->NokiaBinary.Length); 1527 if (di.dl == DL_TEXTALL || di.dl == DL_TEXTALLDATE) DumpMessage(di.df, di.dl, Data->Ringtone->NokiaBinary.Frame, Data->Ringtone->NokiaBinary.Length);
1524#endif 1528#endif
1525 return ERR_NONE; 1529 return ERR_NONE;
1526 case RING_MIDI: 1530 case RING_MIDI:
1531 case RING_MMF:
1527 return ERR_NOTSUPPORTED; 1532 return ERR_NOTSUPPORTED;
1528 } 1533 }
1529 smprintf(s, "Ringtone format is %i\n",Data->Ringtone->Format); 1534 smprintf(s, "Ringtone format is %i\n",Data->Ringtone->Format);
1530 break; 1535 break;
1531 default: 1536 default:
1532 smprintf(s, "Invalid location. Too high ?\n"); 1537 smprintf(s, "Invalid location. Too high ?\n");
1533 return ERR_INVALIDLOCATION; 1538 return ERR_INVALIDLOCATION;
1534 } 1539 }
1535 return ERR_UNKNOWNRESPONSE; 1540 return ERR_UNKNOWNRESPONSE;
1536} 1541}
1537 1542
1538static GSM_Error N6110_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone) 1543static GSM_Error N6110_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone)
1539{ 1544{
1540 GSM_Error error; 1545 GSM_Error error;
1541 unsigned char req[] = {0x00, 0x01, 0x9e, 1546 unsigned char req[] = {0x00, 0x01, 0x9e,
1542 0x00}; /* location */ 1547 0x00}; /* location */
1543 1548
1544 if (PhoneRingtone) return ERR_NOTSUPPORTED; 1549 if (PhoneRingtone) return ERR_NOTSUPPORTED;
1545 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NORING)) return ERR_NOTSUPPORTED; 1550 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NORING)) return ERR_NOTSUPPORTED;
1546 if (Ringtone->Location == 0) return ERR_INVALIDLOCATION; 1551 if (Ringtone->Location == 0) return ERR_INVALIDLOCATION;
1547 1552
1548 if (Ringtone->Format == 0x00) { 1553 if (Ringtone->Format == 0x00) {
1549 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) { 1554 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) {
1550 Ringtone->Format = RING_NOTETONE; 1555 Ringtone->Format = RING_NOTETONE;
1551 } else { 1556 } else {
1552 Ringtone->Format = RING_NOKIABINARY; 1557 Ringtone->Format = RING_NOKIABINARY;
1553 } 1558 }
1554 } 1559 }
1555 1560
1556 switch (Ringtone->Format) { 1561 switch (Ringtone->Format) {
1557 case RING_NOTETONE: 1562 case RING_NOTETONE:
1558 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) return ERR_NOTSUPPORTED; 1563 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) return ERR_NOTSUPPORTED;
1559 break; 1564 break;
1560 case RING_NOKIABINARY: 1565 case RING_NOKIABINARY:
1561 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) return ERR_NOTSUPPORTED; 1566 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) return ERR_NOTSUPPORTED;
1562 break; 1567 break;
1563 case RING_MIDI: 1568 case RING_MIDI:
1569 case RING_MMF:
1564 return ERR_NOTSUPPORTED; 1570 return ERR_NOTSUPPORTED;
1565 } 1571 }
1566 1572
1567 error=DCT3_EnableSecurity (s, 0x01); 1573 error=DCT3_EnableSecurity (s, 0x01);
1568 if (error!=ERR_NONE) return error; 1574 if (error!=ERR_NONE) return error;
1569 1575
1570 req[3]=Ringtone->Location-1; 1576 req[3]=Ringtone->Location-1;
1571 s->Phone.Data.Ringtone=Ringtone; 1577 s->Phone.Data.Ringtone=Ringtone;
1572 smprintf(s, "Getting (binary) ringtone\n"); 1578 smprintf(s, "Getting (binary) ringtone\n");
1573 return GSM_WaitFor (s, req, 4, 0x40, 4, ID_GetRingtone); 1579 return GSM_WaitFor (s, req, 4, 0x40, 4, ID_GetRingtone);
1574} 1580}
1575 1581
1576static GSM_Error N6110_ReplyGetSecurityStatus(GSM_Protocol_Message msg, GSM_StateMachine *s) 1582static GSM_Error N6110_ReplyGetSecurityStatus(GSM_Protocol_Message msg, GSM_StateMachine *s)
1577{ 1583{
1578 *s->Phone.Data.SecurityStatus = msg.Buffer[4]; 1584 *s->Phone.Data.SecurityStatus = msg.Buffer[4];
1579 1585
1580#ifdef DEBUG 1586#ifdef DEBUG
1581 smprintf(s, "Security code status\n"); 1587 smprintf(s, "Security code status\n");
1582 switch(msg.Buffer[4]) { 1588 switch(msg.Buffer[4]) {
1583 case SEC_SecurityCode: smprintf(s, "waiting for Security Code.\n"); break; 1589 case SEC_SecurityCode: smprintf(s, "waiting for Security Code.\n"); break;
1584 case SEC_Pin : smprintf(s, "waiting for PIN.\n"); break; 1590 case SEC_Pin : smprintf(s, "waiting for PIN.\n"); break;
1585 case SEC_Pin2 : smprintf(s, "waiting for PIN2.\n"); break; 1591 case SEC_Pin2 : smprintf(s, "waiting for PIN2.\n"); break;
1586 case SEC_Puk : smprintf(s, "waiting for PUK.\n"); break; 1592 case SEC_Puk : smprintf(s, "waiting for PUK.\n"); break;
1587 case SEC_Puk2 : smprintf(s, "waiting for PUK2.\n"); break; 1593 case SEC_Puk2 : smprintf(s, "waiting for PUK2.\n"); break;
1588 case SEC_None : smprintf(s, "nothing to enter.\n"); break; 1594 case SEC_None : smprintf(s, "nothing to enter.\n"); break;
1589 default : smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]); 1595 default : smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]);
1590 return ERR_UNKNOWNRESPONSE; 1596 return ERR_UNKNOWNRESPONSE;
1591 } 1597 }
1592#endif 1598#endif
1593 return ERR_NONE; 1599 return ERR_NONE;
1594} 1600}
1595 1601
1596static GSM_Error N6110_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status) 1602static GSM_Error N6110_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
1597{ 1603{
1598 unsigned char req[4] = {N6110_FRAME_HEADER, 0x07}; 1604 unsigned char req[4] = {N6110_FRAME_HEADER, 0x07};
1599 1605
1600 s->Phone.Data.SecurityStatus=Status; 1606 s->Phone.Data.SecurityStatus=Status;
1601 smprintf(s, "Getting security code status\n"); 1607 smprintf(s, "Getting security code status\n");
1602 return GSM_WaitFor (s, req, 4, 0x08, 2, ID_GetSecurityStatus); 1608 return GSM_WaitFor (s, req, 4, 0x08, 2, ID_GetSecurityStatus);
1603} 1609}
1604 1610
1605static GSM_Error N6110_ReplyEnterSecurityCode(GSM_Protocol_Message msg, GSM_StateMachine *s) 1611static GSM_Error N6110_ReplyEnterSecurityCode(GSM_Protocol_Message msg, GSM_StateMachine *s)
1606{ 1612{
1607 switch (msg.Buffer[3]) { 1613 switch (msg.Buffer[3]) {
1608 case 0x0b: 1614 case 0x0b:
1609 smprintf(s, "Security code OK\n"); 1615 smprintf(s, "Security code OK\n");
1610 return ERR_NONE; 1616 return ERR_NONE;
1611 case 0x0c: 1617 case 0x0c:
@@ -2398,98 +2404,98 @@ static GSM_Error N6110_ReplyGetNextCalendar(GSM_Protocol_Message msg, GSM_StateM
2398 } 2404 }
2399 } 2405 }
2400 return ERR_NONE; 2406 return ERR_NONE;
2401 case 0x93: 2407 case 0x93:
2402 smprintf(s, "Can't get calendar note - too high location?\n"); 2408 smprintf(s, "Can't get calendar note - too high location?\n");
2403 return ERR_INVALIDLOCATION; 2409 return ERR_INVALIDLOCATION;
2404 } 2410 }
2405 return ERR_UNKNOWNRESPONSE; 2411 return ERR_UNKNOWNRESPONSE;
2406} 2412}
2407 2413
2408static GSM_Error N6110_GetNextCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start) 2414static GSM_Error N6110_GetNextCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start)
2409{ 2415{
2410 int Text, Time, Alarm, Phone, Recurrance, EndTime, Location; 2416 int Text, Time, Alarm, Phone, Recurrance, EndTime, Location;
2411 GSM_Error error; 2417 GSM_Error error;
2412 GSM_DateTime date_time; 2418 GSM_DateTime date_time;
2413 GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110; 2419 GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110;
2414 unsigned char req[] = {N6110_FRAME_HEADER, 0x66, 2420 unsigned char req[] = {N6110_FRAME_HEADER, 0x66,
2415 0x00}; /* Location */ 2421 0x00}; /* Location */
2416 2422
2417 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOCALENDAR)) return ERR_NOTSUPPORTED; 2423 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOCALENDAR)) return ERR_NOTSUPPORTED;
2418 2424
2419 if (start) { 2425 if (start) {
2420 Priv->LastCalendarPos = 1; 2426 Priv->LastCalendarPos = 1;
2421 } else { 2427 } else {
2422 Priv->LastCalendarPos++; 2428 Priv->LastCalendarPos++;
2423 } 2429 }
2424 2430
2425 Note->Location = Priv->LastCalendarPos; 2431 Note->Location = Priv->LastCalendarPos;
2426 req[4] = Priv->LastCalendarPos; 2432 req[4] = Priv->LastCalendarPos;
2427 2433
2428 s->Phone.Data.Cal=Note; 2434 s->Phone.Data.Cal=Note;
2429 smprintf(s, "Getting calendar note\n"); 2435 smprintf(s, "Getting calendar note\n");
2430 error=GSM_WaitFor (s, req, 5, 0x13, 4, ID_GetCalendarNote); 2436 error=GSM_WaitFor (s, req, 5, 0x13, 4, ID_GetCalendarNote);
2431 2437
2432 GSM_CalendarFindDefaultTextTimeAlarmPhoneRecurrance(Note, &Text, &Time, &Alarm, &Phone, &Recurrance, &EndTime, &Location); 2438 GSM_CalendarFindDefaultTextTimeAlarmPhoneRecurrance(Note, &Text, &Time, &Alarm, &Phone, &Recurrance, &EndTime, &Location);
2433 /* 2090 year is set for example in 3310 */ 2439 /* 2090 year is set for example in 3310 */
2434 if (error == ERR_NONE && Note->Entries[Time].Date.Year == 2090) { 2440 if (error == ERR_NONE && Note->Entries[Time].Date.Year == 2090) {
2435 error=N6110_GetDateTime(s, &date_time); 2441 error=N6110_GetDateTime(s, &date_time);
2436 if (error == ERR_NONE) Note->Entries[Time].Date.Year = date_time.Year; 2442 if (error == ERR_NONE) Note->Entries[Time].Date.Year = date_time.Year;
2437 } 2443 }
2438 return error; 2444 return error;
2439} 2445}
2440 2446
2441GSM_Error N6110_ReplyUSSDInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) 2447GSM_Error N6110_ReplyUSSDInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
2442{ 2448{
2443 unsigned char buffer[2000],buffer2[4000]; 2449 unsigned char buffer[2000],buffer2[4000];
2444 int tmp; 2450 int tmp;
2445 2451
2446 tmp=GSM_UnpackEightBitsToSeven(0, 82, 82, msg.Buffer+8, buffer); 2452 tmp=GSM_UnpackEightBitsToSeven(0, msg.Buffer[7], 82, msg.Buffer+8, buffer);
2447 msg.Buffer[tmp] = 0; 2453 buffer[tmp] = 0;
2448 2454
2449 smprintf(s, "USSD reply: \"%s\"\n",buffer); 2455 smprintf(s, "USSD reply: \"%s\"\n",buffer);
2450 2456
2451 if (s->Phone.Data.EnableIncomingUSSD && s->User.IncomingUSSD!=NULL) { 2457 if (s->Phone.Data.EnableIncomingUSSD && s->User.IncomingUSSD!=NULL) {
2452 EncodeUnicode(buffer2,buffer,strlen(buffer)); 2458 EncodeUnicode(buffer2,buffer,strlen(buffer));
2453 s->User.IncomingUSSD(s->CurrentConfig->Device, buffer2); 2459 s->User.IncomingUSSD(s->CurrentConfig->Device, buffer2);
2454 } 2460 }
2455 2461
2456 return ERR_NONE; 2462 return ERR_NONE;
2457} 2463}
2458 2464
2459GSM_Error N6110_AnswerCall(GSM_StateMachine *s, int ID, bool all) 2465GSM_Error N6110_AnswerCall(GSM_StateMachine *s, int ID, bool all)
2460{ 2466{
2461 GSM_Error error; 2467 GSM_Error error;
2462 unsigned char req1[] = {N6110_FRAME_HEADER, 0x42, 0x05, 0x01, 2468 unsigned char req1[] = {N6110_FRAME_HEADER, 0x42, 0x05, 0x01,
2463 0x07, 0xa2, 0x88, 0x81, 0x21, 0x15, 0x63, 0xa8, 2469 0x07, 0xa2, 0x88, 0x81, 0x21, 0x15, 0x63, 0xa8,
2464 0x00, 0x00, 0x07, 0xa3, 0xb8, 0x81, 0x20, 0x15, 2470 0x00, 0x00, 0x07, 0xa3, 0xb8, 0x81, 0x20, 0x15,
2465 0x63, 0x80}; 2471 0x63, 0x80};
2466 2472
2467 if (!all) { 2473 if (!all) {
2468 smprintf(s, "Answering call part 1\n"); 2474 smprintf(s, "Answering call part 1\n");
2469 error = GSM_WaitFor (s, req1, 24, 0x01, 5, ID_AnswerCall); 2475 error = GSM_WaitFor (s, req1, 24, 0x01, 5, ID_AnswerCall);
2470 if (error != ERR_NONE) return error; 2476 if (error != ERR_NONE) return error;
2471 return DCT3DCT4_AnswerCall(s,ID); 2477 return DCT3DCT4_AnswerCall(s,ID);
2472 } 2478 }
2473 2479
2474 return DCT3_AnswerAllCalls(s); 2480 return DCT3_AnswerAllCalls(s);
2475} 2481}
2476 2482
2477static GSM_Error N6110_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber) 2483static GSM_Error N6110_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
2478{ 2484{
2479 unsigned int pos = 4; 2485 unsigned int pos = 4;
2480 unsigned char req[100] = {N6110_FRAME_HEADER,0x01, 2486 unsigned char req[100] = {N6110_FRAME_HEADER,0x01,
2481 0x0c}; /* Length of number */ 2487 0x0c}; /* Length of number */
2482 2488
2483 if (ShowNumber == GSM_CALL_DefaultNumberPresence) return DCT3_DialVoice(s,number,ShowNumber); 2489 if (ShowNumber == GSM_CALL_DefaultNumberPresence) return DCT3_DialVoice(s,number,ShowNumber);
2484 2490
2485 req[pos++] = strlen(number); 2491 req[pos++] = strlen(number);
2486 memcpy(req+pos,number,strlen(number)); 2492 memcpy(req+pos,number,strlen(number));
2487 pos += strlen(number); 2493 pos += strlen(number);
2488 req[pos++] = 0x05; /* call type: voice - 0x05, data - 0x01 */ 2494 req[pos++] = 0x05; /* call type: voice - 0x05, data - 0x01 */
2489 req[pos++] = 0x01; 2495 req[pos++] = 0x01;
2490 req[pos++] = 0x01; 2496 req[pos++] = 0x01;
2491 req[pos++] = 0x05; 2497 req[pos++] = 0x05;
2492 req[pos++] = 0x81; 2498 req[pos++] = 0x81;
2493 switch (ShowNumber) { 2499 switch (ShowNumber) {
2494 case GSM_CALL_HideNumber: 2500 case GSM_CALL_HideNumber:
2495 req[pos++] = 0x02; 2501 req[pos++] = 0x02;
@@ -2762,123 +2768,124 @@ GSM_Phone_Functions N6110Phone = {
2762 NOKIA_GetManufacturer, 2768 NOKIA_GetManufacturer,
2763 DCT3DCT4_GetModel, 2769 DCT3DCT4_GetModel,
2764 DCT3DCT4_GetFirmware, 2770 DCT3DCT4_GetFirmware,
2765 DCT3_GetIMEI, 2771 DCT3_GetIMEI,
2766 DCT3_GetOriginalIMEI, 2772 DCT3_GetOriginalIMEI,
2767 DCT3_GetManufactureMonth, 2773 DCT3_GetManufactureMonth,
2768 DCT3_GetProductCode, 2774 DCT3_GetProductCode,
2769 DCT3_GetHardware, 2775 DCT3_GetHardware,
2770 DCT3_GetPPM, 2776 DCT3_GetPPM,
2771 NOTSUPPORTED, /* GetSIMIMSI */ 2777 NOTSUPPORTED, /* GetSIMIMSI */
2772 N6110_GetDateTime, 2778 N6110_GetDateTime,
2773 N6110_SetDateTime, 2779 N6110_SetDateTime,
2774 N6110_GetAlarm, 2780 N6110_GetAlarm,
2775 N6110_SetAlarm, 2781 N6110_SetAlarm,
2776 NOTSUPPORTED, /* GetLocale */ 2782 NOTSUPPORTED, /* GetLocale */
2777 NOTSUPPORTED, /* SetLocale */ 2783 NOTSUPPORTED, /* SetLocale */
2778 DCT3_PressKey, 2784 DCT3_PressKey,
2779 DCT3_Reset, 2785 DCT3_Reset,
2780 N61_71_ResetPhoneSettings, 2786 N61_71_ResetPhoneSettings,
2781 N6110_EnterSecurityCode, 2787 N6110_EnterSecurityCode,
2782 N6110_GetSecurityStatus, 2788 N6110_GetSecurityStatus,
2783 N6110_GetDisplayStatus, 2789 N6110_GetDisplayStatus,
2784 NOTIMPLEMENTED, /* SetAutoNetworkLogin */ 2790 NOTIMPLEMENTED, /* SetAutoNetworkLogin */
2785 N6110_GetBatteryCharge, 2791 N6110_GetBatteryCharge,
2786 N6110_GetSignalQuality, 2792 N6110_GetSignalQuality,
2787 DCT3_GetNetworkInfo, 2793 DCT3_GetNetworkInfo,
2788 NOTSUPPORTED, /* GetCategory */ 2794 NOTSUPPORTED, /* GetCategory */
2789 NOTSUPPORTED, /* AddCategory */ 2795 NOTSUPPORTED, /* AddCategory */
2790 NOTSUPPORTED, /* GetCategoryStatus */ 2796 NOTSUPPORTED, /* GetCategoryStatus */
2791 N6110_GetMemoryStatus, 2797 N6110_GetMemoryStatus,
2792 N6110_GetMemory, 2798 N6110_GetMemory,
2793 NOTIMPLEMENTED, /* GetNextMemory */ 2799 NOTIMPLEMENTED, /* GetNextMemory */
2794 N6110_SetMemory, 2800 N6110_SetMemory,
2795 NOTIMPLEMENTED, /* AddMemory */ 2801 NOTIMPLEMENTED, /* AddMemory */
2796 N6110_DeleteMemory, 2802 N6110_DeleteMemory,
2797 NOTIMPLEMENTED, /* DeleteAllMemory */ 2803 NOTIMPLEMENTED, /* DeleteAllMemory */
2798 N6110_GetSpeedDial, 2804 N6110_GetSpeedDial,
2799 NOTIMPLEMENTED, /* SetSpeedDial */ 2805 NOTIMPLEMENTED, /* SetSpeedDial */
2800 DCT3_GetSMSC, 2806 DCT3_GetSMSC,
2801 DCT3_SetSMSC, 2807 DCT3_SetSMSC,
2802 DCT3_GetSMSStatus, 2808 DCT3_GetSMSStatus,
2803 N6110_GetSMSMessage, 2809 N6110_GetSMSMessage,
2804 N6110_GetNextSMSMessage, 2810 N6110_GetNextSMSMessage,
2805 N6110_SetSMS, 2811 N6110_SetSMS,
2806 N6110_AddSMS, 2812 N6110_AddSMS,
2807 N6110_DeleteSMSMessage, 2813 N6110_DeleteSMSMessage,
2808 DCT3_SendSMSMessage, 2814 DCT3_SendSMSMessage,
2809 NOTSUPPORTED, /* SendSavedSMS */ 2815 NOTSUPPORTED, /* SendSavedSMS */
2816 NOTSUPPORTED, /* SetFastSMSSending*/
2810 NOKIA_SetIncomingSMS, 2817 NOKIA_SetIncomingSMS,
2811 DCT3_SetIncomingCB, 2818 DCT3_SetIncomingCB,
2812 PHONE_GetSMSFolders, 2819 PHONE_GetSMSFolders,
2813 NOTSUPPORTED, /* AddSMSFolder */ 2820 NOTSUPPORTED, /* AddSMSFolder */
2814 NOTSUPPORTED, /* DeleteSMSFolder */ 2821 NOTSUPPORTED, /* DeleteSMSFolder */
2815 N6110_DialVoice, 2822 N6110_DialVoice,
2816 N6110_AnswerCall, 2823 N6110_AnswerCall,
2817 DCT3_CancelCall, 2824 DCT3_CancelCall,
2818 N6110_HoldCall, 2825 N6110_HoldCall,
2819 N6110_UnholdCall, 2826 N6110_UnholdCall,
2820 N6110_ConferenceCall, 2827 N6110_ConferenceCall,
2821 N6110_SplitCall, 2828 N6110_SplitCall,
2822 N6110_TransferCall, 2829 N6110_TransferCall,
2823 N6110_SwitchCall, 2830 N6110_SwitchCall,
2824 DCT3DCT4_GetCallDivert, 2831 DCT3DCT4_GetCallDivert,
2825 DCT3DCT4_SetCallDivert, 2832 DCT3DCT4_SetCallDivert,
2826 DCT3DCT4_CancelAllDiverts, 2833 DCT3DCT4_CancelAllDiverts,
2827 NOKIA_SetIncomingCall, 2834 NOKIA_SetIncomingCall,
2828 NOKIA_SetIncomingUSSD, 2835 NOKIA_SetIncomingUSSD,
2829 DCT3DCT4_SendDTMF, 2836 DCT3DCT4_SendDTMF,
2830 N6110_GetRingtone, 2837 N6110_GetRingtone,
2831 N6110_SetRingtone, 2838 N6110_SetRingtone,
2832 NOTSUPPORTED, /* GetRingtonesInfo */ 2839 NOTSUPPORTED, /* GetRingtonesInfo */
2833 NOTSUPPORTED, /* DeleteUserRingtones */ 2840 NOTSUPPORTED, /* DeleteUserRingtones */
2834 DCT3_PlayTone, 2841 DCT3_PlayTone,
2835 DCT3_GetWAPBookmark, 2842 DCT3_GetWAPBookmark,
2836 DCT3_SetWAPBookmark, 2843 DCT3_SetWAPBookmark,
2837 DCT3_DeleteWAPBookmark, 2844 DCT3_DeleteWAPBookmark,
2838 DCT3_GetWAPSettings, 2845 DCT3_GetWAPSettings,
2839 DCT3_SetWAPSettings, 2846 DCT3_SetWAPSettings,
2840 NOTSUPPORTED, /* GetMMSSettings */ 2847 NOTSUPPORTED, /* GetMMSSettings */
2841 NOTSUPPORTED, /* SetMMSSettings */ 2848 NOTSUPPORTED, /* SetMMSSettings */
2842 NOTSUPPORTED, /* GetSyncMLSettings*/ 2849 NOTSUPPORTED, /* GetSyncMLSettings*/
2843 NOTSUPPORTED, /* SetSyncMLSettings*/ 2850 NOTSUPPORTED, /* SetSyncMLSettings*/
2844 NOTSUPPORTED, /* GetChatSettings */ 2851 NOTSUPPORTED, /* GetChatSettings */
2845 NOTSUPPORTED, /* SetChatSettings */ 2852 NOTSUPPORTED, /* SetChatSettings */
2846 N6110_GetBitmap, 2853 N6110_GetBitmap,
2847 N6110_SetBitmap, 2854 N6110_SetBitmap,
2848 NOTSUPPORTED, /* GetToDoStatus */ 2855 NOTSUPPORTED, /* GetToDoStatus */
2849 NOTSUPPORTED, /* GetToDo */ 2856 NOTSUPPORTED, /* GetToDo */
2850 NOTSUPPORTED, /* GetNextToDo */ 2857 NOTSUPPORTED, /* GetNextToDo */
2851 NOTSUPPORTED, /* SetToDo */ 2858 NOTSUPPORTED, /* SetToDo */
2852 NOTSUPPORTED, /* AddToDo */ 2859 NOTSUPPORTED, /* AddToDo */
2853 NOTSUPPORTED, /* DeleteToDo */ 2860 NOTSUPPORTED, /* DeleteToDo */
2854 NOTSUPPORTED, /* DeleteAllToDo */ 2861 NOTSUPPORTED, /* DeleteAllToDo */
2855 NOTIMPLEMENTED, /* GetCalendarStatus */ 2862 NOTIMPLEMENTED, /* GetCalendarStatus */
2856 NOTIMPLEMENTED, /* GetCalendar */ 2863 NOTIMPLEMENTED, /* GetCalendar */
2857 N6110_GetNextCalendarNote, 2864 N6110_GetNextCalendarNote,
2858 NOTIMPLEMENTED, /* SetCalendar */ 2865 NOTIMPLEMENTED, /* SetCalendar */
2859 N6110_AddCalendarNote, 2866 N6110_AddCalendarNote,
2860 N6110_DeleteCalendarNote, 2867 N6110_DeleteCalendarNote,
2861 NOTIMPLEMENTED, /* DeleteAllCalendar */ 2868 NOTIMPLEMENTED, /* DeleteAllCalendar */
2862 NOTSUPPORTED, /* GetCalendarSettings */ 2869 NOTSUPPORTED, /* GetCalendarSettings */
2863 NOTSUPPORTED, /* SetCalendarSettings */ 2870 NOTSUPPORTED, /* SetCalendarSettings */
2864 NOTSUPPORTED, /* GetNote */ 2871 NOTSUPPORTED, /* GetNextNote */
2865 N6110_GetProfile, 2872 N6110_GetProfile,
2866 N6110_SetProfile, 2873 N6110_SetProfile,
2867 NOTSUPPORTED, /* GetFMStation */ 2874 NOTSUPPORTED, /* GetFMStation */
2868 NOTSUPPORTED, /* SetFMStation */ 2875 NOTSUPPORTED, /* SetFMStation */
2869 NOTSUPPORTED, /* ClearFMStations */ 2876 NOTSUPPORTED, /* ClearFMStations */
2870 NOTSUPPORTED, /* GetNextFileFolder */ 2877 NOTSUPPORTED, /* GetNextFileFolder */
2871 NOTSUPPORTED, /* GetFilePart */ 2878 NOTSUPPORTED, /* GetFilePart */
2872 NOTSUPPORTED, /* AddFile */ 2879 NOTSUPPORTED, /* AddFile */
2873 NOTSUPPORTED, /* GetFileSystemStatus */ 2880 NOTSUPPORTED, /* GetFileSystemStatus */
2874 NOTSUPPORTED, /* DeleteFile */ 2881 NOTSUPPORTED, /* DeleteFile */
2875 NOTSUPPORTED, /* AddFolder */ 2882 NOTSUPPORTED, /* AddFolder */
2876 NOTSUPPORTED, /* GetGPRSAccessPoint */ 2883 NOTSUPPORTED, /* GetGPRSAccessPoint */
2877 NOTSUPPORTED /* SetGPRSAccessPoint */ 2884 NOTSUPPORTED /* SetGPRSAccessPoint */
2878}; 2885};
2879 2886
2880#endif 2887#endif
2881 2888
2882/* How should editor hadle tabs in this file? Add editor commands here. 2889/* How should editor hadle tabs in this file? Add editor commands here.
2883 * vim: noexpandtab sw=8 ts=8 sts=8: 2890 * vim: noexpandtab sw=8 ts=8 sts=8:
2884 */ 2891 */
diff --git a/gammu/emb/common/phone/nokia/dct3/n7110.c b/gammu/emb/common/phone/nokia/dct3/n7110.c
index 5a02c9c..b597f9b 100644
--- a/gammu/emb/common/phone/nokia/dct3/n7110.c
+++ b/gammu/emb/common/phone/nokia/dct3/n7110.c
@@ -1,50 +1,53 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2/* based on some work from Markus Plail and Gnokii */ 2/* based on some Markus Plail work from Gnokii (www.gnokii.org)
3 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
4 * GNU GPL version 2 or later
5 */
3 6
4#include "../../../gsmstate.h" 7#include "../../../gsmstate.h"
5 8
6#ifdef GSM_ENABLE_NOKIA7110 9#ifdef GSM_ENABLE_NOKIA7110
7 10
8#include <string.h> 11#include <string.h>
9#include <time.h> 12#include <time.h>
10 13
11#include "../../../misc/coding/coding.h" 14#include "../../../misc/coding/coding.h"
12#include "../../../gsmcomon.h" 15#include "../../../gsmcomon.h"
13#include "../../../service/gsmlogo.h" 16#include "../../../service/gsmlogo.h"
14#include "../../pfunc.h" 17#include "../../pfunc.h"
15#include "../nfunc.h" 18#include "../nfunc.h"
16#include "../nfuncold.h" 19#include "../nfuncold.h"
17#include "n7110.h" 20#include "n7110.h"
18#include "dct3func.h" 21#include "dct3func.h"
19 22
20static GSM_Error N7110_GetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm) 23static GSM_Error N7110_GetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm)
21{ 24{
22 return DCT3_GetAlarm(s, alarm, 0x19); 25 return DCT3_GetAlarm(s, alarm, 0x19);
23} 26}
24 27
25static GSM_Error N7110_SetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm) 28static GSM_Error N7110_SetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm)
26{ 29{
27 return DCT3_SetAlarm(s, alarm, 0x19); 30 return DCT3_SetAlarm(s, alarm, 0x19);
28} 31}
29 32
30static GSM_Error N7110_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s) 33static GSM_Error N7110_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s)
31{ 34{
32 GSM_Phone_Data *Data = &s->Phone.Data; 35 GSM_Phone_Data *Data = &s->Phone.Data;
33 36
34 smprintf(s, "Phonebook entry received\n"); 37 smprintf(s, "Phonebook entry received\n");
35 switch (msg.Buffer[6]) { 38 switch (msg.Buffer[6]) {
36 case 0x0f: 39 case 0x0f:
37 return N71_65_ReplyGetMemoryError(msg.Buffer[10], s); 40 return N71_65_ReplyGetMemoryError(msg.Buffer[10], s);
38 default: 41 default:
39 return N71_65_DecodePhonebook(s, Data->Memory,Data->Bitmap,Data->SpeedDial,msg.Buffer+18,msg.Length-18,false); 42 return N71_65_DecodePhonebook(s, Data->Memory,Data->Bitmap,Data->SpeedDial,msg.Buffer+18,msg.Length-18,false);
40 } 43 }
41 return ERR_UNKNOWN; 44 return ERR_UNKNOWN;
42} 45}
43 46
44static GSM_Error N7110_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry) 47static GSM_Error N7110_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
45{ 48{
46 unsigned char req[] = {N7110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01, 49 unsigned char req[] = {N7110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01,
47 0x02, /* memory type */ 50 0x02, /* memory type */
48 0x05, 51 0x05,
49 0x00, 0x00,/* location */ 52 0x00, 0x00,/* location */
50 0x00, 0x00}; 53 0x00, 0x00};
@@ -481,96 +484,97 @@ static GSM_Error N7110_ReplyGetRingtone(GSM_Protocol_Message msg, GSM_StateMachi
481 tmp=0;i=4; 484 tmp=0;i=4;
482 while (msg.Buffer[i]!=0 || msg.Buffer[i+1]!=0) { 485 while (msg.Buffer[i]!=0 || msg.Buffer[i+1]!=0) {
483 tmp++; 486 tmp++;
484 i=i+2; 487 i=i+2;
485 if (i>msg.Length) return ERR_EMPTY; 488 if (i>msg.Length) return ERR_EMPTY;
486 } 489 }
487 memcpy(Data->Ringtone->Name,msg.Buffer+6,tmp*2); 490 memcpy(Data->Ringtone->Name,msg.Buffer+6,tmp*2);
488 smprintf(s, "Name \"%s\"\n",DecodeUnicodeString(Data->Ringtone->Name)); 491 smprintf(s, "Name \"%s\"\n",DecodeUnicodeString(Data->Ringtone->Name));
489 /* Looking for end */ 492 /* Looking for end */
490 i=37; 493 i=37;
491 while (true) { 494 while (true) {
492 if (msg.Buffer[i]==0x07 && msg.Buffer[i+1]==0x0b) { 495 if (msg.Buffer[i]==0x07 && msg.Buffer[i+1]==0x0b) {
493 i=i+2; break; 496 i=i+2; break;
494 } 497 }
495 if (msg.Buffer[i]==0x0e && msg.Buffer[i+1]==0x0b) { 498 if (msg.Buffer[i]==0x0e && msg.Buffer[i+1]==0x0b) {
496 i=i+2; break; 499 i=i+2; break;
497 } 500 }
498 i++; 501 i++;
499 if (i==msg.Length) return ERR_EMPTY; 502 if (i==msg.Length) return ERR_EMPTY;
500 } 503 }
501 /* Copying frame */ 504 /* Copying frame */
502 memcpy(Data->Ringtone->NokiaBinary.Frame,msg.Buffer+37,i-37); 505 memcpy(Data->Ringtone->NokiaBinary.Frame,msg.Buffer+37,i-37);
503 Data->Ringtone->NokiaBinary.Length=i-37; 506 Data->Ringtone->NokiaBinary.Length=i-37;
504 return ERR_NONE; 507 return ERR_NONE;
505 case 0x24: 508 case 0x24:
506 smprintf(s, "Invalid location. Too high ?\n"); 509 smprintf(s, "Invalid location. Too high ?\n");
507 return ERR_INVALIDLOCATION; 510 return ERR_INVALIDLOCATION;
508 } 511 }
509 return ERR_UNKNOWNRESPONSE; 512 return ERR_UNKNOWNRESPONSE;
510} 513}
511 514
512static GSM_Error N7110_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone) 515static GSM_Error N7110_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone)
513{ 516{
514 unsigned char req[] = {N7110_FRAME_HEADER, 0x22, 0x00, 0x00}; 517 unsigned char req[] = {N7110_FRAME_HEADER, 0x22, 0x00, 0x00};
515 518
516 if (PhoneRingtone) return ERR_NOTSUPPORTED; 519 if (PhoneRingtone) return ERR_NOTSUPPORTED;
517 if (Ringtone->Format == 0x00) Ringtone->Format = RING_NOKIABINARY; 520 if (Ringtone->Format == 0x00) Ringtone->Format = RING_NOKIABINARY;
518 521
519 switch (Ringtone->Format) { 522 switch (Ringtone->Format) {
520 case RING_NOTETONE: 523 case RING_NOTETONE:
521 /* In the future get binary and convert */ 524 /* In the future get binary and convert */
522 return ERR_NOTSUPPORTED; 525 return ERR_NOTSUPPORTED;
523 case RING_NOKIABINARY: 526 case RING_NOKIABINARY:
524 req[5]=N7110_ReturnBinaryRingtoneLocation(s->Phone.Data.Model)+Ringtone->Location; 527 req[5]=N7110_ReturnBinaryRingtoneLocation(s->Phone.Data.Model)+Ringtone->Location;
525 s->Phone.Data.Ringtone=Ringtone; 528 s->Phone.Data.Ringtone=Ringtone;
526 smprintf(s, "Getting binary ringtone\n"); 529 smprintf(s, "Getting binary ringtone\n");
527 return GSM_WaitFor (s, req, 6, 0x1f, 4, ID_GetRingtone); 530 return GSM_WaitFor (s, req, 6, 0x1f, 4, ID_GetRingtone);
528 case RING_MIDI: 531 case RING_MIDI:
532 case RING_MMF:
529 return ERR_NOTSUPPORTED; 533 return ERR_NOTSUPPORTED;
530 } 534 }
531 return ERR_NOTSUPPORTED; 535 return ERR_NOTSUPPORTED;
532} 536}
533 537
534static GSM_Error N7110_ReplyGetPictureImageInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) 538static GSM_Error N7110_ReplyGetPictureImageInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
535{ 539{
536 int i; 540 int i;
537 GSM_Phone_N7110Data*Priv = &s->Phone.Data.Priv.N7110; 541 GSM_Phone_N7110Data*Priv = &s->Phone.Data.Priv.N7110;
538 542
539 smprintf(s, "Received info for Picture Images\n"); 543 smprintf(s, "Received info for Picture Images\n");
540 smprintf(s, "Number : %i\n",msg.Buffer[4]*256+msg.Buffer[5]); 544 smprintf(s, "Number : %i\n",msg.Buffer[4]*256+msg.Buffer[5]);
541 smprintf(s, "Locations :"); 545 smprintf(s, "Locations :");
542 Priv->LastPictureImageFolder.Number=msg.Buffer[4]*256+msg.Buffer[5]; 546 Priv->LastPictureImageFolder.Number=msg.Buffer[4]*256+msg.Buffer[5];
543 for (i=0;i<Priv->LastPictureImageFolder.Number;i++) { 547 for (i=0;i<Priv->LastPictureImageFolder.Number;i++) {
544 Priv->LastPictureImageFolder.Location[i]=msg.Buffer[6+i*2]*256+msg.Buffer[7+i*2]; 548 Priv->LastPictureImageFolder.Location[i]=msg.Buffer[6+i*2]*256+msg.Buffer[7+i*2];
545 smprintf(s, " %i",Priv->LastPictureImageFolder.Location[i]); 549 smprintf(s, " %i",Priv->LastPictureImageFolder.Location[i]);
546 } 550 }
547 smprintf(s, "\n"); 551 smprintf(s, "\n");
548 return ERR_NONE; 552 return ERR_NONE;
549} 553}
550 554
551static GSM_Error N7110_GetPictureImageLocation(GSM_StateMachine *s, GSM_Bitmap *Bitmap, unsigned char *folder, int *location) 555static GSM_Error N7110_GetPictureImageLocation(GSM_StateMachine *s, GSM_Bitmap *Bitmap, unsigned char *folder, int *location)
552{ 556{
553 GSM_Phone_N7110Data*Priv = &s->Phone.Data.Priv.N7110; 557 GSM_Phone_N7110Data*Priv = &s->Phone.Data.Priv.N7110;
554 GSM_SMSFolders folders; 558 GSM_SMSFolders folders;
555 GSM_Error error; 559 GSM_Error error;
556 int i, j = 0, count = 0; 560 int i, j = 0, count = 0;
557 unsigned char req[] = {N6110_FRAME_HEADER, 0x96, 561 unsigned char req[] = {N6110_FRAME_HEADER, 0x96,
558 0x00, /* Folder ID */ 562 0x00, /* Folder ID */
559 0x0f, 0x07}; 563 0x0f, 0x07};
560 564
561 error=N7110_GetSMSFolders (s, &folders); 565 error=N7110_GetSMSFolders (s, &folders);
562 if (error!=ERR_NONE) return error; 566 if (error!=ERR_NONE) return error;
563 567
564 for (i=0;i<folders.Number;i++) { 568 for (i=0;i<folders.Number;i++) {
565 req[4] = (i+1) * 0x08;/* SMS folder ID */ 569 req[4] = (i+1) * 0x08;/* SMS folder ID */
566 error = GSM_WaitFor (s, req, 7, 0x14, 4, ID_GetBitmap); 570 error = GSM_WaitFor (s, req, 7, 0x14, 4, ID_GetBitmap);
567 if (error!=ERR_NONE) return error; 571 if (error!=ERR_NONE) return error;
568 for (j=0;j<Priv->LastPictureImageFolder.Number;j++) { 572 for (j=0;j<Priv->LastPictureImageFolder.Number;j++) {
569 count++; 573 count++;
570 if (count==Bitmap->Location) break; 574 if (count==Bitmap->Location) break;
571 } 575 }
572 if (count==Bitmap->Location) break; 576 if (count==Bitmap->Location) break;
573 } 577 }
574 if (count!=Bitmap->Location) return ERR_INVALIDLOCATION; 578 if (count!=Bitmap->Location) return ERR_INVALIDLOCATION;
575 *folder = (i+1) * 0x08;/* SMS Folder ID */ 579 *folder = (i+1) * 0x08;/* SMS Folder ID */
576 *location= Priv->LastPictureImageFolder.Location[j]; 580 *location= Priv->LastPictureImageFolder.Location[j];
@@ -1602,123 +1606,124 @@ GSM_Phone_Functions N7110Phone = {
1602 NOKIA_GetManufacturer, 1606 NOKIA_GetManufacturer,
1603 DCT3DCT4_GetModel, 1607 DCT3DCT4_GetModel,
1604 DCT3DCT4_GetFirmware, 1608 DCT3DCT4_GetFirmware,
1605 DCT3_GetIMEI, 1609 DCT3_GetIMEI,
1606 DCT3_GetOriginalIMEI, 1610 DCT3_GetOriginalIMEI,
1607 DCT3_GetManufactureMonth, 1611 DCT3_GetManufactureMonth,
1608 DCT3_GetProductCode, 1612 DCT3_GetProductCode,
1609 DCT3_GetHardware, 1613 DCT3_GetHardware,
1610 DCT3_GetPPM, 1614 DCT3_GetPPM,
1611 NOTSUPPORTED, /* GetSIMIMSI */ 1615 NOTSUPPORTED, /* GetSIMIMSI */
1612 N71_92_GetDateTime, 1616 N71_92_GetDateTime,
1613 N71_92_SetDateTime, 1617 N71_92_SetDateTime,
1614 N7110_GetAlarm, 1618 N7110_GetAlarm,
1615 N7110_SetAlarm, 1619 N7110_SetAlarm,
1616 NOTSUPPORTED, /* GetLocale */ 1620 NOTSUPPORTED, /* GetLocale */
1617 NOTSUPPORTED, /* SetLocale */ 1621 NOTSUPPORTED, /* SetLocale */
1618 DCT3_PressKey, 1622 DCT3_PressKey,
1619 DCT3_Reset, 1623 DCT3_Reset,
1620 N61_71_ResetPhoneSettings, 1624 N61_71_ResetPhoneSettings,
1621 NOTSUPPORTED, /* EnterSecurityCode*/ 1625 NOTSUPPORTED, /* EnterSecurityCode*/
1622 NOTSUPPORTED, /* GetSecurityStatus*/ 1626 NOTSUPPORTED, /* GetSecurityStatus*/
1623 NOTSUPPORTED, /* GetDisplayStatus*/ 1627 NOTSUPPORTED, /* GetDisplayStatus*/
1624 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/ 1628 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/
1625 N71_92_GetBatteryCharge, 1629 N71_92_GetBatteryCharge,
1626 N71_92_GetSignalQuality, 1630 N71_92_GetSignalQuality,
1627 DCT3_GetNetworkInfo, 1631 DCT3_GetNetworkInfo,
1628 NOTSUPPORTED, /* GetCategory */ 1632 NOTSUPPORTED, /* GetCategory */
1629 NOTSUPPORTED, /* AddCategory */ 1633 NOTSUPPORTED, /* AddCategory */
1630 NOTSUPPORTED, /* GetCategoryStatus */ 1634 NOTSUPPORTED, /* GetCategoryStatus */
1631 N7110_GetMemoryStatus, 1635 N7110_GetMemoryStatus,
1632 N7110_GetMemory, 1636 N7110_GetMemory,
1633 NOTIMPLEMENTED, /* GetNextMemory */ 1637 NOTIMPLEMENTED, /* GetNextMemory */
1634 N7110_SetMemory, 1638 N7110_SetMemory,
1635 NOTIMPLEMENTED, /* AddMemory */ 1639 NOTIMPLEMENTED, /* AddMemory */
1636 N7110_DeleteMemory, 1640 N7110_DeleteMemory,
1637 NOTIMPLEMENTED, /* DeleteAllMemory */ 1641 NOTIMPLEMENTED, /* DeleteAllMemory */
1638 N7110_GetSpeedDial, 1642 N7110_GetSpeedDial,
1639 NOTIMPLEMENTED, /* SetSpeedDial */ 1643 NOTIMPLEMENTED, /* SetSpeedDial */
1640 DCT3_GetSMSC, 1644 DCT3_GetSMSC,
1641 DCT3_SetSMSC, 1645 DCT3_SetSMSC,
1642 N7110_GetSMSStatus, 1646 N7110_GetSMSStatus,
1643 N7110_GetSMSMessage, 1647 N7110_GetSMSMessage,
1644 N7110_GetNextSMSMessage, 1648 N7110_GetNextSMSMessage,
1645 N7110_SetSMS, 1649 N7110_SetSMS,
1646 N7110_AddSMS, 1650 N7110_AddSMS,
1647 N7110_DeleteSMS, 1651 N7110_DeleteSMS,
1648 DCT3_SendSMSMessage, 1652 DCT3_SendSMSMessage,
1649 NOTSUPPORTED, /* SendSavedSMS */ 1653 NOTSUPPORTED, /* SendSavedSMS */
1654 NOTSUPPORTED, /* SetFastSMSSending*/
1650 N7110_SetIncomingSMS, 1655 N7110_SetIncomingSMS,
1651 DCT3_SetIncomingCB, 1656 DCT3_SetIncomingCB,
1652 N7110_GetSMSFolders, 1657 N7110_GetSMSFolders,
1653 NOTIMPLEMENTED, /* AddSMSFolder */ 1658 NOTIMPLEMENTED, /* AddSMSFolder */
1654 NOTIMPLEMENTED, /* DeleteSMSFolder */ 1659 NOTIMPLEMENTED, /* DeleteSMSFolder */
1655 DCT3_DialVoice, 1660 DCT3_DialVoice,
1656 N7110_AnswerCall, 1661 N7110_AnswerCall,
1657 DCT3_CancelCall, 1662 DCT3_CancelCall,
1658 NOTIMPLEMENTED, /* HoldCall */ 1663 NOTIMPLEMENTED, /* HoldCall */
1659 NOTIMPLEMENTED, /* UnholdCall */ 1664 NOTIMPLEMENTED, /* UnholdCall */
1660 NOTIMPLEMENTED, /* ConferenceCall */ 1665 NOTIMPLEMENTED, /* ConferenceCall */
1661 NOTIMPLEMENTED, /* SplitCall */ 1666 NOTIMPLEMENTED, /* SplitCall */
1662 NOTIMPLEMENTED, /* TransferCall */ 1667 NOTIMPLEMENTED, /* TransferCall */
1663 NOTIMPLEMENTED, /* SwitchCall */ 1668 NOTIMPLEMENTED, /* SwitchCall */
1664 NOTSUPPORTED, /* GetCallDivert */ 1669 NOTSUPPORTED, /* GetCallDivert */
1665 N7110_SetCallDivert, 1670 N7110_SetCallDivert,
1666 N7110_CancelAllDiverts, 1671 N7110_CancelAllDiverts,
1667 N7110_SetIncomingCall, 1672 N7110_SetIncomingCall,
1668 N7110_SetIncomingUSSD, 1673 N7110_SetIncomingUSSD,
1669 DCT3DCT4_SendDTMF, 1674 DCT3DCT4_SendDTMF,
1670 N7110_GetRingtone, 1675 N7110_GetRingtone,
1671 N7110_SetRingtone, 1676 N7110_SetRingtone,
1672 NOTSUPPORTED, /* GetRingtonesInfo*/ 1677 NOTSUPPORTED, /* GetRingtonesInfo*/
1673 NOTSUPPORTED, /* DeleteUserRingtones*/ 1678 NOTSUPPORTED, /* DeleteUserRingtones*/
1674 DCT3_PlayTone, 1679 DCT3_PlayTone,
1675 DCT3_GetWAPBookmark, 1680 DCT3_GetWAPBookmark,
1676 DCT3_SetWAPBookmark, 1681 DCT3_SetWAPBookmark,
1677 DCT3_DeleteWAPBookmark, 1682 DCT3_DeleteWAPBookmark,
1678 DCT3_GetWAPSettings, 1683 DCT3_GetWAPSettings,
1679 DCT3_SetWAPSettings, 1684 DCT3_SetWAPSettings,
1680 NOTSUPPORTED, /* GetMMSSettings */ 1685 NOTSUPPORTED, /* GetMMSSettings */
1681 NOTSUPPORTED, /* SetMMSSettings */ 1686 NOTSUPPORTED, /* SetMMSSettings */
1682 NOTSUPPORTED, /* GetSyncMLSettings*/ 1687 NOTSUPPORTED, /* GetSyncMLSettings*/
1683 NOTSUPPORTED, /* SetSyncMLSettings*/ 1688 NOTSUPPORTED, /* SetSyncMLSettings*/
1684 NOTSUPPORTED, /* GetChatSettings */ 1689 NOTSUPPORTED, /* GetChatSettings */
1685 NOTSUPPORTED, /* SetChatSettings */ 1690 NOTSUPPORTED, /* SetChatSettings */
1686 N7110_GetBitmap, 1691 N7110_GetBitmap,
1687 N7110_SetBitmap, 1692 N7110_SetBitmap,
1688 NOTSUPPORTED, /* GetToDoStatus */ 1693 NOTSUPPORTED, /* GetToDoStatus */
1689 NOTSUPPORTED, /* GetToDo */ 1694 NOTSUPPORTED, /* GetToDo */
1690 NOTSUPPORTED, /* GetNextToDo */ 1695 NOTSUPPORTED, /* GetNextToDo */
1691 NOTSUPPORTED, /* SetToDo */ 1696 NOTSUPPORTED, /* SetToDo */
1692 NOTSUPPORTED, /* AddToDo */ 1697 NOTSUPPORTED, /* AddToDo */
1693 NOTSUPPORTED, /* DeleteToDo */ 1698 NOTSUPPORTED, /* DeleteToDo */
1694 NOTSUPPORTED, /* DeleteAllToDo */ 1699 NOTSUPPORTED, /* DeleteAllToDo */
1695 N7110_GetCalendarStatus, 1700 N7110_GetCalendarStatus,
1696 NOTIMPLEMENTED, /* GetCalendar */ 1701 NOTIMPLEMENTED, /* GetCalendar */
1697 N7110_GetNextCalendar, 1702 N7110_GetNextCalendar,
1698 NOTIMPLEMENTED, /* SetCalendar */ 1703 NOTIMPLEMENTED, /* SetCalendar */
1699 N7110_AddCalendar, 1704 N7110_AddCalendar,
1700 N71_65_DelCalendar, 1705 N71_65_DelCalendar,
1701 NOTIMPLEMENTED, /* DeleteAllCalendar*/ 1706 NOTIMPLEMENTED, /* DeleteAllCalendar*/
1702 NOTSUPPORTED, /* GetCalendarSettings*/ 1707 NOTSUPPORTED, /* GetCalendarSettings*/
1703 NOTSUPPORTED, /* SetCalendarSettings*/ 1708 NOTSUPPORTED, /* SetCalendarSettings*/
1704 NOTSUPPORTED, /* GetNote */ 1709 NOTSUPPORTED, /* GetNextNote */
1705 N7110_GetProfile, 1710 N7110_GetProfile,
1706 N7110_SetProfile, 1711 N7110_SetProfile,
1707 NOTSUPPORTED, /* GetFMStation */ 1712 NOTSUPPORTED, /* GetFMStation */
1708 NOTSUPPORTED, /* SetFMStation */ 1713 NOTSUPPORTED, /* SetFMStation */
1709 NOTSUPPORTED, /* ClearFMStations */ 1714 NOTSUPPORTED, /* ClearFMStations */
1710 NOTSUPPORTED, /* GetNextFileFolder*/ 1715 NOTSUPPORTED, /* GetNextFileFolder*/
1711 NOTSUPPORTED, /* GetFilePart */ 1716 NOTSUPPORTED, /* GetFilePart */
1712 NOTSUPPORTED, /* AddFile */ 1717 NOTSUPPORTED, /* AddFile */
1713 NOTSUPPORTED, /* GetFileSystemStatus*/ 1718 NOTSUPPORTED, /* GetFileSystemStatus*/
1714 NOTSUPPORTED, /* DeleteFile */ 1719 NOTSUPPORTED, /* DeleteFile */
1715 NOTSUPPORTED, /* AddFolder */ 1720 NOTSUPPORTED, /* AddFolder */
1716 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 1721 NOTSUPPORTED, /* GetGPRSAccessPoint*/
1717 NOTSUPPORTED /* SetGPRSAccessPoint*/ 1722 NOTSUPPORTED /* SetGPRSAccessPoint*/
1718}; 1723};
1719 1724
1720#endif 1725#endif
1721 1726
1722/* How should editor hadle tabs in this file? Add editor commands here. 1727/* How should editor hadle tabs in this file? Add editor commands here.
1723 * vim: noexpandtab sw=8 ts=8 sts=8: 1728 * vim: noexpandtab sw=8 ts=8 sts=8:
1724 */ 1729 */
diff --git a/gammu/emb/common/phone/nokia/dct3/n9210.c b/gammu/emb/common/phone/nokia/dct3/n9210.c
index e82d530..ff71ad3 100644
--- a/gammu/emb/common/phone/nokia/dct3/n9210.c
+++ b/gammu/emb/common/phone/nokia/dct3/n9210.c
@@ -274,123 +274,124 @@ GSM_Phone_Functions N9210Phone = {
274 NOKIA_GetManufacturer, 274 NOKIA_GetManufacturer,
275 DCT3DCT4_GetModel, 275 DCT3DCT4_GetModel,
276 DCT3DCT4_GetFirmware, 276 DCT3DCT4_GetFirmware,
277 DCT3_GetIMEI, 277 DCT3_GetIMEI,
278 DCT3_GetOriginalIMEI, 278 DCT3_GetOriginalIMEI,
279 DCT3_GetManufactureMonth, 279 DCT3_GetManufactureMonth,
280 DCT3_GetProductCode, 280 DCT3_GetProductCode,
281 DCT3_GetHardware, 281 DCT3_GetHardware,
282 DCT3_GetPPM, 282 DCT3_GetPPM,
283 NOTSUPPORTED, /* GetSIMIMSI */ 283 NOTSUPPORTED, /* GetSIMIMSI */
284 N71_92_GetDateTime, 284 N71_92_GetDateTime,
285 N71_92_SetDateTime, 285 N71_92_SetDateTime,
286 NOTIMPLEMENTED, /* GetAlarm */ 286 NOTIMPLEMENTED, /* GetAlarm */
287 NOTIMPLEMENTED, /* SetAlarm */ 287 NOTIMPLEMENTED, /* SetAlarm */
288 NOTSUPPORTED, /* GetLocale */ 288 NOTSUPPORTED, /* GetLocale */
289 NOTSUPPORTED, /* SetLocale */ 289 NOTSUPPORTED, /* SetLocale */
290 NOTIMPLEMENTED, /* PressKey */ 290 NOTIMPLEMENTED, /* PressKey */
291 NOTIMPLEMENTED, /* Reset */ 291 NOTIMPLEMENTED, /* Reset */
292 NOTIMPLEMENTED, /* ResetPhoneSettings*/ 292 NOTIMPLEMENTED, /* ResetPhoneSettings*/
293 NOTSUPPORTED, /* EnterSecurityCode*/ 293 NOTSUPPORTED, /* EnterSecurityCode*/
294 NOTSUPPORTED, /* GetSecurityStatus*/ 294 NOTSUPPORTED, /* GetSecurityStatus*/
295 NOTSUPPORTED, /* GetDisplayStatus*/ 295 NOTSUPPORTED, /* GetDisplayStatus*/
296 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/ 296 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/
297 N71_92_GetBatteryCharge, 297 N71_92_GetBatteryCharge,
298 N71_92_GetSignalQuality, 298 N71_92_GetSignalQuality,
299 DCT3_GetNetworkInfo, 299 DCT3_GetNetworkInfo,
300 NOTSUPPORTED, /* GetCategory */ 300 NOTSUPPORTED, /* GetCategory */
301 NOTSUPPORTED, /* AddCategory */ 301 NOTSUPPORTED, /* AddCategory */
302 NOTSUPPORTED, /* GetCategoryStatus */ 302 NOTSUPPORTED, /* GetCategoryStatus */
303 NOTIMPLEMENTED, /* GetMemoryStatus */ 303 NOTIMPLEMENTED, /* GetMemoryStatus */
304 NOTIMPLEMENTED, /* GetMemory */ 304 NOTIMPLEMENTED, /* GetMemory */
305 NOTIMPLEMENTED, /* GetNextMemory */ 305 NOTIMPLEMENTED, /* GetNextMemory */
306 NOTIMPLEMENTED, /* SetMemory */ 306 NOTIMPLEMENTED, /* SetMemory */
307 NOTIMPLEMENTED, /* AddMemory */ 307 NOTIMPLEMENTED, /* AddMemory */
308 NOTIMPLEMENTED, /* DeleteMemory */ 308 NOTIMPLEMENTED, /* DeleteMemory */
309 NOTIMPLEMENTED, /* DeleteAllMemory */ 309 NOTIMPLEMENTED, /* DeleteAllMemory */
310 NOTIMPLEMENTED, /* GetSpeedDial */ 310 NOTIMPLEMENTED, /* GetSpeedDial */
311 NOTIMPLEMENTED, /* SetSpeedDial */ 311 NOTIMPLEMENTED, /* SetSpeedDial */
312 DCT3_GetSMSC, 312 DCT3_GetSMSC,
313 DCT3_SetSMSC, /* FIXME: test it */ 313 DCT3_SetSMSC, /* FIXME: test it */
314 NOTIMPLEMENTED, /* GetSMSStatus */ 314 NOTIMPLEMENTED, /* GetSMSStatus */
315 NOTIMPLEMENTED, /* GetSMS */ 315 NOTIMPLEMENTED, /* GetSMS */
316 NOTIMPLEMENTED, /* GetNextSMS */ 316 NOTIMPLEMENTED, /* GetNextSMS */
317 NOTIMPLEMENTED, /* SetSMS */ 317 NOTIMPLEMENTED, /* SetSMS */
318 NOTIMPLEMENTED, /* AddSMS */ 318 NOTIMPLEMENTED, /* AddSMS */
319 NOTIMPLEMENTED, /* DeleteSMS */ 319 NOTIMPLEMENTED, /* DeleteSMS */
320 DCT3_SendSMSMessage, 320 DCT3_SendSMSMessage,
321 NOTSUPPORTED, /* SendSavedSMS */ 321 NOTSUPPORTED, /* SendSavedSMS */
322 NOTSUPPORTED, /* SetFastSMSSending*/
322 N9210_SetIncomingSMS, 323 N9210_SetIncomingSMS,
323 DCT3_SetIncomingCB, 324 DCT3_SetIncomingCB,
324 NOTIMPLEMENTED, /* GetSMSFolders */ 325 NOTIMPLEMENTED, /* GetSMSFolders */
325 NOTSUPPORTED, /* AddSMSFolder */ 326 NOTSUPPORTED, /* AddSMSFolder */
326 NOTSUPPORTED, /* DeleteSMSFolder */ 327 NOTSUPPORTED, /* DeleteSMSFolder */
327 DCT3_DialVoice, 328 DCT3_DialVoice,
328 N9210_AnswerCall, 329 N9210_AnswerCall,
329 DCT3_CancelCall, 330 DCT3_CancelCall,
330 NOTSUPPORTED, /* HoldCall */ 331 NOTSUPPORTED, /* HoldCall */
331 NOTSUPPORTED, /* UnholdCall */ 332 NOTSUPPORTED, /* UnholdCall */
332 NOTSUPPORTED, /* ConferenceCall */ 333 NOTSUPPORTED, /* ConferenceCall */
333 NOTSUPPORTED, /* SplitCall */ 334 NOTSUPPORTED, /* SplitCall */
334 NOTSUPPORTED, /* TransferCall */ 335 NOTSUPPORTED, /* TransferCall */
335 NOTSUPPORTED, /* SwitchCall */ 336 NOTSUPPORTED, /* SwitchCall */
336 NOTSUPPORTED, /* GetCallDivert */ 337 NOTSUPPORTED, /* GetCallDivert */
337 NOTSUPPORTED, /* SetCallDivert */ 338 NOTSUPPORTED, /* SetCallDivert */
338 NOTSUPPORTED, /* CancelAllDiverts*/ 339 NOTSUPPORTED, /* CancelAllDiverts*/
339 NOTSUPPORTED, /* SetIncomingCall */ 340 NOTSUPPORTED, /* SetIncomingCall */
340 NOTIMPLEMENTED, /* SetIncomingUSSD */ 341 NOTIMPLEMENTED, /* SetIncomingUSSD */
341 NOTSUPPORTED, /* SendDTMF */ 342 NOTSUPPORTED, /* SendDTMF */
342 NOTIMPLEMENTED, /* GetRingtone */ 343 NOTIMPLEMENTED, /* GetRingtone */
343 NOTIMPLEMENTED, /* SetRingtone */ 344 NOTIMPLEMENTED, /* SetRingtone */
344 NOTSUPPORTED, /* GetRingtonesInfo*/ 345 NOTSUPPORTED, /* GetRingtonesInfo*/
345 NOTSUPPORTED, /* DeleteUserRingtones*/ 346 NOTSUPPORTED, /* DeleteUserRingtones*/
346 NOTSUPPORTED, /* PlayTone */ 347 NOTSUPPORTED, /* PlayTone */
347 NOTIMPLEMENTED, /* GetWAPBookmark */ 348 NOTIMPLEMENTED, /* GetWAPBookmark */
348 NOTIMPLEMENTED, /* SetWAPBookmark */ 349 NOTIMPLEMENTED, /* SetWAPBookmark */
349 NOTIMPLEMENTED, /* DeleteWAPBookmark */ 350 NOTIMPLEMENTED, /* DeleteWAPBookmark */
350 NOTIMPLEMENTED, /* GetWAPSettings */ 351 NOTIMPLEMENTED, /* GetWAPSettings */
351 NOTSUPPORTED, /* SetWAPSettings */ 352 NOTSUPPORTED, /* SetWAPSettings */
352 NOTSUPPORTED, /* GetMMSSettings */ 353 NOTSUPPORTED, /* GetMMSSettings */
353 NOTSUPPORTED, /* SetMMSSettings */ 354 NOTSUPPORTED, /* SetMMSSettings */
354 NOTSUPPORTED, /* GetSyncMLSettings*/ 355 NOTSUPPORTED, /* GetSyncMLSettings*/
355 NOTSUPPORTED, /* SetSyncMLSettings*/ 356 NOTSUPPORTED, /* SetSyncMLSettings*/
356 NOTSUPPORTED, /* GetChatSettings */ 357 NOTSUPPORTED, /* GetChatSettings */
357 NOTSUPPORTED, /* SetChatSettings */ 358 NOTSUPPORTED, /* SetChatSettings */
358 N9210_GetBitmap, 359 N9210_GetBitmap,
359 N9210_SetBitmap, 360 N9210_SetBitmap,
360 NOTSUPPORTED, /* GetToDoStatus */ 361 NOTSUPPORTED, /* GetToDoStatus */
361 NOTSUPPORTED, /* GetToDo */ 362 NOTSUPPORTED, /* GetToDo */
362 NOTSUPPORTED, /* GetNextToDo */ 363 NOTSUPPORTED, /* GetNextToDo */
363 NOTSUPPORTED, /* SetToDo */ 364 NOTSUPPORTED, /* SetToDo */
364 NOTSUPPORTED, /* AddToDo */ 365 NOTSUPPORTED, /* AddToDo */
365 NOTSUPPORTED, /* DeleteToDo */ 366 NOTSUPPORTED, /* DeleteToDo */
366 NOTSUPPORTED, /* DeleteAllToDo */ 367 NOTSUPPORTED, /* DeleteAllToDo */
367 NOTSUPPORTED, /* GetCalendarStatus*/ 368 NOTSUPPORTED, /* GetCalendarStatus*/
368 NOTSUPPORTED, /* GetCalendar */ 369 NOTSUPPORTED, /* GetCalendar */
369 NOTSUPPORTED, /* GetNextCalendar */ 370 NOTSUPPORTED, /* GetNextCalendar */
370 NOTSUPPORTED, /* SetCalendar */ 371 NOTSUPPORTED, /* SetCalendar */
371 NOTSUPPORTED, /* AddCalendar */ 372 NOTSUPPORTED, /* AddCalendar */
372 NOTSUPPORTED, /* DeleteCalendar */ 373 NOTSUPPORTED, /* DeleteCalendar */
373 NOTSUPPORTED, /* DeleteAllCalendar*/ 374 NOTSUPPORTED, /* DeleteAllCalendar*/
374 NOTSUPPORTED, /* GetCalendarSettings*/ 375 NOTSUPPORTED, /* GetCalendarSettings*/
375 NOTSUPPORTED, /* SetCalendarSettings*/ 376 NOTSUPPORTED, /* SetCalendarSettings*/
376 NOTSUPPORTED, /* GetNote */ 377 NOTSUPPORTED, /* GetNextNote */
377 NOTIMPLEMENTED, /* GetProfile */ 378 NOTIMPLEMENTED, /* GetProfile */
378 NOTSUPPORTED, /* SetProfile */ 379 NOTSUPPORTED, /* SetProfile */
379 NOTSUPPORTED, /* GetFMStation */ 380 NOTSUPPORTED, /* GetFMStation */
380 NOTSUPPORTED, /* SetFMStation */ 381 NOTSUPPORTED, /* SetFMStation */
381 NOTSUPPORTED, /* ClearFMStations */ 382 NOTSUPPORTED, /* ClearFMStations */
382 NOTSUPPORTED, /* GetNextFileFolder*/ 383 NOTSUPPORTED, /* GetNextFileFolder*/
383 NOTSUPPORTED, /* GetFilePart */ 384 NOTSUPPORTED, /* GetFilePart */
384 NOTSUPPORTED, /* AddFile */ 385 NOTSUPPORTED, /* AddFile */
385 NOTSUPPORTED, /* GetFileSystemStatus*/ 386 NOTSUPPORTED, /* GetFileSystemStatus*/
386 NOTSUPPORTED, /* DeleteFile */ 387 NOTSUPPORTED, /* DeleteFile */
387 NOTSUPPORTED, /* AddFolder */ 388 NOTSUPPORTED, /* AddFolder */
388 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 389 NOTSUPPORTED, /* GetGPRSAccessPoint*/
389 NOTSUPPORTED /* SetGPRSAccessPoint*/ 390 NOTSUPPORTED /* SetGPRSAccessPoint*/
390}; 391};
391 392
392#endif 393#endif
393 394
394/* How should editor hadle tabs in this file? Add editor commands here. 395/* How should editor hadle tabs in this file? Add editor commands here.
395 * vim: noexpandtab sw=8 ts=8 sts=8: 396 * vim: noexpandtab sw=8 ts=8 sts=8:
396 */ 397 */
diff --git a/gammu/emb/common/phone/nokia/dct4/n3320.c b/gammu/emb/common/phone/nokia/dct4/n3320.c
index 51e6f18..9b1d6cd 100644
--- a/gammu/emb/common/phone/nokia/dct4/n3320.c
+++ b/gammu/emb/common/phone/nokia/dct4/n3320.c
@@ -149,123 +149,124 @@ GSM_Phone_Functions N3320Phone = {
149 NOKIA_GetManufacturer, 149 NOKIA_GetManufacturer,
150 DCT3DCT4_GetModel, 150 DCT3DCT4_GetModel,
151 DCT3DCT4_GetFirmware, 151 DCT3DCT4_GetFirmware,
152 NOTSUPPORTED, /* GetIMEI */ 152 NOTSUPPORTED, /* GetIMEI */
153 NOTSUPPORTED, /* GetOriginalIMEI */ 153 NOTSUPPORTED, /* GetOriginalIMEI */
154 NOTSUPPORTED, /* GetManufactureMonth*/ 154 NOTSUPPORTED, /* GetManufactureMonth*/
155 NOTSUPPORTED, /* GetProductCode */ 155 NOTSUPPORTED, /* GetProductCode */
156 NOTSUPPORTED, /* GetHardware */ 156 NOTSUPPORTED, /* GetHardware */
157 NOTSUPPORTED, /* GetPPM */ 157 NOTSUPPORTED, /* GetPPM */
158 NOTSUPPORTED, /* GetSIMIMSI */ 158 NOTSUPPORTED, /* GetSIMIMSI */
159 N3320_GetDateTime, 159 N3320_GetDateTime,
160 NOTSUPPORTED, /* SetDateTime */ 160 NOTSUPPORTED, /* SetDateTime */
161 NOTSUPPORTED, /* GetAlarm */ 161 NOTSUPPORTED, /* GetAlarm */
162 NOTSUPPORTED, /* SetAlarm */ 162 NOTSUPPORTED, /* SetAlarm */
163 NOTSUPPORTED, /* GetLocale */ 163 NOTSUPPORTED, /* GetLocale */
164 NOTSUPPORTED, /* SetLocale */ 164 NOTSUPPORTED, /* SetLocale */
165 NOTSUPPORTED, /* PressKey */ 165 NOTSUPPORTED, /* PressKey */
166 NOTSUPPORTED, /* Reset */ 166 NOTSUPPORTED, /* Reset */
167 NOTSUPPORTED, /* ResetPhoneSettings*/ 167 NOTSUPPORTED, /* ResetPhoneSettings*/
168 NOTSUPPORTED, /* EnterSecurityCode*/ 168 NOTSUPPORTED, /* EnterSecurityCode*/
169 NOTSUPPORTED, /* GetSecurityStatus*/ 169 NOTSUPPORTED, /* GetSecurityStatus*/
170 NOTSUPPORTED, /* GetDisplayStatus*/ 170 NOTSUPPORTED, /* GetDisplayStatus*/
171 NOTSUPPORTED, /* SetAutoNetworkLogin*/ 171 NOTSUPPORTED, /* SetAutoNetworkLogin*/
172 NOTSUPPORTED, /* GetBatteryCharge*/ 172 NOTSUPPORTED, /* GetBatteryCharge*/
173 NOTSUPPORTED, /* GetSignalQuality*/ 173 NOTSUPPORTED, /* GetSignalQuality*/
174 NOTSUPPORTED, /* GetNetworkInfo */ 174 NOTSUPPORTED, /* GetNetworkInfo */
175 NOTSUPPORTED, /* GetCategory */ 175 NOTSUPPORTED, /* GetCategory */
176 NOTSUPPORTED, /* AddCategory */ 176 NOTSUPPORTED, /* AddCategory */
177 NOTSUPPORTED, /* GetCategoryStatus */ 177 NOTSUPPORTED, /* GetCategoryStatus */
178 N3320_GetMemoryStatus, 178 N3320_GetMemoryStatus,
179 N3320_GetMemory, 179 N3320_GetMemory,
180 NOTSUPPORTED, /* GetNextMemory */ 180 NOTSUPPORTED, /* GetNextMemory */
181 NOTSUPPORTED, /* SetMemory */ 181 NOTSUPPORTED, /* SetMemory */
182 NOTSUPPORTED, /* AddMemory */ 182 NOTSUPPORTED, /* AddMemory */
183 NOTSUPPORTED, /* DeleteMemory */ 183 NOTSUPPORTED, /* DeleteMemory */
184 NOTIMPLEMENTED, /* DeleteAllMemory */ 184 NOTIMPLEMENTED, /* DeleteAllMemory */
185 NOTSUPPORTED, /* GetSpeedDial */ 185 NOTSUPPORTED, /* GetSpeedDial */
186 NOTSUPPORTED, /* SetSpeedDial */ 186 NOTSUPPORTED, /* SetSpeedDial */
187 NOTSUPPORTED, /* GetSMSC */ 187 NOTSUPPORTED, /* GetSMSC */
188 NOTSUPPORTED, /* SetSMSC */ 188 NOTSUPPORTED, /* SetSMSC */
189 NOTSUPPORTED, /* GetSMSStatus */ 189 NOTSUPPORTED, /* GetSMSStatus */
190 NOTSUPPORTED, /* GetSMS */ 190 NOTSUPPORTED, /* GetSMS */
191 NOTSUPPORTED, /* GetNextSMS */ 191 NOTSUPPORTED, /* GetNextSMS */
192 NOTSUPPORTED, /* SetSMS */ 192 NOTSUPPORTED, /* SetSMS */
193 NOTSUPPORTED, /* AddSMS */ 193 NOTSUPPORTED, /* AddSMS */
194 NOTSUPPORTED, /* DeleteSMS */ 194 NOTSUPPORTED, /* DeleteSMS */
195 NOTSUPPORTED, /* SendSMS */ 195 NOTSUPPORTED, /* SendSMS */
196 NOTSUPPORTED, /* SendSavedSMS */ 196 NOTSUPPORTED, /* SendSavedSMS */
197 NOTSUPPORTED, /* SetFastSMSSending*/
197 NOTSUPPORTED, /* SetIncomingSMS */ 198 NOTSUPPORTED, /* SetIncomingSMS */
198 NOTSUPPORTED, /* SetIncomingCB */ 199 NOTSUPPORTED, /* SetIncomingCB */
199 NOTSUPPORTED, /* GetSMSFolders */ 200 NOTSUPPORTED, /* GetSMSFolders */
200 NOTSUPPORTED, /* AddSMSFolder */ 201 NOTSUPPORTED, /* AddSMSFolder */
201 NOTSUPPORTED, /* DeleteSMSFolder */ 202 NOTSUPPORTED, /* DeleteSMSFolder */
202 NOTIMPLEMENTED, /* DialVoice */ 203 NOTIMPLEMENTED, /* DialVoice */
203 NOTIMPLEMENTED, /* AnswerCall */ 204 NOTIMPLEMENTED, /* AnswerCall */
204 NOTIMPLEMENTED, /* CancelCall */ 205 NOTIMPLEMENTED, /* CancelCall */
205 NOTIMPLEMENTED, /* HoldCall */ 206 NOTIMPLEMENTED, /* HoldCall */
206 NOTIMPLEMENTED, /* UnholdCall */ 207 NOTIMPLEMENTED, /* UnholdCall */
207 NOTIMPLEMENTED, /* ConferenceCall */ 208 NOTIMPLEMENTED, /* ConferenceCall */
208 NOTIMPLEMENTED, /* SplitCall */ 209 NOTIMPLEMENTED, /* SplitCall */
209 NOTIMPLEMENTED, /* TransferCall */ 210 NOTIMPLEMENTED, /* TransferCall */
210 NOTIMPLEMENTED, /* SwitchCall */ 211 NOTIMPLEMENTED, /* SwitchCall */
211 NOTSUPPORTED, /* GetCallDivert */ 212 NOTSUPPORTED, /* GetCallDivert */
212 NOTSUPPORTED, /* SetCallDivert */ 213 NOTSUPPORTED, /* SetCallDivert */
213 NOTSUPPORTED, /* CancelAllDiverts*/ 214 NOTSUPPORTED, /* CancelAllDiverts*/
214 NOTIMPLEMENTED, /* SetIncomingCall */ 215 NOTIMPLEMENTED, /* SetIncomingCall */
215 NOTIMPLEMENTED, /* SetIncomingUSSD */ 216 NOTIMPLEMENTED, /* SetIncomingUSSD */
216 NOTSUPPORTED, /* SendDTMF */ 217 NOTSUPPORTED, /* SendDTMF */
217 NOTSUPPORTED, /* GetRingtone */ 218 NOTSUPPORTED, /* GetRingtone */
218 NOTSUPPORTED, /* SetRingtone */ 219 NOTSUPPORTED, /* SetRingtone */
219 NOTSUPPORTED, /* GetRingtonesInfo*/ 220 NOTSUPPORTED, /* GetRingtonesInfo*/
220 NOTIMPLEMENTED, /* DeleteUserRingtones*/ 221 NOTIMPLEMENTED, /* DeleteUserRingtones*/
221 NOTSUPPORTED, /* PlayTone */ 222 NOTSUPPORTED, /* PlayTone */
222 NOTSUPPORTED, /* GetWAPBookmark */ 223 NOTSUPPORTED, /* GetWAPBookmark */
223 NOTSUPPORTED, /* SetWAPBookmark */ 224 NOTSUPPORTED, /* SetWAPBookmark */
224 NOTSUPPORTED, /* DeleteWAPBookmark */ 225 NOTSUPPORTED, /* DeleteWAPBookmark */
225 NOTSUPPORTED, /* GetWAPSettings */ 226 NOTSUPPORTED, /* GetWAPSettings */
226 NOTSUPPORTED, /* SetWAPSettings */ 227 NOTSUPPORTED, /* SetWAPSettings */
227 NOTSUPPORTED, /* GetMMSSettings */ 228 NOTSUPPORTED, /* GetMMSSettings */
228 NOTSUPPORTED, /* SetMMSSettings */ 229 NOTSUPPORTED, /* SetMMSSettings */
229 NOTSUPPORTED, /* GetSyncMLSettings*/ 230 NOTSUPPORTED, /* GetSyncMLSettings*/
230 NOTSUPPORTED, /* SetSyncMLSettings*/ 231 NOTSUPPORTED, /* SetSyncMLSettings*/
231 NOTSUPPORTED, /* GetChatSettings */ 232 NOTSUPPORTED, /* GetChatSettings */
232 NOTSUPPORTED, /* SetChatSettings */ 233 NOTSUPPORTED, /* SetChatSettings */
233 NOTSUPPORTED, /* GetBitmap */ 234 NOTSUPPORTED, /* GetBitmap */
234 NOTSUPPORTED, /* SetBitmap */ 235 NOTSUPPORTED, /* SetBitmap */
235 NOTSUPPORTED, /* GetToDoStatus */ 236 NOTSUPPORTED, /* GetToDoStatus */
236 NOTSUPPORTED, /* GetToDo */ 237 NOTSUPPORTED, /* GetToDo */
237 NOTSUPPORTED, /* GetNextToDo */ 238 NOTSUPPORTED, /* GetNextToDo */
238 NOTSUPPORTED, /* SetToDo */ 239 NOTSUPPORTED, /* SetToDo */
239 NOTSUPPORTED, /* AddToDo */ 240 NOTSUPPORTED, /* AddToDo */
240 NOTSUPPORTED, /* DeleteToDo */ 241 NOTSUPPORTED, /* DeleteToDo */
241 NOTSUPPORTED, /* DeleteAllToDo */ 242 NOTSUPPORTED, /* DeleteAllToDo */
242 N3320_GetCalendarStatus, 243 N3320_GetCalendarStatus,
243 NOTIMPLEMENTED, /* GetCalendar */ 244 NOTIMPLEMENTED, /* GetCalendar */
244 N3320_GetNextCalendar, 245 N3320_GetNextCalendar,
245 NOTIMPLEMENTED, /* SetCalendar */ 246 NOTIMPLEMENTED, /* SetCalendar */
246 NOTSUPPORTED, /* AddCalendar */ 247 NOTSUPPORTED, /* AddCalendar */
247 NOTSUPPORTED, /* DeleteCalendar */ 248 NOTSUPPORTED, /* DeleteCalendar */
248 NOTIMPLEMENTED, /* DeleteAllCalendar*/ 249 NOTIMPLEMENTED, /* DeleteAllCalendar*/
249 NOTSUPPORTED, /* GetCalendarSettings*/ 250 NOTSUPPORTED, /* GetCalendarSettings*/
250 NOTSUPPORTED, /* SetCalendarSettings*/ 251 NOTSUPPORTED, /* SetCalendarSettings*/
251 NOTSUPPORTED, /* GetNote */ 252 NOTSUPPORTED, /* GetNextNote */
252 NOTSUPPORTED, /* GetProfile */ 253 NOTSUPPORTED, /* GetProfile */
253 NOTSUPPORTED, /* SetProfile */ 254 NOTSUPPORTED, /* SetProfile */
254 NOTSUPPORTED, /* GetFMStation */ 255 NOTSUPPORTED, /* GetFMStation */
255 NOTSUPPORTED, /* SetFMStation */ 256 NOTSUPPORTED, /* SetFMStation */
256 NOTSUPPORTED, /* ClearFMStations */ 257 NOTSUPPORTED, /* ClearFMStations */
257 NOTSUPPORTED, /* GetNextFileFolder*/ 258 NOTSUPPORTED, /* GetNextFileFolder*/
258 NOTSUPPORTED, /* GetFilePart */ 259 NOTSUPPORTED, /* GetFilePart */
259 NOTIMPLEMENTED, /* AddFilePart */ 260 NOTIMPLEMENTED, /* AddFilePart */
260 NOTSUPPORTED, /* GetFileSystemStatus*/ 261 NOTSUPPORTED, /* GetFileSystemStatus*/
261 NOTIMPLEMENTED, /* DeleteFile */ 262 NOTIMPLEMENTED, /* DeleteFile */
262 NOTIMPLEMENTED, /* AddFolder */ 263 NOTIMPLEMENTED, /* AddFolder */
263 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 264 NOTSUPPORTED, /* GetGPRSAccessPoint*/
264 NOTSUPPORTED /* SetGPRSAccessPoint*/ 265 NOTSUPPORTED /* SetGPRSAccessPoint*/
265}; 266};
266 267
267#endif 268#endif
268 269
269/* How should editor hadle tabs in this file? Add editor commands here. 270/* How should editor hadle tabs in this file? Add editor commands here.
270 * vim: noexpandtab sw=8 ts=8 sts=8: 271 * vim: noexpandtab sw=8 ts=8 sts=8:
271 */ 272 */
diff --git a/gammu/emb/common/phone/nokia/dct4/n3650.c b/gammu/emb/common/phone/nokia/dct4/n3650.c
index 2da55bf..d4746a7 100644
--- a/gammu/emb/common/phone/nokia/dct4/n3650.c
+++ b/gammu/emb/common/phone/nokia/dct4/n3650.c
@@ -270,123 +270,124 @@ GSM_Phone_Functions N3650Phone = {
270 NOKIA_GetManufacturer, 270 NOKIA_GetManufacturer,
271 DCT3DCT4_GetModel, 271 DCT3DCT4_GetModel,
272 DCT3DCT4_GetFirmware, 272 DCT3DCT4_GetFirmware,
273 DCT4_GetIMEI, 273 DCT4_GetIMEI,
274 NOTSUPPORTED, /* GetOriginalIMEI */ 274 NOTSUPPORTED, /* GetOriginalIMEI */
275 NOTSUPPORTED, /* GetManufactureMonth*/ 275 NOTSUPPORTED, /* GetManufactureMonth*/
276 DCT4_GetProductCode, 276 DCT4_GetProductCode,
277 DCT4_GetHardware, 277 DCT4_GetHardware,
278 NOTSUPPORTED, /* GetPPM */ 278 NOTSUPPORTED, /* GetPPM */
279 NOTSUPPORTED, /* GetSIMIMSI */ 279 NOTSUPPORTED, /* GetSIMIMSI */
280 NOTSUPPORTED, /* GetDateTime */ 280 NOTSUPPORTED, /* GetDateTime */
281 NOTSUPPORTED, /* SetDateTime */ 281 NOTSUPPORTED, /* SetDateTime */
282 NOTSUPPORTED, /* GetAlarm */ 282 NOTSUPPORTED, /* GetAlarm */
283 NOTSUPPORTED, /* SetAlarm */ 283 NOTSUPPORTED, /* SetAlarm */
284 NOTSUPPORTED, /* GetLocale */ 284 NOTSUPPORTED, /* GetLocale */
285 NOTSUPPORTED, /* SetLocale */ 285 NOTSUPPORTED, /* SetLocale */
286 NOTSUPPORTED, /* PressKey */ 286 NOTSUPPORTED, /* PressKey */
287 DCT4_Reset, 287 DCT4_Reset,
288 NOTSUPPORTED, /* ResetPhoneSettings*/ 288 NOTSUPPORTED, /* ResetPhoneSettings*/
289 NOTSUPPORTED, /* EnterSecurityCode*/ 289 NOTSUPPORTED, /* EnterSecurityCode*/
290 NOTSUPPORTED, /* GetSecurityStatus*/ 290 NOTSUPPORTED, /* GetSecurityStatus*/
291 NOTSUPPORTED, /* GetDisplayStatus*/ 291 NOTSUPPORTED, /* GetDisplayStatus*/
292 NOTSUPPORTED, /* SetAutoNetworkLogin*/ 292 NOTSUPPORTED, /* SetAutoNetworkLogin*/
293 NOTSUPPORTED, /* GetBatteryCharge*/ 293 NOTSUPPORTED, /* GetBatteryCharge*/
294 NOTSUPPORTED, /* GetSignalQuality*/ 294 NOTSUPPORTED, /* GetSignalQuality*/
295 NOTSUPPORTED, /* GetNetworkInfo */ 295 NOTSUPPORTED, /* GetNetworkInfo */
296 NOTSUPPORTED, /* GetCategory */ 296 NOTSUPPORTED, /* GetCategory */
297 NOTSUPPORTED, /* AddCategory */ 297 NOTSUPPORTED, /* AddCategory */
298 NOTSUPPORTED, /* GetCategoryStatus */ 298 NOTSUPPORTED, /* GetCategoryStatus */
299 NOTSUPPORTED, /* GetMemoryStatus */ 299 NOTSUPPORTED, /* GetMemoryStatus */
300 NOTSUPPORTED, /* GetMemory */ 300 NOTSUPPORTED, /* GetMemory */
301 NOTSUPPORTED, /* GetNextMemory */ 301 NOTSUPPORTED, /* GetNextMemory */
302 NOTSUPPORTED, /* SetMemory */ 302 NOTSUPPORTED, /* SetMemory */
303 NOTSUPPORTED, /* AddMemory */ 303 NOTSUPPORTED, /* AddMemory */
304 NOTSUPPORTED, /* DeleteMemory */ 304 NOTSUPPORTED, /* DeleteMemory */
305 NOTIMPLEMENTED, /* DeleteAllMemory */ 305 NOTIMPLEMENTED, /* DeleteAllMemory */
306 NOTSUPPORTED, /* GetSpeedDial */ 306 NOTSUPPORTED, /* GetSpeedDial */
307 NOTSUPPORTED, /* SetSpeedDial */ 307 NOTSUPPORTED, /* SetSpeedDial */
308 NOTSUPPORTED, /* GetSMSC */ 308 NOTSUPPORTED, /* GetSMSC */
309 NOTSUPPORTED, /* SetSMSC */ 309 NOTSUPPORTED, /* SetSMSC */
310 NOTSUPPORTED, /* GetSMSStatus */ 310 NOTSUPPORTED, /* GetSMSStatus */
311 NOTSUPPORTED, /* GetSMS */ 311 NOTSUPPORTED, /* GetSMS */
312 NOTSUPPORTED, /* GetNextSMS */ 312 NOTSUPPORTED, /* GetNextSMS */
313 NOTSUPPORTED, /* SetSMS */ 313 NOTSUPPORTED, /* SetSMS */
314 NOTSUPPORTED, /* AddSMS */ 314 NOTSUPPORTED, /* AddSMS */
315 NOTSUPPORTED, /* DeleteSMS */ 315 NOTSUPPORTED, /* DeleteSMS */
316 NOTSUPPORTED, /* SendSMS */ 316 NOTSUPPORTED, /* SendSMS */
317 NOTSUPPORTED, /* SendSavedSMS */ 317 NOTSUPPORTED, /* SendSavedSMS */
318 NOTSUPPORTED, /* SetFastSMSSending*/
318 NOTSUPPORTED, /* SetIncomingSMS */ 319 NOTSUPPORTED, /* SetIncomingSMS */
319 NOTSUPPORTED, /* SetIncomingCB */ 320 NOTSUPPORTED, /* SetIncomingCB */
320 NOTSUPPORTED, /* GetSMSFolders */ 321 NOTSUPPORTED, /* GetSMSFolders */
321 NOTSUPPORTED, /* AddSMSFolder */ 322 NOTSUPPORTED, /* AddSMSFolder */
322 NOTSUPPORTED, /* DeleteSMSFolder */ 323 NOTSUPPORTED, /* DeleteSMSFolder */
323 NOTIMPLEMENTED, /* DialVoice */ 324 NOTIMPLEMENTED, /* DialVoice */
324 NOTIMPLEMENTED, /* AnswerCall */ 325 NOTIMPLEMENTED, /* AnswerCall */
325 NOTIMPLEMENTED, /* CancelCall */ 326 NOTIMPLEMENTED, /* CancelCall */
326 NOTIMPLEMENTED, /* HoldCall */ 327 NOTIMPLEMENTED, /* HoldCall */
327 NOTIMPLEMENTED, /* UnholdCall */ 328 NOTIMPLEMENTED, /* UnholdCall */
328 NOTIMPLEMENTED, /* ConferenceCall */ 329 NOTIMPLEMENTED, /* ConferenceCall */
329 NOTIMPLEMENTED, /* SplitCall */ 330 NOTIMPLEMENTED, /* SplitCall */
330 NOTIMPLEMENTED, /* TransferCall */ 331 NOTIMPLEMENTED, /* TransferCall */
331 NOTIMPLEMENTED, /* SwitchCall */ 332 NOTIMPLEMENTED, /* SwitchCall */
332 NOTSUPPORTED, /* GetCallDivert */ 333 NOTSUPPORTED, /* GetCallDivert */
333 NOTSUPPORTED, /* SetCallDivert */ 334 NOTSUPPORTED, /* SetCallDivert */
334 NOTSUPPORTED, /* CancelAllDiverts*/ 335 NOTSUPPORTED, /* CancelAllDiverts*/
335 NOTIMPLEMENTED, /* SetIncomingCall */ 336 NOTIMPLEMENTED, /* SetIncomingCall */
336 NOTIMPLEMENTED, /* SetIncomingUSSD */ 337 NOTIMPLEMENTED, /* SetIncomingUSSD */
337 NOTSUPPORTED, /* SendDTMF */ 338 NOTSUPPORTED, /* SendDTMF */
338 NOTSUPPORTED, /* GetRingtone */ 339 NOTSUPPORTED, /* GetRingtone */
339 NOTSUPPORTED, /* SetRingtone */ 340 NOTSUPPORTED, /* SetRingtone */
340 NOTSUPPORTED, /* GetRingtonesInfo*/ 341 NOTSUPPORTED, /* GetRingtonesInfo*/
341 NOTIMPLEMENTED, /* DeleteUserRingtones*/ 342 NOTIMPLEMENTED, /* DeleteUserRingtones*/
342 NOTSUPPORTED, /* PlayTone */ 343 NOTSUPPORTED, /* PlayTone */
343 NOTSUPPORTED, /* GetWAPBookmark */ 344 NOTSUPPORTED, /* GetWAPBookmark */
344 NOTSUPPORTED, /* SetWAPBookmark */ 345 NOTSUPPORTED, /* SetWAPBookmark */
345 NOTSUPPORTED, /* DeleteWAPBookmark */ 346 NOTSUPPORTED, /* DeleteWAPBookmark */
346 NOTSUPPORTED, /* GetWAPSettings */ 347 NOTSUPPORTED, /* GetWAPSettings */
347 NOTSUPPORTED, /* SetWAPSettings */ 348 NOTSUPPORTED, /* SetWAPSettings */
348 NOTSUPPORTED, /* GetMMSSettings */ 349 NOTSUPPORTED, /* GetMMSSettings */
349 NOTSUPPORTED, /* SetMMSSettings */ 350 NOTSUPPORTED, /* SetMMSSettings */
350 NOTSUPPORTED, /* GetSyncMLSettings*/ 351 NOTSUPPORTED, /* GetSyncMLSettings*/
351 NOTSUPPORTED, /* SetSyncMLSettings*/ 352 NOTSUPPORTED, /* SetSyncMLSettings*/
352 NOTSUPPORTED, /* GetChatSettings */ 353 NOTSUPPORTED, /* GetChatSettings */
353 NOTSUPPORTED, /* SetChatSettings */ 354 NOTSUPPORTED, /* SetChatSettings */
354 NOTSUPPORTED, /* GetBitmap */ 355 NOTSUPPORTED, /* GetBitmap */
355 NOTSUPPORTED, /* SetBitmap */ 356 NOTSUPPORTED, /* SetBitmap */
356 NOTSUPPORTED, /* GetToDoStatus */ 357 NOTSUPPORTED, /* GetToDoStatus */
357 NOTSUPPORTED, /* GetToDo */ 358 NOTSUPPORTED, /* GetToDo */
358 NOTSUPPORTED, /* GetNextToDo */ 359 NOTSUPPORTED, /* GetNextToDo */
359 NOTSUPPORTED, /* SetToDo */ 360 NOTSUPPORTED, /* SetToDo */
360 NOTSUPPORTED, /* AddToDo */ 361 NOTSUPPORTED, /* AddToDo */
361 NOTSUPPORTED, /* DeleteToDo */ 362 NOTSUPPORTED, /* DeleteToDo */
362 NOTSUPPORTED, /* DeleteAllToDo */ 363 NOTSUPPORTED, /* DeleteAllToDo */
363 NOTIMPLEMENTED, /* GetCalendarStatus*/ 364 NOTIMPLEMENTED, /* GetCalendarStatus*/
364 NOTIMPLEMENTED, /* GetCalendar */ 365 NOTIMPLEMENTED, /* GetCalendar */
365 NOTSUPPORTED, /* GetNextCalendar */ 366 NOTSUPPORTED, /* GetNextCalendar */
366 NOTIMPLEMENTED, /* SetCalendar */ 367 NOTIMPLEMENTED, /* SetCalendar */
367 NOTSUPPORTED, /* AddCalendar */ 368 NOTSUPPORTED, /* AddCalendar */
368 NOTSUPPORTED, /* DeleteCalendar */ 369 NOTSUPPORTED, /* DeleteCalendar */
369 NOTIMPLEMENTED, /* DeleteAllCalendar*/ 370 NOTIMPLEMENTED, /* DeleteAllCalendar*/
370 NOTSUPPORTED, /* GetCalendarSettings*/ 371 NOTSUPPORTED, /* GetCalendarSettings*/
371 NOTSUPPORTED, /* SetCalendarSettings*/ 372 NOTSUPPORTED, /* SetCalendarSettings*/
372 NOTSUPPORTED, /* GetNote */ 373 NOTSUPPORTED, /* GetNextNote */
373 NOTSUPPORTED, /* GetProfile */ 374 NOTSUPPORTED, /* GetProfile */
374 NOTSUPPORTED, /* SetProfile */ 375 NOTSUPPORTED, /* SetProfile */
375 NOTSUPPORTED, /* GetFMStation */ 376 NOTSUPPORTED, /* GetFMStation */
376 NOTSUPPORTED, /* SetFMStation */ 377 NOTSUPPORTED, /* SetFMStation */
377 NOTSUPPORTED, /* ClearFMStations */ 378 NOTSUPPORTED, /* ClearFMStations */
378 N3650_GetNextFileFolder, 379 N3650_GetNextFileFolder,
379 N3650_GetFilePart, 380 N3650_GetFilePart,
380 NOTIMPLEMENTED, /* AddFilePart */ 381 NOTIMPLEMENTED, /* AddFilePart */
381 NOTSUPPORTED, /* GetFileSystemStatus*/ 382 NOTSUPPORTED, /* GetFileSystemStatus*/
382 NOTIMPLEMENTED, /* DeleteFile */ 383 NOTIMPLEMENTED, /* DeleteFile */
383 NOTIMPLEMENTED, /* AddFolder */ 384 NOTIMPLEMENTED, /* AddFolder */
384 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 385 NOTSUPPORTED, /* GetGPRSAccessPoint*/
385 NOTSUPPORTED /* SetGPRSAccessPoint*/ 386 NOTSUPPORTED /* SetGPRSAccessPoint*/
386}; 387};
387 388
388#endif 389#endif
389 390
390/* How should editor hadle tabs in this file? Add editor commands here. 391/* How should editor hadle tabs in this file? Add editor commands here.
391 * vim: noexpandtab sw=8 ts=8 sts=8: 392 * vim: noexpandtab sw=8 ts=8 sts=8:
392 */ 393 */
diff --git a/gammu/emb/common/phone/nokia/dct4/n6510.c b/gammu/emb/common/phone/nokia/dct4/n6510.c
index 67fe492..2208def 100644
--- a/gammu/emb/common/phone/nokia/dct4/n6510.c
+++ b/gammu/emb/common/phone/nokia/dct4/n6510.c
@@ -1,50 +1,53 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2/* based on some work from Markus Plail, Pawel Kot and Gnokii */ 2/* based on some Markus Plail, Pawel Kot work from Gnokii (www.gnokii.org)
3 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
4 * GNU GPL version 2 or later
5 */
3/* function for making CRC for filesystem (c) 2003 by Michael Schroeder */ 6/* function for making CRC for filesystem (c) 2003 by Michael Schroeder */
4 7
5#include "../../../gsmstate.h" 8#include "../../../gsmstate.h"
6 9
7#ifdef GSM_ENABLE_NOKIA6510 10#ifdef GSM_ENABLE_NOKIA6510
8 11
9#include <string.h> 12#include <string.h>
10#include <time.h> 13#include <time.h>
11 14
12#include "../../../misc/coding/coding.h" 15#include "../../../misc/coding/coding.h"
13#include "../../../gsmcomon.h" 16#include "../../../gsmcomon.h"
14#include "../../../service/gsmlogo.h" 17#include "../../../service/gsmlogo.h"
15#include "../nfunc.h" 18#include "../nfunc.h"
16#include "../nfuncold.h" 19#include "../nfuncold.h"
17#include "../../pfunc.h" 20#include "../../pfunc.h"
18#include "dct4func.h" 21#include "dct4func.h"
19#include "n6510.h" 22#include "n6510.h"
20 23
21static GSM_Error N6510_Initialise (GSM_StateMachine *s) 24static GSM_Error N6510_Initialise (GSM_StateMachine *s)
22{ 25{
23 s->Phone.Data.Priv.N6510.CalendarIconsNum = 0; 26 s->Phone.Data.Priv.N6510.CalendarIconsNum = 0;
24 27
25 /* Enables various things like incoming SMS, call info, etc. */ 28 /* Enables various things like incoming SMS, call info, etc. */
26 return N71_65_EnableFunctions (s, "\x01\x02\x06\x0A\x14\x17\x39", 7); 29 return N71_65_EnableFunctions (s, "\x01\x02\x06\x0A\x14\x17\x39", 7);
27} 30}
28 31
29static GSM_Error N6510_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s) 32static GSM_Error N6510_ReplyGetMemory(GSM_Protocol_Message msg, GSM_StateMachine *s)
30{ 33{
31 smprintf(s, "Phonebook entry received\n"); 34 smprintf(s, "Phonebook entry received\n");
32 switch (msg.Buffer[6]) { 35 switch (msg.Buffer[6]) {
33 case 0x0f: 36 case 0x0f:
34 return N71_65_ReplyGetMemoryError(msg.Buffer[10], s); 37 return N71_65_ReplyGetMemoryError(msg.Buffer[10], s);
35 default: 38 default:
36 return N71_65_DecodePhonebook(s, s->Phone.Data.Memory, s->Phone.Data.Bitmap, s->Phone.Data.SpeedDial, msg.Buffer+22, msg.Length-22,false); 39 return N71_65_DecodePhonebook(s, s->Phone.Data.Memory, s->Phone.Data.Bitmap, s->Phone.Data.SpeedDial, msg.Buffer+22, msg.Length-22,false);
37 } 40 }
38 return ERR_UNKNOWN; 41 return ERR_UNKNOWN;
39} 42}
40 43
41static GSM_Error N6510_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry) 44static GSM_Error N6510_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
42{ 45{
43 unsigned char req[] = {N6110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01, 46 unsigned char req[] = {N6110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01,
44 0xfe, 0x10, /* memory type */ 47 0xfe, 0x10, /* memory type */
45 0x00, 0x00, 0x00, 0x00, 48 0x00, 0x00, 0x00, 0x00,
46 0x00, 0x01, /* location */ 49 0x00, 0x01, /* location */
47 0x00, 0x00, 0x01}; 50 0x00, 0x00, 0x01};
48 51
49 req[9] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES); 52 req[9] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
50 if (req[9]==0xff) return ERR_NOTSUPPORTED; 53 if (req[9]==0xff) return ERR_NOTSUPPORTED;
@@ -74,96 +77,98 @@ static GSM_Error N6510_ReplyGetMemoryStatus(GSM_Protocol_Message msg, GSM_StateM
74 Data->MemoryStatus->MemoryUsed = msg.Buffer[20]*256 + msg.Buffer[21]; 77 Data->MemoryStatus->MemoryUsed = msg.Buffer[20]*256 + msg.Buffer[21];
75 smprintf(s, "Used : %i\n",Data->MemoryStatus->MemoryUsed); 78 smprintf(s, "Used : %i\n",Data->MemoryStatus->MemoryUsed);
76 Data->MemoryStatus->MemoryFree -= Data->MemoryStatus->MemoryUsed; 79 Data->MemoryStatus->MemoryFree -= Data->MemoryStatus->MemoryUsed;
77 smprintf(s, "Free : %i\n",Data->MemoryStatus->MemoryFree); 80 smprintf(s, "Free : %i\n",Data->MemoryStatus->MemoryFree);
78 return ERR_NONE; 81 return ERR_NONE;
79} 82}
80 83
81static GSM_Error N6510_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status) 84static GSM_Error N6510_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
82{ 85{
83 unsigned char req[] = {N6110_FRAME_HEADER, 0x03, 0x02, 86 unsigned char req[] = {N6110_FRAME_HEADER, 0x03, 0x02,
84 0x00, /* memory type */ 87 0x00, /* memory type */
85 0x55, 0x55, 0x55, 0x00}; 88 0x55, 0x55, 0x55, 0x00};
86 89
87 req[5] = NOKIA_GetMemoryType(s, Status->MemoryType,N71_65_MEMORY_TYPES); 90 req[5] = NOKIA_GetMemoryType(s, Status->MemoryType,N71_65_MEMORY_TYPES);
88 if (req[5]==0xff) return ERR_NOTSUPPORTED; 91 if (req[5]==0xff) return ERR_NOTSUPPORTED;
89 92
90 s->Phone.Data.MemoryStatus=Status; 93 s->Phone.Data.MemoryStatus=Status;
91 smprintf(s, "Getting memory status\n"); 94 smprintf(s, "Getting memory status\n");
92 return GSM_WaitFor (s, req, 10, 0x03, 4, ID_GetMemoryStatus); 95 return GSM_WaitFor (s, req, 10, 0x03, 4, ID_GetMemoryStatus);
93} 96}
94 97
95static GSM_Error N6510_ReplyGetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s) 98static GSM_Error N6510_ReplyGetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s)
96{ 99{
97 int i, current, j; 100 int i, current, j;
98 GSM_Phone_Data *Data = &s->Phone.Data; 101 GSM_Phone_Data *Data = &s->Phone.Data;
99 102
100 switch (msg.Buffer[4]) { 103 switch (msg.Buffer[4]) {
101 case 0x00: 104 case 0x00:
102 smprintf(s, "SMSC received\n"); 105 smprintf(s, "SMSC received\n");
103 break; 106 break;
104 case 0x02: 107 case 0x02:
105 smprintf(s, "SMSC empty\n"); 108 smprintf(s, "SMSC empty\n");
106 return ERR_INVALIDLOCATION; 109 return ERR_INVALIDLOCATION;
107 default: 110 default:
108 smprintf(s, "Unknown SMSC state: %02x\n",msg.Buffer[4]); 111 smprintf(s, "Unknown SMSC state: %02x\n",msg.Buffer[4]);
109 return ERR_UNKNOWNRESPONSE; 112 return ERR_UNKNOWNRESPONSE;
110 } 113 }
111 memset(Data->SMSC,0,sizeof(GSM_SMSC)); 114 memset(Data->SMSC,0,sizeof(GSM_SMSC));
112 Data->SMSC->Location = msg.Buffer[8]; 115 Data->SMSC->Location = msg.Buffer[8];
113 Data->SMSC->Format = SMS_FORMAT_Text; 116 Data->SMSC->Format = SMS_FORMAT_Text;
114 switch (msg.Buffer[10]) { 117 switch (msg.Buffer[10]) {
115 case 0x00: Data->SMSC->Format = SMS_FORMAT_Text; break; 118 case 0x00: Data->SMSC->Format = SMS_FORMAT_Text; break;
116 case 0x22: Data->SMSC->Format = SMS_FORMAT_Fax; break; 119 case 0x22: Data->SMSC->Format = SMS_FORMAT_Fax; break;
117 case 0x26: Data->SMSC->Format = SMS_FORMAT_Pager;break; 120 case 0x26: Data->SMSC->Format = SMS_FORMAT_Pager;break;
118 case 0x32: Data->SMSC->Format = SMS_FORMAT_Email;break; 121 case 0x32: Data->SMSC->Format = SMS_FORMAT_Email;break;
119 } 122 }
120 Data->SMSC->Validity.Format= SMS_Validity_RelativeFormat; 123 Data->SMSC->Validity.Format= SMS_Validity_RelativeFormat;
121 Data->SMSC->Validity.Relative= msg.Buffer[12]; 124 Data->SMSC->Validity.Relative= msg.Buffer[12];
125 if (msg.Buffer[12] == 0x00) Data->SMSC->Validity.Relative = SMS_VALID_Max_Time;
126
122 current = 14; 127 current = 14;
123 for (i=0;i<msg.Buffer[13];i++) { 128 for (i=0;i<msg.Buffer[13];i++) {
124 switch (msg.Buffer[current]) { 129 switch (msg.Buffer[current]) {
125 case 0x81: 130 case 0x81:
126 j=current+4; 131 j=current+4;
127 while (msg.Buffer[j]!=0) {j++;} 132 while (msg.Buffer[j]!=0) {j++;}
128 j=j-33; 133 j=j-33;
129 if (j>GSM_MAX_SMSC_NAME_LENGTH) { 134 if (j>GSM_MAX_SMSC_NAME_LENGTH) {
130 smprintf(s, "Too long name\n"); 135 smprintf(s, "Too long name\n");
131 return ERR_UNKNOWNRESPONSE; 136 return ERR_UNKNOWNRESPONSE;
132 } 137 }
133 CopyUnicodeString(Data->SMSC->Name,msg.Buffer+current+4); 138 CopyUnicodeString(Data->SMSC->Name,msg.Buffer+current+4);
134 smprintf(s, " Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name)); 139 smprintf(s, " Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name));
135 break; 140 break;
136 case 0x82: 141 case 0x82:
137 switch (msg.Buffer[current+2]) { 142 switch (msg.Buffer[current+2]) {
138 case 0x01: 143 case 0x01:
139 GSM_UnpackSemiOctetNumber(Data->SMSC->DefaultNumber,msg.Buffer+current+4,true); 144 GSM_UnpackSemiOctetNumber(Data->SMSC->DefaultNumber,msg.Buffer+current+4,true);
140 smprintf(s, " Default number \"%s\"\n", DecodeUnicodeString(Data->SMSC->DefaultNumber)); 145 smprintf(s, " Default number \"%s\"\n", DecodeUnicodeString(Data->SMSC->DefaultNumber));
141 break; 146 break;
142 case 0x02: 147 case 0x02:
143 GSM_UnpackSemiOctetNumber(Data->SMSC->Number,msg.Buffer+current+4,false); 148 GSM_UnpackSemiOctetNumber(Data->SMSC->Number,msg.Buffer+current+4,false);
144 smprintf(s, " Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number)); 149 smprintf(s, " Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number));
145 break; 150 break;
146 default: 151 default:
147 smprintf(s, "Unknown SMSC number: %02x\n",msg.Buffer[current+2]); 152 smprintf(s, "Unknown SMSC number: %02x\n",msg.Buffer[current+2]);
148 return ERR_UNKNOWNRESPONSE; 153 return ERR_UNKNOWNRESPONSE;
149 } 154 }
150 break; 155 break;
151 default: 156 default:
152 smprintf(s, "Unknown SMSC block: %02x\n",msg.Buffer[current]); 157 smprintf(s, "Unknown SMSC block: %02x\n",msg.Buffer[current]);
153 return ERR_UNKNOWNRESPONSE; 158 return ERR_UNKNOWNRESPONSE;
154 } 159 }
155 current = current + msg.Buffer[current+1]; 160 current = current + msg.Buffer[current+1];
156 } 161 }
157 return ERR_NONE; 162 return ERR_NONE;
158} 163}
159 164
160static GSM_Error N6510_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc) 165static GSM_Error N6510_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
161{ 166{
162 unsigned char req[] = {N6110_FRAME_HEADER, 0x14, 167 unsigned char req[] = {N6110_FRAME_HEADER, 0x14,
163 0x01, /* location */ 168 0x01, /* location */
164 0x00}; 169 0x00};
165 170
166 if (smsc->Location==0x00) return ERR_INVALIDLOCATION; 171 if (smsc->Location==0x00) return ERR_INVALIDLOCATION;
167 172
168 req[4]=smsc->Location; 173 req[4]=smsc->Location;
169 174
@@ -220,97 +225,97 @@ static GSM_Error N6510_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
220 req[count++] = 0x02; 225 req[count++] = 0x02;
221 req[count] = GSM_PackSemiOctetNumber(smsc->Number, req+count+2, false) + 1; 226 req[count] = GSM_PackSemiOctetNumber(smsc->Number, req+count+2, false) + 1;
222 if (req[count]>18) { 227 if (req[count]>18) {
223 smprintf(s, "Too long SMSC number in frame\n"); 228 smprintf(s, "Too long SMSC number in frame\n");
224 return ERR_UNKNOWN; 229 return ERR_UNKNOWN;
225 } 230 }
226 req[count+1] = req[count] - 1; 231 req[count+1] = req[count] - 1;
227 count += 23; 232 count += 23;
228 233
229 /* --------------- Default number ------------- */ 234 /* --------------- Default number ------------- */
230 /* Block type: number */ 235 /* Block type: number */
231 req[count++] = 0x82; 236 req[count++] = 0x82;
232 /* Offset to next block */ 237 /* Offset to next block */
233 req[count++] = 0x14; 238 req[count++] = 0x14;
234 /* Type of number: default number */ 239 /* Type of number: default number */
235 req[count++] = 0x01; 240 req[count++] = 0x01;
236 req[count] = GSM_PackSemiOctetNumber(smsc->DefaultNumber, req+count+2, true) + 1; 241 req[count] = GSM_PackSemiOctetNumber(smsc->DefaultNumber, req+count+2, true) + 1;
237 if (req[count]*2>12) { 242 if (req[count]*2>12) {
238 smprintf(s, "Too long SMSC number in frame\n"); 243 smprintf(s, "Too long SMSC number in frame\n");
239 return ERR_UNKNOWN; 244 return ERR_UNKNOWN;
240 } 245 }
241 req[count+1] = req[count] - 1; 246 req[count+1] = req[count] - 1;
242 count += 17; 247 count += 17;
243 248
244 /* -------------- SMSC name ------------------- */ 249 /* -------------- SMSC name ------------------- */
245 req[count++] = 0x81; 250 req[count++] = 0x81;
246 req[count++] = UnicodeLength(smsc->Name)*2 + 2 + 4; 251 req[count++] = UnicodeLength(smsc->Name)*2 + 2 + 4;
247 req[count++] = UnicodeLength(smsc->Name)*2 + 2; 252 req[count++] = UnicodeLength(smsc->Name)*2 + 2;
248 req[count++] = 0x00; 253 req[count++] = 0x00;
249 /* Can't make CopyUnicodeString(req+count,sms->Name) !!!! 254 /* Can't make CopyUnicodeString(req+count,sms->Name) !!!!
250 * with MSVC6 count is changed then 255 * with MSVC6 count is changed then
251 */ 256 */
252 i = count; 257 i = count;
253 CopyUnicodeString(req+i,smsc->Name); 258 CopyUnicodeString(req+i,smsc->Name);
254 count += UnicodeLength(smsc->Name)*2 + 2; 259 count += UnicodeLength(smsc->Name)*2 + 2;
255 260
256 smprintf(s, "Setting SMSC\n"); 261 smprintf(s, "Setting SMSC\n");
257 return GSM_WaitFor (s, req, count, 0x02, 4, ID_SetSMSC); 262 return GSM_WaitFor (s, req, count, 0x02, 4, ID_SetSMSC);
258} 263}
259 264
260static GSM_Error N6510_ReplyGetNetworkInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) 265static GSM_Error N6510_ReplyGetNetworkInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
261{ 266{
262 int current = msg.Buffer[7]+7, tmp; 267 int current = msg.Buffer[7]+7, tmp;
263 GSM_Phone_Data*Data = &s->Phone.Data; 268 GSM_Phone_Data*Data = &s->Phone.Data;
264#ifdef DEBUG 269#ifdef DEBUG
265 char name[100]; 270 char name[100];
266 GSM_NetworkInfo NetInfo; 271 GSM_NetworkInfo NetInfo;
267 272
268 smprintf(s, "Network status: "); 273 smprintf(s, "Network status : ");
269 switch (msg.Buffer[8]) { 274 switch (msg.Buffer[8]) {
270 case 0x00 : smprintf(s, "home network\n"); break; 275 case 0x00 : smprintf(s, "home network\n"); break;
271 case 0x01 : smprintf(s, "roaming network\n"); break; 276 case 0x01 : smprintf(s, "roaming network\n"); break;
272 case 0x04 : smprintf(s, "not logged"); break; 277 case 0x04 : smprintf(s, "not logged"); break;
273 case 0x06 : smprintf(s, "SIM card rejected\n"); break; 278 case 0x06 : smprintf(s, "SIM card rejected\n"); break;
274 case 0x09 : smprintf(s, "not logged"); break; 279 case 0x09 : smprintf(s, "not logged"); break;
275 default : smprintf(s, "unknown %i!\n",msg.Buffer[8]); break; 280 default : smprintf(s, "unknown %i!\n",msg.Buffer[8]); break;
276 } 281 }
277 if (msg.Buffer[8]==0x00 || msg.Buffer[8] == 0x01) { 282 if (msg.Buffer[8]==0x00 || msg.Buffer[8] == 0x01) {
278 NOKIA_DecodeNetworkCode(msg.Buffer + (current + 7),NetInfo.NetworkCode); 283 NOKIA_DecodeNetworkCode(msg.Buffer + (current + 7),NetInfo.NetworkCode);
279 smprintf(s, "Network code : %s\n", NetInfo.NetworkCode); 284 smprintf(s, "Network code : %s\n", NetInfo.NetworkCode);
280 smprintf(s, "Network name for Gammu : %s ", 285 smprintf(s, "Network name for Gammu : %s ",
281 DecodeUnicodeString(GSM_GetNetworkName(NetInfo.NetworkCode))); 286 DecodeUnicodeString(GSM_GetNetworkName(NetInfo.NetworkCode)));
282 smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(NetInfo.NetworkCode))); 287 smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(NetInfo.NetworkCode)));
283 288
284 sprintf(NetInfo.LAC,"%02x%02x", msg.Buffer[current+1], msg.Buffer[current+2]); 289 sprintf(NetInfo.LAC,"%02x%02x", msg.Buffer[current+1], msg.Buffer[current+2]);
285 smprintf(s, "LAC : %s\n", NetInfo.LAC); 290 smprintf(s, "LAC : %s\n", NetInfo.LAC);
286 291
287 sprintf(NetInfo.CID, "%02x%02x", msg.Buffer[current+5], msg.Buffer[current+6]); 292 sprintf(NetInfo.CID, "%02x%02x", msg.Buffer[current+5], msg.Buffer[current+6]);
288 smprintf(s, "CID : %s\n", NetInfo.CID); 293 smprintf(s, "CID : %s\n", NetInfo.CID);
289 294
290 tmp = 10; 295 tmp = 10;
291 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,name,true); 296 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,name,true);
292 smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name)); 297 smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name));
293 } 298 }
294#endif 299#endif
295 if (Data->RequestID==ID_GetNetworkInfo) { 300 if (Data->RequestID==ID_GetNetworkInfo) {
296 Data->NetworkInfo->NetworkName[0] = 0x00; 301 Data->NetworkInfo->NetworkName[0] = 0x00;
297 Data->NetworkInfo->NetworkName[1] = 0x00; 302 Data->NetworkInfo->NetworkName[1] = 0x00;
298 Data->NetworkInfo->State = 0; 303 Data->NetworkInfo->State = 0;
299 switch (msg.Buffer[8]) { 304 switch (msg.Buffer[8]) {
300 case 0x00: Data->NetworkInfo->State = GSM_HomeNetwork; break; 305 case 0x00: Data->NetworkInfo->State = GSM_HomeNetwork; break;
301 case 0x01: Data->NetworkInfo->State = GSM_RoamingNetwork;break; 306 case 0x01: Data->NetworkInfo->State = GSM_RoamingNetwork;break;
302 case 0x04: 307 case 0x04:
303 case 0x06: 308 case 0x06:
304 case 0x09: Data->NetworkInfo->State = GSM_NoNetwork; break; 309 case 0x09: Data->NetworkInfo->State = GSM_NoNetwork; break;
305 } 310 }
306 if (Data->NetworkInfo->State == GSM_HomeNetwork || Data->NetworkInfo->State == GSM_RoamingNetwork) { 311 if (Data->NetworkInfo->State == GSM_HomeNetwork || Data->NetworkInfo->State == GSM_RoamingNetwork) {
307 tmp = 10; 312 tmp = 10;
308 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,Data->NetworkInfo->NetworkName,true); 313 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,Data->NetworkInfo->NetworkName,true);
309 sprintf(Data->NetworkInfo->LAC, "%02x%02x", msg.Buffer[current+1], msg.Buffer[current+2]); 314 sprintf(Data->NetworkInfo->LAC, "%02x%02x", msg.Buffer[current+1], msg.Buffer[current+2]);
310 sprintf(Data->NetworkInfo->CID, "%02x%02x", msg.Buffer[current+5], msg.Buffer[current+6]); 315 sprintf(Data->NetworkInfo->CID, "%02x%02x", msg.Buffer[current+5], msg.Buffer[current+6]);
311 NOKIA_DecodeNetworkCode(msg.Buffer + (current+7),Data->NetworkInfo->NetworkCode); 316 NOKIA_DecodeNetworkCode(msg.Buffer + (current+7),Data->NetworkInfo->NetworkCode);
312 } 317 }
313 } 318 }
314 return ERR_NONE; 319 return ERR_NONE;
315} 320}
316 321
@@ -940,101 +945,101 @@ static GSM_Error N6510_ReplyGetSignalQuality(GSM_Protocol_Message msg, GSM_State
940{ 945{
941 GSM_Phone_Data *Data = &s->Phone.Data; 946 GSM_Phone_Data *Data = &s->Phone.Data;
942 947
943 smprintf(s, "Network level received: %i\n",msg.Buffer[8]); 948 smprintf(s, "Network level received: %i\n",msg.Buffer[8]);
944 Data->SignalQuality->SignalStrength = -1; 949 Data->SignalQuality->SignalStrength = -1;
945 Data->SignalQuality->SignalPercent = ((int)msg.Buffer[8]); 950 Data->SignalQuality->SignalPercent = ((int)msg.Buffer[8]);
946 Data->SignalQuality->BitErrorRate = -1; 951 Data->SignalQuality->BitErrorRate = -1;
947 return ERR_NONE; 952 return ERR_NONE;
948} 953}
949 954
950static GSM_Error N6510_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig) 955static GSM_Error N6510_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
951{ 956{
952 unsigned char req[] = {N6110_FRAME_HEADER, 0x0B, 0x00, 0x02, 0x00, 0x00, 0x00}; 957 unsigned char req[] = {N6110_FRAME_HEADER, 0x0B, 0x00, 0x02, 0x00, 0x00, 0x00};
953 958
954 s->Phone.Data.SignalQuality = sig; 959 s->Phone.Data.SignalQuality = sig;
955 smprintf(s, "Getting network level\n"); 960 smprintf(s, "Getting network level\n");
956 return GSM_WaitFor (s, req, 9, 0x0a, 4, ID_GetSignalQuality); 961 return GSM_WaitFor (s, req, 9, 0x0a, 4, ID_GetSignalQuality);
957} 962}
958 963
959static GSM_Error N6510_ReplyGetBatteryCharge(GSM_Protocol_Message msg, GSM_StateMachine *s) 964static GSM_Error N6510_ReplyGetBatteryCharge(GSM_Protocol_Message msg, GSM_StateMachine *s)
960{ 965{
961 GSM_Phone_Data *Data = &s->Phone.Data; 966 GSM_Phone_Data *Data = &s->Phone.Data;
962 967
963 smprintf(s, "Battery level received: %i\n",msg.Buffer[9]*100/7); 968 smprintf(s, "Battery level received: %i\n",msg.Buffer[9]*100/7);
964 Data->BatteryCharge->BatteryPercent = ((int)(msg.Buffer[9]*100/7)); 969 Data->BatteryCharge->BatteryPercent = ((int)(msg.Buffer[9]*100/7));
965 Data->BatteryCharge->ChargeState = 0; 970 Data->BatteryCharge->ChargeState = 0;
966 return ERR_NONE; 971 return ERR_NONE;
967} 972}
968 973
969static GSM_Error N6510_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat) 974static GSM_Error N6510_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
970{ 975{
971 unsigned char req[] = {N6110_FRAME_HEADER, 0x0A, 0x02, 0x00}; 976 unsigned char req[] = {N6110_FRAME_HEADER, 0x0A, 0x02, 0x00};
972 977
973 s->Phone.Data.BatteryCharge = bat; 978 s->Phone.Data.BatteryCharge = bat;
974 smprintf(s, "Getting battery level\n"); 979 smprintf(s, "Getting battery level\n");
975 return GSM_WaitFor (s, req, 6, 0x17, 4, ID_GetBatteryCharge); 980 return GSM_WaitFor (s, req, 6, 0x17, 4, ID_GetBatteryCharge);
976} 981}
977 982
978static GSM_Error N6510_ReplyGetWAPBookmark(GSM_Protocol_Message msg, GSM_StateMachine *s) 983static GSM_Error N6510_ReplyGetWAPBookmark(GSM_Protocol_Message msg, GSM_StateMachine *s)
979{ 984{
980 return DCT3DCT4_ReplyGetWAPBookmark (msg, s, true); 985 return DCT3DCT4_ReplyGetWAPBookmark (msg, s, true);
981} 986}
982 987
983static GSM_Error N6510_ReplyGetOperatorLogo(GSM_Protocol_Message msg, GSM_StateMachine *s) 988static GSM_Error N6510_ReplyGetOperatorLogo(GSM_Protocol_Message msg, GSM_StateMachine *s)
984{ 989{
985 GSM_Phone_Data *Data = &s->Phone.Data; 990 GSM_Phone_Data *Data = &s->Phone.Data;
986 991
987 smprintf(s, "Operator logo received\n"); 992 smprintf(s, "Operator logo received\n");
993 if (msg.Length == 18) return ERR_EMPTY;
988 NOKIA_DecodeNetworkCode(msg.Buffer+12,Data->Bitmap->NetworkCode); 994 NOKIA_DecodeNetworkCode(msg.Buffer+12,Data->Bitmap->NetworkCode);
989 smprintf(s, "Network code %s\n",Data->Bitmap->NetworkCode); 995 smprintf(s, "Network code %s\n",Data->Bitmap->NetworkCode);
990 Data->Bitmap->BitmapWidth= msg.Buffer[20]; 996 Data->Bitmap->BitmapWidth= msg.Buffer[20];
991 Data->Bitmap->BitmapHeight= msg.Buffer[21]; 997 Data->Bitmap->BitmapHeight= msg.Buffer[21];
992 if (msg.Length == 18) return ERR_EMPTY;
993 PHONE_DecodeBitmap(GSM_Nokia6510OperatorLogo,msg.Buffer+26,Data->Bitmap); 998 PHONE_DecodeBitmap(GSM_Nokia6510OperatorLogo,msg.Buffer+26,Data->Bitmap);
994 return ERR_NONE; 999 return ERR_NONE;
995} 1000}
996 1001
997GSM_Error N6510_ReplyDeleteMemory(GSM_Protocol_Message msg, GSM_StateMachine *s) 1002GSM_Error N6510_ReplyDeleteMemory(GSM_Protocol_Message msg, GSM_StateMachine *s)
998{ 1003{
999 smprintf(s, "Phonebook entry deleted\n"); 1004 smprintf(s, "Phonebook entry deleted\n");
1000 return ERR_NONE; 1005 return ERR_NONE;
1001} 1006}
1002 1007
1003GSM_Error N6510_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 1008GSM_Error N6510_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
1004{ 1009{
1005 unsigned char req[] = {N7110_FRAME_HEADER, 0x0f, 0x55, 0x01, 1010 unsigned char req[] = {N7110_FRAME_HEADER, 0x0f, 0x55, 0x01,
1006 0x04, 0x55, 0x00, 0x10, 0xFF, 0x02, 1011 0x04, 0x55, 0x00, 0x10, 0xFF, 0x02,
1007 0x00, 0x01, /* location*/ 1012 0x00, 0x01, /* location*/
1008 0x00, 0x00, 0x00, 0x00, 1013 0x00, 0x00, 0x00, 0x00,
1009 0x05, /* memory type*/ 1014 0x05, /* memory type*/
1010 0x55, 0x55, 0x55}; 1015 0x55, 0x55, 0x55};
1011 1016
1012 req[12] = entry->Location / 256; 1017 req[12] = entry->Location / 256;
1013 req[13] = entry->Location % 256; 1018 req[13] = entry->Location % 256;
1014 1019
1015 req[18] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES); 1020 req[18] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
1016 if (req[18]==0xff) return ERR_NOTSUPPORTED; 1021 if (req[18]==0xff) return ERR_NOTSUPPORTED;
1017 1022
1018 smprintf(s, "Deleting phonebook entry\n"); 1023 smprintf(s, "Deleting phonebook entry\n");
1019 return GSM_WaitFor (s, req, 22, 0x03, 4, ID_SetMemory); 1024 return GSM_WaitFor (s, req, 22, 0x03, 4, ID_SetMemory);
1020} 1025}
1021 1026
1022static GSM_Error N6510_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) 1027static GSM_Error N6510_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
1023{ 1028{
1024 int count = 22, blocks; 1029 int count = 22, blocks;
1025 unsigned char req[500] = { 1030 unsigned char req[500] = {
1026 N7110_FRAME_HEADER, 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x10, 1031 N7110_FRAME_HEADER, 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x10,
1027 0x02, 0x00, /* memory type */ 1032 0x02, 0x00, /* memory type */
1028 0x00, 0x00, /* location */ 1033 0x00, 0x00, /* location */
1029 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
1030 1035
1031 if (entry->Location == 0) return ERR_NOTSUPPORTED; 1036 if (entry->Location == 0) return ERR_NOTSUPPORTED;
1032 1037
1033 req[11] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES); 1038 req[11] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
1034 if (req[11]==0xff) return ERR_NOTSUPPORTED; 1039 if (req[11]==0xff) return ERR_NOTSUPPORTED;
1035 1040
1036 req[12] = entry->Location / 256; 1041 req[12] = entry->Location / 256;
1037 req[13] = entry->Location % 256; 1042 req[13] = entry->Location % 256;
1038 1043
1039 count = count + N71_65_EncodePhonebookFrame(s, req+22, *entry, &blocks, true, IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_VOICETAGS)); 1044 count = count + N71_65_EncodePhonebookFrame(s, req+22, *entry, &blocks, true, IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_VOICETAGS));
1040 req[21] = blocks; 1045 req[21] = blocks;
@@ -1720,97 +1725,98 @@ static GSM_Error N6510_ReplyGetSyncMLSettings(GSM_Protocol_Message msg, GSM_Stat
1720 smprintf(s, "SyncML settings received OK\n"); 1725 smprintf(s, "SyncML settings received OK\n");
1721 CopyUnicodeString(Sett->User,msg.Buffer+18); 1726 CopyUnicodeString(Sett->User,msg.Buffer+18);
1722 CopyUnicodeString(Sett->Password,msg.Buffer+86); 1727 CopyUnicodeString(Sett->Password,msg.Buffer+86);
1723 CopyUnicodeString(Sett->PhonebookDataBase,msg.Buffer+130); 1728 CopyUnicodeString(Sett->PhonebookDataBase,msg.Buffer+130);
1724 CopyUnicodeString(Sett->CalendarDataBase,msg.Buffer+234); 1729 CopyUnicodeString(Sett->CalendarDataBase,msg.Buffer+234);
1725 CopyUnicodeString(Sett->Server,msg.Buffer+338); 1730 CopyUnicodeString(Sett->Server,msg.Buffer+338);
1726 1731
1727 Sett->SyncPhonebook = false; 1732 Sett->SyncPhonebook = false;
1728 Sett->SyncCalendar = false; 1733 Sett->SyncCalendar = false;
1729 if ((msg.Buffer[598] & 0x02)==0x02) Sett->SyncCalendar = true; 1734 if ((msg.Buffer[598] & 0x02)==0x02) Sett->SyncCalendar = true;
1730 if ((msg.Buffer[598] & 0x01)==0x01) Sett->SyncPhonebook = true; 1735 if ((msg.Buffer[598] & 0x01)==0x01) Sett->SyncPhonebook = true;
1731 1736
1732 return ERR_NONE; 1737 return ERR_NONE;
1733} 1738}
1734 1739
1735static GSM_Error N6510_ReplyGetSyncMLName(GSM_Protocol_Message msg, GSM_StateMachine *s) 1740static GSM_Error N6510_ReplyGetSyncMLName(GSM_Protocol_Message msg, GSM_StateMachine *s)
1736{ 1741{
1737 GSM_SyncMLSettings *Sett = s->Phone.Data.SyncMLSettings; 1742 GSM_SyncMLSettings *Sett = s->Phone.Data.SyncMLSettings;
1738 1743
1739 smprintf(s, "SyncML names received OK\n"); 1744 smprintf(s, "SyncML names received OK\n");
1740 1745
1741 CopyUnicodeString(Sett->Name,msg.Buffer+18); 1746 CopyUnicodeString(Sett->Name,msg.Buffer+18);
1742 1747
1743 return ERR_NONE; 1748 return ERR_NONE;
1744} 1749}
1745 1750
1746static GSM_Error N6510_GetSyncMLSettings(GSM_StateMachine *s, GSM_SyncMLSettings *settings) 1751static GSM_Error N6510_GetSyncMLSettings(GSM_StateMachine *s, GSM_SyncMLSettings *settings)
1747{ 1752{
1748 GSM_Error error; 1753 GSM_Error error;
1749 // unsigned char NameReq[] = {N6110_FRAME_HEADER, 0x05, 1754 // unsigned char NameReq[] = {N6110_FRAME_HEADER, 0x05,
1750 // 0x00, 0x00, 0x00, 0x31, 0x00, 1755 // 0x00, 0x00, 0x00, 0x31, 0x00,
1751 // 0x06, 0x00, 0x00, 0x00, 0xDE, 0x00, 0x00}; 1756 // 0x06, 0x00, 0x00, 0x00, 0xDE, 0x00, 0x00};
1752 // unsigned char GetActive[] = {N6110_FRAME_HEADER, 0x05, 1757 // unsigned char GetActive[] = {N6110_FRAME_HEADER, 0x05,
1753 // 0x00, 0x00, 0x00, 0x31, 0x00, 1758 // 0x00, 0x00, 0x00, 0x31, 0x00,
1754 // 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}; 1759 // 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
1755 unsigned char req[] = {N6110_FRAME_HEADER, 0x05, 1760 unsigned char req[] = {N6110_FRAME_HEADER, 0x05,
1756 0x00, 0x00, 0x00, 0x31, 0x00, 1761 0x00, 0x00, 0x00, 0x31, 0x00,
1757 0x01, //location 1762 0x01, //location
1758 0x00, 0x00, 0x02, 0x46, 0x00, 0x00}; 1763 0x00, 0x00, 0x02, 0x46, 0x00, 0x00};
1759 1764
1760 settings->Connection.Location = settings->Location; 1765 settings->Connection.Location = settings->Location;
1761 error = N6510_GetConnectionSettings(s, &settings->Connection, N6510_SYNCML_SETTINGS); 1766 error = N6510_GetConnectionSettings(s, &settings->Connection, N6510_SYNCML_SETTINGS);
1762 if (error != ERR_NONE) return error; 1767 if (error != ERR_NONE) return error;
1763 1768
1764 settings->Active = settings->Connection.Active; 1769 settings->Active = settings->Connection.Active;
1765 1770
1766 settings->Name[0] = 0; 1771 settings->Name[0] = 0;
1767 settings->Name[1] = 0; 1772 settings->Name[1] = 0;
1768 //s->Phone.Data.SyncMLSettings = settings; 1773 s->Phone.Data.SyncMLSettings = settings;
1774
1769 //smprintf(s, "Getting SyncML settings name\n"); 1775 //smprintf(s, "Getting SyncML settings name\n");
1770 //error = GSM_WaitFor (s, NameReq, 16, 0x43, 4, ID_GetSyncMLName); 1776 //error = GSM_WaitFor (s, NameReq, 16, 0x43, 4, ID_GetSyncMLName);
1771 //if (error != ERR_NONE) return error; 1777 //if (error != ERR_NONE) return error;
1772 1778
1773 req[9] = settings->Location - 1; 1779 req[9] = settings->Location - 1;
1774 smprintf(s, "Getting additional SyncML settings\n"); 1780 smprintf(s, "Getting additional SyncML settings\n");
1775 return GSM_WaitFor (s, req, 16, 0x43, 4, ID_GetSyncMLSettings); 1781 return GSM_WaitFor (s, req, 16, 0x43, 4, ID_GetSyncMLSettings);
1776} 1782}
1777 1783
1778static GSM_Error N6510_ReplyGetChatSettings(GSM_Protocol_Message msg, GSM_StateMachine *s) 1784static GSM_Error N6510_ReplyGetChatSettings(GSM_Protocol_Message msg, GSM_StateMachine *s)
1779{ 1785{
1780 GSM_ChatSettings *Sett = s->Phone.Data.ChatSettings; 1786 GSM_ChatSettings *Sett = s->Phone.Data.ChatSettings;
1781 int i; 1787 int i;
1782 1788
1783 Sett->Name[0] = 0; 1789 Sett->Name[0] = 0;
1784 Sett->Name[1] = 0; 1790 Sett->Name[1] = 0;
1785 Sett->HomePage[0] = 0; 1791 Sett->HomePage[0] = 0;
1786 Sett->HomePage[1] = 0; 1792 Sett->HomePage[1] = 0;
1787 Sett->User[0] = 0; 1793 Sett->User[0] = 0;
1788 Sett->User[1] = 0; 1794 Sett->User[1] = 0;
1789 Sett->Password[0] = 0; 1795 Sett->Password[0] = 0;
1790 Sett->Password[1] = 0; 1796 Sett->Password[1] = 0;
1791 1797
1792 switch(msg.Buffer[3]) { 1798 switch(msg.Buffer[3]) {
1793 case 0x3B: 1799 case 0x3B:
1794 smprintf(s, "Chat settings received OK\n"); 1800 smprintf(s, "Chat settings received OK\n");
1795 memcpy(Sett->Name,msg.Buffer+20,msg.Buffer[12]*2); 1801 memcpy(Sett->Name,msg.Buffer+20,msg.Buffer[12]*2);
1796 Sett->Name[msg.Buffer[12]*2] = 0; 1802 Sett->Name[msg.Buffer[12]*2] = 0;
1797 Sett->Name[msg.Buffer[12]*2+1] = 0; 1803 Sett->Name[msg.Buffer[12]*2+1] = 0;
1798 memcpy(Sett->HomePage,msg.Buffer+20+msg.Buffer[12]*2,msg.Buffer[15]*2); 1804 memcpy(Sett->HomePage,msg.Buffer+20+msg.Buffer[12]*2,msg.Buffer[15]*2);
1799 Sett->HomePage[msg.Buffer[15]*2] = 0; 1805 Sett->HomePage[msg.Buffer[15]*2] = 0;
1800 Sett->HomePage[msg.Buffer[15]*2+1] = 0; 1806 Sett->HomePage[msg.Buffer[15]*2+1] = 0;
1801 i = msg.Buffer[12]*2 + msg.Buffer[15]*2 + 29; 1807 i = msg.Buffer[12]*2 + msg.Buffer[15]*2 + 29;
1802 memcpy(Sett->User,msg.Buffer+i+3,msg.Buffer[i]*2); 1808 memcpy(Sett->User,msg.Buffer+i+3,msg.Buffer[i]*2);
1803 Sett->User[msg.Buffer[i]*2] = 0; 1809 Sett->User[msg.Buffer[i]*2] = 0;
1804 Sett->User[msg.Buffer[i]*2+1] = 0; 1810 Sett->User[msg.Buffer[i]*2+1] = 0;
1805 memcpy(Sett->Password,msg.Buffer+i+3+msg.Buffer[i]*2,msg.Buffer[i+1]*2); 1811 memcpy(Sett->Password,msg.Buffer+i+3+msg.Buffer[i]*2,msg.Buffer[i+1]*2);
1806 Sett->Password[msg.Buffer[i+1]*2] = 0; 1812 Sett->Password[msg.Buffer[i+1]*2] = 0;
1807 Sett->Password[msg.Buffer[i+1]*2+1] = 0; 1813 Sett->Password[msg.Buffer[i+1]*2+1] = 0;
1808 return ERR_NONE; 1814 return ERR_NONE;
1809 case 0x3C: 1815 case 0x3C:
1810 smprintf(s, "Empty chat settings received\n"); 1816 smprintf(s, "Empty chat settings received\n");
1811 return ERR_NONE; 1817 return ERR_NONE;
1812 } 1818 }
1813 return ERR_UNKNOWNRESPONSE; 1819 return ERR_UNKNOWNRESPONSE;
1814} 1820}
1815 1821
1816static GSM_Error N6510_GetChatSettings(GSM_StateMachine *s, GSM_ChatSettings *settings) 1822static GSM_Error N6510_GetChatSettings(GSM_StateMachine *s, GSM_ChatSettings *settings)
@@ -2238,97 +2244,97 @@ static GSM_Error N6510_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *st
2238 2244
2239static GSM_Error N6510_ReplyDeleteSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s) 2245static GSM_Error N6510_ReplyDeleteSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s)
2240{ 2246{
2241 switch (msg.Buffer[3]) { 2247 switch (msg.Buffer[3]) {
2242 case 0x05: 2248 case 0x05:
2243 smprintf(s, "SMS deleted OK\n"); 2249 smprintf(s, "SMS deleted OK\n");
2244 return ERR_NONE; 2250 return ERR_NONE;
2245 case 0x06: 2251 case 0x06:
2246 switch (msg.Buffer[4]) { 2252 switch (msg.Buffer[4]) {
2247 case 0x02: 2253 case 0x02:
2248 smprintf(s, "Invalid location\n"); 2254 smprintf(s, "Invalid location\n");
2249 return ERR_INVALIDLOCATION; 2255 return ERR_INVALIDLOCATION;
2250 default: 2256 default:
2251 smprintf(s, "Unknown error: %02x\n",msg.Buffer[4]); 2257 smprintf(s, "Unknown error: %02x\n",msg.Buffer[4]);
2252 return ERR_UNKNOWNRESPONSE; 2258 return ERR_UNKNOWNRESPONSE;
2253 } 2259 }
2254 } 2260 }
2255 return ERR_UNKNOWNRESPONSE; 2261 return ERR_UNKNOWNRESPONSE;
2256} 2262}
2257 2263
2258static GSM_Error N6510_DeleteSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms) 2264static GSM_Error N6510_DeleteSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
2259{ 2265{
2260 unsigned char folderid; 2266 unsigned char folderid;
2261 int location; 2267 int location;
2262 unsigned char req[] = {N6110_FRAME_HEADER, 0x04, 2268 unsigned char req[] = {N6110_FRAME_HEADER, 0x04,
2263 0x01, /* 0x01=SM, 0x02=ME */ 2269 0x01, /* 0x01=SM, 0x02=ME */
2264 0x00, /* FolderID */ 2270 0x00, /* FolderID */
2265 0x00, 0x02, /* Location */ 2271 0x00, 0x02, /* Location */
2266 0x0F, 0x55}; 2272 0x0F, 0x55};
2267 2273
2268 N6510_GetSMSLocation(s, sms, &folderid, &location); 2274 N6510_GetSMSLocation(s, sms, &folderid, &location);
2269 2275
2270 switch (folderid) { 2276 switch (folderid) {
2271 case 0x01: req[5] = 0x02; break; /* INBOX SIM */ 2277 case 0x01: req[5] = 0x02; break; /* INBOX SIM */
2272 case 0x02: req[5] = 0x03; break; /* OUTBOX SIM */ 2278 case 0x02: req[5] = 0x03; break; /* OUTBOX SIM */
2273 default : req[5] = folderid - 1; req[4] = 0x02; break; /* ME folders*/ 2279 default : req[5] = folderid - 1; req[4] = 0x02; break; /* ME folders*/
2274 } 2280 }
2275 req[6]=location / 256; 2281 req[6]=location / 256;
2276 req[7]=location; 2282 req[7]=location;
2277 2283
2278 smprintf(s, "Deleting sms\n"); 2284 smprintf(s, "Deleting sms\n");
2279 return GSM_WaitFor (s, req, 10, 0x14, 4, ID_DeleteSMSMessage); 2285 return GSM_WaitFor (s, req, 10, 0x14, 4, ID_DeleteSMSMessage);
2280} 2286}
2281 2287
2282static GSM_Error N6510_ReplySendSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s) 2288static GSM_Error N6510_ReplySendSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s)
2283{ 2289{
2284 switch (msg.Buffer[8]) { 2290 switch (msg.Buffer[8]) {
2285 case 0x00: 2291 case 0x00:
2286 smprintf(s, "SMS sent OK, TPMR for sent sms is %02x\n",msg.Buffer[10]); 2292 smprintf(s, "SMS sent OK, TPMR for sent sms is %d\n",msg.Buffer[10]);
2287 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,0,msg.Buffer[10]); 2293 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,0,msg.Buffer[10]);
2288 return ERR_NONE; 2294 return ERR_NONE;
2289 default: 2295 default:
2290 smprintf(s, "SMS not sent OK, error code probably %i\n",msg.Buffer[8]); 2296 smprintf(s, "SMS not sent OK, error code probably %i\n",msg.Buffer[8]);
2291 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,msg.Buffer[8],msg.Buffer[10]); 2297 if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,msg.Buffer[8],msg.Buffer[10]);
2292 return ERR_NONE; 2298 return ERR_NONE;
2293 } 2299 }
2294} 2300}
2295 2301
2296static GSM_Error N6510_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms) 2302static GSM_Error N6510_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
2297{ 2303{
2298 int length = 11; 2304 int length = 11;
2299 GSM_Error error; 2305 GSM_Error error;
2300 GSM_SMSMessageLayout Layout; 2306 GSM_SMSMessageLayout Layout;
2301 unsigned char req [300] = { 2307 unsigned char req [300] = {
2302 N6110_FRAME_HEADER, 0x02, 0x00, 0x00, 0x00, 0x55, 0x55}; 2308 N6110_FRAME_HEADER, 0x02, 0x00, 0x00, 0x00, 0x55, 0x55};
2303 2309
2304 if (sms->PDU == SMS_Deliver) sms->PDU = SMS_Submit; 2310 if (sms->PDU == SMS_Deliver) sms->PDU = SMS_Submit;
2305 memset(req+9,0x00,sizeof(req) - 9); 2311 memset(req+9,0x00,sizeof(req) - 9);
2306 error=N6510_EncodeSMSFrame(s, sms, req + 9, &Layout, &length); 2312 error=N6510_EncodeSMSFrame(s, sms, req + 9, &Layout, &length);
2307 if (error != ERR_NONE) return error; 2313 if (error != ERR_NONE) return error;
2308 2314
2309 smprintf(s, "Sending sms\n"); 2315 smprintf(s, "Sending sms\n");
2310 return s->Protocol.Functions->WriteMessage(s, req, length + 9, 0x02); 2316 return s->Protocol.Functions->WriteMessage(s, req, length + 9, 0x02);
2311} 2317}
2312 2318
2313static GSM_Error N6510_ReplyGetSecurityStatus(GSM_Protocol_Message msg, GSM_StateMachine *s) 2319static GSM_Error N6510_ReplyGetSecurityStatus(GSM_Protocol_Message msg, GSM_StateMachine *s)
2314{ 2320{
2315 GSM_Phone_Data *Data = &s->Phone.Data; 2321 GSM_Phone_Data *Data = &s->Phone.Data;
2316 2322
2317 smprintf(s, "Security Code status received: "); 2323 smprintf(s, "Security Code status received: ");
2318 switch (msg.Buffer[4]) { 2324 switch (msg.Buffer[4]) {
2319 case 0x01 : smprintf(s, "waiting for Security Code.\n"); *Data->SecurityStatus = SEC_SecurityCode;break; 2325 case 0x01 : smprintf(s, "waiting for Security Code.\n"); *Data->SecurityStatus = SEC_SecurityCode;break;
2320 case 0x07 : 2326 case 0x07 :
2321 case 0x02 : smprintf(s, "waiting for PIN.\n"); *Data->SecurityStatus = SEC_Pin; break; 2327 case 0x02 : smprintf(s, "waiting for PIN.\n"); *Data->SecurityStatus = SEC_Pin; break;
2322 case 0x03 : smprintf(s, "waiting for PUK.\n"); *Data->SecurityStatus = SEC_Puk; break; 2328 case 0x03 : smprintf(s, "waiting for PUK.\n"); *Data->SecurityStatus = SEC_Puk; break;
2323 case 0x05 : smprintf(s, "PIN ok, SIM ok\n"); *Data->SecurityStatus = SEC_None; break; 2329 case 0x05 : smprintf(s, "PIN ok, SIM ok\n"); *Data->SecurityStatus = SEC_None; break;
2324 case 0x06 : smprintf(s, "No input status\n"); *Data->SecurityStatus = SEC_None; break; 2330 case 0x06 : smprintf(s, "No input status\n"); *Data->SecurityStatus = SEC_None; break;
2325 case 0x16 : smprintf(s, "No SIM card\n"); *Data->SecurityStatus = SEC_None; break; 2331 case 0x16 : smprintf(s, "No SIM card\n"); *Data->SecurityStatus = SEC_None; break;
2326 case 0x1A : smprintf(s, "SIM card rejected!\n"); *Data->SecurityStatus = SEC_None; break; 2332 case 0x1A : smprintf(s, "SIM card rejected!\n"); *Data->SecurityStatus = SEC_None; break;
2327 default : smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]); 2333 default : smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]);
2328 return ERR_UNKNOWNRESPONSE; 2334 return ERR_UNKNOWNRESPONSE;
2329 } 2335 }
2330 return ERR_NONE; 2336 return ERR_NONE;
2331} 2337}
2332 2338
2333static GSM_Error N6510_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status) 2339static GSM_Error N6510_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
2334{ 2340{
@@ -2725,96 +2731,97 @@ static GSM_Error N6510_ReplyGetRingtone(GSM_Protocol_Message msg, GSM_StateMachi
2725 msg.Buffer[msg.Buffer[7]*2+12] == 'h' && 2731 msg.Buffer[msg.Buffer[7]*2+12] == 'h' &&
2726 msg.Buffer[msg.Buffer[7]*2+13] == 'd') { 2732 msg.Buffer[msg.Buffer[7]*2+13] == 'd') {
2727 smprintf(s,"MIDI\n"); 2733 smprintf(s,"MIDI\n");
2728 tmp = msg.Buffer[7]*2+10; 2734 tmp = msg.Buffer[7]*2+10;
2729 i = msg.Length - 2; /* ?????? */ 2735 i = msg.Length - 2; /* ?????? */
2730 Data->Ringtone->Format = RING_MIDI; 2736 Data->Ringtone->Format = RING_MIDI;
2731 } else { 2737 } else {
2732 /* Looking for end */ 2738 /* Looking for end */
2733 i=8+msg.Buffer[7]*2+3; 2739 i=8+msg.Buffer[7]*2+3;
2734 tmp = i; 2740 tmp = i;
2735 while (true) { 2741 while (true) {
2736 if (msg.Buffer[i]==0x07 && msg.Buffer[i+1]==0x0b) { 2742 if (msg.Buffer[i]==0x07 && msg.Buffer[i+1]==0x0b) {
2737 i=i+2; break; 2743 i=i+2; break;
2738 } 2744 }
2739 i++; 2745 i++;
2740 if (i==msg.Length) return ERR_EMPTY; 2746 if (i==msg.Length) return ERR_EMPTY;
2741 } 2747 }
2742 } 2748 }
2743 /* Copying frame */ 2749 /* Copying frame */
2744 memcpy(Data->Ringtone->NokiaBinary.Frame,msg.Buffer+tmp,i-tmp); 2750 memcpy(Data->Ringtone->NokiaBinary.Frame,msg.Buffer+tmp,i-tmp);
2745 Data->Ringtone->NokiaBinary.Length=i-tmp; 2751 Data->Ringtone->NokiaBinary.Length=i-tmp;
2746 return ERR_NONE; 2752 return ERR_NONE;
2747} 2753}
2748 2754
2749static GSM_Error N6510_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone) 2755static GSM_Error N6510_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, bool PhoneRingtone)
2750{ 2756{
2751 GSM_AllRingtonesInfo Info; 2757 GSM_AllRingtonesInfo Info;
2752 GSM_Error error; 2758 GSM_Error error;
2753 unsigned char req2[6] = {N7110_FRAME_HEADER, 0x12, 2759 unsigned char req2[6] = {N7110_FRAME_HEADER, 0x12,
2754 0x00, 0xe7}; /* Location */ 2760 0x00, 0xe7}; /* Location */
2755 2761
2756 if (Ringtone->Format == 0x00) Ringtone->Format = RING_NOKIABINARY; 2762 if (Ringtone->Format == 0x00) Ringtone->Format = RING_NOKIABINARY;
2757 2763
2758 switch (Ringtone->Format) { 2764 switch (Ringtone->Format) {
2759 case RING_NOTETONE: 2765 case RING_NOTETONE:
2760 /* In the future get binary and convert */ 2766 /* In the future get binary and convert */
2761 return ERR_NOTSUPPORTED; 2767 return ERR_NOTSUPPORTED;
2762 case RING_NOKIABINARY: 2768 case RING_NOKIABINARY:
2763 s->Phone.Data.Ringtone= Ringtone; 2769 s->Phone.Data.Ringtone= Ringtone;
2764 Info.Number = 0; 2770 Info.Number = 0;
2765 error=N6510_PrivGetRingtonesInfo(s, &Info, PhoneRingtone); 2771 error=N6510_PrivGetRingtonesInfo(s, &Info, PhoneRingtone);
2766 if (error != ERR_NONE) return error; 2772 if (error != ERR_NONE) return error;
2767 if (Ringtone->Location > Info.Number) return ERR_INVALIDLOCATION; 2773 if (Ringtone->Location > Info.Number) return ERR_INVALIDLOCATION;
2768 req2[4] = Info.Ringtone[Ringtone->Location-1].ID / 256; 2774 req2[4] = Info.Ringtone[Ringtone->Location-1].ID / 256;
2769 req2[5] = Info.Ringtone[Ringtone->Location-1].ID % 256; 2775 req2[5] = Info.Ringtone[Ringtone->Location-1].ID % 256;
2770 smprintf(s, "Getting binary ringtone\n"); 2776 smprintf(s, "Getting binary ringtone\n");
2771 return GSM_WaitFor (s, req2, 6, 0x1f, 4, ID_GetRingtone); 2777 return GSM_WaitFor (s, req2, 6, 0x1f, 4, ID_GetRingtone);
2772 case RING_MIDI: 2778 case RING_MIDI:
2779 case RING_MMF:
2773 return ERR_NOTSUPPORTED; 2780 return ERR_NOTSUPPORTED;
2774 } 2781 }
2775 return ERR_NOTSUPPORTED; 2782 return ERR_NOTSUPPORTED;
2776} 2783}
2777 2784
2778static GSM_Error N6510_PlayTone(GSM_StateMachine *s, int Herz, unsigned char Volume, bool start) 2785static GSM_Error N6510_PlayTone(GSM_StateMachine *s, int Herz, unsigned char Volume, bool start)
2779{ 2786{
2780 GSM_Error error; 2787 GSM_Error error;
2781 unsigned char reqStart[] = { 2788 unsigned char reqStart[] = {
2782 0x00,0x06,0x01,0x00,0x07,0x00 }; 2789 0x00,0x06,0x01,0x00,0x07,0x00 };
2783 unsigned char reqPlay[] = { 2790 unsigned char reqPlay[] = {
2784 0x00,0x06,0x01,0x14,0x05,0x04, 2791 0x00,0x06,0x01,0x14,0x05,0x04,
2785 0x00,0x00,0x00,0x03,0x03,0x08, 2792 0x00,0x00,0x00,0x03,0x03,0x08,
2786 0x00,0x00,0x00,0x01,0x00,0x00, 2793 0x00,0x00,0x00,0x01,0x00,0x00,
2787 0x03,0x08,0x01,0x00, 2794 0x03,0x08,0x01,0x00,
2788 0x07,0xd0,/*Frequency */ 2795 0x07,0xd0,/*Frequency */
2789 0x00,0x00,0x03,0x08,0x02,0x00,0x00, 2796 0x00,0x00,0x03,0x08,0x02,0x00,0x00,
2790 0x05, /*Volume */ 2797 0x05, /*Volume */
2791 0x00,0x00}; 2798 0x00,0x00};
2792 unsigned char reqOff[] = { 2799 unsigned char reqOff[] = {
2793 0x00,0x06,0x01,0x14,0x05,0x05, 2800 0x00,0x06,0x01,0x14,0x05,0x05,
2794 0x00,0x00,0x00,0x01,0x03,0x08, 2801 0x00,0x00,0x00,0x01,0x03,0x08,
2795 0x05,0x00,0x00,0x08,0x00,0x00}; 2802 0x05,0x00,0x00,0x08,0x00,0x00};
2796 // unsigned char reqOff2[] = { 2803 // unsigned char reqOff2[] = {
2797 // 0x00,0x06,0x01,0x14,0x05,0x04, 2804 // 0x00,0x06,0x01,0x14,0x05,0x04,
2798 // 0x00,0x00,0x00,0x01,0x03,0x08, 2805 // 0x00,0x00,0x00,0x01,0x03,0x08,
2799 // 0x00,0x00,0x00,0x00,0x00,0x00}; 2806 // 0x00,0x00,0x00,0x00,0x00,0x00};
2800 2807
2801 if (start) { 2808 if (start) {
2802 smprintf(s, "Enabling sound - part 1\n"); 2809 smprintf(s, "Enabling sound - part 1\n");
2803 error=GSM_WaitFor (s, reqStart, 6, 0x0b, 4, ID_PlayTone); 2810 error=GSM_WaitFor (s, reqStart, 6, 0x0b, 4, ID_PlayTone);
2804 if (error!=ERR_NONE) return error; 2811 if (error!=ERR_NONE) return error;
2805 smprintf(s, "Enabling sound - part 2 (disabling sound command)\n"); 2812 smprintf(s, "Enabling sound - part 2 (disabling sound command)\n");
2806 error=GSM_WaitFor (s, reqOff, 18, 0x0b, 4, ID_PlayTone); 2813 error=GSM_WaitFor (s, reqOff, 18, 0x0b, 4, ID_PlayTone);
2807 if (error!=ERR_NONE) return error; 2814 if (error!=ERR_NONE) return error;
2808 } 2815 }
2809 2816
2810 /* For Herz==255*255 we have silent */ 2817 /* For Herz==255*255 we have silent */
2811 if (Herz!=255*255) { 2818 if (Herz!=255*255) {
2812 reqPlay[23] = Herz%256; 2819 reqPlay[23] = Herz%256;
2813 reqPlay[22] = Herz/256; 2820 reqPlay[22] = Herz/256;
2814 reqPlay[31] = Volume; 2821 reqPlay[31] = Volume;
2815 smprintf(s, "Playing sound\n"); 2822 smprintf(s, "Playing sound\n");
2816 return GSM_WaitFor (s, reqPlay, 34, 0x0b, 4, ID_PlayTone); 2823 return GSM_WaitFor (s, reqPlay, 34, 0x0b, 4, ID_PlayTone);
2817 } else { 2824 } else {
2818 reqPlay[23] = 0; 2825 reqPlay[23] = 0;
2819 reqPlay[22] = 0; 2826 reqPlay[22] = 0;
2820 reqPlay[31] = 0; 2827 reqPlay[31] = 0;
@@ -2941,96 +2948,99 @@ static GSM_Error N6510_ReplyGetProfile(GSM_Protocol_Message msg, GSM_StateMachin
2941 case 0x05:/* SMS tone */ 2948 case 0x05:/* SMS tone */
2942 j = Data->Profile->FeaturesNumber; 2949 j = Data->Profile->FeaturesNumber;
2943 NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,false); 2950 NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,false);
2944 if (j == Data->Profile->FeaturesNumber) { 2951 if (j == Data->Profile->FeaturesNumber) {
2945 Data->Profile->FeatureID[Data->Profile->FeaturesNumber] = Profile_MessageTone; 2952 Data->Profile->FeatureID[Data->Profile->FeaturesNumber] = Profile_MessageTone;
2946 Data->Profile->FeatureValue[Data->Profile->FeaturesNumber] = PROFILE_MESSAGE_PERSONAL; 2953 Data->Profile->FeatureValue[Data->Profile->FeaturesNumber] = PROFILE_MESSAGE_PERSONAL;
2947 Data->Profile->FeaturesNumber++; 2954 Data->Profile->FeaturesNumber++;
2948 Data->Profile->FeatureID[Data->Profile->FeaturesNumber] = Profile_MessageToneID; 2955 Data->Profile->FeatureID[Data->Profile->FeaturesNumber] = Profile_MessageToneID;
2949 Data->Profile->FeatureValue[Data->Profile->FeaturesNumber] = blockstart[7]; 2956 Data->Profile->FeatureValue[Data->Profile->FeaturesNumber] = blockstart[7];
2950 Data->Profile->FeaturesNumber++; 2957 Data->Profile->FeaturesNumber++;
2951 } 2958 }
2952 break; 2959 break;
2953 case 0x08:/* Caller groups */ 2960 case 0x08:/* Caller groups */
2954 NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,true); 2961 NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,true);
2955 break; 2962 break;
2956 case 0x0c : 2963 case 0x0c :
2957 CopyUnicodeString(Data->Profile->Name,blockstart + 7); 2964 CopyUnicodeString(Data->Profile->Name,blockstart + 7);
2958 smprintf(s, "profile Name: \"%s\"\n", DecodeUnicodeString(Data->Profile->Name)); 2965 smprintf(s, "profile Name: \"%s\"\n", DecodeUnicodeString(Data->Profile->Name));
2959 Data->Profile->DefaultName = false; 2966 Data->Profile->DefaultName = false;
2960 break; 2967 break;
2961 default: 2968 default:
2962 NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,false); 2969 NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,false);
2963 } 2970 }
2964 blockstart = blockstart + blockstart[0]; 2971 blockstart = blockstart + blockstart[0];
2965 } 2972 }
2966 return ERR_NONE; 2973 return ERR_NONE;
2967 case 0x06: 2974 case 0x06:
2968 Data->Profile->Active = false; 2975 Data->Profile->Active = false;
2969 if (Data->Profile->Location == msg.Buffer[5]) Data->Profile->Active = true; 2976 if (Data->Profile->Location == msg.Buffer[5]) Data->Profile->Active = true;
2970 return ERR_NONE; 2977 return ERR_NONE;
2971 } 2978 }
2972 return ERR_UNKNOWNRESPONSE; 2979 return ERR_UNKNOWNRESPONSE;
2973} 2980}
2974 2981
2975static GSM_Error N6510_GetProfile(GSM_StateMachine *s, GSM_Profile *Profile) 2982static GSM_Error N6510_GetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
2976{ 2983{
2977 unsigned char req[150] = {N6110_FRAME_HEADER, 0x01, 0x01, 0x0C, 0x01}; 2984 unsigned char req[150] = {N6110_FRAME_HEADER, 0x01, 0x01, 0x0C, 0x01};
2978 unsigned charreqActive[] = {N6110_FRAME_HEADER, 0x05}; 2985 unsigned charreqActive[] = {N6110_FRAME_HEADER, 0x05};
2979 int i, length = 7; 2986 int i, length = 7;
2980 GSM_Errorerror; 2987 GSM_Errorerror;
2981 2988
2982 /* For now !!! */ 2989 /* For now !!! */
2983 if (!strcmp(s->Phone.Data.ModelInfo->model,"3510")) { 2990 if (!strcmp(s->Phone.Data.ModelInfo->model,"3510")) {
2984 if (s->Phone.Data.VerNum>3.37) return ERR_NOTSUPPORTED; 2991 if (s->Phone.Data.VerNum>3.37) return ERR_NOTSUPPORTED;
2985 } 2992 }
2986 if (!strcmp(s->Phone.Data.ModelInfo->model,"6230")) { 2993 if (!strcmp(s->Phone.Data.ModelInfo->model,"6230")) {
2987 return ERR_NOTSUPPORTED; 2994 return ERR_NOTSUPPORTED;
2988 } 2995 }
2996 if (!strcmp(s->Phone.Data.ModelInfo->model,"5140")) {
2997 return ERR_NOTSUPPORTED;
2998 }
2989 2999
2990 if (Profile->Location>5) return ERR_INVALIDLOCATION; 3000 if (Profile->Location>5) return ERR_INVALIDLOCATION;
2991 3001
2992 for (i = 0; i < 0x0a; i++) { 3002 for (i = 0; i < 0x0a; i++) {
2993 req[length++] = 0x04; 3003 req[length++] = 0x04;
2994 req[length++] = Profile->Location; 3004 req[length++] = Profile->Location;
2995 req[length++] = i; 3005 req[length++] = i;
2996 req[length++] = 0x01; 3006 req[length++] = 0x01;
2997 } 3007 }
2998 3008
2999 req[length++] = 0x04; 3009 req[length++] = 0x04;
3000 req[length++] = Profile->Location; 3010 req[length++] = Profile->Location;
3001 req[length++] = 0x0c; 3011 req[length++] = 0x0c;
3002 req[length++] = 0x01; 3012 req[length++] = 0x01;
3003 3013
3004 req[length++] = 0x04; 3014 req[length++] = 0x04;
3005 3015
3006 Profile->CarKitProfile= false; 3016 Profile->CarKitProfile= false;
3007 Profile->HeadSetProfile= false; 3017 Profile->HeadSetProfile= false;
3008 3018
3009 Profile->FeaturesNumber = 0; 3019 Profile->FeaturesNumber = 0;
3010 3020
3011 s->Phone.Data.Profile=Profile; 3021 s->Phone.Data.Profile=Profile;
3012 smprintf(s, "Getting profile\n"); 3022 smprintf(s, "Getting profile\n");
3013 error = GSM_WaitFor (s, req, length, 0x39, 4, ID_GetProfile); 3023 error = GSM_WaitFor (s, req, length, 0x39, 4, ID_GetProfile);
3014 if (error != ERR_NONE) return error; 3024 if (error != ERR_NONE) return error;
3015 3025
3016 smprintf(s, "Checking, which profile is active\n"); 3026 smprintf(s, "Checking, which profile is active\n");
3017 return GSM_WaitFor (s, reqActive, 4, 0x39, 4, ID_GetProfile); 3027 return GSM_WaitFor (s, reqActive, 4, 0x39, 4, ID_GetProfile);
3018} 3028}
3019 3029
3020static GSM_Error N6510_ReplySetProfile(GSM_Protocol_Message msg, GSM_StateMachine *s) 3030static GSM_Error N6510_ReplySetProfile(GSM_Protocol_Message msg, GSM_StateMachine *s)
3021{ 3031{
3022 unsigned char *blockstart; 3032 unsigned char *blockstart;
3023 int i; 3033 int i;
3024 3034
3025 smprintf(s, "Response to profile writing received!\n"); 3035 smprintf(s, "Response to profile writing received!\n");
3026 3036
3027 blockstart = msg.Buffer + 6; 3037 blockstart = msg.Buffer + 6;
3028 for (i = 0; i < msg.Buffer[5]; i++) { 3038 for (i = 0; i < msg.Buffer[5]; i++) {
3029 switch (blockstart[2]) { 3039 switch (blockstart[2]) {
3030 case 0x00: smprintf(s, "keypad tone level"); break; 3040 case 0x00: smprintf(s, "keypad tone level"); break;
3031 case 0x02: smprintf(s, "call alert"); break; 3041 case 0x02: smprintf(s, "call alert"); break;
3032 case 0x03: smprintf(s, "ringtone"); break; 3042 case 0x03: smprintf(s, "ringtone"); break;
3033 case 0x04: smprintf(s, "ringtone volume"); break; 3043 case 0x04: smprintf(s, "ringtone volume"); break;
3034 case 0x05: smprintf(s, "SMS tone"); break; 3044 case 0x05: smprintf(s, "SMS tone"); break;
3035 case 0x06: smprintf(s, "vibration"); break; 3045 case 0x06: smprintf(s, "vibration"); break;
3036 case 0x07: smprintf(s, "warning tone level"); break; 3046 case 0x07: smprintf(s, "warning tone level"); break;
@@ -3070,194 +3080,224 @@ static GSM_Error N6510_SetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
3070 Value = Profile->FeatureValue[i]; 3080 Value = Profile->FeatureValue[i];
3071 found = true; 3081 found = true;
3072 break; 3082 break;
3073 default: 3083 default:
3074 found=NOKIA_FindPhoneFeatureValue( 3084 found=NOKIA_FindPhoneFeatureValue(
3075 s, 3085 s,
3076 Profile71_65, 3086 Profile71_65,
3077 Profile->FeatureID[i],Profile->FeatureValue[i], 3087 Profile->FeatureID[i],Profile->FeatureValue[i],
3078 &ID,&Value); 3088 &ID,&Value);
3079 } 3089 }
3080 if (found) { 3090 if (found) {
3081 req[length] = 0x09; 3091 req[length] = 0x09;
3082 req[length + 1] = ID; 3092 req[length + 1] = ID;
3083 req[length + 2] = Profile->Location; 3093 req[length + 2] = Profile->Location;
3084 memcpy(req + length + 4, "\x00\x00\x01", 3); 3094 memcpy(req + length + 4, "\x00\x00\x01", 3);
3085 req[length + 8] = 0x03; 3095 req[length + 8] = 0x03;
3086 req[length + 3] = req[length + 7] = Value; 3096 req[length + 3] = req[length + 7] = Value;
3087 blocks++; 3097 blocks++;
3088 length += 9; 3098 length += 9;
3089 } 3099 }
3090 } 3100 }
3091 3101
3092 smprintf(s, "Setting profile\n"); 3102 smprintf(s, "Setting profile\n");
3093 return GSM_WaitFor (s, req, length, 0x39, 4, ID_SetProfile); 3103 return GSM_WaitFor (s, req, length, 0x39, 4, ID_SetProfile);
3094} 3104}
3095 3105
3096static GSM_Error N6510_ReplyIncomingSMS(GSM_Protocol_Message msg, GSM_StateMachine *s) 3106static GSM_Error N6510_ReplyIncomingSMS(GSM_Protocol_Message msg, GSM_StateMachine *s)
3097{ 3107{
3098 GSM_SMSMessage sms; 3108 GSM_SMSMessage sms;
3099 3109
3100#ifdef DEBUG 3110#ifdef DEBUG
3101 smprintf(s, "SMS message received\n"); 3111 smprintf(s, "SMS message received\n");
3102 N6510_DecodeSMSFrame(s, &sms, msg.Buffer+10); 3112 N6510_DecodeSMSFrame(s, &sms, msg.Buffer+10);
3103#endif 3113#endif
3104 3114
3105 if (s->Phone.Data.EnableIncomingSMS && s->User.IncomingSMS!=NULL) { 3115 if (s->Phone.Data.EnableIncomingSMS && s->User.IncomingSMS!=NULL) {
3106 sms.State = SMS_UnRead; 3116 sms.State = SMS_UnRead;
3107 sms.InboxFolder = true; 3117 sms.InboxFolder = true;
3108 3118
3109 N6510_DecodeSMSFrame(s, &sms, msg.Buffer+10); 3119 N6510_DecodeSMSFrame(s, &sms, msg.Buffer+10);
3110 3120
3111 s->User.IncomingSMS(s->CurrentConfig->Device,sms); 3121 s->User.IncomingSMS(s->CurrentConfig->Device,sms);
3112 } 3122 }
3113 return ERR_NONE; 3123 return ERR_NONE;
3114} 3124}
3115 3125
3116static GSM_Error N6510_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber) 3126static GSM_Error N6510_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
3117{ 3127{
3128 unsigned int pos2 = 15;
3118 unsigned intpos = 4; 3129 unsigned intpos = 4;
3130 unsigned char req2[100] = {N6110_FRAME_HEADER,0x01,
3131 0x00,0x02,0x07,0x04,
3132 0x01, // 1 - voice, 2 - data
3133 0x00,0x03,
3134 0x18, // length of rest + 1
3135 0x00,0x00,0x00};
3119 unsigned char req[100] = {N6110_FRAME_HEADER,0x01, 3136 unsigned char req[100] = {N6110_FRAME_HEADER,0x01,
3120 0x0c};/* Number length */ 3137 0x0c};/* Number length */
3138 GSM_Errorerror;
3139
3140 /* USSD not supported */
3141 if (number[0] == '*') return ERR_NOTSUPPORTED;
3142 if (number[0] == '#') return ERR_NOTSUPPORTED;
3121 3143
3122 req[pos++] = strlen(number); 3144 req[pos++] = strlen(number);
3123 EncodeUnicode(req+pos,number,strlen(number)); 3145 EncodeUnicode(req+pos,number,strlen(number));
3124 pos += strlen(number)*2; 3146 pos += strlen(number)*2;
3125 req[pos++] = 0x05; /* call type: voice - 0x05, data - 0x01 */ 3147 req[pos++] = 0x05; /* call type: voice - 0x05, data - 0x01 */
3126 req[pos++] = 0x01; 3148 req[pos++] = 0x01;
3127 req[pos++] = 0x05; 3149 req[pos++] = 0x05;
3128 req[pos++] = 0x00; 3150 req[pos++] = 0x00;
3129 req[pos++] = 0x02; 3151 req[pos++] = 0x02;
3130 req[pos++] = 0x00; 3152 req[pos++] = 0x00;
3131 req[pos++] = 0x00; 3153 req[pos++] = 0x00;
3132 switch (ShowNumber) { 3154 switch (ShowNumber) {
3133 case GSM_CALL_HideNumber: 3155 case GSM_CALL_HideNumber:
3134 req[pos++] = 0x02; 3156 req[pos++] = 0x02;
3135 break; 3157 break;
3136 case GSM_CALL_ShowNumber: 3158 case GSM_CALL_ShowNumber:
3137 req[pos++] = 0x03; 3159 req[pos++] = 0x03;
3138 break; 3160 break;
3139 case GSM_CALL_DefaultNumberPresence: 3161 case GSM_CALL_DefaultNumberPresence:
3140 req[pos++] = 0x01; 3162 req[pos++] = 0x01;
3141 break; 3163 break;
3142 } 3164 }
3165 smprintf(s, "Making voice call\n");
3166 error = GSM_WaitFor (s, req, pos, 0x01, 4, ID_DialVoice);
3167 if (error != ERR_NOTSUPPORTED) return error;
3168
3169 if (ShowNumber != GSM_CALL_DefaultNumberPresence) return ERR_NOTSUPPORTED;
3170
3171 req2[11] = strlen(number)*2+6;
3172 req2[pos2++] = strlen(number);
3173 EncodeUnicode(req2+pos2,number,strlen(number));
3174 pos2 += strlen(number)*2;
3143 3175
3144 smprintf(s, "Making voice call\n"); 3176 smprintf(s, "Making voice call\n");
3145 return GSM_WaitFor (s, req, pos, 0x01, 4, ID_DialVoice); 3177 error = GSM_WaitFor (s, req2, pos2, 0x01, 4, ID_DialVoice);
3178 if (error == ERR_NOTSUPPORTED) return ERR_NONE;
3179 return error;
3146} 3180}
3147 3181
3148/* method 3 */ 3182/* method 3 */
3149static GSM_Error N6510_ReplyGetCalendarInfo3(GSM_Protocol_Message msg, GSM_StateMachine *s, GSM_NOKIACalToDoLocations *Last) 3183static GSM_Error N6510_ReplyGetCalendarInfo3(GSM_Protocol_Message msg, GSM_StateMachine *s, GSM_NOKIACalToDoLocations *Last)
3150{ 3184{
3151 int i=0,j=0; 3185 int i=0,j=0;
3152 3186
3153 while (Last->Location[j] != 0x00) j++; 3187 while (Last->Location[j] != 0x00) j++;
3154 if (j >= GSM_MAXCALENDARTODONOTES) { 3188 if (j >= GSM_MAXCALENDARTODONOTES) {
3155 smprintf(s, "Increase GSM_MAXCALENDARTODONOTES\n"); 3189 smprintf(s, "Increase GSM_MAXCALENDARTODONOTES\n");
3156 return ERR_UNKNOWN; 3190 return ERR_UNKNOWN;
3157 } 3191 }
3158 if (j == 0) { 3192 if (j == 0) {
3159 Last->Number=msg.Buffer[8]*256+msg.Buffer[9]; 3193 Last->Number=msg.Buffer[8]*256+msg.Buffer[9];
3160 smprintf(s, "Number of Entries: %i\n",Last->Number); 3194 smprintf(s, "Number of Entries: %i\n",Last->Number);
3161 } 3195 }
3162 smprintf(s, "Locations: "); 3196 smprintf(s, "Locations: ");
3163 while (14+(i*4) <= msg.Length) { 3197 while (14+(i*4) <= msg.Length) {
3164 Last->Location[j++]=msg.Buffer[12+i*4]*256+msg.Buffer[13+i*4]; 3198 Last->Location[j++]=msg.Buffer[12+i*4]*256+msg.Buffer[13+i*4];
3165 smprintf(s, "%i ",Last->Location[j-1]); 3199 smprintf(s, "%i ",Last->Location[j-1]);
3166 i++; 3200 i++;
3167 } 3201 }
3168 smprintf(s, "\nNumber of Entries in frame: %i\n",i); 3202 smprintf(s, "\nNumber of Entries in frame: %i\n",i);
3169 Last->Location[j] = 0; 3203 Last->Location[j] = 0;
3170 smprintf(s, "\n"); 3204 smprintf(s, "\n");
3171 if (i == 1 && msg.Buffer[12+0*4]*256+msg.Buffer[13+0*4] == 0) return ERR_EMPTY; 3205 if (i == 1 && msg.Buffer[12+0*4]*256+msg.Buffer[13+0*4] == 0) return ERR_EMPTY;
3172 if (i == 0) return ERR_EMPTY; 3206 if (i == 0) return ERR_EMPTY;
3173 return ERR_NONE; 3207 return ERR_NONE;
3174} 3208}
3175 3209
3176/* method 3 */ 3210/* method 3 */
3177static GSM_Error N6510_GetCalendarInfo3(GSM_StateMachine *s, GSM_NOKIACalToDoLocations *Last, bool Calendar) 3211static GSM_Error N6510_GetCalendarInfo3(GSM_StateMachine *s, GSM_NOKIACalToDoLocations *Last, char Type)
3178{ 3212{
3179 GSM_Error error; 3213 GSM_Error error = ERR_UNKNOWN;
3180 int i; 3214 int i;
3181 unsigned char req[] = {N6110_FRAME_HEADER, 0x9E, 0xFF, 0xFF, 0x00, 0x00, 3215 unsigned char req[] = {N6110_FRAME_HEADER, 0x9E, 0xFF, 0xFF, 0x00, 0x00,
3182 0x00, 0x00,/* First location */ 3216 0x00, 0x00,/* First location */
3183 0x00}; /* 0 = calendar, 1 = ToDo in 6610 style */ 3217 0x00}; /* 0 = calendar, 1 = ToDo in 6610 style, 2 = Notes */
3184 3218
3185 Last->Location[0] = 0x00; 3219 Last->Location[0] = 0x00;
3186 Last->Number = 0; 3220 Last->Number = 0;
3187 3221
3188 if (Calendar) { 3222 req[10] = Type;
3223 if (Type == 0) {
3189 smprintf(s, "Getting locations for calendar method 3\n"); 3224 smprintf(s, "Getting locations for calendar method 3\n");
3190 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetCalendarNotesInfo); 3225 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetCalendarNotesInfo);
3191 } else { 3226 } else if (Type == 1) {
3192 req[10] = 0x01;
3193 smprintf(s, "Getting locations for ToDo method 2\n"); 3227 smprintf(s, "Getting locations for ToDo method 2\n");
3194 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetToDo); 3228 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetToDo);
3229 } else if (Type == 2) {
3230 smprintf(s, "Getting locations for Notes\n");
3231 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetNote);
3195 } 3232 }
3196 if (error != ERR_NONE && error != ERR_EMPTY) return error; 3233 if (error != ERR_NONE && error != ERR_EMPTY) return error;
3197 3234
3198 while (1) { 3235 while (1) {
3199 i=0; 3236 i=0;
3200 while (Last->Location[i] != 0x00) i++; 3237 while (Last->Location[i] != 0x00) i++;
3201 smprintf(s, "i = %i %i\n",i,Last->Number); 3238 smprintf(s, "i = %i %i\n",i,Last->Number);
3202 if (i == Last->Number) break; 3239 if (i == Last->Number) break;
3203 if (i != Last->Number && error == ERR_EMPTY) { 3240 if (i != Last->Number && error == ERR_EMPTY) {
3204 smprintf(s, "Phone doesn't support some notes with this method. Workaround\n"); 3241 smprintf(s, "Phone doesn't support some notes with this method. Workaround\n");
3205 Last->Number = i; 3242 Last->Number = i;
3206 break; 3243 break;
3207 } 3244 }
3208 req[8] = Last->Location[i-1] / 256; 3245 req[8] = Last->Location[i-1] / 256;
3209 req[9] = Last->Location[i-1] % 256; 3246 req[9] = Last->Location[i-1] % 256;
3210 if (Calendar) { 3247 if (Type == 0) {
3211 smprintf(s, "Getting locations for calendar method 3\n"); 3248 smprintf(s, "Getting locations for calendar method 3\n");
3212 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetCalendarNotesInfo); 3249 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetCalendarNotesInfo);
3213 } else { 3250 } else if (Type == 1) {
3214 smprintf(s, "Getting locations for todo method 2\n"); 3251 smprintf(s, "Getting locations for todo method 2\n");
3215 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetToDo); 3252 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetToDo);
3253 } else if (Type == 2) {
3254 smprintf(s, "Getting locations for Notes\n");
3255 error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetNote);
3216 } 3256 }
3217 if (error != ERR_NONE && error != ERR_EMPTY) return error; 3257 if (error != ERR_NONE && error != ERR_EMPTY) return error;
3218 } 3258 }
3219 return ERR_NONE; 3259 return ERR_NONE;
3220} 3260}
3221 3261
3222/* method 3 */ 3262/* method 3 */
3223GSM_Error N6510_ReplyGetCalendar3(GSM_Protocol_Message msg, GSM_StateMachine *s) 3263GSM_Error N6510_ReplyGetCalendar3(GSM_Protocol_Message msg, GSM_StateMachine *s)
3224{ 3264{
3225 GSM_CalendarEntry *entry = s->Phone.Data.Cal; 3265 GSM_CalendarEntry *entry = s->Phone.Data.Cal;
3226 GSM_DateTime Date; 3266 GSM_DateTime Date;
3227 unsigned long diff; 3267 unsigned long diff;
3228 int i; 3268 int i;
3229 bool found = false; 3269 bool found = false;
3230 GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510; 3270 GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
3231 3271
3232 smprintf(s, "Calendar note received method 3\n"); 3272 smprintf(s, "Calendar note received method 3\n");
3233 3273
3234 smprintf(s,"Note type %02i: ",msg.Buffer[27]); 3274 smprintf(s,"Note type %02i: ",msg.Buffer[27]);
3235 switch(msg.Buffer[27]) { 3275 switch(msg.Buffer[27]) {
3236 case 0x00: smprintf(s,"Reminder\n"); entry->Type = GSM_CAL_REMINDER; break; 3276 case 0x00: smprintf(s,"Reminder\n"); entry->Type = GSM_CAL_REMINDER; break;
3237 case 0x01: smprintf(s,"Meeting\n"); entry->Type = GSM_CAL_MEETING; break; 3277 case 0x01: smprintf(s,"Meeting\n"); entry->Type = GSM_CAL_MEETING; break;
3238 case 0x02: smprintf(s,"Call\n"); entry->Type = GSM_CAL_CALL; break; 3278 case 0x02: smprintf(s,"Call\n"); entry->Type = GSM_CAL_CALL; break;
3239 case 0x04: smprintf(s,"Birthday\n"); entry->Type = GSM_CAL_BIRTHDAY; break; 3279 case 0x04: smprintf(s,"Birthday\n"); entry->Type = GSM_CAL_BIRTHDAY; break;
3240 case 0x08: smprintf(s,"Memo\n"); entry->Type = GSM_CAL_MEMO; break; 3280 case 0x08: smprintf(s,"Memo\n"); entry->Type = GSM_CAL_MEMO; break;
3241 default : smprintf(s,"unknown\n"); 3281 default : smprintf(s,"unknown\n");
3242 } 3282 }
3243 3283
3244 smprintf(s,"StartTime: %04i-%02i-%02i %02i:%02i\n", 3284 smprintf(s,"StartTime: %04i-%02i-%02i %02i:%02i\n",
3245 msg.Buffer[28]*256+msg.Buffer[29], 3285 msg.Buffer[28]*256+msg.Buffer[29],
3246 msg.Buffer[30],msg.Buffer[31],msg.Buffer[32], 3286 msg.Buffer[30],msg.Buffer[31],msg.Buffer[32],
3247 msg.Buffer[33]); 3287 msg.Buffer[33]);
3248 Date.Year = msg.Buffer[28]*256+msg.Buffer[29]; 3288 Date.Year = msg.Buffer[28]*256+msg.Buffer[29];
3249 if (entry->Type == GSM_CAL_BIRTHDAY) { 3289 if (entry->Type == GSM_CAL_BIRTHDAY) {
3250 Date.Year = entry->Entries[0].Date.Year; 3290 Date.Year = entry->Entries[0].Date.Year;
3251 smprintf(s,"%i\n",Date.Year); 3291 smprintf(s,"%i\n",Date.Year);
3252 } 3292 }
3253 Date.Month = msg.Buffer[30]; 3293 Date.Month = msg.Buffer[30];
3254 Date.Day = msg.Buffer[31]; 3294 Date.Day = msg.Buffer[31];
3255 Date.Hour = msg.Buffer[32]; 3295 Date.Hour = msg.Buffer[32];
3256 Date.Minute = msg.Buffer[33]; 3296 Date.Minute = msg.Buffer[33];
3257 /* Garbage seen with 3510i 3.51 */ 3297 /* Garbage seen with 3510i 3.51 */
3258 if (Date.Month == 0 && Date.Day == 0 && Date.Hour == 0 && Date.Minute == 0) return ERR_EMPTY; 3298 if (Date.Month == 0 && Date.Day == 0 && Date.Hour == 0 && Date.Minute == 0) return ERR_EMPTY;
3259 Date.Second= 0; 3299 Date.Second= 0;
3260 entry->Entries[0].EntryType = CAL_START_DATETIME; 3300 entry->Entries[0].EntryType = CAL_START_DATETIME;
3261 memcpy(&entry->Entries[0].Date,&Date,sizeof(GSM_DateTime)); 3301 memcpy(&entry->Entries[0].Date,&Date,sizeof(GSM_DateTime));
3262 entry->EntriesNum++; 3302 entry->EntriesNum++;
3263 3303
@@ -3305,241 +3345,247 @@ GSM_Error N6510_ReplyGetCalendar3(GSM_Protocol_Message msg, GSM_StateMachine *s)
3305 entry->Entries[entry->EntriesNum].Date.Year, entry->Entries[entry->EntriesNum].Date.Hour, 3345 entry->Entries[entry->EntriesNum].Date.Year, entry->Entries[entry->EntriesNum].Date.Hour,
3306 entry->Entries[entry->EntriesNum].Date.Minute,entry->Entries[entry->EntriesNum].Date.Second); 3346 entry->Entries[entry->EntriesNum].Date.Minute,entry->Entries[entry->EntriesNum].Date.Second);
3307 3347
3308 entry->Entries[entry->EntriesNum].EntryType = CAL_ALARM_DATETIME; 3348 entry->Entries[entry->EntriesNum].EntryType = CAL_ALARM_DATETIME;
3309 if (msg.Buffer[22]==0x00 && msg.Buffer[23]==0x00 && 3349 if (msg.Buffer[22]==0x00 && msg.Buffer[23]==0x00 &&
3310 msg.Buffer[24]==0x00 && msg.Buffer[25]==0x00) 3350 msg.Buffer[24]==0x00 && msg.Buffer[25]==0x00)
3311 { 3351 {
3312 entry->Entries[entry->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME; 3352 entry->Entries[entry->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME;
3313 smprintf(s, "Alarm type : Silent\n"); 3353 smprintf(s, "Alarm type : Silent\n");
3314 } 3354 }
3315 entry->EntriesNum++; 3355 entry->EntriesNum++;
3316 } 3356 }
3317 3357
3318 N71_65_GetCalendarRecurrance(s, msg.Buffer+40, entry); 3358 N71_65_GetCalendarRecurrance(s, msg.Buffer+40, entry);
3319 3359
3320 if (entry->Type == GSM_CAL_BIRTHDAY) { 3360 if (entry->Type == GSM_CAL_BIRTHDAY) {
3321 if (msg.Buffer[42] == 0xff && msg.Buffer[43] == 0xff) { 3361 if (msg.Buffer[42] == 0xff && msg.Buffer[43] == 0xff) {
3322 entry->Entries[0].Date.Year = 0; 3362 entry->Entries[0].Date.Year = 0;
3323 } else { 3363 } else {
3324 entry->Entries[0].Date.Year = msg.Buffer[42]*256+msg.Buffer[43]; 3364 entry->Entries[0].Date.Year = msg.Buffer[42]*256+msg.Buffer[43];
3325 } 3365 }
3326 } 3366 }
3327 3367
3328 memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+54, msg.Buffer[51]*2); 3368 memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+54, msg.Buffer[51]*2);
3329 entry->Entries[entry->EntriesNum].Text[msg.Buffer[51]*2] = 0; 3369 entry->Entries[entry->EntriesNum].Text[msg.Buffer[51]*2] = 0;
3330 entry->Entries[entry->EntriesNum].Text[msg.Buffer[51]*2+1] = 0; 3370 entry->Entries[entry->EntriesNum].Text[msg.Buffer[51]*2+1] = 0;
3331 entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT; 3371 entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
3332 entry->EntriesNum++; 3372 entry->EntriesNum++;
3333 smprintf(s, "Note text: \"%s\"\n",DecodeUnicodeString(entry->Entries[entry->EntriesNum-1].Text)); 3373 smprintf(s, "Note text: \"%s\"\n",DecodeUnicodeString(entry->Entries[entry->EntriesNum-1].Text));
3334 3374
3335 if (entry->Type == GSM_CAL_CALL) { 3375 if (entry->Type == GSM_CAL_CALL) {
3336 memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+(54+msg.Buffer[51]*2), msg.Buffer[52]*2); 3376 memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+(54+msg.Buffer[51]*2), msg.Buffer[52]*2);
3337 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2] = 0; 3377 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2] = 0;
3338 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2+1] = 0; 3378 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2+1] = 0;
3339 entry->Entries[entry->EntriesNum].EntryType = CAL_PHONE; 3379 entry->Entries[entry->EntriesNum].EntryType = CAL_PHONE;
3340 entry->EntriesNum++; 3380 entry->EntriesNum++;
3341 } 3381 }
3342 if (entry->Type == GSM_CAL_MEETING) { 3382 if (entry->Type == GSM_CAL_MEETING) {
3343 memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+(54+msg.Buffer[51]*2), msg.Buffer[52]*2); 3383 memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+(54+msg.Buffer[51]*2), msg.Buffer[52]*2);
3344 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2] = 0; 3384 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2] = 0;
3345 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2+1] = 0; 3385 entry->Entries[entry->EntriesNum].Text[msg.Buffer[52]*2+1] = 0;
3346 entry->Entries[entry->EntriesNum].EntryType = CAL_LOCATION; 3386 entry->Entries[entry->EntriesNum].EntryType = CAL_LOCATION;
3347 entry->EntriesNum++; 3387 entry->EntriesNum++;
3348 } 3388 }
3349 3389
3350 return ERR_NONE; 3390 return ERR_NONE;
3351} 3391}
3352 3392
3393static GSM_Error N6510_PrivGetGenericCalendar3(GSM_StateMachine *s, int Location, GSM_Phone_RequestID ID)
3394{
3395 unsigned char req[] = {N6110_FRAME_HEADER,0x7D,0x00,0x00,0x00,0x00,
3396 0x00,0x99,/* Location */
3397 0xff,0xff,0xff,0xff};
3398
3399 req[8] = Location / 256;
3400 req[9] = Location % 256;
3401
3402 return GSM_WaitFor (s, req, 14, 0x13, 4, ID);
3403}
3404
3353static GSM_Error N6510_PrivGetCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start, int *LastCalendarYear) 3405static GSM_Error N6510_PrivGetCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start, int *LastCalendarYear)
3354{ 3406{
3355 GSM_Error error; 3407 GSM_Error error;
3356 GSM_DateTime date_time; 3408 GSM_DateTime date_time;
3357 unsigned char req[] = {N6110_FRAME_HEADER,0x7D,0x00,0x00,0x00,0x00,
3358 0x00,0x99,/* Location */
3359 0xff,0xff,0xff,0xff,0x01};
3360 3409
3361 if (start) { 3410 if (start) {
3362 /* We have to get current year. It's NOT written in frame for 3411 /* We have to get current year. It's NOT written in frame for
3363 * Birthday 3412 * Birthday
3364 */ 3413 */
3365 error=s->Phone.Functions->GetDateTime(s,&date_time); 3414 error=s->Phone.Functions->GetDateTime(s,&date_time);
3366 switch (error) { 3415 switch (error) {
3367 case ERR_EMPTY: 3416 case ERR_EMPTY:
3368 case ERR_NOTIMPLEMENTED: 3417 case ERR_NOTIMPLEMENTED:
3369 GSM_GetCurrentDateTime(&date_time); 3418 GSM_GetCurrentDateTime(&date_time);
3370 break; 3419 break;
3371 case ERR_NONE: 3420 case ERR_NONE:
3372 break; 3421 break;
3373 default: 3422 default:
3374 return error; 3423 return error;
3375 } 3424 }
3376 *LastCalendarYear = date_time.Year; 3425 *LastCalendarYear = date_time.Year;
3377 } 3426 }
3378 3427
3379 Note->EntriesNum = 0; 3428 Note->EntriesNum = 0;
3380 Note->Entries[0].Date.Year = *LastCalendarYear; 3429 Note->Entries[0].Date.Year = *LastCalendarYear;
3381 3430
3382 req[8] = Note->Location / 256;
3383 req[9] = Note->Location % 256;
3384
3385 s->Phone.Data.Cal=Note; 3431 s->Phone.Data.Cal=Note;
3386 smprintf(s, "Getting calendar note method 3\n"); 3432 smprintf(s, "Getting calendar note method 3\n");
3387 return GSM_WaitFor (s, req, 15, 0x13, 4, ID_GetCalendarNote); 3433 return N6510_PrivGetGenericCalendar3(s, Note->Location, ID_GetCalendarNote);
3388} 3434}
3389 3435
3390/* method 3 */ 3436/* method 3 */
3391GSM_Error N6510_GetNextCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start, GSM_NOKIACalToDoLocations *LastCalendar, int *LastCalendarYear, int *LastCalendarPos) 3437GSM_Error N6510_GetNextCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start, GSM_NOKIACalToDoLocations *LastCalendar, int *LastCalendarYear, int *LastCalendarPos)
3392{ 3438{
3393 GSM_Error error; 3439 GSM_Error error;
3394 bool start2; 3440 bool start2;
3395 3441
3396 if (start) { 3442 if (start) {
3397 error=N6510_GetCalendarInfo3(s,LastCalendar,true); 3443 error=N6510_GetCalendarInfo3(s,LastCalendar,0);
3398 if (error!=ERR_NONE) return error; 3444 if (error!=ERR_NONE) return error;
3399 if (LastCalendar->Number == 0) return ERR_EMPTY; 3445 if (LastCalendar->Number == 0) return ERR_EMPTY;
3400 3446
3401 *LastCalendarPos = 0; 3447 *LastCalendarPos = 0;
3402 } else { 3448 } else {
3403 (*LastCalendarPos)++; 3449 (*LastCalendarPos)++;
3404 } 3450 }
3405 3451
3406 error = ERR_EMPTY; 3452 error = ERR_EMPTY;
3407 start2 = start; 3453 start2 = start;
3408 while (error == ERR_EMPTY) { 3454 while (error == ERR_EMPTY) {
3409 if (*LastCalendarPos >= LastCalendar->Number) return ERR_EMPTY; 3455 if (*LastCalendarPos >= LastCalendar->Number) return ERR_EMPTY;
3410 3456
3411 Note->Location = LastCalendar->Location[*LastCalendarPos]; 3457 Note->Location = LastCalendar->Location[*LastCalendarPos];
3412 error=N6510_PrivGetCalendar3(s, Note, start2, LastCalendarYear); 3458 error=N6510_PrivGetCalendar3(s, Note, start2, LastCalendarYear);
3413 if (error == ERR_EMPTY) (*LastCalendarPos)++; 3459 if (error == ERR_EMPTY) (*LastCalendarPos)++;
3414 3460
3415 start2 = false; 3461 start2 = false;
3416 } 3462 }
3417 return error; 3463 return error;
3418} 3464}
3419 3465
3420static GSM_Error N6510_ReplyGetCalendarInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) 3466static GSM_Error N6510_ReplyGetCalendarInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
3421{ 3467{
3422 switch (msg.Buffer[3]) { 3468 switch (msg.Buffer[3]) {
3423 case 0x3B: 3469 case 0x3B:
3424 /* Old method 1 for accessing calendar */ 3470 /* Old method 1 for accessing calendar */
3425 return N71_65_ReplyGetCalendarInfo1(msg, s, &s->Phone.Data.Priv.N6510.LastCalendar); 3471 return N71_65_ReplyGetCalendarInfo1(msg, s, &s->Phone.Data.Priv.N6510.LastCalendar);
3426 case 0x9F: 3472 case 0x9F:
3427 smprintf(s, "Info with calendar notes locations received method 3\n"); 3473 smprintf(s, "Info with calendar notes locations received method 3\n");
3428 return N6510_ReplyGetCalendarInfo3(msg, s, &s->Phone.Data.Priv.N6510.LastCalendar); 3474 return N6510_ReplyGetCalendarInfo3(msg, s, &s->Phone.Data.Priv.N6510.LastCalendar);
3429 } 3475 }
3430 return ERR_UNKNOWNRESPONSE; 3476 return ERR_UNKNOWNRESPONSE;
3431} 3477}
3432 3478
3433/* method 3 */ 3479/* method 3 */
3434GSM_Error N6510_ReplyGetCalendarNotePos3(GSM_Protocol_Message msg, GSM_StateMachine *s,int *FirstCalendarPos) 3480GSM_Error N6510_ReplyGetCalendarNotePos3(GSM_Protocol_Message msg, GSM_StateMachine *s,int *FirstCalendarPos)
3435{ 3481{
3436 smprintf(s, "First calendar location: %i\n",msg.Buffer[8]*256+msg.Buffer[9]); 3482 smprintf(s, "First calendar location: %i\n",msg.Buffer[8]*256+msg.Buffer[9]);
3437 *FirstCalendarPos = msg.Buffer[8]*256+msg.Buffer[9]; 3483 *FirstCalendarPos = msg.Buffer[8]*256+msg.Buffer[9];
3438 return ERR_NONE; 3484 return ERR_NONE;
3439} 3485}
3440 3486
3441/* method 3 */ 3487/* method 3 */
3442static GSM_Error N6510_GetCalendarNotePos3(GSM_StateMachine *s) 3488static GSM_Error N6510_GetCalendarNotePos3(GSM_StateMachine *s)
3443{ 3489{
3444 unsigned char req[] = {N6110_FRAME_HEADER, 0x95, 0x00}; 3490 unsigned char req[] = {N6110_FRAME_HEADER, 0x95, 0x00};
3445 3491
3446 smprintf(s, "Getting first free calendar note location\n"); 3492 smprintf(s, "Getting first free calendar note location\n");
3447 return GSM_WaitFor (s, req, 5, 0x13, 4, ID_GetCalendarNotePos); 3493 return GSM_WaitFor (s, req, 5, 0x13, 4, ID_GetCalendarNotePos);
3448} 3494}
3449 3495
3450static GSM_Error N6510_ReplyGetCalendarNotePos(GSM_Protocol_Message msg, GSM_StateMachine *s) 3496static GSM_Error N6510_ReplyGetCalendarNotePos(GSM_Protocol_Message msg, GSM_StateMachine *s)
3451{ 3497{
3452 switch (msg.Buffer[3]) { 3498 switch (msg.Buffer[3]) {
3453 case 0x32: 3499 case 0x32:
3454 /* Old method 1 for accessing calendar */ 3500 /* Old method 1 for accessing calendar */
3455 return N71_65_ReplyGetCalendarNotePos1(msg, s,&s->Phone.Data.Priv.N6510.FirstCalendarPos); 3501 return N71_65_ReplyGetCalendarNotePos1(msg, s,&s->Phone.Data.Priv.N6510.FirstCalendarPos);
3456 case 0x96: 3502 case 0x96:
3457 return N6510_ReplyGetCalendarNotePos3(msg, s,&s->Phone.Data.Priv.N6510.FirstCalendarPos); 3503 return N6510_ReplyGetCalendarNotePos3(msg, s,&s->Phone.Data.Priv.N6510.FirstCalendarPos);
3458 } 3504 }
3459 return ERR_UNKNOWNRESPONSE; 3505 return ERR_UNKNOWNRESPONSE;
3460} 3506}
3461 3507
3462static GSM_Error N6510_FindCalendarIconID3(GSM_StateMachine *s, GSM_CalendarEntry *Entry, unsigned char *ID) 3508static GSM_Error N6510_FindCalendarIconID3(GSM_StateMachine *s, GSM_CalendarEntry *Entry, unsigned char *ID)
3463{ 3509{
3464 int i,j,LastCalendarYear; 3510 int i,j,LastCalendarYear;
3465 GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510; 3511 GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
3466 GSM_CalendarEntry Note; 3512 GSM_CalendarEntry Note;
3467 GSM_NOKIACalToDoLocationsLastCalendar1,LastCalendar2; 3513 GSM_NOKIACalToDoLocationsLastCalendar1,LastCalendar2;
3468 GSM_Error error; 3514 GSM_Error error;
3469 bool found; 3515 bool found;
3470 3516
3471 for(i=0;i<Priv->CalendarIconsNum;i++) { 3517 for(i=0;i<Priv->CalendarIconsNum;i++) {
3472 if (Priv->CalendarIconsTypes[i] == Entry->Type) { 3518 if (Priv->CalendarIconsTypes[i] == Entry->Type) {
3473 *ID = Priv->CalendarIcons[i]; 3519 *ID = Priv->CalendarIcons[i];
3474 return ERR_NONE; 3520 return ERR_NONE;
3475 } 3521 }
3476 } 3522 }
3477 3523
3478 smprintf(s, "Starting finding note ID\n"); 3524 smprintf(s, "Starting finding note ID\n");
3479 3525
3480 error=N6510_GetCalendarInfo3(s, &Priv->LastCalendar,true); 3526 error=N6510_GetCalendarInfo3(s, &Priv->LastCalendar,0);
3481 memcpy(&LastCalendar1,&Priv->LastCalendar,sizeof(GSM_NOKIACalToDoLocations)); 3527 memcpy(&LastCalendar1,&Priv->LastCalendar,sizeof(GSM_NOKIACalToDoLocations));
3482 if (error != ERR_NONE) return error; 3528 if (error != ERR_NONE) return error;
3483 3529
3484 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL35) || 3530 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL35) ||
3485 IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL65) || 3531 IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL65) ||
3486 IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) { 3532 IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
3487 error=N71_65_AddCalendar2(s,Entry); 3533 error=N71_65_AddCalendar2(s,Entry);
3488 } else { 3534 } else {
3489 if (Entry->Type == GSM_CAL_MEETING) { 3535 if (Entry->Type == GSM_CAL_MEETING) {
3490 error=N71_65_AddCalendar1(s, Entry, &s->Phone.Data.Priv.N6510.FirstCalendarPos); 3536 error=N71_65_AddCalendar1(s, Entry, &s->Phone.Data.Priv.N6510.FirstCalendarPos);
3491 } else { 3537 } else {
3492 error=N71_65_AddCalendar2(s,Entry); 3538 error=N71_65_AddCalendar2(s,Entry);
3493 } 3539 }
3494 } 3540 }
3495 if (error != ERR_NONE) return error; 3541 if (error != ERR_NONE) return error;
3496 3542
3497 error=N6510_GetCalendarInfo3(s, &Priv->LastCalendar,true); 3543 error=N6510_GetCalendarInfo3(s, &Priv->LastCalendar,0);
3498 memcpy(&LastCalendar2,&Priv->LastCalendar,sizeof(GSM_NOKIACalToDoLocations)); 3544 memcpy(&LastCalendar2,&Priv->LastCalendar,sizeof(GSM_NOKIACalToDoLocations));
3499 if (error != ERR_NONE) return error; 3545 if (error != ERR_NONE) return error;
3500 3546
3501 smprintf(s,"Number of entries: %i %i\n",LastCalendar1.Number,LastCalendar2.Number); 3547 smprintf(s,"Number of entries: %i %i\n",LastCalendar1.Number,LastCalendar2.Number);
3502 3548
3503 for(i=0;i<LastCalendar2.Number;i++) { 3549 for(i=0;i<LastCalendar2.Number;i++) {
3504 found = true; 3550 found = true;
3505 for(j=0;j<LastCalendar1.Number;j++) { 3551 for(j=0;j<LastCalendar1.Number;j++) {
3506 if (LastCalendar1.Location[j] == LastCalendar2.Location[i]) { 3552 if (LastCalendar1.Location[j] == LastCalendar2.Location[i]) {
3507 found = false; 3553 found = false;
3508 break; 3554 break;
3509 } 3555 }
3510 } 3556 }
3511 if (found) { 3557 if (found) {
3512 Note.Location = LastCalendar2.Location[i]; 3558 Note.Location = LastCalendar2.Location[i];
3513 error=N6510_PrivGetCalendar3(s, &Note, true, &LastCalendarYear); 3559 error=N6510_PrivGetCalendar3(s, &Note, true, &LastCalendarYear);
3514 if (error != ERR_NONE) return error; 3560 if (error != ERR_NONE) return error;
3515 3561
3516 error=N71_65_DelCalendar(s, &Note); 3562 error=N71_65_DelCalendar(s, &Note);
3517 if (error != ERR_NONE) return error; 3563 if (error != ERR_NONE) return error;
3518 3564
3519 smprintf(s, "Ending finding note ID\n"); 3565 smprintf(s, "Ending finding note ID\n");
3520 3566
3521 for(j=0;j<Priv->CalendarIconsNum;j++) { 3567 for(j=0;j<Priv->CalendarIconsNum;j++) {
3522 if (Priv->CalendarIconsTypes[j] == Entry->Type) { 3568 if (Priv->CalendarIconsTypes[j] == Entry->Type) {
3523 *ID = Priv->CalendarIcons[j]; 3569 *ID = Priv->CalendarIcons[j];
3524 return ERR_NONE; 3570 return ERR_NONE;
3525 } 3571 }
3526 } 3572 }
3527 return ERR_UNKNOWN; 3573 return ERR_UNKNOWN;
3528 } 3574 }
3529 } 3575 }
3530 3576
3531 return ERR_UNKNOWN; 3577 return ERR_UNKNOWN;
3532} 3578}
3533 3579
3534/* method 3 */ 3580/* method 3 */
3535static GSM_Error N6510_ReplyAddCalendar3(GSM_Protocol_Message msg, GSM_StateMachine *s) 3581static GSM_Error N6510_ReplyAddCalendar3(GSM_Protocol_Message msg, GSM_StateMachine *s)
3536{ 3582{
3537 smprintf(s, "Calendar note added\n"); 3583 smprintf(s, "Calendar note added\n");
3538 return ERR_NONE; 3584 return ERR_NONE;
3539} 3585}
3540 3586
3541/* method 3 */ 3587/* method 3 */
3542GSM_Error N6510_AddCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, int *FirstCalendarPos) 3588GSM_Error N6510_AddCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, int *FirstCalendarPos)
3543{ 3589{
3544 GSM_CalendarNoteTypeNoteType, OldNoteType; 3590 GSM_CalendarNoteTypeNoteType, OldNoteType;
3545 time_t t_time1,t_time2; 3591 time_t t_time1,t_time2;
@@ -3692,97 +3738,97 @@ GSM_Error N6510_AddCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, int *
3692 req[count++] = 0x00; 3738 req[count++] = 0x00;
3693 3739
3694 smprintf(s, "Writing calendar note method 3\n"); 3740 smprintf(s, "Writing calendar note method 3\n");
3695 return GSM_WaitFor (s, req, count, 0x13, 4, ID_SetCalendarNote); 3741 return GSM_WaitFor (s, req, count, 0x13, 4, ID_SetCalendarNote);
3696} 3742}
3697 3743
3698static GSM_Error N6510_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start) 3744static GSM_Error N6510_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start)
3699{ 3745{
3700#ifdef GSM_FORCE_DCT4_CALENDAR_6210 3746#ifdef GSM_FORCE_DCT4_CALENDAR_6210
3701 /* Method 1. Some features missed. Not working with some notes in 3510 */ 3747 /* Method 1. Some features missed. Not working with some notes in 3510 */
3702 return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos); 3748 return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos);
3703#endif 3749#endif
3704 3750
3705 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) { 3751 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
3706 /* Method 1. Some features missed. Not working with some notes in 3510 */ 3752 /* Method 1. Some features missed. Not working with some notes in 3510 */
3707 return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos); 3753 return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos);
3708 3754
3709 /* Method 2. In known phones texts of notes cut to 50 chars. Some features missed */ 3755 /* Method 2. In known phones texts of notes cut to 50 chars. Some features missed */
3710 // return N71_65_GetNextCalendar2(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos); 3756 // return N71_65_GetNextCalendar2(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos);
3711 } else { 3757 } else {
3712 /* Method 3. All DCT4 features supported. Not supported by 8910 */ 3758 /* Method 3. All DCT4 features supported. Not supported by 8910 */
3713 return N6510_GetNextCalendar3(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos); 3759 return N6510_GetNextCalendar3(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos);
3714 } 3760 }
3715} 3761}
3716 3762
3717static GSM_Error N6510_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status) 3763static GSM_Error N6510_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
3718{ 3764{
3719 GSM_Error error; 3765 GSM_Error error;
3720 3766
3721#ifdef GSM_FORCE_DCT4_CALENDAR_6210 3767#ifdef GSM_FORCE_DCT4_CALENDAR_6210
3722 /* Method 1 */ 3768 /* Method 1 */
3723 error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N6510.LastCalendar); 3769 error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N6510.LastCalendar);
3724 if (error!=ERR_NONE) return error; 3770 if (error!=ERR_NONE) return error;
3725 Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number; 3771 Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number;
3726 return ERR_NONE; 3772 return ERR_NONE;
3727#endif 3773#endif
3728 3774
3729 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) { 3775 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
3730 /* Method 1 */ 3776 /* Method 1 */
3731 error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N6510.LastCalendar); 3777 error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N6510.LastCalendar);
3732 if (error!=ERR_NONE) return error; 3778 if (error!=ERR_NONE) return error;
3733 Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number; 3779 Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number;
3734 return ERR_NONE; 3780 return ERR_NONE;
3735 3781
3736 /* Method 2 */ 3782 /* Method 2 */
3737 // return ERR_NOTSUPPORTED; 3783 // return ERR_NOTSUPPORTED;
3738 } else { 3784 } else {
3739 /* Method 3 */ 3785 /* Method 3 */
3740 error=N6510_GetCalendarInfo3(s,&s->Phone.Data.Priv.N6510.LastCalendar,true); 3786 error=N6510_GetCalendarInfo3(s,&s->Phone.Data.Priv.N6510.LastCalendar,0);
3741 if (error!=ERR_NONE) return error; 3787 if (error!=ERR_NONE) return error;
3742 Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number; 3788 Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number;
3743 return ERR_NONE; 3789 return ERR_NONE;
3744 } 3790 }
3745} 3791}
3746 3792
3747static GSM_Error N6510_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note) 3793static GSM_Error N6510_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
3748{ 3794{
3749#ifdef GSM_FORCE_DCT4_CALENDAR_6210 3795#ifdef GSM_FORCE_DCT4_CALENDAR_6210
3750 return N71_65_AddCalendar2(s,Note); 3796 return N71_65_AddCalendar2(s,Note);
3751#endif 3797#endif
3752 3798
3753 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) { 3799 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
3754 return N71_65_AddCalendar2(s,Note); 3800 return N71_65_AddCalendar2(s,Note);
3755 // return N71_65_AddCalendar1(s, Note, &s->Phone.Data.Priv.N6510.FirstCalendarPos); 3801 // return N71_65_AddCalendar1(s, Note, &s->Phone.Data.Priv.N6510.FirstCalendarPos);
3756 } else { 3802 } else {
3757 /* Method 3. All DCT4 features supported. Not supported by 8910 */ 3803 /* Method 3. All DCT4 features supported. Not supported by 8910 */
3758 return N6510_AddCalendar3(s, Note, &s->Phone.Data.Priv.N6510.FirstCalendarPos); 3804 return N6510_AddCalendar3(s, Note, &s->Phone.Data.Priv.N6510.FirstCalendarPos);
3759 } 3805 }
3760} 3806}
3761 3807
3762static GSM_Error N6510_ReplyLogIntoNetwork(GSM_Protocol_Message msg, GSM_StateMachine *s) 3808static GSM_Error N6510_ReplyLogIntoNetwork(GSM_Protocol_Message msg, GSM_StateMachine *s)
3763{ 3809{
3764 smprintf(s, "Probably phone says: I log into network\n"); 3810 smprintf(s, "Probably phone says: I log into network\n");
3765 return ERR_NONE; 3811 return ERR_NONE;
3766} 3812}
3767 3813
3768void N6510_EncodeFMFrequency(double freq, unsigned char *buff) 3814void N6510_EncodeFMFrequency(double freq, unsigned char *buff)
3769{ 3815{
3770 double freq0; 3816 double freq0;
3771 unsigned char buffer[20]; 3817 unsigned char buffer[20];
3772 unsigned int i,freq2; 3818 unsigned int i,freq2;
3773 3819
3774 sprintf(buffer,"%.3f",freq); 3820 sprintf(buffer,"%.3f",freq);
3775 for (i=0;i<strlen(buffer);i++) { 3821 for (i=0;i<strlen(buffer);i++) {
3776 if (buffer[i] == ',' || buffer[i] == '.') buffer[i] = ' '; 3822 if (buffer[i] == ',' || buffer[i] == '.') buffer[i] = ' ';
3777 } 3823 }
3778 StringToDouble(buffer, &freq0); 3824 StringToDouble(buffer, &freq0);
3779 freq2 = (unsigned int)freq0; 3825 freq2 = (unsigned int)freq0;
3780 dbgprintf("Frequency: %s %i\n",buffer,freq2); 3826 dbgprintf("Frequency: %s %i\n",buffer,freq2);
3781 freq2= freq2 - 0xffff; 3827 freq2= freq2 - 0xffff;
3782 buff[0] = freq2 / 0x100; 3828 buff[0] = freq2 / 0x100;
3783 buff[1] = freq2 % 0x100; 3829 buff[1] = freq2 % 0x100;
3784} 3830}
3785 3831
3786void N6510_DecodeFMFrequency(double *freq, unsigned char *buff) 3832void N6510_DecodeFMFrequency(double *freq, unsigned char *buff)
3787{ 3833{
3788 unsigned char buffer[20]; 3834 unsigned char buffer[20];
@@ -3927,180 +3973,216 @@ static GSM_Error N6510_SetFMStation (GSM_StateMachine *s, GSM_FMStation *FMStati
3927 smprintf(s, "Setting FM Station %i\n",FMStation->Location); 3973 smprintf(s, "Setting FM Station %i\n",FMStation->Location);
3928 return GSM_WaitFor (s, req, 0x13+len*2, 0x3E, 2, ID_SetFMStation); 3974 return GSM_WaitFor (s, req, 0x13+len*2, 0x3E, 2, ID_SetFMStation);
3929} 3975}
3930 3976
3931static GSM_Error N6510_ReplySetLight(GSM_Protocol_Message msg, GSM_StateMachine *s) 3977static GSM_Error N6510_ReplySetLight(GSM_Protocol_Message msg, GSM_StateMachine *s)
3932{ 3978{
3933 smprintf(s, "Light set\n"); 3979 smprintf(s, "Light set\n");
3934 return ERR_NONE; 3980 return ERR_NONE;
3935} 3981}
3936 3982
3937GSM_Error N6510_SetLight(GSM_StateMachine *s, N6510_PHONE_LIGHTS light, bool enable) 3983GSM_Error N6510_SetLight(GSM_StateMachine *s, N6510_PHONE_LIGHTS light, bool enable)
3938{ 3984{
3939 unsigned char req[14] = { 3985 unsigned char req[14] = {
3940 N6110_FRAME_HEADER, 0x05, 3986 N6110_FRAME_HEADER, 0x05,
3941 0x01, /* 0x01 = Display, 0x03 = keypad */ 3987 0x01, /* 0x01 = Display, 0x03 = keypad */
3942 0x01, /* 0x01 = Enable, 0x02 = disable */ 3988 0x01, /* 0x01 = Enable, 0x02 = disable */
3943 0x00, 0x00, 0x00, 0x01, 3989 0x00, 0x00, 0x00, 0x01,
3944 0x05, 0x04, 0x02, 0x00}; 3990 0x05, 0x04, 0x02, 0x00};
3945 3991
3946 req[4] = light; 3992 req[4] = light;
3947 if (!enable) req[5] = 0x02; 3993 if (!enable) req[5] = 0x02;
3948 smprintf(s, "Setting light\n"); 3994 smprintf(s, "Setting light\n");
3949 return GSM_WaitFor (s, req, 14, 0x3A, 4, ID_SetLight); 3995 return GSM_WaitFor (s, req, 14, 0x3A, 4, ID_SetLight);
3950} 3996}
3951 3997
3952static GSM_Error N6510_ShowStartInfo(GSM_StateMachine *s, bool enable) 3998static GSM_Error N6510_ShowStartInfo(GSM_StateMachine *s, bool enable)
3953{ 3999{
3954 GSM_Error error; 4000 GSM_Error error;
3955 4001
3956 if (enable) { 4002 if (enable) {
3957 error=N6510_SetLight(s,N6510_LIGHT_DISPLAY,true); 4003 error=N6510_SetLight(s,N6510_LIGHT_DISPLAY,true);
3958 if (error != ERR_NONE) return error; 4004 if (error != ERR_NONE) return error;
3959 4005
3960 error=N6510_SetLight(s,N6510_LIGHT_TORCH,true); 4006 error=N6510_SetLight(s,N6510_LIGHT_TORCH,true);
3961 if (error != ERR_NONE) return error; 4007 if (error != ERR_NONE) return error;
3962 4008
3963 return N6510_SetLight(s,N6510_LIGHT_KEYPAD,true); 4009 return N6510_SetLight(s,N6510_LIGHT_KEYPAD,true);
3964 } else { 4010 } else {
3965 error=N6510_SetLight(s,N6510_LIGHT_DISPLAY,false); 4011 error=N6510_SetLight(s,N6510_LIGHT_DISPLAY,false);
3966 if (error != ERR_NONE) return error; 4012 if (error != ERR_NONE) return error;
3967 4013
3968 error=N6510_SetLight(s,N6510_LIGHT_TORCH,false); 4014 error=N6510_SetLight(s,N6510_LIGHT_TORCH,false);
3969 if (error != ERR_NONE) return error; 4015 if (error != ERR_NONE) return error;
3970 4016
3971 return N6510_SetLight(s,N6510_LIGHT_KEYPAD,false); 4017 return N6510_SetLight(s,N6510_LIGHT_KEYPAD,false);
3972 } 4018 }
3973} 4019}
3974 4020
4021static GSM_Error N6510_ReplyGetNoteInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
4022{
4023 return N6510_ReplyGetCalendarInfo3(msg, s, &s->Phone.Data.Priv.N6510.LastNote);
4024}
4025
4026static GSM_Error N6510_ReplyGetNote(GSM_Protocol_Message msg, GSM_StateMachine *s)
4027{
4028 smprintf(s, "Note received\n");
4029 memcpy(s->Phone.Data.Note->Text,msg.Buffer+54,(msg.Buffer[50]*256+msg.Buffer[51])*2);
4030 s->Phone.Data.Note->Text[(msg.Buffer[50]*256+msg.Buffer[51])*2] = 0;
4031 s->Phone.Data.Note->Text[(msg.Buffer[50]*256+msg.Buffer[51])*2+1] = 0;
4032 return ERR_NONE;
4033}
4034
4035GSM_Error N6510_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *Note, bool start)
4036{
4037 GSM_Error error;
4038 GSM_NOKIACalToDoLocations *LastNote = &s->Phone.Data.Priv.N6510.LastNote;
4039
4040 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOTES)) return ERR_NOTSUPPORTED;
4041
4042 if (start) {
4043 error=N6510_GetCalendarInfo3(s,LastNote,2);
4044 if (error!=ERR_NONE) return error;
4045 Note->Location = 1;
4046 } else {
4047 Note->Location++;
4048 }
4049
4050 if (Note->Location > LastNote->Number) return ERR_EMPTY;
4051
4052 s->Phone.Data.Note = Note;
4053 smprintf(s, "Getting note\n");
4054 return N6510_PrivGetGenericCalendar3(s, LastNote->Location[Note->Location-1], ID_GetNote);
4055}
4056
3975static int N6510_FindFileCheckSum(unsigned char *ptr, int len) 4057static int N6510_FindFileCheckSum(unsigned char *ptr, int len)
3976{ 4058{
3977 int acc, i, accx; 4059 int acc, i, accx;
3978 4060
3979 accx = 0; 4061 accx = 0;
3980 acc = 0xffff; 4062 acc = 0xffff;
3981 while (len--) { 4063 while (len--) {
3982 accx = (accx & 0xffff00ff) | (acc & 0xff00); 4064 accx = (accx & 0xffff00ff) | (acc & 0xff00);
3983 acc = (acc & 0xffff00ff) | *ptr++ << 8; 4065 acc = (acc & 0xffff00ff) | *ptr++ << 8;
3984 for (i = 0; i < 8; i++) { 4066 for (i = 0; i < 8; i++) {
3985 acc <<= 1; 4067 acc <<= 1;
3986 if (acc & 0x10000) acc ^= 0x1021; 4068 if (acc & 0x10000) acc ^= 0x1021;
3987 if (accx & 0x80000000) acc ^= 0x1021; 4069 if (accx & 0x80000000) acc ^= 0x1021;
3988 accx <<= 1; 4070 accx <<= 1;
3989 } 4071 }
3990 } 4072 }
3991 dbgprintf("Checksum from Gammu is %04X\n",(acc & 0xffff)); 4073 dbgprintf("Checksum from Gammu is %04X\n",(acc & 0xffff));
3992 return (acc & 0xffff); 4074 return (acc & 0xffff);
3993} 4075}
3994 4076
3995static GSM_Error N6510_ReplyGetFileFolderInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) 4077static GSM_Error N6510_ReplyGetFileFolderInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
3996{ 4078{
3997 GSM_File *File = s->Phone.Data.FileInfo; 4079 GSM_File *File = s->Phone.Data.FileInfo;
3998 GSM_Phone_N6510Data*Priv = &s->Phone.Data.Priv.N6510; 4080 GSM_Phone_N6510Data*Priv = &s->Phone.Data.Priv.N6510;
3999 int i; 4081 int i;
4000 4082
4001 switch (msg.Buffer[3]) { 4083 switch (msg.Buffer[3]) {
4002 case 0x15: 4084 case 0x15:
4003 smprintf(s,"File or folder details received\n"); 4085 smprintf(s,"File or folder details received\n");
4004 CopyUnicodeString(File->Name,msg.Buffer+10); 4086 CopyUnicodeString(File->Name,msg.Buffer+10);
4005 if (!strncmp(DecodeUnicodeString(File->Name),"GMSTemp",7)) return ERR_EMPTY; 4087 if (!strncmp(DecodeUnicodeString(File->Name),"GMSTemp",7)) return ERR_EMPTY;
4006 if (File->Name[0] == 0x00 && File->Name[1] == 0x00) return ERR_UNKNOWN; 4088 if (File->Name[0] == 0x00 && File->Name[1] == 0x00) return ERR_UNKNOWN;
4007 4089
4008 i = msg.Buffer[8]*256+msg.Buffer[9]; 4090 i = msg.Buffer[8]*256+msg.Buffer[9];
4009 dbgprintf("%02x %02x %02x %02x %02x %02x %02x %02x %02x\n", 4091 dbgprintf("%02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
4010 msg.Buffer[i-5],msg.Buffer[i-4],msg.Buffer[i-3], 4092 msg.Buffer[i-5],msg.Buffer[i-4],msg.Buffer[i-3],
4011 msg.Buffer[i-2],msg.Buffer[i-1],msg.Buffer[i], 4093 msg.Buffer[i-2],msg.Buffer[i-1],msg.Buffer[i],
4012 msg.Buffer[i+1],msg.Buffer[i+2],msg.Buffer[i+3]); 4094 msg.Buffer[i+1],msg.Buffer[i+2],msg.Buffer[i+3]);
4013 4095
4014 File->Folder = false; 4096 File->Folder = false;
4015 if (msg.Buffer[i-5] == 0x00) File->Folder = true; 4097 if (msg.Buffer[i-5] == 0x00) File->Folder = true;
4016 4098
4017 File->ReadOnly = false; 4099 File->ReadOnly = false;
4018 File->Protected = false; 4100 File->Protected = false;
4019 File->System= false; 4101 File->System= false;
4020 File->Hidden= false; 4102 File->Hidden= false;
4021 if (msg.Buffer[i+2] == 0x01) File->Protected = true; 4103 if (msg.Buffer[i+2] == 0x01) File->Protected = true;
4022 if (msg.Buffer[i+4] == 0x01) File->ReadOnly = true; 4104 if (msg.Buffer[i+4] == 0x01) File->ReadOnly = true;
4023 if (msg.Buffer[i+5] == 0x01) File->Hidden= true; 4105 if (msg.Buffer[i+5] == 0x01) File->Hidden= true;
4024 if (msg.Buffer[i+6] == 0x01) File->System= true;//fixme 4106 if (msg.Buffer[i+6] == 0x01) File->System= true;//fixme
4025 4107
4026 File->ModifiedEmpty = false; 4108 File->ModifiedEmpty = false;
4027 NOKIA_DecodeDateTime(s, msg.Buffer+i-22, &File->Modified); 4109 NOKIA_DecodeDateTime(s, msg.Buffer+i-22, &File->Modified);
4028 if (File->Modified.Year == 0x00) File->ModifiedEmpty = true; 4110 if (File->Modified.Year == 0x00) File->ModifiedEmpty = true;
4029 dbgprintf("%02x %02x %02x %02x\n",msg.Buffer[i-22],msg.Buffer[i-21],msg.Buffer[i-20],msg.Buffer[i-19]); 4111 dbgprintf("%02x %02x %02x %02x\n",msg.Buffer[i-22],msg.Buffer[i-21],msg.Buffer[i-20],msg.Buffer[i-19]);
4030 4112
4031 Priv->FileToken = msg.Buffer[i-10]*256+msg.Buffer[i-9]; 4113 Priv->FileToken = msg.Buffer[i-10]*256+msg.Buffer[i-9];
4032 Priv->ParentID = msg.Buffer[i]*256+msg.Buffer[i+1]; 4114 Priv->ParentID = msg.Buffer[i]*256+msg.Buffer[i+1];
4033 smprintf(s,"ParentID is %i\n",Priv->ParentID); 4115 smprintf(s,"ParentID is %i\n",Priv->ParentID);
4034 4116
4035 File->Type = GSM_File_Other; 4117 File->Type = GSM_File_Other;
4036 if (msg.Length > 240){ 4118 if (msg.Length > 240){
4037 i = 227; 4119 i = 227;
4038 if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x01) 4120 if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x01)
4039 File->Type = GSM_File_Image_JPG; 4121 File->Type = GSM_File_Image_JPG;
4040 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x02) 4122 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x02)
4041 File->Type = GSM_File_Image_BMP; 4123 File->Type = GSM_File_Image_BMP;
4042 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x07) 4124 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x07)
4043 File->Type = GSM_File_Image_BMP; 4125 File->Type = GSM_File_Image_BMP;
4044 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x03) 4126 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x03)
4045 File->Type = GSM_File_Image_PNG; 4127 File->Type = GSM_File_Image_PNG;
4046 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x05) 4128 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x05)
4047 File->Type = GSM_File_Image_GIF; 4129 File->Type = GSM_File_Image_GIF;
4048 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x09) 4130 else if (msg.Buffer[i]==0x02 && msg.Buffer[i+2]==0x09)
4049 File->Type = GSM_File_Image_WBMP; 4131 File->Type = GSM_File_Image_WBMP;
4050 else if (msg.Buffer[i]==0x04 && msg.Buffer[i+2]==0x01) 4132 else if (msg.Buffer[i]==0x04 && msg.Buffer[i+2]==0x01)
4051 File->Type = GSM_File_Sound_AMR; 4133 File->Type = GSM_File_Sound_AMR;
4052 else if (msg.Buffer[i]==0x04 && msg.Buffer[i+2]==0x02) 4134 else if (msg.Buffer[i]==0x04 && msg.Buffer[i+2]==0x02)
4053 File->Type = GSM_File_Sound_MIDI; 4135 File->Type = GSM_File_Sound_MIDI;
4054 else if (msg.Buffer[i]==0x08 && msg.Buffer[i+2]==0x05) 4136 else if (msg.Buffer[i]==0x08 && msg.Buffer[i+2]==0x05)
4055 File->Type = GSM_File_Video_3GP; 4137 File->Type = GSM_File_Video_3GP;
4056 else if (msg.Buffer[i]==0x10 && msg.Buffer[i+2]==0x01) 4138 else if (msg.Buffer[i]==0x10 && msg.Buffer[i+2]==0x01)
4057 File->Type = GSM_File_Java_JAR; 4139 File->Type = GSM_File_Java_JAR;
4058#if DEVELOP 4140#ifdef DEVELOP
4059 else if (msg.Buffer[i]==0x00 && msg.Buffer[i+2]==0x01) 4141 else if (msg.Buffer[i]==0x00 && msg.Buffer[i+2]==0x01)
4060 File->Type = GSM_File_MMS; 4142 File->Type = GSM_File_MMS;
4061#endif 4143#endif
4062 } 4144 }
4063 return ERR_NONE; 4145 return ERR_NONE;
4064 case 0x2F: 4146 case 0x2F:
4065 smprintf(s,"File or folder used bytes received\n"); 4147 smprintf(s,"File or folder used bytes received\n");
4066 File->Used = msg.Buffer[6]*256*256*256+ 4148 File->Used = msg.Buffer[6]*256*256*256+
4067 msg.Buffer[7]*256*256+ 4149 msg.Buffer[7]*256*256+
4068 msg.Buffer[8]*256+ 4150 msg.Buffer[8]*256+
4069 msg.Buffer[9]; 4151 msg.Buffer[9];
4070 return ERR_NONE; 4152 return ERR_NONE;
4071 case 0x33: 4153 case 0x33:
4072 if (s->Phone.Data.RequestID == ID_GetFileInfo) { 4154 if (s->Phone.Data.RequestID == ID_GetFileInfo) {
4073 i = Priv->FilesLocationsUsed-1; 4155 i = Priv->FilesLocationsUsed-1;
4074 while (1) { 4156 while (1) {
4075 if (i==Priv->FilesLocationsCurrent-1) break; 4157 if (i==Priv->FilesLocationsCurrent-1) break;
4076 dbgprintf("Copying %i to %i, max %i, current %i\n", 4158 dbgprintf("Copying %i to %i, max %i, current %i\n",
4077 i,i+msg.Buffer[9], 4159 i,i+msg.Buffer[9],
4078 Priv->FilesLocationsUsed,Priv->FilesLocationsCurrent); 4160 Priv->FilesLocationsUsed,Priv->FilesLocationsCurrent);
4079 Priv->FilesLocations[i+msg.Buffer[9]] = Priv->FilesLocations[i]; 4161 Priv->FilesLocations[i+msg.Buffer[9]] = Priv->FilesLocations[i];
4080 Priv->FilesLevels[i+msg.Buffer[9]]= Priv->FilesLevels[i]; 4162 Priv->FilesLevels[i+msg.Buffer[9]]= Priv->FilesLevels[i];
4081 i--; 4163 i--;
4082 } 4164 }
4083 Priv->FilesLocationsUsed += msg.Buffer[9]; 4165 Priv->FilesLocationsUsed += msg.Buffer[9];
4084 for (i=0;i<msg.Buffer[9];i++) { 4166 for (i=0;i<msg.Buffer[9];i++) {
4085 Priv->FilesLocations[Priv->FilesLocationsCurrent+i] = msg.Buffer[13+i*4-1]*256 + msg.Buffer[13+i*4]; 4167 Priv->FilesLocations[Priv->FilesLocationsCurrent+i] = msg.Buffer[13+i*4-1]*256 + msg.Buffer[13+i*4];
4086 Priv->FilesLevels[Priv->FilesLocationsCurrent+i] = File->Level+1; 4168 Priv->FilesLevels[Priv->FilesLocationsCurrent+i] = File->Level+1;
4087 dbgprintf("%i ",Priv->FilesLocations[Priv->FilesLocationsCurrent+i]); 4169 dbgprintf("%i ",Priv->FilesLocations[Priv->FilesLocationsCurrent+i]);
4088 } 4170 }
4089 dbgprintf("\n"); 4171 dbgprintf("\n");
4090 } 4172 }
4091 if (msg.Buffer[9] != 0x00) File->Folder = true; 4173 if (msg.Buffer[9] != 0x00) File->Folder = true;
4092 return ERR_NONE; 4174 return ERR_NONE;
4093 case 0x43: 4175 case 0x43:
4094 Priv->FileCheckSum = msg.Buffer[6] * 256 + msg.Buffer[7]; 4176 Priv->FileCheckSum = msg.Buffer[6] * 256 + msg.Buffer[7];
4095 smprintf(s,"File checksum from phone is %04X\n",Priv->FileCheckSum); 4177 smprintf(s,"File checksum from phone is %04X\n",Priv->FileCheckSum);
4096 return ERR_NONE; 4178 return ERR_NONE;
4097 } 4179 }
4098 return ERR_UNKNOWNRESPONSE; 4180 return ERR_UNKNOWNRESPONSE;
4099} 4181}
4100 4182
4101static GSM_Error N6510_GetFileFolderInfo(GSM_StateMachine *s, GSM_File *File, GSM_Phone_RequestID Request) 4183static GSM_Error N6510_GetFileFolderInfo(GSM_StateMachine *s, GSM_File *File, GSM_Phone_RequestID Request)
4102{ 4184{
4103 GSM_Error error; 4185 GSM_Error error;
4104 unsigned char req[10] = { 4186 unsigned char req[10] = {
4105 N7110_FRAME_HEADER, 4187 N7110_FRAME_HEADER,
4106 0x14, /* 0x14 - info, 0x22 - free/total, 0x2E - used, 0x32 - sublocations */ 4188 0x14, /* 0x14 - info, 0x22 - free/total, 0x2E - used, 0x32 - sublocations */
@@ -4353,97 +4435,97 @@ static GSM_Error N6510_SetReadOnly(GSM_StateMachine *s, unsigned char *ID, bool
4353 smprintf(s, "Setting readonly attribute\n"); 4435 smprintf(s, "Setting readonly attribute\n");
4354 return GSM_WaitFor (s, SetAttr, 10, 0x6D, 4, ID_DeleteFile); 4436 return GSM_WaitFor (s, SetAttr, 10, 0x6D, 4, ID_DeleteFile);
4355} 4437}
4356 4438
4357static GSM_Error N6510_ReplyAddFileHeader(GSM_Protocol_Message msg, GSM_StateMachine *s) 4439static GSM_Error N6510_ReplyAddFileHeader(GSM_Protocol_Message msg, GSM_StateMachine *s)
4358{ 4440{
4359 switch (msg.Buffer[3]) { 4441 switch (msg.Buffer[3]) {
4360 case 0x03: 4442 case 0x03:
4361 smprintf(s,"File header added\n"); 4443 smprintf(s,"File header added\n");
4362 sprintf(s->Phone.Data.File->ID_FullName,"%i",msg.Buffer[9]); 4444 sprintf(s->Phone.Data.File->ID_FullName,"%i",msg.Buffer[9]);
4363 return ERR_NONE; 4445 return ERR_NONE;
4364 case 0x13: 4446 case 0x13:
4365 return ERR_NONE; 4447 return ERR_NONE;
4366 } 4448 }
4367 return ERR_UNKNOWNRESPONSE; 4449 return ERR_UNKNOWNRESPONSE;
4368} 4450}
4369 4451
4370static GSM_Error N6510_ReplyAddFilePart(GSM_Protocol_Message msg, GSM_StateMachine *s) 4452static GSM_Error N6510_ReplyAddFilePart(GSM_Protocol_Message msg, GSM_StateMachine *s)
4371{ 4453{
4372 return ERR_NONE; 4454 return ERR_NONE;
4373} 4455}
4374 4456
4375static GSM_Error N6510_AddFilePart(GSM_StateMachine *s, GSM_File *File, int *Pos) 4457static GSM_Error N6510_AddFilePart(GSM_StateMachine *s, GSM_File *File, int *Pos)
4376{ 4458{
4377 GSM_Phone_N6510Data*Priv = &s->Phone.Data.Priv.N6510; 4459 GSM_Phone_N6510Data*Priv = &s->Phone.Data.Priv.N6510;
4378 GSM_File File2; 4460 GSM_File File2;
4379 GSM_Error error; 4461 GSM_Error error;
4380 int j; 4462 int j;
4381 unsigned char Header[400] = { 4463 unsigned char Header[400] = {
4382 N7110_FRAME_HEADER, 0x02, 0x00, 0x00, 0x00, 0x01, 4464 N7110_FRAME_HEADER, 0x02, 0x00, 0x00, 0x00, 0x01,
4383 0x00, 0x0C, /* parent folder ID */ 4465 0x00, 0x0C, /* parent folder ID */
4384 0x00, 0x00, 0x00, 0xE8}; 4466 0x00, 0x00, 0x00, 0xE8};
4385 unsigned char Add[15000] = { 4467 unsigned char Add[15000] = {
4386 N7110_FRAME_HEADER, 0x40, 0x00, 0x00, 0x00, 0x01, 4468 N7110_FRAME_HEADER, 0x40, 0x00, 0x00, 0x00, 0x01,
4387 0x00, 0x04, /* file ID */ 4469 0x00, 0x04, /* file ID */
4388 0x00, 0x00, 4470 0x00, 0x00,
4389 0x01, 0x28}; /* length */ 4471 0x01, 0x28}; /* length */
4390 unsigned char end[30] = { 4472 unsigned char end[30] = {
4391 N7110_FRAME_HEADER, 0x40, 0x00, 0x00, 0x00, 0x01, 4473 N7110_FRAME_HEADER, 0x40, 0x00, 0x00, 0x00, 0x01,
4392 0x00, 0x04, /* file ID */ 4474 0x00, 0x04, /* file ID */
4393 0x00, 0x00, 0x00, 0x00}; 4475 0x00, 0x00, 0x00, 0x00};
4394 4476
4395 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED; 4477 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
4396 4478
4397 s->Phone.Data.File = File; 4479 s->Phone.Data.File = File;
4398 4480
4399 if (*Pos == 0) { 4481 if (*Pos == 0) {
4400 error = N6510_SearchForFileName(s,File); 4482 error = N6510_SearchForFileName(s,File);
4401 if (error == ERR_NONE) return ERR_INVALIDLOCATION; 4483 if (error == ERR_NONE) return ERR_FILEALREADYEXIST;
4402 if (error != ERR_EMPTY) return error; 4484 if (error != ERR_EMPTY) return error;
4403 4485
4404 Header[8] = atoi(File->ID_FullName) / 256; 4486 Header[8] = atoi(File->ID_FullName) / 256;
4405 Header[9] = atoi(File->ID_FullName) % 256; 4487 Header[9] = atoi(File->ID_FullName) % 256;
4406 memset(Header+14, 0x00, 300); 4488 memset(Header+14, 0x00, 300);
4407 CopyUnicodeString(Header+14,File->Name); 4489 CopyUnicodeString(Header+14,File->Name);
4408 Header[222] = File->Used / (256*256*256); 4490 Header[222] = File->Used / (256*256*256);
4409 Header[223] = File->Used / (256*256); 4491 Header[223] = File->Used / (256*256);
4410 Header[224] = File->Used / 256; 4492 Header[224] = File->Used / 256;
4411 Header[225] = File->Used % 256; 4493 Header[225] = File->Used % 256;
4412 switch(File->Type) { 4494 switch(File->Type) {
4413 case GSM_File_Image_JPG : Header[231]=0x02; Header[233]=0x01; break; 4495 case GSM_File_Image_JPG : Header[231]=0x02; Header[233]=0x01; break;
4414 case GSM_File_Image_BMP : Header[231]=0x02; Header[233]=0x02; break; 4496 case GSM_File_Image_BMP : Header[231]=0x02; Header[233]=0x02; break;
4415 case GSM_File_Image_PNG : Header[231]=0x02; Header[233]=0x03; break; 4497 case GSM_File_Image_PNG : Header[231]=0x02; Header[233]=0x03; break;
4416 case GSM_File_Image_GIF : Header[231]=0x02; Header[233]=0x05; break; 4498 case GSM_File_Image_GIF : Header[231]=0x02; Header[233]=0x05; break;
4417 case GSM_File_Image_WBMP : Header[231]=0x02; Header[233]=0x09; break; 4499 case GSM_File_Image_WBMP : Header[231]=0x02; Header[233]=0x09; break;
4418 case GSM_File_Sound_AMR : Header[231]=0x04; Header[233]=0x01; break; 4500 case GSM_File_Sound_AMR : Header[231]=0x04; Header[233]=0x01; break;
4419 case GSM_File_Sound_MIDI : Header[231]=0x04; Header[233]=0x05; break; //Header[238]=0x01; 4501 case GSM_File_Sound_MIDI : Header[231]=0x04; Header[233]=0x05; break; //Header[238]=0x01;
4420 case GSM_File_Sound_NRT : Header[231]=0x04; Header[233]=0x06; break; 4502 case GSM_File_Sound_NRT : Header[231]=0x04; Header[233]=0x06; break;
4421 case GSM_File_Video_3GP : Header[231]=0x08; Header[233]=0x05; break; 4503 case GSM_File_Video_3GP : Header[231]=0x08; Header[233]=0x05; break;
4422 case GSM_File_Java_JAR : Header[231]=0x10; Header[233]=0x01; break; 4504 case GSM_File_Java_JAR : Header[231]=0x10; Header[233]=0x01; break;
4423#ifdef DEVELOP 4505#ifdef DEVELOP
4424 case GSM_File_MMS: 4506 case GSM_File_MMS:
4425 Header[214]=0x07; 4507 Header[214]=0x07;
4426 Header[215]=0xd3; 4508 Header[215]=0xd3;
4427 Header[216]=0x06; 4509 Header[216]=0x06;
4428 Header[217]=0x01; 4510 Header[217]=0x01;
4429 Header[218]=0x12; 4511 Header[218]=0x12;
4430 Header[219]=0x13; 4512 Header[219]=0x13;
4431 Header[220]=0x29; 4513 Header[220]=0x29;
4432 Header[233]=0x01; 4514 Header[233]=0x01;
4433 break; 4515 break;
4434#endif 4516#endif
4435 default : Header[231]=0x01; Header[233]=0x05; 4517 default : Header[231]=0x01; Header[233]=0x05;
4436 } 4518 }
4437 Header[235] = 0x01; 4519 Header[235] = 0x01;
4438 Header[236] = atoi(File->ID_FullName) / 256; 4520 Header[236] = atoi(File->ID_FullName) / 256;
4439 Header[237] = atoi(File->ID_FullName) % 256; 4521 Header[237] = atoi(File->ID_FullName) % 256;
4440 if (File->Protected) Header[238] = 0x01; //Nokia forward lock 4522 if (File->Protected) Header[238] = 0x01; //Nokia forward lock
4441 if (File->Hidden) Header[241] = 0x01; 4523 if (File->Hidden) Header[241] = 0x01;
4442 if (File->System) Header[242] = 0x01; //fixme 4524 if (File->System) Header[242] = 0x01; //fixme
4443 smprintf(s, "Adding file header\n"); 4525 smprintf(s, "Adding file header\n");
4444 error=GSM_WaitFor (s, Header, 246, 0x6D, 4, ID_AddFile); 4526 error=GSM_WaitFor (s, Header, 246, 0x6D, 4, ID_AddFile);
4445 if (error != ERR_NONE) return error; 4527 if (error != ERR_NONE) return error;
4446 } 4528 }
4447 4529
4448 j = 1000; 4530 j = 1000;
4449 if (File->Used - *Pos < 1000) j = File->Used - *Pos; 4531 if (File->Used - *Pos < 1000) j = File->Used - *Pos;
@@ -4769,97 +4851,97 @@ static GSM_Error N6510_SetGPRSAccessPoint(GSM_StateMachine *s, GSM_GPRSAccessPoi
4769 error=GSM_WaitFor (s, buff, s->Phone.Data.Priv.N6510.GPRSPointsLength, 0x43, 4, ID_SetGPRSPoint); 4851 error=GSM_WaitFor (s, buff, s->Phone.Data.Priv.N6510.GPRSPointsLength, 0x43, 4, ID_SetGPRSPoint);
4770 if (error != ERR_NONE) return error; 4852 if (error != ERR_NONE) return error;
4771 } 4853 }
4772 4854
4773 return error; 4855 return error;
4774} 4856}
4775 4857
4776/* ToDo support - 6310 style */ 4858/* ToDo support - 6310 style */
4777static GSM_Error N6510_ReplyGetToDoStatus1(GSM_Protocol_Message msg, GSM_StateMachine *s) 4859static GSM_Error N6510_ReplyGetToDoStatus1(GSM_Protocol_Message msg, GSM_StateMachine *s)
4778{ 4860{
4779 int i; 4861 int i;
4780 GSM_NOKIACalToDoLocations*Last = &s->Phone.Data.Priv.N6510.LastToDo; 4862 GSM_NOKIACalToDoLocations*Last = &s->Phone.Data.Priv.N6510.LastToDo;
4781 4863
4782 smprintf(s, "TODO locations received\n"); 4864 smprintf(s, "TODO locations received\n");
4783 Last->Number=msg.Buffer[6]*256+msg.Buffer[7]; 4865 Last->Number=msg.Buffer[6]*256+msg.Buffer[7];
4784 smprintf(s, "Number of Entries: %i\n",Last->Number); 4866 smprintf(s, "Number of Entries: %i\n",Last->Number);
4785 smprintf(s, "Locations: "); 4867 smprintf(s, "Locations: ");
4786 for (i=0;i<Last->Number;i++) { 4868 for (i=0;i<Last->Number;i++) {
4787 Last->Location[i]=msg.Buffer[12+(i*4)]*256+msg.Buffer[(i*4)+13]; 4869 Last->Location[i]=msg.Buffer[12+(i*4)]*256+msg.Buffer[(i*4)+13];
4788 smprintf(s, "%i ",Last->Location[i]); 4870 smprintf(s, "%i ",Last->Location[i]);
4789 } 4871 }
4790 smprintf(s, "\n"); 4872 smprintf(s, "\n");
4791 return ERR_NONE; 4873 return ERR_NONE;
4792} 4874}
4793 4875
4794/* ToDo support - 6310 style */ 4876/* ToDo support - 6310 style */
4795static GSM_Error N6510_GetToDoStatus1(GSM_StateMachine *s, GSM_ToDoStatus *status) 4877static GSM_Error N6510_GetToDoStatus1(GSM_StateMachine *s, GSM_ToDoStatus *status)
4796{ 4878{
4797 GSM_Error error; 4879 GSM_Error error;
4798 GSM_NOKIACalToDoLocations*LastToDo = &s->Phone.Data.Priv.N6510.LastToDo; 4880 GSM_NOKIACalToDoLocations*LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
4799 unsigned char reqLoc[] = { 4881 unsigned char reqLoc[] = {
4800 N6110_FRAME_HEADER, 4882 N6110_FRAME_HEADER,
4801 0x15, 0x01, 0x00, 0x00, 4883 0x15, 0x01, 0x00, 0x00,
4802 0x00, 0x00, 0x00}; 4884 0x00, 0x00, 0x00};
4803 4885
4804 smprintf(s, "Getting ToDo locations\n"); 4886 smprintf(s, "Getting ToDo locations\n");
4805 error = GSM_WaitFor (s, reqLoc, 10, 0x55, 4, ID_GetToDo); 4887 error = GSM_WaitFor (s, reqLoc, 10, 0x55, 4, ID_GetToDo);
4806 if (error != ERR_NONE) return error; 4888 if (error != ERR_NONE) return error;
4807 4889
4808 status->Used = LastToDo->Number; 4890 status->Used = LastToDo->Number;
4809 return ERR_NONE; 4891 return ERR_NONE;
4810} 4892}
4811 4893
4812static GSM_Error N6510_GetToDoStatus2(GSM_StateMachine *s, GSM_ToDoStatus *status) 4894static GSM_Error N6510_GetToDoStatus2(GSM_StateMachine *s, GSM_ToDoStatus *status)
4813{ 4895{
4814 GSM_NOKIACalToDoLocations*LastToDo = &s->Phone.Data.Priv.N6510.LastToDo; 4896 GSM_NOKIACalToDoLocations*LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
4815 GSM_Error error; 4897 GSM_Error error;
4816 4898
4817 error = N6510_GetCalendarInfo3(s,LastToDo,false); 4899 error = N6510_GetCalendarInfo3(s,LastToDo,1);
4818 if (error!=ERR_NONE) return error; 4900 if (error!=ERR_NONE) return error;
4819 4901
4820 status->Used = LastToDo->Number; 4902 status->Used = LastToDo->Number;
4821 return ERR_NONE; 4903 return ERR_NONE;
4822} 4904}
4823 4905
4824static GSM_Error N6510_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status) 4906static GSM_Error N6510_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
4825{ 4907{
4826 status->Used = 0; 4908 status->Used = 0;
4827 4909
4828 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) { 4910 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) {
4829 return N6510_GetToDoStatus1(s, status); 4911 return N6510_GetToDoStatus1(s, status);
4830 } else if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) { 4912 } else if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) {
4831 return N6510_GetToDoStatus2(s, status); 4913 return N6510_GetToDoStatus2(s, status);
4832 } else { 4914 } else {
4833 return ERR_NOTSUPPORTED; 4915 return ERR_NOTSUPPORTED;
4834 } 4916 }
4835} 4917}
4836 4918
4837/* ToDo support - 6310 style */ 4919/* ToDo support - 6310 style */
4838static GSM_Error N6510_ReplyGetToDo1(GSM_Protocol_Message msg, GSM_StateMachine *s) 4920static GSM_Error N6510_ReplyGetToDo1(GSM_Protocol_Message msg, GSM_StateMachine *s)
4839{ 4921{
4840 GSM_ToDoEntry *Last = s->Phone.Data.ToDo; 4922 GSM_ToDoEntry *Last = s->Phone.Data.ToDo;
4841 4923
4842 smprintf(s, "TODO received method 1\n"); 4924 smprintf(s, "TODO received method 1\n");
4843 4925
4844 switch (msg.Buffer[4]) { 4926 switch (msg.Buffer[4]) {
4845 case 1 : Last->Priority = GSM_Priority_High; break; 4927 case 1 : Last->Priority = GSM_Priority_High; break;
4846 case 2 : Last->Priority = GSM_Priority_Medium; break; 4928 case 2 : Last->Priority = GSM_Priority_Medium; break;
4847 case 3 : Last->Priority = GSM_Priority_Low; break; 4929 case 3 : Last->Priority = GSM_Priority_Low; break;
4848 default: return ERR_UNKNOWN; 4930 default: return ERR_UNKNOWN;
4849 } 4931 }
4850 smprintf(s, "Priority: %i\n",msg.Buffer[4]); 4932 smprintf(s, "Priority: %i\n",msg.Buffer[4]);
4851 4933
4852 CopyUnicodeString(Last->Entries[0].Text,msg.Buffer+14); 4934 CopyUnicodeString(Last->Entries[0].Text,msg.Buffer+14);
4853 Last->Entries[0].EntryType = TODO_TEXT; 4935 Last->Entries[0].EntryType = TODO_TEXT;
4854 Last->EntriesNum = 1; 4936 Last->EntriesNum = 1;
4855 smprintf(s, "Text: \"%s\"\n",DecodeUnicodeString(Last->Entries[0].Text)); 4937 smprintf(s, "Text: \"%s\"\n",DecodeUnicodeString(Last->Entries[0].Text));
4856 4938
4857 return ERR_NONE; 4939 return ERR_NONE;
4858} 4940}
4859 4941
4860/* ToDo support - 6310 style */ 4942/* ToDo support - 6310 style */
4861static GSM_Error N6510_GetNextToDo1(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool refresh) 4943static GSM_Error N6510_GetNextToDo1(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool refresh)
4862{ 4944{
4863 GSM_Error error; 4945 GSM_Error error;
4864 GSM_ToDoStatus status; 4946 GSM_ToDoStatus status;
4865 GSM_NOKIACalToDoLocations*LastToDo = &s->Phone.Data.Priv.N6510.LastToDo; 4947 GSM_NOKIACalToDoLocations*LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
@@ -4899,196 +4981,187 @@ static GSM_Error N6510_ReplyGetToDo2(GSM_Protocol_Message msg, GSM_StateMachine
4899 smprintf(s, "ToDo received method 2\n"); 4981 smprintf(s, "ToDo received method 2\n");
4900 4982
4901 switch (msg.Buffer[44]) { 4983 switch (msg.Buffer[44]) {
4902 case 0x10: Last->Priority = GSM_Priority_Low; break; 4984 case 0x10: Last->Priority = GSM_Priority_Low; break;
4903 case 0x20: Last->Priority = GSM_Priority_Medium; break; 4985 case 0x20: Last->Priority = GSM_Priority_Medium; break;
4904 case 0x30: Last->Priority = GSM_Priority_High; break; 4986 case 0x30: Last->Priority = GSM_Priority_High; break;
4905 default : return ERR_UNKNOWN; 4987 default : return ERR_UNKNOWN;
4906 } 4988 }
4907 4989
4908 memcpy(Last->Entries[0].Text,msg.Buffer+54,msg.Buffer[51]*2); 4990 memcpy(Last->Entries[0].Text,msg.Buffer+54,msg.Buffer[51]*2);
4909 Last->Entries[0].Text[msg.Buffer[51]*2] = 0; 4991 Last->Entries[0].Text[msg.Buffer[51]*2] = 0;
4910 Last->Entries[0].Text[msg.Buffer[51]*2+1] = 0; 4992 Last->Entries[0].Text[msg.Buffer[51]*2+1] = 0;
4911 Last->Entries[0].EntryType = TODO_TEXT; 4993 Last->Entries[0].EntryType = TODO_TEXT;
4912 smprintf(s, "Text: \"%s\"\n",DecodeUnicodeString(Last->Entries[0].Text)); 4994 smprintf(s, "Text: \"%s\"\n",DecodeUnicodeString(Last->Entries[0].Text));
4913 4995
4914 smprintf(s,"EndTime: %04i-%02i-%02i %02i:%02i\n", 4996 smprintf(s,"EndTime: %04i-%02i-%02i %02i:%02i\n",
4915 msg.Buffer[34]*256+msg.Buffer[35], 4997 msg.Buffer[34]*256+msg.Buffer[35],
4916 msg.Buffer[36],msg.Buffer[37],msg.Buffer[38], 4998 msg.Buffer[36],msg.Buffer[37],msg.Buffer[38],
4917 msg.Buffer[39]); 4999 msg.Buffer[39]);
4918 Date.Year = msg.Buffer[34]*256+msg.Buffer[35]; 5000 Date.Year = msg.Buffer[34]*256+msg.Buffer[35];
4919 Date.Month = msg.Buffer[36]; 5001 Date.Month = msg.Buffer[36];
4920 Date.Day = msg.Buffer[37]; 5002 Date.Day = msg.Buffer[37];
4921 Date.Hour = msg.Buffer[38]; 5003 Date.Hour = msg.Buffer[38];
4922 Date.Minute = msg.Buffer[39]; 5004 Date.Minute = msg.Buffer[39];
4923 Date.Second= 0; 5005 Date.Second= 0;
4924 Last->Entries[1].EntryType = TODO_END_DATETIME; 5006 Last->Entries[1].EntryType = TODO_END_DATETIME;
4925 memcpy(&Last->Entries[1].Date,&Date,sizeof(GSM_DateTime)); 5007 memcpy(&Last->Entries[1].Date,&Date,sizeof(GSM_DateTime));
4926 5008
4927 smprintf(s,"StartTime: %04i-%02i-%02i %02i:%02i\n", 5009 smprintf(s,"StartTime: %04i-%02i-%02i %02i:%02i\n",
4928 msg.Buffer[28]*256+msg.Buffer[29], 5010 msg.Buffer[28]*256+msg.Buffer[29],
4929 msg.Buffer[30],msg.Buffer[31],msg.Buffer[32], 5011 msg.Buffer[30],msg.Buffer[31],msg.Buffer[32],
4930 msg.Buffer[33]); 5012 msg.Buffer[33]);
4931 Date.Year = msg.Buffer[28]*256+msg.Buffer[29]; 5013 Date.Year = msg.Buffer[28]*256+msg.Buffer[29];
4932 Date.Month = msg.Buffer[30]; 5014 Date.Month = msg.Buffer[30];
4933 Date.Day = msg.Buffer[31]; 5015 Date.Day = msg.Buffer[31];
4934 Date.Hour = msg.Buffer[32]; 5016 Date.Hour = msg.Buffer[32];
4935 Date.Minute = msg.Buffer[33]; 5017 Date.Minute = msg.Buffer[33];
4936 Date.Second= 0; 5018 Date.Second= 0;
4937 5019
4938 Last->EntriesNum = 2; 5020 Last->EntriesNum = 2;
4939 5021
4940 if (msg.Buffer[45] == 0x01) { 5022 if (msg.Buffer[45] == 0x01) {
4941 Last->Entries[2].Number = msg.Buffer[45]; 5023 Last->Entries[2].Number = msg.Buffer[45];
4942 Last->Entries[2].EntryType = TODO_COMPLETED; 5024 Last->Entries[2].EntryType = TODO_COMPLETED;
4943 Last->EntriesNum++; 5025 Last->EntriesNum++;
4944 smprintf(s,"Completed\n"); 5026 smprintf(s,"Completed\n");
4945 } 5027 }
4946 5028
4947 if (msg.Buffer[14] == 0xFF && msg.Buffer[15] == 0xFF && msg.Buffer[16] == 0xff && msg.Buffer[17] == 0xff) 5029 if (msg.Buffer[14] == 0xFF && msg.Buffer[15] == 0xFF && msg.Buffer[16] == 0xff && msg.Buffer[17] == 0xff) {
4948 {
4949 smprintf(s, "No alarm\n"); 5030 smprintf(s, "No alarm\n");
4950 } else { 5031 } else {
4951 diff = ((unsigned int)msg.Buffer[14]) << 24; 5032 diff = ((unsigned int)msg.Buffer[14]) << 24;
4952 diff += ((unsigned int)msg.Buffer[15]) << 16; 5033 diff += ((unsigned int)msg.Buffer[15]) << 16;
4953 diff += ((unsigned int)msg.Buffer[16]) << 8; 5034 diff += ((unsigned int)msg.Buffer[16]) << 8;
4954 diff += msg.Buffer[17]; 5035 diff += msg.Buffer[17];
4955 5036
4956 memcpy(&Last->Entries[Last->EntriesNum].Date,&Date,sizeof(GSM_DateTime)); 5037 memcpy(&Last->Entries[Last->EntriesNum].Date,&Date,sizeof(GSM_DateTime));
4957 GetTimeDifference(diff, &Last->Entries[Last->EntriesNum].Date, false, 60); 5038 GetTimeDifference(diff, &Last->Entries[Last->EntriesNum].Date, false, 60);
4958 smprintf(s, "Alarm date : %02i-%02i-%04i %02i:%02i:%02i\n", 5039 smprintf(s, "Alarm date : %02i-%02i-%04i %02i:%02i:%02i\n",
4959 Last->Entries[Last->EntriesNum].Date.Day, Last->Entries[Last->EntriesNum].Date.Month, 5040 Last->Entries[Last->EntriesNum].Date.Day, Last->Entries[Last->EntriesNum].Date.Month,
4960 Last->Entries[Last->EntriesNum].Date.Year, Last->Entries[Last->EntriesNum].Date.Hour, 5041 Last->Entries[Last->EntriesNum].Date.Year, Last->Entries[Last->EntriesNum].Date.Hour,
4961 Last->Entries[Last->EntriesNum].Date.Minute,Last->Entries[Last->EntriesNum].Date.Second); 5042 Last->Entries[Last->EntriesNum].Date.Minute,Last->Entries[Last->EntriesNum].Date.Second);
4962 5043
4963 Last->Entries[Last->EntriesNum].EntryType = TODO_ALARM_DATETIME; 5044 Last->Entries[Last->EntriesNum].EntryType = TODO_ALARM_DATETIME;
4964 if (msg.Buffer[22]==0x00 && msg.Buffer[23]==0x00 && 5045 if (msg.Buffer[22]==0x00 && msg.Buffer[23]==0x00 &&
4965 msg.Buffer[24]==0x00 && msg.Buffer[25]==0x00) 5046 msg.Buffer[24]==0x00 && msg.Buffer[25]==0x00)
4966 { 5047 {
4967 Last->Entries[Last->EntriesNum].EntryType = TODO_SILENT_ALARM_DATETIME; 5048 Last->Entries[Last->EntriesNum].EntryType = TODO_SILENT_ALARM_DATETIME;
4968 smprintf(s, "Alarm type : Silent\n"); 5049 smprintf(s, "Alarm type : Silent\n");
4969 } 5050 }
4970 Last->EntriesNum++; 5051 Last->EntriesNum++;
4971 } 5052 }
4972 5053
4973 return ERR_NONE; 5054 return ERR_NONE;
4974} 5055}
4975 5056
4976/* ToDo support - 6610 style */ 5057/* ToDo support - 6610 style */
4977static GSM_Error N6510_GetNextToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool refresh) 5058static GSM_Error N6510_GetNextToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool refresh)
4978{ 5059{
4979 GSM_Error error; 5060 GSM_Error error;
4980 GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo; 5061 GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
4981 /* The same to getting calendar method 3 */
4982 unsigned char req[] = {
4983 N6110_FRAME_HEADER,0x7D,0x00,0x00,0x00,0x00,
4984 0x00,0x99, /* Location */
4985 0xff,0xff,0xff,0xff,0x01};
4986 5062
4987 if (refresh) { 5063 if (refresh) {
4988 error=N6510_GetCalendarInfo3(s,LastToDo,false); 5064 error=N6510_GetCalendarInfo3(s,LastToDo,1);
4989 if (error!=ERR_NONE) return error; 5065 if (error!=ERR_NONE) return error;
4990 ToDo->Location = 1; 5066 ToDo->Location = 1;
4991 } else { 5067 } else {
4992 ToDo->Location++; 5068 ToDo->Location++;
4993 } 5069 }
4994 5070
4995 if (ToDo->Location > LastToDo->Number) return ERR_EMPTY; 5071 if (ToDo->Location > LastToDo->Number) return ERR_EMPTY;
4996 5072
4997 req[8] = LastToDo->Location[ToDo->Location-1] / 256;
4998 req[9] = LastToDo->Location[ToDo->Location-1] % 256;
4999
5000 s->Phone.Data.ToDo = ToDo; 5073 s->Phone.Data.ToDo = ToDo;
5001 smprintf(s, "Getting todo method 2\n"); 5074 smprintf(s, "Getting todo method 2\n");
5002 return GSM_WaitFor (s, req, 15, 0x13, 4, ID_GetToDo); 5075 return N6510_PrivGetGenericCalendar3(s, LastToDo->Location[ToDo->Location-1], ID_GetToDo);
5003} 5076}
5004 5077
5005static GSM_Error N6510_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool refresh) 5078static GSM_Error N6510_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, bool refresh)
5006{ 5079{
5007 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) { 5080 if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) {
5008 return N6510_GetNextToDo1(s, ToDo, refresh); 5081 return N6510_GetNextToDo1(s, ToDo, refresh);
5009 } else if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) { 5082 } else if (IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) {
5010 return N6510_GetNextToDo2(s, ToDo, refresh); 5083 return N6510_GetNextToDo2(s, ToDo, refresh);
5011 } else { 5084 } else {
5012 return ERR_NOTSUPPORTED; 5085 return ERR_NOTSUPPORTED;
5013 } 5086 }
5014} 5087}
5015 5088
5016/* ToDo support - 6310 style */ 5089/* ToDo support - 6310 style */
5017static GSM_Error N6510_ReplyDeleteAllToDo1(GSM_Protocol_Message msg, GSM_StateMachine *s) 5090static GSM_Error N6510_ReplyDeleteAllToDo1(GSM_Protocol_Message msg, GSM_StateMachine *s)
5018{ 5091{
5019 smprintf(s, "All TODO deleted\n"); 5092 smprintf(s, "All TODO deleted\n");
5020 return ERR_NONE; 5093 return ERR_NONE;
5021} 5094}
5022 5095
5023/* ToDo support - 6310 style */ 5096/* ToDo support - 6310 style */
5024static GSM_Error N6510_DeleteAllToDo1(GSM_StateMachine *s) 5097static GSM_Error N6510_DeleteAllToDo1(GSM_StateMachine *s)
5025{ 5098{
5026 unsigned char req[] = {N6110_FRAME_HEADER, 0x11}; 5099 unsigned char req[] = {N6110_FRAME_HEADER, 0x11};
5027 5100
5028 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) { 5101 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) {
5029 return ERR_NOTSUPPORTED; 5102 return ERR_NOTSUPPORTED;
5030 } 5103 }
5031 5104
5032 smprintf(s, "Deleting all ToDo method 1\n"); 5105 smprintf(s, "Deleting all ToDo method 1\n");
5033 return GSM_WaitFor (s, req, 4, 0x55, 4, ID_DeleteAllToDo); 5106 return GSM_WaitFor (s, req, 4, 0x55, 4, ID_DeleteAllToDo);
5034} 5107}
5035 5108
5036static GSM_Error N6510_DeleteToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo) 5109static GSM_Error N6510_DeleteToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
5037{ 5110{
5038 GSM_Error error; 5111 GSM_Error error;
5039 GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo; 5112 GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
5040 GSM_CalendarEntry Note; 5113 GSM_CalendarEntry Note;
5041 5114
5042 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) { 5115 if (!IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) {
5043 return ERR_NOTSUPPORTED; 5116 return ERR_NOTSUPPORTED;
5044 } 5117 }
5045 5118
5046 error=N6510_GetCalendarInfo3(s,LastToDo,false); 5119 error=N6510_GetCalendarInfo3(s,LastToDo,1);
5047 if (error!=ERR_NONE) return error; 5120 if (error!=ERR_NONE) return error;
5048 5121
5049 smprintf(s, "Deleting ToDo method 2\n"); 5122 smprintf(s, "Deleting ToDo method 2\n");
5050 5123
5051 if (ToDo->Location > LastToDo->Number || ToDo->Location == 0) return ERR_INVALIDLOCATION; 5124 if (ToDo->Location > LastToDo->Number || ToDo->Location == 0) return ERR_INVALIDLOCATION;
5052 5125
5053 Note.Location = LastToDo->Location[ToDo->Location-1]; 5126 Note.Location = LastToDo->Location[ToDo->Location-1];
5054 return N71_65_DelCalendar(s,&Note); 5127 return N71_65_DelCalendar(s,&Note);
5055} 5128}
5056 5129
5057/* ToDo support - 6310 style */ 5130/* ToDo support - 6310 style */
5058static GSM_Error N6510_ReplyGetToDoFirstLoc1(GSM_Protocol_Message msg, GSM_StateMachine *s) 5131static GSM_Error N6510_ReplyGetToDoFirstLoc1(GSM_Protocol_Message msg, GSM_StateMachine *s)
5059{ 5132{
5060 smprintf(s, "TODO first location received method 1: %02x\n",msg.Buffer[9]); 5133 smprintf(s, "TODO first location received method 1: %02x\n",msg.Buffer[9]);
5061 s->Phone.Data.ToDo->Location = msg.Buffer[9]; 5134 s->Phone.Data.ToDo->Location = msg.Buffer[9];
5062 return ERR_NONE; 5135 return ERR_NONE;
5063} 5136}
5064 5137
5065/* ToDo support - 6310 style */ 5138/* ToDo support - 6310 style */
5066static GSM_Error N6510_ReplyAddToDo1(GSM_Protocol_Message msg, GSM_StateMachine *s) 5139static GSM_Error N6510_ReplyAddToDo1(GSM_Protocol_Message msg, GSM_StateMachine *s)
5067{ 5140{
5068 smprintf(s, "TODO set OK\n"); 5141 smprintf(s, "TODO set OK\n");
5069 return ERR_NONE; 5142 return ERR_NONE;
5070} 5143}
5071 5144
5072/* ToDo support - 6310 style */ 5145/* ToDo support - 6310 style */
5073static GSM_Error N6510_AddToDo1(GSM_StateMachine *s, GSM_ToDoEntry *ToDo) 5146static GSM_Error N6510_AddToDo1(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
5074{ 5147{
5075 int Text, Alarm, EndTime, Completed, ulen, Phone; 5148 int Text, Alarm, EndTime, Completed, ulen, Phone;
5076 GSM_Error error; 5149 GSM_Error error;
5077 unsigned char reqLoc[] = {N6110_FRAME_HEADER, 0x0F}; 5150 unsigned char reqLoc[] = {N6110_FRAME_HEADER, 0x0F};
5078 unsigned char reqSet[500] = { 5151 unsigned char reqSet[500] = {
5079 N6110_FRAME_HEADER, 0x01, 5152 N6110_FRAME_HEADER, 0x01,
5080 0x03, /* Priority */ 5153 0x03, /* Priority */
5081 0x00, /* Length of text */ 5154 0x00, /* Length of text */
5082 0x80,0x00,0x00, 5155 0x80,0x00,0x00,
5083 0x18}; /* Location */ 5156 0x18}; /* Location */
5084 5157
5085 s->Phone.Data.ToDo = ToDo; 5158 s->Phone.Data.ToDo = ToDo;
5086 5159
5087 smprintf(s, "Getting first ToDo location\n"); 5160 smprintf(s, "Getting first ToDo location\n");
5088 error = GSM_WaitFor (s, reqLoc, 4, 0x55, 4, ID_SetToDo); 5161 error = GSM_WaitFor (s, reqLoc, 4, 0x55, 4, ID_SetToDo);
5089 if (error != ERR_NONE) return error; 5162 if (error != ERR_NONE) return error;
5090 reqSet[9] = ToDo->Location; 5163 reqSet[9] = ToDo->Location;
5091 5164
5092 switch (ToDo->Priority) { 5165 switch (ToDo->Priority) {
5093 case GSM_Priority_Low: reqSet[4] = 3; break; 5166 case GSM_Priority_Low: reqSet[4] = 3; break;
5094 case GSM_Priority_Medium: reqSet[4] = 2; break; 5167 case GSM_Priority_Medium: reqSet[4] = 2; break;
@@ -5406,160 +5479,168 @@ static GSM_Error N6510_SetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *book
5406 5479
5407 smprintf(s, "Setting WAP bookmark\n"); 5480 smprintf(s, "Setting WAP bookmark\n");
5408 error = GSM_WaitFor (s, req, count, 0x3f, 4, ID_SetWAPBookmark); 5481 error = GSM_WaitFor (s, req, count, 0x3f, 4, ID_SetWAPBookmark);
5409 if (error != ERR_NONE) { 5482 if (error != ERR_NONE) {
5410 if (error == ERR_INSIDEPHONEMENU || error == ERR_EMPTY || error == ERR_FULL) { 5483 if (error == ERR_INSIDEPHONEMENU || error == ERR_EMPTY || error == ERR_FULL) {
5411 DCT3DCT4_DisableConnectionFunctions(s); 5484 DCT3DCT4_DisableConnectionFunctions(s);
5412 } 5485 }
5413 return error; 5486 return error;
5414 } 5487 }
5415 5488
5416 return DCT3DCT4_DisableConnectionFunctions(s); 5489 return DCT3DCT4_DisableConnectionFunctions(s);
5417} 5490}
5418 5491
5419GSM_Error N6510_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark) 5492GSM_Error N6510_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
5420{ 5493{
5421 GSM_Error error; 5494 GSM_Error error;
5422 5495
5423 /* We have to enable WAP frames in phone */ 5496 /* We have to enable WAP frames in phone */
5424 error=N6510_EnableConnectionFunctions(s,N6510_WAP_SETTINGS); 5497 error=N6510_EnableConnectionFunctions(s,N6510_WAP_SETTINGS);
5425 if (error!=ERR_NONE) return error; 5498 if (error!=ERR_NONE) return error;
5426 5499
5427 return DCT3DCT4_DeleteWAPBookmarkPart(s,bookmark); 5500 return DCT3DCT4_DeleteWAPBookmarkPart(s,bookmark);
5428} 5501}
5429 5502
5430GSM_Error N6510_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark) 5503GSM_Error N6510_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
5431{ 5504{
5432 GSM_Error error; 5505 GSM_Error error;
5433 5506
5434 /* We have to enable WAP frames in phone */ 5507 /* We have to enable WAP frames in phone */
5435 error=N6510_EnableConnectionFunctions(s,N6510_WAP_SETTINGS); 5508 error=N6510_EnableConnectionFunctions(s,N6510_WAP_SETTINGS);
5436 if (error!=ERR_NONE) return error; 5509 if (error!=ERR_NONE) return error;
5437 5510
5438 return DCT3DCT4_GetWAPBookmarkPart(s,bookmark); 5511 return DCT3DCT4_GetWAPBookmarkPart(s,bookmark);
5439} 5512}
5440 5513
5441static GSM_Reply_Function N6510ReplyFunctions[] = { 5514static GSM_Reply_Function N6510ReplyFunctions[] = {
5442 {N71_65_ReplyCallInfo, "\x01",0x03,0x02,ID_IncomingFrame }, 5515 {N71_65_ReplyCallInfo, "\x01",0x03,0x02,ID_IncomingFrame },
5443 {N71_65_ReplyCallInfo, "\x01",0x03,0x03,ID_IncomingFrame }, 5516 {N71_65_ReplyCallInfo, "\x01",0x03,0x03,ID_IncomingFrame },
5444 {N71_65_ReplyCallInfo, "\x01",0x03,0x04,ID_IncomingFrame }, 5517 {N71_65_ReplyCallInfo, "\x01",0x03,0x04,ID_IncomingFrame },
5445 {N71_65_ReplyCallInfo, "\x01",0x03,0x05,ID_IncomingFrame }, 5518 {N71_65_ReplyCallInfo, "\x01",0x03,0x05,ID_IncomingFrame },
5446 {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_AnswerCall }, 5519 {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_AnswerCall },
5447 {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_IncomingFrame }, 5520 {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_IncomingFrame },
5448 {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_CancelCall }, 5521 {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_CancelCall },
5449 {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_IncomingFrame }, 5522 {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_IncomingFrame },
5450 {N71_65_ReplyCallInfo, "\x01",0x03,0x0A,ID_IncomingFrame }, 5523 {N71_65_ReplyCallInfo, "\x01",0x03,0x0A,ID_IncomingFrame },
5451 {N71_65_ReplyCallInfo, "\x01",0x03,0x0B,ID_IncomingFrame }, 5524 {N71_65_ReplyCallInfo, "\x01",0x03,0x0B,ID_IncomingFrame },
5452 {N71_65_ReplyCallInfo, "\x01",0x03,0x0C,ID_DialVoice }, 5525 {N71_65_ReplyCallInfo, "\x01",0x03,0x0C,ID_DialVoice },
5453 {N71_65_ReplyCallInfo, "\x01",0x03,0x0C,ID_IncomingFrame }, 5526 {N71_65_ReplyCallInfo, "\x01",0x03,0x0C,ID_IncomingFrame },
5527 {N71_65_ReplyCallInfo, "\x01",0x03,0x0F,ID_IncomingFrame },
5528 {N71_65_ReplyCallInfo, "\x01",0x03,0x10,ID_DialVoice },
5529 {N71_65_ReplyCallInfo, "\x01",0x03,0x10,ID_IncomingFrame },
5454 {N71_65_ReplyCallInfo, "\x01",0x03,0x23,ID_IncomingFrame }, 5530 {N71_65_ReplyCallInfo, "\x01",0x03,0x23,ID_IncomingFrame },
5455 {N71_65_ReplyCallInfo, "\x01",0x03,0x25,ID_IncomingFrame }, 5531 {N71_65_ReplyCallInfo, "\x01",0x03,0x25,ID_IncomingFrame },
5456 {N71_65_ReplyCallInfo, "\x01",0x03,0x27,ID_IncomingFrame }, 5532 {N71_65_ReplyCallInfo, "\x01",0x03,0x27,ID_IncomingFrame },
5457 {N71_65_ReplySendDTMF, "\x01",0x03,0x51,ID_SendDTMF }, 5533 {N71_65_ReplySendDTMF, "\x01",0x03,0x51,ID_SendDTMF },
5458 {N71_65_ReplyCallInfo, "\x01",0x03,0x53,ID_IncomingFrame }, 5534 {N71_65_ReplyCallInfo, "\x01",0x03,0x53,ID_IncomingFrame },
5459 {N71_65_ReplySendDTMF, "\x01",0x03,0x59,ID_SendDTMF }, 5535 {N71_65_ReplySendDTMF, "\x01",0x03,0x59,ID_SendDTMF },
5460 {N71_65_ReplySendDTMF, "\x01",0x03,0x5E,ID_SendDTMF }, 5536 {N71_65_ReplySendDTMF, "\x01",0x03,0x5E,ID_SendDTMF },
5537 {N71_65_ReplyCallInfo, "\x01",0x03,0xA6,ID_IncomingFrame },
5538 {N71_65_ReplyCallInfo, "\x01",0x03,0xD2,ID_IncomingFrame },
5539 {N71_65_ReplyCallInfo, "\x01",0x03,0xD3,ID_IncomingFrame },
5461 5540
5462 {N6510_ReplySendSMSMessage, "\x02",0x03,0x03,ID_IncomingFrame }, 5541 {N6510_ReplySendSMSMessage, "\x02",0x03,0x03,ID_IncomingFrame },
5463 {N6510_ReplyIncomingSMS, "\x02",0x03,0x04,ID_IncomingFrame }, 5542 {N6510_ReplyIncomingSMS, "\x02",0x03,0x04,ID_IncomingFrame },
5464 {N6510_ReplySetSMSC, "\x02",0x03,0x13,ID_SetSMSC }, 5543 {N6510_ReplySetSMSC, "\x02",0x03,0x13,ID_SetSMSC },
5465 {N6510_ReplyGetSMSC, "\x02",0x03,0x15,ID_GetSMSC }, 5544 {N6510_ReplyGetSMSC, "\x02",0x03,0x15,ID_GetSMSC },
5466 5545
5467 {N6510_ReplyGetMemoryStatus, "\x03",0x03,0x04,ID_GetMemoryStatus }, 5546 {N6510_ReplyGetMemoryStatus, "\x03",0x03,0x04,ID_GetMemoryStatus },
5468 {N6510_ReplyGetMemory, "\x03",0x03,0x08,ID_GetMemory }, 5547 {N6510_ReplyGetMemory, "\x03",0x03,0x08,ID_GetMemory },
5469 {N6510_ReplyDeleteMemory, "\x03",0x03,0x10,ID_SetMemory }, 5548 {N6510_ReplyDeleteMemory, "\x03",0x03,0x10,ID_SetMemory },
5470 {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetBitmap }, 5549 {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetBitmap },
5471 {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetMemory }, 5550 {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetMemory },
5472 5551
5473 {DCT3DCT4_ReplyCallDivert, "\x06",0x03,0x02,ID_Divert }, 5552 {DCT3DCT4_ReplyCallDivert, "\x06",0x03,0x02,ID_Divert },
5474 {N71_65_ReplyUSSDInfo, "\x06",0x03,0x03,ID_IncomingFrame }, 5553 {N71_65_ReplyUSSDInfo, "\x06",0x03,0x03,ID_IncomingFrame },
5475 {NoneReply, "\x06",0x03,0x06,ID_IncomingFrame }, 5554 {NoneReply, "\x06",0x03,0x06,ID_IncomingFrame },
5476 {NoneReply, "\x06",0x03,0x09,ID_IncomingFrame }, 5555 {NoneReply, "\x06",0x03,0x09,ID_IncomingFrame },
5477 5556
5478 {N6510_ReplyEnterSecurityCode, "\x08",0x03,0x08,ID_EnterSecurityCode }, 5557 {N6510_ReplyEnterSecurityCode, "\x08",0x03,0x08,ID_EnterSecurityCode },
5479 {N6510_ReplyEnterSecurityCode, "\x08",0x03,0x09,ID_EnterSecurityCode }, 5558 {N6510_ReplyEnterSecurityCode, "\x08",0x03,0x09,ID_EnterSecurityCode },
5480 {N6510_ReplyGetSecurityStatus, "\x08",0x03,0x12,ID_GetSecurityStatus }, 5559 {N6510_ReplyGetSecurityStatus, "\x08",0x03,0x12,ID_GetSecurityStatus },
5481 5560
5482 {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0x01,ID_GetNetworkInfo }, 5561 {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0x01,ID_GetNetworkInfo },
5483 {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0x01,ID_IncomingFrame }, 5562 {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0x01,ID_IncomingFrame },
5484 {N6510_ReplyLogIntoNetwork, "\x0A",0x03,0x02,ID_IncomingFrame }, 5563 {N6510_ReplyLogIntoNetwork, "\x0A",0x03,0x02,ID_IncomingFrame },
5485 {N6510_ReplyGetSignalQuality, "\x0A",0x03,0x0C,ID_GetSignalQuality }, 5564 {N6510_ReplyGetSignalQuality, "\x0A",0x03,0x0C,ID_GetSignalQuality },
5486 {N6510_ReplyGetIncSignalQuality, "\x0A",0x03,0x1E,ID_IncomingFrame }, 5565 {N6510_ReplyGetIncSignalQuality, "\x0A",0x03,0x1E,ID_IncomingFrame },
5487 {NoneReply, "\x0A",0x03,0x20,ID_IncomingFrame }, 5566 {NoneReply, "\x0A",0x03,0x20,ID_IncomingFrame },
5488 {N6510_ReplyGetOperatorLogo, "\x0A",0x03,0x24,ID_GetBitmap }, 5567 {N6510_ReplyGetOperatorLogo, "\x0A",0x03,0x24,ID_GetBitmap },
5489 {N6510_ReplySetOperatorLogo, "\x0A",0x03,0x26,ID_SetBitmap }, 5568 {N6510_ReplySetOperatorLogo, "\x0A",0x03,0x26,ID_SetBitmap },
5490 5569
5491 {NoneReply, "\x0B",0x03,0x01,ID_PlayTone }, 5570 {NoneReply, "\x0B",0x03,0x01,ID_PlayTone },
5492 {NoneReply, "\x0B",0x03,0x15,ID_PlayTone }, 5571 {NoneReply, "\x0B",0x03,0x15,ID_PlayTone },
5493 {NoneReply, "\x0B",0x03,0x16,ID_PlayTone }, 5572 {NoneReply, "\x0B",0x03,0x16,ID_PlayTone },
5494 5573
5495 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x02,ID_SetCalendarNote }, 5574 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x02,ID_SetCalendarNote },
5496 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x04,ID_SetCalendarNote }, 5575 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x04,ID_SetCalendarNote },
5497 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x06,ID_SetCalendarNote }, 5576 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x06,ID_SetCalendarNote },
5498 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x08,ID_SetCalendarNote }, 5577 {N71_65_ReplyAddCalendar1, "\x13",0x03,0x08,ID_SetCalendarNote },
5499 {N71_65_ReplyDelCalendar, "\x13",0x03,0x0C,ID_DeleteCalendarNote }, 5578 {N71_65_ReplyDelCalendar, "\x13",0x03,0x0C,ID_DeleteCalendarNote },
5500 {N71_65_ReplyGetNextCalendar1, "\x13",0x03,0x1A,ID_GetCalendarNote },/*method 1*/ 5579 {N71_65_ReplyGetNextCalendar1, "\x13",0x03,0x1A,ID_GetCalendarNote },/*method 1*/
5501 {N6510_ReplyGetCalendarNotePos, "\x13",0x03,0x32,ID_GetCalendarNotePos },/*method 1*/ 5580 {N6510_ReplyGetCalendarNotePos, "\x13",0x03,0x32,ID_GetCalendarNotePos },/*method 1*/
5502 {N6510_ReplyGetCalendarInfo, "\x13",0x03,0x3B,ID_GetCalendarNotesInfo},/*method 1*/ 5581 {N6510_ReplyGetCalendarInfo, "\x13",0x03,0x3B,ID_GetCalendarNotesInfo},/*method 1*/
5503#ifdef DEBUG 5582#ifdef DEBUG
5504 {N71_65_ReplyGetNextCalendar2, "\x13",0x03,0x3F,ID_GetCalendarNote }, 5583 {N71_65_ReplyGetNextCalendar2, "\x13",0x03,0x3F,ID_GetCalendarNote },
5505#endif 5584#endif
5506 {N71_65_ReplyAddCalendar2, "\x13",0x03,0x41,ID_SetCalendarNote },/*method 2*/ 5585 {N71_65_ReplyAddCalendar2, "\x13",0x03,0x41,ID_SetCalendarNote },/*method 2*/
5507 {N6510_ReplyAddCalendar3, "\x13",0x03,0x66,ID_SetCalendarNote },/*method 3*/ 5586 {N6510_ReplyAddCalendar3, "\x13",0x03,0x66,ID_SetCalendarNote },/*method 3*/
5508 {N6510_ReplyAddToDo2, "\x13",0x03,0x66,ID_SetToDo }, 5587 {N6510_ReplyAddToDo2, "\x13",0x03,0x66,ID_SetToDo },
5509 {N6510_ReplyGetCalendar3, "\x13",0x03,0x7E,ID_GetCalendarNote },/*method 3*/ 5588 {N6510_ReplyGetCalendar3, "\x13",0x03,0x7E,ID_GetCalendarNote },/*method 3*/
5510 {N6510_ReplyGetToDo2, "\x13",0x03,0x7E,ID_GetToDo }, 5589 {N6510_ReplyGetToDo2, "\x13",0x03,0x7E,ID_GetToDo },
5590 {N6510_ReplyGetNote, "\x13",0x03,0x7E,ID_GetNote },
5511 {N6510_ReplyGetCalendarSettings, "\x13",0x03,0x86,ID_GetCalendarSettings }, 5591 {N6510_ReplyGetCalendarSettings, "\x13",0x03,0x86,ID_GetCalendarSettings },
5512 {N6510_ReplyGetLocale, "\x13",0x03,0x8A,ID_GetLocale }, 5592 {N6510_ReplyGetLocale, "\x13",0x03,0x8A,ID_GetLocale },
5513 {N6510_ReplyGetCalendarSettings, "\x13",0x03,0x8E,ID_GetCalendarSettings }, 5593 {N6510_ReplyGetCalendarSettings, "\x13",0x03,0x8E,ID_GetCalendarSettings },
5514 {N6510_ReplyGetCalendarNotePos, "\x13",0x03,0x96,ID_GetCalendarNotePos },/*method 3*/ 5594 {N6510_ReplyGetCalendarNotePos, "\x13",0x03,0x96,ID_GetCalendarNotePos },/*method 3*/
5515 {N6510_ReplyGetToDoFirstLoc2, "\x13",0x03,0x96,ID_SetToDo }, 5595 {N6510_ReplyGetToDoFirstLoc2, "\x13",0x03,0x96,ID_SetToDo },
5516 {N6510_ReplyGetCalendarInfo, "\x13",0x03,0x9F,ID_GetCalendarNotesInfo},/*method 3*/ 5596 {N6510_ReplyGetCalendarInfo, "\x13",0x03,0x9F,ID_GetCalendarNotesInfo},/*method 3*/
5517 {N6510_ReplyGetToDoStatus2, "\x13",0x03,0x9F,ID_GetToDo }, 5597 {N6510_ReplyGetToDoStatus2, "\x13",0x03,0x9F,ID_GetToDo },
5598 {N6510_ReplyGetNoteInfo, "\x13",0x03,0x9F,ID_GetNote },
5518 5599
5519 {N6510_ReplySaveSMSMessage, "\x14",0x03,0x01,ID_SaveSMSMessage }, 5600 {N6510_ReplySaveSMSMessage, "\x14",0x03,0x01,ID_SaveSMSMessage },
5520 {N6510_ReplySetPicture, "\x14",0x03,0x01,ID_SetBitmap }, 5601 {N6510_ReplySetPicture, "\x14",0x03,0x01,ID_SetBitmap },
5521 {N6510_ReplyGetSMSMessage, "\x14",0x03,0x03,ID_GetSMSMessage }, 5602 {N6510_ReplyGetSMSMessage, "\x14",0x03,0x03,ID_GetSMSMessage },
5522 {N6510_ReplyDeleteSMSMessage, "\x14",0x03,0x05,ID_DeleteSMSMessage }, 5603 {N6510_ReplyDeleteSMSMessage, "\x14",0x03,0x05,ID_DeleteSMSMessage },
5523 {N6510_ReplyDeleteSMSMessage, "\x14",0x03,0x06,ID_DeleteSMSMessage }, 5604 {N6510_ReplyDeleteSMSMessage, "\x14",0x03,0x06,ID_DeleteSMSMessage },
5524 {N6510_ReplyGetSMSStatus, "\x14",0x03,0x09,ID_GetSMSStatus }, 5605 {N6510_ReplyGetSMSStatus, "\x14",0x03,0x09,ID_GetSMSStatus },
5525 {N6510_ReplyGetSMSFolderStatus, "\x14",0x03,0x0d,ID_GetSMSFolderStatus }, 5606 {N6510_ReplyGetSMSFolderStatus, "\x14",0x03,0x0d,ID_GetSMSFolderStatus },
5526 {N6510_ReplyGetSMSMessage, "\x14",0x03,0x0f,ID_GetSMSMessage }, 5607 {N6510_ReplyGetSMSMessage, "\x14",0x03,0x0f,ID_GetSMSMessage },
5527 {N6510_ReplyAddSMSFolder, "\x14",0x03,0x11,ID_AddSMSFolder }, 5608 {N6510_ReplyAddSMSFolder, "\x14",0x03,0x11,ID_AddSMSFolder },
5528 {N6510_ReplyGetSMSFolders, "\x14",0x03,0x13,ID_GetSMSFolders }, 5609 {N6510_ReplyGetSMSFolders, "\x14",0x03,0x13,ID_GetSMSFolders },
5529 {N6510_ReplySaveSMSMessage, "\x14",0x03,0x17,ID_SaveSMSMessage }, 5610 {N6510_ReplySaveSMSMessage, "\x14",0x03,0x17,ID_SaveSMSMessage },
5530 {N6510_ReplyGetSMSStatus, "\x14",0x03,0x1a,ID_GetSMSStatus }, 5611 {N6510_ReplyGetSMSStatus, "\x14",0x03,0x1a,ID_GetSMSStatus },
5531 5612
5532 {DCT4_ReplySetPhoneMode, "\x15",0x03,0x64,ID_Reset }, 5613 {DCT4_ReplySetPhoneMode, "\x15",0x03,0x64,ID_Reset },
5533 {DCT4_ReplyGetPhoneMode, "\x15",0x03,0x65,ID_Reset }, 5614 {DCT4_ReplyGetPhoneMode, "\x15",0x03,0x65,ID_Reset },
5534 {NoneReply, "\x15",0x03,0x68,ID_Reset }, 5615 {NoneReply, "\x15",0x03,0x68,ID_Reset },
5535 5616
5536 {N6510_ReplyGetBatteryCharge, "\x17",0x03,0x0B,ID_GetBatteryCharge }, 5617 {N6510_ReplyGetBatteryCharge, "\x17",0x03,0x0B,ID_GetBatteryCharge },
5537 5618
5538 {N6510_ReplySetDateTime, "\x19",0x03,0x02,ID_SetDateTime }, 5619 {N6510_ReplySetDateTime, "\x19",0x03,0x02,ID_SetDateTime },
5539 {N6510_ReplyGetDateTime, "\x19",0x03,0x0B,ID_GetDateTime }, 5620 {N6510_ReplyGetDateTime, "\x19",0x03,0x0B,ID_GetDateTime },
5540 {N6510_ReplySetAlarm, "\x19",0x03,0x12,ID_SetAlarm }, 5621 {N6510_ReplySetAlarm, "\x19",0x03,0x12,ID_SetAlarm },
5541 {N6510_ReplyGetAlarm, "\x19",0x03,0x1A,ID_GetAlarm }, 5622 {N6510_ReplyGetAlarm, "\x19",0x03,0x1A,ID_GetAlarm },
5542 {N6510_ReplyGetAlarm, "\x19",0x03,0x20,ID_GetAlarm }, 5623 {N6510_ReplyGetAlarm, "\x19",0x03,0x20,ID_GetAlarm },
5543 5624
5544 {DCT4_ReplyGetIMEI, "\x1B",0x03,0x01,ID_GetIMEI }, 5625 {DCT4_ReplyGetIMEI, "\x1B",0x03,0x01,ID_GetIMEI },
5545 {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x08,ID_GetHardware }, 5626 {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x08,ID_GetHardware },
5546 {N6510_ReplyGetPPM, "\x1B",0x03,0x08,ID_GetPPM }, 5627 {N6510_ReplyGetPPM, "\x1B",0x03,0x08,ID_GetPPM },
5547 {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x0C,ID_GetProductCode }, 5628 {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x0C,ID_GetProductCode },
5548 5629
5549 /* 0x1C - vibra */ 5630 /* 0x1C - vibra */
5550 5631
5551 {N6510_ReplyGetRingtonesInfo, "\x1f",0x03,0x08,ID_GetRingtonesInfo }, 5632 {N6510_ReplyGetRingtonesInfo, "\x1f",0x03,0x08,ID_GetRingtonesInfo },
5552 {N6510_ReplyDeleteRingtones, "\x1f",0x03,0x11,ID_SetRingtone }, 5633 {N6510_ReplyDeleteRingtones, "\x1f",0x03,0x11,ID_SetRingtone },
5553 {N6510_ReplyGetRingtone, "\x1f",0x03,0x13,ID_GetRingtone }, 5634 {N6510_ReplyGetRingtone, "\x1f",0x03,0x13,ID_GetRingtone },
5554 {N6510_ReplySetBinRingtone, "\x1f",0x03,0x0F,ID_SetRingtone }, 5635 {N6510_ReplySetBinRingtone, "\x1f",0x03,0x0F,ID_SetRingtone },
5555 5636
5556 /* 0x23 - voice records */ 5637 /* 0x23 - voice records */
5557 5638
5558 {N6510_ReplyGetProfile, "\x39",0x03,0x02,ID_GetProfile }, 5639 {N6510_ReplyGetProfile, "\x39",0x03,0x02,ID_GetProfile },
5559 {N6510_ReplySetProfile, "\x39",0x03,0x04,ID_SetProfile }, 5640 {N6510_ReplySetProfile, "\x39",0x03,0x04,ID_SetProfile },
5560 {N6510_ReplyGetProfile, "\x39",0x03,0x06,ID_GetProfile }, 5641 {N6510_ReplyGetProfile, "\x39",0x03,0x06,ID_GetProfile },
5561 5642
5562 {N6510_ReplySetLight, "\x3A",0x03,0x06,ID_SetLight }, 5643 {N6510_ReplySetLight, "\x3A",0x03,0x06,ID_SetLight },
5563 5644
5564 {N6510_ReplyGetFMStation, "\x3E",0x03,0x06,ID_GetFMStation }, 5645 {N6510_ReplyGetFMStation, "\x3E",0x03,0x06,ID_GetFMStation },
5565 {N6510_ReplyGetFMStatus, "\x3E",0x03,0x0E,ID_GetFMStation }, 5646 {N6510_ReplyGetFMStatus, "\x3E",0x03,0x0E,ID_GetFMStation },
@@ -5606,177 +5687,178 @@ static GSM_Reply_Function N6510ReplyFunctions[] = {
5606 5687
5607 /* 0x53 - simlock */ 5688 /* 0x53 - simlock */
5608 5689
5609 {N6510_ReplyAddToDo1, "\x55",0x03,0x02,ID_SetToDo }, 5690 {N6510_ReplyAddToDo1, "\x55",0x03,0x02,ID_SetToDo },
5610 {N6510_ReplyGetToDo1, "\x55",0x03,0x04,ID_GetToDo }, 5691 {N6510_ReplyGetToDo1, "\x55",0x03,0x04,ID_GetToDo },
5611 {N6510_ReplyGetToDoFirstLoc1, "\x55",0x03,0x10,ID_SetToDo }, 5692 {N6510_ReplyGetToDoFirstLoc1, "\x55",0x03,0x10,ID_SetToDo },
5612 {N6510_ReplyDeleteAllToDo1, "\x55",0x03,0x12,ID_DeleteAllToDo }, 5693 {N6510_ReplyDeleteAllToDo1, "\x55",0x03,0x12,ID_DeleteAllToDo },
5613 {N6510_ReplyGetToDoStatus1, "\x55",0x03,0x16,ID_GetToDo }, 5694 {N6510_ReplyGetToDoStatus1, "\x55",0x03,0x16,ID_GetToDo },
5614 5695
5615 {N6510_ReplyAddFileHeader, "\x6D",0x03,0x03,ID_AddFile }, 5696 {N6510_ReplyAddFileHeader, "\x6D",0x03,0x03,ID_AddFile },
5616 {N6510_ReplyAddFolder, "\x6D",0x03,0x05,ID_AddFolder }, 5697 {N6510_ReplyAddFolder, "\x6D",0x03,0x05,ID_AddFolder },
5617 {N6510_ReplyGetFilePart, "\x6D",0x03,0x0F,ID_GetFile }, 5698 {N6510_ReplyGetFilePart, "\x6D",0x03,0x0F,ID_GetFile },
5618 {N6510_ReplyAddFileHeader, "\x6D",0x03,0x13,ID_AddFile }, 5699 {N6510_ReplyAddFileHeader, "\x6D",0x03,0x13,ID_AddFile },
5619 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x15,ID_GetFileInfo }, 5700 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x15,ID_GetFileInfo },
5620 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x15,ID_GetFile }, 5701 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x15,ID_GetFile },
5621 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x15,ID_AddFile }, 5702 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x15,ID_AddFile },
5622 {N6510_ReplyDeleteFile, "\x6D",0x03,0x19,ID_DeleteFile }, 5703 {N6510_ReplyDeleteFile, "\x6D",0x03,0x19,ID_DeleteFile },
5623 {N6510_ReplyDeleteFile, "\x6D",0x03,0x1F,ID_DeleteFile }, 5704 {N6510_ReplyDeleteFile, "\x6D",0x03,0x1F,ID_DeleteFile },
5624 {N6510_ReplyGetFileSystemStatus, "\x6D",0x03,0x23,ID_FileSystemStatus }, 5705 {N6510_ReplyGetFileSystemStatus, "\x6D",0x03,0x23,ID_FileSystemStatus },
5625 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x2F,ID_GetFileInfo }, 5706 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x2F,ID_GetFileInfo },
5626 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x2F,ID_GetFile }, 5707 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x2F,ID_GetFile },
5627 {N6510_ReplyGetFileSystemStatus, "\x6D",0x03,0x2F,ID_FileSystemStatus }, 5708 {N6510_ReplyGetFileSystemStatus, "\x6D",0x03,0x2F,ID_FileSystemStatus },
5628 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x33,ID_GetFileInfo }, 5709 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x33,ID_GetFileInfo },
5629 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x33,ID_GetFile }, 5710 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x33,ID_GetFile },
5630 {N6510_ReplyAddFilePart, "\x6D",0x03,0x41,ID_AddFile }, 5711 {N6510_ReplyAddFilePart, "\x6D",0x03,0x41,ID_AddFile },
5631 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x43,ID_AddFile }, 5712 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x43,ID_AddFile },
5632 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x43,ID_GetFile }, 5713 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x43,ID_GetFile },
5633 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x43,ID_GetFileInfo }, 5714 {N6510_ReplyGetFileFolderInfo, "\x6D",0x03,0x43,ID_GetFileInfo },
5634 5715
5635 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x01,ID_GetBitmap }, 5716 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x01,ID_GetBitmap },
5636 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x01,ID_SetBitmap }, 5717 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x01,ID_SetBitmap },
5637 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x0F,ID_GetBitmap }, 5718 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x0F,ID_GetBitmap },
5638 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x0F,ID_SetBitmap }, 5719 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x0F,ID_SetBitmap },
5639 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x10,ID_GetBitmap }, 5720 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x10,ID_GetBitmap },
5640 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x10,ID_SetBitmap }, 5721 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x10,ID_SetBitmap },
5641 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x25,ID_SetBitmap }, 5722 {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x25,ID_SetBitmap },
5642 5723
5643 {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetModel }, 5724 {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetModel },
5644 {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetFirmware }, 5725 {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetFirmware },
5645 5726
5646 /* 0xD7 - Bluetooth */ 5727 /* 0xD7 - Bluetooth */
5647 5728
5648 {N6510_ReplyGetRingtoneID, "\xDB",0x03,0x02,ID_SetRingtone }, 5729 {N6510_ReplyGetRingtoneID, "\xDB",0x03,0x02,ID_SetRingtone },
5649 5730
5650 {NULL, "\x00",0x00,0x00,ID_None } 5731 {NULL, "\x00",0x00,0x00,ID_None }
5651}; 5732};
5652 5733
5653GSM_Phone_Functions N6510Phone = { 5734GSM_Phone_Functions N6510Phone = {
5654 "1100|1100a|1100b|3100|3100b|3108|3200|3200a|3300|3510|3510i|3530|3589i|3590|3595|5100|6100|6200|6220|6230|6310|6310i|6385|6510|6610|6800|7210|7250|7250i|7600|8310|8390|8910|8910i", 5735 "1100|1100a|1100b|3100|3100b|3108|3200|3200a|3300|3510|3510i|3530|3589i|3590|3595|5100|5140|6100|6200|6220|6230|6310|6310i|6385|6510|6610|6610i|6800|6810|6820|7210|7250|7250i|7600|8310|8390|8910|8910i",
5655 N6510ReplyFunctions, 5736 N6510ReplyFunctions,
5656 N6510_Initialise, 5737 N6510_Initialise,
5657 NONEFUNCTION, /* Terminate */ 5738 NONEFUNCTION, /* Terminate */
5658 GSM_DispatchMessage, 5739 GSM_DispatchMessage,
5659 N6510_ShowStartInfo, 5740 N6510_ShowStartInfo,
5660 NOKIA_GetManufacturer, 5741 NOKIA_GetManufacturer,
5661 DCT3DCT4_GetModel, 5742 DCT3DCT4_GetModel,
5662 DCT3DCT4_GetFirmware, 5743 DCT3DCT4_GetFirmware,
5663 DCT4_GetIMEI, 5744 DCT4_GetIMEI,
5664 N6510_GetOriginalIMEI, 5745 N6510_GetOriginalIMEI,
5665 N6510_GetManufactureMonth, 5746 N6510_GetManufactureMonth,
5666 DCT4_GetProductCode, 5747 DCT4_GetProductCode,
5667 DCT4_GetHardware, 5748 DCT4_GetHardware,
5668 N6510_GetPPM, 5749 N6510_GetPPM,
5669 NOTSUPPORTED, /* GetSIMIMSI */ 5750 NOTSUPPORTED, /* GetSIMIMSI */
5670 N6510_GetDateTime, 5751 N6510_GetDateTime,
5671 N6510_SetDateTime, 5752 N6510_SetDateTime,
5672 N6510_GetAlarm, 5753 N6510_GetAlarm,
5673 N6510_SetAlarm, 5754 N6510_SetAlarm,
5674 N6510_GetLocale, 5755 N6510_GetLocale,
5675 NOTSUPPORTED, /* SetLocale */ 5756 NOTSUPPORTED, /* SetLocale */
5676 N6510_PressKey, 5757 N6510_PressKey,
5677 DCT4_Reset, 5758 DCT4_Reset,
5678 NOTIMPLEMENTED, /* ResetPhoneSettings*/ 5759 NOTIMPLEMENTED, /* ResetPhoneSettings*/
5679 N6510_EnterSecurityCode, 5760 N6510_EnterSecurityCode,
5680 N6510_GetSecurityStatus, 5761 N6510_GetSecurityStatus,
5681 NOTSUPPORTED, /* GetDisplayStatus*/ 5762 NOTSUPPORTED, /* GetDisplayStatus*/
5682 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/ 5763 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/
5683 N6510_GetBatteryCharge, 5764 N6510_GetBatteryCharge,
5684 N6510_GetSignalQuality, 5765 N6510_GetSignalQuality,
5685 N6510_GetNetworkInfo, 5766 N6510_GetNetworkInfo,
5686 NOTSUPPORTED, /* GetCategory */ 5767 NOTSUPPORTED, /* GetCategory */
5687 NOTSUPPORTED, /* AddCategory */ 5768 NOTSUPPORTED, /* AddCategory */
5688 NOTSUPPORTED, /* GetCategoryStatus */ 5769 NOTSUPPORTED, /* GetCategoryStatus */
5689 N6510_GetMemoryStatus, 5770 N6510_GetMemoryStatus,
5690 N6510_GetMemory, 5771 N6510_GetMemory,
5691 NOTIMPLEMENTED, /* GetNextMemory */ 5772 NOTIMPLEMENTED, /* GetNextMemory */
5692 N6510_SetMemory, 5773 N6510_SetMemory,
5693 NOTIMPLEMENTED, /* AddMemory */ 5774 NOTIMPLEMENTED, /* AddMemory */
5694 N6510_DeleteMemory, 5775 N6510_DeleteMemory,
5695 NOTIMPLEMENTED, /* DeleteAllMemory */ 5776 NOTIMPLEMENTED, /* DeleteAllMemory */
5696 N6510_GetSpeedDial, 5777 N6510_GetSpeedDial,
5697 NOTIMPLEMENTED, /* SetSpeedDial */ 5778 NOTIMPLEMENTED, /* SetSpeedDial */
5698 N6510_GetSMSC, 5779 N6510_GetSMSC,
5699 N6510_SetSMSC, 5780 N6510_SetSMSC,
5700 N6510_GetSMSStatus, 5781 N6510_GetSMSStatus,
5701 N6510_GetSMSMessage, 5782 N6510_GetSMSMessage,
5702 N6510_GetNextSMSMessage, 5783 N6510_GetNextSMSMessage,
5703 N6510_SetSMS, 5784 N6510_SetSMS,
5704 N6510_AddSMS, 5785 N6510_AddSMS,
5705 N6510_DeleteSMSMessage, 5786 N6510_DeleteSMSMessage,
5706 N6510_SendSMSMessage, 5787 N6510_SendSMSMessage,
5707 NOTSUPPORTED, /* SendSavedSMS */ 5788 NOTSUPPORTED, /* SendSavedSMS */
5789 NOTSUPPORTED, /* SetFastSMSSending*/
5708 NOKIA_SetIncomingSMS, 5790 NOKIA_SetIncomingSMS,
5709 NOTIMPLEMENTED, /* SetIncomingCB */ 5791 NOTIMPLEMENTED, /* SetIncomingCB */
5710 N6510_GetSMSFolders, 5792 N6510_GetSMSFolders,
5711 N6510_AddSMSFolder, 5793 N6510_AddSMSFolder,
5712 NOTIMPLEMENTED, /* DeleteSMSFolder */ 5794 NOTIMPLEMENTED, /* DeleteSMSFolder */
5713 N6510_DialVoice, 5795 N6510_DialVoice,
5714 N6510_AnswerCall, 5796 N6510_AnswerCall,
5715 N6510_CancelCall, 5797 N6510_CancelCall,
5716 NOTIMPLEMENTED, /* HoldCall */ 5798 NOTIMPLEMENTED, /* HoldCall */
5717 NOTIMPLEMENTED, /* UnholdCall */ 5799 NOTIMPLEMENTED, /* UnholdCall */
5718 NOTIMPLEMENTED, /* ConferenceCall */ 5800 NOTIMPLEMENTED, /* ConferenceCall */
5719 NOTIMPLEMENTED, /* SplitCall */ 5801 NOTIMPLEMENTED, /* SplitCall */
5720 NOTIMPLEMENTED, /* TransferCall */ 5802 NOTIMPLEMENTED, /* TransferCall */
5721 NOTIMPLEMENTED, /* SwitchCall */ 5803 NOTIMPLEMENTED, /* SwitchCall */
5722 DCT3DCT4_GetCallDivert, 5804 DCT3DCT4_GetCallDivert,
5723 DCT3DCT4_SetCallDivert, 5805 DCT3DCT4_SetCallDivert,
5724 DCT3DCT4_CancelAllDiverts, 5806 DCT3DCT4_CancelAllDiverts,
5725 NOKIA_SetIncomingCall, 5807 NOKIA_SetIncomingCall,
5726 NOKIA_SetIncomingUSSD, 5808 NOKIA_SetIncomingUSSD,
5727 DCT3DCT4_SendDTMF, 5809 DCT3DCT4_SendDTMF,
5728 N6510_GetRingtone, 5810 N6510_GetRingtone,
5729 N6510_SetRingtone, 5811 N6510_SetRingtone,
5730 N6510_GetRingtonesInfo, 5812 N6510_GetRingtonesInfo,
5731 N6510_DeleteUserRingtones, 5813 N6510_DeleteUserRingtones,
5732 N6510_PlayTone, 5814 N6510_PlayTone,
5733 N6510_GetWAPBookmark, 5815 N6510_GetWAPBookmark,
5734 N6510_SetWAPBookmark, 5816 N6510_SetWAPBookmark,
5735 N6510_DeleteWAPBookmark, 5817 N6510_DeleteWAPBookmark,
5736 N6510_GetWAPSettings, 5818 N6510_GetWAPSettings,
5737 N6510_SetWAPSettings, 5819 N6510_SetWAPSettings,
5738 N6510_GetMMSSettings, 5820 N6510_GetMMSSettings,
5739 N6510_SetMMSSettings, 5821 N6510_SetMMSSettings,
5740 N6510_GetSyncMLSettings, 5822 N6510_GetSyncMLSettings,
5741 NOTSUPPORTED, /* SetSyncMLSettings*/ 5823 NOTSUPPORTED, /* SetSyncMLSettings*/
5742 N6510_GetChatSettings, 5824 N6510_GetChatSettings,
5743 NOTSUPPORTED, /* SetChatSettings */ 5825 NOTSUPPORTED, /* SetChatSettings */
5744 N6510_GetBitmap, 5826 N6510_GetBitmap,
5745 N6510_SetBitmap, 5827 N6510_SetBitmap,
5746 N6510_GetToDoStatus, 5828 N6510_GetToDoStatus,
5747 NOTIMPLEMENTED, /* GetToDo */ 5829 NOTIMPLEMENTED, /* GetToDo */
5748 N6510_GetNextToDo, 5830 N6510_GetNextToDo,
5749 NOTIMPLEMENTED, /* SetToDo */ 5831 NOTIMPLEMENTED, /* SetToDo */
5750 N6510_AddToDo, 5832 N6510_AddToDo,
5751 N6510_DeleteToDo2, 5833 N6510_DeleteToDo2,
5752 N6510_DeleteAllToDo1, 5834 N6510_DeleteAllToDo1,
5753 N6510_GetCalendarStatus, 5835 N6510_GetCalendarStatus,
5754 NOTIMPLEMENTED, /* GetCalendar */ 5836 NOTIMPLEMENTED, /* GetCalendar */
5755 N6510_GetNextCalendar, 5837 N6510_GetNextCalendar,
5756 NOTIMPLEMENTED, /* SetCalendar */ 5838 NOTIMPLEMENTED, /* SetCalendar */
5757 N6510_AddCalendar, 5839 N6510_AddCalendar,
5758 N71_65_DelCalendar, 5840 N71_65_DelCalendar,
5759 NOTIMPLEMENTED, /* DeleteAllCalendar*/ 5841 NOTIMPLEMENTED, /* DeleteAllCalendar*/
5760 N6510_GetCalendarSettings, 5842 N6510_GetCalendarSettings,
5761 NOTSUPPORTED, /* SetCalendarSettings*/ 5843 NOTSUPPORTED, /* SetCalendarSettings*/
5762 NOTIMPLEMENTED, /* GetNote */ 5844 N6510_GetNextNote,
5763 N6510_GetProfile, 5845 N6510_GetProfile,
5764 N6510_SetProfile, 5846 N6510_SetProfile,
5765 N6510_GetFMStation, 5847 N6510_GetFMStation,
5766 N6510_SetFMStation, 5848 N6510_SetFMStation,
5767 N6510_ClearFMStations, 5849 N6510_ClearFMStations,
5768 N6510_GetNextFileFolder, 5850 N6510_GetNextFileFolder,
5769 N6510_GetFilePart, 5851 N6510_GetFilePart,
5770 N6510_AddFilePart, 5852 N6510_AddFilePart,
5771 N6510_GetFileSystemStatus, 5853 N6510_GetFileSystemStatus,
5772 N6510_DeleteFile, 5854 N6510_DeleteFile,
5773 N6510_AddFolder, 5855 N6510_AddFolder,
5774 N6510_GetGPRSAccessPoint, 5856 N6510_GetGPRSAccessPoint,
5775 N6510_SetGPRSAccessPoint 5857 N6510_SetGPRSAccessPoint
5776}; 5858};
5777 5859
5778#endif 5860#endif
5779 5861
5780/* How should editor hadle tabs in this file? Add editor commands here. 5862/* How should editor hadle tabs in this file? Add editor commands here.
5781 * vim: noexpandtab sw=8 ts=8 sts=8: 5863 * vim: noexpandtab sw=8 ts=8 sts=8:
5782 */ 5864 */
diff --git a/gammu/emb/common/phone/nokia/dct4/n6510.h b/gammu/emb/common/phone/nokia/dct4/n6510.h
index 4717aeb..26623d6 100644
--- a/gammu/emb/common/phone/nokia/dct4/n6510.h
+++ b/gammu/emb/common/phone/nokia/dct4/n6510.h
@@ -1,84 +1,86 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2 2
3#ifndef n6510_h 3#ifndef n6510_h
4#define n6510_h 4#define n6510_h
5 5
6#include "../ncommon.h" 6#include "../ncommon.h"
7#include "../../../service/sms/gsmsms.h" 7#include "../../../service/sms/gsmsms.h"
8 8
9typedef enum { 9typedef enum {
10 N6510_MMS_SETTINGS = 0x01, 10 N6510_MMS_SETTINGS = 0x01,
11 N6510_CHAT_SETTINGS, 11 N6510_CHAT_SETTINGS,
12 12
13 N6510_WAP_SETTINGS, 13 N6510_WAP_SETTINGS,
14 N6510_SYNCML_SETTINGS 14 N6510_SYNCML_SETTINGS
15} N6510_Connection_Settings; 15} N6510_Connection_Settings;
16 16
17typedef enum { 17typedef enum {
18 N6510_LIGHT_DISPLAY = 0x01, 18 N6510_LIGHT_DISPLAY = 0x01,
19 N6510_LIGHT_KEYPAD = 0x03, 19 N6510_LIGHT_KEYPAD = 0x03,
20 N6510_LIGHT_TORCH = 0x10 20 N6510_LIGHT_TORCH = 0x10
21} N6510_PHONE_LIGHTS; 21} N6510_PHONE_LIGHTS;
22 22
23typedef struct { 23typedef struct {
24 int LastCalendarYear; 24 int LastCalendarYear;
25 int LastCalendarPos; 25 int LastCalendarPos;
26 GSM_NOKIACalToDoLocationsLastCalendar; 26 GSM_NOKIACalToDoLocationsLastCalendar;
27 int FirstCalendarPos; 27 int FirstCalendarPos;
28 unsigned char CalendarIcons[10]; 28 unsigned char CalendarIcons[10];
29 GSM_CalendarNoteType CalendarIconsTypes[10]; 29 GSM_CalendarNoteType CalendarIconsTypes[10];
30 int CalendarIconsNum; 30 int CalendarIconsNum;
31 31
32 GSM_NOKIASMSFolder LastSMSFolder; 32 GSM_NOKIASMSFolder LastSMSFolder;
33 GSM_SMSFolders LastSMSFolders; 33 GSM_SMSFolders LastSMSFolders;
34 34
35 GSM_NOKIACalToDoLocationsLastToDo; 35 GSM_NOKIACalToDoLocationsLastToDo;
36 36
37 GSM_NOKIACalToDoLocationsLastNote;
38
37 unsigned char RingtoneID;/* When set with preview */ 39 unsigned char RingtoneID;/* When set with preview */
38 40
39 int FilesLocations[1000]; 41 int FilesLocations[1000];
40 int FilesLevels[1000]; 42 int FilesLevels[1000];
41 int FilesLocationsUsed; 43 int FilesLocationsUsed;
42 int FilesLocationsCurrent; 44 int FilesLocationsCurrent;
43 int FileToken; 45 int FileToken;
44 int ParentID; 46 int ParentID;
45 int FileCheckSum; 47 int FileCheckSum;
46 48
47 unsigned char FMStatus[4000]; 49 unsigned char FMStatus[4000];
48 int FMStatusLength; 50 int FMStatusLength;
49 51
50 unsigned char GPRSPoints[4000]; 52 unsigned char GPRSPoints[4000];
51 int GPRSPointsLength; 53 int GPRSPointsLength;
52 54
53 int BearerNumber; 55 int BearerNumber;
54 56
55 unsigned char PhoneMode; 57 unsigned char PhoneMode;
56} GSM_Phone_N6510Data; 58} GSM_Phone_N6510Data;
57 59
58void N6510_EncodeFMFrequency(double freq, unsigned char *buff); 60void N6510_EncodeFMFrequency(double freq, unsigned char *buff);
59void N6510_DecodeFMFrequency(double *freq, unsigned char *buff); 61void N6510_DecodeFMFrequency(double *freq, unsigned char *buff);
60 62
61#ifndef GSM_USED_MBUS2 63#ifndef GSM_USED_MBUS2
62# define GSM_USED_MBUS2 64# define GSM_USED_MBUS2
63#endif 65#endif
64#ifndef GSM_USED_FBUS2 66#ifndef GSM_USED_FBUS2
65# define GSM_USED_FBUS2 67# define GSM_USED_FBUS2
66#endif 68#endif
67#ifndef GSM_USED_FBUS2DLR3 69#ifndef GSM_USED_FBUS2DLR3
68# define GSM_USED_FBUS2DLR3 70# define GSM_USED_FBUS2DLR3
69#endif 71#endif
70#ifndef GSM_USED_FBUS2DKU5 72#ifndef GSM_USED_FBUS2DKU5
71# define GSM_USED_FBUS2DKU5 73# define GSM_USED_FBUS2DKU5
72#endif 74#endif
73#ifndef GSM_USED_PHONETBLUE 75#ifndef GSM_USED_PHONETBLUE
74# define GSM_USED_PHONETBLUE 76# define GSM_USED_PHONETBLUE
75#endif 77#endif
76#ifndef GSM_USED_IRDAPHONET 78#ifndef GSM_USED_IRDAPHONET
77# define GSM_USED_IRDAPHONET 79# define GSM_USED_IRDAPHONET
78#endif 80#endif
79#ifndef GSM_USED_BLUEPHONET 81#ifndef GSM_USED_BLUEPHONET
80# define GSM_USED_BLUEPHONET 82# define GSM_USED_BLUEPHONET
81#endif 83#endif
82#ifndef GSM_USED_FBUS2PL2303 84#ifndef GSM_USED_FBUS2PL2303
83# define GSM_USED_FBUS2PL2303 85# define GSM_USED_FBUS2PL2303
84#endif 86#endif
diff --git a/gammu/emb/common/phone/nokia/nauto.c b/gammu/emb/common/phone/nokia/nauto.c
index bf74bc9..3bb53ec 100644
--- a/gammu/emb/common/phone/nokia/nauto.c
+++ b/gammu/emb/common/phone/nokia/nauto.c
@@ -76,69 +76,69 @@ GSM_Phone_Functions NAUTOPhone = {
76 NOTSUPPORTED, /* GetSMSFolders */ 76 NOTSUPPORTED, /* GetSMSFolders */
77 NOTSUPPORTED, /* AddSMSFolder */ 77 NOTSUPPORTED, /* AddSMSFolder */
78 NOTSUPPORTED, /* DeleteSMSFolder */ 78 NOTSUPPORTED, /* DeleteSMSFolder */
79 NOTSUPPORTED, /* DialVoice */ 79 NOTSUPPORTED, /* DialVoice */
80 NOTSUPPORTED, /* AnswerCall */ 80 NOTSUPPORTED, /* AnswerCall */
81 NOTSUPPORTED, /* CancelCall */ 81 NOTSUPPORTED, /* CancelCall */
82 NOTSUPPORTED, /* HoldCall */ 82 NOTSUPPORTED, /* HoldCall */
83 NOTSUPPORTED, /* UnholdCall */ 83 NOTSUPPORTED, /* UnholdCall */
84 NOTSUPPORTED, /* ConferenceCall */ 84 NOTSUPPORTED, /* ConferenceCall */
85 NOTSUPPORTED, /* SplitCall */ 85 NOTSUPPORTED, /* SplitCall */
86 NOTSUPPORTED, /* TransferCall */ 86 NOTSUPPORTED, /* TransferCall */
87 NOTSUPPORTED, /* SwitchCall */ 87 NOTSUPPORTED, /* SwitchCall */
88 NOTSUPPORTED, /* GetCallDivert */ 88 NOTSUPPORTED, /* GetCallDivert */
89 NOTSUPPORTED, /* SetCallDivert */ 89 NOTSUPPORTED, /* SetCallDivert */
90 NOTSUPPORTED, /* CancelAllDiverts*/ 90 NOTSUPPORTED, /* CancelAllDiverts*/
91 NOTSUPPORTED, /* SetIncomingCall */ 91 NOTSUPPORTED, /* SetIncomingCall */
92 NOTSUPPORTED, /* SetIncomingUSSD */ 92 NOTSUPPORTED, /* SetIncomingUSSD */
93 NOTSUPPORTED, /* SendDTMF */ 93 NOTSUPPORTED, /* SendDTMF */
94 NOTSUPPORTED, /* GetRingtone */ 94 NOTSUPPORTED, /* GetRingtone */
95 NOTSUPPORTED, /* SetRingtone */ 95 NOTSUPPORTED, /* SetRingtone */
96 NOTSUPPORTED, /* GetRingtonesInfo*/ 96 NOTSUPPORTED, /* GetRingtonesInfo*/
97 NOTSUPPORTED, /* DeleteUserRingtones*/ 97 NOTSUPPORTED, /* DeleteUserRingtones*/
98 NOTSUPPORTED, /* PlayTone */ 98 NOTSUPPORTED, /* PlayTone */
99 NOTSUPPORTED, /* GetWAPBookmark */ 99 NOTSUPPORTED, /* GetWAPBookmark */
100 NOTSUPPORTED, /* SetWAPBookmark */ 100 NOTSUPPORTED, /* SetWAPBookmark */
101 NOTSUPPORTED, /* DeleteWAPBookmark */ 101 NOTSUPPORTED, /* DeleteWAPBookmark */
102 NOTSUPPORTED, /* GetWAPSettings */ 102 NOTSUPPORTED, /* GetWAPSettings */
103 NOTSUPPORTED, /* SetWAPSettings */ 103 NOTSUPPORTED, /* SetWAPSettings */
104 NOTSUPPORTED, /* GetMMSSettings */ 104 NOTSUPPORTED, /* GetMMSSettings */
105 NOTSUPPORTED, /* SetMMSSettings */ 105 NOTSUPPORTED, /* SetMMSSettings */
106 NOTSUPPORTED, /* GetBitmap */ 106 NOTSUPPORTED, /* GetBitmap */
107 NOTSUPPORTED, /* SetBitmap */ 107 NOTSUPPORTED, /* SetBitmap */
108 NOTSUPPORTED, /* GetToDoStatus */ 108 NOTSUPPORTED, /* GetToDoStatus */
109 NOTSUPPORTED, /* GetToDo */ 109 NOTSUPPORTED, /* GetToDo */
110 NOTSUPPORTED, /* GetNextToDo */ 110 NOTSUPPORTED, /* GetNextToDo */
111 NOTSUPPORTED, /* SetToDo */ 111 NOTSUPPORTED, /* SetToDo */
112 NOTSUPPORTED, /* AddToDo */ 112 NOTSUPPORTED, /* AddToDo */
113 NOTSUPPORTED, /* DeleteToDo */ 113 NOTSUPPORTED, /* DeleteToDo */
114 NOTSUPPORTED, /* DeleteAllToDo */ 114 NOTSUPPORTED, /* DeleteAllToDo */
115 NOTSUPPORTED, /* GetCalendarStatus*/ 115 NOTSUPPORTED, /* GetCalendarStatus*/
116 NOTSUPPORTED, /* GetCalendar */ 116 NOTSUPPORTED, /* GetCalendar */
117 NOTSUPPORTED, /* GetNextCalendar */ 117 NOTSUPPORTED, /* GetNextCalendar */
118 NOTSUPPORTED, /* SetCalendar */ 118 NOTSUPPORTED, /* SetCalendar */
119 NOTSUPPORTED, /* AddCalendar */ 119 NOTSUPPORTED, /* AddCalendar */
120 NOTSUPPORTED, /* DeleteCalendar */ 120 NOTSUPPORTED, /* DeleteCalendar */
121 NOTSUPPORTED, /* DeleteAllCalendar*/ 121 NOTSUPPORTED, /* DeleteAllCalendar*/
122 NOTSUPPORTED, /* GetCalendarSettings*/ 122 NOTSUPPORTED, /* GetCalendarSettings*/
123 NOTSUPPORTED, /* SetCalendarSettings*/ 123 NOTSUPPORTED, /* SetCalendarSettings*/
124 NOTSUPPORTED, /* GetNote */ 124 NOTSUPPORTED, /* GetNextNote */
125 NOTSUPPORTED, /* GetProfile */ 125 NOTSUPPORTED, /* GetProfile */
126 NOTSUPPORTED, /* SetProfile */ 126 NOTSUPPORTED, /* SetProfile */
127 NOTSUPPORTED, /* GetFMStation */ 127 NOTSUPPORTED, /* GetFMStation */
128 NOTSUPPORTED, /* SetFMStation */ 128 NOTSUPPORTED, /* SetFMStation */
129 NOTSUPPORTED, /* ClearFMStations */ 129 NOTSUPPORTED, /* ClearFMStations */
130 NOTSUPPORTED, /* GetNextFileFolder*/ 130 NOTSUPPORTED, /* GetNextFileFolder*/
131 NOTSUPPORTED, /* GetFilePart */ 131 NOTSUPPORTED, /* GetFilePart */
132 NOTSUPPORTED, /* AddFilePart */ 132 NOTSUPPORTED, /* AddFilePart */
133 NOTSUPPORTED, /* GetFileSystemStatus*/ 133 NOTSUPPORTED, /* GetFileSystemStatus*/
134 NOTSUPPORTED, /* DeleteFile */ 134 NOTSUPPORTED, /* DeleteFile */
135 NOTSUPPORTED, /* AddFolder */ 135 NOTSUPPORTED, /* AddFolder */
136 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 136 NOTSUPPORTED, /* GetGPRSAccessPoint*/
137 NOTSUPPORTED /* SetGPRSAccessPoint*/ 137 NOTSUPPORTED /* SetGPRSAccessPoint*/
138}; 138};
139 139
140#endif 140#endif
141 141
142/* How should editor hadle tabs in this file? Add editor commands here. 142/* How should editor hadle tabs in this file? Add editor commands here.
143 * vim: noexpandtab sw=8 ts=8 sts=8: 143 * vim: noexpandtab sw=8 ts=8 sts=8:
144 */ 144 */
diff --git a/gammu/emb/common/phone/nokia/nfunc.c b/gammu/emb/common/phone/nokia/nfunc.c
index 3acfb10..d4d8b03 100644
--- a/gammu/emb/common/phone/nokia/nfunc.c
+++ b/gammu/emb/common/phone/nokia/nfunc.c
@@ -1348,125 +1348,139 @@ GSM_Error N71_65_ReplyCallInfo(GSM_Protocol_Message msg, GSM_StateMachine *s)
1348 smprintf(s, "Call mode : %i\n",msg.Buffer[5]);//such interpretation is in gnokii 1348 smprintf(s, "Call mode : %i\n",msg.Buffer[5]);//such interpretation is in gnokii
1349 tmp = 6; 1349 tmp = 6;
1350 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,buffer,false); 1350 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,buffer,false);
1351 smprintf(s, "Number : \"%s\"\n",DecodeUnicodeString(buffer)); 1351 smprintf(s, "Number : \"%s\"\n",DecodeUnicodeString(buffer));
1352 /* FIXME: read name from frame */ 1352 /* FIXME: read name from frame */
1353 1353
1354 call.Status = GSM_CALL_CallStart; 1354 call.Status = GSM_CALL_CallStart;
1355 break; 1355 break;
1356 case 0x04: 1356 case 0x04:
1357 smprintf(s, "Remote end hang up\n"); 1357 smprintf(s, "Remote end hang up\n");
1358 smprintf(s, "Cause Type : %i\n",msg.Buffer[5]);//such interpretation is in gnokii 1358 smprintf(s, "Cause Type : %i\n",msg.Buffer[5]);//such interpretation is in gnokii
1359 smprintf(s, "CC : %i\n",msg.Buffer[6]); 1359 smprintf(s, "CC : %i\n",msg.Buffer[6]);
1360 smprintf(s, "MM(?) : %i\n",msg.Buffer[7]); 1360 smprintf(s, "MM(?) : %i\n",msg.Buffer[7]);
1361 smprintf(s, "RR(?) : %i\n",msg.Buffer[8]); 1361 smprintf(s, "RR(?) : %i\n",msg.Buffer[8]);
1362 call.Status = GSM_CALL_CallRemoteEnd; 1362 call.Status = GSM_CALL_CallRemoteEnd;
1363 call.StatusCode = msg.Buffer[6]; 1363 call.StatusCode = msg.Buffer[6];
1364 break; 1364 break;
1365 case 0x05: 1365 case 0x05:
1366 smprintf(s, "Incoming call\n"); 1366 smprintf(s, "Incoming call\n");
1367 smprintf(s, "Call mode : %i\n",msg.Buffer[5]);//such interpretation is in gnokii 1367 smprintf(s, "Call mode : %i\n",msg.Buffer[5]);//such interpretation is in gnokii
1368 tmp = 6; 1368 tmp = 6;
1369 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,buffer,false); 1369 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,buffer,false);
1370 smprintf(s, "Number : \"%s\"\n",DecodeUnicodeString(buffer)); 1370 smprintf(s, "Number : \"%s\"\n",DecodeUnicodeString(buffer));
1371 /* FIXME: read name from frame */ 1371 /* FIXME: read name from frame */
1372 call.Status = GSM_CALL_IncomingCall; 1372 call.Status = GSM_CALL_IncomingCall;
1373 tmp = 6; 1373 tmp = 6;
1374 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,call.PhoneNumber,false); 1374 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,call.PhoneNumber,false);
1375 break; 1375 break;
1376 case 0x07: 1376 case 0x07:
1377 smprintf(s, "Call answer initiated\n"); 1377 smprintf(s, "Call answer initiated\n");
1378 break; 1378 break;
1379 case 0x09: 1379 case 0x09:
1380 smprintf(s, "Call released\n"); 1380 smprintf(s, "Call released\n");
1381 call.Status = GSM_CALL_CallLocalEnd; 1381 call.Status = GSM_CALL_CallLocalEnd;
1382 break; 1382 break;
1383 case 0x0a: 1383 case 0x0a:
1384 smprintf(s, "Call is being released\n"); 1384 smprintf(s, "Call is being released\n");
1385 break; 1385 break;
1386 case 0x0b: 1386 case 0x0b:
1387 smprintf(s, "Meaning not known\n"); 1387 smprintf(s, "Meaning not known\n");
1388 call.CallIDAvailable = false; 1388 call.CallIDAvailable = false;
1389 break; 1389 break;
1390 case 0x0c: 1390 case 0x0c:
1391 smprintf(s, "Audio status\n"); 1391 smprintf(s, "Audio status\n");
1392 if (msg.Buffer[4] == 0x01) smprintf(s, "Audio enabled\n"); 1392 if (msg.Buffer[4] == 0x01) smprintf(s, "Audio enabled\n");
1393 else smprintf(s, "Audio disabled\n"); 1393 else smprintf(s, "Audio disabled\n");
1394 call.CallIDAvailable = false; 1394 call.CallIDAvailable = false;
1395 break; 1395 break;
1396 case 0x0f:
1397 case 0x10:
1398 smprintf(s, "Meaning not known\n");
1399 call.CallIDAvailable = false;
1400 break;
1396 case 0x23: 1401 case 0x23:
1397 smprintf(s, "Call held\n"); 1402 smprintf(s, "Call held\n");
1398 call.Status = GSM_CALL_CallHeld; 1403 call.Status = GSM_CALL_CallHeld;
1399 break; 1404 break;
1400 case 0x25: 1405 case 0x25:
1401 smprintf(s, "Call resumed\n"); 1406 smprintf(s, "Call resumed\n");
1402 call.Status = GSM_CALL_CallResumed; 1407 call.Status = GSM_CALL_CallResumed;
1403 break; 1408 break;
1404 case 0x27: 1409 case 0x27:
1405 smprintf(s, "Call switched\n"); 1410 smprintf(s, "Call switched\n");
1406 call.Status = GSM_CALL_CallSwitched; 1411 call.Status = GSM_CALL_CallSwitched;
1407 break; 1412 break;
1408 case 0x53: 1413 case 0x53:
1409 smprintf(s, "Outgoing call\n"); 1414 smprintf(s, "Outgoing call\n");
1410 smprintf(s, "Call mode : %i\n",msg.Buffer[5]);//such interpretation is in gnokii 1415 smprintf(s, "Call mode : %i\n",msg.Buffer[5]);//such interpretation is in gnokii
1411 tmp = 6; 1416 tmp = 6;
1412 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,buffer,false); 1417 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,buffer,false);
1413 smprintf(s, "Number : \"%s\"\n",DecodeUnicodeString(buffer)); 1418 smprintf(s, "Number : \"%s\"\n",DecodeUnicodeString(buffer));
1414 /* FIXME: read name from frame */ 1419 /* FIXME: read name from frame */
1415 call.Status = GSM_CALL_OutgoingCall; 1420 call.Status = GSM_CALL_OutgoingCall;
1416 tmp = 6; 1421 tmp = 6;
1417 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,call.PhoneNumber,false); 1422 NOKIA_GetUnicodeString(s, &tmp, msg.Buffer,call.PhoneNumber,false);
1418 break; 1423 break;
1424 case 0xA6:
1425 case 0xD2:
1426 case 0xD3:
1427 smprintf(s, "Meaning not known\n");
1428 call.CallIDAvailable = false;
1429 break;
1419 } 1430 }
1420 if (call.CallIDAvailable) smprintf(s, "Call ID : %d\n",msg.Buffer[4]); 1431 if (call.CallIDAvailable) smprintf(s, "Call ID : %d\n",msg.Buffer[4]);
1421 if (s->Phone.Data.EnableIncomingCall && s->User.IncomingCall!=NULL && call.Status != 0) { 1432 if (s->Phone.Data.EnableIncomingCall && s->User.IncomingCall!=NULL && call.Status != 0) {
1422 if (call.CallIDAvailable) call.CallID = msg.Buffer[4]; 1433 if (call.CallIDAvailable) call.CallID = msg.Buffer[4];
1423 s->User.IncomingCall(s->CurrentConfig->Device, call); 1434 s->User.IncomingCall(s->CurrentConfig->Device, call);
1424 } 1435 }
1436 if (s->Phone.Data.RequestID == ID_DialVoice) {
1437 if (msg.Buffer[3] == 0x10) return ERR_NOTSUPPORTED;
1438 }
1425 if (s->Phone.Data.RequestID == ID_CancelCall) { 1439 if (s->Phone.Data.RequestID == ID_CancelCall) {
1426 if (msg.Buffer[3] == 0x09) { 1440 if (msg.Buffer[3] == 0x09) {
1427 if (s->Phone.Data.CallID == msg.Buffer[4]) return ERR_NONE; 1441 if (s->Phone.Data.CallID == msg.Buffer[4]) return ERR_NONE;
1428 /* when we canceled call and see frame about other 1442 /* when we canceled call and see frame about other
1429 * call releasing, we don't give ERR_NONE for "our" 1443 * call releasing, we don't give ERR_NONE for "our"
1430 * call release command 1444 * call release command
1431 */ 1445 */
1432 return ERR_NEEDANOTHERANSWER; 1446 return ERR_NEEDANOTHERANSWER;
1433 } 1447 }
1434 } 1448 }
1435 if (s->Phone.Data.RequestID == ID_AnswerCall) { 1449 if (s->Phone.Data.RequestID == ID_AnswerCall) {
1436 if (msg.Buffer[3] == 0x07) { 1450 if (msg.Buffer[3] == 0x07) {
1437 if (s->Phone.Data.CallID == msg.Buffer[4]) return ERR_NONE; 1451 if (s->Phone.Data.CallID == msg.Buffer[4]) return ERR_NONE;
1438 return ERR_NEEDANOTHERANSWER; 1452 return ERR_NEEDANOTHERANSWER;
1439 } 1453 }
1440 } 1454 }
1441 return ERR_NONE; 1455 return ERR_NONE;
1442} 1456}
1443 1457
1444void N71_65_GetCalendarRecurrance(GSM_StateMachine *s, unsigned char *buffer, GSM_CalendarEntry *entry) 1458void N71_65_GetCalendarRecurrance(GSM_StateMachine *s, unsigned char *buffer, GSM_CalendarEntry *entry)
1445{ 1459{
1446 int Recurrance; 1460 int Recurrance;
1447 1461
1448 Recurrance = buffer[0]*256 + buffer[1]; 1462 Recurrance = buffer[0]*256 + buffer[1];
1449 /* 8760 hours = 1 year */ 1463 /* 8760 hours = 1 year */
1450 if (Recurrance == 0xffff) Recurrance=8760; 1464 if (Recurrance == 0xffff) Recurrance=8760;
1451 if (Recurrance != 0) { 1465 if (Recurrance != 0) {
1452 smprintf(s, "Recurrance : %i hours\n",Recurrance); 1466 smprintf(s, "Recurrance : %i hours\n",Recurrance);
1453 entry->Entries[entry->EntriesNum].EntryType= CAL_RECURRANCE; 1467 entry->Entries[entry->EntriesNum].EntryType= CAL_RECURRANCE;
1454 entry->Entries[entry->EntriesNum].Number= Recurrance; 1468 entry->Entries[entry->EntriesNum].Number= Recurrance;
1455 entry->EntriesNum++; 1469 entry->EntriesNum++;
1456 } 1470 }
1457} 1471}
1458 1472
1459/* method 2 */ 1473/* method 2 */
1460GSM_Error N71_65_ReplyAddCalendar2(GSM_Protocol_Message msg, GSM_StateMachine *s) 1474GSM_Error N71_65_ReplyAddCalendar2(GSM_Protocol_Message msg, GSM_StateMachine *s)
1461{ 1475{
1462 smprintf(s, "Calendar note added\n"); 1476 smprintf(s, "Calendar note added\n");
1463 return ERR_NONE; 1477 return ERR_NONE;
1464} 1478}
1465 1479
1466/* method 2 */ 1480/* method 2 */
1467GSM_Error N71_65_AddCalendar2(GSM_StateMachine *s, GSM_CalendarEntry *Note) 1481GSM_Error N71_65_AddCalendar2(GSM_StateMachine *s, GSM_CalendarEntry *Note)
1468{ 1482{
1469 GSM_CalendarNoteTypeNoteType; 1483 GSM_CalendarNoteTypeNoteType;
1470 time_t t_time1,t_time2; 1484 time_t t_time1,t_time2;
1471 GSM_DateTime Date,date_time; 1485 GSM_DateTime Date,date_time;
1472 GSM_Error error; 1486 GSM_Error error;
diff --git a/gammu/emb/common/phone/obex/obexgen.c b/gammu/emb/common/phone/obex/obexgen.c
index dd14f8e..3106369 100644
--- a/gammu/emb/common/phone/obex/obexgen.c
+++ b/gammu/emb/common/phone/obex/obexgen.c
@@ -729,123 +729,124 @@ GSM_Phone_Functions OBEXGENPhone = {
729 NONEFUNCTION, /* GetManufacturer */ 729 NONEFUNCTION, /* GetManufacturer */
730 NONEFUNCTION, /* GetModel */ 730 NONEFUNCTION, /* GetModel */
731 NONEFUNCTION, /* GetFirmware */ 731 NONEFUNCTION, /* GetFirmware */
732 NOTIMPLEMENTED, /* GetIMEI */ 732 NOTIMPLEMENTED, /* GetIMEI */
733 NOTIMPLEMENTED, /* GetOriginalIMEI */ 733 NOTIMPLEMENTED, /* GetOriginalIMEI */
734 NOTIMPLEMENTED, /* GetManufactureMonth*/ 734 NOTIMPLEMENTED, /* GetManufactureMonth*/
735 NOTIMPLEMENTED, /* GetProductCode */ 735 NOTIMPLEMENTED, /* GetProductCode */
736 NOTIMPLEMENTED, /* GetHardware */ 736 NOTIMPLEMENTED, /* GetHardware */
737 NOTIMPLEMENTED, /* GetPPM */ 737 NOTIMPLEMENTED, /* GetPPM */
738 NOTIMPLEMENTED, /* GetSIMIMSI */ 738 NOTIMPLEMENTED, /* GetSIMIMSI */
739 NOTIMPLEMENTED, /* GetDateTime */ 739 NOTIMPLEMENTED, /* GetDateTime */
740 NOTIMPLEMENTED, /* SetDateTime */ 740 NOTIMPLEMENTED, /* SetDateTime */
741 NOTIMPLEMENTED, /* GetAlarm */ 741 NOTIMPLEMENTED, /* GetAlarm */
742 NOTIMPLEMENTED, /* SetAlarm */ 742 NOTIMPLEMENTED, /* SetAlarm */
743 NOTSUPPORTED, /* GetLocale */ 743 NOTSUPPORTED, /* GetLocale */
744 NOTSUPPORTED, /* SetLocale */ 744 NOTSUPPORTED, /* SetLocale */
745 NOTIMPLEMENTED, /* PressKey */ 745 NOTIMPLEMENTED, /* PressKey */
746 NOTIMPLEMENTED, /* Reset */ 746 NOTIMPLEMENTED, /* Reset */
747 NOTIMPLEMENTED, /* ResetPhoneSettings*/ 747 NOTIMPLEMENTED, /* ResetPhoneSettings*/
748 NOTIMPLEMENTED, /* EnterSecurityCode*/ 748 NOTIMPLEMENTED, /* EnterSecurityCode*/
749 NOTIMPLEMENTED, /* GetSecurityStatus*/ 749 NOTIMPLEMENTED, /* GetSecurityStatus*/
750 NOTIMPLEMENTED, /* GetDisplayStatus*/ 750 NOTIMPLEMENTED, /* GetDisplayStatus*/
751 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/ 751 NOTIMPLEMENTED, /* SetAutoNetworkLogin*/
752 NOTIMPLEMENTED, /* GetBatteryCharge*/ 752 NOTIMPLEMENTED, /* GetBatteryCharge*/
753 NOTIMPLEMENTED, /* GetSignalQuality*/ 753 NOTIMPLEMENTED, /* GetSignalQuality*/
754 NOTIMPLEMENTED, /* GetNetworkInfo */ 754 NOTIMPLEMENTED, /* GetNetworkInfo */
755 NOTIMPLEMENTED, /* GetCategory */ 755 NOTIMPLEMENTED, /* GetCategory */
756 NOTSUPPORTED, /* AddCategory */ 756 NOTSUPPORTED, /* AddCategory */
757 NOTIMPLEMENTED, /* GetCategoryStatus */ 757 NOTIMPLEMENTED, /* GetCategoryStatus */
758 NOTIMPLEMENTED, /* GetMemoryStatus */ 758 NOTIMPLEMENTED, /* GetMemoryStatus */
759 NOTIMPLEMENTED, /* GetMemory */ 759 NOTIMPLEMENTED, /* GetMemory */
760 NOTIMPLEMENTED, /* GetNextMemory */ 760 NOTIMPLEMENTED, /* GetNextMemory */
761 NOTIMPLEMENTED, /* SetMemory */ 761 NOTIMPLEMENTED, /* SetMemory */
762 NOTIMPLEMENTED, /* AddMemory */ 762 NOTIMPLEMENTED, /* AddMemory */
763 NOTIMPLEMENTED, /* DeleteMemory */ 763 NOTIMPLEMENTED, /* DeleteMemory */
764 NOTIMPLEMENTED, /* DeleteAllMemory */ 764 NOTIMPLEMENTED, /* DeleteAllMemory */
765 NOTIMPLEMENTED, /* GetSpeedDial */ 765 NOTIMPLEMENTED, /* GetSpeedDial */
766 NOTIMPLEMENTED, /* SetSpeedDial */ 766 NOTIMPLEMENTED, /* SetSpeedDial */
767 NOTIMPLEMENTED, /* GetSMSC */ 767 NOTIMPLEMENTED, /* GetSMSC */
768 NOTIMPLEMENTED, /* SetSMSC */ 768 NOTIMPLEMENTED, /* SetSMSC */
769 NOTIMPLEMENTED, /* GetSMSStatus */ 769 NOTIMPLEMENTED, /* GetSMSStatus */
770 NOTIMPLEMENTED, /* GetSMS */ 770 NOTIMPLEMENTED, /* GetSMS */
771 NOTIMPLEMENTED, /* GetNextSMS */ 771 NOTIMPLEMENTED, /* GetNextSMS */
772 NOTIMPLEMENTED, /* SetSMS */ 772 NOTIMPLEMENTED, /* SetSMS */
773 NOTIMPLEMENTED, /* AddSMS */ 773 NOTIMPLEMENTED, /* AddSMS */
774 NOTIMPLEMENTED, /* DeleteSMS */ 774 NOTIMPLEMENTED, /* DeleteSMS */
775 NOTIMPLEMENTED, /* SendSMSMessage */ 775 NOTIMPLEMENTED, /* SendSMSMessage */
776 NOTSUPPORTED, /* SendSavedSMS */ 776 NOTSUPPORTED, /* SendSavedSMS */
777 NOTSUPPORTED, /* SetFastSMSSending*/
777 NOTIMPLEMENTED, /* SetIncomingSMS */ 778 NOTIMPLEMENTED, /* SetIncomingSMS */
778 NOTIMPLEMENTED, /* SetIncomingCB */ 779 NOTIMPLEMENTED, /* SetIncomingCB */
779 NOTIMPLEMENTED, /* GetSMSFolders */ 780 NOTIMPLEMENTED, /* GetSMSFolders */
780 NOTIMPLEMENTED, /* AddSMSFolder */ 781 NOTIMPLEMENTED, /* AddSMSFolder */
781 NOTIMPLEMENTED, /* DeleteSMSFolder */ 782 NOTIMPLEMENTED, /* DeleteSMSFolder */
782 NOTIMPLEMENTED, /* DialVoice */ 783 NOTIMPLEMENTED, /* DialVoice */
783 NOTIMPLEMENTED, /* AnswerCall */ 784 NOTIMPLEMENTED, /* AnswerCall */
784 NOTIMPLEMENTED, /* CancelCall */ 785 NOTIMPLEMENTED, /* CancelCall */
785 NOTIMPLEMENTED, /* HoldCall */ 786 NOTIMPLEMENTED, /* HoldCall */
786 NOTIMPLEMENTED, /* UnholdCall */ 787 NOTIMPLEMENTED, /* UnholdCall */
787 NOTIMPLEMENTED, /* ConferenceCall */ 788 NOTIMPLEMENTED, /* ConferenceCall */
788 NOTIMPLEMENTED, /* SplitCall */ 789 NOTIMPLEMENTED, /* SplitCall */
789 NOTIMPLEMENTED, /* TransferCall */ 790 NOTIMPLEMENTED, /* TransferCall */
790 NOTIMPLEMENTED, /* SwitchCall */ 791 NOTIMPLEMENTED, /* SwitchCall */
791 NOTIMPLEMENTED, /* GetCallDivert */ 792 NOTIMPLEMENTED, /* GetCallDivert */
792 NOTIMPLEMENTED, /* SetCallDivert */ 793 NOTIMPLEMENTED, /* SetCallDivert */
793 NOTIMPLEMENTED, /* CancelAllDiverts*/ 794 NOTIMPLEMENTED, /* CancelAllDiverts*/
794 NOTIMPLEMENTED, /* SetIncomingCall */ 795 NOTIMPLEMENTED, /* SetIncomingCall */
795 NOTIMPLEMENTED, /* SetIncomingUSSD */ 796 NOTIMPLEMENTED, /* SetIncomingUSSD */
796 NOTIMPLEMENTED, /* SendDTMF */ 797 NOTIMPLEMENTED, /* SendDTMF */
797 NOTIMPLEMENTED, /* GetRingtone */ 798 NOTIMPLEMENTED, /* GetRingtone */
798 NOTIMPLEMENTED, /* SetRingtone */ 799 NOTIMPLEMENTED, /* SetRingtone */
799 NOTIMPLEMENTED, /* GetRingtonesInfo*/ 800 NOTIMPLEMENTED, /* GetRingtonesInfo*/
800 NOTIMPLEMENTED, /* DeleteUserRingtones*/ 801 NOTIMPLEMENTED, /* DeleteUserRingtones*/
801 NOTIMPLEMENTED, /* PlayTone */ 802 NOTIMPLEMENTED, /* PlayTone */
802 NOTIMPLEMENTED, /* GetWAPBookmark */ 803 NOTIMPLEMENTED, /* GetWAPBookmark */
803 NOTIMPLEMENTED, /* SetWAPBookmark */ 804 NOTIMPLEMENTED, /* SetWAPBookmark */
804 NOTIMPLEMENTED, /* DeleteWAPBookmark */ 805 NOTIMPLEMENTED, /* DeleteWAPBookmark */
805 NOTIMPLEMENTED, /* GetWAPSettings */ 806 NOTIMPLEMENTED, /* GetWAPSettings */
806 NOTIMPLEMENTED, /* SetWAPSettings */ 807 NOTIMPLEMENTED, /* SetWAPSettings */
807 NOTIMPLEMENTED, /* GetMMSSettings */ 808 NOTIMPLEMENTED, /* GetMMSSettings */
808 NOTIMPLEMENTED, /* SetMMSSettings */ 809 NOTIMPLEMENTED, /* SetMMSSettings */
809 NOTSUPPORTED, /* GetSyncMLSettings*/ 810 NOTSUPPORTED, /* GetSyncMLSettings*/
810 NOTSUPPORTED, /* SetSyncMLSettings*/ 811 NOTSUPPORTED, /* SetSyncMLSettings*/
811 NOTSUPPORTED, /* GetChatSettings */ 812 NOTSUPPORTED, /* GetChatSettings */
812 NOTSUPPORTED, /* SetChatSettings */ 813 NOTSUPPORTED, /* SetChatSettings */
813 NOTIMPLEMENTED, /* GetBitmap */ 814 NOTIMPLEMENTED, /* GetBitmap */
814 NOTIMPLEMENTED, /* SetBitmap */ 815 NOTIMPLEMENTED, /* SetBitmap */
815 NOTIMPLEMENTED, /* GetToDoStatus */ 816 NOTIMPLEMENTED, /* GetToDoStatus */
816 NOTIMPLEMENTED, /* GetToDo */ 817 NOTIMPLEMENTED, /* GetToDo */
817 NOTIMPLEMENTED, /* GetNextToDo */ 818 NOTIMPLEMENTED, /* GetNextToDo */
818 NOTIMPLEMENTED, /* SetToDo */ 819 NOTIMPLEMENTED, /* SetToDo */
819 NOTIMPLEMENTED, /* AddToDo */ 820 NOTIMPLEMENTED, /* AddToDo */
820 NOTIMPLEMENTED, /* DeleteToDo */ 821 NOTIMPLEMENTED, /* DeleteToDo */
821 NOTIMPLEMENTED, /* DeleteAllToDo */ 822 NOTIMPLEMENTED, /* DeleteAllToDo */
822 NOTIMPLEMENTED, /* GetCalendarStatus*/ 823 NOTIMPLEMENTED, /* GetCalendarStatus*/
823 NOTIMPLEMENTED, /* GetCalendar */ 824 NOTIMPLEMENTED, /* GetCalendar */
824 NOTIMPLEMENTED, /* GetNextCalendar */ 825 NOTIMPLEMENTED, /* GetNextCalendar */
825 NOTIMPLEMENTED, /* SetCalendar */ 826 NOTIMPLEMENTED, /* SetCalendar */
826 NOTIMPLEMENTED, /* AddCalendar */ 827 NOTIMPLEMENTED, /* AddCalendar */
827 NOTIMPLEMENTED, /* DeleteCalendar */ 828 NOTIMPLEMENTED, /* DeleteCalendar */
828 NOTIMPLEMENTED, /* DeleteAllCalendar*/ 829 NOTIMPLEMENTED, /* DeleteAllCalendar*/
829 NOTSUPPORTED, /* GetCalendarSettings*/ 830 NOTSUPPORTED, /* GetCalendarSettings*/
830 NOTSUPPORTED, /* SetCalendarSettings*/ 831 NOTSUPPORTED, /* SetCalendarSettings*/
831 NOTSUPPORTED, /* GetNote */ 832 NOTSUPPORTED, /* GetNextNote */
832 NOTIMPLEMENTED, /* GetProfile */ 833 NOTIMPLEMENTED, /* GetProfile */
833 NOTIMPLEMENTED, /* SetProfile */ 834 NOTIMPLEMENTED, /* SetProfile */
834 NOTIMPLEMENTED, /* GetFMStation */ 835 NOTIMPLEMENTED, /* GetFMStation */
835 NOTIMPLEMENTED, /* SetFMStation */ 836 NOTIMPLEMENTED, /* SetFMStation */
836 NOTIMPLEMENTED, /* ClearFMStations */ 837 NOTIMPLEMENTED, /* ClearFMStations */
837 OBEXGEN_GetNextFileFolder, 838 OBEXGEN_GetNextFileFolder,
838 OBEXGEN_GetFilePart, 839 OBEXGEN_GetFilePart,
839 OBEXGEN_AddFilePart, 840 OBEXGEN_AddFilePart,
840 NOTIMPLEMENTED, /* GetFileSystemStatus*/ 841 NOTIMPLEMENTED, /* GetFileSystemStatus*/
841 OBEXGEN_DeleteFile, 842 OBEXGEN_DeleteFile,
842 OBEXGEN_AddFolder, 843 OBEXGEN_AddFolder,
843 NOTIMPLEMENTED, /* GetGPRSAccessPoint*/ 844 NOTIMPLEMENTED, /* GetGPRSAccessPoint*/
844 NOTIMPLEMENTED /* SetGPRSAccessPoint*/ 845 NOTIMPLEMENTED /* SetGPRSAccessPoint*/
845}; 846};
846 847
847#endif 848#endif
848 849
849/* How should editor hadle tabs in this file? Add editor commands here. 850/* How should editor hadle tabs in this file? Add editor commands here.
850 * vim: noexpandtab sw=8 ts=8 sts=8: 851 * vim: noexpandtab sw=8 ts=8 sts=8:
851 */ 852 */
diff --git a/gammu/emb/common/phone/obex/obexgen.h b/gammu/emb/common/phone/obex/obexgen.h
index 466fef5..b7033de 100644
--- a/gammu/emb/common/phone/obex/obexgen.h
+++ b/gammu/emb/common/phone/obex/obexgen.h
@@ -1,38 +1,42 @@
1/* (c) 2003 by Marcin Wiacek */ 1/* (c) 2003 by Marcin Wiacek */
2 2
3#ifndef obexgen_h 3#ifndef obexgen_h
4#define obexgen_h 4#define obexgen_h
5 5
6#include "../../gsmcomon.h" 6#include "../../gsmcomon.h"
7#include "../../gsmstate.h" 7#include "../../gsmstate.h"
8#include "../../service/gsmmisc.h" 8#include "../../service/gsmmisc.h"
9#include "../../service/sms/gsmsms.h" 9#include "../../service/sms/gsmsms.h"
10 10
11#ifndef GSM_USED_IRDAOBEX 11#ifndef GSM_USED_IRDAOBEX
12# define GSM_USED_IRDAOBEX 12# define GSM_USED_IRDAOBEX
13#endif 13#endif
14#ifndef GSM_USED_BLUEOBEX 14#ifndef GSM_USED_BLUEOBEX
15# define GSM_USED_BLUEOBEX 15# define GSM_USED_BLUEOBEX
16#endif 16#endif
17 17
18typedef enum { 18typedef enum {
19 OBEX_None = 1, 19 OBEX_None = 1,
20 OBEX_BrowsingFolders 20 OBEX_BrowsingFolders
21} OBEX_Service; 21} OBEX_Service;
22 22
23typedef struct { 23typedef struct {
24 int FileLev; 24 int FileLev;
25 int FilesLocationsUsed; 25 int FilesLocationsUsed;
26 int FilesLocationsCurrent; 26 int FilesLocationsCurrent;
27 GSM_File Files[500]; 27 GSM_File Files[500];
28 bool FileLastPart; 28 bool FileLastPart;
29 29
30 int FrameSize; 30 int FrameSize;
31 OBEX_Service Service; 31 OBEX_Service Service;
32} GSM_Phone_OBEXGENData; 32} GSM_Phone_OBEXGENData;
33 33
34 GSM_Error OBEXGEN_GetFilePart(GSM_StateMachine *s, GSM_File *File);
35 GSM_Error OBEXGEN_AddFilePart(GSM_StateMachine *s, GSM_File *File, int *Pos);
36 GSM_Error OBEXGEN_Disconnect(GSM_StateMachine *s);
37
34#endif 38#endif
35 39
36/* How should editor hadle tabs in this file? Add editor commands here. 40/* How should editor hadle tabs in this file? Add editor commands here.
37 * vim: noexpandtab sw=8 ts=8 sts=8: 41 * vim: noexpandtab sw=8 ts=8 sts=8:
38 */ 42 */
diff --git a/gammu/emb/common/phone/symbian/mroutgen.c b/gammu/emb/common/phone/symbian/mroutgen.c
index 2c339be..a7382cf 100644
--- a/gammu/emb/common/phone/symbian/mroutgen.c
+++ b/gammu/emb/common/phone/symbian/mroutgen.c
@@ -98,123 +98,124 @@ GSM_Phone_Functions MROUTERGENPhone = {
98 NOTSUPPORTED, /* ShowStartInfo */ 98 NOTSUPPORTED, /* ShowStartInfo */
99 NONEFUNCTION, /* GetManufacturer */ 99 NONEFUNCTION, /* GetManufacturer */
100 NONEFUNCTION, /* GetModel */ 100 NONEFUNCTION, /* GetModel */
101 NONEFUNCTION, /* GetFirmware */ 101 NONEFUNCTION, /* GetFirmware */
102 NOTIMPLEMENTED, /* GetIMEI */ 102 NOTIMPLEMENTED, /* GetIMEI */
103 NOTSUPPORTED, /* GetOriginalIMEI */ 103 NOTSUPPORTED, /* GetOriginalIMEI */
104 NOTSUPPORTED, /* GetManufactureMonth*/ 104 NOTSUPPORTED, /* GetManufactureMonth*/
105 NOTSUPPORTED, /* GetProductCode */ 105 NOTSUPPORTED, /* GetProductCode */
106 NOTSUPPORTED, /* GetHardware */ 106 NOTSUPPORTED, /* GetHardware */
107 NOTSUPPORTED, /* GetPPM */ 107 NOTSUPPORTED, /* GetPPM */
108 NOTSUPPORTED, /* GetSIMIMSI */ 108 NOTSUPPORTED, /* GetSIMIMSI */
109 NOTSUPPORTED, /* GetDateTime */ 109 NOTSUPPORTED, /* GetDateTime */
110 NOTSUPPORTED, /* SetDateTime */ 110 NOTSUPPORTED, /* SetDateTime */
111 NOTSUPPORTED, /* GetAlarm */ 111 NOTSUPPORTED, /* GetAlarm */
112 NOTSUPPORTED, /* SetAlarm */ 112 NOTSUPPORTED, /* SetAlarm */
113 NOTSUPPORTED, /* GetLocale */ 113 NOTSUPPORTED, /* GetLocale */
114 NOTSUPPORTED, /* SetLocale */ 114 NOTSUPPORTED, /* SetLocale */
115 NOTSUPPORTED, /* PressKey */ 115 NOTSUPPORTED, /* PressKey */
116 NOTSUPPORTED, /* Reset */ 116 NOTSUPPORTED, /* Reset */
117 NOTSUPPORTED, /* ResetPhoneSettings*/ 117 NOTSUPPORTED, /* ResetPhoneSettings*/
118 NOTSUPPORTED, /* EnterSecurityCode*/ 118 NOTSUPPORTED, /* EnterSecurityCode*/
119 NOTSUPPORTED, /* GetSecurityStatus*/ 119 NOTSUPPORTED, /* GetSecurityStatus*/
120 NOTSUPPORTED, /* GetDisplayStatus*/ 120 NOTSUPPORTED, /* GetDisplayStatus*/
121 NOTSUPPORTED, /* SetAutoNetworkLogin*/ 121 NOTSUPPORTED, /* SetAutoNetworkLogin*/
122 NOTSUPPORTED, /* GetBatteryCharge*/ 122 NOTSUPPORTED, /* GetBatteryCharge*/
123 NOTSUPPORTED, /* GetSignalQuality*/ 123 NOTSUPPORTED, /* GetSignalQuality*/
124 NOTSUPPORTED, /* GetNetworkInfo */ 124 NOTSUPPORTED, /* GetNetworkInfo */
125 NOTSUPPORTED, /* GetCategory */ 125 NOTSUPPORTED, /* GetCategory */
126 NOTSUPPORTED, /* GetCategoryStatus */ 126 NOTSUPPORTED, /* GetCategoryStatus */
127 NOTSUPPORTED, /* GetMemoryStatus */ 127 NOTSUPPORTED, /* GetMemoryStatus */
128 NOTSUPPORTED, /* GetMemory */ 128 NOTSUPPORTED, /* GetMemory */
129 NOTSUPPORTED, /* GetNextMemory */ 129 NOTSUPPORTED, /* GetNextMemory */
130 NOTSUPPORTED, /* SetMemory */ 130 NOTSUPPORTED, /* SetMemory */
131 NOTSUPPORTED, /* AddMemory */ 131 NOTSUPPORTED, /* AddMemory */
132 NOTSUPPORTED, /* DeleteMemory */ 132 NOTSUPPORTED, /* DeleteMemory */
133 NOTIMPLEMENTED, /* DeleteAllMemory */ 133 NOTIMPLEMENTED, /* DeleteAllMemory */
134 NOTSUPPORTED, /* GetSpeedDial */ 134 NOTSUPPORTED, /* GetSpeedDial */
135 NOTSUPPORTED, /* SetSpeedDial */ 135 NOTSUPPORTED, /* SetSpeedDial */
136 NOTSUPPORTED, /* GetSMSC */ 136 NOTSUPPORTED, /* GetSMSC */
137 NOTSUPPORTED, /* SetSMSC */ 137 NOTSUPPORTED, /* SetSMSC */
138 NOTSUPPORTED, /* GetSMSStatus */ 138 NOTSUPPORTED, /* GetSMSStatus */
139 NOTSUPPORTED, /* GetSMS */ 139 NOTSUPPORTED, /* GetSMS */
140 NOTSUPPORTED, /* GetNextSMS */ 140 NOTSUPPORTED, /* GetNextSMS */
141 NOTSUPPORTED, /* SetSMS */ 141 NOTSUPPORTED, /* SetSMS */
142 NOTSUPPORTED, /* AddSMS */ 142 NOTSUPPORTED, /* AddSMS */
143 NOTSUPPORTED, /* DeleteSMS */ 143 NOTSUPPORTED, /* DeleteSMS */
144 NOTSUPPORTED, /* SendSMSMessage */ 144 NOTSUPPORTED, /* SendSMSMessage */
145 NOTSUPPORTED, /* SendSavedSMS */ 145 NOTSUPPORTED, /* SendSavedSMS */
146 NOTSUPPORTED, /* SetFastSMSSending*/
146 NOTSUPPORTED, /* SetIncomingSMS */ 147 NOTSUPPORTED, /* SetIncomingSMS */
147 NOTSUPPORTED, /* SetIncomingCB */ 148 NOTSUPPORTED, /* SetIncomingCB */
148 NOTSUPPORTED, /* GetSMSFolders */ 149 NOTSUPPORTED, /* GetSMSFolders */
149 NOTSUPPORTED, /* AddSMSFolder */ 150 NOTSUPPORTED, /* AddSMSFolder */
150 NOTSUPPORTED, /* DeleteSMSFolder */ 151 NOTSUPPORTED, /* DeleteSMSFolder */
151 NOTSUPPORTED, /* DialVoice */ 152 NOTSUPPORTED, /* DialVoice */
152 NOTSUPPORTED, /* AnswerCall */ 153 NOTSUPPORTED, /* AnswerCall */
153 NOTSUPPORTED, /* CancelCall */ 154 NOTSUPPORTED, /* CancelCall */
154 NOTSUPPORTED, /* HoldCall */ 155 NOTSUPPORTED, /* HoldCall */
155 NOTSUPPORTED, /* UnholdCall */ 156 NOTSUPPORTED, /* UnholdCall */
156 NOTSUPPORTED, /* ConferenceCall */ 157 NOTSUPPORTED, /* ConferenceCall */
157 NOTSUPPORTED, /* SplitCall */ 158 NOTSUPPORTED, /* SplitCall */
158 NOTSUPPORTED, /* TransferCall */ 159 NOTSUPPORTED, /* TransferCall */
159 NOTSUPPORTED, /* SwitchCall */ 160 NOTSUPPORTED, /* SwitchCall */
160 NOTSUPPORTED, /* GetCallDivert */ 161 NOTSUPPORTED, /* GetCallDivert */
161 NOTSUPPORTED, /* SetCallDivert */ 162 NOTSUPPORTED, /* SetCallDivert */
162 NOTSUPPORTED, /* CancelAllDiverts*/ 163 NOTSUPPORTED, /* CancelAllDiverts*/
163 NOTSUPPORTED, /* SetIncomingCall */ 164 NOTSUPPORTED, /* SetIncomingCall */
164 NOTSUPPORTED, /* SetIncomingUSSD */ 165 NOTSUPPORTED, /* SetIncomingUSSD */
165 NOTSUPPORTED, /* SendDTMF */ 166 NOTSUPPORTED, /* SendDTMF */
166 NOTSUPPORTED, /* GetRingtone */ 167 NOTSUPPORTED, /* GetRingtone */
167 NOTSUPPORTED, /* SetRingtone */ 168 NOTSUPPORTED, /* SetRingtone */
168 NOTSUPPORTED, /* GetRingtonesInfo*/ 169 NOTSUPPORTED, /* GetRingtonesInfo*/
169 NOTSUPPORTED, /* DeleteUserRingtones*/ 170 NOTSUPPORTED, /* DeleteUserRingtones*/
170 NOTSUPPORTED, /* PlayTone */ 171 NOTSUPPORTED, /* PlayTone */
171 NOTSUPPORTED, /* GetWAPBookmark */ 172 NOTSUPPORTED, /* GetWAPBookmark */
172 NOTSUPPORTED, /* SetWAPBookmark */ 173 NOTSUPPORTED, /* SetWAPBookmark */
173 NOTSUPPORTED, /* DeleteWAPBookmark */ 174 NOTSUPPORTED, /* DeleteWAPBookmark */
174 NOTSUPPORTED, /* GetWAPSettings */ 175 NOTSUPPORTED, /* GetWAPSettings */
175 NOTSUPPORTED, /* SetWAPSettings */ 176 NOTSUPPORTED, /* SetWAPSettings */
176 NOTSUPPORTED, /* GetMMSSettings */ 177 NOTSUPPORTED, /* GetMMSSettings */
177 NOTSUPPORTED, /* SetMMSSettings */ 178 NOTSUPPORTED, /* SetMMSSettings */
178 NOTSUPPORTED, /* GetSyncMLSettings*/ 179 NOTSUPPORTED, /* GetSyncMLSettings*/
179 NOTSUPPORTED, /* SetSyncMLSettings*/ 180 NOTSUPPORTED, /* SetSyncMLSettings*/
180 NOTSUPPORTED, /* GetChatSettings */ 181 NOTSUPPORTED, /* GetChatSettings */
181 NOTSUPPORTED, /* SetChatSettings */ 182 NOTSUPPORTED, /* SetChatSettings */
182 NOTSUPPORTED, /* GetBitmap */ 183 NOTSUPPORTED, /* GetBitmap */
183 NOTSUPPORTED, /* SetBitmap */ 184 NOTSUPPORTED, /* SetBitmap */
184 NOTSUPPORTED, /* GetToDoStatus */ 185 NOTSUPPORTED, /* GetToDoStatus */
185 NOTSUPPORTED, /* GetToDo */ 186 NOTSUPPORTED, /* GetToDo */
186 NOTSUPPORTED, /* GetNextToDo */ 187 NOTSUPPORTED, /* GetNextToDo */
187 NOTSUPPORTED, /* SetToDo */ 188 NOTSUPPORTED, /* SetToDo */
188 NOTSUPPORTED, /* AddToDo */ 189 NOTSUPPORTED, /* AddToDo */
189 NOTSUPPORTED, /* DeleteToDo */ 190 NOTSUPPORTED, /* DeleteToDo */
190 NOTSUPPORTED, /* DeleteAllToDo */ 191 NOTSUPPORTED, /* DeleteAllToDo */
191 NOTSUPPORTED, /* GetCalendarStatus*/ 192 NOTSUPPORTED, /* GetCalendarStatus*/
192 NOTSUPPORTED, /* GetCalendar */ 193 NOTSUPPORTED, /* GetCalendar */
193 NOTSUPPORTED, /* GetNextCalendar */ 194 NOTSUPPORTED, /* GetNextCalendar */
194 NOTSUPPORTED, /* SetCalendar */ 195 NOTSUPPORTED, /* SetCalendar */
195 NOTSUPPORTED, /* AddCalendar */ 196 NOTSUPPORTED, /* AddCalendar */
196 NOTSUPPORTED, /* DeleteCalendar */ 197 NOTSUPPORTED, /* DeleteCalendar */
197 NOTSUPPORTED, /* DeleteAllCalendar*/ 198 NOTSUPPORTED, /* DeleteAllCalendar*/
198 NOTSUPPORTED, /* GetCalendarSettings*/ 199 NOTSUPPORTED, /* GetCalendarSettings*/
199 NOTSUPPORTED, /* SetCalendarSettings*/ 200 NOTSUPPORTED, /* SetCalendarSettings*/
200 NOTSUPPORTED, /* GetNote */ 201 NOTSUPPORTED, /* GetNextNote */
201 NOTSUPPORTED, /* GetProfile */ 202 NOTSUPPORTED, /* GetProfile */
202 NOTSUPPORTED, /* SetProfile */ 203 NOTSUPPORTED, /* SetProfile */
203 NOTSUPPORTED, /* GetFMStation */ 204 NOTSUPPORTED, /* GetFMStation */
204 NOTSUPPORTED, /* SetFMStation */ 205 NOTSUPPORTED, /* SetFMStation */
205 NOTSUPPORTED, /* ClearFMStations */ 206 NOTSUPPORTED, /* ClearFMStations */
206 NOTSUPPORTED, /* GetNextFileFolder*/ 207 NOTSUPPORTED, /* GetNextFileFolder*/
207 NOTSUPPORTED, /* GetFilePart */ 208 NOTSUPPORTED, /* GetFilePart */
208 NOTSUPPORTED, /* AddFilePart */ 209 NOTSUPPORTED, /* AddFilePart */
209 NOTSUPPORTED, /* GetFileSystemStatus*/ 210 NOTSUPPORTED, /* GetFileSystemStatus*/
210 NOTSUPPORTED, /* DeleteFile */ 211 NOTSUPPORTED, /* DeleteFile */
211 NOTSUPPORTED, /* AddFolder */ 212 NOTSUPPORTED, /* AddFolder */
212 NOTSUPPORTED, /* GetGPRSAccessPoint*/ 213 NOTSUPPORTED, /* GetGPRSAccessPoint*/
213 NOTSUPPORTED /* SetGPRSAccessPoint*/ 214 NOTSUPPORTED /* SetGPRSAccessPoint*/
214}; 215};
215 216
216#endif 217#endif
217 218
218/* How should editor hadle tabs in this file? Add editor commands here. 219/* How should editor hadle tabs in this file? Add editor commands here.
219 * vim: noexpandtab sw=8 ts=8 sts=8: 220 * vim: noexpandtab sw=8 ts=8 sts=8:
220 */ 221 */
diff --git a/gammu/emb/common/protocol/at/at.c b/gammu/emb/common/protocol/at/at.c
index f4a75b7..f8ddc06 100644
--- a/gammu/emb/common/protocol/at/at.c
+++ b/gammu/emb/common/protocol/at/at.c
@@ -21,104 +21,108 @@ static GSM_Error AT_WriteMessage (GSM_StateMachine *s, unsigned char *buffer,
21 while (sent != length) { 21 while (sent != length) {
22 if ((i = s->Device.Functions->WriteDevice(s,buffer + sent, length - sent)) == 0) { 22 if ((i = s->Device.Functions->WriteDevice(s,buffer + sent, length - sent)) == 0) {
23 return ERR_DEVICEWRITEERROR; 23 return ERR_DEVICEWRITEERROR;
24 } 24 }
25 sent += i; 25 sent += i;
26 } 26 }
27 } else { 27 } else {
28 for (i=0;i<length;i++) { 28 for (i=0;i<length;i++) {
29 if (s->Device.Functions->WriteDevice(s,buffer+i,1)!=1) return ERR_DEVICEWRITEERROR; 29 if (s->Device.Functions->WriteDevice(s,buffer+i,1)!=1) return ERR_DEVICEWRITEERROR;
30 /* For some phones like Siemens M20 we need to wait a little 30 /* For some phones like Siemens M20 we need to wait a little
31 * after writing each char. Possible reason: these phones 31 * after writing each char. Possible reason: these phones
32 * can't receive so fast chars or there is bug here in Gammu */ 32 * can't receive so fast chars or there is bug here in Gammu */
33 my_sleep(1); 33 my_sleep(1);
34 } 34 }
35 my_sleep(400); 35 my_sleep(400);
36 } 36 }
37 37
38 return ERR_NONE; 38 return ERR_NONE;
39} 39}
40 40
41typedef struct { 41typedef struct {
42 char*text; 42 char*text;
43 intlines; 43 intlines;
44} SpecialAnswersStruct; 44} SpecialAnswersStruct;
45 45
46static GSM_Error AT_StateMachine(GSM_StateMachine *s, unsigned char rx_char) 46static GSM_Error AT_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
47{ 47{
48 GSM_Protocol_Message Msg2; 48 GSM_Protocol_Message Msg2;
49 GSM_Protocol_ATData *d = &s->Protocol.Data.AT; 49 GSM_Protocol_ATData *d = &s->Protocol.Data.AT;
50 int i; 50 int i;
51 51
52 /* These are lines with end of "normal" answers */ 52 /* These are lines with end of "normal" answers */
53 static char *StartStrings[] = { 53 static char *StartStrings[] = {
54 "OK" , "ERROR" , 54 "OK" , "ERROR" ,
55 "+CME ERROR:" , "+CMS ERROR:", 55 "+CME ERROR:" , "+CMS ERROR:",
56 56
57 "+CPIN: " ,/*A2D issue*/ 57 "+CPIN: " ,/*A2D issue*/
58 58
59 NULL}; 59 NULL};
60 60
61 /* Some info from phone can be inside "normal" answers 61 /* Some info from phone can be inside "normal" answers
62 * It starts with strings written here 62 * It starts with strings written here
63 */ 63 */
64 static SpecialAnswersStructSpecialAnswers[] = { 64 static SpecialAnswersStructSpecialAnswers[] = {
65 {"_OSIGQ:" ,1}, {"_OBS:",1}, 65 {"_OSIGQ:" ,1}, {"_OBS:",1},
66 {"^SCN:" ,1}, {"+CGREG:",1}, 66 {"^SCN:" ,1}, {"+CGREG:",1},
67 {"+CBM:" ,1}, {"+CMT:",2}, 67 {"+CBM:" ,1}, {"+CMT:",2},
68 {"+CMTI:" ,1}, {"+CDS:",2}, 68 {"+CMTI:" ,1}, {"+CDS:",2},
69 {"+CREG:",1}, 69 {"+CREG:" ,1}, {"+CUSD",1},
70 70
71 {"RING" ,1}, {"NO CARRIER",1}, 71 {"RING" ,1}, {"NO CARRIER",1},
72 {"NO ANSWER" ,1}, {"+COLP",1}, 72 {"NO ANSWER" ,1}, {"+COLP",1},
73 {"+CLIP",1}, 73 {"+CLIP",1},
74 74
75 {"SDNDCRC =" ,1},/* Samsung binary transfer end */
76
75 {NULL ,1}}; 77 {NULL ,1}};
76 78
79//printf("%c",rx_char);
80
77 /* Ignore leading CR, LF and ESC */ 81 /* Ignore leading CR, LF and ESC */
78 if (d->Msg.Length == 0) { 82 if (d->Msg.Length == 0) {
79 if (rx_char == 10 || rx_char == 13 || rx_char == 27) return ERR_NONE; 83 if (rx_char == 10 || rx_char == 13 || rx_char == 27) return ERR_NONE;
80 d->LineStart = d->Msg.Length; 84 d->LineStart = d->Msg.Length;
81 } 85 }
82 86
83 if (d->Msg.BufferUsed < d->Msg.Length + 2) { 87 if (d->Msg.BufferUsed < d->Msg.Length + 2) {
84 d->Msg.BufferUsed= d->Msg.Length + 2; 88 d->Msg.BufferUsed= d->Msg.Length + 2;
85 d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed); 89 d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed);
86 } 90 }
87 d->Msg.Buffer[d->Msg.Length++] = rx_char; 91 d->Msg.Buffer[d->Msg.Length++] = rx_char;
88 d->Msg.Buffer[d->Msg.Length ] = 0; 92 d->Msg.Buffer[d->Msg.Length ] = 0;
89 93
90 switch (rx_char) { 94 switch (rx_char) {
91 case 0: 95 case 0:
92 break; 96 break;
93 case 10: 97 case 10:
94 case 13: 98 case 13:
95 if (!d->wascrlf) d->LineEnd = d->Msg.Length-1; 99 if (!d->wascrlf) d->LineEnd = d->Msg.Length-1;
96 d->wascrlf = true; 100 d->wascrlf = true;
97 if (d->Msg.Length > 0 && rx_char == 10 && d->Msg.Buffer[d->Msg.Length-2]==13) { 101 if (d->Msg.Length > 0 && rx_char == 10 && d->Msg.Buffer[d->Msg.Length-2]==13) {
98 i = 0; 102 i = 0;
99 while (StartStrings[i] != NULL) { 103 while (StartStrings[i] != NULL) {
100 if (strncmp(StartStrings[i],d->Msg.Buffer+d->LineStart,strlen(StartStrings[i])) == 0) { 104 if (strncmp(StartStrings[i],d->Msg.Buffer+d->LineStart,strlen(StartStrings[i])) == 0) {
101 s->Phone.Data.RequestMsg= &d->Msg; 105 s->Phone.Data.RequestMsg= &d->Msg;
102 s->Phone.Data.DispatchError= s->Phone.Functions->DispatchMessage(s); 106 s->Phone.Data.DispatchError= s->Phone.Functions->DispatchMessage(s);
103 d->Msg.Length = 0; 107 d->Msg.Length = 0;
104 break; 108 break;
105 } 109 }
106 i++; 110 i++;
107 } 111 }
108 if (d->Msg.Length == 0) break; 112 if (d->Msg.Length == 0) break;
109 113
110 i = 0; 114 i = 0;
111 while (SpecialAnswers[i].text != NULL) { 115 while (SpecialAnswers[i].text != NULL) {
112 if (strncmp(SpecialAnswers[i].text,d->Msg.Buffer+d->LineStart,strlen(SpecialAnswers[i].text)) == 0) { 116 if (strncmp(SpecialAnswers[i].text,d->Msg.Buffer+d->LineStart,strlen(SpecialAnswers[i].text)) == 0) {
113 /* We need something better here */ 117 /* We need something better here */
114 if (s->Phone.Data.RequestID == ID_GetNetworkInfo && strncmp(SpecialAnswers[i].text,"+CREG:",6) == 0) { 118 if (s->Phone.Data.RequestID == ID_GetNetworkInfo && strncmp(SpecialAnswers[i].text,"+CREG:",6) == 0) {
115 i++; 119 i++;
116 continue; 120 continue;
117 } 121 }
118 d->SpecialAnswerStart = d->LineStart; 122 d->SpecialAnswerStart = d->LineStart;
119 d->SpecialAnswerLines= SpecialAnswers[i].lines; 123 d->SpecialAnswerLines= SpecialAnswers[i].lines;
120 } 124 }
121 i++; 125 i++;
122 } 126 }
123 127
124 128
diff --git a/gammu/emb/common/protocol/nokia/fbus2.c b/gammu/emb/common/protocol/nokia/fbus2.c
index 8b3e024..2b41f8b 100644
--- a/gammu/emb/common/protocol/nokia/fbus2.c
+++ b/gammu/emb/common/protocol/nokia/fbus2.c
@@ -1,50 +1,54 @@
1/* (c) 2002-2003 by Marcin Wiacek */ 1/* (c) 2002-2003 by Marcin Wiacek */
2/* based on some work from Gnokii and MyGnokii */ 2/* based on some work from MyGnokii (www.mwiacek.com) */
3/* Based on some work from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
6 */
3 7
4#include "../../gsmstate.h" 8#include "../../gsmstate.h"
5 9
6#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2DKU5) || defined(GSM_ENABLE_FBUS2PL2303) 10#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2DKU5) || defined(GSM_ENABLE_FBUS2PL2303)
7 11
8#include <stdio.h> 12#include <stdio.h>
9#include <string.h> 13#include <string.h>
10 14
11#include "../../gsmcomon.h" 15#include "../../gsmcomon.h"
12#include "fbus2.h" 16#include "fbus2.h"
13 17
14 static GSM_Error FBUS2_WriteFrame(GSM_StateMachine *s, 18 static GSM_Error FBUS2_WriteFrame(GSM_StateMachine *s,
15 unsigned char *MsgBuffer, 19 unsigned char *MsgBuffer,
16 int MsgLength, 20 int MsgLength,
17 unsigned char MsgType) 21 unsigned char MsgType)
18{ 22{
19 unsigned char buffer2[FBUS2_MAX_TRANSMIT_LENGTH + 10]; 23 unsigned char buffer2[FBUS2_MAX_TRANSMIT_LENGTH + 10];
20 unsigned char checksum=0; 24 unsigned char checksum=0;
21 int i, len, sent; 25 int i, len, sent;
22 26
23 buffer2[0] = FBUS2_FRAME_ID; 27 buffer2[0] = FBUS2_FRAME_ID;
24 if (s->ConnectionType==GCT_FBUS2IRDA) buffer2[0] = FBUS2_IRDA_FRAME_ID; 28 if (s->ConnectionType==GCT_FBUS2IRDA) buffer2[0] = FBUS2_IRDA_FRAME_ID;
25 29
26 buffer2[1] = FBUS2_DEVICE_PHONE; //destination 30 buffer2[1] = FBUS2_DEVICE_PHONE; //destination
27 buffer2[2] = FBUS2_DEVICE_PC; //source 31 buffer2[2] = FBUS2_DEVICE_PC; //source
28 buffer2[3]= MsgType; 32 buffer2[3]= MsgType;
29 buffer2[4]= MsgLength / 256; 33 buffer2[4]= MsgLength / 256;
30 buffer2[5]= MsgLength % 256; 34 buffer2[5]= MsgLength % 256;
31 35
32 memcpy(buffer2 + 6, MsgBuffer, MsgLength); 36 memcpy(buffer2 + 6, MsgBuffer, MsgLength);
33 len = MsgLength + 6; 37 len = MsgLength + 6;
34 38
35 /* Odd messages require additional 0x00 byte */ 39 /* Odd messages require additional 0x00 byte */
36 if (MsgLength % 2) buffer2[len++] = 0x00; 40 if (MsgLength % 2) buffer2[len++] = 0x00;
37 41
38 checksum = 0; 42 checksum = 0;
39 for (i = 0; i < len; i+=2) checksum ^= buffer2[i]; 43 for (i = 0; i < len; i+=2) checksum ^= buffer2[i];
40 buffer2[len++] = checksum; 44 buffer2[len++] = checksum;
41 45
42 checksum = 0; 46 checksum = 0;
43 for (i = 1; i < len; i+=2) checksum ^= buffer2[i]; 47 for (i = 1; i < len; i+=2) checksum ^= buffer2[i];
44 buffer2[len++] = checksum; 48 buffer2[len++] = checksum;
45 49
46 /* Sending to phone */ 50 /* Sending to phone */
47 sent=s->Device.Functions->WriteDevice(s,buffer2,len); 51 sent=s->Device.Functions->WriteDevice(s,buffer2,len);
48 if (sent!=len) return ERR_DEVICEWRITEERROR; 52 if (sent!=len) return ERR_DEVICEWRITEERROR;
49 53
50 return ERR_NONE; 54 return ERR_NONE;
diff --git a/gammu/emb/common/protocol/nokia/fbus2.h b/gammu/emb/common/protocol/nokia/fbus2.h
index 5dd45d7..8dbcb07 100644
--- a/gammu/emb/common/protocol/nokia/fbus2.h
+++ b/gammu/emb/common/protocol/nokia/fbus2.h
@@ -1,38 +1,42 @@
1/* (c) 2002-2003 by Marcin Wiacek */ 1/* (c) 2002-2003 by Marcin Wiacek */
2/* based on some work from Gnokii and MyGnokii */ 2/* based on some work from MyGnokii (www.mwiacek.com) */
3/* Based on some work from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
6 */
3 7
4#ifndef fbus2_h 8#ifndef fbus2_h
5#define fbus2_h 9#define fbus2_h
6 10
7#include "../protocol.h" 11#include "../protocol.h"
8 12
9 #define FBUS2_FRAME_ID 0x1e 13 #define FBUS2_FRAME_ID 0x1e
10 #define FBUS2_IRDA_FRAME_ID 0x1c 14 #define FBUS2_IRDA_FRAME_ID 0x1c
11 #define FBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */ 15 #define FBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */
12 #define FBUS2_DEVICE_PC 0x0c /* Our PC */ 16 #define FBUS2_DEVICE_PC 0x0c /* Our PC */
13 #define FBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */ 17 #define FBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */
14 18
15#define FBUS2_MAX_TRANSMIT_LENGTH 120 19#define FBUS2_MAX_TRANSMIT_LENGTH 120
16 20
17typedef struct { 21typedef struct {
18 int MsgSequenceNumber; 22 int MsgSequenceNumber;
19 int MsgRXState; 23 int MsgRXState;
20 int FramesToGo; 24 int FramesToGo;
21 GSM_Protocol_MessageMultiMsg; 25 GSM_Protocol_MessageMultiMsg;
22 GSM_Protocol_MessageMsg; 26 GSM_Protocol_MessageMsg;
23} GSM_Protocol_FBUS2Data; 27} GSM_Protocol_FBUS2Data;
24 28
25#ifndef GSM_USED_SERIALDEVICE 29#ifndef GSM_USED_SERIALDEVICE
26# define GSM_USED_SERIALDEVICE 30# define GSM_USED_SERIALDEVICE
27#endif 31#endif
28#if defined(GSM_ENABLE_BLUEFBUS2) 32#if defined(GSM_ENABLE_BLUEFBUS2)
29# ifndef GSM_USED_BLUETOOTHDEVICE 33# ifndef GSM_USED_BLUETOOTHDEVICE
30# define GSM_USED_BLUETOOTHDEVICE 34# define GSM_USED_BLUETOOTHDEVICE
31# endif 35# endif
32#endif 36#endif
33 37
34#endif 38#endif
35 39
36/* How should editor hadle tabs in this file? Add editor commands here. 40/* How should editor hadle tabs in this file? Add editor commands here.
37 * vim: noexpandtab sw=8 ts=8 sts=8: 41 * vim: noexpandtab sw=8 ts=8 sts=8:
38 */ 42 */
diff --git a/gammu/emb/common/protocol/nokia/mbus2.c b/gammu/emb/common/protocol/nokia/mbus2.c
index f07d6c5..8353b46 100644
--- a/gammu/emb/common/protocol/nokia/mbus2.c
+++ b/gammu/emb/common/protocol/nokia/mbus2.c
@@ -1,50 +1,50 @@
1/* (c) 2001-2003 by Marcin Wiacek */ 1/* (c) 2001-2003 by Marcin Wiacek */
2/* based on some work from MyGnokii */ 2/* based on some work from MyGnokii (www.mwiacek.com) */
3 3
4#include "../../gsmstate.h" 4#include "../../gsmstate.h"
5 5
6#ifdef GSM_ENABLE_MBUS2 6#ifdef GSM_ENABLE_MBUS2
7 7
8#include <stdio.h> 8#include <stdio.h>
9#include <string.h> 9#include <string.h>
10 10
11#include "../../gsmcomon.h" 11#include "../../gsmcomon.h"
12#include "mbus2.h" 12#include "mbus2.h"
13 13
14 static GSM_Error MBUS2_WriteMessage (GSM_StateMachine *s, 14 static GSM_Error MBUS2_WriteMessage (GSM_StateMachine *s,
15 unsigned char *MsgBuffer, 15 unsigned char *MsgBuffer,
16 int MsgLength, 16 int MsgLength,
17 unsigned char MsgType) 17 unsigned char MsgType)
18{ 18{
19 unsigned char *buffer2, checksum = 0; 19 unsigned char *buffer2, checksum = 0;
20 GSM_Protocol_MBUS2Data *d = &s->Protocol.Data.MBUS2; 20 GSM_Protocol_MBUS2Data *d = &s->Protocol.Data.MBUS2;
21 int i, sent, len; 21 int i, sent, len;
22 22
23 GSM_DumpMessageLevel3(s, MsgBuffer, MsgLength, MsgType); 23 GSM_DumpMessageLevel3(s, MsgBuffer, MsgLength, MsgType);
24 24
25 buffer2 = (unsigned char *)malloc(MsgLength + 8); 25 buffer2 = (unsigned char *)malloc(MsgLength + 8);
26 26
27 buffer2[0] = MBUS2_FRAME_ID; 27 buffer2[0] = MBUS2_FRAME_ID;
28 buffer2[1] = MBUS2_DEVICE_PHONE; // destination 28 buffer2[1] = MBUS2_DEVICE_PHONE; // destination
29 buffer2[2] = MBUS2_DEVICE_PC; // source 29 buffer2[2] = MBUS2_DEVICE_PC; // source
30 buffer2[3] = MsgType; 30 buffer2[3] = MsgType;
31 buffer2[4] = MsgLength / 256; 31 buffer2[4] = MsgLength / 256;
32 buffer2[5] = MsgLength % 256; 32 buffer2[5] = MsgLength % 256;
33 33
34 memcpy(buffer2 + 6, MsgBuffer, MsgLength); 34 memcpy(buffer2 + 6, MsgBuffer, MsgLength);
35 len = 6 + MsgLength; 35 len = 6 + MsgLength;
36 36
37 /* According to http://www.flosys.com/tdma/n5160.html some phones 37 /* According to http://www.flosys.com/tdma/n5160.html some phones
38 * can have problems with checksum equal 0x1F. Phones can recognize 38 * can have problems with checksum equal 0x1F. Phones can recognize
39 * received frame, but won't send ACK for it. When checksum is 0x1F, 39 * received frame, but won't send ACK for it. When checksum is 0x1F,
40 * we increment the sequence number 40 * we increment the sequence number
41 */ 41 */
42 do { 42 do {
43 d->MsgSequenceNumber++; 43 d->MsgSequenceNumber++;
44 44
45 buffer2[len] = d->MsgSequenceNumber; 45 buffer2[len] = d->MsgSequenceNumber;
46 46
47 /* Calculating checksum */ 47 /* Calculating checksum */
48 checksum = 0; 48 checksum = 0;
49 for (i = 0; i < len + 1; i++) checksum ^= buffer2[i]; 49 for (i = 0; i < len + 1; i++) checksum ^= buffer2[i];
50 } while (checksum == 0x1f); 50 } while (checksum == 0x1f);
diff --git a/gammu/emb/common/protocol/nokia/mbus2.h b/gammu/emb/common/protocol/nokia/mbus2.h
index 86fcab6..5dbd8cb 100644
--- a/gammu/emb/common/protocol/nokia/mbus2.h
+++ b/gammu/emb/common/protocol/nokia/mbus2.h
@@ -1,28 +1,28 @@
1/* (c) 2001-2003 by Marcin Wiacek */ 1/* (c) 2001-2003 by Marcin Wiacek */
2/* based on some work from MyGnokii */ 2/* based on some work from MyGnokii (www.mwiacek.com) */
3 3
4#ifndef mbus2_h 4#ifndef mbus2_h
5#define mbus2_h 5#define mbus2_h
6 6
7#include "../protocol.h" 7#include "../protocol.h"
8 8
9#define MBUS2_FRAME_ID 0x1f 9#define MBUS2_FRAME_ID 0x1f
10#define MBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */ 10#define MBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */
11#define MBUS2_DEVICE_PC 0x10 /* Our PC (MBUS) */ 11#define MBUS2_DEVICE_PC 0x10 /* Our PC (MBUS) */
12 #define MBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */ 12 #define MBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */
13 13
14typedef struct { 14typedef struct {
15 int MsgSequenceNumber; 15 int MsgSequenceNumber;
16 int MsgRXState; 16 int MsgRXState;
17 GSM_Protocol_MessageMsg; 17 GSM_Protocol_MessageMsg;
18} GSM_Protocol_MBUS2Data; 18} GSM_Protocol_MBUS2Data;
19 19
20#ifndef GSM_USED_SERIALDEVICE 20#ifndef GSM_USED_SERIALDEVICE
21# define GSM_USED_SERIALDEVICE 21# define GSM_USED_SERIALDEVICE
22#endif 22#endif
23 23
24#endif 24#endif
25 25
26/* How should editor hadle tabs in this file? Add editor commands here. 26/* How should editor hadle tabs in this file? Add editor commands here.
27 * vim: noexpandtab sw=8 ts=8 sts=8: 27 * vim: noexpandtab sw=8 ts=8 sts=8:
28 */ 28 */
diff --git a/gammu/emb/common/protocol/nokia/phonet.c b/gammu/emb/common/protocol/nokia/phonet.c
index bc5717d..db5bd72 100644
--- a/gammu/emb/common/protocol/nokia/phonet.c
+++ b/gammu/emb/common/protocol/nokia/phonet.c
@@ -1,50 +1,53 @@
1/* (c) 2002-2003 by Marcin Wiacek */ 1/* (c) 2002-2003 by Marcin Wiacek */
2/* based on some work from Gnokii */ 2/* Based on some work from Gnokii (www.gnokii.org)
3 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
4 * GNU GPL version 2 or later
5 */
3 6
4#include "../../gsmstate.h" 7#include "../../gsmstate.h"
5 8
6#if defined(GSM_ENABLE_IRDA) || defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_BLUEPHONET) 9#if defined(GSM_ENABLE_IRDA) || defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_BLUEPHONET)
7 10
8#include <stdio.h> 11#include <stdio.h>
9#include <string.h> 12#include <string.h>
10 13
11#include "../../gsmcomon.h" 14#include "../../gsmcomon.h"
12#include "phonet.h" 15#include "phonet.h"
13 16
14 static GSM_Error PHONET_WriteMessage (GSM_StateMachine *s, 17 static GSM_Error PHONET_WriteMessage (GSM_StateMachine *s,
15 unsigned char *MsgBuffer, 18 unsigned char *MsgBuffer,
16 int MsgLength, 19 int MsgLength,
17 unsigned char MsgType) 20 unsigned char MsgType)
18{ 21{
19 unsigned char *buffer2; 22 unsigned char *buffer2;
20 int sent; 23 int sent;
21 24
22 GSM_DumpMessageLevel3(s, MsgBuffer, MsgLength, MsgType); 25 GSM_DumpMessageLevel3(s, MsgBuffer, MsgLength, MsgType);
23 26
24 buffer2 = (unsigned char *)malloc(MsgLength + 6); 27 buffer2 = (unsigned char *)malloc(MsgLength + 6);
25 28
26 buffer2[0] = PHONET_FRAME_ID, 29 buffer2[0] = PHONET_FRAME_ID,
27 buffer2[1] = PHONET_DEVICE_PHONE; //destination 30 buffer2[1] = PHONET_DEVICE_PHONE; //destination
28 buffer2[2] = PHONET_DEVICE_PC; //source 31 buffer2[2] = PHONET_DEVICE_PC; //source
29 32
30 if (s->ConnectionType==GCT_PHONETBLUE || s->ConnectionType==GCT_BLUEPHONET) { 33 if (s->ConnectionType==GCT_PHONETBLUE || s->ConnectionType==GCT_BLUEPHONET) {
31 buffer2[0] = PHONET_BLUE_FRAME_ID; 34 buffer2[0] = PHONET_BLUE_FRAME_ID;
32 buffer2[1] = PHONET_DEVICE_PHONE;//destination 35 buffer2[1] = PHONET_DEVICE_PHONE;//destination
33 buffer2[2] = PHONET_BLUE_DEVICE_PC;//source 36 buffer2[2] = PHONET_BLUE_DEVICE_PC;//source
34 } 37 }
35 38
36 buffer2[3] = MsgType; 39 buffer2[3] = MsgType;
37 buffer2[4] = MsgLength / 256; 40 buffer2[4] = MsgLength / 256;
38 buffer2[5] = MsgLength % 256; 41 buffer2[5] = MsgLength % 256;
39 42
40 memcpy(buffer2 + 6, MsgBuffer, MsgLength); 43 memcpy(buffer2 + 6, MsgBuffer, MsgLength);
41 44
42 GSM_DumpMessageLevel2(s, buffer2+6, MsgLength, MsgType); 45 GSM_DumpMessageLevel2(s, buffer2+6, MsgLength, MsgType);
43 46
44 /* Sending to phone */ 47 /* Sending to phone */
45 sent = s->Device.Functions->WriteDevice(s,buffer2,MsgLength+6); 48 sent = s->Device.Functions->WriteDevice(s,buffer2,MsgLength+6);
46 49
47 free(buffer2); 50 free(buffer2);
48 51
49 if (sent!=MsgLength+6) return ERR_DEVICEWRITEERROR; 52 if (sent!=MsgLength+6) return ERR_DEVICEWRITEERROR;
50 return ERR_NONE; 53 return ERR_NONE;
diff --git a/gammu/emb/common/protocol/nokia/phonet.h b/gammu/emb/common/protocol/nokia/phonet.h
index 2f6e836..e750bbd 100644
--- a/gammu/emb/common/protocol/nokia/phonet.h
+++ b/gammu/emb/common/protocol/nokia/phonet.h
@@ -1,35 +1,38 @@
1/* (c) 2002-2003 by Marcin Wiacek */ 1/* (c) 2002-2003 by Marcin Wiacek */
2/* based on some work from Gnokii */ 2/* Based on some work from Gnokii (www.gnokii.org)
3 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
4 * GNU GPL version 2 or later
5 */
3 6
4#ifndef PHONET_h 7#ifndef PHONET_h
5#define PHONET_h 8#define PHONET_h
6 9
7#include "../protocol.h" 10#include "../protocol.h"
8 11
9 #define PHONET_FRAME_ID 0x14 12 #define PHONET_FRAME_ID 0x14
10 #define PHONET_BLUE_FRAME_ID0x19 13 #define PHONET_BLUE_FRAME_ID0x19
11 #define PHONET_DEVICE_PHONE 0x00 /* Nokia mobile phone */ 14 #define PHONET_DEVICE_PHONE 0x00 /* Nokia mobile phone */
12 #define PHONET_DEVICE_PC 0x0c /* Our PC */ 15 #define PHONET_DEVICE_PC 0x0c /* Our PC */
13#define PHONET_BLUE_DEVICE_PC 0x10 /* Our PC */ 16#define PHONET_BLUE_DEVICE_PC 0x10 /* Our PC */
14 17
15typedef struct { 18typedef struct {
16 int MsgRXState; 19 int MsgRXState;
17 GSM_Protocol_MessageMsg; 20 GSM_Protocol_MessageMsg;
18} GSM_Protocol_PHONETData; 21} GSM_Protocol_PHONETData;
19 22
20#if defined(GSM_ENABLE_IRDAPHONET) 23#if defined(GSM_ENABLE_IRDAPHONET)
21# ifndef GSM_USED_IRDADEVICE 24# ifndef GSM_USED_IRDADEVICE
22# define GSM_USED_IRDADEVICE 25# define GSM_USED_IRDADEVICE
23# endif 26# endif
24#endif 27#endif
25#if defined(GSM_ENABLE_BLUEPHONET) 28#if defined(GSM_ENABLE_BLUEPHONET)
26# ifndef GSM_USED_BLUETOOTHDEVICE 29# ifndef GSM_USED_BLUETOOTHDEVICE
27# define GSM_USED_BLUETOOTHDEVICE 30# define GSM_USED_BLUETOOTHDEVICE
28# endif 31# endif
29#endif 32#endif
30 33
31#endif 34#endif
32 35
33/* How should editor hadle tabs in this file? Add editor commands here. 36/* How should editor hadle tabs in this file? Add editor commands here.
34 * vim: noexpandtab sw=8 ts=8 sts=8: 37 * vim: noexpandtab sw=8 ts=8 sts=8:
35 */ 38 */
diff --git a/gammu/emb/common/service/backup/backgen.h b/gammu/emb/common/service/backup/backgen.h
index 9d7d973..9a930fc 100644
--- a/gammu/emb/common/service/backup/backgen.h
+++ b/gammu/emb/common/service/backup/backgen.h
@@ -1,69 +1,73 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2 2
3#ifndef __gsm_backgen_h 3#ifndef __gsm_backgen_h
4#define __gsm_backgen_h 4#define __gsm_backgen_h
5 5
6#include "../../config.h" 6#include "../../config.h"
7#include "../../misc/misc.h" 7#include "../../misc/misc.h"
8#include "../gsmpbk.h" 8#include "../gsmpbk.h"
9#include "../gsmcal.h" 9#include "../gsmcal.h"
10#include "../gsmlogo.h" 10#include "../gsmlogo.h"
11#include "../gsmring.h" 11#include "../gsmring.h"
12#include "../gsmdata.h" 12#include "../gsmdata.h"
13#include "../gsmprof.h" 13#include "../gsmprof.h"
14#include "../gsmmisc.h" 14#include "../gsmmisc.h"
15#include "../sms/gsmsms.h" 15#include "../sms/gsmsms.h"
16 16
17 #define GSM_BACKUP_MAX_PHONEPHONEBOOK 501 17 #define GSM_BACKUP_MAX_PHONEPHONEBOOK 501
18 #define GSM_BACKUP_MAX_SIMPHONEBOOK 251 18 #define GSM_BACKUP_MAX_SIMPHONEBOOK 251
19 #define GSM_BACKUP_MAX_CALLER 6 19 #define GSM_BACKUP_MAX_CALLER 6
20 #define GSM_BACKUP_MAX_SMSC 10 20 #define GSM_BACKUP_MAX_SMSC 10
21 #define GSM_BACKUP_MAX_WAPBOOKMARK40 21 #define GSM_BACKUP_MAX_WAPBOOKMARK40
22 #define GSM_BACKUP_MAX_WAPSETTINGS30 22 #define GSM_BACKUP_MAX_WAPSETTINGS30
23 #define GSM_BACKUP_MAX_MMSSETTINGS30 23 #define GSM_BACKUP_MAX_MMSSETTINGS30
24 #define GSM_BACKUP_MAX_SYNCMLSETTINGS10
25 #define GSM_BACKUP_MAX_CHATSETTINGS10
24 #define GSM_BACKUP_MAX_RINGTONES30 26 #define GSM_BACKUP_MAX_RINGTONES30
25 #define GSM_BACKUP_MAX_PROFILES 10 27 #define GSM_BACKUP_MAX_PROFILES 10
26 #define GSM_BACKUP_MAX_FMSTATIONS20 28 #define GSM_BACKUP_MAX_FMSTATIONS20
27 #define GSM_BACKUP_MAX_GPRSPOINT10 29 #define GSM_BACKUP_MAX_GPRSPOINT10
28 #define GSM_BACKUP_MAX_NOTE 10/* FIXME */ 30 #define GSM_BACKUP_MAX_NOTE 10/* FIXME */
29 31
30typedef struct { 32typedef struct {
31 char IMEI [MAX_IMEI_LENGTH]; 33 char IMEI [MAX_IMEI_LENGTH];
32 char Model [MAX_MODEL_LENGTH+MAX_VERSION_LENGTH]; 34 char Model [MAX_MODEL_LENGTH+MAX_VERSION_LENGTH];
33 char Creator [80]; 35 char Creator [80];
34 GSM_DateTime DateTime; 36 GSM_DateTime DateTime;
35 bool DateTimeAvailable; 37 bool DateTimeAvailable;
36 char MD5Original[100]; 38 char MD5Original[100];
37 char MD5Calculated[100]; 39 char MD5Calculated[100];
38 GSM_MemoryEntry *PhonePhonebook[GSM_BACKUP_MAX_PHONEPHONEBOOK + 1]; 40 GSM_MemoryEntry *PhonePhonebook[GSM_BACKUP_MAX_PHONEPHONEBOOK + 1];
39 GSM_MemoryEntry *SIMPhonebook[GSM_BACKUP_MAX_SIMPHONEBOOK + 1]; 41 GSM_MemoryEntry *SIMPhonebook[GSM_BACKUP_MAX_SIMPHONEBOOK + 1];
40 GSM_CalendarEntry *Calendar[GSM_MAXCALENDARTODONOTES + 1]; 42 GSM_CalendarEntry *Calendar[GSM_MAXCALENDARTODONOTES + 1];
41 GSM_Bitmap *CallerLogos[GSM_BACKUP_MAX_CALLER + 1]; 43 GSM_Bitmap *CallerLogos[GSM_BACKUP_MAX_CALLER + 1];
42 GSM_SMSC *SMSC [GSM_BACKUP_MAX_SMSC + 1]; 44 GSM_SMSC *SMSC [GSM_BACKUP_MAX_SMSC + 1];
43 GSM_WAPBookmark *WAPBookmark[GSM_BACKUP_MAX_WAPBOOKMARK + 1]; 45 GSM_WAPBookmark *WAPBookmark[GSM_BACKUP_MAX_WAPBOOKMARK + 1];
44 GSM_MultiWAPSettings *WAPSettings[GSM_BACKUP_MAX_WAPSETTINGS + 1]; 46 GSM_MultiWAPSettings *WAPSettings[GSM_BACKUP_MAX_WAPSETTINGS + 1];
45 GSM_MultiWAPSettings *MMSSettings[GSM_BACKUP_MAX_MMSSETTINGS + 1]; 47 GSM_MultiWAPSettings *MMSSettings[GSM_BACKUP_MAX_MMSSETTINGS + 1];
48 GSM_SyncMLSettings*SyncMLSettings [GSM_BACKUP_MAX_SYNCMLSETTINGS + 1];
49 GSM_ChatSettings *ChatSettings [GSM_BACKUP_MAX_CHATSETTINGS + 1];
46 GSM_Ringtone *Ringtone[GSM_BACKUP_MAX_RINGTONES + 1]; 50 GSM_Ringtone *Ringtone[GSM_BACKUP_MAX_RINGTONES + 1];
47 GSM_ToDoEntry *ToDo [GSM_MAXCALENDARTODONOTES + 1]; 51 GSM_ToDoEntry *ToDo [GSM_MAXCALENDARTODONOTES + 1];
48 GSM_Profile *Profiles[GSM_BACKUP_MAX_PROFILES + 1]; 52 GSM_Profile *Profiles[GSM_BACKUP_MAX_PROFILES + 1];
49 GSM_FMStation *FMStation[GSM_BACKUP_MAX_FMSTATIONS +1]; 53 GSM_FMStation *FMStation[GSM_BACKUP_MAX_FMSTATIONS +1];
50 GSM_GPRSAccessPoint *GPRSPoint[GSM_BACKUP_MAX_GPRSPOINT + 1]; 54 GSM_GPRSAccessPoint *GPRSPoint[GSM_BACKUP_MAX_GPRSPOINT + 1];
51 GSM_NoteEntry *Note [GSM_BACKUP_MAX_NOTE + 1]; 55 GSM_NoteEntry *Note [GSM_BACKUP_MAX_NOTE + 1];
52 GSM_Bitmap *StartupLogo; 56 GSM_Bitmap *StartupLogo;
53 GSM_Bitmap *OperatorLogo; 57 GSM_Bitmap *OperatorLogo;
54} GSM_Backup; 58} GSM_Backup;
55 59
56 #define GSM_BACKUP_MAX_SMS500 60 #define GSM_BACKUP_MAX_SMS500
57 61
58typedef struct { 62typedef struct {
59 GSM_SMSMessage *SMS[GSM_BACKUP_MAX_SMS]; 63 GSM_SMSMessage *SMS[GSM_BACKUP_MAX_SMS];
60} GSM_SMS_Backup; 64} GSM_SMS_Backup;
61 65
62extern GSM_Error GSM_ReadSMSBackupFile(char *FileName, GSM_SMS_Backup *backup); 66extern GSM_Error GSM_ReadSMSBackupFile(char *FileName, GSM_SMS_Backup *backup);
63extern GSM_Error GSM_SaveSMSBackupFile(char *FileName, GSM_SMS_Backup *backup); 67extern GSM_Error GSM_SaveSMSBackupFile(char *FileName, GSM_SMS_Backup *backup);
64 68
65#endif 69#endif
66 70
67/* How should editor hadle tabs in this file? Add editor commands here. 71/* How should editor hadle tabs in this file? Add editor commands here.
68 * vim: noexpandtab sw=8 ts=8 sts=8: 72 * vim: noexpandtab sw=8 ts=8 sts=8:
69 */ 73 */
diff --git a/gammu/emb/common/service/backup/backtext.c b/gammu/emb/common/service/backup/backtext.c
index fee0f73..4cb1bb7 100644
--- a/gammu/emb/common/service/backup/backtext.c
+++ b/gammu/emb/common/service/backup/backtext.c
@@ -106,143 +106,144 @@ static void SaveLinkedBackupText(FILE *file, char *myname, char *myvalue, bool U
106 current = 0; 106 current = 0;
107 } 107 }
108 if (UseUnicode) { 108 if (UseUnicode) {
109 sprintf(buffer3,"%s%02i = %s%c%c",myname,w,buffer2,13,10); 109 sprintf(buffer3,"%s%02i = %s%c%c",myname,w,buffer2,13,10);
110 EncodeUnicode(buffer2,buffer3,strlen(buffer3)); 110 EncodeUnicode(buffer2,buffer3,strlen(buffer3));
111 fwrite(buffer2,1,strlen(buffer3)*2,file); 111 fwrite(buffer2,1,strlen(buffer3)*2,file);
112 } else { 112 } else {
113 fprintf(file,"%s%02i = %s%c%c",myname,w,buffer2,13,10); 113 fprintf(file,"%s%02i = %s%c%c",myname,w,buffer2,13,10);
114 } 114 }
115 if (current == 0) break; 115 if (current == 0) break;
116 w++; 116 w++;
117 } 117 }
118} 118}
119 119
120static void ReadLinkedBackupText(INI_Section *file_info, char *section, char *myname, char *myvalue, bool UseUnicode) 120static void ReadLinkedBackupText(INI_Section *file_info, char *section, char *myname, char *myvalue, bool UseUnicode)
121{ 121{
122 unsigned char buffer2[300]; 122 unsigned char buffer2[300];
123 char *readvalue; 123 char *readvalue;
124 int i; 124 int i;
125 125
126 i=0; 126 i=0;
127 myvalue[0] = 0; 127 myvalue[0] = 0;
128 while (true) { 128 while (true) {
129 sprintf(buffer2,"%s%02i",myname,i); 129 sprintf(buffer2,"%s%02i",myname,i);
130 readvalue = ReadCFGText(file_info, section, buffer2, UseUnicode); 130 readvalue = ReadCFGText(file_info, section, buffer2, UseUnicode);
131 if (readvalue!=NULL) { 131 if (readvalue!=NULL) {
132 myvalue[strlen(myvalue)+strlen(readvalue)]=0; 132 myvalue[strlen(myvalue)+strlen(readvalue)]=0;
133 memcpy(myvalue+strlen(myvalue),readvalue,strlen(readvalue)); 133 memcpy(myvalue+strlen(myvalue),readvalue,strlen(readvalue));
134 } else break; 134 } else break;
135 i++; 135 i++;
136 } 136 }
137} 137}
138 138
139static void SaveBackupText(FILE *file, char *myname, char *myvalue, bool UseUnicode) 139static void SaveBackupText(FILE *file, char *myname, char *myvalue, bool UseUnicode)
140{ 140{
141 unsigned char buffer[10000], buffer2[10000]; 141 unsigned char buffer[10000], buffer2[10000];
142 142
143 if (myname[0] == 0x00) { 143 if (myname[0] == 0x00) {
144 if (UseUnicode) { 144 if (UseUnicode) {
145 EncodeUnicode(buffer,myvalue,strlen(myvalue)); 145 EncodeUnicode(buffer,myvalue,strlen(myvalue));
146 fwrite(buffer,1,strlen(myvalue)*2,file); 146 fwrite(buffer,1,strlen(myvalue)*2,file);
147 } else fprintf(file,"%s",myvalue); 147 } else fprintf(file,"%s",myvalue);
148 } else { 148 } else {
149 if (UseUnicode) { 149 if (UseUnicode) {
150 sprintf(buffer,"%s = \"",myname); 150 sprintf(buffer,"%s = \"",myname);
151 EncodeUnicode(buffer2,buffer,strlen(buffer)); 151 EncodeUnicode(buffer2,buffer,strlen(buffer));
152 fwrite(buffer2,1,strlen(buffer)*2,file); 152 fwrite(buffer2,1,strlen(buffer)*2,file);
153 153
154 fwrite(myvalue,1,UnicodeLength(myvalue)*2,file); 154 fwrite(EncodeUnicodeSpecialChars(myvalue),1,UnicodeLength(EncodeUnicodeSpecialChars(myvalue))*2,file);
155 155
156 sprintf(buffer,"\"%c%c",13,10); 156 sprintf(buffer,"\"%c%c",13,10);
157 EncodeUnicode(buffer2,buffer,strlen(buffer)); 157 EncodeUnicode(buffer2,buffer,strlen(buffer));
158 fwrite(buffer2,1,strlen(buffer)*2,file); 158 fwrite(buffer2,1,strlen(buffer)*2,file);
159 } else { 159 } else {
160 sprintf(buffer,"%s = \"%s\"%c%c",myname,DecodeUnicodeString(myvalue),13,10); 160 sprintf(buffer,"%s = \"%s\"%c%c",myname,EncodeSpecialChars(DecodeUnicodeString(myvalue)),13,10);
161 fprintf(file,"%s",buffer); 161 fprintf(file,"%s",buffer);
162 162
163 EncodeHexBin(buffer,myvalue,UnicodeLength(myvalue)*2); 163 EncodeHexBin(buffer,myvalue,UnicodeLength(myvalue)*2);
164 fprintf(file,"%sUnicode = %s%c%c",myname,buffer,13,10); 164 fprintf(file,"%sUnicode = %s%c%c",myname,buffer,13,10);
165 } 165 }
166 } 166 }
167} 167}
168 168
169static bool ReadBackupText(INI_Section *file_info, char *section, char *myname, char *myvalue, bool UseUnicode) 169static bool ReadBackupText(INI_Section *file_info, char *section, char *myname, char *myvalue, bool UseUnicode)
170{ 170{
171 unsigned char paramname[10000],*readvalue; 171 unsigned char paramname[10000],*readvalue;
172 172
173 if (UseUnicode) { 173 if (UseUnicode) {
174 EncodeUnicode(paramname,myname,strlen(myname)); 174 EncodeUnicode(paramname,myname,strlen(myname));
175 readvalue = INI_GetValue(file_info, section, paramname, UseUnicode); 175 readvalue = INI_GetValue(file_info, section, paramname, UseUnicode);
176 if (readvalue!=NULL) { 176 if (readvalue!=NULL) {
177 CopyUnicodeString(myvalue,readvalue+2); 177 CopyUnicodeString(myvalue,DecodeUnicodeSpecialChars(readvalue+2));
178 myvalue[UnicodeLength(readvalue)*2-4]=0; 178 myvalue[UnicodeLength(myvalue)*2-2]=0;
179 myvalue[UnicodeLength(readvalue)*2-3]=0; 179 myvalue[UnicodeLength(myvalue)*2-1]=0;
180
180 dbgprintf("%s\n",DecodeUnicodeString(readvalue)); 181 dbgprintf("%s\n",DecodeUnicodeString(readvalue));
181 } else { 182 } else {
182 myvalue[0]=0; 183 myvalue[0]=0;
183 myvalue[1]=0; 184 myvalue[1]=0;
184 return false; 185 return false;
185 } 186 }
186 } else { 187 } else {
187 strcpy(paramname,myname); 188 strcpy(paramname,myname);
188 strcat(paramname,"Unicode"); 189 strcat(paramname,"Unicode");
189 readvalue = ReadCFGText(file_info, section, paramname, UseUnicode); 190 readvalue = ReadCFGText(file_info, section, paramname, UseUnicode);
190 if (readvalue!=NULL) { 191 if (readvalue!=NULL) {
191 dbgprintf("%s %i\n",readvalue,strlen(readvalue)); 192 dbgprintf("%s %i\n",readvalue,strlen(readvalue));
192 DecodeHexBin (myvalue, readvalue, strlen(readvalue)); 193 DecodeHexBin (myvalue, readvalue, strlen(readvalue));
193 myvalue[strlen(readvalue)/2]=0; 194 myvalue[strlen(readvalue)/2]=0;
194 myvalue[strlen(readvalue)/2+1]=0; 195 myvalue[strlen(readvalue)/2+1]=0;
195 dbgprintf("%s\n",DecodeUnicodeString(myvalue)); 196 dbgprintf("%s\n",DecodeUnicodeString(myvalue));
196 } else { 197 } else {
197 strcpy(paramname,myname); 198 strcpy(paramname,myname);
198 readvalue = ReadCFGText(file_info, section, paramname, UseUnicode); 199 readvalue = ReadCFGText(file_info, section, paramname, UseUnicode);
199 if (readvalue!=NULL) { 200 if (readvalue!=NULL) {
200 EncodeUnicode(myvalue,readvalue+1,strlen(readvalue)-2); 201 EncodeUnicode(myvalue,DecodeSpecialChars(readvalue+1),strlen(DecodeSpecialChars(readvalue+1))-1);
201 } else { 202 } else {
202 myvalue[0]=0; 203 myvalue[0]=0;
203 myvalue[1]=0; 204 myvalue[1]=0;
204 return false; 205 return false;
205 } 206 }
206 } 207 }
207 } 208 }
208 return true; 209 return true;
209} 210}
210 211
211static void SaveVCalDateTime(FILE *file, GSM_DateTime *dt, bool UseUnicode) 212static void SaveVCalDateTime(FILE *file, GSM_DateTime *dt, bool UseUnicode)
212{ 213{
213 unsigned char buffer[100]; 214 unsigned char buffer[100];
214 int Length = 3; 215 int Length = 3;
215 216
216 sprintf(buffer, " = "); 217 sprintf(buffer, " = ");
217 SaveVCALDateTime(buffer, &Length, dt, NULL); 218 SaveVCALDateTime(buffer, &Length, dt, NULL);
218 SaveBackupText(file, "", buffer, UseUnicode); 219 SaveBackupText(file, "", buffer, UseUnicode);
219} 220}
220 221
221static void SaveVCalDate(FILE *file, GSM_DateTime *dt, bool UseUnicode) 222static void SaveVCalDate(FILE *file, GSM_DateTime *dt, bool UseUnicode)
222{ 223{
223 unsigned char buffer[100]; 224 unsigned char buffer[100];
224 225
225 sprintf(buffer, " = %04d%02d%02d%c%c", dt->Year, dt->Month, dt->Day,13,10); 226 sprintf(buffer, " = %04d%02d%02d%c%c", dt->Year, dt->Month, dt->Day,13,10);
226 SaveBackupText(file, "", buffer, UseUnicode); 227 SaveBackupText(file, "", buffer, UseUnicode);
227} 228}
228 229
229/* ---------------------- backup files ------------------------------------- */ 230/* ---------------------- backup files ------------------------------------- */
230 231
231static void SavePbkEntry(FILE *file, GSM_MemoryEntry *Pbk, bool UseUnicode) 232static void SavePbkEntry(FILE *file, GSM_MemoryEntry *Pbk, bool UseUnicode)
232{ 233{
233 booltext; 234 booltext;
234 charbuffer[1000]; 235 charbuffer[1000];
235 intj, i; 236 intj, i;
236 237
237 sprintf(buffer,"Location = %03i%c%c",Pbk->Location,13,10); 238 sprintf(buffer,"Location = %03i%c%c",Pbk->Location,13,10);
238 SaveBackupText(file, "", buffer, UseUnicode); 239 SaveBackupText(file, "", buffer, UseUnicode);
239 for (j=0;j<Pbk->EntriesNum;j++) { 240 for (j=0;j<Pbk->EntriesNum;j++) {
240 text = true; 241 text = true;
241 switch (Pbk->Entries[j].EntryType) { 242 switch (Pbk->Entries[j].EntryType) {
242 case PBK_Number_General: 243 case PBK_Number_General:
243 sprintf(buffer,"Entry%02iType = NumberGeneral%c%c",j,13,10); 244 sprintf(buffer,"Entry%02iType = NumberGeneral%c%c",j,13,10);
244 SaveBackupText(file, "", buffer, UseUnicode); 245 SaveBackupText(file, "", buffer, UseUnicode);
245 break; 246 break;
246 case PBK_Number_Mobile: 247 case PBK_Number_Mobile:
247 sprintf(buffer,"Entry%02iType = NumberMobile%c%c",j,13,10); 248 sprintf(buffer,"Entry%02iType = NumberMobile%c%c",j,13,10);
248 SaveBackupText(file, "", buffer, UseUnicode); 249 SaveBackupText(file, "", buffer, UseUnicode);
@@ -373,114 +374,125 @@ static void SavePbkEntry(FILE *file, GSM_MemoryEntry *Pbk, bool UseUnicode)
373 case PBK_Text_Custom2: 374 case PBK_Text_Custom2:
374 sprintf(buffer,"Entry%02iType = Custom2%c%c",j,13,10); 375 sprintf(buffer,"Entry%02iType = Custom2%c%c",j,13,10);
375 SaveBackupText(file, "", buffer, UseUnicode); 376 SaveBackupText(file, "", buffer, UseUnicode);
376 break; 377 break;
377 case PBK_Text_Custom3: 378 case PBK_Text_Custom3:
378 sprintf(buffer,"Entry%02iType = Custom3%c%c",j,13,10); 379 sprintf(buffer,"Entry%02iType = Custom3%c%c",j,13,10);
379 SaveBackupText(file, "", buffer, UseUnicode); 380 SaveBackupText(file, "", buffer, UseUnicode);
380 break; 381 break;
381 case PBK_Text_Custom4: 382 case PBK_Text_Custom4:
382 sprintf(buffer,"Entry%02iType = Custom4%c%c",j,13,10); 383 sprintf(buffer,"Entry%02iType = Custom4%c%c",j,13,10);
383 SaveBackupText(file, "", buffer, UseUnicode); 384 SaveBackupText(file, "", buffer, UseUnicode);
384 break; 385 break;
385 case PBK_SMSListID: 386 case PBK_SMSListID:
386 case PBK_RingtoneFileSystemID: 387 case PBK_RingtoneFileSystemID:
387 case PBK_Date: 388 case PBK_Date:
388 break; 389 break;
389 } 390 }
390 if (text) { 391 if (text) {
391 sprintf(buffer,"Entry%02iText",j); 392 sprintf(buffer,"Entry%02iText",j);
392 SaveBackupText(file,buffer,Pbk->Entries[j].Text, UseUnicode); 393 SaveBackupText(file,buffer,Pbk->Entries[j].Text, UseUnicode);
393 } 394 }
394 switch (Pbk->Entries[j].EntryType) { 395 switch (Pbk->Entries[j].EntryType) {
395 case PBK_Number_General: 396 case PBK_Number_General:
396 case PBK_Number_Mobile: 397 case PBK_Number_Mobile:
397 case PBK_Number_Work: 398 case PBK_Number_Work:
398 case PBK_Number_Fax: 399 case PBK_Number_Fax:
399 case PBK_Number_Home: 400 case PBK_Number_Home:
400 case PBK_Number_Other: 401 case PBK_Number_Other:
401 case PBK_Number_Pager: 402 case PBK_Number_Pager:
402 if (Pbk->Entries[j].VoiceTag!=0) { 403 if (Pbk->Entries[j].VoiceTag!=0) {
403 sprintf(buffer,"Entry%02iVoiceTag = %i%c%c",j,Pbk->Entries[j].VoiceTag,13,10); 404 sprintf(buffer,"Entry%02iVoiceTag = %i%c%c",j,Pbk->Entries[j].VoiceTag,13,10);
404 SaveBackupText(file, "", buffer, UseUnicode); 405 SaveBackupText(file, "", buffer, UseUnicode);
405 } 406 }
406 i = 0; 407 i = 0;
407 while (Pbk->Entries[j].SMSList[i]!=0) { 408 while (Pbk->Entries[j].SMSList[i]!=0) {
408 sprintf(buffer,"Entry%02iSMSList%02i = %i%c%c",j,i,Pbk->Entries[j].SMSList[i],13,10); 409 sprintf(buffer,"Entry%02iSMSList%02i = %i%c%c",j,i,Pbk->Entries[j].SMSList[i],13,10);
409 SaveBackupText(file, "", buffer, UseUnicode); 410 SaveBackupText(file, "", buffer, UseUnicode);
410 i++; 411 i++;
411 } 412 }
412 break; 413 break;
413 default: 414 default:
414 break; 415 break;
415 } 416 }
416 } 417 }
417 sprintf(buffer,"%c%c",13,10); 418 sprintf(buffer,"%c%c",13,10);
418 SaveBackupText(file, "", buffer, UseUnicode); 419 SaveBackupText(file, "", buffer, UseUnicode);
419} 420}
420 421
422static void SaveNoteEntry(FILE *file, GSM_NoteEntry *Note, bool UseUnicode)
423{
424 char buffer[1000];
425
426 sprintf(buffer,"Location = %d%c%c", Note->Location,13,10);
427 SaveBackupText(file, "", buffer, UseUnicode);
428 SaveBackupText(file, "Text", Note->Text, UseUnicode);
429 sprintf(buffer, "%c%c",13,10);
430 SaveBackupText(file, "", buffer, UseUnicode);
431}
432
421static void SaveCalendarEntry(FILE *file, GSM_CalendarEntry *Note, bool UseUnicode) 433static void SaveCalendarEntry(FILE *file, GSM_CalendarEntry *Note, bool UseUnicode)
422{ 434{
423 int i; 435 int i;
424 charbuffer[1000]; 436 charbuffer[1000];
425 437
426 sprintf(buffer,"Location = %d%c%c", Note->Location,13,10); 438 sprintf(buffer,"Location = %d%c%c", Note->Location,13,10);
427 SaveBackupText(file, "", buffer, UseUnicode); 439 SaveBackupText(file, "", buffer, UseUnicode);
428 SaveBackupText(file, "", "Type = ", UseUnicode); 440 SaveBackupText(file, "", "Type = ", UseUnicode);
429 switch (Note->Type) { 441 switch (Note->Type) {
430 case GSM_CAL_REMINDER : sprintf(buffer,"Reminder%c%c", 13,10); break; 442 case GSM_CAL_REMINDER : sprintf(buffer,"Reminder%c%c", 13,10); break;
431 case GSM_CAL_CALL : sprintf(buffer,"Call%c%c", 13,10); break; 443 case GSM_CAL_CALL : sprintf(buffer,"Call%c%c", 13,10); break;
432 case GSM_CAL_MEETING : sprintf(buffer,"Meeting%c%c", 13,10); break; 444 case GSM_CAL_MEETING : sprintf(buffer,"Meeting%c%c", 13,10); break;
433 case GSM_CAL_BIRTHDAY : sprintf(buffer,"Birthday%c%c", 13,10); break; 445 case GSM_CAL_BIRTHDAY : sprintf(buffer,"Birthday%c%c", 13,10); break;
434 case GSM_CAL_TRAVEL : sprintf(buffer,"Travel%c%c", 13,10); break; 446 case GSM_CAL_TRAVEL : sprintf(buffer,"Travel%c%c", 13,10); break;
435 case GSM_CAL_VACATION : sprintf(buffer,"Vacation%c%c", 13,10); break; 447 case GSM_CAL_VACATION : sprintf(buffer,"Vacation%c%c", 13,10); break;
436 case GSM_CAL_MEMO : sprintf(buffer,"Memo%c%c", 13,10); break; 448 case GSM_CAL_MEMO : sprintf(buffer,"Memo%c%c", 13,10); break;
437 case GSM_CAL_ALARM : sprintf(buffer,"Alarm%c%c", 13,10); break; 449 case GSM_CAL_ALARM : sprintf(buffer,"Alarm%c%c", 13,10); break;
438 case GSM_CAL_DAILY_ALARM : sprintf(buffer,"DailyAlarm%c%c", 13,10); break; 450 case GSM_CAL_DAILY_ALARM: sprintf(buffer,"DailyAlarm%c%c", 13,10); break;
439 case GSM_CAL_T_ATHL : sprintf(buffer,"Training/Athletism%c%c", 13,10); break; 451 case GSM_CAL_T_ATHL : sprintf(buffer,"Training/Athletism%c%c", 13,10); break;
440 case GSM_CAL_T_BALL : sprintf(buffer,"Training/BallGames%c%c", 13,10); break; 452 case GSM_CAL_T_BALL : sprintf(buffer,"Training/BallGames%c%c", 13,10); break;
441 case GSM_CAL_T_CYCL : sprintf(buffer,"Training/Cycling%c%c", 13,10); break; 453 case GSM_CAL_T_CYCL : sprintf(buffer,"Training/Cycling%c%c", 13,10); break;
442 case GSM_CAL_T_BUDO : sprintf(buffer,"Training/Budo%c%c", 13,10); break; 454 case GSM_CAL_T_BUDO : sprintf(buffer,"Training/Budo%c%c", 13,10); break;
443 case GSM_CAL_T_DANC : sprintf(buffer,"Training/Dance%c%c", 13,10); break; 455 case GSM_CAL_T_DANC : sprintf(buffer,"Training/Dance%c%c", 13,10); break;
444 case GSM_CAL_T_EXTR : sprintf(buffer,"Training/ExtremeSports%c%c", 13,10); break; 456 case GSM_CAL_T_EXTR : sprintf(buffer,"Training/ExtremeSports%c%c", 13,10); break;
445 case GSM_CAL_T_FOOT : sprintf(buffer,"Training/Football%c%c", 13,10); break; 457 case GSM_CAL_T_FOOT : sprintf(buffer,"Training/Football%c%c", 13,10); break;
446 case GSM_CAL_T_GOLF : sprintf(buffer,"Training/Golf%c%c", 13,10); break; 458 case GSM_CAL_T_GOLF : sprintf(buffer,"Training/Golf%c%c", 13,10); break;
447 case GSM_CAL_T_GYM : sprintf(buffer,"Training/Gym%c%c", 13,10); break; 459 case GSM_CAL_T_GYM : sprintf(buffer,"Training/Gym%c%c", 13,10); break;
448 case GSM_CAL_T_HORS : sprintf(buffer,"Training/HorseRaces%c%c", 13,10); break; 460 case GSM_CAL_T_HORS : sprintf(buffer,"Training/HorseRaces%c%c", 13,10); break;
449 case GSM_CAL_T_HOCK : sprintf(buffer,"Training/Hockey%c%c", 13,10); break; 461 case GSM_CAL_T_HOCK : sprintf(buffer,"Training/Hockey%c%c", 13,10); break;
450 case GSM_CAL_T_RACE : sprintf(buffer,"Training/Races%c%c", 13,10); break; 462 case GSM_CAL_T_RACE : sprintf(buffer,"Training/Races%c%c", 13,10); break;
451 case GSM_CAL_T_RUGB : sprintf(buffer,"Training/Rugby%c%c", 13,10); break; 463 case GSM_CAL_T_RUGB : sprintf(buffer,"Training/Rugby%c%c", 13,10); break;
452 case GSM_CAL_T_SAIL : sprintf(buffer,"Training/Sailing%c%c", 13,10); break; 464 case GSM_CAL_T_SAIL : sprintf(buffer,"Training/Sailing%c%c", 13,10); break;
453 case GSM_CAL_T_STRE : sprintf(buffer,"Training/StreetGames%c%c",13,10); break; 465 case GSM_CAL_T_STRE : sprintf(buffer,"Training/StreetGames%c%c",13,10); break;
454 case GSM_CAL_T_SWIM : sprintf(buffer,"Training/Swimming%c%c", 13,10); break; 466 case GSM_CAL_T_SWIM : sprintf(buffer,"Training/Swimming%c%c", 13,10); break;
455 case GSM_CAL_T_TENN : sprintf(buffer,"Training/Tennis%c%c", 13,10); break; 467 case GSM_CAL_T_TENN : sprintf(buffer,"Training/Tennis%c%c", 13,10); break;
456 case GSM_CAL_T_TRAV : sprintf(buffer,"Training/Travels%c%c", 13,10); break; 468 case GSM_CAL_T_TRAV : sprintf(buffer,"Training/Travels%c%c", 13,10); break;
457 case GSM_CAL_T_WINT : sprintf(buffer,"Training/WinterGames%c%c", 13,10); break; 469 case GSM_CAL_T_WINT : sprintf(buffer,"Training/WinterGames%c%c", 13,10); break;
458 } 470 }
459 SaveBackupText(file, "", buffer, UseUnicode); 471 SaveBackupText(file, "", buffer, UseUnicode);
460 for (i=0;i<Note->EntriesNum;i++) { 472 for (i=0;i<Note->EntriesNum;i++) {
461 switch (Note->Entries[i].EntryType) { 473 switch (Note->Entries[i].EntryType) {
462 case CAL_START_DATETIME: 474 case CAL_START_DATETIME:
463 SaveBackupText(file, "", "StartTime", UseUnicode); 475 SaveBackupText(file, "", "StartTime", UseUnicode);
464 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); 476 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
465 break; 477 break;
466 case CAL_END_DATETIME: 478 case CAL_END_DATETIME:
467 SaveBackupText(file, "", "StopTime", UseUnicode); 479 SaveBackupText(file, "", "StopTime", UseUnicode);
468 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); 480 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
469 break; 481 break;
470 case CAL_ALARM_DATETIME: 482 case CAL_ALARM_DATETIME:
471 SaveBackupText(file, "", "Alarm", UseUnicode); 483 SaveBackupText(file, "", "Alarm", UseUnicode);
472 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); 484 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
473 sprintf(buffer,"AlarmType = Tone%c%c",13,10); 485 sprintf(buffer,"AlarmType = Tone%c%c",13,10);
474 SaveBackupText(file, "", buffer, UseUnicode); 486 SaveBackupText(file, "", buffer, UseUnicode);
475 break; 487 break;
476 case CAL_SILENT_ALARM_DATETIME: 488 case CAL_SILENT_ALARM_DATETIME:
477 SaveBackupText(file, "", "Alarm", UseUnicode); 489 SaveBackupText(file, "", "Alarm", UseUnicode);
478 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); 490 SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
479 sprintf(buffer,"AlarmType = Silent%c%c",13,10); 491 sprintf(buffer,"AlarmType = Silent%c%c",13,10);
480 SaveBackupText(file, "", buffer, UseUnicode); 492 SaveBackupText(file, "", buffer, UseUnicode);
481 break; 493 break;
482 case CAL_PRIVATE: 494 case CAL_PRIVATE:
483 sprintf(buffer, "Private = %d%c%c",Note->Entries[i].Number,13,10); 495 sprintf(buffer, "Private = %d%c%c",Note->Entries[i].Number,13,10);
484 SaveBackupText(file, "", buffer, UseUnicode); 496 SaveBackupText(file, "", buffer, UseUnicode);
485 break; 497 break;
486 case CAL_LOCATION: 498 case CAL_LOCATION:
@@ -612,96 +624,138 @@ static void SaveWAPSettingsEntry(FILE *file, GSM_MultiWAPSettings *settings, boo
612 SaveBackupText(file, buffer, settings->Settings[i].DialUp, UseUnicode); 624 SaveBackupText(file, buffer, settings->Settings[i].DialUp, UseUnicode);
613 if (settings->Settings[i].ManualLogin) { 625 if (settings->Settings[i].ManualLogin) {
614 sprintf(buffer,"Login%02i = Manual%c%c",i,13,10); 626 sprintf(buffer,"Login%02i = Manual%c%c",i,13,10);
615 } else { 627 } else {
616 sprintf(buffer,"Login%02i = Automatic%c%c",i,13,10); 628 sprintf(buffer,"Login%02i = Automatic%c%c",i,13,10);
617 } 629 }
618 SaveBackupText(file, "", buffer, UseUnicode); 630 SaveBackupText(file, "", buffer, UseUnicode);
619 if (settings->Settings[i].IsNormalAuthentication) { 631 if (settings->Settings[i].IsNormalAuthentication) {
620 sprintf(buffer,"Authentication%02i = Normal%c%c",i,13,10); 632 sprintf(buffer,"Authentication%02i = Normal%c%c",i,13,10);
621 } else { 633 } else {
622 sprintf(buffer,"Authentication%02i = Secure%c%c",i,13,10); 634 sprintf(buffer,"Authentication%02i = Secure%c%c",i,13,10);
623 } 635 }
624 SaveBackupText(file, "", buffer, UseUnicode); 636 SaveBackupText(file, "", buffer, UseUnicode);
625 switch (settings->Settings[i].Speed) { 637 switch (settings->Settings[i].Speed) {
626 case WAPSETTINGS_SPEED_9600 : sprintf(buffer,"CallSpeed%02i = 9600%c%c" ,i,13,10); break; 638 case WAPSETTINGS_SPEED_9600 : sprintf(buffer,"CallSpeed%02i = 9600%c%c" ,i,13,10); break;
627 case WAPSETTINGS_SPEED_14400: sprintf(buffer,"CallSpeed%02i = 14400%c%c",i,13,10); break; 639 case WAPSETTINGS_SPEED_14400: sprintf(buffer,"CallSpeed%02i = 14400%c%c",i,13,10); break;
628 case WAPSETTINGS_SPEED_AUTO : sprintf(buffer,"CallSpeed%02i = auto%c%c" ,i,13,10); break; 640 case WAPSETTINGS_SPEED_AUTO : sprintf(buffer,"CallSpeed%02i = auto%c%c" ,i,13,10); break;
629 } 641 }
630 switch (settings->Settings[i].Speed) { 642 switch (settings->Settings[i].Speed) {
631 case WAPSETTINGS_SPEED_9600 : 643 case WAPSETTINGS_SPEED_9600 :
632 case WAPSETTINGS_SPEED_14400: 644 case WAPSETTINGS_SPEED_14400:
633 case WAPSETTINGS_SPEED_AUTO : 645 case WAPSETTINGS_SPEED_AUTO :
634 SaveBackupText(file, "", buffer, UseUnicode); 646 SaveBackupText(file, "", buffer, UseUnicode);
635 default: 647 default:
636 break; 648 break;
637 } 649 }
638 sprintf(buffer,"User%02i",i); 650 sprintf(buffer,"User%02i",i);
639 SaveBackupText(file, buffer, settings->Settings[i].User, UseUnicode); 651 SaveBackupText(file, buffer, settings->Settings[i].User, UseUnicode);
640 sprintf(buffer,"Password%02i",i); 652 sprintf(buffer,"Password%02i",i);
641 SaveBackupText(file, buffer, settings->Settings[i].Password, UseUnicode); 653 SaveBackupText(file, buffer, settings->Settings[i].Password, UseUnicode);
642 break; 654 break;
643 case WAPSETTINGS_BEARER_USSD: 655 case WAPSETTINGS_BEARER_USSD:
644 sprintf(buffer,"Bearer%02i = USSD%c%c",i,13,10); 656 sprintf(buffer,"Bearer%02i = USSD%c%c",i,13,10);
645 SaveBackupText(file, "", buffer, UseUnicode); 657 SaveBackupText(file, "", buffer, UseUnicode);
646 sprintf(buffer,"ServiceCode%02i",i); 658 sprintf(buffer,"ServiceCode%02i",i);
647 SaveBackupText(file, buffer, settings->Settings[i].Code, UseUnicode); 659 SaveBackupText(file, buffer, settings->Settings[i].Code, UseUnicode);
648 if (settings->Settings[i].IsIP) { 660 if (settings->Settings[i].IsIP) {
649 sprintf(buffer,"IP%02i",i); 661 sprintf(buffer,"IP%02i",i);
650 } else { 662 } else {
651 sprintf(buffer,"Number%02i",i); 663 sprintf(buffer,"Number%02i",i);
652 } 664 }
653 SaveBackupText(file, buffer, settings->Settings[i].Service, UseUnicode); 665 SaveBackupText(file, buffer, settings->Settings[i].Service, UseUnicode);
654 } 666 }
655 sprintf(buffer,"%c%c",13,10); 667 sprintf(buffer,"%c%c",13,10);
656 SaveBackupText(file, "", buffer, UseUnicode); 668 SaveBackupText(file, "", buffer, UseUnicode);
657 } 669 }
658} 670}
659 671
672static void SaveChatSettingsEntry(FILE *file, GSM_ChatSettings *settings, bool UseUnicode)
673{
674 char buffer[10000];
675
676 sprintf(buffer,"HomePage");
677 SaveBackupText(file, buffer, settings->HomePage, UseUnicode);
678 sprintf(buffer,"User");
679 SaveBackupText(file, buffer, settings->User, UseUnicode);
680 sprintf(buffer,"Password");
681 SaveBackupText(file, buffer, settings->Password, UseUnicode);
682 SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode);
683}
684
685static void SaveSyncMLSettingsEntry(FILE *file, GSM_SyncMLSettings *settings, bool UseUnicode)
686{
687 char buffer[10000];
688
689 sprintf(buffer,"User");
690 SaveBackupText(file, buffer, settings->User, UseUnicode);
691 sprintf(buffer,"Password");
692 SaveBackupText(file, buffer, settings->Password, UseUnicode);
693 sprintf(buffer,"PhonebookDB");
694 SaveBackupText(file, buffer, settings->PhonebookDataBase, UseUnicode);
695 sprintf(buffer,"CalendarDB");
696 SaveBackupText(file, buffer, settings->CalendarDataBase, UseUnicode);
697 sprintf(buffer,"Server");
698 SaveBackupText(file, buffer, settings->Server, UseUnicode);
699 if (settings->SyncPhonebook) {
700 sprintf(buffer,"SyncPhonebook = True%c%c",13,10);
701 } else {
702 sprintf(buffer,"SyncPhonebook = False%c%c",13,10);
703 }
704 SaveBackupText(file, "", buffer, UseUnicode);
705 if (settings->SyncCalendar) {
706 sprintf(buffer,"SyncCalendar = True%c%c",13,10);
707 } else {
708 sprintf(buffer,"SyncCalendar = False%c%c",13,10);
709 }
710 SaveBackupText(file, "", buffer, UseUnicode);
711 SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode);
712}
713
660static void SaveBitmapEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) 714static void SaveBitmapEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode)
661{ 715{
662 unsigned char buffer[10000],buffer2[10000]; 716 unsigned char buffer[10000],buffer2[10000];
663 int x,y; 717 int x,y;
664 718
665 sprintf(buffer,"Width = %i%c%c",bitmap->BitmapWidth,13,10); 719 sprintf(buffer,"Width = %i%c%c",bitmap->BitmapWidth,13,10);
666 SaveBackupText(file, "", buffer, UseUnicode); 720 SaveBackupText(file, "", buffer, UseUnicode);
667 sprintf(buffer,"Height = %i%c%c",bitmap->BitmapHeight,13,10); 721 sprintf(buffer,"Height = %i%c%c",bitmap->BitmapHeight,13,10);
668 SaveBackupText(file, "", buffer, UseUnicode); 722 SaveBackupText(file, "", buffer, UseUnicode);
669 for (y=0;y<bitmap->BitmapHeight;y++) { 723 for (y=0;y<bitmap->BitmapHeight;y++) {
670 for (x=0;x<bitmap->BitmapWidth;x++) { 724 for (x=0;x<bitmap->BitmapWidth;x++) {
671 buffer[x] = ' '; 725 buffer[x] = ' ';
672 if (GSM_IsPointBitmap(bitmap,x,y)) buffer[x]='#'; 726 if (GSM_IsPointBitmap(bitmap,x,y)) buffer[x]='#';
673 } 727 }
674 buffer[bitmap->BitmapWidth] = 0; 728 buffer[bitmap->BitmapWidth] = 0;
675 sprintf(buffer2,"Bitmap%02i = \"%s\"%c%c",y,buffer,13,10); 729 sprintf(buffer2,"Bitmap%02i = \"%s\"%c%c",y,buffer,13,10);
676 SaveBackupText(file, "", buffer2, UseUnicode); 730 SaveBackupText(file, "", buffer2, UseUnicode);
677 } 731 }
678} 732}
679 733
680static void SaveCallerEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) 734static void SaveCallerEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode)
681{ 735{
682 unsigned char buffer[1000]; 736 unsigned char buffer[1000];
683 737
684 sprintf(buffer,"Location = %03i%c%c",bitmap->Location,13,10); 738 sprintf(buffer,"Location = %03i%c%c",bitmap->Location,13,10);
685 SaveBackupText(file, "", buffer, UseUnicode); 739 SaveBackupText(file, "", buffer, UseUnicode);
686 if (!bitmap->DefaultName) SaveBackupText(file, "Name", bitmap->Text, UseUnicode); 740 if (!bitmap->DefaultName) SaveBackupText(file, "Name", bitmap->Text, UseUnicode);
687 if (!bitmap->DefaultRingtone) { 741 if (!bitmap->DefaultRingtone) {
688 if (bitmap->FileSystemRingtone) { 742 if (bitmap->FileSystemRingtone) {
689 sprintf(buffer,"FileRingtone = %02x%c%c",bitmap->RingtoneID,13,10); 743 sprintf(buffer,"FileRingtone = %02x%c%c",bitmap->RingtoneID,13,10);
690 } else { 744 } else {
691 sprintf(buffer,"Ringtone = %02x%c%c",bitmap->RingtoneID,13,10); 745 sprintf(buffer,"Ringtone = %02x%c%c",bitmap->RingtoneID,13,10);
692 } 746 }
693 SaveBackupText(file, "", buffer, UseUnicode); 747 SaveBackupText(file, "", buffer, UseUnicode);
694 } 748 }
695 if (bitmap->BitmapEnabled) { 749 if (bitmap->BitmapEnabled) {
696 sprintf(buffer,"Enabled = True%c%c",13,10); 750 sprintf(buffer,"Enabled = True%c%c",13,10);
697 } else { 751 } else {
698 sprintf(buffer,"Enabled = False%c%c",13,10); 752 sprintf(buffer,"Enabled = False%c%c",13,10);
699 } 753 }
700 SaveBackupText(file, "", buffer, UseUnicode); 754 SaveBackupText(file, "", buffer, UseUnicode);
701 if (!bitmap->DefaultBitmap) SaveBitmapEntry(file, bitmap, UseUnicode); 755 if (!bitmap->DefaultBitmap) SaveBitmapEntry(file, bitmap, UseUnicode);
702 sprintf(buffer,"%c%c",13,10); 756 sprintf(buffer,"%c%c",13,10);
703 SaveBackupText(file, "", buffer, UseUnicode); 757 SaveBackupText(file, "", buffer, UseUnicode);
704} 758}
705 759
706static void SaveWAPBookmarkEntry(FILE *file, GSM_WAPBookmark *bookmark, bool UseUnicode) 760static void SaveWAPBookmarkEntry(FILE *file, GSM_WAPBookmark *bookmark, bool UseUnicode)
707{ 761{
@@ -719,113 +773,114 @@ static void SaveStartupEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode)
719 773
720 sprintf(buffer,"[Startup]%c%c",13,10); 774 sprintf(buffer,"[Startup]%c%c",13,10);
721 SaveBackupText(file, "", buffer, UseUnicode); 775 SaveBackupText(file, "", buffer, UseUnicode);
722 if (bitmap->Type == GSM_WelcomeNote_Text) { 776 if (bitmap->Type == GSM_WelcomeNote_Text) {
723 SaveBackupText(file, "Text", bitmap->Text, UseUnicode); 777 SaveBackupText(file, "Text", bitmap->Text, UseUnicode);
724 } 778 }
725 if (bitmap->Type == GSM_StartupLogo) { 779 if (bitmap->Type == GSM_StartupLogo) {
726 SaveBitmapEntry(file, bitmap, UseUnicode); 780 SaveBitmapEntry(file, bitmap, UseUnicode);
727 } 781 }
728 sprintf(buffer,"%c%c",13,10); 782 sprintf(buffer,"%c%c",13,10);
729 SaveBackupText(file, "", buffer, UseUnicode); 783 SaveBackupText(file, "", buffer, UseUnicode);
730} 784}
731 785
732static void SaveSMSCEntry(FILE *file, GSM_SMSC *SMSC, bool UseUnicode) 786static void SaveSMSCEntry(FILE *file, GSM_SMSC *SMSC, bool UseUnicode)
733{ 787{
734 unsigned char buffer[1000]; 788 unsigned char buffer[1000];
735 789
736 sprintf(buffer,"Location = %03i%c%c",SMSC->Location,13,10); 790 sprintf(buffer,"Location = %03i%c%c",SMSC->Location,13,10);
737 SaveBackupText(file, "", buffer, UseUnicode); 791 SaveBackupText(file, "", buffer, UseUnicode);
738 SaveBackupText(file, "Name", SMSC->Name, UseUnicode); 792 SaveBackupText(file, "Name", SMSC->Name, UseUnicode);
739 SaveBackupText(file, "Number", SMSC->Number, UseUnicode); 793 SaveBackupText(file, "Number", SMSC->Number, UseUnicode);
740 SaveBackupText(file, "DefaultNumber", SMSC->DefaultNumber, UseUnicode); 794 SaveBackupText(file, "DefaultNumber", SMSC->DefaultNumber, UseUnicode);
741 SaveBackupText(file, "", "Format = ", UseUnicode); 795 SaveBackupText(file, "", "Format = ", UseUnicode);
742 switch (SMSC->Format) { 796 switch (SMSC->Format) {
743 case SMS_FORMAT_Text: sprintf(buffer,"Text"); break; 797 case SMS_FORMAT_Text: sprintf(buffer,"Text"); break;
744 case SMS_FORMAT_Fax: sprintf(buffer,"Fax"); break; 798 case SMS_FORMAT_Fax: sprintf(buffer,"Fax"); break;
745 case SMS_FORMAT_Email: sprintf(buffer,"Email"); break; 799 case SMS_FORMAT_Email: sprintf(buffer,"Email"); break;
746 case SMS_FORMAT_Pager: sprintf(buffer,"Pager"); break; 800 case SMS_FORMAT_Pager: sprintf(buffer,"Pager"); break;
747 } 801 }
748 SaveBackupText(file, "", buffer, UseUnicode); 802 SaveBackupText(file, "", buffer, UseUnicode);
749 sprintf(buffer,"%c%cValidity = ",13,10); 803 sprintf(buffer,"%c%cValidity = ",13,10);
750 SaveBackupText(file, "", buffer, UseUnicode); 804 SaveBackupText(file, "", buffer, UseUnicode);
751 switch (SMSC->Validity.Relative) { 805 switch (SMSC->Validity.Relative) {
752 case SMS_VALID_1_Hour : sprintf(buffer, "1hour"); break; 806 case SMS_VALID_1_Hour : sprintf(buffer, "1hour"); break;
753 case SMS_VALID_6_Hours : sprintf(buffer, "6hours"); break; 807 case SMS_VALID_6_Hours : sprintf(buffer, "6hours"); break;
754 case SMS_VALID_1_Day : sprintf(buffer, "24hours"); break; 808 case SMS_VALID_1_Day : sprintf(buffer, "24hours"); break;
755 case SMS_VALID_3_Days : sprintf(buffer, "72hours"); break; 809 case SMS_VALID_3_Days : sprintf(buffer, "72hours"); break;
756 case SMS_VALID_1_Week : sprintf(buffer, "1week"); break; 810 case SMS_VALID_1_Week : sprintf(buffer, "1week"); break;
757 case SMS_VALID_Max_Time: 811 case SMS_VALID_Max_Time:
758 default : sprintf(buffer,"MaximumTime"); break; 812 default : sprintf(buffer,"MaximumTime"); break;
759 } 813 }
760 SaveBackupText(file, "", buffer, UseUnicode); 814 SaveBackupText(file, "", buffer, UseUnicode);
761 sprintf(buffer,"%c%c%c%c",13,10,13,10); 815 sprintf(buffer,"%c%c%c%c",13,10,13,10);
762 SaveBackupText(file, "", buffer, UseUnicode); 816 SaveBackupText(file, "", buffer, UseUnicode);
763} 817}
764 818
765static void SaveRingtoneEntry(FILE *file, GSM_Ringtone *ringtone, bool UseUnicode) 819static void SaveRingtoneEntry(FILE *file, GSM_Ringtone *ringtone, bool UseUnicode)
766{ 820{
767 unsigned char buffer[45000]; 821 unsigned char buffer[45000];
768 int i,j;
769 822
770 sprintf(buffer,"Location = %i%c%c",ringtone->Location,13,10); 823 sprintf(buffer,"Location = %i%c%c",ringtone->Location,13,10);
771 SaveBackupText(file, "", buffer, UseUnicode); 824 SaveBackupText(file, "", buffer, UseUnicode);
772 SaveBackupText(file, "Name", ringtone->Name, UseUnicode); 825 SaveBackupText(file, "Name", ringtone->Name, UseUnicode);
773 switch (ringtone->Format) { 826 switch (ringtone->Format) {
774 case RING_NOKIABINARY: 827 case RING_NOKIABINARY:
775 j = 0; i = 0;
776 EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); 828 EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length);
777 SaveLinkedBackupText(file, "NokiaBinary", buffer, UseUnicode); 829 SaveLinkedBackupText(file, "NokiaBinary", buffer, UseUnicode);
778 break; 830 break;
779 case RING_MIDI: 831 case RING_MIDI:
780 j = 0; i = 0;
781 EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); 832 EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length);
782 SaveLinkedBackupText(file, "Pure Midi", buffer, UseUnicode); 833 SaveLinkedBackupText(file, "Pure Midi", buffer, UseUnicode);
783 break; 834 break;
835 case RING_MMF:
836 EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length);
837 SaveLinkedBackupText(file, "SMAF", buffer, UseUnicode);
838 break;
784 case RING_NOTETONE: 839 case RING_NOTETONE:
785 break; 840 break;
786 } 841 }
787 sprintf(buffer,"%c%c",13,10); 842 sprintf(buffer,"%c%c",13,10);
788 SaveBackupText(file, "", buffer, UseUnicode); 843 SaveBackupText(file, "", buffer, UseUnicode);
789} 844}
790 845
791static void SaveOperatorEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) 846static void SaveOperatorEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode)
792{ 847{
793 unsigned char buffer[1000]; 848 unsigned char buffer[1000];
794 849
795 sprintf(buffer,"[Operator]%c%c",13,10); 850 sprintf(buffer,"[Operator]%c%c",13,10);
796 SaveBackupText(file, "", buffer, UseUnicode); 851 SaveBackupText(file, "", buffer, UseUnicode);
797 sprintf(buffer,"Network = \"%s\"%c%c", bitmap->NetworkCode,13,10); 852 sprintf(buffer,"Network = \"%s\"%c%c", bitmap->NetworkCode,13,10);
798 SaveBackupText(file, "", buffer, UseUnicode); 853 SaveBackupText(file, "", buffer, UseUnicode);
799 SaveBitmapEntry(file, bitmap, UseUnicode); 854 SaveBitmapEntry(file, bitmap, UseUnicode);
800 sprintf(buffer,"%c%c",13,10); 855 sprintf(buffer,"%c%c",13,10);
801 SaveBackupText(file, "", buffer, UseUnicode); 856 SaveBackupText(file, "", buffer, UseUnicode);
802} 857}
803 858
804static void SaveToDoEntry(FILE *file, GSM_ToDoEntry *ToDo, bool UseUnicode) 859static void SaveToDoEntry(FILE *file, GSM_ToDoEntry *ToDo, bool UseUnicode)
805{ 860{
806 unsigned char buffer[1000]; 861 unsigned char buffer[1000];
807 int j; 862 int j;
808 863
809 sprintf(buffer,"Location = %i%c%c",ToDo->Location,13,10); 864 sprintf(buffer,"Location = %i%c%c",ToDo->Location,13,10);
810 SaveBackupText(file, "", buffer, UseUnicode); 865 SaveBackupText(file, "", buffer, UseUnicode);
811 switch (ToDo->Priority) { 866 switch (ToDo->Priority) {
812 case GSM_Priority_High: 867 case GSM_Priority_High:
813 sprintf(buffer,"Priority = High%c%c",13,10); 868 sprintf(buffer,"Priority = High%c%c",13,10);
814 break; 869 break;
815 case GSM_Priority_Medium: 870 case GSM_Priority_Medium:
816 sprintf(buffer,"Priority = Medium%c%c",13,10); 871 sprintf(buffer,"Priority = Medium%c%c",13,10);
817 break; 872 break;
818 case GSM_Priority_Low: 873 case GSM_Priority_Low:
819 sprintf(buffer,"Priority = Low%c%c",13,10); 874 sprintf(buffer,"Priority = Low%c%c",13,10);
820 break; 875 break;
821 } 876 }
822 SaveBackupText(file, "", buffer, UseUnicode); 877 SaveBackupText(file, "", buffer, UseUnicode);
823 878
824 for (j=0;j<ToDo->EntriesNum;j++) { 879 for (j=0;j<ToDo->EntriesNum;j++) {
825 switch (ToDo->Entries[j].EntryType) { 880 switch (ToDo->Entries[j].EntryType) {
826 case TODO_END_DATETIME: 881 case TODO_END_DATETIME:
827 SaveBackupText(file, "", "DueTime", UseUnicode); 882 SaveBackupText(file, "", "DueTime", UseUnicode);
828 SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode); 883 SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode);
829 break; 884 break;
830 case TODO_COMPLETED: 885 case TODO_COMPLETED:
831 sprintf(buffer,"Completed = %s%c%c",ToDo->Entries[j].Number == 1 ? "yes" : "no" ,13,10); 886 sprintf(buffer,"Completed = %s%c%c",ToDo->Entries[j].Number == 1 ? "yes" : "no" ,13,10);
@@ -1030,131 +1085,152 @@ GSM_Error SaveBackup(char *FileName, GSM_Backup *backup, bool UseUnicode)
1030 if (UseUnicode) { 1085 if (UseUnicode) {
1031 sprintf(buffer,"%c%c", 0xFE, 0xFF); 1086 sprintf(buffer,"%c%c", 0xFE, 0xFF);
1032 SaveBackupText(file, "", buffer, false); 1087 SaveBackupText(file, "", buffer, false);
1033 } 1088 }
1034 1089
1035 sprintf(buffer,"# Format of this file was designed for Gammu (see www.mwiacek.com)%c%c%c%c",13,10,13,10); 1090 sprintf(buffer,"# Format of this file was designed for Gammu (see www.mwiacek.com)%c%c%c%c",13,10,13,10);
1036 SaveBackupText(file, "", buffer, UseUnicode); 1091 SaveBackupText(file, "", buffer, UseUnicode);
1037 sprintf(buffer,"[Backup]%c%c",13,10); 1092 sprintf(buffer,"[Backup]%c%c",13,10);
1038 SaveBackupText(file, "", buffer, UseUnicode); 1093 SaveBackupText(file, "", buffer, UseUnicode);
1039 sprintf(buffer,"IMEI = \"%s\"%c%c",backup->IMEI,13,10); 1094 sprintf(buffer,"IMEI = \"%s\"%c%c",backup->IMEI,13,10);
1040 SaveBackupText(file, "", buffer, UseUnicode); 1095 SaveBackupText(file, "", buffer, UseUnicode);
1041 sprintf(buffer,"Phone = \"%s\"%c%c",backup->Model,13,10); 1096 sprintf(buffer,"Phone = \"%s\"%c%c",backup->Model,13,10);
1042 SaveBackupText(file, "", buffer, UseUnicode); 1097 SaveBackupText(file, "", buffer, UseUnicode);
1043 if (backup->Creator[0] != 0) { 1098 if (backup->Creator[0] != 0) {
1044 sprintf(buffer,"Creator = \"%s\"%c%c",backup->Creator,13,10); 1099 sprintf(buffer,"Creator = \"%s\"%c%c",backup->Creator,13,10);
1045 SaveBackupText(file, "", buffer, UseUnicode); 1100 SaveBackupText(file, "", buffer, UseUnicode);
1046 } 1101 }
1047 if (backup->DateTimeAvailable) { 1102 if (backup->DateTimeAvailable) {
1048 SaveBackupText(file, "", "DateTime", UseUnicode); 1103 SaveBackupText(file, "", "DateTime", UseUnicode);
1049 SaveVCalDateTime(file, &backup->DateTime, UseUnicode); 1104 SaveVCalDateTime(file, &backup->DateTime, UseUnicode);
1050 } 1105 }
1051 sprintf(buffer,"Format = 1.03%c%c",13,10); 1106 sprintf(buffer,"Format = 1.03%c%c",13,10);
1052 SaveBackupText(file, "", buffer, UseUnicode); 1107 SaveBackupText(file, "", buffer, UseUnicode);
1053 sprintf(buffer,"%c%c",13,10); 1108 sprintf(buffer,"%c%c",13,10);
1054 SaveBackupText(file, "", buffer, UseUnicode); 1109 SaveBackupText(file, "", buffer, UseUnicode);
1055 1110
1056 i=0; 1111 i=0;
1057 while (backup->PhonePhonebook[i]!=NULL) { 1112 while (backup->PhonePhonebook[i]!=NULL) {
1058 sprintf(buffer,"[PhonePBK%03i]%c%c",i+1,13,10); 1113 sprintf(buffer,"[PhonePBK%03i]%c%c",i+1,13,10);
1059 SaveBackupText(file, "", buffer, UseUnicode); 1114 SaveBackupText(file, "", buffer, UseUnicode);
1060 SavePbkEntry(file, backup->PhonePhonebook[i], UseUnicode); 1115 SavePbkEntry(file, backup->PhonePhonebook[i], UseUnicode);
1061 i++; 1116 i++;
1062 } 1117 }
1063 i=0; 1118 i=0;
1064 while (backup->SIMPhonebook[i]!=NULL) { 1119 while (backup->SIMPhonebook[i]!=NULL) {
1065 sprintf(buffer,"[SIMPBK%03i]%c%c",i+1,13,10); 1120 sprintf(buffer,"[SIMPBK%03i]%c%c",i+1,13,10);
1066 SaveBackupText(file, "", buffer, UseUnicode); 1121 SaveBackupText(file, "", buffer, UseUnicode);
1067 SavePbkEntry(file, backup->SIMPhonebook[i], UseUnicode); 1122 SavePbkEntry(file, backup->SIMPhonebook[i], UseUnicode);
1068 i++; 1123 i++;
1069 } 1124 }
1070 i=0; 1125 i=0;
1071 while (backup->Calendar[i]!=NULL) { 1126 while (backup->Calendar[i]!=NULL) {
1072 sprintf(buffer,"[Calendar%03i]%c%c",i+1,13,10); 1127 sprintf(buffer,"[Calendar%03i]%c%c",i+1,13,10);
1073 SaveBackupText(file, "", buffer, UseUnicode); 1128 SaveBackupText(file, "", buffer, UseUnicode);
1074 SaveCalendarEntry(file, backup->Calendar[i], UseUnicode); 1129 SaveCalendarEntry(file, backup->Calendar[i], UseUnicode);
1075 i++; 1130 i++;
1076 } 1131 }
1077 i=0; 1132 i=0;
1133 while (backup->Note[i]!=NULL) {
1134 sprintf(buffer,"[Note%03i]%c%c",i+1,13,10);
1135 SaveBackupText(file, "", buffer, UseUnicode);
1136 SaveNoteEntry(file, backup->Note[i], UseUnicode);
1137 i++;
1138 }
1139 i=0;
1078 while (backup->CallerLogos[i]!=NULL) { 1140 while (backup->CallerLogos[i]!=NULL) {
1079 sprintf(buffer,"[Caller%03i]%c%c",i+1,13,10); 1141 sprintf(buffer,"[Caller%03i]%c%c",i+1,13,10);
1080 SaveBackupText(file, "", buffer, UseUnicode); 1142 SaveBackupText(file, "", buffer, UseUnicode);
1081 SaveCallerEntry(file, backup->CallerLogos[i], UseUnicode); 1143 SaveCallerEntry(file, backup->CallerLogos[i], UseUnicode);
1082 i++; 1144 i++;
1083 } 1145 }
1084 i=0; 1146 i=0;
1085 while (backup->SMSC[i]!=NULL) { 1147 while (backup->SMSC[i]!=NULL) {
1086 sprintf(buffer,"[SMSC%03i]%c%c",i+1,13,10); 1148 sprintf(buffer,"[SMSC%03i]%c%c",i+1,13,10);
1087 SaveBackupText(file, "", buffer, UseUnicode); 1149 SaveBackupText(file, "", buffer, UseUnicode);
1088 SaveSMSCEntry(file, backup->SMSC[i], UseUnicode); 1150 SaveSMSCEntry(file, backup->SMSC[i], UseUnicode);
1089 i++; 1151 i++;
1090 } 1152 }
1091 i=0; 1153 i=0;
1092 while (backup->WAPBookmark[i]!=NULL) { 1154 while (backup->WAPBookmark[i]!=NULL) {
1093 sprintf(buffer,"[WAPBookmark%03i]%c%c",i+1,13,10); 1155 sprintf(buffer,"[WAPBookmark%03i]%c%c",i+1,13,10);
1094 SaveBackupText(file, "", buffer, UseUnicode); 1156 SaveBackupText(file, "", buffer, UseUnicode);
1095 SaveWAPBookmarkEntry(file, backup->WAPBookmark[i], UseUnicode); 1157 SaveWAPBookmarkEntry(file, backup->WAPBookmark[i], UseUnicode);
1096 i++; 1158 i++;
1097 } 1159 }
1098 i=0; 1160 i=0;
1099 while (backup->WAPSettings[i]!=NULL) { 1161 while (backup->WAPSettings[i]!=NULL) {
1100 sprintf(buffer,"[WAPSettings%03i]%c%c",i+1,13,10); 1162 sprintf(buffer,"[WAPSettings%03i]%c%c",i+1,13,10);
1101 SaveBackupText(file, "", buffer, UseUnicode); 1163 SaveBackupText(file, "", buffer, UseUnicode);
1102 SaveWAPSettingsEntry(file, backup->WAPSettings[i], UseUnicode); 1164 SaveWAPSettingsEntry(file, backup->WAPSettings[i], UseUnicode);
1103 i++; 1165 i++;
1104 } 1166 }
1105 i=0; 1167 i=0;
1106 while (backup->MMSSettings[i]!=NULL) { 1168 while (backup->MMSSettings[i]!=NULL) {
1107 sprintf(buffer,"[MMSSettings%03i]%c%c",i+1,13,10); 1169 sprintf(buffer,"[MMSSettings%03i]%c%c",i+1,13,10);
1108 SaveBackupText(file, "", buffer, UseUnicode); 1170 SaveBackupText(file, "", buffer, UseUnicode);
1109 SaveWAPSettingsEntry(file, backup->MMSSettings[i], UseUnicode); 1171 SaveWAPSettingsEntry(file, backup->MMSSettings[i], UseUnicode);
1110 i++; 1172 i++;
1111 } 1173 }
1112 i=0; 1174 i=0;
1175 while (backup->SyncMLSettings[i]!=NULL) {
1176 sprintf(buffer,"[SyncMLSettings%03i]%c%c",i+1,13,10);
1177 SaveBackupText(file, "", buffer, UseUnicode);
1178 SaveSyncMLSettingsEntry(file, backup->SyncMLSettings[i], UseUnicode);
1179 i++;
1180 }
1181 i=0;
1182 while (backup->ChatSettings[i]!=NULL) {
1183 sprintf(buffer,"[ChatSettings%03i]%c%c",i+1,13,10);
1184 SaveBackupText(file, "", buffer, UseUnicode);
1185 SaveChatSettingsEntry(file, backup->ChatSettings[i], UseUnicode);
1186 i++;
1187 }
1188 i=0;
1113 while (backup->Ringtone[i]!=NULL) { 1189 while (backup->Ringtone[i]!=NULL) {
1114 sprintf(buffer,"[Ringtone%03i]%c%c",i+1,13,10); 1190 sprintf(buffer,"[Ringtone%03i]%c%c",i+1,13,10);
1115 SaveBackupText(file, "", buffer, UseUnicode); 1191 SaveBackupText(file, "", buffer, UseUnicode);
1116 SaveRingtoneEntry(file, backup->Ringtone[i], UseUnicode); 1192 SaveRingtoneEntry(file, backup->Ringtone[i], UseUnicode);
1117 i++; 1193 i++;
1118 } 1194 }
1119 i=0; 1195 i=0;
1120 while (backup->ToDo[i]!=NULL) { 1196 while (backup->ToDo[i]!=NULL) {
1121 sprintf(buffer,"[TODO%03i]%c%c",i+1,13,10); 1197 sprintf(buffer,"[TODO%03i]%c%c",i+1,13,10);
1122 SaveBackupText(file, "", buffer, UseUnicode); 1198 SaveBackupText(file, "", buffer, UseUnicode);
1123 SaveToDoEntry(file, backup->ToDo[i], UseUnicode); 1199 SaveToDoEntry(file, backup->ToDo[i], UseUnicode);
1124 i++; 1200 i++;
1125 } 1201 }
1126 i=0; 1202 i=0;
1127 while (backup->Profiles[i]!=NULL) { 1203 while (backup->Profiles[i]!=NULL) {
1128 sprintf(buffer,"[Profile%03i]%c%c",i+1,13,10); 1204 sprintf(buffer,"[Profile%03i]%c%c",i+1,13,10);
1129 SaveBackupText(file, "", buffer, UseUnicode); 1205 SaveBackupText(file, "", buffer, UseUnicode);
1130 SaveProfileEntry(file, backup->Profiles[i], UseUnicode); 1206 SaveProfileEntry(file, backup->Profiles[i], UseUnicode);
1131 i++; 1207 i++;
1132 } 1208 }
1133 i=0; 1209 i=0;
1134 while (backup->FMStation[i]!=NULL) { 1210 while (backup->FMStation[i]!=NULL) {
1135 sprintf(buffer,"[FMStation%03i]%c%c",i+1,13,10); 1211 sprintf(buffer,"[FMStation%03i]%c%c",i+1,13,10);
1136 SaveBackupText(file, "", buffer, UseUnicode); 1212 SaveBackupText(file, "", buffer, UseUnicode);
1137 SaveFMStationEntry(file, backup->FMStation[i], UseUnicode); 1213 SaveFMStationEntry(file, backup->FMStation[i], UseUnicode);
1138 i++; 1214 i++;
1139 } 1215 }
1140 i=0; 1216 i=0;
1141 while (backup->GPRSPoint[i]!=NULL) { 1217 while (backup->GPRSPoint[i]!=NULL) {
1142 sprintf(buffer,"[GPRSPoint%03i]%c%c",i+1,13,10); 1218 sprintf(buffer,"[GPRSPoint%03i]%c%c",i+1,13,10);
1143 SaveBackupText(file, "", buffer, UseUnicode); 1219 SaveBackupText(file, "", buffer, UseUnicode);
1144 SaveGPRSPointEntry(file, backup->GPRSPoint[i], UseUnicode); 1220 SaveGPRSPointEntry(file, backup->GPRSPoint[i], UseUnicode);
1145 i++; 1221 i++;
1146 } 1222 }
1147 1223
1148 if (backup->StartupLogo!=NULL) { 1224 if (backup->StartupLogo!=NULL) {
1149 SaveStartupEntry(file, backup->StartupLogo, UseUnicode); 1225 SaveStartupEntry(file, backup->StartupLogo, UseUnicode);
1150 } 1226 }
1151 if (backup->OperatorLogo!=NULL) { 1227 if (backup->OperatorLogo!=NULL) {
1152 SaveOperatorEntry(file, backup->OperatorLogo, UseUnicode); 1228 SaveOperatorEntry(file, backup->OperatorLogo, UseUnicode);
1153 } 1229 }
1154 1230
1155 fclose(file); 1231 fclose(file);
1156 1232
1157 FindBackupChecksum(FileName, UseUnicode, checksum); 1233 FindBackupChecksum(FileName, UseUnicode, checksum);
1158 1234
1159 file = fopen(FileName, "ab"); 1235 file = fopen(FileName, "ab");
1160 if (file == NULL) return ERR_CANTOPENFILE; 1236 if (file == NULL) return ERR_CANTOPENFILE;
@@ -2611,97 +2687,222 @@ GSM_Error LoadBackup(char *FileName, GSM_Backup *backup, bool UseUnicode)
2611 EncodeUnicode(buffer,"GPRSPoint",9); 2687 EncodeUnicode(buffer,"GPRSPoint",9);
2612 if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true; 2688 if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true;
2613 } else { 2689 } else {
2614 if (mystrncasecmp("GPRSPoint", h->SectionName, 9)) found = true; 2690 if (mystrncasecmp("GPRSPoint", h->SectionName, 9)) found = true;
2615 } 2691 }
2616 if (found) { 2692 if (found) {
2617 readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode); 2693 readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
2618 if (readvalue==NULL) break; 2694 if (readvalue==NULL) break;
2619 if (num < GSM_BACKUP_MAX_GPRSPOINT) { 2695 if (num < GSM_BACKUP_MAX_GPRSPOINT) {
2620 backup->GPRSPoint[num] = malloc(sizeof(GSM_GPRSAccessPoint)); 2696 backup->GPRSPoint[num] = malloc(sizeof(GSM_GPRSAccessPoint));
2621 if (backup->GPRSPoint[num] == NULL) return ERR_MOREMEMORY; 2697 if (backup->GPRSPoint[num] == NULL) return ERR_MOREMEMORY;
2622 backup->GPRSPoint[num + 1] = NULL; 2698 backup->GPRSPoint[num + 1] = NULL;
2623 } else { 2699 } else {
2624 dbgprintf("Increase GSM_BACKUP_MAX_GPRSPOINT\n"); 2700 dbgprintf("Increase GSM_BACKUP_MAX_GPRSPOINT\n");
2625 return ERR_MOREMEMORY; 2701 return ERR_MOREMEMORY;
2626 } 2702 }
2627 backup->GPRSPoint[num]->Location = num + 1; 2703 backup->GPRSPoint[num]->Location = num + 1;
2628 ReadGPRSPointEntry(file_info, h->SectionName, backup->GPRSPoint[num],UseUnicode); 2704 ReadGPRSPointEntry(file_info, h->SectionName, backup->GPRSPoint[num],UseUnicode);
2629 num++; 2705 num++;
2630 } 2706 }
2631 } 2707 }
2632 num = 0; 2708 num = 0;
2633 for (h = file_info; h != NULL; h = h->Next) { 2709 for (h = file_info; h != NULL; h = h->Next) {
2634 found = false; 2710 found = false;
2635 if (UseUnicode) { 2711 if (UseUnicode) {
2636 EncodeUnicode(buffer,"Note",4); 2712 EncodeUnicode(buffer,"Note",4);
2637 if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; 2713 if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true;
2638 } else { 2714 } else {
2639 if (mystrncasecmp("Note", h->SectionName, 4)) found = true; 2715 if (mystrncasecmp("Note", h->SectionName, 4)) found = true;
2640 } 2716 }
2641 if (found) { 2717 if (found) {
2642 readvalue = ReadCFGText(file_info, h->SectionName, "Text", UseUnicode); 2718 readvalue = ReadCFGText(file_info, h->SectionName, "Text", UseUnicode);
2643 if (readvalue==NULL) break; 2719 if (readvalue==NULL) break;
2644 if (num < GSM_BACKUP_MAX_NOTE) { 2720 if (num < GSM_BACKUP_MAX_NOTE) {
2645 backup->Note[num] = malloc(sizeof(GSM_NoteEntry)); 2721 backup->Note[num] = malloc(sizeof(GSM_NoteEntry));
2646 if (backup->Note[num] == NULL) return ERR_MOREMEMORY; 2722 if (backup->Note[num] == NULL) return ERR_MOREMEMORY;
2647 backup->Note[num + 1] = NULL; 2723 backup->Note[num + 1] = NULL;
2648 } else { 2724 } else {
2649 dbgprintf("Increase GSM_BACKUP_MAX_NOTE\n"); 2725 dbgprintf("Increase GSM_BACKUP_MAX_NOTE\n");
2650 return ERR_MOREMEMORY; 2726 return ERR_MOREMEMORY;
2651 } 2727 }
2652 ReadNoteEntry(file_info, h->SectionName, backup->Note[num],UseUnicode); 2728 ReadNoteEntry(file_info, h->SectionName, backup->Note[num],UseUnicode);
2653 num++; 2729 num++;
2654 } 2730 }
2655 } 2731 }
2656 if (backup->MD5Original[0]!=0) { 2732 if (backup->MD5Original[0]!=0) {
2657 FindBackupChecksum(FileName, UseUnicode, backup->MD5Calculated); 2733 FindBackupChecksum(FileName, UseUnicode, backup->MD5Calculated);
2658 } 2734 }
2659 2735 for (h = file_info; h != NULL; h = h->Next) {
2736 found = false;
2737 if (UseUnicode) {
2738 EncodeUnicode(buffer,"Backup",4);
2739 if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true;
2740 } else {
2741 if (mystrncasecmp("Backup", h->SectionName, 6)) found = true;
2742 }
2743 if (UseUnicode) {
2744 EncodeUnicode(buffer,"Checksum",4);
2745 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2746 } else {
2747 if (mystrncasecmp("Checksum", h->SectionName, 8)) found = true;
2748 }
2749 if (UseUnicode) {
2750 EncodeUnicode(buffer,"Profile",7);
2751 if (mywstrncasecmp(buffer, h->SectionName, 7)) found = true;
2752 } else {
2753 if (mystrncasecmp("Profile", h->SectionName, 7)) found = true;
2754 }
2755 if (UseUnicode) {
2756 EncodeUnicode(buffer,"PhonePBK",8);
2757 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2758 } else {
2759 if (mystrncasecmp("PhonePBK", h->SectionName, 8)) found = true;
2760 }
2761 if (UseUnicode) {
2762 EncodeUnicode(buffer,"SIMPBK",6);
2763 if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true;
2764 } else {
2765 if (mystrncasecmp("SIMPBK", h->SectionName, 6)) found = true;
2766 }
2767 if (UseUnicode) {
2768 EncodeUnicode(buffer,"Calendar",8);
2769 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2770 } else {
2771 if (mystrncasecmp("Calendar", h->SectionName, 8)) found = true;
2772 }
2773 if (UseUnicode) {
2774 EncodeUnicode(buffer,"Caller",6);
2775 if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true;
2776 } else {
2777 if (mystrncasecmp("Caller", h->SectionName, 6)) found = true;
2778 }
2779 if (UseUnicode) {
2780 EncodeUnicode(buffer,"SMSC",4);
2781 if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true;
2782 } else {
2783 if (mystrncasecmp("SMSC", h->SectionName, 4)) found = true;
2784 }
2785 if (UseUnicode) {
2786 EncodeUnicode(buffer,"WAPBookmark",11);
2787 if (mywstrncasecmp(buffer, h->SectionName, 11)) found = true;
2788 if (!found) {
2789 EncodeUnicode(buffer,"Bookmark",8);
2790 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2791 }
2792 } else {
2793 if (mystrncasecmp("WAPBookmark", h->SectionName, 11)) found = true;
2794 if (!found) {
2795 if (mystrncasecmp("Bookmark", h->SectionName, 8)) found = true;
2796 }
2797 }
2798 if (UseUnicode) {
2799 EncodeUnicode(buffer,"WAPSettings",11);
2800 if (mywstrncasecmp(buffer, h->SectionName, 11)) found = true;
2801 if (!found) {
2802 EncodeUnicode(buffer,"Settings",8);
2803 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2804 }
2805 } else {
2806 if (mystrncasecmp("WAPSettings", h->SectionName, 11)) found = true;
2807 if (!found) {
2808 if (mystrncasecmp("Settings", h->SectionName, 8)) found = true;
2809 }
2810 }
2811 if (UseUnicode) {
2812 EncodeUnicode(buffer,"MMSSettings",8);
2813 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2814 } else {
2815 if (mystrncasecmp("MMSSettings", h->SectionName, 8)) found = true;
2816 }
2817 if (UseUnicode) {
2818 EncodeUnicode(buffer,"Ringtone",8);
2819 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2820 } else {
2821 if (mystrncasecmp("Ringtone", h->SectionName, 8)) found = true;
2822 }
2823 if (UseUnicode) {
2824 EncodeUnicode(buffer,"TODO",4);
2825 if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true;
2826 } else {
2827 if (mystrncasecmp("TODO", h->SectionName, 4)) found = true;
2828 }
2829 if (UseUnicode) {
2830 EncodeUnicode(buffer,"Startup",7);
2831 if (mywstrncasecmp(buffer, h->SectionName, 7)) found = true;
2832 } else {
2833 if (mystrncasecmp("Startup", h->SectionName, 7)) found = true;
2834 }
2835 if (UseUnicode) {
2836 EncodeUnicode(buffer,"Operator",7);
2837 if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true;
2838 } else {
2839 if (mystrncasecmp("Operator", h->SectionName, 8)) found = true;
2840 }
2841 if (UseUnicode) {
2842 EncodeUnicode(buffer,"FMStation",9);
2843 if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true;
2844 } else {
2845 if (mystrncasecmp("FMStation", h->SectionName, 9)) found = true;
2846 }
2847 if (UseUnicode) {
2848 EncodeUnicode(buffer,"GPRSPoint",9);
2849 if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true;
2850 } else {
2851 if (mystrncasecmp("GPRSPoint", h->SectionName, 9)) found = true;
2852 }
2853 if (UseUnicode) {
2854 EncodeUnicode(buffer,"Note",4);
2855 if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true;
2856 } else {
2857 if (mystrncasecmp("Note", h->SectionName, 4)) found = true;
2858 }
2859 if (!found) return ERR_NOTIMPLEMENTED;
2860 }
2660 return ERR_NONE; 2861 return ERR_NONE;
2661} 2862}
2662 2863
2663/* ---------------------- backup files for SMS ----------------------------- */ 2864/* ---------------------- backup files for SMS ----------------------------- */
2664 2865
2665static void ReadSMSBackupEntry(INI_Section *file_info, char *section, GSM_SMSMessage *SMS) 2866static void ReadSMSBackupEntry(INI_Section *file_info, char *section, GSM_SMSMessage *SMS)
2666{ 2867{
2667 unsigned char buffer[10000], *readvalue; 2868 unsigned char buffer[10000], *readvalue;
2668 2869
2669 GSM_SetDefaultSMSData(SMS); 2870 GSM_SetDefaultSMSData(SMS);
2670 2871
2671 SMS->PDU = SMS_Submit; 2872 SMS->PDU = SMS_Submit;
2672 SMS->SMSC.Location = 0; 2873 SMS->SMSC.Location = 0;
2673 sprintf(buffer,"SMSC"); 2874 sprintf(buffer,"SMSC");
2674 ReadBackupText(file_info, section, buffer, SMS->SMSC.Number, false); 2875 ReadBackupText(file_info, section, buffer, SMS->SMSC.Number, false);
2675 sprintf(buffer,"ReplySMSC"); 2876 sprintf(buffer,"ReplySMSC");
2676 SMS->ReplyViaSameSMSC = false; 2877 SMS->ReplyViaSameSMSC = false;
2677 readvalue = ReadCFGText(file_info, section, buffer, false); 2878 readvalue = ReadCFGText(file_info, section, buffer, false);
2678 if (readvalue!=NULL) { 2879 if (readvalue!=NULL) {
2679 if (mystrncasecmp(readvalue,"True",0)) SMS->ReplyViaSameSMSC = true; 2880 if (mystrncasecmp(readvalue,"True",0)) SMS->ReplyViaSameSMSC = true;
2680 } 2881 }
2681 sprintf(buffer,"Class"); 2882 sprintf(buffer,"Class");
2682 SMS->Class = -1; 2883 SMS->Class = -1;
2683 readvalue = ReadCFGText(file_info, section, buffer, false); 2884 readvalue = ReadCFGText(file_info, section, buffer, false);
2684 if (readvalue!=NULL) SMS->Class = atoi(readvalue); 2885 if (readvalue!=NULL) SMS->Class = atoi(readvalue);
2685 sprintf(buffer,"Sent"); 2886 sprintf(buffer,"Sent");
2686 readvalue = ReadCFGText(file_info, section, buffer, false); 2887 readvalue = ReadCFGText(file_info, section, buffer, false);
2687 if (readvalue!=NULL) { 2888 if (readvalue!=NULL) {
2688 ReadVCALDateTime(readvalue, &SMS->DateTime); 2889 ReadVCALDateTime(readvalue, &SMS->DateTime);
2689 SMS->PDU = SMS_Deliver; 2890 SMS->PDU = SMS_Deliver;
2690 } 2891 }
2691 sprintf(buffer,"RejectDuplicates"); 2892 sprintf(buffer,"RejectDuplicates");
2692 SMS->RejectDuplicates = false; 2893 SMS->RejectDuplicates = false;
2693 readvalue = ReadCFGText(file_info, section, buffer, false); 2894 readvalue = ReadCFGText(file_info, section, buffer, false);
2694 if (readvalue!=NULL) { 2895 if (readvalue!=NULL) {
2695 if (mystrncasecmp(readvalue,"True",0)) SMS->RejectDuplicates = true; 2896 if (mystrncasecmp(readvalue,"True",0)) SMS->RejectDuplicates = true;
2696 } 2897 }
2697 sprintf(buffer,"ReplaceMessage"); 2898 sprintf(buffer,"ReplaceMessage");
2698 SMS->ReplaceMessage = 0; 2899 SMS->ReplaceMessage = 0;
2699 readvalue = ReadCFGText(file_info, section, buffer, false); 2900 readvalue = ReadCFGText(file_info, section, buffer, false);
2700 if (readvalue!=NULL) SMS->ReplaceMessage = atoi(readvalue); 2901 if (readvalue!=NULL) SMS->ReplaceMessage = atoi(readvalue);
2701 sprintf(buffer,"MessageReference"); 2902 sprintf(buffer,"MessageReference");
2702 SMS->MessageReference = 0; 2903 SMS->MessageReference = 0;
2703 readvalue = ReadCFGText(file_info, section, buffer, false); 2904 readvalue = ReadCFGText(file_info, section, buffer, false);
2704 if (readvalue!=NULL) SMS->MessageReference = atoi(readvalue); 2905 if (readvalue!=NULL) SMS->MessageReference = atoi(readvalue);
2705 sprintf(buffer,"State"); 2906 sprintf(buffer,"State");
2706 SMS->State = SMS_UnRead; 2907 SMS->State = SMS_UnRead;
2707 readvalue = ReadCFGText(file_info, section, buffer, false); 2908 readvalue = ReadCFGText(file_info, section, buffer, false);
diff --git a/gammu/emb/common/service/backup/gsmback.c b/gammu/emb/common/service/backup/gsmback.c
index 91ac745..c94a4d2 100644
--- a/gammu/emb/common/service/backup/gsmback.c
+++ b/gammu/emb/common/service/backup/gsmback.c
@@ -28,253 +28,271 @@ void GSM_FreeBackup(GSM_Backup *backup)
28 while (backup->PhonePhonebook[i]!=NULL) { 28 while (backup->PhonePhonebook[i]!=NULL) {
29 free(backup->PhonePhonebook[i]); 29 free(backup->PhonePhonebook[i]);
30 backup->PhonePhonebook[i] = NULL; 30 backup->PhonePhonebook[i] = NULL;
31 i++; 31 i++;
32 } 32 }
33 i=0; 33 i=0;
34 while (backup->SIMPhonebook[i]!=NULL) { 34 while (backup->SIMPhonebook[i]!=NULL) {
35 free(backup->SIMPhonebook[i]); 35 free(backup->SIMPhonebook[i]);
36 backup->SIMPhonebook[i] = NULL; 36 backup->SIMPhonebook[i] = NULL;
37 i++; 37 i++;
38 } 38 }
39 i=0; 39 i=0;
40 while (backup->Calendar[i]!=NULL) { 40 while (backup->Calendar[i]!=NULL) {
41 free(backup->Calendar[i]); 41 free(backup->Calendar[i]);
42 backup->Calendar[i] = NULL; 42 backup->Calendar[i] = NULL;
43 i++; 43 i++;
44 } 44 }
45 i=0; 45 i=0;
46 while (backup->CallerLogos[i]!=NULL) { 46 while (backup->CallerLogos[i]!=NULL) {
47 free(backup->CallerLogos[i]); 47 free(backup->CallerLogos[i]);
48 backup->CallerLogos[i] = NULL; 48 backup->CallerLogos[i] = NULL;
49 i++; 49 i++;
50 } 50 }
51 i=0; 51 i=0;
52 while (backup->SMSC[i]!=NULL) { 52 while (backup->SMSC[i]!=NULL) {
53 free(backup->SMSC[i]); 53 free(backup->SMSC[i]);
54 backup->SMSC[i] = NULL; 54 backup->SMSC[i] = NULL;
55 i++; 55 i++;
56 } 56 }
57 i=0; 57 i=0;
58 while (backup->WAPBookmark[i]!=NULL) { 58 while (backup->WAPBookmark[i]!=NULL) {
59 free(backup->WAPBookmark[i]); 59 free(backup->WAPBookmark[i]);
60 backup->WAPBookmark[i] = NULL; 60 backup->WAPBookmark[i] = NULL;
61 i++; 61 i++;
62 } 62 }
63 i=0; 63 i=0;
64 while (backup->WAPSettings[i]!=NULL) { 64 while (backup->WAPSettings[i]!=NULL) {
65 free(backup->WAPSettings[i]); 65 free(backup->WAPSettings[i]);
66 backup->WAPSettings[i] = NULL; 66 backup->WAPSettings[i] = NULL;
67 i++; 67 i++;
68 } 68 }
69 i=0; 69 i=0;
70 while (backup->MMSSettings[i]!=NULL) { 70 while (backup->MMSSettings[i]!=NULL) {
71 free(backup->MMSSettings[i]); 71 free(backup->MMSSettings[i]);
72 backup->MMSSettings[i] = NULL; 72 backup->MMSSettings[i] = NULL;
73 i++; 73 i++;
74 } 74 }
75 i=0; 75 i=0;
76 while (backup->SyncMLSettings[i]!=NULL) {
77 free(backup->SyncMLSettings[i]);
78 backup->SyncMLSettings[i] = NULL;
79 i++;
80 }
81 i=0;
82 while (backup->ChatSettings[i]!=NULL) {
83 free(backup->ChatSettings[i]);
84 backup->ChatSettings[i] = NULL;
85 i++;
86 }
87 i=0;
76 while (backup->Ringtone[i]!=NULL) { 88 while (backup->Ringtone[i]!=NULL) {
77 free(backup->Ringtone[i]); 89 free(backup->Ringtone[i]);
78 backup->Ringtone[i] = NULL; 90 backup->Ringtone[i] = NULL;
79 i++; 91 i++;
80 } 92 }
81 i=0; 93 i=0;
82 while (backup->ToDo[i]!=NULL) { 94 while (backup->ToDo[i]!=NULL) {
83 free(backup->ToDo[i]); 95 free(backup->ToDo[i]);
84 backup->ToDo[i] = NULL; 96 backup->ToDo[i] = NULL;
85 i++; 97 i++;
86 } 98 }
87 i=0; 99 i=0;
88 while (backup->Profiles[i]!=NULL) { 100 while (backup->Profiles[i]!=NULL) {
89 free(backup->Profiles[i]); 101 free(backup->Profiles[i]);
90 backup->Profiles[i] = NULL; 102 backup->Profiles[i] = NULL;
91 i++; 103 i++;
92 } 104 }
93 i=0; 105 i=0;
94 while (backup->FMStation[i]!=NULL) { 106 while (backup->FMStation[i]!=NULL) {
95 free(backup->FMStation[i]); 107 free(backup->FMStation[i]);
96 backup->FMStation[i] = NULL; 108 backup->FMStation[i] = NULL;
97 i++; 109 i++;
98 } 110 }
99 if (backup->StartupLogo!=NULL) { 111 if (backup->StartupLogo!=NULL) {
100 free(backup->StartupLogo); 112 free(backup->StartupLogo);
101 backup->StartupLogo = NULL; 113 backup->StartupLogo = NULL;
102 } 114 }
103 if (backup->OperatorLogo!=NULL) { 115 if (backup->OperatorLogo!=NULL) {
104 free(backup->OperatorLogo); 116 free(backup->OperatorLogo);
105 backup->OperatorLogo = NULL; 117 backup->OperatorLogo = NULL;
106 } 118 }
107 i=0; 119 i=0;
108 while (backup->GPRSPoint[i]!=NULL) { 120 while (backup->GPRSPoint[i]!=NULL) {
109 free(backup->GPRSPoint[i]); 121 free(backup->GPRSPoint[i]);
110 backup->GPRSPoint[i] = NULL; 122 backup->GPRSPoint[i] = NULL;
111 i++; 123 i++;
112 } 124 }
113 i=0; 125 i=0;
114 while (backup->Note[i]!=NULL) { 126 while (backup->Note[i]!=NULL) {
115 free(backup->Note[i]); 127 free(backup->Note[i]);
116 backup->Note[i] = NULL; 128 backup->Note[i] = NULL;
117 i++; 129 i++;
118 } 130 }
119} 131}
120 132
121GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, bool UseUnicode) 133GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, bool UseUnicode)
122{ 134{
123 if (strstr(FileName,".lmb")) { 135 if (mystrcasestr(FileName,".lmb")) {
124 return SaveLMB(FileName,backup); 136 return SaveLMB(FileName,backup);
125 } else if (strstr(FileName,".vcs")) { 137 } else if (mystrcasestr(FileName,".vcs")) {
126 return SaveVCalendar(FileName,backup); 138 return SaveVCalendar(FileName,backup);
127 } else if (strstr(FileName,".vcf")) { 139 } else if (mystrcasestr(FileName,".vcf")) {
128 return SaveVCard(FileName,backup); 140 return SaveVCard(FileName,backup);
129 } else if (strstr(FileName,".ldif")) { 141 } else if (mystrcasestr(FileName,".ldif")) {
130 return SaveLDIF(FileName,backup); 142 return SaveLDIF(FileName,backup);
131 } else if (strstr(FileName,".ics")) { 143 } else if (mystrcasestr(FileName,".ics")) {
132 return SaveICS(FileName,backup); 144 return SaveICS(FileName,backup);
133 } else { 145 } else {
134 return SaveBackup(FileName,backup, UseUnicode); 146 return SaveBackup(FileName,backup, UseUnicode);
135 } 147 }
136} 148}
137 149
138GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup) 150GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup)
139{ 151{
140 FILE *file; 152 FILE *file;
141 unsigned charbuffer[300]; 153 unsigned charbuffer[300];
142 154
143 file = fopen(FileName, "rb"); 155 file = fopen(FileName, "rb");
144 if (file == NULL) return ERR_CANTOPENFILE; 156 if (file == NULL) return ERR_CANTOPENFILE;
145 fread(buffer, 1, 9, file); /* Read the header of the file. */ 157 fread(buffer, 1, 9, file); /* Read the header of the file. */
146 fclose(file); 158 fclose(file);
147 159
148 GSM_ClearBackup(backup); 160 GSM_ClearBackup(backup);
149 161
150 /* Attempt to identify filetype */ 162 /* Attempt to identify filetype */
151 if (strstr(FileName,".vcs")) { 163 if (mystrcasestr(FileName,".vcs")) {
152 return LoadVCalendar(FileName,backup); 164 return LoadVCalendar(FileName,backup);
153 } else if (strstr(FileName,".vcf")) { 165 } else if (mystrcasestr(FileName,".vcf")) {
154 return LoadVCard(FileName,backup); 166 return LoadVCard(FileName,backup);
155 } else if (strstr(FileName,".ldif")) { 167 } else if (mystrcasestr(FileName,".ldif")) {
156 return LoadLDIF(FileName,backup); 168 return LoadLDIF(FileName,backup);
157 } else if (strstr(FileName,".ics")) { 169 } else if (mystrcasestr(FileName,".ics")) {
158 return LoadICS(FileName,backup); 170 return LoadICS(FileName,backup);
159 } else if (memcmp(buffer, "LMB ",4)==0) { 171 } else if (memcmp(buffer, "LMB ",4)==0) {
160 return LoadLMB(FileName,backup); 172 return LoadLMB(FileName,backup);
161 } else if (buffer[0] == 0xFE && buffer[1] == 0xFF) { 173 } else if (buffer[0] == 0xFE && buffer[1] == 0xFF) {
162 return LoadBackup(FileName,backup,true); 174 return LoadBackup(FileName,backup,true);
163 } else if (buffer[0] == 0xFF && buffer[1] == 0xFE) { 175 } else if (buffer[0] == 0xFF && buffer[1] == 0xFE) {
164 return LoadBackup(FileName,backup,true); 176 return LoadBackup(FileName,backup,true);
165 } else { 177 } else {
166 return LoadBackup(FileName,backup,false); 178 return LoadBackup(FileName,backup,false);
167 } 179 }
168} 180}
169 181
170void GSM_ClearBackup(GSM_Backup *backup) 182void GSM_ClearBackup(GSM_Backup *backup)
171{ 183{
172 backup->PhonePhonebook[0] = NULL; 184 backup->PhonePhonebook[0] = NULL;
173 backup->SIMPhonebook[0] = NULL; 185 backup->SIMPhonebook[0] = NULL;
174 backup->Calendar[0] = NULL; 186 backup->Calendar[0] = NULL;
175 backup->CallerLogos[0] = NULL; 187 backup->CallerLogos[0] = NULL;
176 backup->SMSC [0] = NULL; 188 backup->SMSC [0] = NULL;
177 backup->WAPBookmark[0] = NULL; 189 backup->WAPBookmark[0] = NULL;
178 backup->WAPSettings[0] = NULL; 190 backup->WAPSettings[0] = NULL;
179 backup->MMSSettings[0] = NULL; 191 backup->MMSSettings[0] = NULL;
192 backup->SyncMLSettings[0] = NULL;
193 backup->ChatSettings[0] = NULL;
180 backup->Ringtone[0] = NULL; 194 backup->Ringtone[0] = NULL;
181 backup->Profiles[0] = NULL; 195 backup->Profiles[0] = NULL;
182 backup->ToDo [0] = NULL; 196 backup->ToDo [0] = NULL;
183 backup->GPRSPoint[0] = NULL; 197 backup->GPRSPoint[0] = NULL;
184 backup->FMStation[0] = NULL; 198 backup->FMStation[0] = NULL;
185 backup->Note [0] = NULL; 199 backup->Note [0] = NULL;
186 backup->StartupLogo = NULL; 200 backup->StartupLogo = NULL;
187 backup->OperatorLogo = NULL; 201 backup->OperatorLogo = NULL;
188 202
189 backup->Creator [0] = 0; 203 backup->Creator [0] = 0;
190 backup->IMEI [0] = 0; 204 backup->IMEI [0] = 0;
191 backup->Model [0] = 0; 205 backup->Model [0] = 0;
192 backup->DateTimeAvailable = false; 206 backup->DateTimeAvailable = false;
193 backup->MD5Original[0] = 0; 207 backup->MD5Original[0] = 0;
194 backup->MD5Calculated[0] = 0; 208 backup->MD5Calculated[0] = 0;
195} 209}
196 210
197void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info) 211void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info)
198{ 212{
199 info->UseUnicode= false; 213 info->UseUnicode= false;
200 info->IMEI = false; 214 info->IMEI = false;
201 info->Model = false; 215 info->Model = false;
202 info->DateTime = false; 216 info->DateTime = false;
203 info->PhonePhonebook = false; 217 info->PhonePhonebook = false;
204 info->SIMPhonebook = false; 218 info->SIMPhonebook = false;
205 info->ToDo = false; 219 info->ToDo = false;
206 info->Calendar = false; 220 info->Calendar = false;
207 info->CallerLogos = false; 221 info->CallerLogos = false;
208 info->SMSC = false; 222 info->SMSC = false;
209 info->WAPBookmark = false; 223 info->WAPBookmark = false;
210 info->WAPSettings = false; 224 info->WAPSettings = false;
211 info->MMSSettings = false; 225 info->MMSSettings = false;
226 info->SyncMLSettings = false;
227 info->ChatSettings = false;
212 info->Ringtone = false; 228 info->Ringtone = false;
213 info->StartupLogo = false; 229 info->StartupLogo = false;
214 info->OperatorLogo = false; 230 info->OperatorLogo = false;
215 info->Profiles = false; 231 info->Profiles = false;
216 info->FMStation = false; 232 info->FMStation = false;
217 info->GPRSPoint = false; 233 info->GPRSPoint = false;
218 info->Note = false; 234 info->Note = false;
219 235
220 if (strstr(FileName,".lmb")) { 236 if (strstr(FileName,".lmb")) {
221 info->PhonePhonebook = true; 237 info->PhonePhonebook = true;
222 info->SIMPhonebook = true; 238 info->SIMPhonebook = true;
223 info->CallerLogos = true; 239 info->CallerLogos = true;
224 info->StartupLogo = true; 240 info->StartupLogo = true;
225 } else if (strstr(FileName,".vcs")) { 241 } else if (strstr(FileName,".vcs")) {
226 info->ToDo = true; 242 info->ToDo = true;
227 info->Calendar = true; 243 info->Calendar = true;
228 } else if (strstr(FileName,".vcf")) { 244 } else if (strstr(FileName,".vcf")) {
229 info->PhonePhonebook= true; 245 info->PhonePhonebook= true;
230 } else if (strstr(FileName,".ics")) { 246 } else if (strstr(FileName,".ics")) {
231 info->ToDo = true; 247 info->ToDo = true;
232 info->Calendar = true; 248 info->Calendar = true;
233 } else if (strstr(FileName,".ldif")) { 249 } else if (strstr(FileName,".ldif")) {
234 info->PhonePhonebook= true; 250 info->PhonePhonebook= true;
235 } else { 251 } else {
236 info->UseUnicode= true; 252 info->UseUnicode= true;
237 info->IMEI = true; 253 info->IMEI = true;
238 info->Model = true; 254 info->Model = true;
239 info->DateTime = true; 255 info->DateTime = true;
240 info->PhonePhonebook = true; 256 info->PhonePhonebook = true;
241 info->SIMPhonebook = true; 257 info->SIMPhonebook = true;
242 info->ToDo = true; 258 info->ToDo = true;
243 info->Calendar = true; 259 info->Calendar = true;
244 info->CallerLogos = true; 260 info->CallerLogos = true;
245 info->SMSC = true; 261 info->SMSC = true;
246 info->WAPBookmark = true; 262 info->WAPBookmark = true;
247 info->WAPSettings = true; 263 info->WAPSettings = true;
248 info->MMSSettings = true; 264 info->MMSSettings = true;
265 info->SyncMLSettings = true;
266 info->ChatSettings = true;
249 info->Ringtone = true; 267 info->Ringtone = true;
250 info->StartupLogo = true; 268 info->StartupLogo = true;
251 info->OperatorLogo = true; 269 info->OperatorLogo = true;
252 info->Profiles = true; 270 info->Profiles = true;
253 info->FMStation = true; 271 info->FMStation = true;
254 info->GPRSPoint = true; 272 info->GPRSPoint = true;
255 info->Note = true; 273 info->Note = true;
256 } 274 }
257} 275}
258 276
259void GSM_GetBackupFileFeatures(char *FileName, GSM_Backup_Info *info, GSM_Backup *backup) 277void GSM_GetBackupFileFeatures(char *FileName, GSM_Backup_Info *info, GSM_Backup *backup)
260{ 278{
261 GSM_GetBackupFormatFeatures(FileName, info); 279 GSM_GetBackupFormatFeatures(FileName, info);
262 280
263 if (info->PhonePhonebook && backup->PhonePhonebook[0] == NULL) info->PhonePhonebook = false; 281 if (info->PhonePhonebook && backup->PhonePhonebook[0] == NULL) info->PhonePhonebook = false;
264 if (info->SIMPhonebook && backup->SIMPhonebook[0] == NULL) info->SIMPhonebook = false; 282 if (info->SIMPhonebook && backup->SIMPhonebook[0] == NULL) info->SIMPhonebook = false;
265 if (info->Calendar && backup->Calendar[0] == NULL) info->Calendar = false; 283 if (info->Calendar && backup->Calendar[0] == NULL) info->Calendar = false;
266 if (info->ToDo && backup->ToDo[0] == NULL) info->ToDo = false; 284 if (info->ToDo && backup->ToDo[0] == NULL) info->ToDo = false;
267 if (info->WAPBookmark && backup->WAPBookmark[0] == NULL) info->WAPBookmark = false; 285 if (info->WAPBookmark && backup->WAPBookmark[0] == NULL) info->WAPBookmark = false;
268 if (info->WAPSettings && backup->WAPSettings[0] == NULL) info->WAPSettings = false; 286 if (info->WAPSettings && backup->WAPSettings[0] == NULL) info->WAPSettings = false;
269 if (info->MMSSettings && backup->MMSSettings[0] == NULL) info->MMSSettings = false; 287 if (info->MMSSettings && backup->MMSSettings[0] == NULL) info->MMSSettings = false;
270 if (info->FMStation && backup->FMStation[0] == NULL) info->FMStation = false; 288 if (info->FMStation && backup->FMStation[0] == NULL) info->FMStation = false;
271 if (info->GPRSPoint && backup->GPRSPoint[0] == NULL) info->GPRSPoint = false; 289 if (info->GPRSPoint && backup->GPRSPoint[0] == NULL) info->GPRSPoint = false;
272 if (info->Profiles && backup->Profiles[0] == NULL) info->Profiles = false; 290 if (info->Profiles && backup->Profiles[0] == NULL) info->Profiles = false;
273 /* .... */ 291 /* .... */
274} 292}
275 293
276#endif 294#endif
277 295
278/* How should editor hadle tabs in this file? Add editor commands here. 296/* How should editor hadle tabs in this file? Add editor commands here.
279 * vim: noexpandtab sw=8 ts=8 sts=8: 297 * vim: noexpandtab sw=8 ts=8 sts=8:
280 */ 298 */
diff --git a/gammu/emb/common/service/backup/gsmback.h b/gammu/emb/common/service/backup/gsmback.h
index 1fd99b0..791e81d 100644
--- a/gammu/emb/common/service/backup/gsmback.h
+++ b/gammu/emb/common/service/backup/gsmback.h
@@ -1,48 +1,50 @@
1/* (c) 2003-2004 by Marcin Wiacek */ 1/* (c) 2003-2004 by Marcin Wiacek */
2 2
3#ifndef __gsm_back_h 3#ifndef __gsm_back_h
4#define __gsm_back_h 4#define __gsm_back_h
5 5
6#include "backgen.h" 6#include "backgen.h"
7 7
8#ifdef GSM_ENABLE_BACKUP 8#ifdef GSM_ENABLE_BACKUP
9 9
10GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, bool UseUnicode); 10GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, bool UseUnicode);
11GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup); 11GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup);
12 12
13void GSM_ClearBackup (GSM_Backup *backup); 13void GSM_ClearBackup (GSM_Backup *backup);
14void GSM_FreeBackup (GSM_Backup *backup); 14void GSM_FreeBackup (GSM_Backup *backup);
15 15
16typedef struct { 16typedef struct {
17 bool UseUnicode; 17 bool UseUnicode;
18 18
19 bool IMEI; 19 bool IMEI;
20 bool Model; 20 bool Model;
21 bool DateTime; 21 bool DateTime;
22 bool ToDo; 22 bool ToDo;
23 bool PhonePhonebook; 23 bool PhonePhonebook;
24 bool SIMPhonebook; 24 bool SIMPhonebook;
25 bool Calendar; 25 bool Calendar;
26 bool CallerLogos; 26 bool CallerLogos;
27 bool SMSC; 27 bool SMSC;
28 bool WAPBookmark; 28 bool WAPBookmark;
29 bool Profiles; 29 bool Profiles;
30 bool WAPSettings; 30 bool WAPSettings;
31 bool MMSSettings; 31 bool MMSSettings;
32 bool SyncMLSettings;
33 bool ChatSettings;
32 bool Ringtone; 34 bool Ringtone;
33 bool StartupLogo; 35 bool StartupLogo;
34 bool OperatorLogo; 36 bool OperatorLogo;
35 bool FMStation; 37 bool FMStation;
36 bool GPRSPoint; 38 bool GPRSPoint;
37 bool Note; 39 bool Note;
38} GSM_Backup_Info; 40} GSM_Backup_Info;
39 41
40void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info); 42void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info);
41void GSM_GetBackupFileFeatures (char *FileName, GSM_Backup_Info *info, GSM_Backup *backup); 43void GSM_GetBackupFileFeatures (char *FileName, GSM_Backup_Info *info, GSM_Backup *backup);
42 44
43#endif 45#endif
44#endif 46#endif
45 47
46/* How should editor hadle tabs in this file? Add editor commands here. 48/* How should editor hadle tabs in this file? Add editor commands here.
47 * vim: noexpandtab sw=8 ts=8 sts=8: 49 * vim: noexpandtab sw=8 ts=8 sts=8:
48 */ 50 */
diff --git a/gammu/emb/common/service/gsmcal.h b/gammu/emb/common/service/gsmcal.h
index 067a4a4..0a41b7b 100644
--- a/gammu/emb/common/service/gsmcal.h
+++ b/gammu/emb/common/service/gsmcal.h
@@ -360,86 +360,86 @@ typedef struct {
360 unsigned int Number; 360 unsigned int Number;
361} GSM_SubToDoEntry; 361} GSM_SubToDoEntry;
362 362
363/** 363/**
364 * To do entry. 364 * To do entry.
365 */ 365 */
366typedef struct { 366typedef struct {
367 /** 367 /**
368 * Priority of entry. 368 * Priority of entry.
369 */ 369 */
370 GSM_ToDo_Priority Priority; 370 GSM_ToDo_Priority Priority;
371 /** 371 /**
372 * Location in memory. 372 * Location in memory.
373 */ 373 */
374 int Location; 374 int Location;
375 /** 375 /**
376 * Number of entries. 376 * Number of entries.
377 */ 377 */
378 int EntriesNum; 378 int EntriesNum;
379 /** 379 /**
380 * Values of current entry. 380 * Values of current entry.
381 */ 381 */
382 GSM_SubToDoEntryEntries[GSM_TODO_ENTRIES]; 382 GSM_SubToDoEntryEntries[GSM_TODO_ENTRIES];
383} GSM_ToDoEntry; 383} GSM_ToDoEntry;
384 384
385void GSM_ToDoFindDefaultTextTimeAlarmCompleted(GSM_ToDoEntry *entry, int *Text, int *Alarm, int *Completed, int *EndTime, int *Phone); 385void GSM_ToDoFindDefaultTextTimeAlarmCompleted(GSM_ToDoEntry *entry, int *Text, int *Alarm, int *Completed, int *EndTime, int *Phone);
386 386
387typedef enum { 387typedef enum {
388 Nokia_VToDo = 1, 388 Nokia_VToDo = 1,
389 SonyEricsson_VToDo 389 SonyEricsson_VToDo
390} GSM_VToDoVersion; 390} GSM_VToDoVersion;
391 391
392GSM_Error GSM_EncodeVTODO(char *Buffer, int *Length, GSM_ToDoEntry *note, bool header, GSM_VToDoVersion Version); 392GSM_Error GSM_EncodeVTODO(char *Buffer, int *Length, GSM_ToDoEntry *note, bool header, GSM_VToDoVersion Version);
393 393
394/** 394/**
395 * Status of to do entries. 395 * Status of to do entries.
396 */ 396 */
397typedef struct { 397typedef struct {
398 /** 398 /**
399 * Number of used positions. 399 * Number of used positions.
400 */ 400 */
401 int Used; 401 int Used;
402} GSM_ToDoStatus; 402} GSM_ToDoStatus;
403 403
404/* --------------------------- note ---------------------------------------- */ 404/* --------------------------- note ---------------------------------------- */
405 405
406typedef struct { 406typedef struct {
407 int Location; 407 int Location;
408 char Text[100]; 408 char Text[3000*2];
409} GSM_NoteEntry; 409} GSM_NoteEntry;
410 410
411GSM_Error GSM_EncodeVNTFile(unsigned char *Buffer, int *Length, GSM_NoteEntry *Note); 411GSM_Error GSM_EncodeVNTFile(unsigned char *Buffer, int *Length, GSM_NoteEntry *Note);
412 412
413/* --------------------------- alarm --------------------------------------- */ 413/* --------------------------- alarm --------------------------------------- */
414 414
415/** 415/**
416 * Alarm values. 416 * Alarm values.
417 */ 417 */
418typedef struct { 418typedef struct {
419 /** 419 /**
420 * Location where it is stored. 420 * Location where it is stored.
421 */ 421 */
422 int Location; 422 int Location;
423 /** 423 /**
424 * Date and time of alarm. 424 * Date and time of alarm.
425 */ 425 */
426 GSM_DateTime DateTime; 426 GSM_DateTime DateTime;
427 /** 427 /**
428 * Whether it repeats each day. 428 * Whether it repeats each day.
429 */ 429 */
430 bool Repeating; 430 bool Repeating;
431 /** 431 /**
432 * Text that is shown on display. 432 * Text that is shown on display.
433 */ 433 */
434 char Text[(MAX_CALENDAR_TEXT_LENGTH + 1) * 2]; 434 char Text[(MAX_CALENDAR_TEXT_LENGTH + 1) * 2];
435} GSM_Alarm; 435} GSM_Alarm;
436 436
437/* --------------------------- calendar & todo ----------------------------- */ 437/* --------------------------- calendar & todo ----------------------------- */
438 438
439GSM_Error GSM_DecodeVCALENDAR_VTODO(unsigned char *Buffer, int *Pos, GSM_CalendarEntry *Calendar, GSM_ToDoEntry *ToDo, GSM_VCalendarVersion CalVer, GSM_VToDoVersion ToDoVer); 439GSM_Error GSM_DecodeVCALENDAR_VTODO(unsigned char *Buffer, int *Pos, GSM_CalendarEntry *Calendar, GSM_ToDoEntry *ToDo, GSM_VCalendarVersion CalVer, GSM_VToDoVersion ToDoVer);
440 440
441#endif 441#endif
442 442
443/* How should editor hadle tabs in this file? Add editor commands here. 443/* How should editor hadle tabs in this file? Add editor commands here.
444 * vim: noexpandtab sw=8 ts=8 sts=8: 444 * vim: noexpandtab sw=8 ts=8 sts=8:
445 */ 445 */
diff --git a/gammu/emb/common/service/gsmdata.c b/gammu/emb/common/service/gsmdata.c
index 94e9b7b..9303b57 100644
--- a/gammu/emb/common/service/gsmdata.c
+++ b/gammu/emb/common/service/gsmdata.c
@@ -201,143 +201,221 @@ void NOKIA_EncodeWAPMMSSettingsSMSText(unsigned char *Buffer, int *Length, GSM_W
201 } 201 }
202 /* PORT */ 202 /* PORT */
203 if (settings->IsSecurity) { 203 if (settings->IsSecurity) {
204 if (settings->IsContinuous) { 204 if (settings->IsContinuous) {
205 /* Port = 9203. Continuous */ 205 /* Port = 9203. Continuous */
206 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x63); 206 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x63);
207 } else { 207 } else {
208 /* Port = 9202. Temporary */ 208 /* Port = 9202. Temporary */
209 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x62); 209 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x62);
210 } 210 }
211 } else { 211 } else {
212 if (settings->IsContinuous) { 212 if (settings->IsContinuous) {
213 /* Port = 9201. Continuous */ 213 /* Port = 9201. Continuous */
214 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x61); 214 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x61);
215 } else { 215 } else {
216 /* Port = 9200. Temporary */ 216 /* Port = 9200. Temporary */
217 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x60); 217 AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x60);
218 } 218 }
219 } 219 }
220 Buffer[(*Length)++] = 0x01; //END PARMeter 220 Buffer[(*Length)++] = 0x01; //END PARMeter
221 221
222 /* URL */ 222 /* URL */
223 Buffer[(*Length)++] = 0x86; //CHARACTERISTIC-LIST with attributes 223 Buffer[(*Length)++] = 0x86; //CHARACTERISTIC-LIST with attributes
224 if (MMS) { 224 if (MMS) {
225 Buffer[(*Length)++] = 0x7C; //TYPE = MMSURL 225 Buffer[(*Length)++] = 0x7C; //TYPE = MMSURL
226 } else { 226 } else {
227 Buffer[(*Length)++] = 0x07; //TYPE = URL 227 Buffer[(*Length)++] = 0x07; //TYPE = URL
228 } 228 }
229 Buffer[(*Length)++] = 0x11; //VALUE 229 Buffer[(*Length)++] = 0x11; //VALUE
230 Buffer[(*Length)++] = 0x03; //Inline string 230 Buffer[(*Length)++] = 0x03; //Inline string
231 sprintf(buffer,"%s",DecodeUnicodeString(settings->HomePage)); 231 sprintf(buffer,"%s",DecodeUnicodeString(settings->HomePage));
232 for (i=0;i<(int)strlen(buffer);i++) { 232 for (i=0;i<(int)strlen(buffer);i++) {
233 Buffer[(*Length)++] = buffer[i];//Text 233 Buffer[(*Length)++] = buffer[i];//Text
234 } 234 }
235 Buffer[(*Length)++] = 0x00; //END Inline string 235 Buffer[(*Length)++] = 0x00; //END Inline string
236 Buffer[(*Length)++] = 0x01; //END PARMeter 236 Buffer[(*Length)++] = 0x01; //END PARMeter
237 237
238 /* ISP_NAME (name) */ 238 /* ISP_NAME (name) */
239 Buffer[(*Length)++] = 0xC6; //CHARACTERISTIC with content and attributes 239 Buffer[(*Length)++] = 0xC6; //CHARACTERISTIC with content and attributes
240 Buffer[(*Length)++] = 0x08; //TYPE=NAME 240 Buffer[(*Length)++] = 0x08; //TYPE=NAME
241 Buffer[(*Length)++] = 0x01; //END PARMeter 241 Buffer[(*Length)++] = 0x01; //END PARMeter
242 /* Settings name */ 242 /* Settings name */
243 AddWAPSMSParameterText(Buffer, Length, 0x15, DecodeUnicodeString(settings->Title), UnicodeLength(settings->Title)); 243 AddWAPSMSParameterText(Buffer, Length, 0x15, DecodeUnicodeString(settings->Title), UnicodeLength(settings->Title));
244 Buffer[(*Length)++] = 0x01; //END PARMeter 244 Buffer[(*Length)++] = 0x01; //END PARMeter
245 Buffer[(*Length)++] = 0x01; //END PARMeter 245 Buffer[(*Length)++] = 0x01; //END PARMeter
246} 246}
247 247
248/* http://forum.nokia.com: OTA Settings 7.0 */ 248/* http://forum.nokia.com: OTA Settings 7.0 */
249/* first it used default/ISO coding */
250/* Joergen Thomsen changed to UTF8 */
249void NOKIA_EncodeWAPBookmarkSMSText(unsigned char *Buffer, int *Length, GSM_WAPBookmark *bookmark) 251void NOKIA_EncodeWAPBookmarkSMSText(unsigned char *Buffer, int *Length, GSM_WAPBookmark *bookmark)
250{ 252{
251 unsigned charbuffer[100]; 253 unsigned charbuffer[100];
252 bool UnicodeCoding = false;
253 254
254 EncodeUTF8QuotedPrintable(buffer,bookmark->Title); 255 // bool UnicodeCoding = false;
255 if (UnicodeLength(bookmark->Title)!=strlen(buffer)) UnicodeCoding = true; 256 //EncodeUTF8QuotedPrintable(buffer,bookmark->Title);
257 //if (UnicodeLength(bookmark->Title)!=strlen(buffer)) UnicodeCoding = true;
256 258
257 Buffer[(*Length)++] = 0x01; //Push ID 259 Buffer[(*Length)++] = 0x01; //Push ID
258 Buffer[(*Length)++] = 0x06; //PDU Type (push) 260 Buffer[(*Length)++] = 0x06; //PDU Type (push)
259 Buffer[(*Length)++] = 0x2D; //Headers length (content type + headers) 261 Buffer[(*Length)++] = 0x2D; //Headers length (content type + headers)
260 strcpy(Buffer+(*Length),"\x1F\x2B"); 262 strcpy(Buffer+(*Length),"\x1F\x2B");
261 (*Length)=(*Length)+2; //Value length 263 (*Length)=(*Length)+2; //Value length
262 strcpy(Buffer+(*Length),"application/x-wap-prov.browser-bookmarks"); 264 strcpy(Buffer+(*Length),"application/x-wap-prov.browser-bookmarks");
263 (*Length)=(*Length)+40; //MIME-Type 265 (*Length)=(*Length)+40; //MIME-Type
264 Buffer[(*Length)++] = 0x00; //end inline string 266 Buffer[(*Length)++] = 0x00; //end inline string
265 strcpy(Buffer+(*Length),"\x81\xEA"); 267 strcpy(Buffer+(*Length),"\x81\xEA");
266 (*Length)=(*Length)+2; //charset UTF-8 short int. 268 (*Length)=(*Length)+2; //charset UTF-8 short int.
267 269
270 /* removed by Joergen Thomsen */
268 /* Block from sniffs. UNKNOWN */ 271 /* Block from sniffs. UNKNOWN */
269 if (!UnicodeCoding) { 272 //if (!UnicodeCoding) {
270 Buffer[(*Length)++] = 0x00; 273 // Buffer[(*Length)++] = 0x00;
271 Buffer[(*Length)++] = 0x01; 274 // Buffer[(*Length)++] = 0x01;
272 } else { 275 //} else {
273 strcpy(Buffer+(*Length),"\x01\x01\x87\x68"); 276 // strcpy(Buffer+(*Length),"\x01\x01\x87\x68");
274 (*Length)=(*Length)+4; 277 // (*Length)=(*Length)+4;
275 } 278 //}
276 Buffer[(*Length)++] = 0x00; 279 //Buffer[(*Length)++] = 0x00;
280
281 /* added by Joergen Thomsen */
282 Buffer[(*Length)++] = 0x01; // Version WBXML 1.1
283 Buffer[(*Length)++] = 0x01; // Unknown public identifier
284 Buffer[(*Length)++] = 0x6A; // charset UTF-8
285 Buffer[(*Length)++] = 0x00; // string table length
277 286
278 Buffer[(*Length)++] = 0x45; //CHARACTERISTIC-LIST with content 287 Buffer[(*Length)++] = 0x45; //CHARACTERISTIC-LIST with content
279 /* URL */ 288 /* URL */
280 Buffer[(*Length)++] = 0xC6; //CHARACTERISTIC with content and attributes 289 Buffer[(*Length)++] = 0xC6; //CHARACTERISTIC with content and attributes
281 Buffer[(*Length)++] = 0x7F; //TYPE = BOOKMARK 290 Buffer[(*Length)++] = 0x7F; //TYPE = BOOKMARK
282 Buffer[(*Length)++] = 0x01; //END PARMeter 291 Buffer[(*Length)++] = 0x01; //END PARMeter
283 if (!UnicodeCoding) { 292
284 /* TITLE */ 293 /* removed by Joergen Thomsen */
285 AddWAPSMSParameterText(Buffer, Length, 0x15, DecodeUnicodeString(bookmark->Title), UnicodeLength(bookmark->Title)); 294 // if (!UnicodeCoding) {
286 /* URL */ 295 // /* TITLE */
287 AddWAPSMSParameterText(Buffer, Length, 0x17, DecodeUnicodeString(bookmark->Address), UnicodeLength(bookmark->Address)); 296 // AddWAPSMSParameterText(Buffer, Length, 0x15, DecodeUnicodeString(bookmark->Title), UnicodeLength(bookmark->Title));
288 } else { 297 // /* URL */
289 /* TITLE */ 298 // AddWAPSMSParameterText(Buffer, Length, 0x17, DecodeUnicodeString(bookmark->Address), UnicodeLength(bookmark->Address));
290 AddWAPSMSParameterText(Buffer, Length, 0x15, bookmark->Title, UnicodeLength(bookmark->Title)*2+1); 299 // } else {
291 /* URL */ 300 // /* TITLE */
292 AddWAPSMSParameterText(Buffer, Length, 0x17, bookmark->Address, UnicodeLength(bookmark->Address)*2+1); 301 // AddWAPSMSParameterText(Buffer, Length, 0x15, bookmark->Title, UnicodeLength(bookmark->Title)*2+1);
302 // /* URL */
303 // AddWAPSMSParameterText(Buffer, Length, 0x17, bookmark->Address, UnicodeLength(bookmark->Address)*2+1);
304 // }
305
306 /* added by Joergen Thomsen */
307 /* TITLE */
308 EncodeUTF8(buffer, bookmark->Title);
309 AddWAPSMSParameterText(Buffer, Length, 0x15, buffer, strlen(buffer));
310 /* URL */
311 EncodeUTF8(buffer, bookmark->Address);
312 AddWAPSMSParameterText(Buffer, Length, 0x17, buffer, strlen(buffer));
313
314 Buffer[(*Length)++] = 0x01; //END (CHARACTERISTIC)
315 Buffer[(*Length)++] = 0x01; //END (CHARACTERISTIC-LIST)
316}
317
318void GSM_EncodeWAPIndicatorSMSText(unsigned char *Buffer, int *Length, char *Text, char *URL)
319{
320 int i;
321
322 Buffer[(*Length)++] = 0x01; //Push ID
323 Buffer[(*Length)++] = 0x06; //PDU Type (push)
324 Buffer[(*Length)++] = 28; //Headers length (content type + headers)
325 strcpy(Buffer+(*Length),"\x1F\x23");
326 (*Length)=(*Length)+2; //Value length
327 strcpy(Buffer+(*Length),"application/vnd.wap.sic");
328 (*Length)=(*Length)+23; //MIME-Type
329 Buffer[(*Length)++] = 0x00; //end inline string
330 strcpy(Buffer+(*Length),"\x81\xEA");
331 (*Length)=(*Length)+2; //charset UTF-8 short int.
332
333 Buffer[(*Length)++] = 0x02; // WBXML 1.2
334 Buffer[(*Length)++] = 0x05; // SI 1.0 Public Identifier
335 Buffer[(*Length)++] = 0x6A; // charset UTF-8
336 Buffer[(*Length)++] = 0x00; // string table length
337 Buffer[(*Length)++] = 0x45; // SI with content
338 Buffer[(*Length)++] = 0xC6; // indication with content and attributes
339 Buffer[(*Length)++] = 0x0B;// address
340 Buffer[(*Length)++] = 0x03; // Inline string
341 for (i=0;i<(int)strlen(URL);i++) {
342 Buffer[(*Length)++] = URL[i];//Text
293 } 343 }
294 Buffer[(*Length)++] = 0x01; //END PARMeter 344 Buffer[(*Length)++] = 0x00; // END Inline string
295 Buffer[(*Length)++] = 0x01; //END PARMeter 345
346#ifdef XXX
347 Buffer[(*Length)++] = 0x0A;// created...
348 Buffer[(*Length)++] = 0xC3;// OPAQUE
349 Buffer[(*Length)++] = 0x07;// length
350 Buffer[(*Length)++] = 0x19;// year
351 Buffer[(*Length)++] = 0x80;// year
352 Buffer[(*Length)++] = 0x21;// month
353 Buffer[(*Length)++] = 0x12;// ..
354 Buffer[(*Length)++] = 0x00;// ..
355 Buffer[(*Length)++] = 0x00;// ..
356 Buffer[(*Length)++] = 0x00;// ..
357 Buffer[(*Length)++] = 0x10;// expires
358 Buffer[(*Length)++] = 0xC3;// OPAQUE
359 Buffer[(*Length)++] = 0x04;// length
360 Buffer[(*Length)++] = 0x20;// year
361 Buffer[(*Length)++] = 0x10;// year
362 Buffer[(*Length)++] = 0x06;// month
363 Buffer[(*Length)++] = 0x25;// day
364#endif
365
366 Buffer[(*Length)++] = 0x01; // END (indication)
367 Buffer[(*Length)++] = 0x03; // Inline string
368 for (i=0;i<(int)strlen(Text);i++) {
369 Buffer[(*Length)++] = Text[i];//Text
370 }
371 Buffer[(*Length)++] = 0x00; // END Inline string
372 Buffer[(*Length)++] = 0x01; // END (indication)
373 Buffer[(*Length)++] = 0x01; // END (SI)
296} 374}
297 375
298void GSM_EncodeMMSFile(GSM_EncodeMultiPartMMSInfo *Info, unsigned char *Buffer, int *Length) 376void GSM_EncodeMMSFile(GSM_EncodeMultiPartMMSInfo *Info, unsigned char *Buffer, int *Length)
299{ 377{
300 int i; 378 int i;
301 379
302 strcpy(Buffer+(*Length),"\x8C\x80\x98\x4F"); 380 strcpy(Buffer+(*Length),"\x8C\x80\x98\x4F");
303 (*Length)=(*Length)+4; 381 (*Length)=(*Length)+4;
304 382
305 /* Unique MMS ID ? */ 383 /* Unique MMS ID ? */
306 strcpy(Buffer+(*Length),"123456789"); 384 strcpy(Buffer+(*Length),"123456789");
307 (*Length)=(*Length)+9; 385 (*Length)=(*Length)+9;
308 Buffer[(*Length)++] = 0x00; 386 Buffer[(*Length)++] = 0x00;
309 387
310 strcpy(Buffer+(*Length),"\x8D\x90\x89"); 388 strcpy(Buffer+(*Length),"\x8D\x90\x89");
311 (*Length)=(*Length)+3; 389 (*Length)=(*Length)+3;
312 390
313 strcpy(Buffer+(*Length),"\x01\x81\x86\x81\x96"); 391 strcpy(Buffer+(*Length),"\x01\x81\x86\x81\x96");
314 (*Length)=(*Length)+5; 392 (*Length)=(*Length)+5;
315 393
316 if (UnicodeLength(Info->Subject) != 0) { 394 if (UnicodeLength(Info->Subject) != 0) {
317 sprintf(Buffer+(*Length),"%s",DecodeUnicodeString(Info->Subject)); 395 sprintf(Buffer+(*Length),"%s",DecodeUnicodeString(Info->Subject));
318 (*Length)=(*Length)+UnicodeLength(Info->Subject); 396 (*Length)=(*Length)+UnicodeLength(Info->Subject);
319 Buffer[(*Length)++] = 0x00; 397 Buffer[(*Length)++] = 0x00;
320 } 398 }
321 399
322 for (i=0;i<Info->EntriesNum;i++) { 400 for (i=0;i<Info->EntriesNum;i++) {
323 switch(Info->Entries[i].ID) { 401 switch(Info->Entries[i].ID) {
324 case MMS_Text: 402 case MMS_Text:
325 strcpy(Buffer+(*Length),"\x84\xA3\x01\x04\x04\x03\x83\x81\xEA"); 403 strcpy(Buffer+(*Length),"\x84\xA3\x01\x04\x04\x03\x83\x81\xEA");
326 (*Length)=(*Length)+9; 404 (*Length)=(*Length)+9;
327 405
328 sprintf(Buffer+(*Length),"%s",DecodeUnicodeString(Info->Entries[i].Buffer)); 406 sprintf(Buffer+(*Length),"%s",DecodeUnicodeString(Info->Entries[i].Buffer));
329 (*Length)=(*Length)+UnicodeLength(Info->Entries[i].Buffer); 407 (*Length)=(*Length)+UnicodeLength(Info->Entries[i].Buffer);
330 break; 408 break;
331 default: 409 default:
332 break; 410 break;
333 } 411 }
334 } 412 }
335} 413}
336 414
337void GSM_ClearMultiPartMMSInfo(GSM_EncodeMultiPartMMSInfo *Info) 415void GSM_ClearMultiPartMMSInfo(GSM_EncodeMultiPartMMSInfo *Info)
338{ 416{
339 Info->EntriesNum= 0; 417 Info->EntriesNum= 0;
340 Info->Subject[0]= 0x00; 418 Info->Subject[0]= 0x00;
341 Info->Subject[1]= 0x00; 419 Info->Subject[1]= 0x00;
342 Info->Source[0] = 0x00; 420 Info->Source[0] = 0x00;
343 Info->Source[1] = 0x00; 421 Info->Source[1] = 0x00;
diff --git a/gammu/emb/common/service/gsmdata.h b/gammu/emb/common/service/gsmdata.h
index f5f8e07..e81589f 100644
--- a/gammu/emb/common/service/gsmdata.h
+++ b/gammu/emb/common/service/gsmdata.h
@@ -43,96 +43,98 @@ typedef struct {
43 char Code [(10+1)*2]; 43 char Code [(10+1)*2];
44 44
45 /* for data or gprs */ 45 /* for data or gprs */
46 char IPAddress[(20+1)*2]; 46 char IPAddress[(20+1)*2];
47 bool ManualLogin; 47 bool ManualLogin;
48 char DialUp [(20+1)*2]; 48 char DialUp [(20+1)*2];
49 char User [(50+1)*2]; /*is length OK ?*/ 49 char User [(50+1)*2]; /*is length OK ?*/
50 char Password[(50+1)*2]; /*is length OK ?*/ 50 char Password[(50+1)*2]; /*is length OK ?*/
51 WAPSettings_SpeedSpeed; 51 WAPSettings_SpeedSpeed;
52} GSM_WAPSettings; 52} GSM_WAPSettings;
53 53
54typedef struct { 54typedef struct {
55 int Location; 55 int Location;
56 unsigned char Number; 56 unsigned char Number;
57 GSM_WAPSettings Settings[4]; 57 GSM_WAPSettings Settings[4];
58 bool Active; 58 bool Active;
59 bool ReadOnly; 59 bool ReadOnly;
60 char Proxy [(100+1)*2]; 60 char Proxy [(100+1)*2];
61 int ProxyPort; 61 int ProxyPort;
62 char Proxy2 [(100+1)*2]; 62 char Proxy2 [(100+1)*2];
63 int Proxy2Port; 63 int Proxy2Port;
64 64
65 WAPSettings_BearerActiveBearer; 65 WAPSettings_BearerActiveBearer;
66} GSM_MultiWAPSettings; 66} GSM_MultiWAPSettings;
67 67
68void NOKIA_EncodeWAPMMSSettingsSMSText(unsigned char *Buffer, int *Length, GSM_WAPSettings *settings, bool MMS); 68void NOKIA_EncodeWAPMMSSettingsSMSText(unsigned char *Buffer, int *Length, GSM_WAPSettings *settings, bool MMS);
69 69
70/* -------------------------------- WAP Bookmark --------------------------- */ 70/* -------------------------------- WAP Bookmark --------------------------- */
71 71
72typedef struct { 72typedef struct {
73 char Address [(255+1)*2]; 73 char Address [(255+1)*2];
74 char Title [(50+1)*2]; 74 char Title [(50+1)*2];
75 int Location; 75 int Location;
76} GSM_WAPBookmark; 76} GSM_WAPBookmark;
77 77
78 void NOKIA_EncodeWAPBookmarkSMSText(unsigned char *Buffer, int *Length, GSM_WAPBookmark *bookmark); 78 void NOKIA_EncodeWAPBookmarkSMSText(unsigned char *Buffer, int *Length, GSM_WAPBookmark *bookmark);
79 GSM_Error GSM_EncodeURLFile (unsigned char *Buffer, int *Length, GSM_WAPBookmark *bookmark); 79 GSM_Error GSM_EncodeURLFile (unsigned char *Buffer, int *Length, GSM_WAPBookmark *bookmark);
80 80
81/* ------------------------------ MMS Indicator ---------------------------- */ 81/* ------------------------------ MMS Indicator ---------------------------- */
82 82
83typedef struct { 83typedef struct {
84 unsigned char Address[500]; 84 unsigned char Address[500];
85 unsigned char Title[200]; 85 unsigned char Title[200];
86 unsigned char Sender[200]; 86 unsigned char Sender[200];
87} GSM_MMSIndicator; 87} GSM_MMSIndicator;
88 88
89void GSM_EncodeMMSIndicatorSMSText(unsigned char *Buffer, int *Length, GSM_MMSIndicator Indicator); 89void GSM_EncodeMMSIndicatorSMSText(unsigned char *Buffer, int *Length, GSM_MMSIndicator Indicator);
90 90
91void GSM_EncodeWAPIndicatorSMSText(unsigned char *Buffer, int *Length, char *Text, char *URL);
92
91/* ------------------------------ MMS file --------------------------------- */ 93/* ------------------------------ MMS file --------------------------------- */
92 94
93#define MAX_MULTI_MMS 20 95#define MAX_MULTI_MMS 20
94 96
95typedef enum { 97typedef enum {
96 MMS_Text = 1, 98 MMS_Text = 1,
97 MMS_Bitmap_JPG 99 MMS_Bitmap_JPG
98} EncodeMultiPartMMSID; 100} EncodeMultiPartMMSID;
99 101
100typedef struct { 102typedef struct {
101 EncodeMultiPartMMSID ID; 103 EncodeMultiPartMMSID ID;
102 104
103 GSM_File File; 105 GSM_File File;
104 unsigned char *Buffer; 106 unsigned char *Buffer;
105} EncodeMultiPartMMSEntry; 107} EncodeMultiPartMMSEntry;
106 108
107typedef struct { 109typedef struct {
108 /* Input values */ 110 /* Input values */
109 EncodeMultiPartMMSEntry Entries[MAX_MULTI_MMS]; 111 EncodeMultiPartMMSEntry Entries[MAX_MULTI_MMS];
110 int EntriesNum; 112 int EntriesNum;
111 113
112 unsigned char Source[200]; 114 unsigned char Source[200];
113 unsigned char Destination[200]; 115 unsigned char Destination[200];
114 unsigned char Subject[200]; 116 unsigned char Subject[200];
115} GSM_EncodeMultiPartMMSInfo; 117} GSM_EncodeMultiPartMMSInfo;
116 118
117 void GSM_EncodeMMSFile (GSM_EncodeMultiPartMMSInfo *Info, unsigned char *Buffer, int *Length); 119 void GSM_EncodeMMSFile (GSM_EncodeMultiPartMMSInfo *Info, unsigned char *Buffer, int *Length);
118 void GSM_ClearMultiPartMMSInfo(GSM_EncodeMultiPartMMSInfo *Info); 120 void GSM_ClearMultiPartMMSInfo(GSM_EncodeMultiPartMMSInfo *Info);
119 121
120/* ------------------------------------------------------------------------ */ 122/* ------------------------------------------------------------------------ */
121 123
122typedef struct { 124typedef struct {
123 int Location; 125 int Location;
124 bool Active; 126 bool Active;
125 bool SyncPhonebook; 127 bool SyncPhonebook;
126 bool SyncCalendar; 128 bool SyncCalendar;
127 char Name[(20+1)*2]; 129 char Name[(20+1)*2];
128 char PhonebookDataBase[(50+1)*2]; 130 char PhonebookDataBase[(50+1)*2];
129 char CalendarDataBase[(50+1)*2]; 131 char CalendarDataBase[(50+1)*2];
130 char User[(30+1)*2]; 132 char User[(30+1)*2];
131 char Password[(20+1)*2]; 133 char Password[(20+1)*2];
132 char Server[(128+1)*2]; 134 char Server[(128+1)*2];
133 GSM_MultiWAPSettingsConnection; 135 GSM_MultiWAPSettingsConnection;
134} GSM_SyncMLSettings; 136} GSM_SyncMLSettings;
135 137
136/* ------------------------------------------------------------------------ */ 138/* ------------------------------------------------------------------------ */
137 139
138typedef struct { 140typedef struct {
diff --git a/gammu/emb/common/service/gsmlogo.c b/gammu/emb/common/service/gsmlogo.c
index c992915..7c19967 100644
--- a/gammu/emb/common/service/gsmlogo.c
+++ b/gammu/emb/common/service/gsmlogo.c
@@ -1,52 +1,53 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2 2
3#include <string.h> 3#include <string.h>
4#include <stdlib.h> 4#include <stdlib.h>
5#include <sys/stat.h>
5 6
6#include "../misc/misc.h" 7#include "../misc/misc.h"
7#include "../misc/coding/coding.h" 8#include "../misc/coding/coding.h"
8#include "gsmlogo.h" 9#include "gsmlogo.h"
9#include "gsmnet.h" 10#include "gsmnet.h"
10 11
11void PHONE_GetBitmapWidthHeight(GSM_Phone_Bitmap_Types Type, int *width, int *height) 12void PHONE_GetBitmapWidthHeight(GSM_Phone_Bitmap_Types Type, int *width, int *height)
12{ 13{
13 *width = 0; 14 *width = 0;
14 *height= 0; 15 *height= 0;
15 switch (Type) { 16 switch (Type) {
16 case GSM_EMSSmallPicture: *width=8; *height=8; break; 17 case GSM_EMSSmallPicture: *width=8; *height=8; break;
17 case GSM_EMSMediumPicture: *width=16; *height=16; break; 18 case GSM_EMSMediumPicture: *width=16; *height=16; break;
18 case GSM_EMSBigPicture : *width=32; *height=32; break; 19 case GSM_EMSBigPicture : *width=32; *height=32; break;
19 case GSM_NokiaOperatorLogo: 20 case GSM_NokiaOperatorLogo:
20 case GSM_NokiaCallerLogo: *width=72; *height=14; break; 21 case GSM_NokiaCallerLogo: *width=72; *height=14; break;
21 case GSM_NokiaPictureImage: *width=72; *height=28; break; 22 case GSM_NokiaPictureImage: *width=72; *height=28; break;
22 case GSM_Nokia7110OperatorLogo: 23 case GSM_Nokia7110OperatorLogo:
23 case GSM_Nokia6510OperatorLogo: *width=78; *height=21; break; 24 case GSM_Nokia6510OperatorLogo: *width=78; *height=21; break;
24 case GSM_NokiaStartupLogo: *width=84; *height=48; break; 25 case GSM_NokiaStartupLogo: *width=84; *height=48; break;
25 case GSM_Nokia6210StartupLogo: *width=96; *height=60; break; 26 case GSM_Nokia6210StartupLogo: *width=96; *height=60; break;
26 case GSM_Nokia7110StartupLogo: *width=96; *height=65; break; 27 case GSM_Nokia7110StartupLogo: *width=96; *height=65; break;
27 case GSM_EMSVariablePicture : break; 28 case GSM_EMSVariablePicture : break;
28 case GSM_AlcatelBMMIPicture : break; 29 case GSM_AlcatelBMMIPicture : break;
29 } 30 }
30} 31}
31 32
32int PHONE_GetBitmapSize(GSM_Phone_Bitmap_Types Type, int Width, int Height) 33int PHONE_GetBitmapSize(GSM_Phone_Bitmap_Types Type, int Width, int Height)
33{ 34{
34 int width, height, x; 35 int width, height, x;
35 36
36 PHONE_GetBitmapWidthHeight(Type, &width, &height); 37 PHONE_GetBitmapWidthHeight(Type, &width, &height);
37 if (width == 0 && height == 0) { 38 if (width == 0 && height == 0) {
38 width = Width; 39 width = Width;
39 height = Height; 40 height = Height;
40 } 41 }
41 switch (Type) { 42 switch (Type) {
42 case GSM_Nokia6510OperatorLogo: 43 case GSM_Nokia6510OperatorLogo:
43 x = width * height; 44 x = width * height;
44 return x/8 + (x%8 > 0); 45 return x/8 + (x%8 > 0);
45 case GSM_Nokia7110OperatorLogo: 46 case GSM_Nokia7110OperatorLogo:
46 return (width*height + 7)/8; 47 return (width*height + 7)/8;
47 case GSM_NokiaStartupLogo: 48 case GSM_NokiaStartupLogo:
48 case GSM_NokiaOperatorLogo: 49 case GSM_NokiaOperatorLogo:
49 case GSM_NokiaCallerLogo: 50 case GSM_NokiaCallerLogo:
50 case GSM_NokiaPictureImage: 51 case GSM_NokiaPictureImage:
51 case GSM_EMSSmallPicture: 52 case GSM_EMSSmallPicture:
52 case GSM_EMSMediumPicture: 53 case GSM_EMSMediumPicture:
@@ -116,96 +117,97 @@ static void PHONE_SetPointBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, int
116 case GSM_NokiaPictureImage: 117 case GSM_NokiaPictureImage:
117 buffer[9*y + x/8] |= 1 << (7-(x%8)); 118 buffer[9*y + x/8] |= 1 << (7-(x%8));
118 break; 119 break;
119 case GSM_AlcatelBMMIPicture: 120 case GSM_AlcatelBMMIPicture:
120 pixel = height / 8; 121 pixel = height / 8;
121 if ((height % 8) != 0) pixel++; 122 if ((height % 8) != 0) pixel++;
122 buffer[pixel*x + y/8] |= 1 << (7 - (y%8)); 123 buffer[pixel*x + y/8] |= 1 << (7 - (y%8));
123 break; 124 break;
124 } 125 }
125} 126}
126 127
127void PHONE_DecodeBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap) 128void PHONE_DecodeBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap)
128{ 129{
129 int width, height, x,y; 130 int width, height, x,y;
130 131
131 PHONE_GetBitmapWidthHeight(Type, &width, &height); 132 PHONE_GetBitmapWidthHeight(Type, &width, &height);
132 if (Type != GSM_Nokia6510OperatorLogo && Type != GSM_Nokia7110OperatorLogo && Type != GSM_EMSVariablePicture) { 133 if (Type != GSM_Nokia6510OperatorLogo && Type != GSM_Nokia7110OperatorLogo && Type != GSM_EMSVariablePicture) {
133 Bitmap->BitmapHeight= height; 134 Bitmap->BitmapHeight= height;
134 Bitmap->BitmapWidth= width; 135 Bitmap->BitmapWidth= width;
135 } 136 }
136 switch (Type) { 137 switch (Type) {
137 case GSM_NokiaOperatorLogo: 138 case GSM_NokiaOperatorLogo:
138 case GSM_Nokia7110OperatorLogo: 139 case GSM_Nokia7110OperatorLogo:
139 case GSM_Nokia6510OperatorLogo : Bitmap->Type=GSM_OperatorLogo;break; 140 case GSM_Nokia6510OperatorLogo : Bitmap->Type=GSM_OperatorLogo;break;
140 case GSM_NokiaCallerLogo : Bitmap->Type=GSM_CallerGroupLogo;break; 141 case GSM_NokiaCallerLogo : Bitmap->Type=GSM_CallerGroupLogo;break;
141 case GSM_AlcatelBMMIPicture : 142 case GSM_AlcatelBMMIPicture :
142 case GSM_NokiaStartupLogo: 143 case GSM_NokiaStartupLogo:
143 case GSM_Nokia7110StartupLogo: 144 case GSM_Nokia7110StartupLogo:
144 case GSM_Nokia6210StartupLogo : Bitmap->Type=GSM_StartupLogo; break; 145 case GSM_Nokia6210StartupLogo : Bitmap->Type=GSM_StartupLogo; break;
145 case GSM_NokiaPictureImage: 146 case GSM_NokiaPictureImage:
146 case GSM_EMSVariablePicture: 147 case GSM_EMSVariablePicture:
147 case GSM_EMSSmallPicture: 148 case GSM_EMSSmallPicture:
148 case GSM_EMSMediumPicture: 149 case GSM_EMSMediumPicture:
149 case GSM_EMSBigPicture : Bitmap->Type=GSM_PictureImage;break; 150 case GSM_EMSBigPicture : Bitmap->Type=GSM_PictureImage;break;
150 } 151 }
151 152
152 Bitmap->Location = 0; 153 Bitmap->Location = 0;
153 Bitmap->Text[0] = 0; 154 Bitmap->Text[0] = 0;
154 Bitmap->Text[1] = 0; 155 Bitmap->Text[1] = 0;
155 Bitmap->BitmapEnabled = false; 156 Bitmap->BitmapEnabled = false;
156 Bitmap->DefaultName = false; 157 Bitmap->DefaultName = false;
157 Bitmap->DefaultBitmap = false; 158 Bitmap->DefaultBitmap = false;
158 Bitmap->DefaultRingtone = false; 159 Bitmap->DefaultRingtone = false;
159 Bitmap->RingtoneID = 0; 160 Bitmap->RingtoneID = 0;
160 Bitmap->NetworkCode[0] = 0; 161 Bitmap->NetworkCode[0] = 0;
161 Bitmap->Sender[0] = 0; 162 Bitmap->Sender[0] = 0;
162 Bitmap->Sender[1] = 0; 163 Bitmap->Sender[1] = 0;
163 Bitmap->ID = 0; 164 Bitmap->ID = 0;
165 Bitmap->Name = NULL;
164 166
165 GSM_ClearBitmap(Bitmap); 167 GSM_ClearBitmap(Bitmap);
166 for (x=0;x<Bitmap->BitmapWidth;x++) { 168 for (x=0;x<Bitmap->BitmapWidth;x++) {
167 for (y=0;y<Bitmap->BitmapHeight;y++) { 169 for (y=0;y<Bitmap->BitmapHeight;y++) {
168 if (PHONE_IsPointBitmap(Type, buffer, x, y, Bitmap->BitmapWidth, Bitmap->BitmapHeight)) { 170 if (PHONE_IsPointBitmap(Type, buffer, x, y, Bitmap->BitmapWidth, Bitmap->BitmapHeight)) {
169 GSM_SetPointBitmap(Bitmap,x,y); 171 GSM_SetPointBitmap(Bitmap,x,y);
170 } 172 }
171 } 173 }
172 } 174 }
173} 175}
174 176
175void PHONE_ClearBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, int width, int height) 177void PHONE_ClearBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, int width, int height)
176{ 178{
177 memset(buffer,0,PHONE_GetBitmapSize(Type,width,height)); 179 memset(buffer,0,PHONE_GetBitmapSize(Type,width,height));
178} 180}
179 181
180void PHONE_EncodeBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap) 182void PHONE_EncodeBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap)
181{ 183{
182 int width, height, x, y; 184 int width, height, x, y;
183 GSM_Bitmapdest; 185 GSM_Bitmapdest;
184 186
185 PHONE_GetBitmapWidthHeight(Type, &width, &height); 187 PHONE_GetBitmapWidthHeight(Type, &width, &height);
186 if (width == 0 && height == 0) { 188 if (width == 0 && height == 0) {
187 width = Bitmap->BitmapWidth; 189 width = Bitmap->BitmapWidth;
188 height = Bitmap->BitmapHeight; 190 height = Bitmap->BitmapHeight;
189 } 191 }
190 GSM_ResizeBitmap(&dest, Bitmap, width, height); 192 GSM_ResizeBitmap(&dest, Bitmap, width, height);
191 PHONE_ClearBitmap(Type, buffer, width, height); 193 PHONE_ClearBitmap(Type, buffer, width, height);
192 194
193 for (x=0;x<width;x++) { 195 for (x=0;x<width;x++) {
194 for (y=0;y<height;y++) { 196 for (y=0;y<height;y++) {
195 if (GSM_IsPointBitmap(&dest,x,y)) PHONE_SetPointBitmap(Type, buffer, x, y, width, height); 197 if (GSM_IsPointBitmap(&dest,x,y)) PHONE_SetPointBitmap(Type, buffer, x, y, width, height);
196 } 198 }
197 } 199 }
198} 200}
199 201
200void GSM_GetMaxBitmapWidthHeight(GSM_Bitmap_Types Type, unsigned char *width, unsigned char *height) 202void GSM_GetMaxBitmapWidthHeight(GSM_Bitmap_Types Type, unsigned char *width, unsigned char *height)
201{ 203{
202 switch (Type) { 204 switch (Type) {
203 case GSM_CallerGroupLogo: *width=72; *height=14; break; 205 case GSM_CallerGroupLogo: *width=72; *height=14; break;
204 case GSM_OperatorLogo: *width=101;*height=21; break; 206 case GSM_OperatorLogo: *width=101;*height=21; break;
205 case GSM_StartupLogo: *width=96; *height=65; break; 207 case GSM_StartupLogo: *width=96; *height=65; break;
206 case GSM_PictureImage: *width=72; *height=28; break; 208 case GSM_PictureImage: *width=72; *height=28; break;
207 default : break; 209 default : break;
208 } 210 }
209} 211}
210 212
211void GSM_SetPointBitmap(GSM_Bitmap *bmp, int x, int y) 213void GSM_SetPointBitmap(GSM_Bitmap *bmp, int x, int y)
@@ -581,107 +583,107 @@ static GSM_Error savexpm(FILE *file, GSM_MultiBitmap *bitmap)
581 if (y==bitmap->Bitmap[0].BitmapHeight-1) { 583 if (y==bitmap->Bitmap[0].BitmapHeight-1) {
582 fprintf(file,"};\n"); 584 fprintf(file,"};\n");
583 } else { 585 } else {
584 fprintf(file,",\n"); 586 fprintf(file,",\n");
585 } 587 }
586 } 588 }
587 589
588 return ERR_NONE; 590 return ERR_NONE;
589} 591}
590 592
591static GSM_Error savensl(FILE *file, GSM_MultiBitmap *bitmap) 593static GSM_Error savensl(FILE *file, GSM_MultiBitmap *bitmap)
592{ 594{
593 char buffer[GSM_BITMAP_SIZE]; 595 char buffer[GSM_BITMAP_SIZE];
594 unsigned char header[]={ 596 unsigned char header[]={
595 'F','O','R','M', 0x01,0xFE,/* File ID block, size 1*256+0xFE=510*/ 597 'F','O','R','M', 0x01,0xFE,/* File ID block, size 1*256+0xFE=510*/
596 'N','S','L','D', 0x01,0xF8};/* Startup Logo block, size 1*256+0xF8=504*/ 598 'N','S','L','D', 0x01,0xF8};/* Startup Logo block, size 1*256+0xF8=504*/
597 599
598 fwrite(header,1,sizeof(header),file); 600 fwrite(header,1,sizeof(header),file);
599 PHONE_EncodeBitmap(GSM_NokiaStartupLogo, buffer, &bitmap->Bitmap[0]); 601 PHONE_EncodeBitmap(GSM_NokiaStartupLogo, buffer, &bitmap->Bitmap[0]);
600 fwrite(buffer,1,PHONE_GetBitmapSize(GSM_NokiaStartupLogo,0,0),file); 602 fwrite(buffer,1,PHONE_GetBitmapSize(GSM_NokiaStartupLogo,0,0),file);
601 603
602 return ERR_NONE; 604 return ERR_NONE;
603} 605}
604 606
605static GSM_Error savewbmp(FILE *file, GSM_MultiBitmap *bitmap) 607static GSM_Error savewbmp(FILE *file, GSM_MultiBitmap *bitmap)
606{ 608{
607 unsigned char buffer[4]; 609 unsigned char buffer[4];
608 610
609 buffer[0] = 0x00; 611 buffer[0] = 0x00;
610 buffer[1] = 0x00; 612 buffer[1] = 0x00;
611 buffer[2] = bitmap->Bitmap[0].BitmapWidth; 613 buffer[2] = bitmap->Bitmap[0].BitmapWidth;
612 buffer[3] = bitmap->Bitmap[0].BitmapHeight; 614 buffer[3] = bitmap->Bitmap[0].BitmapHeight;
613 fwrite(buffer,1,4,file); 615 fwrite(buffer,1,4,file);
614 616
615 PrivSaveNLMWBMP(file, &bitmap->Bitmap[0]); 617 PrivSaveNLMWBMP(file, &bitmap->Bitmap[0]);
616 618
617 return ERR_NONE; 619 return ERR_NONE;
618} 620}
619 621
620GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_MultiBitmap *bitmap) 622GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_MultiBitmap *bitmap)
621{ 623{
622 FILE *file; 624 FILE *file;
623 GSM_Error error=ERR_NONE; 625 GSM_Error error=ERR_NONE;
624 626
625 file = fopen(FileName, "wb"); 627 file = fopen(FileName, "wb");
626 if (file == NULL) return ERR_CANTOPENFILE; 628 if (file == NULL) return ERR_CANTOPENFILE;
627 629
628 /* Attempt to identify filetype */ 630 /* Attempt to identify filetype */
629 if (strstr(FileName,".nlm")) { 631 if (mystrcasestr(FileName,".nlm")) {
630 error=savenlm(file,bitmap); 632 error=savenlm(file,bitmap);
631 } else if (strstr(FileName,".ngg")) { 633 } else if (mystrcasestr(FileName,".ngg")) {
632 error=savengg(file,bitmap); 634 error=savengg(file,bitmap);
633 } else if (strstr(FileName,".nol")) { 635 } else if (mystrcasestr(FileName,".nol")) {
634 error=savenol(file,bitmap); 636 error=savenol(file,bitmap);
635 } else if (strstr(FileName,".xpm")) { 637 } else if (mystrcasestr(FileName,".xpm")) {
636 error=savexpm(file,bitmap); 638 error=savexpm(file,bitmap);
637 } else if (strstr(FileName,".nsl")) { 639 } else if (mystrcasestr(FileName,".nsl")) {
638 error=savensl(file,bitmap); 640 error=savensl(file,bitmap);
639 } else if (strstr(FileName,".wbmp")) { 641 } else if (mystrcasestr(FileName,".wbmp")) {
640 error=savewbmp(file,bitmap); 642 error=savewbmp(file,bitmap);
641 } else { 643 } else {
642 error=savebmp(file,bitmap); 644 error=savebmp(file,bitmap);
643 } 645 }
644 fclose(file); 646 fclose(file);
645 647
646 return error; 648 return error;
647} 649}
648 650
649GSM_Error BMP2Bitmap(unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap) 651GSM_Error BMP2Bitmap(unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap)
650{ 652{
651 bool first_white,isfile=false; 653 bool first_white,isfile=false;
652 unsigned char buff[34]; 654 unsigned char buff[34];
653 int w,h,pos,y,x,i,buffpos=0; 655 int w,h,pos,y,x,i,buffpos=0;
654#ifdef DEBUG 656#ifdef DEBUG
655 int sizeimage=0; 657 int sizeimage=0;
656#endif 658#endif
657 659
658 if (bitmap->Type == GSM_None) bitmap->Type = GSM_StartupLogo; 660 if (bitmap->Type == GSM_None) bitmap->Type = GSM_StartupLogo;
659 if (file!=NULL) isfile=true; 661 if (file!=NULL) isfile=true;
660 if (isfile) { 662 if (isfile) {
661 fread(buff, 1, 34, file); 663 fread(buff, 1, 34, file);
662 } else { 664 } else {
663 memcpy(buff,buffer,34); 665 memcpy(buff,buffer,34);
664 } 666 }
665 667
666 /* height and width of image in the file */ 668 /* height and width of image in the file */
667 h=buff[22]+256*buff[21]; 669 h=buff[22]+256*buff[21];
668 w=buff[18]+256*buff[17]; 670 w=buff[18]+256*buff[17];
669 dbgprintf("Image Size in BMP file: %dx%d\n",w,h); 671 dbgprintf("Image Size in BMP file: %dx%d\n",w,h);
670 672
671 GSM_GetMaxBitmapWidthHeight(bitmap->Type, &bitmap->BitmapWidth, &bitmap->BitmapHeight); 673 GSM_GetMaxBitmapWidthHeight(bitmap->Type, &bitmap->BitmapWidth, &bitmap->BitmapHeight);
672 if (h<bitmap->BitmapHeight)bitmap->BitmapHeight=h; 674 if (h<bitmap->BitmapHeight)bitmap->BitmapHeight=h;
673 if (w<bitmap->BitmapWidth)bitmap->BitmapWidth=w; 675 if (w<bitmap->BitmapWidth)bitmap->BitmapWidth=w;
674 dbgprintf("Height %i %i, width %i %i\n",h,bitmap->BitmapHeight,w,bitmap->BitmapWidth); 676 dbgprintf("Height %i %i, width %i %i\n",h,bitmap->BitmapHeight,w,bitmap->BitmapWidth);
675 677
676 GSM_ClearBitmap(bitmap); 678 GSM_ClearBitmap(bitmap);
677 679
678#ifdef DEBUG 680#ifdef DEBUG
679 dbgprintf("Number of colors in BMP file: "); 681 dbgprintf("Number of colors in BMP file: ");
680 switch (buff[28]) { 682 switch (buff[28]) {
681 case 1 : dbgprintf("2 (supported)\n"); break; 683 case 1 : dbgprintf("2 (supported)\n"); break;
682 case 4 : dbgprintf("16 (NOT SUPPORTED)\n"); break; 684 case 4 : dbgprintf("16 (NOT SUPPORTED)\n"); break;
683 case 8 : dbgprintf("256 (NOT SUPPORTED)\n"); break; 685 case 8 : dbgprintf("256 (NOT SUPPORTED)\n"); break;
684 case 24 : dbgprintf("True Color (NOT SUPPORTED)\n"); break; 686 case 24 : dbgprintf("True Color (NOT SUPPORTED)\n"); break;
685 default : dbgprintf("unknown\n"); break; 687 default : dbgprintf("unknown\n"); break;
686 } 688 }
687#endif 689#endif
@@ -910,94 +912,127 @@ static GSM_Error loadnsl(FILE *file, GSM_MultiBitmap *bitmap)
910 912
911 while (fread(block,1,6,file)==6) { 913 while (fread(block,1,6,file)==6) {
912 block_size = block[4]*256 + block[5]; 914 block_size = block[4]*256 + block[5];
913 dbgprintf("Block %c%c%c%c, size %i\n",block[0],block[1],block[2],block[3],block_size); 915 dbgprintf("Block %c%c%c%c, size %i\n",block[0],block[1],block[2],block[3],block_size);
914 if (!strncmp(block, "FORM", 4)) { 916 if (!strncmp(block, "FORM", 4)) {
915 dbgprintf("File ID\n"); 917 dbgprintf("File ID\n");
916 } else { 918 } else {
917 if (block_size>504) return ERR_UNKNOWN; 919 if (block_size>504) return ERR_UNKNOWN;
918 if (block_size!=0) { 920 if (block_size!=0) {
919 fread(buffer,1,block_size,file); 921 fread(buffer,1,block_size,file);
920 /* if it's string, we end it with 0 */ 922 /* if it's string, we end it with 0 */
921 buffer[block_size]=0; 923 buffer[block_size]=0;
922#ifdef DEBUG 924#ifdef DEBUG
923 if (!strncmp(block, "VERS", 4)) dbgprintf("File saved by: %s\n",buffer); 925 if (!strncmp(block, "VERS", 4)) dbgprintf("File saved by: %s\n",buffer);
924 if (!strncmp(block, "MODL", 4)) dbgprintf("Logo saved from: %s\n",buffer); 926 if (!strncmp(block, "MODL", 4)) dbgprintf("Logo saved from: %s\n",buffer);
925 if (!strncmp(block, "COMM", 4)) dbgprintf("Phone was connected to COM port: %s\n",buffer); 927 if (!strncmp(block, "COMM", 4)) dbgprintf("Phone was connected to COM port: %s\n",buffer);
926#endif 928#endif
927 if (!strncmp(block, "NSLD", 4)) { 929 if (!strncmp(block, "NSLD", 4)) {
928 bitmap->Bitmap[0].BitmapHeight = 48; 930 bitmap->Bitmap[0].BitmapHeight = 48;
929 bitmap->Bitmap[0].BitmapWidth = 84; 931 bitmap->Bitmap[0].BitmapWidth = 84;
930 OldType = bitmap->Bitmap[0].Type; 932 OldType = bitmap->Bitmap[0].Type;
931 PHONE_DecodeBitmap(GSM_NokiaStartupLogo, buffer, &bitmap->Bitmap[0]); 933 PHONE_DecodeBitmap(GSM_NokiaStartupLogo, buffer, &bitmap->Bitmap[0]);
932 if (OldType != GSM_None) bitmap->Bitmap[0].Type = OldType; 934 if (OldType != GSM_None) bitmap->Bitmap[0].Type = OldType;
933 dbgprintf("Startup logo (size %i)\n",block_size); 935 dbgprintf("Startup logo (size %i)\n",block_size);
934 } 936 }
935 } 937 }
936 } 938 }
937 } 939 }
938 bitmap->Number = 1; 940 bitmap->Number = 1;
939 return(ERR_NONE); 941 return(ERR_NONE);
940} 942}
941 943
942static GSM_Error loadwbmp(FILE *file, GSM_MultiBitmap *bitmap) 944static GSM_Error loadwbmp(FILE *file, GSM_MultiBitmap *bitmap)
943{ 945{
944 unsigned char buffer[10000]; 946 unsigned char buffer[10000];
945 947
946 fread(buffer,1,4,file); 948 fread(buffer,1,4,file);
947 bitmap->Bitmap[0].BitmapWidth = buffer[2]; 949 bitmap->Bitmap[0].BitmapWidth = buffer[2];
948 bitmap->Bitmap[0].BitmapHeight = buffer[3]; 950 bitmap->Bitmap[0].BitmapHeight = buffer[3];
949 bitmap->Number = 1; 951 bitmap->Number = 1;
950 952
951 fread(buffer,1,10000,file); 953 fread(buffer,1,10000,file);
952 PHONE_DecodeBitmap(GSM_Nokia7110OperatorLogo, buffer, &bitmap->Bitmap[0]); 954 PHONE_DecodeBitmap(GSM_Nokia7110OperatorLogo, buffer, &bitmap->Bitmap[0]);
953 GSM_ReverseBitmap(&bitmap->Bitmap[0]); 955 GSM_ReverseBitmap(&bitmap->Bitmap[0]);
954 956
955 return ERR_NONE; 957 return ERR_NONE;
956} 958}
957 959
960static GSM_Error loadgif(FILE *file, GSM_MultiBitmap *bitmap)
961{
962 GSM_Bitmap *bmap = &bitmap->Bitmap[0];
963 char *buffer;
964 struct stat st;
965 int length;
966
967 dbgprintf("loading gif file\n");
968 fstat(fileno(file), &st);
969 bmap->BinaryPic.Length = length = st.st_size;
970 bmap->BinaryPic.Buffer = buffer = malloc(length);
971 if (bmap->BinaryPic.Buffer == NULL)
972 return ERR_MOREMEMORY;
973
974 fread(buffer, 1, length, file);
975 dbgprintf("Length %i name \"%s\"\n", length,
976 DecodeUnicodeString(bmap->Name));
977
978 bmap->Type = GSM_PictureBinary;
979 bmap->BinaryPic.Type = PICTURE_GIF;
980 bmap->BitmapWidth = 256 * buffer[7] + buffer[6];
981 bmap->BitmapHeight = 256 * buffer[9] + buffer[8];
982 bitmap->Number = 1;
983
984 return ERR_NONE;
985}
986
958GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap) 987GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap)
959{ 988{
960 FILE *file; 989 FILE *file;
961 unsigned charbuffer[300]; 990 unsigned charbuffer[300];
962 991
963 file = fopen(FileName, "rb"); 992 file = fopen(FileName, "rb");
964 if (file == NULL) return ERR_CANTOPENFILE; 993 if (file == NULL) return ERR_CANTOPENFILE;
965 994
995 bitmap->Bitmap[0].Name = malloc((strlen(FileName) + 1) * 2);
996 if (bitmap->Bitmap[0].Name == NULL) return ERR_MOREMEMORY;
997 EncodeUnicode(bitmap->Bitmap[0].Name, FileName, strlen(FileName));
998
966 fread(buffer, 1, 9, file); /* Read the header of the file. */ 999 fread(buffer, 1, 9, file); /* Read the header of the file. */
967 rewind(file); 1000 rewind(file);
968 1001
969 bitmap->Bitmap[0].DefaultBitmap = false; 1002 bitmap->Bitmap[0].DefaultBitmap = false;
970 1003
971 /* Attempt to identify filetype */ 1004 /* Attempt to identify filetype */
972 if (memcmp(buffer, "BM",2)==0) { 1005 if (memcmp(buffer, "BM",2)==0) {
973 return loadbmp(file,bitmap); 1006 return loadbmp(file,bitmap);
974 } else if (buffer[0] == 0x00 && buffer[1] == 0x00) { 1007 } else if (buffer[0] == 0x00 && buffer[1] == 0x00) {
975 return loadwbmp(file,bitmap); 1008 return loadwbmp(file,bitmap);
976 } else if (memcmp(buffer, "NLM",3)==0) { 1009 } else if (memcmp(buffer, "NLM",3)==0) {
977 return loadnlm(file,bitmap); 1010 return loadnlm(file,bitmap);
978 } else if (memcmp(buffer, "NOL",3)==0) { 1011 } else if (memcmp(buffer, "NOL",3)==0) {
979 return loadnolngg(file,bitmap,true); 1012 return loadnolngg(file,bitmap,true);
980 } else if (memcmp(buffer, "NGG",3)==0) { 1013 } else if (memcmp(buffer, "NGG",3)==0) {
981 return loadnolngg(file,bitmap,false); 1014 return loadnolngg(file,bitmap,false);
982 } else if (memcmp(buffer, "FORM",4)==0) { 1015 } else if (memcmp(buffer, "FORM",4)==0) {
983 return loadnsl(file,bitmap); 1016 return loadnsl(file,bitmap);
1017 } else if (memcmp(buffer, "GIF",3)==0) {
1018 return loadgif(file,bitmap);
984 } 1019 }
985 return ERR_UNKNOWN; 1020 return ERR_UNKNOWN;
986} 1021}
987 1022
988void NOKIA_CopyBitmap(GSM_Phone_Bitmap_Types Type, GSM_Bitmap *Bitmap, char *Buffer, int *Length) 1023void NOKIA_CopyBitmap(GSM_Phone_Bitmap_Types Type, GSM_Bitmap *Bitmap, char *Buffer, int *Length)
989{ 1024{
990 int Width, Height; 1025 int Width, Height;
991 1026
992 Buffer[(*Length)++] = 0x00; 1027 Buffer[(*Length)++] = 0x00;
993 PHONE_GetBitmapWidthHeight(Type, &Width, &Height); 1028 PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
994 Buffer[(*Length)++] = Width; 1029 Buffer[(*Length)++] = Width;
995 Buffer[(*Length)++] = Height; 1030 Buffer[(*Length)++] = Height;
996 Buffer[(*Length)++] = 0x01; 1031 Buffer[(*Length)++] = 0x01;
997 PHONE_EncodeBitmap(Type, Buffer + (*Length), Bitmap); 1032 PHONE_EncodeBitmap(Type, Buffer + (*Length), Bitmap);
998 (*Length) = (*Length) + PHONE_GetBitmapSize(Type,0,0); 1033 (*Length) = (*Length) + PHONE_GetBitmapSize(Type,0,0);
999} 1034}
1000 1035
1001/* How should editor hadle tabs in this file? Add editor commands here. 1036/* How should editor hadle tabs in this file? Add editor commands here.
1002 * vim: noexpandtab sw=8 ts=8 sts=8: 1037 * vim: noexpandtab sw=8 ts=8 sts=8:
1003 */ 1038 */
diff --git a/gammu/emb/common/service/gsmlogo.h b/gammu/emb/common/service/gsmlogo.h
index b1b579d..6c6e2d8 100644
--- a/gammu/emb/common/service/gsmlogo.h
+++ b/gammu/emb/common/service/gsmlogo.h
@@ -1,165 +1,191 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2 2
3#ifndef __gsm_bitmaps_h 3#ifndef __gsm_bitmaps_h
4#define __gsm_bitmaps_h 4#define __gsm_bitmaps_h
5 5
6#include "../gsmcomon.h" 6#include "../gsmcomon.h"
7 7
8typedef enum {
9 PICTURE_BMP = 1,
10 PICTURE_GIF,
11 PICTURE_JPG,
12 PICTURE_ICN,
13 PICTURE_PNG
14} GSM_BinaryPicture_Types;
15
16typedef struct {
17 GSM_BinaryPicture_Types Type;
18 unsigned char *Buffer;
19 int Length;
20} GSM_BinaryPicture;
21
8/** 22/**
9 * Enum to handle all possible bitmaps, which are not saved in various filesystems. 23 * Enum to handle all possible bitmaps, which are not saved in various filesystems.
10 */ 24 */
11typedef enum { 25typedef enum {
12 GSM_None = 1, 26 GSM_None = 1,
13 /** 27 /**
14 * ID of static file in filesystem displayed during startup 28 * ID of static file in filesystem displayed during startup
15 */ 29 */
16 GSM_ColourStartupLogo_ID, 30 GSM_ColourStartupLogo_ID,
17 /** 31 /**
18 * Static mono bitmap/ID of animated mono bitmap displayed during startup 32 * Static mono bitmap/ID of animated mono bitmap displayed during startup
19 */ 33 */
20 GSM_StartupLogo, 34 GSM_StartupLogo,
21 /** 35 /**
22 * ID of static file in filesystem displayed instead of operator name 36 * ID of static file in filesystem displayed instead of operator name
23 */ 37 */
24 GSM_ColourOperatorLogo_ID, 38 GSM_ColourOperatorLogo_ID,
25 /** 39 /**
26 * Mono bitmap displayed instead of operator name 40 * Mono bitmap displayed instead of operator name
27 */ 41 */
28 GSM_OperatorLogo, 42 GSM_OperatorLogo,
29 /** 43 /**
30 * ID of static file in filesystem displayed as wallpaper 44 * ID of static file in filesystem displayed as wallpaper
31 */ 45 */
32 GSM_ColourWallPaper_ID, 46 GSM_ColourWallPaper_ID,
33 /** 47 /**
34 * Mono bitmap assigned to caller group 48 * Mono bitmap assigned to caller group
35 */ 49 */
36 GSM_CallerGroupLogo, 50 GSM_CallerGroupLogo,
37 /** 51 /**
38 * Text displayed during startup, which can't be removed from phone menu 52 * Text displayed during startup, which can't be removed from phone menu
39 */ 53 */
40 GSM_DealerNote_Text, 54 GSM_DealerNote_Text,
41 /** 55 /**
42 * Text displayed during startup 56 * Text displayed during startup
43 */ 57 */
44 GSM_WelcomeNote_Text, 58 GSM_WelcomeNote_Text,
45 /** 59 /**
46 * Image defined in Smart Messaging specification 60 * Image defined in Smart Messaging specification
47 */ 61 */
48 GSM_PictureImage 62 GSM_PictureImage,
63 /**
64 * Binary picture (BMP, GIF, etc.)
65 */
66 GSM_PictureBinary
49} GSM_Bitmap_Types; 67} GSM_Bitmap_Types;
50 68
51 #define GSM_BITMAP_SIZE(65+7)/8*96 69 #define GSM_BITMAP_SIZE(65+7)/8*96
52#define GSM_BITMAP_TEXT_LENGTH 128 70#define GSM_BITMAP_TEXT_LENGTH 128
53 71
54/** 72/**
55 * Structure for all possible bitmaps, which are not saved in various filesystems 73 * Structure for all possible bitmaps, which are not saved in various filesystems
56 */ 74 */
57typedef struct { 75typedef struct {
58 /** 76 /**
59 * For all: bitmap type 77 * For all: bitmap type
60 */ 78 */
61 GSM_Bitmap_Types Type; 79 GSM_Bitmap_Types Type;
62 /** 80 /**
63 * For caller group logos: number of group 81 * For caller group logos: number of group
64 * For startup logos: number of animated bitmap 82 * For startup logos: number of animated bitmap
65 */ 83 */
66 unsigned char Location; 84 unsigned char Location;
67 /** 85 /**
68 * For dealer/welcome note text: text 86 * For dealer/welcome note text: text
69 * For caller group logo: name of group 87 * For caller group logo: name of group
70 * For picture images: text assigned to it 88 * For picture images: text assigned to it
71 */ 89 */
72 unsigned char Text[2 * (GSM_BITMAP_TEXT_LENGTH + 1)]; 90 unsigned char Text[2 * (GSM_BITMAP_TEXT_LENGTH + 1)];
73 /** 91 /**
74 * For caller group logo: true, when logo is enabled in group 92 * For caller group logo: true, when logo is enabled in group
75 */ 93 */
76 bool BitmapEnabled; 94 bool BitmapEnabled;
77 /** 95 /**
78 * For caller group logo: true, when group has default name 96 * For caller group logo: true, when group has default name
79 */ 97 */
80 bool DefaultName; 98 bool DefaultName;
81 /** 99 /**
82 * For caller group logo: true, when group has default bitmap 100 * For caller group logo: true, when group has default bitmap
83 */ 101 */
84 bool DefaultBitmap; 102 bool DefaultBitmap;
85 /** 103 /**
86 * For caller group logo: true, when group has default ringtone 104 * For caller group logo: true, when group has default ringtone
87 */ 105 */
88 bool DefaultRingtone; 106 bool DefaultRingtone;
89 /** 107 /**
90 * For caller group logo: ringtone ID. Phone model specific 108 * For caller group logo: ringtone ID. Phone model specific
91 */ 109 */
92 unsigned char RingtoneID; 110 unsigned char RingtoneID;
93 bool FileSystemRingtone; 111 bool FileSystemRingtone;
94 /** 112 /**
95 * For mono bitmaps: body of bitmap 113 * For mono bitmaps: body of bitmap
96 */ 114 */
97 unsigned char BitmapPoints[GSM_BITMAP_SIZE]; 115 unsigned char BitmapPoints[GSM_BITMAP_SIZE];
98 /** 116 /**
99 * For mono bitmaps: height specified in pixels 117 * For mono bitmaps: height specified in pixels
100 */ 118 */
101 unsigned char BitmapHeight; 119 unsigned char BitmapHeight;
102 /** 120 /**
103 * For mono bitmaps: width specified in pixels 121 * For mono bitmaps: width specified in pixels
104 */ 122 */
105 unsigned char BitmapWidth; 123 unsigned char BitmapWidth;
106 /** 124 /**
107 * For operator logos: Network operator code 125 * For operator logos: Network operator code
108 */ 126 */
109 char NetworkCode[7]; 127 char NetworkCode[7];
110 /** 128 /**
111 * For picture images: number of sender 129 * For picture images: number of sender
112 */ 130 */
113 unsigned char Sender[2 * (GSM_MAX_NUMBER_LENGTH + 1)]; 131 unsigned char Sender[2 * (GSM_MAX_NUMBER_LENGTH + 1)];
114 /** 132 /**
115 * For colour bitmaps: ID 133 * For colour bitmaps: ID
116 */ 134 */
117 unsigned char ID; 135 unsigned char ID;
136 /**
137 * For binary pictures (GIF, BMP, etc.): frame and length
138 */
139 GSM_BinaryPicture BinaryPic;
140 /**
141 * Bitmap name
142 */
143 char *Name;
118} GSM_Bitmap; 144} GSM_Bitmap;
119 145
120#define MAX_MULTI_BITMAP 6 146#define MAX_MULTI_BITMAP 6
121 147
122/** 148/**
123 * Structure to handle more than one bitmap 149 * Structure to handle more than one bitmap
124 */ 150 */
125typedef struct { 151typedef struct {
126 /** 152 /**
127 * Number of bitmaps 153 * Number of bitmaps
128 */ 154 */
129 unsigned char Number; 155 unsigned char Number;
130 /** 156 /**
131 * All bitmaps 157 * All bitmaps
132 */ 158 */
133 GSM_Bitmap Bitmap[MAX_MULTI_BITMAP]; 159 GSM_Bitmap Bitmap[MAX_MULTI_BITMAP];
134} GSM_MultiBitmap; 160} GSM_MultiBitmap;
135 161
136typedef enum { 162typedef enum {
137 GSM_NokiaStartupLogo = 1,/*size 84*48*/ 163 GSM_NokiaStartupLogo = 1,/*size 84*48*/
138 GSM_NokiaOperatorLogo, /*size 72*14*/ 164 GSM_NokiaOperatorLogo, /*size 72*14*/
139 GSM_Nokia7110OperatorLogo,/*size 78*21*/ 165 GSM_Nokia7110OperatorLogo,/*size 78*21*/
140 GSM_Nokia6510OperatorLogo,/*size 78*21*/ 166 GSM_Nokia6510OperatorLogo,/*size 78*21*/
141 GSM_NokiaCallerLogo, /*size 72*14*/ 167 GSM_NokiaCallerLogo, /*size 72*14*/
142 GSM_NokiaPictureImage, /*size 72*28*/ 168 GSM_NokiaPictureImage, /*size 72*28*/
143 GSM_Nokia7110StartupLogo,/*size 96*65*/ 169 GSM_Nokia7110StartupLogo,/*size 96*65*/
144 GSM_Nokia6210StartupLogo,/*size 96*60*/ 170 GSM_Nokia6210StartupLogo,/*size 96*60*/
145 GSM_AlcatelBMMIPicture, 171 GSM_AlcatelBMMIPicture,
146 GSM_EMSSmallPicture, /*size 8* 8*/ 172 GSM_EMSSmallPicture, /*size 8* 8*/
147 GSM_EMSMediumPicture, /*size 16*16*/ 173 GSM_EMSMediumPicture, /*size 16*16*/
148 GSM_EMSBigPicture, /*size 32*32*/ 174 GSM_EMSBigPicture, /*size 32*32*/
149 GSM_EMSVariablePicture 175 GSM_EMSVariablePicture
150} GSM_Phone_Bitmap_Types; 176} GSM_Phone_Bitmap_Types;
151 177
152 bool GSM_IsPointBitmap (GSM_Bitmap *bmp, int x, int y); 178 bool GSM_IsPointBitmap (GSM_Bitmap *bmp, int x, int y);
153 void GSM_SetPointBitmap (GSM_Bitmap *bmp, int x, int y); 179 void GSM_SetPointBitmap (GSM_Bitmap *bmp, int x, int y);
154 void GSM_ClearPointBitmap (GSM_Bitmap *bmp, int x, int y); 180 void GSM_ClearPointBitmap (GSM_Bitmap *bmp, int x, int y);
155 void GSM_ClearBitmap (GSM_Bitmap *bmp); 181 void GSM_ClearBitmap (GSM_Bitmap *bmp);
156 void GSM_ResizeBitmap (GSM_Bitmap *dest, GSM_Bitmap *src, int width, int height); 182 void GSM_ResizeBitmap (GSM_Bitmap *dest, GSM_Bitmap *src, int width, int height);
157 void GSM_ReverseBitmap (GSM_Bitmap *Bitmap); 183 void GSM_ReverseBitmap (GSM_Bitmap *Bitmap);
158 void GSM_GetMaxBitmapWidthHeight(GSM_Bitmap_Types Type, unsigned char *width, unsigned char *height); 184 void GSM_GetMaxBitmapWidthHeight(GSM_Bitmap_Types Type, unsigned char *width, unsigned char *height);
159 int GSM_GetBitmapSize (GSM_Bitmap *bmp); 185 int GSM_GetBitmapSize (GSM_Bitmap *bmp);
160 void GSM_PrintBitmap (FILE *file, GSM_Bitmap *bitmap); 186 void GSM_PrintBitmap (FILE *file, GSM_Bitmap *bitmap);
161 187
162 GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_MultiBitmap *bitmap); 188 GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_MultiBitmap *bitmap);
163 GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap); 189 GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap);
164 190
165GSM_Error BMP2Bitmap (unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap); 191GSM_Error BMP2Bitmap (unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap);
diff --git a/gammu/emb/common/service/gsmmisc.h b/gammu/emb/common/service/gsmmisc.h
index 37501ad..793d3d1 100644
--- a/gammu/emb/common/service/gsmmisc.h
+++ b/gammu/emb/common/service/gsmmisc.h
@@ -247,70 +247,75 @@ typedef enum {
247#endif 247#endif
248 GSM_File_Other 248 GSM_File_Other
249} GSM_FileType; 249} GSM_FileType;
250 250
251typedef struct { 251typedef struct {
252 int Used; /* how many bytes used */ 252 int Used; /* how many bytes used */
253 unsigned char Name[300]; /* Name */ 253 unsigned char Name[300]; /* Name */
254 bool Folder; /* true, when folder */ 254 bool Folder; /* true, when folder */
255 int Level; 255 int Level;
256 GSM_FileTypeType; 256 GSM_FileTypeType;
257 unsigned charID_FullName[400]; 257 unsigned charID_FullName[400];
258 unsigned char*Buffer; 258 unsigned char*Buffer;
259 259
260 GSM_DateTimeModified; 260 GSM_DateTimeModified;
261 bool ModifiedEmpty; 261 bool ModifiedEmpty;
262 262
263 /* File attributes */ 263 /* File attributes */
264 bool Protected; 264 bool Protected;
265 bool ReadOnly; 265 bool ReadOnly;
266 bool Hidden; 266 bool Hidden;
267 bool System; 267 bool System;
268} GSM_File; 268} GSM_File;
269 269
270GSM_Error GSM_ReadFile(char *FileName, GSM_File *File); 270GSM_Error GSM_ReadFile(char *FileName, GSM_File *File);
271 271
272GSM_Error GSM_JADFindData(GSM_File File, char *Vendor, char *Name, char *JAR, char *Version, int *Size); 272GSM_Error GSM_JADFindData(GSM_File File, char *Vendor, char *Name, char *JAR, char *Version, int *Size);
273 273
274void GSM_IdentifyFileFormat(GSM_File *File); 274void GSM_IdentifyFileFormat(GSM_File *File);
275 275
276typedef struct { 276typedef struct {
277 int Free; 277 int Free;
278 int Used; 278 int Used;
279} GSM_FileSystemStatus; 279} GSM_FileSystemStatus;
280 280
281/* ----------------------------- GPRS access points ----------------------- */ 281/* ----------------------------- GPRS access points ----------------------- */
282 282
283typedef struct { 283typedef struct {
284 int Location; 284 int Location;
285 unsigned char Name[300]; 285 unsigned char Name[300];
286 unsigned char URL[500]; 286 unsigned char URL[500];
287 bool Active; 287 bool Active;
288} GSM_GPRSAccessPoint; 288} GSM_GPRSAccessPoint;
289 289
290/* ------------------------------------------------------------------------ */ 290/* ------------------------------------------------------------------------ */
291 291
292typedef enum { 292typedef enum {
293 GSM_Date_DDMMYYYY = 1, 293 GSM_Date_DDMMYYYY = 1,
294 GSM_Date_MMDDYYYY, 294 GSM_Date_MMDDYYYY,
295 GSM_Date_YYYYMMDD 295 GSM_Date_YYYYMMDD,
296 GSM_Date_DDMMMYY,
297 GSM_Date_MMDDYY,
298 GSM_Date_DDMMYY,
299 GSM_Date_YYMMDD,
300 GSM_Date_OFF
296} GSM_DateFormat; 301} GSM_DateFormat;
297 302
298typedef struct { 303typedef struct {
299 unsigned char DateSeparator; 304 unsigned char DateSeparator;
300 GSM_DateFormatDateFormat; 305 GSM_DateFormatDateFormat;
301 bool AMPMTime; 306 bool AMPMTime;
302} GSM_Locale; 307} GSM_Locale;
303 308
304/* ------------------------------------------------------------------------ */ 309/* ------------------------------------------------------------------------ */
305 310
306void ReadVCALDateTime(char *Buffer, GSM_DateTime *dt); 311void ReadVCALDateTime(char *Buffer, GSM_DateTime *dt);
307void SaveVCALDateTime(char *Buffer, int *Length, GSM_DateTime *Date, char *Start); 312void SaveVCALDateTime(char *Buffer, int *Length, GSM_DateTime *Date, char *Start);
308 313
309void SaveVCALText(char *Buffer, int *Length, char *Text, char *Start); 314void SaveVCALText(char *Buffer, int *Length, char *Text, char *Start);
310bool ReadVCALText(char *Buffer, char *Start, char *Value); 315bool ReadVCALText(char *Buffer, char *Start, char *Value);
311 316
312#endif 317#endif
313 318
314/* How should editor hadle tabs in this file? Add editor commands here. 319/* How should editor hadle tabs in this file? Add editor commands here.
315 * vim: noexpandtab sw=8 ts=8 sts=8: 320 * vim: noexpandtab sw=8 ts=8 sts=8:
316 */ 321 */
diff --git a/gammu/emb/common/service/gsmring.c b/gammu/emb/common/service/gsmring.c
index 7df46f1..dab028c 100644
--- a/gammu/emb/common/service/gsmring.c
+++ b/gammu/emb/common/service/gsmring.c
@@ -1,57 +1,60 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2/* Based on some work from Ralf Thelen (7110 ringtones), 2/* Based on some work from Ralf Thelen (7110 ringtones) and others */
3 * Gnokii (RTTL and SM) and others 3/* Based on some work (RTTL and SM) from Gnokii (www.gnokii.org)
4 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
5 * GNU GPL version 2 or later
4 */ 6 */
5 7
6#include <stdlib.h> 8#include <stdlib.h>
7#include <string.h> 9#include <string.h>
8#include <ctype.h> 10#include <ctype.h>
9#include <math.h> 11#include <math.h>
12#include <sys/stat.h>
10#ifdef WIN32 13#ifdef WIN32
11# include <windows.h> 14# include <windows.h>
12#endif 15#endif
13 16
14#include "../gsmcomon.h" 17#include "../gsmcomon.h"
15#include "../misc/coding/coding.h" 18#include "../misc/coding/coding.h"
16#include "../gsmstate.h" 19#include "../gsmstate.h"
17#include "gsmring.h" 20#include "gsmring.h"
18#include "sms/gsmsms.h" 21#include "sms/gsmsms.h"
19 22
20int GSM_RingNoteGetFrequency(GSM_RingNote Note) 23int GSM_RingNoteGetFrequency(GSM_RingNote Note)
21{ 24{
22 double freq=0; 25 double freq=0;
23 26
24 /* Values according to the software from http://iki.fi/too/sw/xring/ 27 /* Values according to the software from http://iki.fi/too/sw/xring/
25 * generated with: 28 * generated with:
26 * perl -e 'print int(4400 * (2 **($_/12)) + .5)/10, "\n" for(3..14)' 29 * perl -e 'print int(4400 * (2 **($_/12)) + .5)/10, "\n" for(3..14)'
27 */ 30 */
28 switch (Note.Note) { 31 switch (Note.Note) {
29 case Note_C : freq = 523.3; break; 32 case Note_C : freq = 523.3; break;
30 case Note_Cis: freq = 554.4; break; 33 case Note_Cis: freq = 554.4; break;
31 case Note_D : freq = 587.3; break; 34 case Note_D : freq = 587.3; break;
32 case Note_Dis: freq = 622.3; break; 35 case Note_Dis: freq = 622.3; break;
33 case Note_E : freq = 659.3; break; 36 case Note_E : freq = 659.3; break;
34 case Note_F : freq = 698.5; break; 37 case Note_F : freq = 698.5; break;
35 case Note_Fis: freq = 740; break; 38 case Note_Fis: freq = 740; break;
36 case Note_G : freq = 784; break; 39 case Note_G : freq = 784; break;
37 case Note_Gis: freq = 830.6; break; 40 case Note_Gis: freq = 830.6; break;
38 case Note_A : freq = 880; break; 41 case Note_A : freq = 880; break;
39 case Note_Ais: freq = 932.3; break; 42 case Note_Ais: freq = 932.3; break;
40 case Note_H : freq = 987.8; break; 43 case Note_H : freq = 987.8; break;
41 case Note_Pause: break; 44 case Note_Pause: break;
42 } 45 }
43 switch (Note.Scale) { 46 switch (Note.Scale) {
44 case Scale_440 : freq = freq / 2; break; 47 case Scale_440 : freq = freq / 2; break;
45 case Scale_880 : break; 48 case Scale_880 : break;
46 case Scale_1760: freq = freq * 2; break; 49 case Scale_1760: freq = freq * 2; break;
47 case Scale_3520: freq = freq * 4; break; 50 case Scale_3520: freq = freq * 4; break;
48 default : break; 51 default : break;
49 } 52 }
50 return (int)freq; 53 return (int)freq;
51} 54}
52 55
53int GSM_RingNoteGetFullDuration(GSM_RingNote Note) 56int GSM_RingNoteGetFullDuration(GSM_RingNote Note)
54{ 57{
55 int duration = 1; 58 int duration = 1;
56 59
57 switch (Note.Duration) { 60 switch (Note.Duration) {
@@ -111,96 +114,102 @@ GSM_Error savewav(FILE *file, GSM_Ringtone *ringtone)
111 DATA_Buffer[j] = ((int)(0.5*50000)); 114 DATA_Buffer[j] = ((int)(0.5*50000));
112#endif 115#endif
113 phase = phase + phase_step; 116 phase = phase + phase_step;
114 length++; 117 length++;
115 } 118 }
116 fwrite(&DATA_Buffer,sizeof(short),j,file); 119 fwrite(&DATA_Buffer,sizeof(short),j,file);
117 } 120 }
118 } 121 }
119 122
120 wavfilesize = sizeof(WAV_Header) + sizeof(FMT_Header) + sizeof(DATA_Header) + length*2; 123 wavfilesize = sizeof(WAV_Header) + sizeof(FMT_Header) + sizeof(DATA_Header) + length*2;
121 WAV_Header[4] = ((unsigned char)wavfilesize % 256); 124 WAV_Header[4] = ((unsigned char)wavfilesize % 256);
122 WAV_Header[5] = ((unsigned char)wavfilesize / 256); 125 WAV_Header[5] = ((unsigned char)wavfilesize / 256);
123 WAV_Header[6] = ((unsigned char)wavfilesize / (256*256)); 126 WAV_Header[6] = ((unsigned char)wavfilesize / (256*256));
124 WAV_Header[7] = ((unsigned char)wavfilesize / (256*256*256)); 127 WAV_Header[7] = ((unsigned char)wavfilesize / (256*256*256));
125 wavfilesize = wavfilesize - 54; 128 wavfilesize = wavfilesize - 54;
126 DATA_Header[4] = ((unsigned char)wavfilesize % 256); 129 DATA_Header[4] = ((unsigned char)wavfilesize % 256);
127 DATA_Header[5] = ((unsigned char)wavfilesize / 256); 130 DATA_Header[5] = ((unsigned char)wavfilesize / 256);
128 DATA_Header[6] = ((unsigned char)wavfilesize / (256*256)); 131 DATA_Header[6] = ((unsigned char)wavfilesize / (256*256));
129 DATA_Header[7] = ((unsigned char)wavfilesize / (256*256*256)); 132 DATA_Header[7] = ((unsigned char)wavfilesize / (256*256*256));
130 133
131 fseek( file, 0, SEEK_SET); 134 fseek( file, 0, SEEK_SET);
132 fwrite(&WAV_Header, 1, sizeof(WAV_Header),file); 135 fwrite(&WAV_Header, 1, sizeof(WAV_Header),file);
133 fwrite(&FMT_Header, 1, sizeof(FMT_Header),file); 136 fwrite(&FMT_Header, 1, sizeof(FMT_Header),file);
134 fwrite(&DATA_Header, 1, sizeof(DATA_Header),file); 137 fwrite(&DATA_Header, 1, sizeof(DATA_Header),file);
135 138
136 return ERR_NONE; 139 return ERR_NONE;
137} 140}
138 141
139static GSM_Error savebin(FILE *file, GSM_Ringtone *ringtone) 142static GSM_Error savebin(FILE *file, GSM_Ringtone *ringtone)
140{ 143{
141 char nullchar=0x00; 144 char nullchar=0x00;
142 145
143 fwrite(&nullchar,1,1,file); 146 fwrite(&nullchar,1,1,file);
144 fwrite(&nullchar,1,1,file); 147 fwrite(&nullchar,1,1,file);
145 fprintf(file,"\x0C\x01\x2C"); 148 fprintf(file,"\x0C\x01\x2C");
146 fprintf(file,"%s",DecodeUnicodeString(ringtone->Name)); 149 fprintf(file,"%s",DecodeUnicodeString(ringtone->Name));
147 fwrite(&nullchar,1,1,file); 150 fwrite(&nullchar,1,1,file);
148 fwrite(&nullchar,1,1,file); 151 fwrite(&nullchar,1,1,file);
149 fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file); 152 fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file);
150 return ERR_NONE; 153 return ERR_NONE;
151} 154}
152 155
153static GSM_Error savepuremidi(FILE *file, GSM_Ringtone *ringtone) 156static GSM_Error savepuremidi(FILE *file, GSM_Ringtone *ringtone)
154{ 157{
155 fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file); 158 fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file);
156 return ERR_NONE; 159 return ERR_NONE;
157} 160}
158 161
162static GSM_Error savemmf(FILE *file, GSM_Ringtone *ringtone)
163{
164 fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file);
165 return ERR_NONE;
166}
167
159GSM_Error saverttl(FILE *file, GSM_Ringtone *ringtone) 168GSM_Error saverttl(FILE *file, GSM_Ringtone *ringtone)
160{ 169{
161 GSM_RingNoteScaleDefNoteScale; 170 GSM_RingNoteScaleDefNoteScale;
162 GSM_RingNoteDurationDefNoteDuration; 171 GSM_RingNoteDurationDefNoteDuration;
163 172
164 GSM_RingNoteStyleDefNoteStyle=0; 173 GSM_RingNoteStyleDefNoteStyle=0;
165 int DefNoteTempo=0; 174 int DefNoteTempo=0;
166 175
167 bool started = false, firstcomma = true; 176 bool started = false, firstcomma = true;
168 GSM_RingNote *Note; 177 GSM_RingNote *Note;
169 178
170 unsigned char buffer[15]; 179 unsigned char buffer[15];
171 int i,j,k=0; 180 int i,j,k=0;
172 181
173 /* Saves ringtone name */ 182 /* Saves ringtone name */
174 fprintf(file,"%s:",DecodeUnicodeString(ringtone->Name)); 183 fprintf(file,"%s:",DecodeUnicodeString(ringtone->Name));
175 184
176 /* Find the most frequently used duration */ 185 /* Find the most frequently used duration */
177 for (i=0;i<6;i++) buffer[i]=0; 186 for (i=0;i<6;i++) buffer[i]=0;
178 for (i=0;i<ringtone->NoteTone.NrCommands;i++) { 187 for (i=0;i<ringtone->NoteTone.NrCommands;i++) {
179 if (ringtone->NoteTone.Commands[i].Type == RING_Note) { 188 if (ringtone->NoteTone.Commands[i].Type == RING_Note) {
180 Note = &ringtone->NoteTone.Commands[i].Note; 189 Note = &ringtone->NoteTone.Commands[i].Note;
181 /* some durations need 2 bytes in file, some 1 */ 190 /* some durations need 2 bytes in file, some 1 */
182 if (Note->Duration >= Duration_Full && Note->Duration <= Duration_1_8) { 191 if (Note->Duration >= Duration_Full && Note->Duration <= Duration_1_8) {
183 buffer[Note->Duration/32]++; 192 buffer[Note->Duration/32]++;
184 } 193 }
185 if (Note->Duration >= Duration_1_16 && Note->Duration <= Duration_1_32) { 194 if (Note->Duration >= Duration_1_16 && Note->Duration <= Duration_1_32) {
186 buffer[Note->Duration/32]+=2; 195 buffer[Note->Duration/32]+=2;
187 } 196 }
188 } 197 }
189 } 198 }
190 /* Now find the most frequently used */ 199 /* Now find the most frequently used */
191 j=0; 200 j=0;
192 for (i=0;i<6;i++) { 201 for (i=0;i<6;i++) {
193 if (buffer[i]>j) { 202 if (buffer[i]>j) {
194 k=i; 203 k=i;
195 j=buffer[i]; 204 j=buffer[i];
196 } 205 }
197 } 206 }
198 /* Finally convert the default duration */ 207 /* Finally convert the default duration */
199 DefNoteDuration = k * 32; 208 DefNoteDuration = k * 32;
200 dbgprintf("DefNoteDuration=%d\n", DefNoteDuration); 209 dbgprintf("DefNoteDuration=%d\n", DefNoteDuration);
201 switch (DefNoteDuration) { 210 switch (DefNoteDuration) {
202 case Duration_Full:fprintf(file,"d=1"); break; 211 case Duration_Full:fprintf(file,"d=1"); break;
203 case Duration_1_2 :fprintf(file,"d=2"); break; 212 case Duration_1_2 :fprintf(file,"d=2"); break;
204 case Duration_1_4 :fprintf(file,"d=4"); break; 213 case Duration_1_4 :fprintf(file,"d=4"); break;
205 case Duration_1_8 :fprintf(file,"d=8"); break; 214 case Duration_1_8 :fprintf(file,"d=8"); break;
206 case Duration_1_16:fprintf(file,"d=16");break; 215 case Duration_1_16:fprintf(file,"d=16");break;
@@ -440,96 +449,99 @@ void savemid(FILE* file, GSM_Ringtone *ringtone)
440 fwrite(midifile,1,current,file); 449 fwrite(midifile,1,current,file);
441} 450}
442 451
443#endif 452#endif
444 453
445void saveott(FILE *file, GSM_Ringtone *ringtone) 454void saveott(FILE *file, GSM_Ringtone *ringtone)
446{ 455{
447 char Buffer[2000]; 456 char Buffer[2000];
448 int i=2000; 457 int i=2000;
449 458
450 GSM_EncodeNokiaRTTLRingtone(*ringtone, Buffer, &i); 459 GSM_EncodeNokiaRTTLRingtone(*ringtone, Buffer, &i);
451 460
452 fwrite(Buffer, 1, i, file); 461 fwrite(Buffer, 1, i, file);
453} 462}
454 463
455GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone) 464GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone)
456{ 465{
457 FILE *file; 466 FILE *file;
458 467
459 file = fopen(FileName, "wb"); 468 file = fopen(FileName, "wb");
460 if (file == NULL) return ERR_CANTOPENFILE; 469 if (file == NULL) return ERR_CANTOPENFILE;
461 470
462 switch (ringtone->Format) { 471 switch (ringtone->Format) {
463 case RING_NOTETONE: 472 case RING_NOTETONE:
464 if (strstr(FileName,".ott")) { 473 if (strstr(FileName,".ott")) {
465 saveott(file,ringtone); 474 saveott(file,ringtone);
466#ifndef ENABLE_LGPL 475#ifndef ENABLE_LGPL
467 } else if (strstr(FileName,".mid")) { 476 } else if (strstr(FileName,".mid")) {
468 savemid(file,ringtone); 477 savemid(file,ringtone);
469#endif 478#endif
470 } else if (strstr(FileName,".rng")) { 479 } else if (strstr(FileName,".rng")) {
471 saveott(file,ringtone); 480 saveott(file,ringtone);
472 } else if (strstr(FileName,".imy")) { 481 } else if (strstr(FileName,".imy")) {
473 saveimelody(file,ringtone); 482 saveimelody(file,ringtone);
474 } else if (strstr(FileName,".ime")) { 483 } else if (strstr(FileName,".ime")) {
475 saveimelody(file,ringtone); 484 saveimelody(file,ringtone);
476 } else if (strstr(FileName,".wav")) { 485 } else if (strstr(FileName,".wav")) {
477 savewav(file,ringtone); 486 savewav(file,ringtone);
478 } else { 487 } else {
479 saverttl(file, ringtone); 488 saverttl(file, ringtone);
480 } 489 }
481 break; 490 break;
482 case RING_NOKIABINARY: 491 case RING_NOKIABINARY:
483 savebin(file, ringtone); 492 savebin(file, ringtone);
484 break; 493 break;
485 case RING_MIDI: 494 case RING_MIDI:
486 savepuremidi(file, ringtone); 495 savepuremidi(file, ringtone);
487 break; 496 break;
497 case RING_MMF:
498 savemmf(file, ringtone);
499 break;
488 } 500 }
489 501
490 fclose(file); 502 fclose(file);
491 503
492 return ERR_NONE; 504 return ERR_NONE;
493} 505}
494 506
495static GSM_Error loadrttl(FILE *file, GSM_Ringtone *ringtone) 507static GSM_Error loadrttl(FILE *file, GSM_Ringtone *ringtone)
496{ 508{
497 GSM_RingNoteScale DefNoteScale= Scale_880; 509 GSM_RingNoteScale DefNoteScale= Scale_880;
498 GSM_RingNoteDuration DefNoteDuration= Duration_1_4; 510 GSM_RingNoteDuration DefNoteDuration= Duration_1_4;
499 GSM_RingNoteStyle DefNoteStyle= NaturalStyle; 511 GSM_RingNoteStyle DefNoteStyle= NaturalStyle;
500 int DefNoteTempo= 63, i=0; 512 int DefNoteTempo= 63, i=0;
501 513
502 unsigned char buffer[2000],Name[100]; 514 unsigned char buffer[2000],Name[100];
503 GSM_RingNote *Note; 515 GSM_RingNote *Note;
504 516
505 fread(buffer, 2000, 1, file); 517 fread(buffer, 2000, 1, file);
506 518
507 ringtone->NoteTone.NrCommands = 0; 519 ringtone->NoteTone.NrCommands = 0;
508 520
509 /* -------------- name ---------------- */ 521 /* -------------- name ---------------- */
510 while (buffer[i] != ':') { 522 while (buffer[i] != ':') {
511 if (buffer[i] == 0x00) return ERR_NONE; 523 if (buffer[i] == 0x00) return ERR_NONE;
512 i++; 524 i++;
513 } 525 }
514 if (i == 0) { 526 if (i == 0) {
515 /* This is for RTTL ringtones without name. */ 527 /* This is for RTTL ringtones without name. */
516 EncodeUnicode(ringtone->Name,"Gammu",5); 528 EncodeUnicode(ringtone->Name,"Gammu",5);
517 } else { 529 } else {
518 memcpy(Name,buffer,i); 530 memcpy(Name,buffer,i);
519 Name[i] = 0x00; 531 Name[i] = 0x00;
520 EncodeUnicode(ringtone->Name,Name,strlen(Name)); 532 EncodeUnicode(ringtone->Name,Name,strlen(Name));
521 } 533 }
522 i++; 534 i++;
523 535
524 /* --------- section with default ringtone settings ----------- */ 536 /* --------- section with default ringtone settings ----------- */
525 while(1) { 537 while(1) {
526 switch (buffer[i]) { 538 switch (buffer[i]) {
527 case ':': 539 case ':':
528 break; 540 break;
529 case 0x00: 541 case 0x00:
530 return ERR_NONE; 542 return ERR_NONE;
531 case 'd': case 'D': 543 case 'd': case 'D':
532 switch (atoi(buffer+i+2)) { 544 switch (atoi(buffer+i+2)) {
533 case 1: DefNoteDuration = Duration_Full; break; 545 case 1: DefNoteDuration = Duration_Full; break;
534 case 2: DefNoteDuration = Duration_1_2 ; break; 546 case 2: DefNoteDuration = Duration_1_2 ; break;
535 case 4: DefNoteDuration = Duration_1_4 ; break; 547 case 4: DefNoteDuration = Duration_1_4 ; break;
@@ -724,169 +736,198 @@ static GSM_Error loadcommunicator(FILE *file, GSM_Ringtone *ringtone)
724 char Buffer[4000]; 736 char Buffer[4000];
725 int i,j; 737 int i,j;
726 738
727 i=fread(Buffer, 1, 4000, file); 739 i=fread(Buffer, 1, 4000, file);
728 740
729 i=0;j=0; 741 i=0;j=0;
730 while (true) { 742 while (true) {
731 if (Buffer[j] ==0x00 && Buffer[j+1]==0x02 && 743 if (Buffer[j] ==0x00 && Buffer[j+1]==0x02 &&
732 Buffer[j+2]==0x4a && Buffer[j+3]==0x3a) break; 744 Buffer[j+2]==0x4a && Buffer[j+3]==0x3a) break;
733 if (j==i-4) return ERR_UNKNOWN; 745 if (j==i-4) return ERR_UNKNOWN;
734 j++; 746 j++;
735 } 747 }
736 j++; 748 j++;
737 749
738 return GSM_DecodeNokiaRTTLRingtone(ringtone, Buffer+j, i-j); 750 return GSM_DecodeNokiaRTTLRingtone(ringtone, Buffer+j, i-j);
739} 751}
740 752
741static GSM_Error loadbin(FILE *file, GSM_Ringtone *ringtone) 753static GSM_Error loadbin(FILE *file, GSM_Ringtone *ringtone)
742{ 754{
743 int i; 755 int i;
744 unsigned charbuffer[2000]; 756 unsigned charbuffer[2000];
745 757
746 dbgprintf("loading binary\n"); 758 dbgprintf("loading binary\n");
747 ringtone->NokiaBinary.Length=fread(buffer, 1, 500, file); 759 ringtone->NokiaBinary.Length=fread(buffer, 1, 500, file);
748 i=5; 760 i=5;
749 while (buffer[i]!=0x00) i++; 761 while (buffer[i]!=0x00) i++;
750 EncodeUnicode(ringtone->Name,buffer+5,i-5); 762 EncodeUnicode(ringtone->Name,buffer+5,i-5);
751 while (buffer[i]!=0x02 && buffer[i+1]!=0xFC && buffer[i+2]!=0x09) { 763 while (buffer[i]!=0x02 && buffer[i+1]!=0xFC && buffer[i+2]!=0x09) {
752 i++; 764 i++;
753 } 765 }
754 ringtone->NokiaBinary.Length=ringtone->NokiaBinary.Length-i; 766 ringtone->NokiaBinary.Length=ringtone->NokiaBinary.Length-i;
755 memcpy(ringtone->NokiaBinary.Frame,buffer+i,ringtone->NokiaBinary.Length); 767 memcpy(ringtone->NokiaBinary.Frame,buffer+i,ringtone->NokiaBinary.Length);
756 dbgprintf("Length %i name \"%s\"\n",ringtone->NokiaBinary.Length,DecodeUnicodeString(ringtone->Name)); 768 dbgprintf("Length %i name \"%s\"\n",ringtone->NokiaBinary.Length,DecodeUnicodeString(ringtone->Name));
757 return ERR_NONE; 769 return ERR_NONE;
758} 770}
759 771
760static GSM_Error loadpuremidi(FILE *file, GSM_Ringtone *ringtone) 772static GSM_Error loadpuremidi(FILE *file, GSM_Ringtone *ringtone)
761{ 773{
762 unsigned char buffer[30000]; 774 unsigned char buffer[30000];
763 775
764 dbgprintf("loading midi\n"); 776 dbgprintf("loading midi\n");
765 EncodeUnicode(ringtone->Name,"MIDI",4); 777 EncodeUnicode(ringtone->Name,"MIDI",4);
766 ringtone->NokiaBinary.Length=fread(buffer, 1, 30000, file); 778 ringtone->NokiaBinary.Length=fread(buffer, 1, 30000, file);
767 memcpy(ringtone->NokiaBinary.Frame,buffer,ringtone->NokiaBinary.Length); 779 memcpy(ringtone->NokiaBinary.Frame,buffer,ringtone->NokiaBinary.Length);
768 dbgprintf("Length %i name \"%s\"\n",ringtone->NokiaBinary.Length,DecodeUnicodeString(ringtone->Name)); 780 dbgprintf("Length %i name \"%s\"\n",ringtone->NokiaBinary.Length,DecodeUnicodeString(ringtone->Name));
769 return ERR_NONE; 781 return ERR_NONE;
770} 782}
771 783
784static GSM_Error loadmmf(FILE *file, GSM_Ringtone *ringtone)
785{
786 struct stat st;
787 char *buffer;
788 int length;
789
790 dbgprintf("loading smaf file\n");
791 fstat(fileno(file), &st);
792 ringtone->BinaryTone.Length = length = st.st_size;
793 ringtone->BinaryTone.Buffer = buffer = malloc(length);
794 if (buffer == NULL)
795 return ERR_MOREMEMORY;
796 fread(buffer, 1, length, file);
797
798 dbgprintf("Length %i name \"%s\"\n", length,
799 DecodeUnicodeString(ringtone->Name));
800
801 return ERR_NONE;
802}
803
772static GSM_Error loadre(FILE *file, GSM_Ringtone *ringtone) 804static GSM_Error loadre(FILE *file, GSM_Ringtone *ringtone)
773{ 805{
774 unsigned char buffer[2000]; 806 unsigned char buffer[2000];
775 807
776 ringtone->NokiaBinary.Length=fread(buffer, 1, 500, file); 808 ringtone->NokiaBinary.Length=fread(buffer, 1, 500, file);
777 809
778 if (buffer[18]==0x00 && buffer[21]!=0x02) { 810 if (buffer[18]==0x00 && buffer[21]!=0x02) {
779 /* DCT3, Unicode subformat, 62xx & 7110 */ 811 /* DCT3, Unicode subformat, 62xx & 7110 */
780 CopyUnicodeString(ringtone->Name,buffer+18); 812 CopyUnicodeString(ringtone->Name,buffer+18);
781 ringtone->NokiaBinary.Length = ringtone->NokiaBinary.Length - (21+UnicodeLength(ringtone->Name)*2); 813 ringtone->NokiaBinary.Length = ringtone->NokiaBinary.Length - (21+UnicodeLength(ringtone->Name)*2);
782 memcpy(ringtone->NokiaBinary.Frame,buffer+21+UnicodeLength(ringtone->Name)*2,ringtone->NokiaBinary.Length); 814 memcpy(ringtone->NokiaBinary.Frame,buffer+21+UnicodeLength(ringtone->Name)*2,ringtone->NokiaBinary.Length);
783 } else { 815 } else {
784 /* DCT3, normal subformat, 32xx/33xx/51xx/5210/5510/61xx/8xxx */ 816 /* DCT3, normal subformat, 32xx/33xx/51xx/5210/5510/61xx/8xxx */
785 EncodeUnicode(ringtone->Name,buffer+17,buffer[16]); 817 EncodeUnicode(ringtone->Name,buffer+17,buffer[16]);
786 ringtone->NokiaBinary.Length = ringtone->NokiaBinary.Length - (19+UnicodeLength(ringtone->Name)); 818 ringtone->NokiaBinary.Length = ringtone->NokiaBinary.Length - (19+UnicodeLength(ringtone->Name));
787 memcpy(ringtone->NokiaBinary.Frame,buffer+19+UnicodeLength(ringtone->Name),ringtone->NokiaBinary.Length); 819 memcpy(ringtone->NokiaBinary.Frame,buffer+19+UnicodeLength(ringtone->Name),ringtone->NokiaBinary.Length);
788 } 820 }
789 dbgprintf("Name \"%s\"\n",DecodeUnicodeString(ringtone->Name)); 821 dbgprintf("Name \"%s\"\n",DecodeUnicodeString(ringtone->Name));
790 return ERR_NONE; 822 return ERR_NONE;
791} 823}
792 824
793GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone) 825GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone)
794{ 826{
795 FILE *file; 827 FILE *file;
796 unsigned charbuffer[300]; 828 unsigned charbuffer[300];
797 GSM_Errorerror = ERR_UNKNOWN; 829 GSM_Errorerror = ERR_UNKNOWN;
798 830
799 dbgprintf("Loading ringtone %s\n",FileName); 831 dbgprintf("Loading ringtone %s\n",FileName);
800 file = fopen(FileName, "rb"); 832 file = fopen(FileName, "rb");
801 if (file == NULL) return ERR_CANTOPENFILE; 833 if (file == NULL) return ERR_CANTOPENFILE;
802 834
803 /* Read the header of the file. */ 835 /* Read the header of the file. */
804 fread(buffer, 1, 4, file); 836 fread(buffer, 1, 4, file);
805 if (ringtone->Format == 0x00) { 837 if (ringtone->Format == 0x00) {
806 ringtone->Format = RING_NOTETONE; 838 ringtone->Format = RING_NOTETONE;
807 if (buffer[0]==0x00 && buffer[1]==0x00 && 839 if (buffer[0]==0x00 && buffer[1]==0x00 &&
808 buffer[2]==0x0C && buffer[3]==0x01) { 840 buffer[2]==0x0C && buffer[3]==0x01) {
809 ringtone->Format = RING_NOKIABINARY; 841 ringtone->Format = RING_NOKIABINARY;
810 } 842 }
811 if (buffer[0]==0x00 && buffer[1]==0x00 && 843 if (buffer[0]==0x00 && buffer[1]==0x00 &&
812 buffer[2]==0x00) { 844 buffer[2]==0x00) {
813 ringtone->Format = RING_NOKIABINARY; 845 ringtone->Format = RING_NOKIABINARY;
814 } 846 }
815 if (buffer[0]==0x4D && buffer[1]==0x54 && 847 if (buffer[0]==0x4D && buffer[1]==0x54 &&
816 buffer[2]==0x68 && buffer[3]==0x64) { 848 buffer[2]==0x68 && buffer[3]==0x64) {
817 ringtone->Format = RING_MIDI; 849 ringtone->Format = RING_MIDI;
818 } 850 }
851 if (buffer[0]==0x4D && buffer[1]==0x4D &&
852 buffer[2]==0x4D && buffer[3]==0x44) {
853 ringtone->Format = RING_MMF;
854 }
819 } 855 }
820 rewind(file); 856 rewind(file);
821 switch (ringtone->Format) { 857 switch (ringtone->Format) {
822 case RING_NOTETONE: 858 case RING_NOTETONE:
823 if (buffer[0]==0x02 && buffer[1]==0x4A) { 859 if (buffer[0]==0x02 && buffer[1]==0x4A) {
824 error=loadott(file,ringtone); 860 error=loadott(file,ringtone);
825 } else if (buffer[0]==0xC7 && buffer[1]==0x45) { 861 } else if (buffer[0]==0xC7 && buffer[1]==0x45) {
826 error=loadcommunicator(file,ringtone); 862 error=loadcommunicator(file,ringtone);
827 } else { 863 } else {
828 error=loadrttl(file,ringtone); 864 error=loadrttl(file,ringtone);
829 } 865 }
830 ringtone->NoteTone.AllNotesScale=false; 866 ringtone->NoteTone.AllNotesScale=false;
831 break; 867 break;
832 case RING_NOKIABINARY: 868 case RING_NOKIABINARY:
833 if (buffer[0]==0x00 && buffer[1]==0x00 && 869 if (buffer[0]==0x00 && buffer[1]==0x00 &&
834 buffer[2]==0x0C && buffer[3]==0x01) { 870 buffer[2]==0x0C && buffer[3]==0x01) {
835 error=loadbin(file,ringtone); 871 error=loadbin(file,ringtone);
836 } 872 }
837 if (buffer[0]==0x00 && buffer[1]==0x00 && 873 if (buffer[0]==0x00 && buffer[1]==0x00 &&
838 buffer[2]==0x00) { 874 buffer[2]==0x00) {
839 error=loadre(file,ringtone); 875 error=loadre(file,ringtone);
840 } 876 }
841 break; 877 break;
842 case RING_MIDI: 878 case RING_MIDI:
843 EncodeUnicode(ringtone->Name,FileName,strlen(FileName)); 879 EncodeUnicode(ringtone->Name,FileName,strlen(FileName));
844 error = loadpuremidi(file,ringtone); 880 error = loadpuremidi(file,ringtone);
881 break;
882 case RING_MMF:
883 EncodeUnicode(ringtone->Name,FileName,strlen(FileName));
884 error = loadmmf(file,ringtone);
885 break;
845 } 886 }
846 fclose(file); 887 fclose(file);
847 return(error); 888 return(error);
848} 889}
849 890
850/* -------------------------- required with Nokia & RTTL ------------------- */ 891/* -------------------------- required with Nokia & RTTL ------------------- */
851 892
852/* Beats per Minute like written in Smart Messaging */ 893/* Beats per Minute like written in Smart Messaging */
853static int SM_BeatsPerMinute[] = { 894static int SM_BeatsPerMinute[] = {
854 25, 28, 31, 35, 40, 45, 50, 56, 63,70, 895 25, 28, 31, 35, 40, 45, 50, 56, 63,70,
855 80, 90, 100, 112, 125, 140, 160, 180, 200,225, 896 80, 90, 100, 112, 125, 140, 160, 180, 200,225,
856 250, 285, 320, 355, 400, 450, 500, 565, 635,715, 897 250, 285, 320, 355, 400, 450, 500, 565, 635,715,
857 800,900 898 800,900
858}; 899};
859 900
860int GSM_RTTLGetTempo(int Beats) 901int GSM_RTTLGetTempo(int Beats)
861{ 902{
862 int i=0; 903 int i=0;
863 904
864 while (Beats > SM_BeatsPerMinute[i] && SM_BeatsPerMinute[i] != 900) i++; 905 while (Beats > SM_BeatsPerMinute[i] && SM_BeatsPerMinute[i] != 900) i++;
865 906
866 return i<<3; 907 return i<<3;
867} 908}
868 909
869/* This function packs the ringtone from the structure "ringtone" to 910/* This function packs the ringtone from the structure "ringtone" to
870 "package", where maxlength means length of package. 911 "package", where maxlength means length of package.
871 Function returns number of packed notes and change maxlength to 912 Function returns number of packed notes and change maxlength to
872 number of used chars in "package" */ 913 number of used chars in "package" */
873unsigned char GSM_EncodeNokiaRTTLRingtone(GSM_Ringtone ringtone, unsigned char *package, int *maxlength) 914unsigned char GSM_EncodeNokiaRTTLRingtone(GSM_Ringtone ringtone, unsigned char *package, int *maxlength)
874{ 915{
875 unsigned char CommandLength = 0x02; 916 unsigned char CommandLength = 0x02;
876 unsigned char Loop = 0x15;/* Infinite */ 917 unsigned char Loop = 0x15;/* Infinite */
877 918
878 unsigned char Buffer[200]; 919 unsigned char Buffer[200];
879 int StartBit=0, OldStartBit; 920 int StartBit=0, OldStartBit;
880 int StartBitHowManyCommands; 921 int StartBitHowManyCommands;
881 int HowManyCommands = 0;/* How many instructions packed */ 922 int HowManyCommands = 0;/* How many instructions packed */
882 int HowManyNotes= 0; 923 int HowManyNotes= 0;
883 int i,j; 924 int i,j;
884 bool started; 925 bool started;
885 GSM_RingNote *Note; 926 GSM_RingNote *Note;
886 927
887 GSM_RingNoteScale DefScale = 255; 928 GSM_RingNoteScale DefScale = 255;
888 GSM_RingNoteStyle DefStyle = 255; 929 GSM_RingNoteStyle DefStyle = 255;
889 int DefTempo = 255; 930 int DefTempo = 255;
890 931
891 AddBufferByte(package, &StartBit, CommandLength, 8); 932 AddBufferByte(package, &StartBit, CommandLength, 8);
892 AddBufferByte(package, &StartBit, SM_Command_RingingToneProgramming, 7); 933 AddBufferByte(package, &StartBit, SM_Command_RingingToneProgramming, 7);
diff --git a/gammu/emb/common/service/gsmring.h b/gammu/emb/common/service/gsmring.h
index 207cf31..2d2dd7a 100644
--- a/gammu/emb/common/service/gsmring.h
+++ b/gammu/emb/common/service/gsmring.h
@@ -75,111 +75,113 @@ typedef enum {
75 DoubleDottedNote = 0x02<<6, 75 DoubleDottedNote = 0x02<<6,
76 Length_2_3 = 0x03<<6 76 Length_2_3 = 0x03<<6
77} GSM_RingNoteDurationSpec; 77} GSM_RingNoteDurationSpec;
78 78
79typedef enum { 79typedef enum {
80 Scale_55 = 1, /* 55 Hz for note A */ 80 Scale_55 = 1, /* 55 Hz for note A */
81 Scale_110, /* 110 Hz for note A */ 81 Scale_110, /* 110 Hz for note A */
82 Scale_220, 82 Scale_220,
83 Scale_440, /* first scale for Nokia */ 83 Scale_440, /* first scale for Nokia */
84 Scale_880, 84 Scale_880,
85 Scale_1760, 85 Scale_1760,
86 Scale_3520, /* last scale for Nokia */ 86 Scale_3520, /* last scale for Nokia */
87 Scale_7040, 87 Scale_7040,
88 Scale_14080 88 Scale_14080
89} GSM_RingNoteScale; 89} GSM_RingNoteScale;
90 90
91typedef struct { 91typedef struct {
92 GSM_RingNoteDuration Duration; 92 GSM_RingNoteDuration Duration;
93 GSM_RingNoteDurationSpec DurationSpec; 93 GSM_RingNoteDurationSpec DurationSpec;
94 GSM_RingNoteNote Note; 94 GSM_RingNoteNote Note;
95 GSM_RingNoteStyle Style; 95 GSM_RingNoteStyle Style;
96 GSM_RingNoteScale Scale; 96 GSM_RingNoteScale Scale;
97 int Tempo; 97 int Tempo;
98} GSM_RingNote; 98} GSM_RingNote;
99 99
100typedef enum { 100typedef enum {
101 RING_Note = 1, 101 RING_Note = 1,
102 RING_EnableVibra, 102 RING_EnableVibra,
103 RING_DisableVibra, 103 RING_DisableVibra,
104 RING_EnableLight, 104 RING_EnableLight,
105 RING_DisableLight, 105 RING_DisableLight,
106 RING_EnableLED, 106 RING_EnableLED,
107 RING_DisableLED, 107 RING_DisableLED,
108 RING_Repeat 108 RING_Repeat
109} GSM_RingCommandType; 109} GSM_RingCommandType;
110 110
111typedef struct { 111typedef struct {
112 GSM_RingCommandType Type; 112 GSM_RingCommandType Type;
113 GSM_RingNote Note; 113 GSM_RingNote Note;
114 unsigned char Value; 114 unsigned char Value;
115} GSM_RingCommand; 115} GSM_RingCommand;
116 116
117typedef struct { 117typedef struct {
118 int NrCommands; 118 int NrCommands;
119 GSM_RingCommand Commands[MAX_RINGTONE_NOTES]; 119 GSM_RingCommand Commands[MAX_RINGTONE_NOTES];
120 bool AllNotesScale; 120 bool AllNotesScale;
121} GSM_NoteRingtone; 121} GSM_NoteRingtone;
122 122
123/* FIXME: should use BinaryTone instead? */
123/* Structure to hold Nokia binary ringtones. */ 124/* Structure to hold Nokia binary ringtones. */
124typedef struct { 125typedef struct {
125 unsigned char Frame[30000]; 126 unsigned char Frame[50000];
126 int Length; 127 int Length;
127} GSM_NokiaBinaryRingtone; 128} GSM_NokiaBinaryRingtone;
128 129
129typedef struct { 130typedef struct {
130 unsigned char *Frame; 131 unsigned char *Buffer;
131 int Length; 132 int Length;
132} GSM_BinaryTone; 133} GSM_BinaryTone;
133 134
134typedef enum { 135typedef enum {
135 RING_NOTETONE = 1, 136 RING_NOTETONE = 1,
136 RING_NOKIABINARY, 137 RING_NOKIABINARY,
137 RING_MIDI 138 RING_MIDI,
139 RING_MMF
138} GSM_RingtoneFormat; 140} GSM_RingtoneFormat;
139 141
140/** 142/**
141 * Structure for saving various ringtones formats 143 * Structure for saving various ringtones formats
142 */ 144 */
143typedef struct { 145typedef struct {
144 /** 146 /**
145 * Ringtone saved in one of three formats 147 * Ringtone saved in one of three formats
146 */ 148 */
147 GSM_NokiaBinaryRingtone NokiaBinary; 149 GSM_NokiaBinaryRingtone NokiaBinary;
148 GSM_BinaryTone BinaryTone; 150 GSM_BinaryTone BinaryTone;
149 GSM_NoteRingtone NoteTone; 151 GSM_NoteRingtone NoteTone;
150 /** 152 /**
151 * Ringtone format 153 * Ringtone format
152 */ 154 */
153 GSM_RingtoneFormat Format; 155 GSM_RingtoneFormat Format;
154 /** 156 /**
155 * Ringtone name 157 * Ringtone name
156 */ 158 */
157 char Name[20*2]; 159 char Name[20*2];
158 /** 160 /**
159 * Ringtone location 161 * Ringtone location
160 */ 162 */
161 int Location; 163 int Location;
162} GSM_Ringtone; 164} GSM_Ringtone;
163 165
164typedef struct { 166typedef struct {
165 int Group;//Nokia specific 167 int Group;//Nokia specific
166 int ID; 168 int ID;
167 char Name[30*2]; 169 char Name[30*2];
168} GSM_RingtoneInfo; 170} GSM_RingtoneInfo;
169 171
170typedef struct { 172typedef struct {
171 int Number; 173 int Number;
172 GSM_RingtoneInfo Ringtone[100]; 174 GSM_RingtoneInfo Ringtone[100];
173} GSM_AllRingtonesInfo; 175} GSM_AllRingtonesInfo;
174 176
175GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone); 177GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone);
176GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone); 178GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone);
177 179
178void saveott(FILE *file, GSM_Ringtone *ringtone); 180void saveott(FILE *file, GSM_Ringtone *ringtone);
179void savemid(FILE *file, GSM_Ringtone *ringtone); 181void savemid(FILE *file, GSM_Ringtone *ringtone);
180void saverng(FILE *file, GSM_Ringtone *ringtone); 182void saverng(FILE *file, GSM_Ringtone *ringtone);
181void saveimelody(FILE *file, GSM_Ringtone *ringtone); 183void saveimelody(FILE *file, GSM_Ringtone *ringtone);
182GSM_Error savewav(FILE *file, GSM_Ringtone *ringtone); 184GSM_Error savewav(FILE *file, GSM_Ringtone *ringtone);
183GSM_Error saverttl(FILE *file, GSM_Ringtone *ringtone); 185GSM_Error saverttl(FILE *file, GSM_Ringtone *ringtone);
184 186
185 unsigned char GSM_EncodeNokiaRTTLRingtone(GSM_Ringtone ringtone, unsigned char *package, int *maxlength); 187 unsigned char GSM_EncodeNokiaRTTLRingtone(GSM_Ringtone ringtone, unsigned char *package, int *maxlength);
diff --git a/gammu/emb/common/service/sms/gsmmulti.c b/gammu/emb/common/service/sms/gsmmulti.c
index 6c1cdcd..bdb5ee9 100644
--- a/gammu/emb/common/service/sms/gsmmulti.c
+++ b/gammu/emb/common/service/sms/gsmmulti.c
@@ -442,96 +442,101 @@ GSM_Error GSM_EncodeMultiPartSMS(GSM_MultiPartSMSInfo *Info,
442 return GSM_EncodeEMSMultiPartSMS(Info,SMS,UDH_ConcatenatedMessages); 442 return GSM_EncodeEMSMultiPartSMS(Info,SMS,UDH_ConcatenatedMessages);
443 } 443 }
444 } 444 }
445 return GSM_EncodeEMSMultiPartSMS(Info,SMS,UDH_ConcatenatedMessages16bit); 445 return GSM_EncodeEMSMultiPartSMS(Info,SMS,UDH_ConcatenatedMessages16bit);
446 } 446 }
447 return error; 447 return error;
448 } 448 }
449 449
450 if (Info->EntriesNum != 1) return ERR_UNKNOWN; 450 if (Info->EntriesNum != 1) return ERR_UNKNOWN;
451 451
452 switch (Info->Entries[0].ID) { 452 switch (Info->Entries[0].ID) {
453 case SMS_AlcatelMonoBitmapLong: 453 case SMS_AlcatelMonoBitmapLong:
454 Buffer[0] = Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth; 454 Buffer[0] = Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth;
455 Buffer[1] = Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight; 455 Buffer[1] = Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight;
456 PHONE_EncodeBitmap(GSM_AlcatelBMMIPicture, Buffer+2, &Info->Entries[0].Bitmap->Bitmap[0]); 456 PHONE_EncodeBitmap(GSM_AlcatelBMMIPicture, Buffer+2, &Info->Entries[0].Bitmap->Bitmap[0]);
457 Length = PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight)+2; 457 Length = PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight)+2;
458 return GSM_EncodeAlcatelMultiPartSMS(SMS,Buffer,Length,Info->Entries[0].Bitmap->Bitmap[0].Text,ALCATELTDD_PICTURE); 458 return GSM_EncodeAlcatelMultiPartSMS(SMS,Buffer,Length,Info->Entries[0].Bitmap->Bitmap[0].Text,ALCATELTDD_PICTURE);
459 case SMS_AlcatelMonoAnimationLong: 459 case SMS_AlcatelMonoAnimationLong:
460 /* Number of sequence words */ 460 /* Number of sequence words */
461 Buffer[0] = (Info->Entries[0].Bitmap->Number+1) % 256; 461 Buffer[0] = (Info->Entries[0].Bitmap->Number+1) % 256;
462 Buffer[1] = (Info->Entries[0].Bitmap->Number+1) / 256; 462 Buffer[1] = (Info->Entries[0].Bitmap->Number+1) / 256;
463 /* Picture display time 1 second (1 = 100ms) */ 463 /* Picture display time 1 second (1 = 100ms) */
464 Buffer[2] = 10 % 256; 464 Buffer[2] = 10 % 256;
465 Buffer[3] = 10 / 256 + 0xF0; 465 Buffer[3] = 10 / 256 + 0xF0;
466 466
467 Length = 4; 467 Length = 4;
468 j = 0; 468 j = 0;
469 469
470 /* Offsets to bitmaps */ 470 /* Offsets to bitmaps */
471 for (i=0;i<Info->Entries[0].Bitmap->Number;i++) { 471 for (i=0;i<Info->Entries[0].Bitmap->Number;i++) {
472 Buffer[Length++] = (4+j+Info->Entries[0].Bitmap->Number*2) % 256; 472 Buffer[Length++] = (4+j+Info->Entries[0].Bitmap->Number*2) % 256;
473 Buffer[Length++] = (4+j+Info->Entries[0].Bitmap->Number*2) / 256; 473 Buffer[Length++] = (4+j+Info->Entries[0].Bitmap->Number*2) / 256;
474 j += PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight)+2; 474 j += PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight)+2;
475 } 475 }
476 476
477 /* Bitmaps */ 477 /* Bitmaps */
478 for (i=0;i<Info->Entries[0].Bitmap->Number;i++) { 478 for (i=0;i<Info->Entries[0].Bitmap->Number;i++) {
479 Buffer[Length++] = Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth; 479 Buffer[Length++] = Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth;
480 Buffer[Length++] = Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight; 480 Buffer[Length++] = Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight;
481 PHONE_EncodeBitmap(GSM_AlcatelBMMIPicture, Buffer+Length, &Info->Entries[0].Bitmap->Bitmap[i]); 481 PHONE_EncodeBitmap(GSM_AlcatelBMMIPicture, Buffer+Length, &Info->Entries[0].Bitmap->Bitmap[i]);
482 Length += PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight); 482 Length += PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight);
483 } 483 }
484 return GSM_EncodeAlcatelMultiPartSMS(SMS,Buffer,Length,Info->Entries[0].Bitmap->Bitmap[0].Text,ALCATELTDD_ANIMATION); 484 return GSM_EncodeAlcatelMultiPartSMS(SMS,Buffer,Length,Info->Entries[0].Bitmap->Bitmap[0].Text,ALCATELTDD_ANIMATION);
485 case SMS_MMSIndicatorLong: 485 case SMS_MMSIndicatorLong:
486 Class= 1; 486 Class= 1;
487 UDH= UDH_MMSIndicatorLong; 487 UDH= UDH_MMSIndicatorLong;
488 GSM_EncodeMMSIndicatorSMSText(Buffer,&Length,*Info->Entries[0].MMSIndicator); 488 GSM_EncodeMMSIndicatorSMSText(Buffer,&Length,*Info->Entries[0].MMSIndicator);
489 break; 489 break;
490 case SMS_WAPIndicatorLong:
491 Class= 1;
492 UDH= UDH_MMSIndicatorLong;
493 GSM_EncodeWAPIndicatorSMSText(Buffer,&Length,Info->Entries[0].MMSIndicator->Title,Info->Entries[0].MMSIndicator->Address);
494 break;
490 case SMS_NokiaRingtoneLong: 495 case SMS_NokiaRingtoneLong:
491 case SMS_NokiaRingtone: 496 case SMS_NokiaRingtone:
492 UDH= UDH_NokiaRingtone; 497 UDH= UDH_NokiaRingtone;
493 Class= 1; 498 Class= 1;
494 /* 7 = length of UDH_NokiaRingtone UDH header */ 499 /* 7 = length of UDH_NokiaRingtone UDH header */
495 Length = GSM_MAX_8BIT_SMS_LENGTH-7; 500 Length = GSM_MAX_8BIT_SMS_LENGTH-7;
496 Info->Entries[0].RingtoneNotes = GSM_EncodeNokiaRTTLRingtone(*Info->Entries[0].Ringtone,Buffer,&Length); 501 Info->Entries[0].RingtoneNotes = GSM_EncodeNokiaRTTLRingtone(*Info->Entries[0].Ringtone,Buffer,&Length);
497 if (Info->Entries[0].ID == SMS_NokiaRingtone) break; 502 if (Info->Entries[0].ID == SMS_NokiaRingtone) break;
498 if (Info->Entries[0].RingtoneNotes != Info->Entries[0].Ringtone->NoteTone.NrCommands) { 503 if (Info->Entries[0].RingtoneNotes != Info->Entries[0].Ringtone->NoteTone.NrCommands) {
499 UDH = UDH_NokiaRingtoneLong; 504 UDH = UDH_NokiaRingtoneLong;
500 Length = (GSM_MAX_8BIT_SMS_LENGTH-12)*3; 505 Length = (GSM_MAX_8BIT_SMS_LENGTH-12)*3;
501 Info->Entries[0].RingtoneNotes = GSM_EncodeNokiaRTTLRingtone(*Info->Entries[0].Ringtone,Buffer,&Length); 506 Info->Entries[0].RingtoneNotes = GSM_EncodeNokiaRTTLRingtone(*Info->Entries[0].Ringtone,Buffer,&Length);
502 } 507 }
503 break; 508 break;
504 case SMS_NokiaOperatorLogoLong: 509 case SMS_NokiaOperatorLogoLong:
505 if (Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth > 72 || Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight > 14) { 510 if (Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth > 72 || Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight > 14) {
506 UDH= UDH_NokiaOperatorLogoLong; 511 UDH= UDH_NokiaOperatorLogoLong;
507 Class = 1; 512 Class = 1;
508 NOKIA_EncodeNetworkCode(Buffer, Info->Entries[0].Bitmap->Bitmap[0].NetworkCode); 513 NOKIA_EncodeNetworkCode(Buffer, Info->Entries[0].Bitmap->Bitmap[0].NetworkCode);
509 Length = Length + 3; 514 Length = Length + 3;
510 NOKIA_CopyBitmap(GSM_Nokia7110OperatorLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length); 515 NOKIA_CopyBitmap(GSM_Nokia7110OperatorLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length);
511 break; 516 break;
512 } 517 }
513 case SMS_NokiaOperatorLogo: 518 case SMS_NokiaOperatorLogo:
514 UDH= UDH_NokiaOperatorLogo; 519 UDH= UDH_NokiaOperatorLogo;
515 Class = 1; 520 Class = 1;
516 NOKIA_EncodeNetworkCode(Buffer, Info->Entries[0].Bitmap->Bitmap[0].NetworkCode); 521 NOKIA_EncodeNetworkCode(Buffer, Info->Entries[0].Bitmap->Bitmap[0].NetworkCode);
517 Length = Length + 3; 522 Length = Length + 3;
518 NOKIA_CopyBitmap(GSM_NokiaOperatorLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length); 523 NOKIA_CopyBitmap(GSM_NokiaOperatorLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length);
519 break; 524 break;
520 case SMS_NokiaCallerLogo: 525 case SMS_NokiaCallerLogo:
521 UDH= UDH_NokiaCallerLogo; 526 UDH= UDH_NokiaCallerLogo;
522 Class = 1; 527 Class = 1;
523 NOKIA_CopyBitmap(GSM_NokiaCallerLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length); 528 NOKIA_CopyBitmap(GSM_NokiaCallerLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length);
524 break; 529 break;
525 case SMS_NokiaProfileLong: 530 case SMS_NokiaProfileLong:
526 case SMS_NokiaPictureImageLong: 531 case SMS_NokiaPictureImageLong:
527 case SMS_NokiaScreenSaverLong: 532 case SMS_NokiaScreenSaverLong:
528 Class = 1; 533 Class = 1;
529 UDH= UDH_NokiaProfileLong; 534 UDH= UDH_NokiaProfileLong;
530 GSM_EncodeSMS30MultiPartSMS(Info,Buffer,&Length); 535 GSM_EncodeSMS30MultiPartSMS(Info,Buffer,&Length);
531 break; 536 break;
532 case SMS_NokiaWAPBookmarkLong: 537 case SMS_NokiaWAPBookmarkLong:
533 Class= 1; 538 Class= 1;
534 NOKIA_EncodeWAPBookmarkSMSText(Buffer,&Length,Info->Entries[0].Bookmark); 539 NOKIA_EncodeWAPBookmarkSMSText(Buffer,&Length,Info->Entries[0].Bookmark);
535 /* 7 = length of UDH_NokiaWAP UDH header */ 540 /* 7 = length of UDH_NokiaWAP UDH header */
536 if (Length>(GSM_MAX_8BIT_SMS_LENGTH-7)) { 541 if (Length>(GSM_MAX_8BIT_SMS_LENGTH-7)) {
537 UDH=UDH_NokiaWAPLong; 542 UDH=UDH_NokiaWAPLong;
diff --git a/gammu/emb/common/service/sms/gsmmulti.h b/gammu/emb/common/service/sms/gsmmulti.h
index c672261..3f70d81 100644
--- a/gammu/emb/common/service/sms/gsmmulti.h
+++ b/gammu/emb/common/service/sms/gsmmulti.h
@@ -1,53 +1,57 @@
1/* (c) 2002-2004 by Marcin Wiacek */ 1/* (c) 2002-2004 by Marcin Wiacek */
2 2
3#ifndef __gsm_multi_h 3#ifndef __gsm_multi_h
4#define __gsm_multi_h 4#define __gsm_multi_h
5 5
6#if defined(_MSC_VER) && defined(__cplusplus)
7 extern "C" {
8#endif
9
6#include "../../gsmcomon.h" 10#include "../../gsmcomon.h"
7#include "../gsmlogo.h" 11#include "../gsmlogo.h"
8#include "../gsmcal.h" 12#include "../gsmcal.h"
9#include "../gsmpbk.h" 13#include "../gsmpbk.h"
10#include "../gsmdata.h" 14#include "../gsmdata.h"
11#include "../gsmring.h" 15#include "../gsmring.h"
12#include "gsmsms.h" 16#include "gsmsms.h"
13 17
14/* ---------------------- multi SMS --------------------------------------- */ 18/* ---------------------- multi SMS --------------------------------------- */
15 19
16/* Identifiers for Smart Messaging 3.0 multipart SMS */ 20/* Identifiers for Smart Messaging 3.0 multipart SMS */
17 21
18#define SM30_ISOTEXT 0 /* ISO 8859-1 text */ 22#define SM30_ISOTEXT 0 /* ISO 8859-1 text */
19#define SM30_UNICODETEXT 1 23#define SM30_UNICODETEXT 1
20 #define SM30_OTA 2 24 #define SM30_OTA 2
21#define SM30_RINGTONE 3 25#define SM30_RINGTONE 3
22#define SM30_PROFILENAME 4 26#define SM30_PROFILENAME 4
23/* ... */ 27/* ... */
24#define SM30_SCREENSAVER 6 28#define SM30_SCREENSAVER 6
25 29
26/* Identifiers for Alcatel Terminal Data Download */ 30/* Identifiers for Alcatel Terminal Data Download */
27#define ALCATELTDD_PICTURE 4 31#define ALCATELTDD_PICTURE 4
28#define ALCATELTDD_ANIMATION 5 32#define ALCATELTDD_ANIMATION 5
29#define ALCATELTDD_SMSTEMPLATE 6 33#define ALCATELTDD_SMSTEMPLATE 6
30 34
31 void GSM_SMSCounter(int MessageLength, 35 void GSM_SMSCounter(int MessageLength,
32 unsigned char *MessageBuffer, 36 unsigned char *MessageBuffer,
33 GSM_UDH UDHType, 37 GSM_UDH UDHType,
34 GSM_Coding_Type Coding, 38 GSM_Coding_Type Coding,
35 int *SMSNum, 39 int *SMSNum,
36 int *CharsLeft); 40 int *CharsLeft);
37 41
38#define MAX_MULTI_SMS 10 42#define MAX_MULTI_SMS 10
39 43
40/** 44/**
41 * Multiple SMS messages, used for Smart Messaging 3.0/EMS. 45 * Multiple SMS messages, used for Smart Messaging 3.0/EMS.
42 */ 46 */
43typedef struct { 47typedef struct {
44 /** 48 /**
45 * Sender or recipient number. 49 * Sender or recipient number.
46 */ 50 */
47 unsigned char Number; 51 unsigned char Number;
48 /** 52 /**
49 * Array of SMSes. 53 * Array of SMSes.
50 */ 54 */
51 GSM_SMSMessage SMS[MAX_MULTI_SMS]; 55 GSM_SMSMessage SMS[MAX_MULTI_SMS];
52} GSM_MultiSMSMessage; 56} GSM_MultiSMSMessage;
53 57
@@ -127,145 +131,150 @@ typedef enum {
127 */ 131 */
128 SMS_NokiaWAPBookmarkLong, 132 SMS_NokiaWAPBookmarkLong,
129 /** 133 /**
130 * Nokia WAP settings in 2 SMS 134 * Nokia WAP settings in 2 SMS
131 */ 135 */
132 SMS_NokiaWAPSettingsLong, 136 SMS_NokiaWAPSettingsLong,
133 /** 137 /**
134 * Nokia MMS settings in 2 SMS 138 * Nokia MMS settings in 2 SMS
135 */ 139 */
136 SMS_NokiaMMSSettingsLong, 140 SMS_NokiaMMSSettingsLong,
137 /** 141 /**
138 * Nokia VCARD 1.0 - only name and default number 142 * Nokia VCARD 1.0 - only name and default number
139 */ 143 */
140 SMS_NokiaVCARD10Long, 144 SMS_NokiaVCARD10Long,
141 /** 145 /**
142 * Nokia VCARD 2.1 - all numbers + text 146 * Nokia VCARD 2.1 - all numbers + text
143 */ 147 */
144 SMS_NokiaVCARD21Long, 148 SMS_NokiaVCARD21Long,
145 /** 149 /**
146 * Nokia VCALENDAR 1.0 - can be in few sms 150 * Nokia VCALENDAR 1.0 - can be in few sms
147 */ 151 */
148 SMS_NokiaVCALENDAR10Long, 152 SMS_NokiaVCALENDAR10Long,
149 SMS_NokiaVTODOLong, 153 SMS_NokiaVTODOLong,
150 SMS_VCARD10Long, 154 SMS_VCARD10Long,
151 SMS_VCARD21Long, 155 SMS_VCARD21Long,
152 SMS_DisableVoice, 156 SMS_DisableVoice,
153 SMS_DisableFax, 157 SMS_DisableFax,
154 SMS_DisableEmail, 158 SMS_DisableEmail,
155 SMS_EnableVoice, 159 SMS_EnableVoice,
156 SMS_EnableFax, 160 SMS_EnableFax,
157 SMS_EnableEmail, 161 SMS_EnableEmail,
158 SMS_VoidSMS, 162 SMS_VoidSMS,
159 /** 163 /**
160 * IMelody 1.0 164 * IMelody 1.0
161 */ 165 */
162 SMS_EMSSound10, 166 SMS_EMSSound10,
163 /** 167 /**
164 * IMelody 1.2 168 * IMelody 1.2
165 */ 169 */
166 SMS_EMSSound12, 170 SMS_EMSSound12,
167 /** 171 /**
168 * IMelody without header - SonyEricsson extension 172 * IMelody without header - SonyEricsson extension
169 */ 173 */
170 SMS_EMSSonyEricssonSound, 174 SMS_EMSSonyEricssonSound,
171 /** 175 /**
172 * IMelody 1.0 with UPI. 176 * IMelody 1.0 with UPI.
173 */ 177 */
174 SMS_EMSSound10Long, 178 SMS_EMSSound10Long,
175 /*** 179 /**
176 * IMelody 1.2 with UPI. 180 * IMelody 1.2 with UPI.
177 */ 181 */
178 SMS_EMSSound12Long, 182 SMS_EMSSound12Long,
179 /** 183 /**
180 * IMelody without header with UPI. 184 * IMelody without header with UPI.
181 */ 185 */
182 SMS_EMSSonyEricssonSoundLong, 186 SMS_EMSSonyEricssonSoundLong,
183 SMS_EMSPredefinedSound, 187 SMS_EMSPredefinedSound,
184 SMS_EMSPredefinedAnimation, 188 SMS_EMSPredefinedAnimation,
185 SMS_EMSAnimation, 189 SMS_EMSAnimation,
186 /** 190 /**
187 * Fixed bitmap of size 16x16 or 32x32. 191 * Fixed bitmap of size 16x16 or 32x32.
188 */ 192 */
189 SMS_EMSFixedBitmap, 193 SMS_EMSFixedBitmap,
190 SMS_EMSVariableBitmap, 194 SMS_EMSVariableBitmap,
191 SMS_EMSVariableBitmapLong, 195 SMS_EMSVariableBitmapLong,
192 SMS_MMSIndicatorLong, 196 SMS_MMSIndicatorLong,
197 SMS_WAPIndicatorLong,
193 /** 198 /**
194 * Variable bitmap with black and white colors 199 * Variable bitmap with black and white colors
195 */ 200 */
196 SMS_AlcatelMonoBitmapLong, 201 SMS_AlcatelMonoBitmapLong,
197 /** 202 /**
198 * Variable animation with black and white colors 203 * Variable animation with black and white colors
199 */ 204 */
200 SMS_AlcatelMonoAnimationLong, 205 SMS_AlcatelMonoAnimationLong,
201 SMS_AlcatelSMSTemplateName 206 SMS_AlcatelSMSTemplateName
202} EncodeMultiPartSMSID; 207} EncodeMultiPartSMSID;
203 208
204typedef struct { 209typedef struct {
205 EncodeMultiPartSMSID ID; 210 EncodeMultiPartSMSID ID;
206 211
207 int Number; 212 int Number;
208 GSM_Ringtone *Ringtone; 213 GSM_Ringtone *Ringtone;
209 GSM_MultiBitmap *Bitmap; 214 GSM_MultiBitmap *Bitmap;
210 GSM_WAPBookmark *Bookmark; 215 GSM_WAPBookmark *Bookmark;
211 GSM_WAPSettings *Settings; 216 GSM_WAPSettings *Settings;
212 GSM_MMSIndicator*MMSIndicator; 217 GSM_MMSIndicator*MMSIndicator;
213 GSM_MemoryEntry *Phonebook; 218 GSM_MemoryEntry *Phonebook;
214 GSM_CalendarEntry *Calendar; 219 GSM_CalendarEntry *Calendar;
215 GSM_ToDoEntry *ToDo; 220 GSM_ToDoEntry *ToDo;
216 bool Protected; 221 bool Protected;
217 222
218 unsigned char *Buffer; 223 unsigned char *Buffer;
219 bool Left; 224 bool Left;
220 bool Right; 225 bool Right;
221 bool Center; 226 bool Center;
222 bool Large; 227 bool Large;
223 bool Small; 228 bool Small;
224 bool Bold; 229 bool Bold;
225 bool Italic; 230 bool Italic;
226 bool Underlined; 231 bool Underlined;
227 bool Strikethrough; 232 bool Strikethrough;
228 233
229 /* Return values */ 234 /* Return values */
230 int RingtoneNotes; 235 int RingtoneNotes;
231} MultiPartSMSEntry; 236} MultiPartSMSEntry;
232 237
233typedef struct { 238typedef struct {
234 MultiPartSMSEntryEntries[MAX_MULTI_SMS]; 239 MultiPartSMSEntryEntries[MAX_MULTI_SMS];
235 int EntriesNum; 240 int EntriesNum;
236 bool UnicodeCoding; 241 bool UnicodeCoding;
237 int Class; 242 int Class;
238 unsigned char ReplaceMessage; 243 unsigned char ReplaceMessage;
239 bool Unknown; 244 bool Unknown;
240} GSM_MultiPartSMSInfo; 245} GSM_MultiPartSMSInfo;
241 246
242/** 247/**
243 * Encodes multi part SMS from "readable" format. 248 * Encodes multi part SMS from "readable" format.
244 */ 249 */
245GSM_Error GSM_EncodeMultiPartSMS (GSM_MultiPartSMSInfo *Info, GSM_MultiSMSMessage *SMS); 250GSM_Error GSM_EncodeMultiPartSMS (GSM_MultiPartSMSInfo *Info, GSM_MultiSMSMessage *SMS);
246 251
247/** 252/**
248 * Decodes multi part SMS to "readable" format. 253 * Decodes multi part SMS to "readable" format.
249 */ 254 */
250bool GSM_DecodeMultiPartSMS (GSM_MultiPartSMSInfo *Info, GSM_MultiSMSMessage *SMS, bool ems); 255bool GSM_DecodeMultiPartSMS (GSM_MultiPartSMSInfo *Info, GSM_MultiSMSMessage *SMS, bool ems);
251 256
252/** 257/**
253 * Clears @ref GSM_MultiPartSMSInfo to default values. 258 * Clears @ref GSM_MultiPartSMSInfo to default values.
254 */ 259 */
255void GSM_ClearMultiPartSMSInfo (GSM_MultiPartSMSInfo *Info); 260void GSM_ClearMultiPartSMSInfo (GSM_MultiPartSMSInfo *Info);
256 261
257/** 262/**
258 * Frees any allocated structures inside @ref GSM_MultiPartSMSInfo. 263 * Frees any allocated structures inside @ref GSM_MultiPartSMSInfo.
259 */ 264 */
260void GSM_FreeMultiPartSMSInfo (GSM_MultiPartSMSInfo *Info); 265void GSM_FreeMultiPartSMSInfo (GSM_MultiPartSMSInfo *Info);
261 266
262/** 267/**
263 * Links SMS messages according to IDs. 268 * Links SMS messages according to IDs.
264 */ 269 */
265GSM_Error GSM_LinkSMS(GSM_MultiSMSMessage **INPUT, GSM_MultiSMSMessage **OUTPUT, bool ems); 270GSM_Error GSM_LinkSMS(GSM_MultiSMSMessage **INPUT, GSM_MultiSMSMessage **OUTPUT, bool ems);
266 271
272#if defined(_MSC_VER) && defined(__cplusplus)
273 }
274#endif
275
267#endif 276#endif
268 277
269/* How should editor hadle tabs in this file? Add editor commands here. 278/* How should editor hadle tabs in this file? Add editor commands here.
270 * vim: noexpandtab sw=8 ts=8 sts=8: 279 * vim: noexpandtab sw=8 ts=8 sts=8:
271 */ 280 */
diff --git a/gammu/emb/common/service/sms/gsmsms.c b/gammu/emb/common/service/sms/gsmsms.c
index 9920835..feceba4 100644
--- a/gammu/emb/common/service/sms/gsmsms.c
+++ b/gammu/emb/common/service/sms/gsmsms.c
@@ -1,50 +1,53 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2/* based on some work from Pawel Kot, others and Gnokii */ 2/* Based on some Pawel Kot and others work from Gnokii (www.gnokii.org)
3 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
4 * GNU GPL version 2 or later
5 */
3 6
4#include <ctype.h> 7#include <ctype.h>
5#include <string.h> 8#include <string.h>
6#include <time.h> 9#include <time.h>
7 10
8#include "../../gsmcomon.h" 11#include "../../gsmcomon.h"
9#include "../../misc/coding/coding.h" 12#include "../../misc/coding/coding.h"
10#include "../gsmcal.h" 13#include "../gsmcal.h"
11#include "../gsmpbk.h" 14#include "../gsmpbk.h"
12#include "../gsmlogo.h" 15#include "../gsmlogo.h"
13#include "../gsmring.h" 16#include "../gsmring.h"
14#include "../gsmdata.h" 17#include "../gsmdata.h"
15#include "../gsmnet.h" 18#include "../gsmnet.h"
16#include "gsmsms.h" 19#include "gsmsms.h"
17 20
18/* User data headers */ 21/* User data headers */
19static GSM_UDHHeader UDHHeaders[] = { 22static GSM_UDHHeader UDHHeaders[] = {
20 /* See GSM 03.40 section 9.2.3.24.1 23 /* See GSM 03.40 section 9.2.3.24.1
21 * 1 byte 0x00 24 * 1 byte 0x00
22 * 1 byte 0x03 25 * 1 byte 0x03
23 * 1 byte 0x01: unique ID for message series 26 * 1 byte 0x01: unique ID for message series
24 * 1 byte 0x00: how many SMS in sequence 27 * 1 byte 0x00: how many SMS in sequence
25 * 1 byte 0x00: number of current SMS in sequence */ 28 * 1 byte 0x00: number of current SMS in sequence */
26 { UDH_ConcatenatedMessages, 0x05, "\x00\x03\x01\x00\x00",2,-1,4,3}, 29 { UDH_ConcatenatedMessages, 0x05, "\x00\x03\x01\x00\x00",2,-1,4,3},
27 30
28 /* See GSM 03.40 section 9.2.3.24.2 for voice, fax and email messages */ 31 /* See GSM 03.40 section 9.2.3.24.2 for voice, fax and email messages */
29 { UDH_DisableVoice, 0x04, "\x01\x02\x00\x00",-1,-1,-1,-1}, 32 { UDH_DisableVoice, 0x04, "\x01\x02\x00\x00",-1,-1,-1,-1},
30 { UDH_DisableFax, 0x04, "\x01\x02\x01\x00",-1,-1,-1,-1}, 33 { UDH_DisableFax, 0x04, "\x01\x02\x01\x00",-1,-1,-1,-1},
31 { UDH_DisableEmail, 0x04, "\x01\x02\x02\x00",-1,-1,-1,-1}, 34 { UDH_DisableEmail, 0x04, "\x01\x02\x02\x00",-1,-1,-1,-1},
32 { UDH_EnableVoice, 0x04, "\x01\x02\x00\x01",-1,-1,-1,-1}, 35 { UDH_EnableVoice, 0x04, "\x01\x02\x00\x01",-1,-1,-1,-1},
33 { UDH_EnableFax, 0x04, "\x01\x02\x01\x01",-1,-1,-1,-1}, 36 { UDH_EnableFax, 0x04, "\x01\x02\x01\x01",-1,-1,-1,-1},
34 { UDH_EnableEmail, 0x04, "\x01\x02\x02\x01",-1,-1,-1,-1}, 37 { UDH_EnableEmail, 0x04, "\x01\x02\x02\x01",-1,-1,-1,-1},
35 38
36 /* When send such SMS to some phones, they don't display anything, 39 /* When send such SMS to some phones, they don't display anything,
37 * only beep and enable vibra/light 40 * only beep and enable vibra/light
38 */ 41 */
39 { UDH_VoidSMS, 0x08, "\x01\x02\x02\x01\x01\x02\x02\x00",-1,-1,-1,-1}, 42 { UDH_VoidSMS, 0x08, "\x01\x02\x02\x01\x01\x02\x02\x00",-1,-1,-1,-1},
40 43
41 /* Nokia Smart Messaging (short version) UDH 44 /* Nokia Smart Messaging (short version) UDH
42 * General format : 45 * General format :
43 * 1 byte 0x05 : IEI application port addressing scheme, 16 bit address 46 * 1 byte 0x05 : IEI application port addressing scheme, 16 bit address
44 * 1 byte 0x04 : IEI length 47 * 1 byte 0x04 : IEI length
45 * 2 bytes : destination address : high & low byte 48 * 2 bytes : destination address : high & low byte
46 * 2 bytes 0x00 0x00 : originator address : high & low byte */ 49 * 2 bytes 0x00 0x00 : originator address : high & low byte */
47 { UDH_NokiaRingtone, 0x06, "\x05\x04\x15\x81\x00\x00",-1,-1,-1,-1}, 50 { UDH_NokiaRingtone, 0x06, "\x05\x04\x15\x81\x00\x00",-1,-1,-1,-1},
48 { UDH_NokiaOperatorLogo, 0x06, "\x05\x04\x15\x82\x00\x00",-1,-1,-1,-1}, 51 { UDH_NokiaOperatorLogo, 0x06, "\x05\x04\x15\x82\x00\x00",-1,-1,-1,-1},
49 { UDH_NokiaCallerLogo, 0x06, "\x05\x04\x15\x83\x00\x00",-1,-1,-1,-1}, 52 { UDH_NokiaCallerLogo, 0x06, "\x05\x04\x15\x83\x00\x00",-1,-1,-1,-1},
50 { UDH_NokiaWAP, 0x06, "\x05\x04\xc3\x4f\x00\x00",-1,-1,-1,-1}, 53 { UDH_NokiaWAP, 0x06, "\x05\x04\xc3\x4f\x00\x00",-1,-1,-1,-1},
diff --git a/gammu/emb/common/service/sms/gsmsms.h b/gammu/emb/common/service/sms/gsmsms.h
index d87ff60..0b950d3 100644
--- a/gammu/emb/common/service/sms/gsmsms.h
+++ b/gammu/emb/common/service/sms/gsmsms.h
@@ -1,50 +1,53 @@
1/* (c) 2001-2004 by Marcin Wiacek */ 1/* (c) 2001-2004 by Marcin Wiacek */
2/* based on some work from Pawel Kot, others and Gnokii */ 2/* Based on some Pawel Kot and others work from Gnokii (www.gnokii.org)
3 * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
4 * GNU GPL version 2 or later
5 */
3 6
4#ifndef __gsm_sms_h 7#ifndef __gsm_sms_h
5#define __gsm_sms_h 8#define __gsm_sms_h
6 9
7#include "../../gsmcomon.h" 10#include "../../gsmcomon.h"
8#include "../gsmlogo.h" 11#include "../gsmlogo.h"
9#include "../gsmcal.h" 12#include "../gsmcal.h"
10#include "../gsmpbk.h" 13#include "../gsmpbk.h"
11#include "../gsmdata.h" 14#include "../gsmdata.h"
12#include "../gsmring.h" 15#include "../gsmring.h"
13 16
14/* --------------------- Some general definitions ------------------------- */ 17/* --------------------- Some general definitions ------------------------- */
15 18
16 #define GSM_MAX_UDH_LENGTH 140 19 #define GSM_MAX_UDH_LENGTH 140
17 #define GSM_MAX_SMS_LENGTH 160 20 #define GSM_MAX_SMS_LENGTH 160
18 #define GSM_MAX_8BIT_SMS_LENGTH 140 21 #define GSM_MAX_8BIT_SMS_LENGTH 140
19 22
20/* -------------------- Cell Broadcast ------------------------------------ */ 23/* -------------------- Cell Broadcast ------------------------------------ */
21 24
22/** 25/**
23 * Structure for Cell Broadcast messages. 26 * Structure for Cell Broadcast messages.
24 */ 27 */
25typedef struct { 28typedef struct {
26 /** 29 /**
27 * Message text. 30 * Message text.
28 */ 31 */
29 char Text[300]; 32 char Text[300];
30 /** 33 /**
31 * Channel number. 34 * Channel number.
32 */ 35 */
33 int Channel; 36 int Channel;
34} GSM_CBMessage; 37} GSM_CBMessage;
35 38
36/* ------------------------ SMS status ------------------------------------ */ 39/* ------------------------ SMS status ------------------------------------ */
37 40
38/** 41/**
39 * Status of SMS memory. 42 * Status of SMS memory.
40 */ 43 */
41typedef struct { 44typedef struct {
42 /** 45 /**
43 * Number of unread messages on SIM. 46 * Number of unread messages on SIM.
44 */ 47 */
45 int SIMUnRead; 48 int SIMUnRead;
46 /** 49 /**
47 * Number of all saved messages (including unread) on SIM. 50 * Number of all saved messages (including unread) on SIM.
48 */ 51 */
49 int SIMUsed; 52 int SIMUsed;
50 /** 53 /**