5 A Linux/Unix toolset and driver for Nokia mobile phones.
7 Released under the terms of the GNU GPL, see file COPYING for more details.
9 Mainline code for gnokii utility. Handles command line parsing and
10 reading/writing phonebook entries and other stuff.
27 /* <getopt.h> or "getopt.h" would include insufficient getopt.h from uClinux */
28 #include "../getopt/getopt.h"
32 #if defined(__svr4__) || defined(__FreeBSD__)
33 # include <strings.h> /* for bzero */
36 /* for VC6 make scripts save VERSION constant in mversion.h file */
44 #include "misc_win32.h"
47 #define DEV_CONSOLE "CON:"
54 #include <sys/types.h>
58 #define DEV_CONSOLE "/dev/tty"
62 #include "gsm-common.h"
64 #include "gsm-networks.h"
66 #include "gsm-ringtones.h"
67 #include "gsm-bitmaps.h"
70 #include "gsm-datetime.h"
72 #include "gsm-phonebook.h"
74 #include "gsm-calendar.h"
76 #include "gsm-coding.h"
78 #include "newmodules/n6110.h"
80 #include "files/cfgreader.h"
82 #include "files/gsm-filetypes.h"
86 #include "data/virtmodem.h"
93 static char *model; /* Model from .gnokiirc file. */
94 static char *Port; /* Port from .gnokiirc file */
95 static char *Initlength; /* Init length from .gnokiirc file */
96 static char *Connection; /* Connection type from .gnokiirc file */
98 char *SynchronizeTime; /* If we set date and time from computer to phone (from .gnokiirc file) */
100 static char *BinDir; /* Binaries directory from .gnokiirc file - not used here yet */
103 static GSM_SMSMessage SMS[4];
108 char *GetProfileCallAlertString(int code) {
111 case PROFILE_CALLALERT_RINGING : return "Ringing";
112 case PROFILE_CALLALERT_ASCENDING : return "Ascending";
113 case PROFILE_CALLALERT_RINGONCE : return "Ring once";
114 case PROFILE_CALLALERT_BEEPONCE : return "Beep once";
115 case PROFILE_CALLALERT_CALLERGROUPS: return "Caller groups";
116 case PROFILE_CALLALERT_OFF : return "Off";
117 default : return "Unknown";
121 char *GetProfileVolumeString(int code) {
124 case PROFILE_VOLUME_LEVEL1 : return "Level 1";
125 case PROFILE_VOLUME_LEVEL2 : return "Level 2";
126 case PROFILE_VOLUME_LEVEL3 : return "Level 3";
127 case PROFILE_VOLUME_LEVEL4 : return "Level 4";
128 case PROFILE_VOLUME_LEVEL5 : return "Level 5";
129 default : return "Unknown";
133 char *GetProfileKeypadToneString(int code) {
136 case PROFILE_KEYPAD_OFF : return "Off";
137 case PROFILE_KEYPAD_LEVEL1 : return "Level 1";
138 case PROFILE_KEYPAD_LEVEL2 : return "Level 2";
139 case PROFILE_KEYPAD_LEVEL3 : return "Level 3";
140 default : return "Unknown";
144 char *GetProfileMessageToneString(int code) {
147 case PROFILE_MESSAGE_NOTONE : return "No tone";
148 case PROFILE_MESSAGE_STANDARD : return "Standard";
149 case PROFILE_MESSAGE_SPECIAL : return "Special";
150 case PROFILE_MESSAGE_BEEPONCE : return "Beep once";
151 case PROFILE_MESSAGE_ASCENDING : return "Ascending";
152 default : return "Unknown";
156 char *GetProfileWarningToneString(int code) {
159 case PROFILE_WARNING_OFF : return "Off";
160 case PROFILE_WARNING_ON : return "On";
161 default : return "Unknown";
165 char *GetProfileOnOffString(int code) {
168 case 0x00 : return "Off";
169 case 0x01 : return "On";
170 default : return "Unknown";
174 static char *GetProfileVibrationString(int code)
177 case PROFILE_VIBRATION_OFF: return "Off";
178 case PROFILE_VIBRATION_ON: return "On";
179 case PROFILE_VIBRATION_FIRST: return "Vibrate first";
180 default: return "Unknown";
184 char BufferProfileGroups[90];
186 char *GetProfileCallerGroups(int code)
188 static char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
189 static bool enteronce=false;
193 if( code == PROFILE_CALLERGROUPS_ALL )
194 return _("All calls alert");
197 for(i=0;i<5;i++) az_group_name[i][0]='\0';
201 BufferProfileGroups[0]=0;
208 code2test=(i==0) ? 1 : 2<<(i-1);
210 if( code & code2test )
212 if (!strcmp(az_group_name[i],""))
214 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
215 bitmap.type=GSM_CallerLogo;
217 strcpy(z_gtype,_("unknown"));
218 if (GSM->GetBitmap(&bitmap)==GE_NONE)
219 strcpy( az_group_name[i], bitmap.text );
221 if ((!strcmp(az_group_name[i],""))) {
223 case 0:strcpy(az_group_name[i],_("Family"));break;
224 case 1:strcpy(az_group_name[i],_("VIP"));break;
225 case 2:strcpy(az_group_name[i],_("Friends"));break;
226 case 3:strcpy(az_group_name[i],_("Colleagues"));break;
227 case 4:strcpy(az_group_name[i],_("Other"));break;
232 strcpy(z_gtype,az_group_name[i]);
234 if( strlen(BufferProfileGroups) ) strcat(BufferProfileGroups,"+");
235 strcat(BufferProfileGroups, z_gtype);
240 return BufferProfileGroups;
243 static char *print_error(GSM_Error e)
246 // case GE_DEVICEOPENFAILED: return "Couldn't open specified serial device.";
247 // case GE_UNKNOWNMODEL: return "Model specified isn't known/supported.";
248 // case GE_NOLINK: return "Couldn't establish link with phone.";
249 // case GE_TRYAGAIN: return "Try again.";
250 // case GE_INVALIDSMSLOCATION: return "Invalid SMS location.";
251 // case GE_INVALIDPHBOOKLOCATION: return "Invalid phonebook location.";
252 // case GE_INVALIDMEMORYTYPE: return "Invalid type of memory.";
253 // case GE_INVALIDSPEEDDIALLOCATION: return "Invalid speed dial location.";
254 // case GE_INVALIDCALNOTELOCATION: return "Invalid calendar note location.";
255 // case GE_INVALIDDATETIME: return "Invalid date, time or alarm specification.";
256 // case GE_EMPTYSMSLOCATION: return "SMS location is empty.";
257 // case GE_PHBOOKNAMETOOLONG: return "Phonebook name is too long.";
258 // case GE_PHBOOKNUMBERTOOLONG: return "Phonebook number is too long.";
259 // case GE_PHBOOKWRITEFAILED: return "Phonebook write failed.";
260 // case GE_SMSSENDOK: return "SMS was send correctly.";
261 // case GE_SMSSENDFAILED: return "SMS send fail.";
262 // case GE_SMSTOOLONG: return "SMS message too long.";
263 // case GE_NONEWCBRECEIVED: return "Attempt to read CB when no new CB received";
264 // case GE_INTERNALERROR: return "Problem occured internal to model specific code.";
265 // case GE_NOTSUPPORTED: return "Function not supported by the phone";
266 // case GE_BUSY: return "Command is still being executed.";
267 // case GE_USERCANCELED: return "User has cancelled the action.";
268 // case GE_UNKNOWN: return "Unknown error - well better than nothing!!";
269 // case GE_MEMORYFULL: return "Memory is full";
270 // case GE_LINEBUSY: return "Outgoing call requested reported line busy";
271 // case GE_NOCARRIER: return "No Carrier error during data call setup ?";
274 case GE_NONE: return "No error, done OK";
275 case GE_INVALIDSECURITYCODE: return "Invalid Security code.";
276 case GE_NOTIMPLEMENTED: return "Called command is not implemented for the used model. Please contact marcin-wiacek@topnet.pl, if you want to help in implementing it";
277 case GE_TIMEOUT: return "Command timed out.";
278 case GE_CANTOPENFILE: return "Can't open file with bitmap/ringtone";
279 case GE_SUBFORMATNOTSUPPORTED: return "Subformat of file not supported";
280 case GE_WRONGNUMBEROFCOLORS: return "Wrong number of colors in specified bitmap file (only 2 colors files supported)";
281 case GE_WRONGCOLORS: return "Wrong colors in bitmap file";
282 case GE_INVALIDIMAGESIZE: return "Invalid size of bitmap (in file, sms etc.)";
283 case GE_INVALIDFILEFORMAT: return "Invalid format of file";
284 case GE_TOOSHORT: return "File too short";
285 case GE_INSIDEBOOKMARKSMENU: return "Inside WAP Bookmarks menu. Please leave it and try again";
286 case GE_INVALIDBOOKMARKLOCATION: return "Invalid or empty WAP bookmark location";
287 case GE_INSIDESETTINGSMENU: return "Inside WAP Settings menu. Please leave it and try again";
288 case GE_INVALIDSETTINGSLOCATION: return "Invalid or empty WAP settings location";
289 case GE_EMPTYSMSC: return "Empty SMSC number. Use --smsc";
290 default: return "Unknown error.";
294 GSM_Error GSM_ReadRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
298 error=GSM_ReadRingtoneFile(FileName, ringtone);
301 case GE_CANTOPENFILE:
302 case GE_SUBFORMATNOTSUPPORTED:
303 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
312 GSM_Error GSM_SaveRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
314 int confirm,confirm2;
319 /* Ask before overwriting */
320 while (stat(FileName, &buf) == 0) {
325 while (confirm < 0) {
326 fprintf(stderr, _("Saving ringtone. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
327 GetLine(stdin, ans, 4);
328 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
329 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
330 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
332 if (confirm==1) break;
334 while (confirm2 < 0) {
335 fprintf(stderr, _("Enter name of new file: "));
336 GetLine(stdin, FileName, 50);
337 if (&FileName[0]==0) return GE_USERCANCELED;
343 error=GSM_SaveRingtoneFile(FileName,ringtone);
346 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
354 GSM_Error GSM_ReadBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
358 error=GSM_ReadBitmapFile(FileName, bitmap);
361 case GE_CANTOPENFILE:
362 case GE_WRONGNUMBEROFCOLORS:
364 case GE_INVALIDFILEFORMAT:
365 case GE_SUBFORMATNOTSUPPORTED:
367 case GE_INVALIDIMAGESIZE:
368 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
377 GSM_Error GSM_SaveBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
379 int confirm,confirm2;
384 /* Ask before overwriting */
385 while (stat(FileName, &buf) == 0) {
390 while (confirm < 0) {
391 fprintf(stderr, _("Saving logo. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
392 GetLine(stdin, ans, 4);
393 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
394 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
395 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
397 if (confirm==1) break;
399 while (confirm2 < 0) {
400 fprintf(stderr, _("Enter name of new file: "));
401 GetLine(stdin, FileName, 50);
402 if (&FileName[0]==0) return GE_USERCANCELED;
408 error=GSM_SaveBitmapFile(FileName,bitmap);
411 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
419 /* mode == 0 -> overwrite
421 * mode == 2 -> append
423 int GSM_SaveTextFileOnConsole(char *FileName, char *text, int mode)
425 int confirm, confirm2;
430 /* Ask before overwriting */
432 while (stat(FileName, &buf) == 0 && mode==1) {
437 while (confirm < 0) {
438 fprintf(stderr, _("File \"%s\" exists. (O)verwrite, (a)ppend, create (n)ew or (s)kip ? "),FileName);
439 GetLine(stdin, ans, 4);
440 if (!strcmp(ans, "O") || !strcmp(ans, "o")) {
444 if (!strcmp(ans, "A") || !strcmp(ans, "a")) {
448 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm=2;
449 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return -1;
453 while (confirm2 < 0) {
454 fprintf(stderr, _("Enter name of new file: "));
455 GetLine(stdin, FileName, 50);
456 if (&FileName[0]==0) return -1;
465 error=GSM_SaveTextFile(FileName, text, mode);
468 case -1: fprintf(stderr, _("Failed to write file \"%s\"\n"), FileName);
476 int GSM_SendMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
477 bool unicode, bool profile, bool scale) {
481 struct option options[] = {
482 { "smscno", required_argument, NULL, '2'},
483 { "smsc", required_argument, NULL, '1'},
484 { "name", required_argument, NULL, '3'},
485 { "unicode", no_argument, NULL, '4'},
486 { "profilestyle", no_argument, NULL, '5'},
487 { "scale", no_argument, NULL, '6'},
493 for (w=0;w<MultiSMS->number;w++) {
498 /* We check optional parameters from ... */
501 while ((i = getopt_long(argc, argv, "v:ds", options, NULL)) != -1) {
504 case '1': /* SMSC number */
505 MultiSMS->SMS[w].MessageCenter.No = 0;
506 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
509 case '2': /* SMSC number index in phone memory */
510 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
512 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
513 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
519 case '3': /* Receiver/recipient */
520 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
522 case '4': /* Unicode */
525 case '5': /* Profile */
528 case '6': /* Scale */
531 case 'v': /* Set validaty of SMS */
532 MultiSMS->SMS[w].Validity = atoi(optarg);
535 case 'd': /* delivery report */
536 MultiSMS->SMS[w].Type=GST_DR;
539 case 's': /* Set replying via the same SMSC */
540 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
543 fprintf(stderr,_("Unknown option number %i\n"),argc);
551 error=GSM->SendSMSMessage(&MultiSMS->SMS[w]);
553 if (error == GE_SMSSENDOK) {
554 fprintf(stdout, _("SMS %i/%i sent OK !\n"),w+1,MultiSMS->number);
556 fprintf(stdout, _("SMS %i/%i, sending failed (%d, %s)\n"),w+1,MultiSMS->number, error,print_error(error));
566 static int GSM_SaveMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
567 bool inter, bool unicode, bool profile, bool scale) {
571 GSM_SMSMessage SMSold;
573 struct option options[] = {
574 { "smscno", required_argument, NULL, '2'},
575 { "smsc", required_argument, NULL, '1'},
576 { "name", required_argument, NULL, '3'},
577 { "unicode", no_argument, NULL, '4'},
578 { "profilestyle", no_argument, NULL, '5'},
579 { "scale", no_argument, NULL, '6'},
591 for (w=0;w<MultiSMS->number;w++) {
596 /* We check optional parameters from ... */
599 while ((i = getopt_long(argc, argv, "risal:", options, NULL)) != -1) {
602 case '1': /* SMSC number */
603 MultiSMS->SMS[w].MessageCenter.No = 0;
604 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
607 case '2': /* SMSC number index in phone memory */
608 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
610 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
611 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
617 case '3': /* Receiver/recipient */
618 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
620 case '4': /* Unicode */
623 case '5': /* Profile */
626 case '6': /* Scale */
629 case 'r': /* mark as read */
630 MultiSMS->SMS[w].Status = GSS_SENTREAD; break;
632 case 'i': /* Save into Inbox */
633 MultiSMS->SMS[w].folder = GST_INBOX; break;
635 case 's': /* Set replying via the same SMSC */
636 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
638 case 'a': /* Ask before overwriting */
639 interactive=true;break;
641 case 'l': /* Specify location */
642 MultiSMS->SMS[0].Location = atoi(optarg); break;
645 fprintf(stderr,_("Unknown option number %i\n"),argc);
652 if (interactive && MultiSMS->SMS[0].Location!=0 && w==0) {
653 SMSold.Location=MultiSMS->SMS[0].Location;
654 error = GSM->GetSMSMessage(&SMSold);
657 fprintf(stderr, _("Message at specified location exists. "));
658 while (confirm < 0) {
659 fprintf(stderr, _("Overwrite? (yes/no) "));
660 GetLine(stdin, ans, 7);
661 if (!strcmp(ans, "yes")) confirm = 1;
662 if (!strcmp(ans, "no")) confirm = 0;
664 if (!confirm) { GSM->Terminate(); return 0; }
666 case GE_INVALIDSMSLOCATION:
667 fprintf(stderr, _("Invalid location\n"));
671 /* FIXME: Remove this fprintf when the function is thoroughly tested */
673 fprintf(stderr, _("Location %d empty. Saving\n"), SMS[w].Location);
679 error=GSM->SaveSMSMessage(&MultiSMS->SMS[w]);
681 if (error == GE_NONE)
682 fprintf(stdout, _("SMS %i/%i saved at location %i !\n"),w+1,MultiSMS->number,MultiSMS->SMS[w].MessageNumber);
684 fprintf(stdout, _("SMS %i/%i saving failed (%d, %s, location=%i)\n"), w+1, MultiSMS->number,error,print_error(error),MultiSMS->SMS[w].Location);
692 void GSM_PlayRingtoneOnConsole(GSM_Ringtone *ringtone)
699 for (i=0;i<ringtone->NrNotes;i++) {
706 GSM_PlayOneNote (ringtone->notes[i]);
708 GSM->PlayTone(255*255,0);
713 /* This function shows the copyright and some informations usefull for
715 static int version(void)
718 fprintf(stdout, _("GNOKII Version %s\n"
719 "Copyright (C) Hugh Blemings <hugh@linuxcare.com>, 1999, 2000\n"
720 "Copyright (C) Pavel JanÃk ml. <Pavel.Janik@linux.cz>, 1999, 2000\n"
721 "Built %s %s for %s on %s \n"), VERSION, __TIME__, __DATE__, model, Port);
726 /* The function usage is only informative - it prints this program's usage and
727 command-line options. */
729 static int usage(void)
732 fprintf(stdout, _(" usage: gnokii [--help] [--version]\n"
735 " gnokii --monitor [-noloop|-nl]\n"
741 " gnokii --getmemory memory_type [start [end]] [-short|-v30|-v21|-v]\n"
745 " gnokii --getmemory memory_type [start [end]] [-short]\n"
750 " gnokii --writephonebook [-i]\n"
755 " gnokii --sendphonebookentry destination memory_type location\n"
756 " [--smsc message_center_number] [--smscno message_center_index]\n"
757 " [-s] [-v n] [-d]\n"
758 " gnokii --savephonebookentry memory_type location\n"
759 " [--smsc message_center_number] [--smscno message_center_index]\n"
760 " [-r] [-i] [-s] [-a] [--name name]\n"
761 " gnokii --getvoicemailbox\n"
766 " gnokii --getspeeddial number\n"
767 " gnokii --setspeeddial number memory_type location\n\n"
772 " gnokii --getsms memory_type start [end] [-f file]\n"
773 " gnokii --getsmsstatus\n"
774 " gnokii --getsmsfolders\n"
775 " gnokii --deletesms memory_type start [end]\n"
776 " gnokii --sendsms destination [--smsc message_center_number |\n"
777 " --smscno message_center_index] [--long n] [-s] [-C n]\n"
778 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
779 " --enableemail|--disableemail|--void][--unicode][-v n][-d]\n"
780 " gnokii --savesms destination|\"\" [--smsc \n"
781 " message_center_number] [--smscno message_center_index]\n"
782 " [--long n] [-r] [-i] [-s][-C n][-a][-l][F n][--smsname name]\n"
783 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
784 " --enableemail|--disableemail|--void|--hang|--bug][--unicode]\n"
785 " gnokii --receivesms\n"
786 " gnokii --getsmsc message_center_number\n"
787 " gnokii --renamesmsc number new_name\n\n"
789 " gnokii --setdatetime [YYYY [MM [DD [HH [MM]]]]]\n"
790 " gnokii --getdatetime\n"
791 " gnokii --setalarm HH MM\n"
792 " gnokii --getalarm\n\n"
794 " gnokii --getcalendarnote { start end [-v30|-v10] | --short|-s }\n"
795 " gnokii --writecalendarnote vcardfile number\n"
796 " gnokii --deletecalendarnote index\n"
797 " gnokii --sendcalendarnote destination vcardfile number\n"
798 " [--smsc message_center_number] [--smscno message_center_index]\n"
799 " [-s] [-v n] [-d]\n"
800 " gnokii --savecalendarnote vcardfile number\n"
801 " [--smsc message_center_number] [--smscno message_center_index]\n"
802 " [-r] [-i] [-s] [-a] [--name name]\n\n"
804 " gnokii --netmonitor {reset|off|field|devel|next|nr}\n"
805 " gnokii --nm_collect screen1|-d [screen2|-d]...\n"
806 " gnokii --netmonitordata [-S file] [-I file] [-h] [-n n] [-ts n][-tm n]\n"
807 " [-fs str] [-ls str] FLD1:FLD2:FLDn:... \n"
808 " (see files netmonitordata_????_??? for details)\n\n"
810 " gnokii --bitmapconvert source destination\n"
811 " gnokii --bitmapconvert source destination op|7110op [network code]\n"
812 " gnokii --bitmapconvert source destination caller [caller group number]\n"
813 " gnokii --bitmapconvert source destination\n"
814 " startup|7110startup|6210startup\n"
815 " gnokii --bitmapconvert source destination picture\n"
816 " gnokii --showbitmap logofile\n"
817 " gnokii --sendlogo op destination logofile network_code\n"
818 " [--smsc message_center_number] [--smscno message_center_index]\n"
819 " [-s] [-v n] [-d]\n"
820 " gnokii --sendlogo picture destination logofile text\n"
821 " [--smsc message_center_number] [--smscno message_center_index]\n"
822 " [-s] [-v n] [-d] [--unicode]\n"
823 " gnokii --sendlogo screensaver destination logofile\n"
824 " [--smsc message_center_number] [--smscno message_center_index]\n"
825 " [-s] [-v n] [-d]\n"
826 " gnokii --sendlogo caller destination logofile\n"
827 " [--smsc message_center_number] [--smscno message_center_index]\n"
828 " [-s] [-v n] [-d]\n"
829 " gnokii --savelogo op logofile network_code\n"
830 " [--smsc message_center_number] [--smscno message_center_index]\n"
831 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
832 " gnokii --savelogo picture logofile text\n"
833 " [--smsc message_center_number] [--smscno message_center_index]\n"
834 " [-r] [-i] [-s] [-a] [-l] [--name name] [--unicode]\n"
835 " gnokii --savelogo screensaver logofile\n"
836 " [--smsc message_center_number] [--smscno message_center_index]\n"
837 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
838 " gnokii --savelogo caller logofile\n"
839 " [--smsc message_center_number] [--smscno message_center_index]\n"
840 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
841 " gnokii --setlogo op|7110op [logofile] [network code]\n"
842 " gnokii --setlogo startup|7110startup|6210startup [logofile]\n"
843 " gnokii --setlogo startup 1|2|3\n"
844 " gnokii --setlogo caller [logofile] [caller group number] [group name]\n"
845 " gnokii --setlogo picture [logofile] [number] [text] [sender]\n"
846 " gnokii --setlogo {dealer|text} [text]\n"
847 " gnokii --getlogo op|7110op [logofile] [network code]\n"
848 " gnokii --getlogo startup|7110startup|6210startup [logofile]\n"
849 " gnokii --getlogo caller [logofile][caller group number]\n"
850 " gnokii --getlogo picture [logofile][number]\n"
851 " gnokii --getlogo {dealer|text}\n\n"
853 " gnokii --sendringtone destination ringtonefile\n"
854 " [--smsc message_center_number] [--smscno message_center_index]\n"
855 " [-s] [-v n] [-d] [--scale] [--profilestyle]\n"
856 " gnokii --saveringtone ringtonefile\n"
857 " [--smsc message_center_number] [--smscno message_center_index]\n"
858 " [-r] [-i] [-s] [-a] [--name name] [--scale] [--profilestyle]\n"
859 " gnokii --setringtone ringtonefile [location]\n"
860 " gnokii --getringtone ringtonefile [location]\n"
861 " gnokii --ringtoneconvert source destination\n"
862 " gnokii --binringtoneconvert source destination\n"
863 " gnokii --playringtone ringtonefile\n"
864 " gnokii --composer ringtonefile\n"
865 " gnokii --allringtones\n\n"
867 " gnokii --getprofile [number]\n"
868 " gnokii --setprofile number feature value\n"
869 " gnokii --sendprofile destination profile_name ringtonefile\n"
870 " picturefile [--smsc message_center_number]\n"
871 " [--smscno message_center_index] [-s] [-v n] [-d] [--scale]\n\n"
876 " gnokii --reset [soft|hard]\n"
881 " gnokii --dialvoice number\n"
886 " gnokii --cancelcall\n"
891 " gnokii --displayoutput\n"
892 " gnokii --presskeysequence sequence\n"
893 " gnokii --backupsettings file\n"
894 " gnokii --restoresettings file\n"
895 " gnokii --getphoneprofile\n"
896 " gnokii --setphoneprofile feature value\n"
897 " gnokii --getoperatorname\n"
898 " gnokii --setoperatorname code name\n"
899 " gnokii --senddtmf string\n"
900 " gnokii --divert register|enable|query|disable|erasure\n"
901 " all|busy|noans|outofreach all|voice|fax|data\n"
902 " [number timeout]\n\n"
904 " gnokii --phonetests\n"
905 " gnokii --simlock\n"
906 " gnokii --getdisplaystatus\n"
911 " gnokii --identify\n\n"
916 " gnokii --getwapbookmark location\n"
917 " gnokii --setwapbookmark title url [location]\n"
918 " gnokii --sendwapbookmark location destination\n"
919 " [--smsc message_center_number] [--smscno message_center_index]\n"
920 " [-s] [-v n] [-d]\n"
921 " gnokii --savewapbookmark location\n"
922 " [--smsc message_center_number] [--smscno message_center_index]\n"
923 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
924 " gnokii --getwapsettings location\n"
925 " gnokii --savewapsettings location\n"
926 " [--smsc message_center_number] [--smscno message_center_index]\n"
927 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
928 " gnokii --sendwapsettings location destination\n"
929 " [--smsc message_center_number] [--smscno message_center_index]\n"
930 " [-s] [-v n] [-d]\n"
935 "\n gnokii --entersecuritycode PIN|PIN2|PUK|PUK2\n"
936 " gnokii --getsecuritycodestatus\n"
937 " gnokii --getsecuritycode PIN|PIN2|PUK|PUK2|SecurityCode\n"
938 " gnokii --geteeprom\n"
939 " gnokii --resetphonesettings\n"
945 " gnokii --sniff [port]\n"
946 " gnokii --decodefile file\n"
947 " gnokii --getbinringfromfile file name offset file2\n"
955 " gnokii --gnokiid [--debug] [<child to run> [<child args>...]]\n"
962 /* fbusinit is the generic function which waits for the FBUS link. The limit
963 is 10 seconds. After 10 seconds we quit. */
965 static void fbusinit(void (*rlp_handler)(RLP_F96Frame *frame))
972 if (strcmp(GetMygnokiiVersion(),VERSION)!=0)
973 fprintf(stderr,_("WARNING: version of installed libmygnokii.so (%s) is different to version of gnokii (%s)\n"),GetMygnokiiVersion(),VERSION);
976 /* Initialise the code for the GSM interface. */
977 error = GSM_Initialise(model, Port, Initlength, GetConnectionTypeFromString(Connection), rlp_handler, ""/*SynchronizeTime*/);
979 if (error != GE_NONE) {
980 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
984 /* First (and important!) wait for GSM link to be active. We allow 10
986 while (count++ < 200 && *GSM_LinkOK == false)
989 if (*GSM_LinkOK == false) {
990 fprintf (stderr, _("Hmmm... GSM_LinkOK never went true. Quitting.\n"));
995 /* This function checks that the argument count for a given options is withing
998 static int checkargs(int opt, struct gnokii_arg_len gals[], int argc)
1003 /* Walk through the whole array with options requiring arguments. */
1005 for(i = 0;!(gals[i].gal_min == 0 && gals[i].gal_max == 0); i++) {
1007 /* Current option. */
1009 if(gals[i].gal_opt == opt) {
1011 /* Argument count checking. */
1013 if(gals[i].gal_flags == GAL_XOR) {
1014 if(gals[i].gal_min == argc || gals[i].gal_max == argc) return 0;
1017 if(gals[i].gal_min <= argc && gals[i].gal_max >= argc) return 0;
1026 /* We do not have options without arguments in the array, so check them. */
1028 if (argc==0) return 0;
1032 static int gnokiid(int argc, char *argv[]);
1034 /* Main function - handles command line arguments, passes them to separate
1035 functions accordingly. */
1037 int main(int argc, char *argv[])
1044 /* Every option should be in this array. */
1046 static struct option long_options[] =
1049 { "help", no_argument, NULL, OPT_HELP },// Display usage.
1050 { "version", no_argument, NULL, OPT_VERSION },// Display version and build information.
1052 { "getsmsfolders", no_argument, NULL, OPT_GETSMSFOLDERS },// Gets SMS folders
1053 { "getsmsstatus", no_argument, NULL, OPT_GETSMSSTATUS },// Get SMS Folder Status
1054 #endif /* UCLINUX */
1055 { "identify", no_argument, NULL, OPT_IDENTIFY },// Identify
1057 { "pmon", no_argument, NULL, OPT_PMON },// For development purposes: run in passive monitoring mode
1058 { "foogle", no_argument, NULL, OPT_FOOGLE },// For development purposes: insert you function calls here
1059 { "getdatetime", no_argument, NULL, OPT_GETDATETIME },// Get date and time mode
1060 { "getalarm", no_argument, NULL, OPT_GETALARM },// Get alarm
1061 #endif /* UCLINUX */
1062 { "cancelcall", no_argument, NULL, OPT_CANCELCALL },// Cancel Call
1064 { "getdisplaystatus", no_argument, NULL, OPT_GETDISPLAYSTATUS },// Get display status mode
1065 { "allringtones", no_argument, NULL, OPT_ALLRINGTONES },/* Displays names of available ringtones */
1066 { "displayoutput", no_argument, NULL, OPT_DISPLAYOUTPUT },/* Show texts from phone's display */
1067 { "getphoneprofile", no_argument, NULL, OPT_GETPHONEPROFILE },/* Get/Set phone profile settings */
1068 { "getoperatorname", no_argument, NULL, OPT_GETOPERATORNAME },/* Get downloaded operator name */
1069 { "getvoicemailbox", no_argument, NULL, OPT_GETVOICEMAILBOX },/* Gets voice mailbox number */
1070 { "phonetests", no_argument, NULL, OPT_PHONETESTS },
1071 { "simlockinfo", no_argument, NULL, OPT_SIMLOCKINFO },
1072 { "receivesms", no_argument, NULL, OPT_RECEIVESMS },
1073 { "setoperatorname", optional_argument, NULL, OPT_SETOPERATORNAME },/* Set downloaded operator name */
1074 { "setdatetime", optional_argument, NULL, OPT_SETDATETIME },// Set date and time
1075 #endif /* UCLINUX */
1076 { "writephonebook", optional_argument, NULL, OPT_WRITEPHONEBOOK },// Write phonebook (memory) mode
1077 { "reset", optional_argument, NULL, OPT_RESET },// Resets the phone
1079 { "monitor", optional_argument, NULL, OPT_MONITOR },// Monitor mode
1080 { "setlogo", optional_argument, NULL, OPT_SETLOGO },// Set logo
1081 { "getprofile", optional_argument, NULL, OPT_GETPROFILE },// Show profile
1082 { "setalarm", required_argument, NULL, OPT_SETALARM },// Set alarm
1083 { "dialvoice", required_argument, NULL, OPT_DIALVOICE },// Voice call mode
1084 { "getcalendarnote", required_argument, NULL, OPT_GETCALENDARNOTE },// Get calendar note mode
1085 { "writecalendarnote", required_argument, NULL, OPT_WRITECALENDARNOTE},// Write calendar note mode
1086 { "sendcalendarnote", required_argument, NULL, OPT_SENDCALENDARNOTE },
1087 { "savecalendarnote", required_argument, NULL, OPT_SAVECALENDARNOTE },
1088 { "sendphonebookentry", required_argument, NULL, OPT_SENDPHONEBOOKENTRY},
1089 { "savephonebookentry", required_argument, NULL, OPT_SAVEPHONEBOOKENTRY},
1090 { "deletecalendarnote", required_argument, NULL, OPT_DELCALENDARNOTE },// Delete calendar note mode
1091 #endif /* UCLINUX */
1092 { "getmemory", required_argument, NULL, OPT_GETMEMORY },// Get memory mode
1093 { "getspeeddial", required_argument, NULL, OPT_GETSPEEDDIAL },// Get speed dial mode
1094 { "setspeeddial", required_argument, NULL, OPT_SETSPEEDDIAL },// Set speed dial mode
1096 { "getsms", required_argument, NULL, OPT_GETSMS },// Get SMS message mode
1097 { "deletesms", required_argument, NULL, OPT_DELETESMS },// Delete SMS message mode
1098 { "sendsms", required_argument, NULL, OPT_SENDSMS },// Send SMS message mode
1099 { "savesms", required_argument, NULL, OPT_SAVESMS },// Save SMS message mode
1100 { "sendlogo", required_argument, NULL, OPT_SENDLOGO },// Send logo as SMS message mode
1101 { "savelogo", required_argument, NULL, OPT_SAVELOGO },// Save logo on SIM
1102 { "sendringtone", required_argument, NULL, OPT_SENDRINGTONE },// Send ringtone as SMS message
1103 { "saveringtone", required_argument, NULL, OPT_SAVERINGTONE },// Saves ringtone on SIM
1104 { "setringtone", required_argument, NULL, OPT_SETRINGTONE },// Set ringtone
1105 { "getringtone", required_argument, NULL, OPT_GETRINGTONE },// Get bin/normal ringtone
1106 { "presskeysequence", required_argument, NULL, OPT_PRESSKEYSEQUENCE },/* Presses keys in phone's display */
1107 { "getsmsc", required_argument, NULL, OPT_GETSMSC },// Get SMS center number mode
1108 { "renamesmsc", required_argument, NULL, OPT_RENAMESMSC },// Rename SMSC
1109 { "netmonitor", required_argument, NULL, OPT_NETMONITOR },// NetMonitor mode
1110 { "senddtmf", required_argument, NULL, OPT_SENDDTMF },// Send DTMF sequence
1111 { "getlogo", required_argument, NULL, OPT_GETLOGO },// Get logo
1112 { "setprofile", required_argument, NULL, OPT_SETPROFILE },// Set profile feature
1113 { "sendprofile", required_argument, NULL, OPT_SENDPROFILE },// Send profile via SMS
1114 { "setphoneprofile", required_argument, NULL, OPT_SETPHONEPROFILE },/* Get/Set phone profile settings */
1115 { "restoresettings", required_argument, NULL, OPT_RESTORESETTINGS },//Restore various settings from one file
1116 { "backupsettings", required_argument, NULL, OPT_BACKUPSETTINGS },//Backup various settings to one file
1117 { "playringtone", required_argument, NULL, OPT_PLAYRINGTONE },/* Plays ringtones */
1118 { "composer", required_argument, NULL, OPT_COMPOSER },/* Shows ringtone like in Nokia Composer */
1119 { "ringtoneconvert", required_argument, NULL, OPT_RINGTONECONVERT },/* Convert ringtone files */
1120 { "binringtoneconvert", required_argument, NULL, OPT_BINRINGTONECONVERT},/* Convert binary ringtone files */
1121 { "bitmapconvert", required_argument, NULL, OPT_BITMAPCONVERT },/* Convert bitmap files */
1122 { "showbitmap", required_argument, NULL, OPT_SHOWBITMAP },
1123 { "nm_collect", required_argument, NULL, OPT_NM_COLLECT },// NetMonitor periodical data collection mode (newbiee)
1124 { "netmonitordata", required_argument, NULL, OPT_NETMONITORDATA },// NetMonitor periodical data collection mode (advanced)
1125 { "getwapbookmark", required_argument, NULL, OPT_GETWAPBOOKMARK },
1126 { "setwapbookmark", required_argument, NULL, OPT_SETWAPBOOKMARK },
1127 { "savewapbookmark", required_argument, NULL, OPT_SAVEWAPBOOKMARK },
1128 { "savewapsettings", required_argument, NULL, OPT_SAVEWAPSETTINGS },
1129 { "sendwapsettings", required_argument, NULL, OPT_SENDWAPSETTINGS },
1130 { "sendwapbookmark", required_argument, NULL, OPT_SENDWAPBOOKMARK },
1131 { "getwapsettings", required_argument, NULL, OPT_GETWAPSETTINGS },
1132 { "divert", required_argument, NULL, OPT_DIVERT },
1135 { "entersecuritycode", required_argument, NULL, OPT_ENTERSECURITYCODE },// Enter Security Code mode
1136 { "getsecuritycode", required_argument, NULL, OPT_GETSECURITYCODE },// Get Security Code
1137 { "getsecuritycodestatus",no_argument, NULL, OPT_GETSECURITYCODESTATUS},// Get Security Code status
1138 { "geteeprom", no_argument, NULL, OPT_GETEEPROM },// Gets EEPROM
1139 { "resetphonesettings", no_argument, NULL, OPT_RESETPHONESETTINGS },// Reset phone settings
1140 { "setsimlock", no_argument, NULL, OPT_SETSIMLOCK },// Sets simlock
1144 { "sniff", optional_argument, NULL, OPT_SNIFFER },// Will show datas from port
1145 { "decodefile", required_argument, NULL, OPT_DECODEFILE },//decode input file
1146 { "getbinringfromfile", required_argument, NULL, OPT_GETBINRINGFROMFILE },
1148 #endif /* UCLINUX */
1151 { "gnokiid", optional_argument, NULL, OPT_GNOKIID },// gnokiid mode
1152 #endif /* UCLINUX */
1157 /* Every command which requires arguments should have an appropriate entry
1160 struct gnokii_arg_len gals[] =
1164 { OPT_MONITOR, 0, 1, 0 },
1167 { OPT_ENTERSECURITYCODE, 1, 1, 0 },
1168 { OPT_GETSECURITYCODE, 1, 1, 0 },
1172 { OPT_SNIFFER, 0, 1, 0 },
1173 { OPT_DECODEFILE, 1, 1, 0 },
1174 { OPT_GETBINRINGFROMFILE,4, 4, 0 },
1177 { OPT_SETDATETIME, 0, 5, 0 },
1178 { OPT_BACKUPSETTINGS, 1, 1, 0 },
1179 { OPT_RESTORESETTINGS, 1, 1, 0 },
1180 { OPT_SETALARM, 2, 2, 0 },
1181 { OPT_DIALVOICE, 1, 1, 0 },
1182 { OPT_GETCALENDARNOTE, 1, 3, 0 },
1183 { OPT_WRITECALENDARNOTE, 2, 2, 0 },
1184 { OPT_SAVECALENDARNOTE, 2, 9, 0 },
1185 { OPT_SENDCALENDARNOTE, 3, 9, 0 },
1186 { OPT_SAVEPHONEBOOKENTRY,2, 9, 0 },
1187 { OPT_SENDPHONEBOOKENTRY,3, 9, 0 },
1188 { OPT_DELCALENDARNOTE, 1, 1, 0 },
1189 #endif /* UCLINUX */
1190 { OPT_GETMEMORY, 2, 4, 0 },
1191 { OPT_GETSPEEDDIAL, 1, 1, 0 },
1192 { OPT_SETSPEEDDIAL, 3, 3, 0 },
1194 { OPT_GETSMS, 2, 5, 0 },
1195 { OPT_DELETESMS, 2, 3, 0 },
1196 { OPT_SENDSMS, 1,10, 0 },
1197 { OPT_SAVESMS, 1,11, 0 },
1198 { OPT_SENDLOGO, 3, 9, 0 },
1199 { OPT_SAVELOGO, 2,10, 0 },
1200 { OPT_SENDRINGTONE, 2, 7, 0 },
1201 { OPT_SAVERINGTONE, 1, 9, 0 },
1202 { OPT_GETSMSC, 1, 1, 0 },
1203 { OPT_RENAMESMSC, 2, 2, 0 },
1204 { OPT_NETMONITOR, 1, 1, 0 },
1205 { OPT_SENDDTMF, 1, 1, 0 },
1206 { OPT_SETLOGO, 1, 5, 0 },
1207 { OPT_GETLOGO, 1, 4, 0 },
1208 { OPT_SETRINGTONE, 1, 3, 0 },
1209 { OPT_GETRINGTONE, 1, 2, 0 },
1210 { OPT_PRESSKEYSEQUENCE, 1, 1, 0 },
1211 #endif /* UCLINUX */
1212 { OPT_RESET, 0, 1, 0 },
1214 { OPT_GETPROFILE, 0, 1, 0 },
1215 { OPT_SETPROFILE, 3, 3, 0 },
1216 { OPT_SENDPROFILE, 4,10, 0 },
1217 #endif /* UCLINUX */
1218 { OPT_WRITEPHONEBOOK, 0, 1, 0 },
1220 { OPT_PLAYRINGTONE, 1, 1, 0 },
1221 { OPT_COMPOSER, 1, 1, 0 },
1222 { OPT_RINGTONECONVERT, 2, 2, 0 },
1223 { OPT_BINRINGTONECONVERT,2, 2, 0 },
1224 { OPT_BITMAPCONVERT, 2, 4, 0 },
1225 { OPT_SHOWBITMAP, 1, 1, 0 },
1226 { OPT_SETOPERATORNAME, 0, 2, 0 },
1227 { OPT_SETPHONEPROFILE, 2, 2, 0 },
1228 { OPT_NM_COLLECT, 1, MAX_NM_COLLECT, 0 },
1229 { OPT_NETMONITORDATA, 0,99, 0 },
1230 { OPT_GETWAPBOOKMARK, 1, 1, 0 },
1231 { OPT_SETWAPBOOKMARK, 2, 3, 0 },
1232 { OPT_SAVEWAPBOOKMARK, 1, 9, 0 },
1233 { OPT_SENDWAPBOOKMARK, 2, 9, 0 },
1234 { OPT_GETWAPSETTINGS, 1, 1, 0 },
1235 { OPT_SAVEWAPSETTINGS, 1, 9, 0 },
1236 { OPT_SENDWAPSETTINGS, 2, 9, 0 },
1237 { OPT_DIVERT, 3, 5, 0 },
1238 #endif /* UCLINUX */
1241 { OPT_GNOKIID, 0, INT_MAX, 0 },
1242 #endif /* UCLINUX */
1251 /* For GNU gettext */
1255 textdomain("gnokii");
1256 setlocale(LC_ALL, "pl_PL"); //here is string for Polish localisation
1258 setlocale(LC_ALL, ".852"); //Polish codepage for console, not "real" WIN CP
1263 /* Read config file */
1264 if (CFG_ReadConfig(&model, &Port, &Initlength, &Connection, &BinDir, false) < 0) {
1268 /* Handle command line arguments. */
1270 c = getopt_long(argc, argv, "", long_options, NULL);
1274 /* No argument given - we should display usage. */
1279 /* We have to build an array of the arguments which will be passed to the
1280 functions. Please note that every text after the --command will be
1281 passed as arguments. A syntax like gnokii --cmd1 args --cmd2 args will
1282 not work as expected; instead args --cmd2 args is passed as a
1285 if((nargv = malloc(sizeof(char *) * argc)) != NULL) {
1287 for(i = 2; i < argc; i++)
1288 nargv[i-2] = argv[i];
1289 nargv[argc-2] = NULL; /* required by gnokiid() for execv(3) */
1291 if(checkargs(c, gals, nargc)) {
1295 /* Wrong number of arguments - we should display usage. */
1301 #if defined(__svr4__)
1302 /* have to ignore SIGALARM */
1309 // First, error conditions
1311 fprintf(stderr, _("Use '%s --help' for usage informations.\n"), argv[0]);
1314 // Then, options with no arguments
1315 case OPT_HELP: rc = usage(); break;
1316 case OPT_VERSION: rc = version(); break;
1318 case OPT_MONITOR: rc = monitormode(nargc, nargv); break;
1319 case OPT_GETSMSFOLDERS: rc = getsmsfolders(); break;
1320 case OPT_GETDATETIME: rc = getdatetime(); break;
1321 case OPT_GETALARM: rc = getalarm(); break;
1322 case OPT_GETDISPLAYSTATUS: rc = getdisplaystatus(); break;
1323 case OPT_PMON: rc = pmon(); break;
1324 #endif /* UCLINUX */
1325 case OPT_WRITEPHONEBOOK: rc = writephonebook(nargc, nargv);break;
1329 case OPT_ENTERSECURITYCODE: rc = entersecuritycode(optarg); break;
1330 case OPT_GETSECURITYCODESTATUS: rc = getsecuritycodestatus(); break;
1331 case OPT_GETSECURITYCODE: rc = getsecuritycode(optarg); break;
1332 case OPT_GETEEPROM: rc = geteeprom(); break;
1333 case OPT_RESETPHONESETTINGS: rc = resetphonesettings(); break;
1334 case OPT_SETSIMLOCK: rc = setsimlock(); break;
1338 case OPT_SNIFFER: rc = sniff(nargc, nargv); break;
1339 case OPT_DECODEFILE: rc = decodefile(nargc, nargv); break;
1340 case OPT_GETBINRINGFROMFILE: rc = getbinringfromfile(nargc, nargv);break;
1343 // Now, options with arguments
1344 case OPT_SETDATETIME: rc = setdatetime(nargc, nargv); break;
1345 case OPT_SETALARM: rc = setalarm(nargv); break;
1346 case OPT_DIALVOICE: rc = dialvoice(optarg); break;
1347 #endif /* UCLINUX */
1348 case OPT_CANCELCALL: rc = cancelcall(); break;
1350 case OPT_GETCALENDARNOTE: rc = getcalendarnote(nargc, nargv);break;
1351 case OPT_DELCALENDARNOTE: rc = deletecalendarnote(optarg);break;
1352 case OPT_SAVECALENDARNOTE: rc = savecalendarnote(nargc, nargv);break;
1353 case OPT_SENDCALENDARNOTE: rc = sendcalendarnote(nargc, nargv);break;
1354 case OPT_SAVEPHONEBOOKENTRY: rc = savephonebookentry(nargc, nargv);break;
1355 case OPT_SENDPHONEBOOKENTRY: rc = sendphonebookentry(nargc, nargv);break;
1356 case OPT_WRITECALENDARNOTE: rc = writecalendarnote(nargv); break;
1357 #endif /* UCLINUX */
1358 case OPT_GETMEMORY: rc = getmemory(nargc, nargv); break;
1359 case OPT_GETSPEEDDIAL: rc = getspeeddial(optarg); break;
1360 case OPT_SETSPEEDDIAL: rc = setspeeddial(nargv); break;
1362 case OPT_GETSMS: rc = getsms(argc, argv); break;
1363 case OPT_GETSMSSTATUS: rc = getsmsstatus(argc, argv); break;
1364 case OPT_DELETESMS: rc = deletesms(nargc, nargv); break;
1365 case OPT_SENDSMS: rc = sendsms(nargc, nargv); break;
1366 case OPT_SAVESMS: rc = savesms(nargc, nargv); break;
1367 case OPT_DIVERT: rc = divert(nargc, nargv); break;
1368 case OPT_SENDLOGO: rc = sendlogo(nargc, nargv); break;
1369 case OPT_SAVELOGO: rc = savelogo(nargc, nargv); break;
1370 case OPT_GETSMSC: rc = getsmsc(optarg); break;
1371 case OPT_RENAMESMSC: rc = renamesmsc(nargc,nargv); break;
1372 case OPT_NETMONITOR: rc = netmonitor(optarg); break;
1373 #endif /* UCLINUX */
1374 case OPT_IDENTIFY: rc = identify(); break;
1376 case OPT_SETLOGO: rc = setlogo(nargc, nargv); break;
1377 case OPT_GETLOGO: rc = getlogo(nargc, nargv); break;
1378 case OPT_RECEIVESMS: rc = receivesms(nargc, nargv); break;
1379 case OPT_SETRINGTONE: rc = setringtone(nargc, nargv); break;
1380 case OPT_GETRINGTONE: rc = getringtone(nargc, nargv); break;
1381 case OPT_PRESSKEYSEQUENCE: rc = presskeysequence(nargv); break;
1382 case OPT_SENDRINGTONE: rc = sendringtone(nargc, nargv);break;
1383 case OPT_SAVERINGTONE: rc = saveringtone(nargc, nargv);break;
1384 case OPT_GETPROFILE: rc = getprofile(nargc, nargv); break;
1385 case OPT_SETPROFILE: rc = setprofile(nargc, nargv); break;
1386 case OPT_SENDPROFILE: rc = sendprofile(nargc, nargv); break;
1387 case OPT_DISPLAYOUTPUT: rc = displayoutput(); break;
1388 case OPT_RESTORESETTINGS: rc = restoresettings(nargv); break;
1389 case OPT_BACKUPSETTINGS: rc = backupsettings(nargv); break;
1390 case OPT_RINGTONECONVERT: rc = ringtoneconvert(nargc, nargv);break;
1391 case OPT_BINRINGTONECONVERT: rc = binringtoneconvert(nargc, nargv);break;
1392 case OPT_BITMAPCONVERT: rc = bitmapconvert(nargc, nargv);break;
1393 case OPT_SHOWBITMAP: rc = showbitmap(nargc, nargv); break;
1394 case OPT_PLAYRINGTONE: rc = playringtone(nargc, nargv);break;
1395 case OPT_COMPOSER: rc = composer(nargc, nargv); break;
1396 case OPT_FOOGLE: rc = foogle(nargv); break;
1397 case OPT_PHONETESTS: rc = phonetests(); break;
1398 case OPT_SIMLOCKINFO: rc = simlockinfo(); break;
1399 case OPT_SENDDTMF: rc = senddtmf(optarg); break;
1400 #endif /* UCLINUX */
1401 case OPT_RESET: rc = reset(nargc,nargv); break;
1403 case OPT_GETOPERATORNAME: rc = getoperatorname(); break;
1404 case OPT_SETOPERATORNAME: rc = setoperatorname(nargc,nargv);break;
1405 case OPT_GETWAPBOOKMARK: rc = getwapbookmark(nargc,nargv);break;
1406 case OPT_SETWAPBOOKMARK: rc = setwapbookmark(nargc,nargv);break;
1407 case OPT_SAVEWAPBOOKMARK: rc = savewapbookmark(nargc,nargv);break;
1408 case OPT_SENDWAPBOOKMARK: rc = sendwapbookmark(nargc,nargv);break;
1409 case OPT_GETWAPSETTINGS: rc = getwapsettings(nargc,nargv);break;
1410 case OPT_SAVEWAPSETTINGS: rc = savewapsettings(nargc,nargv);break;
1411 case OPT_SENDWAPSETTINGS: rc = sendwapsettings(nargc,nargv);break;
1412 case OPT_ALLRINGTONES: rc = allringtones(); break;
1413 case OPT_GETPHONEPROFILE: rc = getphoneprofile(); break;
1414 case OPT_SETPHONEPROFILE: rc = setphoneprofile(nargc,nargv);break;
1415 case OPT_GETVOICEMAILBOX: rc = getvoicemailbox(); break;
1416 case OPT_NM_COLLECT: rc = nm_collect(nargc, nargv); break;
1417 case OPT_NETMONITORDATA: rc = netmonitordata(nargc, nargv);break;
1418 #endif /* UCLINUX */
1421 case OPT_GNOKIID: rc = gnokiid(nargc, nargv); break;
1422 #endif /* UCLINUX */
1423 default: fprintf(stderr, _("Unknown option: %d\n"), c); break;
1432 fprintf(stderr, _("Wrong number of arguments\n"));
1439 /* Restores various phone settings from one file */
1440 int restoresettings(char *argv[])
1443 GSM_PhonebookEntry pbk;
1450 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1451 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1453 if (GSM_ReadBackupFile(argv[0], &Backup)!=GE_NONE) return 1;
1457 if (Backup.SIMPhonebookUsed!=0) {
1459 while (confirm < 0) {
1460 fprintf(stderr, _("Restore SIM phonebook ? "));
1461 GetLine(stdin, ans, 99);
1462 if (!strcmp(ans, "yes")) confirm = 1;
1463 if (!strcmp(ans, "no" )) confirm = 0;
1466 if (GSM->GetMemoryStatus(&SIMMemoryStatus) != GE_NONE) {
1467 fprintf(stderr,_("Error getting memory status !\n"));
1472 while ((pos-1)!=SIMMemoryStatus.Used+SIMMemoryStatus.Free) {
1474 pbk.MemoryType=GMT_SM;
1477 pbk.SubEntriesCount = 0;
1478 if (i<Backup.SIMPhonebookUsed) {
1479 if (Backup.SIMPhonebook[i].Location==pbk.Location) {
1480 pbk=Backup.SIMPhonebook[i];
1483 // fprintf(stdout,_("Copying from backup\n"));
1488 // fprintf(stdout,_("Setting location %i\n"),pbk.Location);
1490 GSM->WritePhonebookLocation(&pbk);
1491 fprintf(stderr,_("."));
1494 fprintf(stderr,_("\n"));
1497 if (Backup.PhonePhonebookUsed!=0) {
1499 while (confirm < 0) {
1500 fprintf(stderr, _("Restore phone phonebook ? "));
1501 GetLine(stdin, ans, 99);
1502 if (!strcmp(ans, "yes")) confirm = 1;
1503 if (!strcmp(ans, "no" )) confirm = 0;
1506 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) != GE_NONE) {
1507 fprintf(stderr,_("Error getting memory status !\n"));
1513 while ((pos-1)!=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free) {
1515 pbk.MemoryType=GMT_ME;
1518 pbk.SubEntriesCount = 0;
1519 if (i<Backup.PhonePhonebookUsed) {
1520 if (Backup.PhonePhonebook[i].Location==pbk.Location) {
1521 pbk=Backup.PhonePhonebook[i];
1524 // fprintf(stdout,_("Copying from backup\n"));
1529 // fprintf(stdout,_("Setting location %i\n"),pbk.Location);
1531 GSM->WritePhonebookLocation(&pbk);
1532 fprintf(stderr,_("."));
1535 fprintf(stderr,_("\n"));
1538 if (Backup.CallerAvailable==true) {
1540 while (confirm < 0) {
1541 fprintf(stderr, _("Restore caller groups ? "));
1542 GetLine(stdin, ans, 99);
1543 if (!strcmp(ans, "yes")) confirm = 1;
1544 if (!strcmp(ans, "no" )) confirm = 0;
1547 for (i=0;i<5;i++) GSM->SetBitmap(&Backup.CallerGroups[i]);
1550 if (Backup.OperatorLogoAvailable==true) {
1552 while (confirm < 0) {
1553 fprintf(stderr, _("Restore operator logo ? "));
1554 GetLine(stdin, ans, 99);
1555 if (!strcmp(ans, "yes")) confirm = 1;
1556 if (!strcmp(ans, "no" )) confirm = 0;
1559 GSM->SetBitmap(&Backup.OperatorLogo);
1562 if (Backup.StartupLogoAvailable==true) {
1564 while (confirm < 0) {
1565 fprintf(stderr, _("Restore startup logo ? "));
1566 GetLine(stdin, ans, 99);
1567 if (!strcmp(ans, "yes")) confirm = 1;
1568 if (!strcmp(ans, "no" )) confirm = 0;
1571 GSM->SetBitmap(&Backup.StartupLogo);
1580 /* Backup various phone settings from one file */
1581 int backupsettings(char *argv[])
1583 GSM_PhonebookEntry PbkEntry;
1588 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1589 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1593 fprintf(stderr,_("Backup phonebook from SIM..."));
1594 Backup.SIMPhonebookUsed=0;
1595 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE) {
1596 Backup.SIMPhonebookSize=SIMMemoryStatus.Used+SIMMemoryStatus.Free;
1598 PbkEntry.MemoryType=GMT_SM;
1600 for (i=0;i<Backup.SIMPhonebookSize;i++)
1602 if (SIMMemoryStatus.Used==Backup.SIMPhonebookUsed) break;
1604 PbkEntry.Location=i;
1606 error=GSM->GetMemoryLocation(&PbkEntry);
1609 Backup.SIMPhonebook[Backup.SIMPhonebookUsed]=PbkEntry;
1610 Backup.SIMPhonebookUsed++;
1611 fprintf(stderr,_("."));
1617 fprintf(stderr,_("Done\n"));
1618 } else fprintf(stderr,_("ERROR\n"));
1620 fprintf(stderr,_("Backup phonebook from phone..."));
1621 Backup.PhonePhonebookUsed=0;
1622 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE) {
1623 Backup.PhonePhonebookSize=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free;
1625 PbkEntry.MemoryType=GMT_ME;
1627 for (i=0;i<Backup.PhonePhonebookSize;i++)
1629 if (PhoneMemoryStatus.Used==Backup.PhonePhonebookUsed) break;
1631 PbkEntry.Location=i;
1633 error=GSM->GetMemoryLocation(&PbkEntry);
1636 Backup.PhonePhonebook[Backup.PhonePhonebookUsed]=PbkEntry;
1637 Backup.PhonePhonebookUsed++;
1638 fprintf(stderr,_("."));
1644 fprintf(stderr,_("Done\n"));
1645 } else fprintf(stderr,_("ERROR\n"));
1647 if( GetModelFeature (FN_CALLERGROUPS)!=0) {
1648 fprintf(stderr,_("Backup caller logos..."));
1649 Backup.CallerAvailable=true;
1651 Backup.CallerGroups[i].number=i;
1652 Backup.CallerGroups[i].type=GSM_CallerLogo;
1653 if (GSM->GetBitmap(&Backup.CallerGroups[i])!=GE_NONE) return 1;
1655 fprintf(stderr,_("Done\n"));
1656 } else Backup.CallerAvailable=false;
1658 // fprintf(stderr,_("Backup speed dials..."));
1659 Backup.SpeedAvailable=false;
1660 // for (i=0;i<8;i++) {
1661 // Backup.SpeedDials[i].Number=i+1;
1662 // if (GSM->GetSpeedDial(&Backup.SpeedDials[i])!=GE_NONE) return 1;
1664 // fprintf(stderr,_("Done\n"));
1666 fprintf(stderr,_("Backup operator logo..."));
1667 Backup.OperatorLogoAvailable=true;
1668 Backup.OperatorLogo.type=GSM_7110OperatorLogo;
1669 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1670 Backup.OperatorLogo.type=GSM_OperatorLogo;
1671 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1672 Backup.OperatorLogoAvailable=false;
1673 fprintf(stderr,_("Error\n"));
1674 } else fprintf(stderr,_("Done\n"));
1675 } else fprintf(stderr,_("Done\n"));
1677 Backup.StartupLogoAvailable=false;
1678 if( GetModelFeature (FN_STARTUP)!=0) {
1679 fprintf(stderr,_("Backup startup logo..."));
1680 Backup.StartupLogoAvailable=true;
1681 switch (GetModelFeature (FN_STARTUP)) {
1682 case F_STA62: Backup.StartupLogo.type=GSM_6210StartupLogo;break;
1683 case F_STA71: Backup.StartupLogo.type=GSM_7110StartupLogo;break;
1684 default : Backup.StartupLogo.type=GSM_StartupLogo;break;
1686 if (GSM->GetBitmap(&Backup.StartupLogo)!=GE_NONE) {
1687 Backup.StartupLogoAvailable=false;
1688 fprintf(stderr,_("Error\n"));
1689 } else fprintf(stderr,_("Done\n"));
1692 fprintf(stderr,_("Backup welcome note..."));
1693 Backup.StartupText.type=GSM_WelcomeNoteText;
1694 if (GSM->GetBitmap(&Backup.StartupText)!=GE_NONE) {
1695 fprintf(stderr,_("Error\n"));
1696 } else fprintf(stderr,_("Done\n"));
1700 GSM_SaveBackupFile(argv[0], &Backup);
1705 /* Presses keys on phone's keyboard */
1707 int presskeysequence(char *argv[])
1717 for (i=0;i<strlen(argv[0]);i++)
1723 if (key!='w' && key!='W')
1725 while (Keys[j].whatchar!=' ') {
1726 if (Keys[j].whatchar==key) {
1727 keycode=Keys[j].whatcode;
1734 fprintf(stderr,_("Unknown key: %c !\n"),key);
1739 if (GSM->PressKey(keycode,PRESSPHONEKEY)!=GE_NONE)
1741 fprintf(stderr,_("Can't press key !\n"));
1745 if (GSM->PressKey(keycode,RELEASEPHONEKEY)!=GE_NONE)
1747 fprintf(stderr,_("Can't release key !\n"));
1762 /* Send SMS messages. */
1763 int sendsms(int argc, char *argv[])
1765 GSM_MultiSMSMessage MultiSMS;
1766 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1767 int input_len, chars_read,i,msgnum;
1769 GSM_SMSMessageType SMSType=GST_SMS;
1770 int SMSValidity= 4320; /* 4320 minutes == 72 hours */
1771 bool SMSReply=false;
1772 int SMSClass=-1,SMSCenter=1;
1773 char SMSCNumber[100];
1774 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1775 GSM_UDH SMSUDHType=GSM_NoUDH;
1777 struct option options[] = {
1778 { "smscno", required_argument, NULL, '2'},
1779 { "smsc", required_argument, NULL, '1'},
1780 { "long", required_argument, NULL, '3'},
1781 { "enablevoice", no_argument, NULL, '4'},
1782 { "disablevoice", no_argument, NULL, '5'},
1783 { "enableemail", no_argument, NULL, '6'},
1784 { "disableemail", no_argument, NULL, '7'},
1785 { "enablefax", no_argument, NULL, '8'},
1786 { "disablefax", no_argument, NULL, '9'},
1787 { "unicode", no_argument, NULL, '-'},
1788 { "void", no_argument, NULL, '+'},
1789 { "hang", no_argument, NULL, '('},
1790 { "bug", no_argument, NULL, ')'},
1794 input_len = GSM_MAX_SMS_LENGTH;
1801 while ((i = getopt_long(argc, argv, "v:dsC:", options, NULL)) != -1) {
1804 case '1': /* SMSC number */
1806 strcpy(SMSCNumber,optarg);
1809 case '2': /* SMSC number index in phone memory */
1810 SMSCenter = atoi(optarg);
1812 if (SMSCenter < 1 || SMSCenter > 5) {
1813 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1819 case '3': /* we send long message */
1820 SMSUDHType=GSM_ConcatenatedMessages;
1821 input_len = atoi(optarg);
1822 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1823 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1828 case '4': /* SMS enables voice indicator */
1829 SMSUDHType=GSM_EnableVoice; break;
1831 case '5': /* SMS disables voice indicator */
1832 SMSUDHType=GSM_DisableVoice; break;
1834 case '6': /* SMS enables email indicator */
1835 SMSUDHType=GSM_EnableEmail; break;
1837 case '7': /* SMS disables email indicator */
1838 SMSUDHType=GSM_DisableEmail; break;
1840 case '8': /* SMS enables fax indicator */
1841 SMSUDHType=GSM_EnableFax; break;
1843 case '9': /* SMS disables fax indicator */
1844 SMSUDHType=GSM_DisableFax; break;
1846 case '-': /* SMS coding type */
1847 SMSCoding=GSM_Coding_Unicode; break;
1849 case '+': /* SMS ghost */
1850 SMSUDHType=GSM_VoidSMS; break;
1852 case '(': /* SMS hanging phone, when saved to Outbox */
1853 SMSUDHType=GSM_HangSMS; break;
1855 case ')': /* SMS showed incorrectly in phone */
1856 SMSUDHType=GSM_BugSMS; break;
1858 case 'v': /* Set validaty of SMS */
1859 SMSValidity = atoi(optarg); break;
1861 case 'd': /* delivery report */
1862 SMSType=GST_DR; break;
1864 case 's': /* Set replying via the same SMSC */
1865 SMSReply = true; break;
1867 case 'C': /* class Message */
1869 if (SMSUDHType!=GSM_NoUDH) {
1870 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1875 case '0': SMSClass = 0; break;
1876 case '1': SMSClass = 1; break;
1877 case '2': SMSClass = 2; break;
1878 case '3': SMSClass = 3; break;
1880 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1886 fprintf(stderr,_("Unknown option number %i\n"),argc);
1892 /* Get message text from stdin. */
1893 chars_read = fread(message_buffer, 1, input_len, stdin);
1895 if (chars_read == 0) {
1896 fprintf(stderr, _("Couldn't read from stdin!\n"));
1899 if (chars_read > input_len) {
1900 fprintf(stderr, _("Input too long!\n"));
1904 /* Null terminate. */
1905 message_buffer[chars_read] = 0x00;
1907 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1908 msgnum=MultiSMS.number;
1910 switch (SMSUDHType) {
1915 case GSM_EnableVoice:
1916 case GSM_DisableVoice:
1918 case GSM_DisableFax:
1919 case GSM_EnableEmail:
1920 case GSM_DisableEmail:
1921 fprintf(stdout,_("Warning: saving %ld chars\n"),(long)strlen(MultiSMS.SMS[0].MessageText));
1928 for (i=0;i<msgnum;i++) {
1929 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1931 MultiSMS.SMS[i].Class=SMSClass;
1932 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
1933 MultiSMS.SMS[i].Type=SMSType;
1934 MultiSMS.SMS[i].Validity=SMSValidity;
1937 /* Initialise the GSM interface. */
1940 MultiSMS.number=msgnum;
1941 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,false,false,false);
1946 int savesms(int argc, char *argv[])
1948 GSM_MultiSMSMessage MultiSMS;
1949 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1950 int input_len, chars_read,i,msgnum;
1952 int SMSClass=-1,SMSCenter=1;
1954 char SMSCNumber[100];
1955 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1956 GSM_UDH SMSUDHType=GSM_NoUDH;
1957 GSM_SMSMessageStatus SMSStatus;
1959 bool SMSReply=false;
1961 bool interactive=false;
1963 struct option options[] = {
1964 { "smscno", required_argument, NULL, '2'},
1965 { "smsc", required_argument, NULL, '1'},
1966 { "long", required_argument, NULL, '3'},
1967 { "enablevoice", no_argument, NULL, '4'},
1968 { "disablevoice", no_argument, NULL, '5'},
1969 { "enableemail", no_argument, NULL, '6'},
1970 { "disableemail", no_argument, NULL, '7'},
1971 { "enablefax", no_argument, NULL, '8'},
1972 { "disablefax", no_argument, NULL, '9'},
1973 { "unicode", no_argument, NULL, '-'},
1974 { "void", no_argument, NULL, '+'},
1975 { "hang", no_argument, NULL, '('},
1976 { "bug", no_argument, NULL, ')'},
1977 { "smsname", required_argument, NULL, '/'},
1983 SMSStatus=GSS_NOTSENTREAD;
1984 SMSFolder=GST_OUTBOX;
1986 input_len = GSM_MAX_SMS_LENGTH;
1993 while ((i = getopt_long(argc, argv, "risal:C:F:", options, NULL)) != -1) {
1996 case '1': /* SMSC number */
1998 strcpy(SMSCNumber,optarg);
2001 case '2': /* SMSC number index in phone memory */
2002 SMSCenter = atoi(optarg);
2004 if (SMSCenter < 1 || SMSCenter > 5) {
2005 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
2011 case '3': /* we send long message */
2012 SMSUDHType=GSM_ConcatenatedMessages;
2013 input_len = atoi(optarg);
2014 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
2015 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
2020 case '4': /* SMS enables voice indicator */
2021 SMSUDHType=GSM_EnableVoice; break;
2023 case '5': /* SMS disables voice indicator */
2024 SMSUDHType=GSM_DisableVoice; break;
2026 case '6': /* SMS enables email indicator */
2027 SMSUDHType=GSM_EnableEmail; break;
2029 case '7': /* SMS disables email indicator */
2030 SMSUDHType=GSM_DisableEmail; break;
2032 case '8': /* SMS enables fax indicator */
2033 SMSUDHType=GSM_EnableFax; break;
2035 case '9': /* SMS disables fax indicator */
2036 SMSUDHType=GSM_DisableFax; break;
2038 case '-': /* SMS coding type */
2039 SMSCoding=GSM_Coding_Unicode; break;
2041 case '+': /* SMS ghost */
2042 SMSUDHType=GSM_VoidSMS; break;
2044 case '(': /* SMS hanging phone, when saved to Outbox */
2045 SMSUDHType=GSM_HangSMS; break;
2047 case ')': /* SMS showed incorrectly in phone */
2048 SMSUDHType=GSM_BugSMS; break;
2050 case 'r': /* mark as read */
2051 SMSStatus = GSS_SENTREAD; break;
2053 case 'i': /* Save into Inbox */
2054 SMSFolder = GST_INBOX; break;
2056 case 's': /* Set replying via the same SMSC */
2057 SMSReply = true; break;
2059 case 'a': /* Ask before overwriting */
2060 interactive=true;break;
2062 case 'l': /* Specify location */
2063 SMSLocation = atoi(optarg); break;
2065 case '/': /* Name */
2066 strncpy(SMSName,optarg,25);break;
2068 case 'C': /* class Message */
2070 if (SMSUDHType!=GSM_NoUDH) {
2071 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
2076 case '0': SMSClass = 0; break;
2077 case '1': SMSClass = 1; break;
2078 case '2': SMSClass = 2; break;
2079 case '3': SMSClass = 3; break;
2081 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
2086 case 'F': /* save into folder n */
2087 SMSFolder = atoi(optarg);
2091 fprintf(stderr,_("Unknown option number %i\n"),argc);
2097 /* Get message text from stdin. */
2098 chars_read = fread(message_buffer, 1, input_len, stdin);
2100 if (chars_read == 0) {
2101 fprintf(stderr, _("Couldn't read from stdin!\n"));
2104 if (chars_read > input_len) {
2105 fprintf(stderr, _("Input too long!\n"));
2109 /* Null terminate. */
2110 message_buffer[chars_read] = 0x00;
2112 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
2113 msgnum=MultiSMS.number;
2115 switch (SMSUDHType) {
2120 case GSM_EnableVoice:
2121 case GSM_DisableVoice:
2123 case GSM_DisableFax:
2124 case GSM_EnableEmail:
2125 case GSM_DisableEmail:
2126 fprintf(stdout,_("Warning: saving %ld chars\n"),(long)strlen(MultiSMS.SMS[0].MessageText));
2133 for (i=0;i<msgnum;i++) {
2134 MultiSMS.SMS[i].Destination[0]=0;
2135 if (argc!=0) strcpy(MultiSMS.SMS[i].Destination,argv[0]);
2137 MultiSMS.SMS[i].Location=0;
2138 MultiSMS.SMS[i].Class=SMSClass;
2139 MultiSMS.SMS[i].MessageCenter.No=SMSCenter;
2140 strcpy(MultiSMS.SMS[i].MessageCenter.Number,SMSCNumber);
2141 MultiSMS.SMS[i].Status=SMSStatus;
2142 strcpy(MultiSMS.SMS[i].Name,SMSName);
2143 MultiSMS.SMS[i].folder=SMSFolder;
2144 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
2147 MultiSMS.SMS[0].Location=SMSLocation;
2149 /* Initialise the GSM interface. */
2152 MultiSMS.number=msgnum;
2153 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,interactive,false,false,false);
2158 /* Get SMSC number */
2160 int getsmsc(char *MessageCenterNumber)
2163 GSM_MessageCenter MessageCenter;
2165 MessageCenter.No=atoi(MessageCenterNumber);
2169 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
2171 fprintf(stdout, _("%d. SMS center ("),MessageCenter.No);
2173 if (!strcmp(MessageCenter.Name,""))
2174 fprintf(stdout,_("Set %d"),MessageCenter.No);
2175 else fprintf(stdout,_("%s"),MessageCenter.Name);
2177 fprintf(stdout,_(") number is "));
2179 if (!strcmp(MessageCenter.Number,"")) fprintf(stdout,_("not set\n"));
2180 else fprintf(stdout,_("%s\n"),MessageCenter.Number);
2182 fprintf(stdout,_("Default recipient number is "));
2184 if (!strcmp(MessageCenter.DefaultRecipient,""))
2185 fprintf(stdout,_("not set\n"));
2186 else fprintf(stdout,_("%s\n"),MessageCenter.DefaultRecipient);
2188 fprintf(stdout, _("Messages sent as "));
2190 switch (MessageCenter.Format) {
2191 case GSMF_Text :fprintf(stdout, _("Text"));break;
2192 case GSMF_Paging:fprintf(stdout, _("Paging"));break;
2193 case GSMF_Fax :fprintf(stdout, _("Fax"));break;
2195 case GSMF_UCI :fprintf(stdout, _("Email"));break;
2196 case GSMF_ERMES :fprintf(stdout, _("ERMES"));break;
2197 case GSMF_X400 :fprintf(stdout, _("X.400"));break;
2198 default :fprintf(stdout, _("Unknown"));
2203 fprintf(stdout, _("Message validity is "));
2205 switch (MessageCenter.Validity) {
2206 case GSMV_1_Hour :fprintf(stdout, _("1 hour"));break;
2207 case GSMV_6_Hours :fprintf(stdout, _("6 hours"));break;
2208 case GSMV_24_Hours:fprintf(stdout, _("24 hours"));break;
2209 case GSMV_72_Hours:fprintf(stdout, _("72 hours"));break;
2210 case GSMV_1_Week :fprintf(stdout, _("1 week"));break;
2211 case GSMV_Max_Time:fprintf(stdout, _("Maximum time"));break;
2212 default :fprintf(stdout, _("Unknown"));
2215 fprintf(stdout, "\n");
2219 fprintf(stdout, _("SMS center can not be found :-(\n"));
2226 /* Get SMS messages. */
2227 int getsms(int argc, char *argv[])
2230 GSM_SMSMessage message;
2231 GSM_WAPBookmark bookmark;
2232 char memory_type_string[20];
2233 int start_message, end_message, count, mode = 1;
2237 GSM_Ringtone ringtone;
2238 GSM_SMSFolders folders;
2240 int confirm = -1, i;
2243 /* Handle command line args that set type, start and end locations. */
2244 if (!GetMemoryTypeID(argv[2], &message.MemoryType))
2246 fprintf(stderr, _("Unknown memory type %s!\n"), argv[2]);
2249 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2251 for (i=0;i<64;i++) filename[i]=0;
2253 start_message = atoi(argv[3]);
2257 /* [end] can be only argv[4] */
2258 if (argv[4][0] == '-') { end_message = start_message; }
2259 else { end_message = atoi(argv[4]); }
2261 /* parse all options (beginning with '-' */
2262 while ((i = getopt(argc, argv, "f:")) != -1) {
2267 fprintf(stderr, _("Saving into file \"%s\"\n"), optarg);
2269 strncpy(filename, optarg, 64);
2270 if (strlen(optarg) > 63) {
2271 fprintf(stderr, _("Filename too long - will be truncated to 63 characters.\n"));
2274 filename[strlen(optarg)] = 0;
2287 end_message = start_message;
2290 /* Initialise the code for the GSM interface. */
2294 GSM->GetSMSFolders(&folders);
2297 /* Now retrieve the requested entries. */
2299 for (count = start_message; count <= end_message; count ++) {
2301 message.Location = count;
2303 error = GSM->GetSMSMessage(&message);
2309 switch (message.Type) {
2313 /* RTH FIXME: Test that out ! */
2314 fprintf(stdout, _("%d. Delivery Report "), message.MessageNumber);
2315 switch (message.Status)
2318 if (message.folder==0) fprintf(stdout, _("(read)\n")); //GST_INBOX
2319 else fprintf(stdout, _("(sent)\n"));
2321 case GSS_NOTSENTREAD:
2322 if (message.folder==0) fprintf(stdout, _("(unread)\n")); //GST_INBOX
2323 else fprintf(stdout, _("(not sent)\n"));
2326 fprintf(stdout, _("(not known :-()\n"));
2329 fprintf(stdout, _("(template)\n"));
2332 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2336 fprintf(stdout, _("Sending date/time : %s %02d/%02d/%02d %d:%02d:%02d "), \
2337 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2338 message.Time.Day, message.Time.Month, message.Time.Year, \
2339 message.Time.Hour, message.Time.Minute, message.Time.Second);
2341 if (message.Time.Timezone) {
2342 if (message.Time.Timezone > 0)
2343 fprintf(stdout,_("+%02d00"), message.Time.Timezone);
2345 fprintf(stdout,_("%02d00"), message.Time.Timezone);
2348 fprintf(stdout, "\n");
2350 fprintf(stdout, _("Response date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2351 DayOfWeek(message.SMSCTime.Year, message.SMSCTime.Month, message.SMSCTime.Day), \
2352 message.SMSCTime.Day, message.SMSCTime.Month, message.SMSCTime.Year, \
2353 message.SMSCTime.Hour, message.SMSCTime.Minute, message.SMSCTime.Second);
2355 if (message.SMSCTime.Timezone) {
2356 if (message.SMSCTime.Timezone > 0)
2357 fprintf(stdout,_("+%02d00"),message.SMSCTime.Timezone);
2359 fprintf(stdout,_("%02d00"),message.SMSCTime.Timezone);
2362 fprintf(stdout, "\n");
2364 fprintf(stdout, _("Receiver: %s Msg Center: %s\n"), message.Sender, message.MessageCenter.Number);
2365 fprintf(stdout, _("Text: %s\n\n"), message.MessageText);
2370 fprintf(stdout, _("%d. %s Message "), message.MessageNumber,
2371 folders.Folder[message.folder].Name);
2373 switch (message.Status)
2376 if (message.folder==0) fprintf(stdout, _("(read)\n")); //GST_INBOX
2377 else fprintf(stdout, _("(sent)\n"));
2379 case GSS_NOTSENTREAD:
2380 if (message.folder==0) fprintf(stdout, _("(unread)\n")); //GST_INBOX
2381 else fprintf(stdout, _("(not sent)\n"));
2384 fprintf(stdout, _("(not known :-()\n"));
2387 fprintf(stdout, _("(template)\n"));
2390 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2394 /* RTH FIXME: date for other status ok ? */
2395 if (message.SMSData) {
2397 fprintf(stdout, _("Date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2398 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2399 message.Time.Day, message.Time.Month, message.Time.Year, \
2400 message.Time.Hour, message.Time.Minute, message.Time.Second);
2402 if (message.Time.Timezone) {
2403 if (message.Time.Timezone > 0)
2404 fprintf(stdout,_("+%02d00"),message.Time.Timezone);
2406 fprintf(stdout,_("%02d00"),message.Time.Timezone);
2409 fprintf(stdout, "\n");
2411 fprintf(stdout, _("Msg Center: %s "), message.MessageCenter.Number);
2413 if (message.ReplyViaSameSMSC)
2414 fprintf(stdout, _("(centre set for reply) "));
2417 if (strcmp(message.Sender,"")) {
2418 if (message.folder==1) { //GST_OUTBOX
2419 fprintf(stdout, _("Recipient: %s"),message.Sender);
2421 fprintf(stdout, _("Sender: %s"),message.Sender);
2425 if (strcmp(message.Sender,"") || message.folder==0)
2426 fprintf(stdout, "\n");
2428 switch (message.UDHType) {
2432 /* put bitmap into bitmap structure */
2433 switch (GSM_ReadBitmap(&message, &bitmap)) {
2434 case GE_INVALIDIMAGESIZE:
2435 fprintf(stdout,_("Image size not supported\n"));
2438 fprintf(stdout, _("GSM operator logo for %s (%s) network.\n"), bitmap.netcode, GSM_GetNetworkName(bitmap.netcode));
2440 GSM_PrintBitmap(&bitmap);
2442 if (filename[0]!=0) {
2443 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2448 fprintf(stdout,_("Error reading image\n"));
2453 if (message.folder==0) { //GST_INBOX
2454 if (!strcmp(message.Sender, "+998000005") &&
2455 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2456 message.Time.Day==27 &&
2457 message.Time.Month==7 &&
2458 message.Time.Year==99 &&
2459 message.Time.Hour==0 &&
2460 message.Time.Minute==10 &&
2461 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2463 /* Is it changed in next versions ? Or what ? */
2464 if (!strcmp(message.Sender, "+998000002") ||
2465 !strcmp(message.Sender, "+998000003") ||
2466 !strcmp(message.Sender, "+998000004")) fprintf(stdout, _("Saved by Operator Logo Uploader by Thomas Kessler\n"));
2468 if (!strcmp(message.Sender, "+8861234567890") &&
2469 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2471 if (!strncmp(message.Sender, "OpLogo",6) &&
2472 strlen(message.Sender)==11)
2473 fprintf(stdout, _("Saved by gnokii\n"));
2478 case GSM_WAPBookmarkUDH:
2480 /* put bookmark into bookmark structure */
2481 switch (GSM_ReadWAPBookmark(&message, &bookmark)) {
2483 fprintf(stdout, ("WAP Bookmark\n"));
2485 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
2487 if (bookmark.title[0]==0)
2488 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
2490 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
2494 fprintf(stdout,_("Error reading WAP Bookmark\n"));
2499 if (!strcmp(message.Sender, "WAPBookmark"))
2500 fprintf(stdout, _("Saved by gnokii\n"));
2505 case GSM_CallerIDLogo:
2507 /* put bitmap into bitmap structure */
2508 switch (GSM_ReadBitmap(&message, &bitmap)) {
2509 case GE_INVALIDIMAGESIZE:
2510 fprintf(stdout,_("Image size not supported\n"));
2513 fprintf(stdout, ("Caller Logo\n"));
2515 GSM_PrintBitmap(&bitmap);
2517 if (filename[0]!=0) {
2518 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2523 fprintf(stdout,_("Error reading image\n"));
2528 if (message.folder==0) { //GST_INBOX
2529 if (!strcmp(message.Sender, "+998000005") &&
2530 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2531 message.Time.Day==27 &&
2532 message.Time.Month==7 &&
2533 message.Time.Year==99 &&
2534 message.Time.Hour==0 &&
2535 message.Time.Minute==10 &&
2536 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2538 if (!strcmp(message.Sender, "+8861234567890") &&
2539 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2541 if (!strcmp(message.Sender, "GroupLogo"))
2542 fprintf(stdout, _("Saved by gnokii\n"));
2547 case GSM_ProfileUDH:
2548 fprintf(stdout, ("Profile SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2551 case GSM_WAPBookmarkUDHLong:
2552 fprintf(stdout, ("WAP Bookmark, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2555 case GSM_WAPSettingsUDH:
2556 fprintf(stdout, ("WAP Settings, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2559 case GSM_RingtoneUDH:
2561 /* put ringtone into ringtone structure */
2562 switch (GSM_ReadRingtone(&message, &ringtone)) {
2565 fprintf(stdout, ("Ringtone \"%s\"\n"),ringtone.name);
2567 while (confirm < 0) {
2568 fprintf(stderr, _("Do you want to play it ? (yes/no) "));
2569 GetLine(stdin, ans, 7);
2570 if (!strcmp(ans, "yes")) confirm = 1;
2571 if (!strcmp(ans, "no")) confirm = 0;
2574 if (confirm==1) GSM_PlayRingtoneOnConsole(&ringtone);
2576 if (filename[0]!=0) GSM_SaveRingtoneFileOnConsole(filename, &ringtone);
2581 fprintf(stdout,_("Gnokii can't read this ringtone - there is probably error inside\n"));
2587 case GSM_CalendarNoteUDH:
2588 fprintf(stdout, ("Calendar note SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2589 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2590 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2593 case GSM_ConcatenatedMessages:
2594 fprintf(stdout, _("Linked (%d/%d)\nText:\n%s\n\n"),message.UDH[5],message.UDH[4], message.MessageText);
2595 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2598 case GSM_EnableVoice:
2599 fprintf(stdout, _("Enables voice indicator\nText:\n%s\n\n"), message.MessageText);
2600 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2603 case GSM_DisableVoice:
2604 fprintf(stdout, _("Disables voice indicator\nText:\n%s\n\n"), message.MessageText);
2605 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2609 fprintf(stdout, _("Enables fax indicator\nText:\n%s\n\n"), message.MessageText);
2610 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2613 case GSM_DisableFax:
2614 fprintf(stdout, _("Disables fax indicator\nText:\n%s\n\n"), message.MessageText);
2615 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2618 case GSM_EnableEmail:
2619 fprintf(stdout, _("Enables email indicator\nText:\n%s\n\n"), message.MessageText);
2620 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2623 case GSM_DisableEmail:
2624 fprintf(stdout, _("Disables email indicator\nText:\n%s\n\n"), message.MessageText);
2625 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2629 fprintf(stdout, _("Void SMS\nText:\n%s\n\n"), message.MessageText);
2630 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2634 if (message.Coding!=GSM_Coding_8bit) {
2635 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2636 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2638 fprintf(stdout, _("Message cannot be displayed here\n")); // like in phone :-)
2642 default: //GSM_UnknownUDH and other
2643 fprintf(stderr, _("Unknown\n"));
2649 fprintf(stdout,_("Unknown SMS type. Report it\n"));
2655 case GE_NOTIMPLEMENTED:
2657 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2661 case GE_INVALIDSMSLOCATION:
2663 fprintf(stderr, _("Invalid location: %s %d\n"), memory_type_string, count);
2667 case GE_EMPTYSMSLOCATION:
2669 fprintf(stderr, _("SMS location %s %d empty.\n"), memory_type_string, count);
2675 fprintf(stderr, _("No access to %s memory.\n"), memory_type_string);
2681 fprintf(stderr, _("GetSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2690 int getsmsstatus(int argc, char *argv[])
2692 GSM_SMSStatus SMSStatus;
2693 GSM_SMSFolders folders;
2699 /* Initialise the code for the GSM interface. */
2702 error = GSM->GetSMSStatus(&SMSStatus);
2703 if (error!=GE_NONE) return error;
2705 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"),SMSStatus.UnRead, SMSStatus.Number);
2707 error=GSM->GetSMSFolders(&folders);
2708 if (error!=GE_NONE) return error;
2710 /* For not 7110 compatible phones we have to read all SMS and prepare sms table */
2711 if( GetModelFeature (FN_SMS)!=F_SMS71 )
2715 if (j==SMSStatus.Number) break;
2717 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
2718 SMSStatus.foldertable[j].smsnum=i;
2720 /* We set such folders ID like in 7110 compatible phones */
2721 if (SMS.Status==GSS_NOTSENTREAD && SMS.folder==0) //GST_INBOX
2722 SMSStatus.foldertable[j].folder=0;
2724 switch (SMS.folder) {
2726 SMSStatus.foldertable[j].folder=GST_7110_INBOX;
2729 SMSStatus.foldertable[j].folder=GST_7110_OUTBOX;
2739 printf("0.Unread : ");
2740 for(j=0; j<SMSStatus.Number; j++)
2742 if (SMSStatus.foldertable[j].folder == 0)
2743 printf("%d ",SMSStatus.foldertable[j].smsnum);
2747 for (i=0;i<folders.number;i++) {
2748 fprintf(stdout,_("%d.%-15s: "),i+1,folders.Folder[i].Name);
2749 for(j=0; j<SMSStatus.Number; j++)
2751 if ( SMSStatus.foldertable[j].folder / 8 == i+1)
2752 printf("%d ",SMSStatus.foldertable[j].smsnum);
2762 /* Delete SMS messages. */
2763 int deletesms(int argc, char *argv[])
2766 GSM_SMSMessage message;
2767 char memory_type_string[20];
2768 int start_message, end_message, count;
2771 /* Handle command line args that set type, start and end locations. */
2772 if (!GetMemoryTypeID(argv[0], &message.MemoryType))
2774 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
2777 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2779 start_message = atoi (argv[1]);
2780 if (argc > 2) end_message = atoi (argv[2]);
2781 else end_message = start_message;
2783 /* Initialise the code for the GSM interface. */
2787 /* Now delete the requested entries. */
2789 for (count = start_message; count <= end_message; count ++) {
2791 message.Location = count;
2793 error = GSM->DeleteSMSMessage(&message);
2795 if (error == GE_NONE)
2796 fprintf(stdout, _("Deleted SMS %s %d\n"), memory_type_string, count);
2798 if (error == GE_NOTIMPLEMENTED) {
2799 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2803 fprintf(stdout, _("DeleteSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2812 static volatile bool bshutdown = false;
2814 /* SIGINT signal handler. */
2816 static void interrupted(int sig)
2819 signal(sig, SIG_IGN);
2826 /* In this mode we get the code from the keyboard and send it to the mobile
2829 int entersecuritycode(char *type)
2832 GSM_SecurityCode SecurityCode;
2834 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2835 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2836 else if (!strcmp(type,"PIN2"))SecurityCode.Type=GSCT_Pin2;
2837 else if (!strcmp(type,"PUK2"))SecurityCode.Type=GSCT_Puk2;
2839 // FIXME: Entering of SecurityCode does not work :-(
2840 // else if (!strcmp(type,"SecurityCode"))
2841 // SecurityCode.Type=GSCT_SecurityCode;
2844 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2849 printf("Enter your code: ");
2850 gets(SecurityCode.Code);
2852 strcpy(SecurityCode.Code,getpass(_("Enter your code: ")));
2857 test = GSM->EnterSecurityCode(SecurityCode);
2859 fprintf(stdout,_("Code OK !\n"));
2861 fprintf(stderr,_("%s\n"),print_error(test));
2868 int getsecuritycodestatus(void)
2875 if (GSM->GetSecurityCodeStatus(&Status) == GE_NONE) {
2877 fprintf(stdout, _("Security code status: "));
2880 case GSCT_SecurityCode:fprintf(stdout, _("waiting for Security Code.\n"));break;
2881 case GSCT_Pin: fprintf(stdout, _("waiting for PIN.\n")); break;
2882 case GSCT_Pin2: fprintf(stdout, _("waiting for PIN2.\n")); break;
2883 case GSCT_Puk: fprintf(stdout, _("waiting for PUK.\n")); break;
2884 case GSCT_Puk2: fprintf(stdout, _("waiting for PUK2.\n")); break;
2885 case GSCT_None: fprintf(stdout, _("nothing to enter.\n")); break;
2886 default: fprintf(stdout, _("Unknown!\n"));
2895 int getsecuritycode(char *type)
2898 GSM_SecurityCode SecurityCode;
2901 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2902 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2903 else if (!strcmp(type,"PIN2")) SecurityCode.Type=GSCT_Pin2;
2904 else if (!strcmp(type,"PUK2")) SecurityCode.Type=GSCT_Puk2;
2905 else if (!strcmp(type,"SecurityCode"))SecurityCode.Type=GSCT_SecurityCode;
2907 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2913 error=GSM->GetSecurityCode(&SecurityCode);
2916 case GE_INVALIDSECURITYCODE:
2917 fprintf(stdout, _("Error: getting "));
2918 switch (SecurityCode.Type) {
2919 case GSCT_SecurityCode:fprintf(stdout, _("security code"));break;
2920 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2921 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2922 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2923 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2926 fprintf(stdout, _(" not allowed\n"));
2929 switch (SecurityCode.Type) {
2930 case GSCT_SecurityCode:fprintf(stdout, _("Security code"));break;
2931 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2932 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2933 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2934 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2937 fprintf(stdout, _(" is %s\n"),SecurityCode.Code);
2940 fprintf(stderr, _("%s\n"),print_error(error));
2951 /* Voice dialing mode. */
2953 int dialvoice(char *Number)
2957 if (GSM->DialVoice(Number)!=GE_NONE) fprintf(stdout,_("Error!\n"));
2964 #endif /* UCLINUX */
2967 static int cancelcall(void)
2971 if (GSM->CancelCall()!=GE_NONE) fprintf(stdout,_("Error!\n"));
2980 int savelogo(int argc, char *argv[])
2983 GSM_NetworkInfo NetworkInfo;
2984 GSM_MultiSMSMessage MultiSMS;
2986 /* Operator logos will be saved with this number */
2987 char oplogonumber[]={'O','p','L','o','g','o',
2988 '0','0','0','0','0', /* MMC+MNC */
2992 bool UnicodeText=false;
2994 /* The first argument is the type of the logo. */
2995 if (!strcmp(argv[0], "op")) {
2996 fprintf(stdout, _("Saving operator logo.\n"));
2997 } else if (!strcmp(argv[0], "caller")) {
2998 fprintf(stdout, _("Saving caller line identification logo.\n"));
2999 } else if (!strcmp(argv[0], "startup")) {
3000 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
3002 } else if (!strcmp(argv[0], "7110startup")) {
3003 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
3005 } else if (!strcmp(argv[0], "6210startup")) {
3006 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
3008 } else if (!strcmp(argv[0], "7110op")) {
3009 fprintf(stderr, _("It isn't possible to save big operator logos!\n"));
3011 } else if (!strcmp(argv[0], "picture")) {
3012 fprintf(stderr, _("Saving picture image.\n"));
3013 } else if (!strcmp(argv[0], "screensaver")) {
3014 fprintf(stderr, _("Saving screen saver.\n"));
3016 fprintf(stderr, _("You should specify what kind of logo to save!\n"));
3020 /* The second argument is the bitmap file. */
3021 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return -1;
3023 /* Initialise the GSM interface. */
3026 /* We check optional parameters from 2'rd */
3029 if (!strcmp(argv[0], "op")) {
3030 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3032 /* The third argument, if present, is the Network code of the operator.
3033 * Network code is in this format: "xxx yy" */
3035 strcpy(bitmap.netcode, argv[2]);
3037 fprintf(stdout, _("Operator code: %s\n"), argv[2]);
3039 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
3040 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3047 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3049 bitmap.type=GSM_OperatorLogo;
3051 /* Put bitmap into SMS structure */
3052 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
3054 oplogonumber[6]=bitmap.netcode[0];
3055 oplogonumber[7]=bitmap.netcode[1];
3056 oplogonumber[8]=bitmap.netcode[2];
3057 oplogonumber[9]=bitmap.netcode[4];
3058 oplogonumber[10]=bitmap.netcode[5];
3059 for(i=0;i<MultiSMS.number;i++)
3060 strcpy(MultiSMS.SMS[i].Destination,oplogonumber);
3062 if (!strcmp(argv[0], "caller")) {
3063 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3065 bitmap.type=GSM_CallerLogo;
3067 /* Put bitmap into SMS structure */
3068 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
3070 for(i=0;i<MultiSMS.number;i++)
3071 strcpy(MultiSMS.SMS[i].Destination,"GroupLogo");
3073 if (!strcmp(argv[0], "screensaver")) {
3074 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3079 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3081 /* Put bitmap into SMS structure */
3082 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,true,UnicodeText);
3084 for(i=0;i<MultiSMS.number;i++)
3085 strcpy(MultiSMS.SMS[i].Destination,"ScreenSaver");
3087 if (!strcmp(argv[0], "picture")) {
3088 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3091 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3096 if (strlen(argv[2])>121) {
3097 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[2]);
3100 strcpy(bitmap.text,argv[2]);
3103 /* Put bitmap into SMS structure */
3104 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,UnicodeText);
3106 for(i=0;i<MultiSMS.number;i++)
3107 strcpy(MultiSMS.SMS[i].Destination,"Picture");
3110 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,true,false,false);
3115 /* The following function allows to send logos using SMS */
3116 int sendlogo(int argc, char *argv[])
3119 GSM_NetworkInfo NetworkInfo;
3120 GSM_MultiSMSMessage MultiSMS;
3124 bool UnicodeText=false;
3125 bool ScreenSaver=false;
3127 /* The first argument is the type of the logo. */
3128 if (!strcmp(argv[0], "op")) {
3129 fprintf(stdout, _("Sending operator logo.\n"));
3130 } else if (!strcmp(argv[0], "caller")) {
3131 fprintf(stdout, _("Sending caller line identification logo.\n"));
3132 } else if (!strcmp(argv[0], "picture")) {
3133 fprintf(stdout, _("Sending picture image.\n"));
3134 } else if (!strcmp(argv[0], "screensaver")) {
3135 fprintf(stdout, _("Sending screen saver.\n"));
3136 } else if (!strcmp(argv[0], "startup")) {
3137 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3139 } else if (!strcmp(argv[0], "7110startup")) {
3140 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3142 } else if (!strcmp(argv[0], "6210startup")) {
3143 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3145 } else if (!strcmp(argv[0], "7110op")) {
3146 fprintf(stderr, _("It isn't possible to send big operator logos!\n"));
3149 fprintf(stderr, _("You should specify what kind of logo to send!\n"));
3153 /* The third argument is the bitmap file. */
3154 if (GSM_ReadBitmapFileOnConsole(argv[2], &bitmap)!=GE_NONE) return -1;
3156 /* Initialise the GSM interface. */
3161 if (!strcmp(argv[0], "op")) {
3162 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3164 /* The third argument, if present, is the Network code of the operator.
3165 * Network code is in this format: "xxx yy" */
3167 strcpy(bitmap.netcode, argv[3]);
3169 fprintf(stdout, _("Operator code: %s\n"), argv[3]);
3171 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
3172 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3179 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3181 bitmap.type=GSM_OperatorLogo;
3183 if (!strcmp(argv[0], "caller")) {
3184 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3186 bitmap.type=GSM_CallerLogo;
3188 if (!strcmp(argv[0], "screensaver")) {
3189 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3194 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3198 if (!strcmp(argv[0], "picture")) {
3199 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3202 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3207 if (strlen(argv[3])>121) {
3208 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[3]);
3211 strcpy(bitmap.text,argv[3]);
3215 /* Put bitmap into SMS structure */
3216 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,ScreenSaver,UnicodeText);
3218 /* The second argument is the destination, ie the phone number of recipient. */
3219 for(i=0;i<MultiSMS.number;i++)
3220 strcpy(MultiSMS.SMS[i].Destination,argv[1]);
3222 GSM_SendMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,true,false,false);
3227 /* Getting logos. */
3229 int getlogo(int argc, char *argv[])
3235 bitmap.type=GSM_None;
3237 if (!strcmp(argv[0],"7110op"))
3238 bitmap.type=GSM_7110OperatorLogo;
3240 if (!strcmp(argv[0],"op"))
3241 bitmap.type=GSM_OperatorLogo;
3243 if (!strcmp(argv[0],"caller")) {
3244 /* There is caller group number missing in argument list. */
3247 if ((num<1)||(num>9)) num=1;
3254 bitmap.type=GSM_CallerLogo;
3257 if (!strcmp(argv[0],"picture")) {
3258 /* There is a number missing in argument list. */
3260 if (strlen(argv[2])==2) {
3261 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3272 bitmap.type=GSM_PictureImage;
3275 if (!strcmp(argv[0],"startup"))
3276 bitmap.type=GSM_StartupLogo;
3278 if (!strcmp(argv[0],"7110startup"))
3279 bitmap.type=GSM_7110StartupLogo;
3281 if (!strcmp(argv[0],"6210startup"))
3282 bitmap.type=GSM_6210StartupLogo;
3284 if (!strcmp(argv[0],"dealer"))
3285 bitmap.type=GSM_DealerNoteText;
3287 if (!strcmp(argv[0],"text"))
3288 bitmap.type=GSM_WelcomeNoteText;
3290 if (bitmap.type!=GSM_None) {
3294 fprintf(stdout, _("Getting Logo\n"));
3296 error=GSM->GetBitmap(&bitmap);
3303 if (bitmap.type==GSM_DealerNoteText) fprintf(stdout, _("Dealer welcome note "));
3304 if (bitmap.type==GSM_WelcomeNoteText) fprintf(stdout, _("Welcome note "));
3305 if (bitmap.type==GSM_DealerNoteText || bitmap.type==GSM_WelcomeNoteText)
3307 if (bitmap.text[0]!=0)
3309 fprintf(stdout, _("currently set to \"%s\"\n"), bitmap.text);
3311 fprintf(stdout, _("currently empty\n"));
3315 if (bitmap.width!=0)
3317 if (bitmap.type==GSM_OperatorLogo || bitmap.type==GSM_7110OperatorLogo)
3319 fprintf(stdout,"Operator logo for %s (%s) network got succesfully\n",bitmap.netcode,GSM_GetNetworkName(bitmap.netcode));
3321 if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_7110StartupLogo || bitmap.type==GSM_6210StartupLogo)
3323 fprintf(stdout,"Startup logo got successfully\n");
3325 if (bitmap.type==GSM_CallerLogo)
3327 fprintf(stdout,"Caller logo got successfully\n");
3329 if (bitmap.type==GSM_PictureImage)
3331 fprintf(stdout,"Picture Image got successfully");
3332 if (strcmp(bitmap.text,""))
3333 fprintf(stdout,_(", text \"%s\""),bitmap.text);
3334 if (strcmp(bitmap.Sender,""))
3335 fprintf(stdout,_(", sender \"%s\""),bitmap.Sender);
3336 fprintf(stdout,"\n");
3340 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
3344 fprintf(stdout,"Your phone doesn't have logo uploaded !\n");
3349 case GE_NOTIMPLEMENTED:
3350 fprintf(stderr, _("Function not implemented !\n"));
3352 case GE_NOTSUPPORTED:
3353 fprintf(stderr, _("This kind of logo is not supported !\n"));
3356 fprintf(stderr, _("Error getting logo (wrong location ?) !\n"));
3361 fprintf(stderr, _("What kind of logo do you want to get ?\n"));
3368 /* Setting logos. */
3370 int setlogo(int argc, char *argv[])
3373 GSM_Bitmap bitmap,oldbit;
3374 GSM_NetworkInfo NetworkInfo;
3385 if (!strcmp(argv[0],"text") || !strcmp(argv[0],"dealer"))
3387 if (!strcmp(argv[0],"text")) bitmap.type=GSM_WelcomeNoteText;
3388 else bitmap.type=GSM_DealerNoteText;
3389 bitmap.text[0]=0x00;
3390 if (argc>1) strncpy(bitmap.text,argv[1],255);
3393 if (!strcmp(argv[0],"op") || !strcmp(argv[0],"startup") || !strcmp(argv[0],"caller") ||
3394 !strcmp(argv[0],"7110op") || !strcmp(argv[0],"6210startup") || !strcmp(argv[0],"7110startup") ||
3395 !strcmp(argv[0],"picture"))
3399 if (!strcmp(argv[0],"startup"))
3401 bitmap.type=GSM_StartupLogo;
3404 bitmap.size=GSM_GetBitmapSize(&bitmap);
3406 if (num>=1 && num<=3) {
3409 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3414 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
3417 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3422 if (!strcmp(argv[0],"op"))
3424 if (bitmap.type!=GSM_OperatorLogo || argc<3)
3426 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3428 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
3431 strncpy(bitmap.netcode,argv[2],7);
3432 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3434 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3439 if (!strcmp(argv[0],"7110op"))
3441 if (bitmap.type!=GSM_7110OperatorLogo || argc<3)
3443 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3445 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
3448 strncpy(bitmap.netcode,argv[2],7);
3449 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3451 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3456 if (!strcmp(argv[0],"picture"))
3458 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3462 if (strlen(argv[2])==2) {
3463 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3473 strncpy(bitmap.text,argv[3],121);
3474 strcpy(bitmap.Sender,"\0");
3476 strncpy(bitmap.Sender,argv[4],GSM_MAX_SENDER_LENGTH);
3478 if (!strcmp(argv[0],"7110startup"))
3480 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
3482 if (!strcmp(argv[0],"6210startup"))
3484 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
3486 if (!strcmp(argv[0],"caller"))
3488 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3492 if ((num<0)||(num>9)) num=0;
3498 oldbit.type=GSM_CallerLogo;
3499 oldbit.number=bitmap.number;
3500 if (GSM->GetBitmap(&oldbit)==GE_NONE)
3502 /* We have to get the old name and ringtone!! */
3503 bitmap.ringtone=oldbit.ringtone;
3504 strncpy(bitmap.text,oldbit.text,255);
3506 if (argc>3) strncpy(bitmap.text,argv[3],255);
3508 fprintf(stdout, _("Setting Logo.\n"));
3511 /* FIX ME: is it possible to permanently remove op logo ? */
3512 if (!strcmp(argv[0],"op"))
3514 bitmap.type=GSM_OperatorLogo;
3515 strncpy(bitmap.netcode,"000 00",7);
3518 bitmap.size=GSM_GetBitmapSize(&bitmap);
3519 GSM_ClearBitmap(&bitmap);
3521 if (!strcmp(argv[0],"7110op"))
3523 bitmap.type=GSM_7110OperatorLogo;
3524 strncpy(bitmap.netcode,"000 00",7);
3527 bitmap.size=GSM_GetBitmapSize(&bitmap);
3528 GSM_ClearBitmap(&bitmap);
3530 /* FIX ME: how to remove startup and group logos ? */
3531 fprintf(stdout, _("Removing Logo.\n"));
3535 fprintf(stderr, _("What kind of logo do you want to set ?\n"));
3541 while (GSM->GetModel(model) != GE_NONE)
3544 /* For Nokia 6110/6130/6150 we use different method of uploading.
3545 Phone will display menu, when received it */
3546 if (!strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") || !strcmp(model,"NSM-1"))
3548 if (!strcmp(argv[0],"caller") && argc<3)
3550 if (!strcmp(argv[0],"op") && argc<3)
3554 error=GSM->SetBitmap(&bitmap);
3558 case GE_NONE: oldbit.type=bitmap.type;
3559 oldbit.number=bitmap.number;
3560 if (GSM->GetBitmap(&oldbit)==GE_NONE) {
3561 if (bitmap.type==GSM_WelcomeNoteText ||
3562 bitmap.type==GSM_DealerNoteText) {
3563 if (strcmp(bitmap.text,oldbit.text)) {
3564 fprintf(stderr, _("Error setting"));
3565 if (bitmap.type==GSM_DealerNoteText) fprintf(stderr, _(" dealer"));
3566 fprintf(stderr, _(" welcome note - "));
3568 /* I know, it looks horrible, but... */
3569 /* I set it to the short string - if it won't be set */
3570 /* it means, PIN is required. If it will be correct, previous */
3571 /* (user) text was too long */
3573 /* Without it, I could have such thing: */
3574 /* user set text to very short string (for example, "Marcin") */
3575 /* then enable phone without PIN and try to set it to the very long (too long for phone) */
3576 /* string (which start with "Marcin"). If we compare them as only length different, we could think, */
3577 /* that phone accepts strings 6 chars length only (length of "Marcin") */
3578 /* When we make it correct, we don't have this mistake */
3580 strcpy(oldbit.text,"!\0");
3581 GSM->SetBitmap(&oldbit);
3582 GSM->GetBitmap(&oldbit);
3583 if (oldbit.text[0]!='!') {
3584 fprintf(stderr, _("SIM card and PIN is required\n"));
3586 GSM->SetBitmap(&bitmap);
3587 GSM->GetBitmap(&oldbit);
3588 fprintf(stderr, _("too long, truncated to \"%s\" (length %ld)\n"),oldbit.text,(long)strlen(oldbit.text));
3593 if (bitmap.type==GSM_StartupLogo) {
3594 for (i=0;i<oldbit.size;i++) {
3595 if (oldbit.bitmap[i]!=bitmap.bitmap[i]) {
3596 fprintf(stderr, _("Error setting startup logo - SIM card and PIN is required\n"));
3604 if (ok) fprintf(stdout, _("Done.\n"));
3606 case GE_NOTIMPLEMENTED:fprintf(stderr, _("Function not implemented.\n"));
3608 case GE_NOTSUPPORTED:fprintf(stderr, _("This kind of logo is not supported.\n"));
3610 default:fprintf(stderr, _("Error (wrong location ?) !\n"));
3619 /* Calendar notes receiving. */
3621 int getcalendarnote(int argc, char *argv[])
3623 GSM_CalendarNote CalendarNote;
3624 GSM_NotesInfo NotesInfo;
3630 bool was_note=false;
3631 char z_text[MAX_CALENDAR_TEXT_LENGTH+11];
3633 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
3641 now=localtime(&nowh);
3643 Date.Year = now->tm_year;
3645 /* I have 100 (for 2000) Year now :-) */
3646 if (Date.Year>99 && Date.Year<1900) {
3647 Date.Year=Date.Year+1900;
3650 start=atoi(argv[0]);
3655 if (!strcmp(argv[argc-1],"-v10")) {
3658 if (!strcmp(argv[argc-1],"-v30")) {
3667 if (!strcmp(argv[argc-1],"-v10")) {
3670 if (!strcmp(argv[argc-1],"-v30")) {
3682 while (GSM->GetModel(model) != GE_NONE)
3685 if (!strcmp(argv[0],"-s") || !strcmp(argv[0],"--short"))
3687 else if (!isdigit(argv[0][0])) {
3692 error=GSM->GetCalendarNotesInfo(&NotesInfo);
3693 if ( error == GE_NONE ) {
3694 if( NotesInfo.HowMany == 0 ) {
3695 fprintf(stderr, _("Sorry! No Calendar Notes present on phone.\n"));
3696 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3699 fprintf(stdout, _(" CALENDAR NOTES INFO \n"));
3700 fprintf(stdout, _("---------------------\n"));
3701 fprintf(stdout, _("How Many Locations :%d\n"), NotesInfo.HowMany);
3703 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3704 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3705 fprintf(stdout, _("Locations are :\n"));
3706 for(i=0;i<NotesInfo.HowMany;i++)
3707 fprintf(stdout, _("%4d) %4d\n"), i+1, NotesInfo.Location[i]);
3711 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3712 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3713 fprintf(stderr, _("Can't read Notes Infos from phone.\n"));
3714 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3718 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) {
3720 NotesInfo.HowMany=200;
3721 for (i=0;i<200;i++) {
3722 NotesInfo.Location[i]=i+1;
3726 if( vInfo && stop!=(-1) && error==GE_NONE )
3728 /* Info datas (for 7110 and comp.) */
3729 fprintf(stdout, _(" CALENDAR NOTES SUMMARY INFORMATION \n"));
3730 fprintf(stdout, _(" ==================================\n"));
3731 if (GetModelFeature (FN_CALENDAR)==F_CAL71) {
3732 fprintf(stdout, _("Calendar notes present on phone: %d\n"), NotesInfo.HowMany);
3733 fprintf(stdout, _("Locations are :\n"));
3735 fprintf(stdout, "----------------------------------------------------------------------------\n");
3736 fprintf(stdout,_(" Loc Phys Type Summary description Dt start Alarm Recurs\n") );
3737 fprintf(stdout, "----------------------------------------------------------------------------\n");
3739 for(i=0;i<NotesInfo.HowMany;i++)
3741 /* very short format ... */
3743 fprintf(stdout, _("%4d) %4d\n"), i, NotesInfo.Location[i]);
3745 CalendarNote.Location=i+1;
3746 CalendarNote.ReadNotesInfo=false;
3748 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3751 switch (CalendarNote.Type) {
3752 case GCN_REMINDER:strcpy(z_type, "REMIND"); break;
3753 case GCN_CALL: strcpy(z_type, "CALL"); break;
3754 case GCN_MEETING: strcpy(z_type, "MEETING"); break;
3755 case GCN_BIRTHDAY:strcpy(z_type, "BDAY"); break;
3756 default: strcpy(z_type, "UNKNOWN"); break;
3759 if( CalendarNote.Recurrance ) {
3760 sprintf( z_recur,"%d ", CalendarNote.Recurrance/24 );
3761 strcat( z_recur, CalendarNote.Recurrance == 1 ? "day" : "days" );
3764 strcpy( z_recur, "No" );
3768 if( CalendarNote.Type == GCN_CALL )
3769 sprintf(z_text, "\"%s\"", CalendarNote.Phone );
3771 if (CalendarNote.Text[0]!=0)
3772 sprintf(z_text, "\"%s\"", CalendarNote.Text );
3774 if(CalendarNote.Type == GCN_BIRTHDAY) {
3776 i_age = Date.Year - CalendarNote.Time.Year;
3777 sprintf(z_text, "\"%s (%d %s)\"", CalendarNote.Text,
3778 i_age, (i_age==1)?"year":"years");
3779 strcpy( z_recur, "-" );
3780 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3782 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3783 i+1,NotesInfo.Location[i], z_type, z_text,
3784 CalendarNote.Time.Year,
3785 CalendarNote.Time.Month,
3786 CalendarNote.Time.Day,
3787 (CalendarNote.AlarmType==0x00) ? "Tone " : "Silent",
3791 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3792 i+1,NotesInfo.Location[i], z_type, z_text,
3793 CalendarNote.Time.Year,
3794 CalendarNote.Time.Month,
3795 CalendarNote.Time.Day,
3796 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3799 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3801 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3802 i+1,NotesInfo.Location[i], z_type, z_text,
3803 CalendarNote.Time.Year,
3804 CalendarNote.Time.Month,
3805 CalendarNote.Time.Day,
3806 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3810 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s\n"),
3811 i+1,NotesInfo.Location[i], z_type, z_text,
3812 CalendarNote.Time.Year,
3813 CalendarNote.Time.Month,
3814 CalendarNote.Time.Day,
3815 (CalendarNote.Alarm.Year) ? "Yes" : "No ");
3817 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) break;
3822 for (i=start;i<=stop;i++) {
3823 if (error==GE_NONE) {
3824 if( i>NotesInfo.HowMany ) {
3825 fprintf(stderr, _("Only %d Calendar Notes present on phone!\n"),NotesInfo.HowMany);
3829 fprintf(stderr, _("Calendar Notes location can't be zero... skipping.\n"));
3834 CalendarNote.Location=i;
3835 CalendarNote.ReadNotesInfo=false;
3837 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3841 fprintf(stdout, GSM_GetVCALENDARStart(vCalVer));
3845 fprintf(stdout, GSM_GetVCALENDARNote(&CalendarNote,vCalVer));
3847 } else { /* not vCal */
3850 fprintf(stdout, "\n");
3855 fprintf(stdout, _(" Type of the note: "));
3857 switch (CalendarNote.Type) {
3859 case GCN_REMINDER:fprintf(stdout, _("Reminder\n"));break;
3860 case GCN_CALL :fprintf(stdout, _("Call\n")); break;
3861 case GCN_MEETING :fprintf(stdout, _("Meeting\n")); break;
3862 case GCN_BIRTHDAY:fprintf(stdout, _("Birthday\n"));break;
3863 default: fprintf(stdout, _("Unknown\n"));
3867 /* For 3310: set date to 2090! */
3868 if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
3869 fprintf(stdout, _(" Date: xxxx-%02d-%02d\n"), CalendarNote.Time.Month,
3870 CalendarNote.Time.Day);
3872 fprintf(stdout, _(" Date: %s %d-%02d-%02d\n"),
3873 DayOfWeek(CalendarNote.Time.Year, CalendarNote.Time.Month, CalendarNote.Time.Day),
3874 CalendarNote.Time.Year,
3875 CalendarNote.Time.Month,
3876 CalendarNote.Time.Day);
3879 fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CalendarNote.Time.Hour,
3880 CalendarNote.Time.Minute,
3881 CalendarNote.Time.Second);
3883 if (CalendarNote.Alarm.Year!=0) {
3884 fprintf(stdout, _(" Alarm date: %s %d-%02d-%02d\n"),
3885 DayOfWeek(CalendarNote.Alarm.Year, CalendarNote.Alarm.Month, CalendarNote.Alarm.Day),
3886 CalendarNote.Alarm.Year,
3887 CalendarNote.Alarm.Month,
3888 CalendarNote.Alarm.Day);
3890 fprintf(stdout, _(" Alarm time: %02d:%02d:%02d\n"), CalendarNote.Alarm.Hour,
3891 CalendarNote.Alarm.Minute,
3892 CalendarNote.Alarm.Second);
3893 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 )
3894 fprintf(stdout, _(" Alarm type: %s\n"), (CalendarNote.AlarmType==0x00) ?
3895 "With Tone" : "Silent" );
3898 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && CalendarNote.Recurrance!= 0 )
3899 fprintf(stdout, " It repeat every %d day%s\n", CalendarNote.Recurrance/24,
3900 ((CalendarNote.Recurrance/24)>1) ? "s":"" );
3902 if (CalendarNote.Type == GCN_BIRTHDAY)
3905 i_age = Date.Year - CalendarNote.Time.Year;
3906 fprintf(stdout, _(" Text: %s (%d %s)\n"), CalendarNote.Text,
3907 i_age, (i_age==1)?"year":"years");
3909 if (CalendarNote.Text[0]!=0)
3910 fprintf(stdout, _(" Text: %s\n"), CalendarNote.Text);
3913 if (CalendarNote.Type == GCN_CALL)
3914 fprintf(stdout, _(" Phone: %s\n"), CalendarNote.Phone);
3917 fprintf(stderr, _("The calendar note %i can not be read\n"),i);
3921 if (was_note && vCalVer!=0) {
3922 fprintf(stdout, GSM_GetVCALENDAREnd(vCalVer));
3930 /* Writing calendar notes. */
3932 int writecalendarnote(char *argv[])
3934 GSM_CalendarNote CalendarNote;
3938 number=atoi(argv[1]);
3941 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
3945 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
3948 case GE_CANTOPENFILE:
3949 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
3952 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
3955 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
3961 /* Error 22=Calendar full ;-) */
3963 error=GSM->WriteCalendarNote(&CalendarNote);
3966 fprintf(stdout, _("Succesfully written!\n"));break;
3968 fprintf(stdout, _("Too long text in calendar note!\n"));break;
3970 fprintf(stdout, _("Failed to write calendar note!\n"));break;
3978 /* Calendar note deleting. */
3980 int deletecalendarnote(char *Index)
3983 GSM_CalendarNote CalendarNote;
3985 CalendarNote.Location=atoi(Index);
3989 if (GSM->DeleteCalendarNote(&CalendarNote) == GE_NONE) {
3990 fprintf(stdout, _(" Calendar note deleted.\n"));
3993 fprintf(stderr, _("The calendar note can not be deleted\n"));
4004 /* Setting the date and time. */
4006 int setdatetime(int argc, char *argv[])
4015 now=localtime(&nowh);
4017 Date.Year = now->tm_year;
4018 Date.Month = now->tm_mon+1;
4019 Date.Day = now->tm_mday;
4020 Date.Hour = now->tm_hour;
4021 Date.Minute = now->tm_min;
4022 Date.Second = now->tm_sec;
4024 if (argc>0) Date.Year = atoi (argv[0]);
4025 if (argc>1) Date.Month = atoi (argv[1]);
4026 if (argc>2) Date.Day = atoi (argv[2]);
4027 if (argc>3) Date.Hour = atoi (argv[3]);
4028 if (argc>4) Date.Minute = atoi (argv[4]);
4033 /* Well, this thing is copyrighted in U.S. This technique is known as
4034 Windowing and you can read something about it in LinuxWeekly News:
4035 http://lwn.net/1999/features/Windowing.phtml. This thing is beeing
4036 written in Czech republic and Poland where algorithms are not allowed
4040 Date.Year = Date.Year+1900;
4042 Date.Year = Date.Year+2000;
4045 /* FIXME: Error checking should be here. */
4046 GSM->SetDateTime(&Date);
4053 /* In this mode we receive the date and time from mobile phone. */
4055 int getdatetime(void) {
4057 GSM_DateTime date_time;
4061 if (GSM->GetDateTime(&date_time)==GE_NONE) {
4062 if (date_time.IsSet) {
4063 fprintf(stdout, _("Date: %s %4d/%02d/%02d\n"),
4064 DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
4065 date_time.Year, date_time.Month, date_time.Day);
4066 fprintf(stdout, _("Time: %02d:%02d:%02d\n"), date_time.Hour, date_time.Minute, date_time.Second);
4068 fprintf(stdout, _("Date and time not set in phone\n"));
4071 fprintf(stdout,_("Error!\n"));
4079 /* Setting the alarm. */
4081 int setalarm(char *argv[])
4088 Date.Hour = atoi(argv[0]);
4089 Date.Minute = atoi(argv[1]);
4091 GSM->SetAlarm(1, &Date);
4098 /* Getting the alarm. */
4100 int getalarm(void) {
4102 GSM_DateTime date_time;
4106 if (GSM->GetAlarm(0, &date_time)==GE_NONE) {
4107 fprintf(stdout, _("Alarm: %s\n"), (date_time.IsSet)?"on":"off");
4108 fprintf(stdout, _("Time: %02d:%02d\n"), date_time.Hour, date_time.Minute);
4110 fprintf(stdout,_("Error!\n"));
4118 /* In monitor mode we don't do much, we just initialise the fbus code.
4119 Note that the fbus code no longer has an internal monitor mode switch,
4120 instead compile with DEBUG enabled to get all the gumpf. */
4122 int monitormode(int argc, char *argv[])
4125 float rflevel=-1, batterylevel=-1;
4126 unsigned char loop=1;
4128 GSM_PowerSource powersource=-1;
4129 GSM_RFUnits rf_units = GRF_Arbitrary;
4130 GSM_BatteryUnits batt_units = GBU_Arbitrary;
4132 GSM_NetworkInfo NetworkInfo;
4133 GSM_CBMessage CBMessage;
4135 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
4136 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
4137 GSM_MemoryStatus DC_MemoryStatus = {GMT_DC, 0, 0};
4138 GSM_MemoryStatus EN_MemoryStatus = {GMT_EN, 0, 0};
4139 GSM_MemoryStatus FD_MemoryStatus = {GMT_FD, 0, 0};
4140 GSM_MemoryStatus LD_MemoryStatus = {GMT_LD, 0, 0};
4141 GSM_MemoryStatus MC_MemoryStatus = {GMT_MC, 0, 0};
4142 GSM_MemoryStatus ON_MemoryStatus = {GMT_ON, 0, 0};
4143 GSM_MemoryStatus RC_MemoryStatus = {GMT_RC, 0, 0};
4145 GSM_SMSStatus SMSStatus = {0, 0};
4149 /* evaluate for presence of "-noloop" argument in parameter */
4152 if( strcmp(argv[0],"-noloop" ) && strcmp(argv[0],"-nl" ))
4161 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
4164 signal(SIGINT, interrupted);
4166 fprintf (stderr, _("Entering monitor mode...\n"));
4167 fprintf (stderr, _("Initialising GSM interface...\n"));
4169 /* Initialise the code for the GSM interface. */
4174 GSM->EnableCellBroadcast();
4176 /* Loop here indefinitely - allows you to see messages from GSM code in
4177 response to unknown messages etc. The loops ends after pressing the
4179 while (!bshutdown) {
4180 if (GSM->GetRFLevel(&rf_units, &rflevel) == GE_NONE)
4181 fprintf(stdout, _("RFLevel: %d\n"), (int)rflevel);
4183 if (GSM->GetBatteryLevel(&batt_units, &batterylevel) == GE_NONE)
4184 fprintf(stdout, _("Battery: %d\n"), (int)batterylevel);
4186 if (GSM->GetPowerSource(&powersource) == GE_NONE)
4187 fprintf(stdout, _("Power Source: %s\n"), (powersource==GPS_ACDC)?_("AC/DC"):_("battery"));
4189 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE)
4190 fprintf(stdout, _("SIM: Used %d, Free %d\n"), SIMMemoryStatus.Used, SIMMemoryStatus.Free);
4192 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE)
4193 fprintf(stdout, _("Phone: Used %d, Free %d\n"), PhoneMemoryStatus.Used, PhoneMemoryStatus.Free);
4195 if (GSM->GetMemoryStatus(&DC_MemoryStatus) == GE_NONE)
4196 fprintf(stdout, _("DC: Used %d, Free %d\n"), DC_MemoryStatus.Used, DC_MemoryStatus.Free);
4198 if (GSM->GetMemoryStatus(&EN_MemoryStatus) == GE_NONE)
4199 fprintf(stdout, _("EN: Used %d, Free %d\n"), EN_MemoryStatus.Used, EN_MemoryStatus.Free);
4201 if (GSM->GetMemoryStatus(&FD_MemoryStatus) == GE_NONE)
4202 fprintf(stdout, _("FD: Used %d, Free %d\n"), FD_MemoryStatus.Used, FD_MemoryStatus.Free);
4204 if (GSM->GetMemoryStatus(&LD_MemoryStatus) == GE_NONE)
4205 fprintf(stdout, _("LD: Used %d, Free %d\n"), LD_MemoryStatus.Used, LD_MemoryStatus.Free);
4207 if (GSM->GetMemoryStatus(&MC_MemoryStatus) == GE_NONE)
4208 fprintf(stdout, _("MC: Used %d, Free %d\n"), MC_MemoryStatus.Used, MC_MemoryStatus.Free);
4210 if (GSM->GetMemoryStatus(&ON_MemoryStatus) == GE_NONE)
4211 fprintf(stdout, _("ON: Used %d, Free %d\n"), ON_MemoryStatus.Used, ON_MemoryStatus.Free);
4213 if (GSM->GetMemoryStatus(&RC_MemoryStatus) == GE_NONE)
4214 fprintf(stdout, _("RC: Used %d, Free %d\n"), RC_MemoryStatus.Used, RC_MemoryStatus.Free);
4216 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE)
4217 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"), SMSStatus.UnRead, SMSStatus.Number);
4219 if (GSM->GetIncomingCallNr(Number) == GE_NONE)
4220 fprintf(stdout, _("Incoming call: %s\n"), Number);
4222 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE)
4223 fprintf(stdout, _("Network: %s (%s), LAC: %s, CellID: %s\n"), GSM_GetNetworkName (NetworkInfo.NetworkCode), GSM_GetCountryName(NetworkInfo.NetworkCode), NetworkInfo.LAC, NetworkInfo.CellID);
4225 if (GSM->ReadCellBroadcast(&CBMessage) == GE_NONE)
4226 fprintf(stdout, _("Cell broadcast received on channel %d: %s\n"), CBMessage.Channel, CBMessage.Message);
4233 if( loop ) fprintf (stderr, _("Leaving monitor mode...\n"));
4240 #endif /* UCLINUX */
4242 /* Emulation of separate gnokiid binary for uClinux */
4246 #define NICE_LEVEL (-20)
4248 static void gnokiid_SIGCHLD(int signo)
4250 fprintf (stderr, _("Child process exited, aborting...\n"));
4254 static int gnokiid(int argc, char *argv[])
4256 bool DebugMode; /* When true, run in debug mode */
4257 char *Model; /* Model from .gnokiirc file. */
4258 char *Port; /* Port from .gnokiirc file */
4259 char *Initlength; /* Init length from .gnokiirc file */
4260 char *Connection; /* Connection type from .gnokiirc file */
4261 char *BinDir; /* Directory of the mgnokiidev command */
4263 /* evaluate for presence of "--debug" argument in parameter */
4267 if( !strcmp(argv[0],"--debug" ))
4276 fprintf (stderr, _("Initializing gnokiid mode...\n"));
4279 if (CFG_ReadConfig(&Model, &Port, &Initlength, &Connection, &BinDir, true) < 0)
4282 if (VM_Initialise(Model, Port, Initlength, GCT_FBUS, BinDir, DebugMode, true, ""/*SynchronizeTime*/) == false)
4287 fprintf (stderr, _("Spawning gnokiid startup child process \"%s\"...\n"), *argv);
4289 signal(SIGCHLD,gnokiid_SIGCHLD);
4292 case -1: /* vfork() failure */
4293 fprintf (stderr, _("vfork() failed! (%s)\n"),strerror(errno));
4297 fprintf (stderr, _("Spawn of child process failed! (%s)\n"),strerror(errno));
4300 default: /* parent */
4307 fprintf (stderr, _("Entering gnokiid virtual modem main loop...\n"));
4309 if (nice(NICE_LEVEL))
4310 fprintf (stderr, _("WARNING: nice level change failed (by %d)\n"),NICE_LEVEL);
4319 #endif /* UCLINUX */
4323 /* Shows texts from phone's display */
4332 error=GSM->EnableDisplayOutput();
4334 if (error == GE_NONE)
4337 /* We do not want to see texts forever - press Ctrl+C to stop. */
4339 signal(SIGINT, interrupted);
4341 fprintf (stderr, _("Entering display monitoring mode...\n"));
4343 /* Loop here indefinitely - allows you to read texts from phone's
4344 display. The loops ends after pressing the Ctrl+C. */
4349 fprintf (stderr, _("Leaving display monitor mode...\n"));
4351 error=GSM->DisableDisplayOutput();
4353 fprintf (stderr, _("Error!\n"));
4355 fprintf (stderr, _("Error!\n"));
4362 /* Displays names of available ringtones */
4365 char model[64], rev[64];
4370 while (GSM->GetRevision(rev) != GE_NONE)
4373 while (GSM->GetModel(model) != GE_NONE)
4376 strncpy(rev,rev+2,5);
4378 PrepareRingingTones(model,rev);
4380 for (i=1;i<=NumberOfRingtones();i++)
4382 fprintf(stdout,_("%i. %s\n"),i,RingingToneName(0,i));
4391 /* Reads profile from phone and displays its' settings */
4393 int getprofile(int argc, char *argv[])
4398 GSM_Profile profile;
4401 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4402 char model[64], rev[64];
4404 /* Initialise the code for the GSM interface. */
4409 error=GSM->GetProfile(&profile);
4411 if (error == GE_NONE)
4414 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4416 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4418 strncpy(rev,rev+2,5);
4420 PrepareRingingTones(model,rev);
4422 switch(GetModelFeature (FN_PROFILES)) {
4423 case F_PROF33:max_profiles=6;break;
4424 case F_PROF51:max_profiles=3;break;
4425 default :max_profiles=7;break;
4430 profile.Number=atoi(argv[0])-1;
4431 start=profile.Number;
4434 if (profile.Number < 0)
4436 fprintf(stderr, _("Profile number must be value from 1 to %d!\n"), max_profiles);
4441 if (profile.Number >= max_profiles)
4443 fprintf(stderr, _("This phone supports only %d profiles!\n"), max_profiles);
4457 if (profile.Number!=0) GSM->GetProfile(&profile);
4459 printf("%d. \"%s\"", (profile.Number+1), profile.Name);
4460 if (profile.DefaultName==-1) printf(" (name defined)");
4464 printf("Incoming call alert: %d\n", profile.CallAlert);
4465 printf("Ringtone ID: %d\n", profile.Ringtone);
4466 printf("Ringing volume: %d\n", profile.Volume);
4467 printf("Message alert tone: %d\n", profile.MessageTone);
4468 printf("Keypad tones: %d\n", profile.KeypadTone);
4469 printf("Warning and game tones: %d\n", profile.WarningTone);
4470 printf("Lights: %d\n", profile.Lights);
4471 printf("Vibration: %d\n", profile.Vibration);
4472 printf("Caller groups: 0x%02x\n", profile.CallerGroups);
4473 printf("Automatic answer: %d\n", profile.AutomaticAnswer);
4474 printf("Screen saver: %d\n", profile.ScreenSaver);
4478 printf("Incoming call alert: %s\n", GetProfileCallAlertString(profile.CallAlert));
4480 /* For different phones different ringtones names */
4481 if (strcmp(RingingToneName(profile.Ringtone,0),""))
4482 printf(_("Ringing tone: %s (number %d in phone menu)\n"),
4483 RingingToneName(profile.Ringtone,0), RingingToneMenu(profile.Ringtone));
4485 printf(_("Ringtone number: %d\n"), profile.Ringtone);
4487 printf(_("Ringing volume: %s\n"), GetProfileVolumeString(profile.Volume));
4489 printf(_("Message alert tone: %s\n"), GetProfileMessageToneString(profile.MessageTone));
4491 printf(_("Keypad tones: %s\n"), GetProfileKeypadToneString(profile.KeypadTone));
4493 printf(_("Warning and game tones: %s\n"), GetProfileWarningToneString(profile.WarningTone));
4495 if (GetModelFeature (FN_SCREENSAVER)!=0)
4496 printf(_("Screen saver: %s\n"), GetProfileOnOffString(profile.ScreenSaver));
4498 printf(_("Vibration: %s\n"), GetProfileVibrationString(profile.Vibration));
4500 /* It has been nice to add here reading caller group name. ;^) */
4501 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
4502 printf(_("Caller groups: %s\n"),
4503 GetProfileCallerGroups(profile.CallerGroups) );
4505 /* FIXME: need make investigation for 3310 for these features. For now unknown */
4506 if (GetModelFeature (FN_PROFILES)!=F_PROF33) {
4507 /* FIXME: Light settings is only used for Car */
4508 if (profile.Number==(max_profiles-2)) printf(_("Lights: %s\n"), profile.Lights ? _("On") : _("Automatic"));
4510 /* FIXME: Automatic answer is only used for Car and Headset. */
4511 if (profile.Number>=(max_profiles-2)) printf(_("Automatic answer: %s\n"), GetProfileOnOffString(profile.AutomaticAnswer));
4519 if (error == GE_NOTIMPLEMENTED) {
4520 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4525 fprintf(stderr, _("Unspecified error\n"));
4537 /* Sets profile feature */
4539 int setprofile(int argc, char *argv[])
4542 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4543 char model[64], rev[64];
4546 GSM_Profile profile;
4547 GSM_Profile profile2, profile3;
4552 /* Initialise the code for the GSM interface. */
4558 error = GSM->GetProfile(&profile);
4560 if (error == GE_NONE)
4563 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4565 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4567 strncpy(rev,rev+2,5);
4569 PrepareRingingTones(model,rev);
4571 switch(GetModelFeature (FN_PROFILES)) {
4572 case F_PROF33:max_profiles=6;break;
4573 case F_PROF51:max_profiles=3;break;
4574 default :max_profiles=7;break;
4577 profile.Number=atoi (argv[0]);
4578 profile.Number=profile.Number-1;
4580 if (profile.Number < 0)
4582 fprintf(stderr, _("Profile number must be value from 1 to %i!\n"), max_profiles);
4587 if (profile.Number >= max_profiles)
4589 fprintf(stderr, _("This phone supports only %i profiles!\n"), max_profiles);
4594 if (profile.Number!=0) GSM->GetProfile(&profile);
4599 if (strcmp(argv[1], "callalert")==0)
4601 if (strcmp(argv[2], "ringing")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGING;correct_arg2=true;}
4602 if (strcmp(argv[2], "ascending")==0) {profile.CallAlert=PROFILE_CALLALERT_ASCENDING;correct_arg2=true;}
4603 if (strcmp(argv[2], "ringonce")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGONCE;correct_arg2=true;}
4604 if (strcmp(argv[2], "beeponce")==0) {profile.CallAlert=PROFILE_CALLALERT_BEEPONCE;correct_arg2=true;}
4605 if (strcmp(argv[2], "groups")==0)
4607 profile.CallAlert=PROFILE_CALLALERT_CALLERGROUPS;
4609 /*Ignored by N5110*/
4610 /*FIX ME: it's ignored by N5130 and 3210 too*/
4611 if (max_profiles==3) fprintf(stdout, _("Warning: value \"groups\" for profile feature \"callalert\" will be ignored in this phone model !\n"));
4613 if (strcmp(argv[2], "off")==0 || strcmp(argv[2], "0")==0) {profile.CallAlert=PROFILE_CALLALERT_OFF;correct_arg2=true;}
4616 fprintf(stderr, _("Correct parameters for profile feature \"callalert\" are ringing|ascending|ringonce|beeponce|groups|off|0 !\n"));
4622 if (strcmp(argv[1], "volume")==0)
4624 if (strcmp(argv[2], "1")==0) {profile.Volume=PROFILE_VOLUME_LEVEL1;correct_arg2=true;}
4625 if (strcmp(argv[2], "2")==0) {profile.Volume=PROFILE_VOLUME_LEVEL2;correct_arg2=true;}
4626 if (strcmp(argv[2], "3")==0) {profile.Volume=PROFILE_VOLUME_LEVEL3;correct_arg2=true;}
4627 if (strcmp(argv[2], "4")==0) {profile.Volume=PROFILE_VOLUME_LEVEL4;correct_arg2=true;}
4628 if (strcmp(argv[2], "5")==0) {profile.Volume=PROFILE_VOLUME_LEVEL5;correct_arg2=true;}
4631 fprintf(stderr, _("Correct parameters for profile feature \"volume\" are 0|1|2|3|4|5 !\n"));
4637 if (strcmp(argv[1], "keypad")==0 || strcmp(argv[1], "keypadtone")==0)
4639 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.KeypadTone=PROFILE_KEYPAD_OFF;correct_arg2=true;}
4640 if (strcmp(argv[2], "1")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL1;correct_arg2=true;}
4641 if (strcmp(argv[2], "2")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL2;correct_arg2=true;}
4642 if (strcmp(argv[2], "3")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL3;correct_arg2=true;}
4645 fprintf(stderr, _("Correct parameters for profile feature \"keypad|keypadtone\" are off|0|1|2|3 !\n"));
4651 if (strcmp(argv[1], "messagetone")==0 || strcmp(argv[1], "smstone")==0 || strcmp(argv[1], "sms")==0 || strcmp(argv[1], "message")==0)
4653 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.MessageTone=PROFILE_MESSAGE_NOTONE;correct_arg2=true;}
4654 if (strcmp(argv[2], "standard")==0) {profile.MessageTone=PROFILE_MESSAGE_STANDARD;correct_arg2=true;}
4655 if (strcmp(argv[2], "special")==0) {profile.MessageTone=PROFILE_MESSAGE_SPECIAL;correct_arg2=true;}
4656 if (strcmp(argv[2], "beeponce")==0 || strcmp(argv[2], "once")==0) {profile.MessageTone=PROFILE_MESSAGE_BEEPONCE;correct_arg2=true;}
4657 if (strcmp(argv[2], "ascending")==0) {profile.MessageTone=PROFILE_MESSAGE_ASCENDING;correct_arg2=true;}
4660 fprintf(stderr, _("Correct parameters for profile feature \"messagetone|smstone|message|sms\" are 0|off|standard|special|beeponce|once|ascending !\n"));
4666 if (strcmp(argv[1], "warningtone")==0 || strcmp(argv[1], "warning")==0)
4668 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.WarningTone=PROFILE_WARNING_OFF;correct_arg2=true;}
4669 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.WarningTone=PROFILE_WARNING_ON;correct_arg2=true;}
4672 fprintf(stderr, _("Correct parameters for profile feature \"warningtone|warning\" are 0|off|1|on !\n"));
4678 if (strcmp(argv[1], "vibra")==0 || strcmp(argv[1], "vibration")==0)
4680 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Vibration=PROFILE_VIBRATION_OFF;correct_arg2=true;}
4681 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Vibration=PROFILE_VIBRATION_ON;correct_arg2=true;}
4684 fprintf(stderr, _("Correct parameters for profile feature \"vibration|vibra\" are 0|off|1|on !\n"));
4690 if (strcmp(argv[1], "lights")==0)
4692 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Lights=-1;correct_arg2=true;}
4693 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Lights=0;correct_arg2=true;}
4696 fprintf(stderr, _("Correct parameters for profile feature \"lights\" are 0|off|1|on !\n"));
4700 if (profile.Number!=(max_profiles-2))
4702 profile2.Number=max_profiles-2;
4703 if (GSM->GetProfile(&profile2)==GE_NONE)
4705 fprintf(stdout, _("Warning: \"Lights\" feature is ignored in this profile (only setting it for \"%s\" profile get some results) !\n"), profile2.Name);
4710 if (strcmp(argv[1], "answer")==0)
4712 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.AutomaticAnswer=-1;correct_arg2=true;}
4713 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.AutomaticAnswer=0;correct_arg2=true;}
4716 fprintf(stderr, _("Correct parameters for profile feature \"answer\" are 0|off|1|on !\n"));
4720 if (profile.Number<(max_profiles-2))
4722 profile2.Number=max_profiles-2;
4723 if (GSM->GetProfile(&profile2)==GE_NONE)
4725 profile3.Number=max_profiles-1;
4726 if (GSM->GetProfile(&profile3)==GE_NONE)
4728 fprintf(stdout, _("Warning: \"Automatic Answer\" feature is ignored in this profile (only setting it for \"%s\" and \"%s\" profiles get some results) !\n"), profile2.Name, profile3.Name);
4734 if (strcmp(argv[1], "name")==0)
4736 strcpy(profile.Name,argv[2]);
4737 /*Ignored by N5110*/
4738 /*FIX ME: it's ignored by N5130 and 3210 too*/
4739 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change profile name !\n"));
4742 if (strcmp(argv[1], "ringtone")==0)
4744 profile.Ringtone=atoi(argv[2]);
4745 if (profile.Ringtone<1)
4747 /*With value 0 results are interesting in N5110, but can't be used for anything*/
4748 fprintf(stderr, _("Ringtone number must be higher than 0 !\n"));
4753 if (profile.Ringtone>NumberOfRingtones())
4755 fprintf(stderr, _("Ringtone number too high (max %i) !\n"),NumberOfRingtones());
4759 profile.Ringtone=RingingToneCode(profile.Ringtone);
4760 if (profile.Ringtone==0)
4762 fprintf(stderr, _("Warning: we don't know ringtones codes for this model ! Can you contact with gnokii authors to add it into source ?\n"));
4766 if (max_profiles==3) fprintf(stdout, _("Warning: ringtone is changed for all profiles. You must reset phone or select profile in phone againg to see result.\n"));
4770 if (strcmp(argv[1], "groups")==0)
4772 /*Ignored by N5110*/
4773 /*FIX ME: it's ignored by N5130 and 3210 too*/
4774 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change caller group name !\n"));
4775 profile.CallerGroups=atoi(argv[2]);
4781 fprintf(stderr, _("Correct profile feature names are callalert|volume|keypad|keypadtone|messagetone|smstone|message|sms|warningtone|warning|vibra|vibration|lights|answer|name|groups !\n"));
4786 GSM->SetProfile(&profile);
4789 if (error == GE_NOTIMPLEMENTED) {
4790 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4795 fprintf(stderr, _("Unspecified error\n"));
4807 #endif /* UCLINUX */
4809 /* Get requested range of memory storage entries and output to stdout in
4810 easy-to-parse format */
4812 static int getmemory(int argc, char *argv[])
4815 GSM_PhonebookEntry entry;
4820 char memory_type_string[20];
4823 int i_used = 0, n_used=0;
4825 char *output_opt = NULL;
4827 char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
4828 bool formatdone=false;
4831 /* group names init */
4832 for(i=0;i<5;i++) az_group_name[i][0]='\0';
4834 /* Handle command line args that set type, start and end locations. */
4835 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
4837 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
4841 GetMemoryTypeString(memory_type_string, &entry.MemoryType);
4843 if (argv[argc-1][0] == '-')
4844 output_opt = argv[--argc];
4846 /* Do generic initialisation routine */
4850 while ((error = GSM->GetModel(buf)) != GE_NONE && i++ < 15)
4855 start_entry = atoi (argv[1]);
4856 end_entry = argc > 2 ? atoi( argv[2]) : start_entry;
4858 GSM_MemoryStatus stats = {entry.MemoryType, 0, 0};
4862 if (GSM->GetMemoryStatus( &stats) != GE_NONE) {
4863 fprintf( stderr, _("Error reading memory status.\n"));
4867 n_used = stats.Used;
4868 end_entry = stats.Used + stats.Free;
4872 /* Now retrieve the requested entries. */
4874 for (count = start_entry;
4875 count <= end_entry && (!do_all || i_used < n_used);
4878 entry.Location=count;
4880 error=GSM->GetMemoryLocation(&entry);
4884 if (entry.SubEntriesCount || strcmp( entry.Number, ""))
4889 if (output_opt && !strcmp( output_opt,"-v30")) {
4890 semicolon_pipe_substitution( &entry, 0 );
4891 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,30));
4894 if (output_opt && !strcmp(output_opt,"-v21")) {
4895 semicolon_pipe_substitution( &entry, 0 );
4896 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,21));
4899 if (output_opt && !strcmp(output_opt,"-v")) {
4900 semicolon_pipe_substitution( &entry, 0 );
4901 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,10));
4904 #endif /* UCLINUX */
4905 if (output_opt && !strcmp(output_opt,"-short")) {
4906 semicolon_pipe_substitution( &entry, 0 );
4907 fprintf(stdout, "%s;%s;%s;%d;%d;", entry.Name, entry.Number, memory_type_string, entry.Location, entry.Group);
4908 for( i = 0; i < entry.SubEntriesCount; i++ )
4910 if( entry.SubEntries[i].EntryType == GSM_Date )
4911 fprintf(stdout,_("%u;%u;%u;%02u.%02u.%04u;%02u:%02u:%02u;"),
4912 entry.SubEntries[i].EntryType,
4913 entry.SubEntries[i].NumberType,
4914 entry.SubEntries[i].BlockNumber,
4915 entry.SubEntries[i].data.Date.Day,
4916 entry.SubEntries[i].data.Date.Month,
4917 entry.SubEntries[i].data.Date.Year,
4918 entry.SubEntries[i].data.Date.Hour,
4919 entry.SubEntries[i].data.Date.Minute,
4920 entry.SubEntries[i].data.Date.Second );
4922 fprintf(stdout,_("%u;%u;%u;%s;"),
4923 entry.SubEntries[i].EntryType,
4924 entry.SubEntries[i].NumberType,
4925 entry.SubEntries[i].BlockNumber,
4926 entry.SubEntries[i].data.Number );
4928 fprintf(stdout,_("\n"));
4934 fprintf(stdout, "Memory %s, location %d\n",memory_type_string, entry.Location);
4936 // check if some info in subentries
4937 for( i = 0; i < entry.SubEntriesCount; i++ )
4938 if( entry.SubEntries[i].EntryType != GSM_Date &&
4939 strcmp(entry.SubEntries[i].data.Number,"") )
4942 if (strcmp(entry.Number,"") || i < entry.SubEntriesCount) {
4943 if (strcmp(entry.Name,"")) fprintf(stdout,_(" Name: %s\n"),entry.Name);
4944 if (strcmp(entry.Number,"")) fprintf(stdout,_(" Number: %s\n"),entry.Number);
4945 bitmap.type=GSM_CallerLogo;
4946 bitmap.number=entry.Group;
4947 strcpy(z_gtype,"unknown");
4948 if (entry.Group==5) strcpy(z_gtype,"No group");
4949 if (entry.Group<5 && entry.Group>=0) {
4950 if (!strcmp(az_group_name[entry.Group],"")) {
4951 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
4952 if (GSM->GetBitmap(&bitmap)==GE_NONE)
4953 strcpy( az_group_name[entry.Group], bitmap.text );
4955 if ((!strcmp(az_group_name[entry.Group],""))) {
4956 switch(entry.Group) {
4957 case 0:strcpy(az_group_name[entry.Group],"Family");break;
4958 case 1:strcpy(az_group_name[entry.Group],"VIP");break;
4959 case 2:strcpy(az_group_name[entry.Group],"Friends");break;
4960 case 3:strcpy(az_group_name[entry.Group],"Colleagues");break;
4961 case 4:strcpy(az_group_name[entry.Group],"Other");break;
4966 strcpy(z_gtype,az_group_name[entry.Group]);
4968 fprintf(stdout,_(" Group: %d (%s)\n"),entry.Group+1,z_gtype);
4969 for( i = 0; i < entry.SubEntriesCount; i++ )
4971 if( entry.SubEntries[i].EntryType == GSM_Date ) {
4972 fprintf(stdout, " Date and time: %s %02u.%02u.%04u %02u:%02u:%02u\n",
4973 DayOfWeek(entry.SubEntries[i].data.Date.Year,
4974 entry.SubEntries[i].data.Date.Month,
4975 entry.SubEntries[i].data.Date.Day),
4976 entry.SubEntries[i].data.Date.Day,
4977 entry.SubEntries[i].data.Date.Month,
4978 entry.SubEntries[i].data.Date.Year,
4979 entry.SubEntries[i].data.Date.Hour,
4980 entry.SubEntries[i].data.Date.Minute,
4981 entry.SubEntries[i].data.Date.Second);
4984 if( strcmp(entry.SubEntries[i].data.Number,"") ) {
4986 switch( entry.SubEntries[i].EntryType ) {
4988 switch( entry.SubEntries[i].NumberType ) {
4989 case GSM_General: strcpy(z_etype,"General "); break;
4990 case GSM_Home: strcpy(z_etype,"Home "); break;
4991 case GSM_Mobile: strcpy(z_etype,"Mobile "); break;
4992 case GSM_Work: strcpy(z_etype,"Work "); break;
4993 case GSM_Fax: strcpy(z_etype,"Fax "); break;
4994 default: strcpy(z_etype,""); break;
4996 strcat(z_etype,"Number"); break;
4998 strcpy(z_etype,"Note"); break;
5000 strcpy(z_etype,"Postal"); break;
5002 strcpy(z_etype,"E-Mail"); break;
5004 strcpy(z_etype,"unknown data"); break;
5007 fprintf(stdout,_(" ---> Subentry: %u\n"),i+1);
5008 fprintf(stdout,_(" Entry type: %u (%s)\n"),entry.SubEntries[i].EntryType,z_etype);
5009 fprintf(stdout,_(" Number type: %u\n"),entry.SubEntries[i].NumberType);
5010 fprintf(stdout,_(" Block Number: %u\n"),entry.SubEntries[i].BlockNumber);
5012 fprintf(stdout,_(" %s: %s\n"),z_etype,entry.SubEntries[i].data.Number);
5016 if ((entry.MemoryType==GMT_DC ||
5017 entry.MemoryType==GMT_RC ||
5018 entry.MemoryType==GMT_MC) && !wasdate)
5019 fprintf(stdout,_(" Date and time not available\n"));
5021 fprintf(stdout,_(" Location empty\n"));
5024 case GE_NOTIMPLEMENTED:
5025 fprintf( stderr, _("Function not implemented in %s model!\n"), model);
5028 case GE_INVALIDMEMORYTYPE:
5029 fprintf( stderr, _("Memory type %s not supported!\n"),
5030 memory_type_string);
5034 fprintf(stdout, _("%s|%d|Bad location or other error!(%d)\n"),
5035 memory_type_string, count, error);
5044 /* Read data from stdin, parse and write to phone. The parsing is relatively
5045 crude and doesn't allow for much variation from the stipulated format. */
5047 static int writephonebook(int argc, char *args[])
5050 GSM_PhonebookEntry entry;
5052 char *memory_type_string;
5053 int line_count=0,current,i;
5056 char *Line, OLine[1024], BackLine[1024];
5059 /* Check argument */
5061 if (strcmp("-i", args[0])) {
5066 /* Initialise fbus code */
5072 /* Go through data from stdin. */
5074 while (GetLine(stdin, Line, sizeof(OLine))!=-1) {
5076 current=0;BackLine[current++]=Line[0];
5077 for (i=1;i<strlen(Line);i++) {
5078 if (Line[i-1]==';' && Line[i]==';') BackLine[current++]=' ';
5079 BackLine[current++]=Line[i];
5081 BackLine[current++]=0;
5083 strcpy(Line,BackLine);
5087 #if defined(__svr4__) || defined(__FreeBSD__)
5088 ptr=strtok(Line, ";"); if (ptr) strcpy(entry.Name, ptr);
5091 ptr=strtok(NULL, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
5093 ptr=strtok(NULL, ";");
5095 ptr=strsep(&Line, ";"); if (ptr) strcpy(entry.Name, ptr);
5098 ptr=strsep(&Line, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
5100 ptr=strsep(&Line, ";");
5104 fprintf(stderr, _("Format problem on line %d [%s] 1\n"), line_count, BackLine);
5109 if (!strncmp(ptr,"ME", 2))
5111 memory_type_string = "int";
5112 entry.MemoryType = GMT_ME;
5114 else if (!strncmp(ptr,"SM", 2))
5116 memory_type_string = "sim";
5117 entry.MemoryType = GMT_SM;
5121 fprintf(stderr, _("Format problem on line %d [%s] 2: %s\n"),
5122 line_count, BackLine,ptr);
5126 #if defined(__svr4__) || defined(__FreeBSD__)
5127 ptr=strtok(NULL, ";"); if (ptr) entry.Location=atoi(ptr);
5129 ptr=strtok(NULL, ";"); if (ptr) entry.Group=atoi(ptr);
5131 ptr=strsep(&Line, ";"); if (ptr) entry.Location=atoi(ptr);
5133 ptr=strsep(&Line, ";"); if (ptr) entry.Group=atoi(ptr);
5137 fprintf(stderr, _("Format problem on line %d [%s] 3\n"),
5138 line_count, BackLine);
5142 for( subentry = 0; ; subentry++ )
5144 #if defined(__svr4__) || defined(__FreeBSD__)
5145 ptr=strtok(NULL, ";");
5147 ptr=strsep(&Line, ";");
5149 if( ptr && *ptr != 0 )
5150 entry.SubEntries[subentry].EntryType=atoi(ptr);
5154 #if defined(__svr4__) || defined(__FreeBSD__)
5155 ptr=strtok(NULL, ";");
5157 ptr=strsep(&Line, ";");
5160 entry.SubEntries[subentry].NumberType=atoi(ptr);
5161 // Phone Numbers need to have a number type.
5162 if(!ptr && entry.SubEntries[subentry].EntryType == GSM_Number)
5164 fprintf(stderr, _("Missing phone number type on line %d"
5165 " entry %d [%s]\n"), line_count, subentry, BackLine);
5170 #if defined(__svr4__) || defined(__FreeBSD__)
5171 ptr=strtok(NULL, ";");
5173 ptr=strsep(&Line, ";");
5176 entry.SubEntries[subentry].BlockNumber=atoi(ptr);
5178 #if defined(__svr4__) || defined(__FreeBSD__)
5179 ptr=strtok(NULL, ";");
5181 ptr=strsep(&Line, ";");
5183 // 0x13 Date Type; it is only for Dailed Numbers, etc.
5184 // we don't store to this memories so it's an error to use it.
5185 if(!ptr || entry.SubEntries[subentry].EntryType == GSM_Date)
5187 fprintf(stderr, _("Is not a phone number on line %d entry %d [%s]\n"),
5188 line_count, subentry, BackLine);
5193 strcpy( entry.SubEntries[subentry].data.Number, ptr );
5196 entry.SubEntriesCount = subentry;
5199 /* This is to send other exports (like from 6110) to 7110 */
5200 if (!entry.SubEntriesCount) {
5201 entry.SubEntriesCount = 1;
5202 entry.SubEntries[subentry].EntryType = GSM_Number;
5203 entry.SubEntries[subentry].NumberType = GSM_General;
5204 entry.SubEntries[subentry].BlockNumber = 2;
5205 strcpy(entry.SubEntries[subentry].data.Number, entry.Number);
5211 GSM_PhonebookEntry tmp_entry;
5213 memcpy(&tmp_entry, &entry, sizeof(GSM_PhonebookEntry) );
5214 error = GSM->GetMemoryLocation(&tmp_entry);
5215 if (error == GE_NONE) {
5216 if (!tmp_entry.Empty) {
5219 FILE *input_flow; //for reading from console, even when input redir.
5221 input_flow = fopen(DEV_CONSOLE, "r");
5224 fprintf(stderr, _("Can't open \"%s\" for input !\n"),DEV_CONSOLE);
5228 fprintf(stderr, _("Location busy. "));
5229 while (confirm < 0) {
5230 fprintf(stderr, _("Overwrite? (yes/no) "));
5231 GetLine(input_flow, ans, 7);
5232 if (!strcmp(ans, "yes")) confirm = 1;
5233 else if (!strcmp(ans, "no")) confirm = 0;
5235 if (!confirm) continue;
5238 fprintf(stderr, _("Unknown error (%d)\n"), error);
5244 /* Do write and report success/failure. */
5245 semicolon_pipe_substitution( &entry, 1 );
5247 error = GSM->WritePhonebookLocation(&entry);
5249 if (error == GE_NONE)
5250 fprintf (stdout, _("Write Succeeded: memory type: %s, loc: %d, name: %s, number: %s\n"), memory_type_string, entry.Location, entry.Name, entry.Number);
5252 fprintf (stdout, _("Write FAILED(%d): memory type: %s, loc: %d, name: %s, number: %s\n"), error, memory_type_string, entry.Location, entry.Name, entry.Number);
5261 /* Getting speed dials. */
5263 static int getspeeddial(char *Number) {
5265 GSM_SpeedDial entry;
5267 GSM_PhonebookEntry pbentry;
5269 entry.Number = atoi(Number);
5273 if (GSM->GetSpeedDial(&entry)==GE_NONE) {
5274 pbentry.Location=entry.Location;
5275 if (pbentry.Location==0) pbentry.Location=entry.Number;
5276 pbentry.MemoryType=entry.MemoryType;
5278 error=GSM->GetMemoryLocation(&pbentry);
5280 if (error == GE_NONE)
5282 fprintf(stdout, _("SpeedDial nr. %d: %d:%d (%s)\n"), entry.Number, entry.MemoryType, entry.Location,pbentry.Name);
5284 fprintf(stdout, _("Error\n"));
5286 fprintf(stdout, _("Error\n"));
5294 /* Setting speed dials. */
5296 static int setspeeddial(char *argv[]) {
5298 GSM_SpeedDial entry;
5300 char *memory_type_string;
5302 /* Handle command line args that set type, start and end locations. */
5304 if (strcmp(argv[1], "ME") == 0) {
5305 entry.MemoryType = GMT_ME;
5306 memory_type_string = "ME";
5308 else if (strcmp(argv[1], "SM") == 0) {
5309 entry.MemoryType = GMT_SM;
5310 memory_type_string = "SM";
5313 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
5318 entry.Number = atoi(argv[0]);
5319 entry.Location = atoi(argv[2]);
5323 if (GSM->SetSpeedDial(&entry) == GE_NONE) {
5324 fprintf(stdout, _("Succesfully written!\n"));
5334 /* Getting the status of the display. */
5336 int getdisplaystatus()
5341 /* Initialise the code for the GSM interface. */
5345 if (GSM->GetDisplayStatus(&Status)==GE_NONE) {
5347 printf(_("Call in progress: %s\n"), Status & (1<<DS_Call_In_Progress)?_("on"):_("off"));
5348 printf(_("Unknown: %s\n"), Status & (1<<DS_Unknown)?_("on"):_("off"));
5349 printf(_("Unread SMS: %s\n"), Status & (1<<DS_Unread_SMS)?_("on"):_("off"));
5350 printf(_("Voice call: %s\n"), Status & (1<<DS_Voice_Call)?_("on"):_("off"));
5351 printf(_("Fax call active: %s\n"), Status & (1<<DS_Fax_Call)?_("on"):_("off"));
5352 printf(_("Data call active: %s\n"), Status & (1<<DS_Data_Call)?_("on"):_("off"));
5353 printf(_("Keyboard lock: %s\n"), Status & (1<<DS_Keyboard_Lock)?_("on"):_("off"));
5354 printf(_("SMS storage full: %s\n"), Status & (1<<DS_SMS_Storage_Full)?_("on"):_("off"));
5357 printf(_("Error\n"));
5365 int netmonitor(char *Mode)
5368 unsigned char mode=atoi(Mode);
5369 char Screen[NM_MAX_SCREEN_WIDTH];
5374 if (!strcmp(Mode,"reset")) mode=0xf0;
5375 else if (!strcmp(Mode,"off")) mode=0xf1;
5376 else if (!strcmp(Mode,"field"))mode=0xf2;
5377 else if (!strcmp(Mode,"devel"))mode=0xf3;
5378 else if (!strcmp(Mode,"next")) mode=0x00;
5381 for (i=0;i<NM_MAX_SCREEN_WIDTH;i++) Screen[i]=0;
5383 GSM->NetMonitor(mode, Screen);
5386 printf("%s\n", Screen);
5393 #endif /* UCLINUX */
5395 static int identify( void )
5397 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
5398 char imei[64], model[64], rev[64], manufacturer[64];
5404 while (GSM->GetIMEI(imei) != GE_NONE) sleep(1);
5406 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
5408 while (GSM->GetModel(model) != GE_NONE) sleep(1);
5411 strcpy(manufacturer, "(unknown)");
5413 GSM->GetManufacturer(manufacturer);
5416 fprintf(stdout, _("IMEI: %s\n"), imei);
5417 fprintf(stdout, _("Model: %s %s (%s)\n"), manufacturer, GetModelName (model), model);
5418 fprintf(stdout, _("Revision: %s\n"), rev);
5429 int senddtmf(char *String)
5434 if (GSM->SendDTMF(String)!=GE_NONE) fprintf(stdout,_("Error!\n"));
5441 #endif /* UCLINUX */
5443 /* Resets the phone */
5444 static int reset(int argc, char *argv[])
5447 unsigned char _type=0x03;
5452 if (!strcmp(argv[0],"soft")) _type = 0x03;
5454 /* Doesn't work with 5110 */
5455 if (!strcmp(argv[0],"hard")) _type = 0x04;
5458 fprintf(stderr, _("What kind of reset do you want (second parameter can be \"soft\" or \"hard\") ?\n"));
5474 /* This is a "convenience" function to allow quick test of new API stuff which
5475 doesn't warrant a "proper" command line function. */
5477 int foogle(char *argv[])
5479 /* Initialise the code for the GSM interface. */
5483 // Fill in what you would like to test here...
5494 /* Initialise the code for the GSM interface. */
5498 if (GSM->PhoneTests()!=GE_NONE) fprintf(stderr,_("Error\n"));
5505 /* pmon allows fbus code to run in a passive state - it doesn't worry about
5506 whether comms are established with the phone. A debugging/development
5513 GSM_ConnectionType connection=GCT_FBUS;
5515 /* Initialise the code for the GSM interface. */
5517 error = GSM_Initialise(model, Port, Initlength, connection, RLP_DisplayF96Frame, ""/*SynchronizeTime*/);
5519 if (error != GE_NONE) {
5520 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
5532 int setringtone(int argc, char *argv[])
5534 GSM_Ringtone ringtone;
5535 GSM_BinRingtone binringtone,binringtone2;
5539 int current=0; //number of packed notes or location
5544 /* If not binary ringtone */
5545 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone2)!=GE_NONE) {
5546 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5548 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5550 ringtone.location=1;
5551 if (argc>1) ringtone.location=atoi(argv[1]);
5553 ringtone.allnotesscale=false;
5555 /* Initialise the GSM interface. */
5558 while (GSM->GetModel(model) != GE_NONE)
5561 /* For Nokia 6110/6130/6150/6210 we use different method of uploading.
5562 Phone will display menu, when received it */
5563 if ( !strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") ||
5564 !strcmp(model,"NSM-1") || !strcmp(model,"NPE-3") ) {
5565 if (argc==1) ringtone.location=255;
5568 error=GSM->SetRingtone(&ringtone,¤t);
5570 if (current!=ringtone.NrNotes) {
5571 if (current>FB61_MAX_RINGTONE_NOTES) {
5572 fprintf(stderr,_("Warning: due to phone limitation"));
5574 fprintf(stderr,_("Warning: ringtone was too long to be saved into frame,"));
5576 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5580 fprintf(stdout, _("Set succeeded!\n"));
5582 fprintf(stdout, _("Setting failed\n"));
5584 } else { /* This IS binary ringtone */
5585 fprintf(stdout,_("Binary ringtone format\n"));
5588 binringtone.frame[current++]=0x00;
5589 binringtone.frame[current++]=0x00;
5590 binringtone.frame[current++]=0x0c;
5591 binringtone.frame[current++]=0x01;
5592 binringtone.frame[current++]=0x2c;
5595 memcpy(binringtone.frame+current,argv[2],strlen(argv[2]));
5596 current=current+strlen(argv[2]);
5600 while(binringtone2.frame[i]!=0x00) {
5601 if (i==binringtone.length) break;
5606 memcpy(binringtone.frame+current,binringtone2.frame+i,binringtone2.length-i);
5607 binringtone.length=binringtone2.length-i+current;
5610 memcpy(binringtone.frame+current,binringtone2.frame,binringtone2.length);
5611 binringtone.length=binringtone2.length;
5614 binringtone.location=1;
5615 if (argc>1) binringtone.location=atoi(argv[1]);
5617 /* Initialise the GSM interface. */
5620 error=GSM->SetBinRingtone(&binringtone);
5624 fprintf(stdout, _("Set succeeded!\n"));
5626 case GE_INVALIDRINGLOCATION:
5627 fprintf(stdout, _("Invalid location %i!\n"),binringtone.location);
5629 case GE_UNKNOWNMODEL:
5630 fprintf(stdout, _("Mygnokii doesn't know format for this model!\n"));
5632 case GE_NOTIMPLEMENTED:
5633 fprintf(stdout, _("Not implemented for this model!\n"));
5636 fprintf(stdout, _("Not supported by this model!\n"));
5646 int ringtoneconvert(int argc, char *argv[])
5648 GSM_Ringtone ringtone;
5650 if (!strcmp(argv[0],argv[1]))
5652 fprintf(stderr, _("Files can't have the same names !\n"));
5656 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5658 ringtone.allnotesscale=false;
5660 GSM_SaveRingtoneFileOnConsole(argv[1], &ringtone);
5665 int playringtone(int argc, char *argv[])
5667 GSM_Ringtone ringtone;
5669 GSM_BinRingtone binringtone;
5675 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
5676 int binary_notes[12] =
5677 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
5679 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone)!=GE_NONE) {
5680 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5682 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5684 /* Initialise the GSM interface. */
5687 fprintf(stdout,_("Playing \"%s\" (%i notes)\n"),ringtone.name,ringtone.NrNotes);
5689 GSM_PlayRingtoneOnConsole(&ringtone);
5693 fprintf(stdout,_("Binary ringtone format\n"));
5695 /* Initialise the GSM interface. */
5699 while (true) { //skipping name
5700 if (binringtone.frame[i]==0) break;
5706 if (binringtone.frame[i]!=j) {
5709 fprintf(stdout,_("Block in binary ringtone %i %i\n"),j,z);
5716 if (!isok && j>=114 && j<=125) {
5717 j=14*3+binary_notes[j-114];
5720 if (!isok && j>=126 && j<=137) {
5721 j=14*1+binary_notes[j-126];
5724 if (!isok && j>=138 && j<=149) {
5725 j=14*2+binary_notes[j-138];
5728 if (!isok && j>=150 && j<=161) {
5729 j=14*4+binary_notes[j-150];
5734 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
5737 Hz=GSM_GetFrequency(j);
5738 if (GSM->PlayTone(Hz,5)!=GE_NONE) fprintf(stdout,_("error during playing\n"));
5742 j=binringtone.frame[i];
5743 z=binringtone.frame[i+1];
5745 z=z+binringtone.frame[i+1];
5748 if (i>=binringtone.length) break;
5759 int composer(int argc, char *argv[])
5761 GSM_Ringtone ringtone;
5764 int oldnoteslen=4,nownoteslen,oldnoteslen2;
5765 int oldnotesscale=1,nownotesscale;
5766 bool firstnote=true;
5767 int DefNoteTempo=63;
5769 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5771 if (ringtone.NrNotes!=0)
5772 DefNoteTempo=ringtone.notes[0].tempo;
5774 fprintf(stdout,_("Ringtone \"%s\" (tempo = %i Beats Per Minute)\n\n"),ringtone.name,GSM_GetTempo(DefNoteTempo));
5776 for (i=0;i<ringtone.NrNotes;i++) {
5777 if (DefNoteTempo!=ringtone.notes[i].tempo) {
5778 fprintf(stdout,_("WARNING: IN FACT RINGTONE HAS DIFFERENT TEMPO FOR DIFFERENT NOTES AND THAT'S WHY YOU CAN'T ENTER IT ALL IN THE COMPOSITOR\n\n"));
5783 for (i=0;i<ringtone.NrNotes;i++) {
5786 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5796 if ((ringtone.NrNotes-i)>50)
5797 fprintf(stdout,_("WARNING: LENGTH=%i, BUT YOU WILL ENTER ONLY FIRST 50 TONES. TO ENTER FULL RINGTONE MUST SEND IT (--sendringtone) OR DOWNLOAD (--setringtone)\n\n"),ringtone.NrNotes-i);
5799 fprintf(stdout,_("This ringtone in Nokia Composer in phone should look: "));
5803 for (i=0;i<ringtone.NrNotes;i++) {
5806 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5812 switch (ringtone.notes[i].duration) {
5813 case 192:fprintf(stdout,_("1."));break; //192=128*1.5
5814 case 128:fprintf(stdout,_("1"));break;
5815 case 96 :fprintf(stdout,_("2."));break; //96=64*1.5
5816 case 64 :fprintf(stdout,_("2"));break;
5817 case 48 :fprintf(stdout,_("4."));break; //48=32*1.5
5818 case 32 :fprintf(stdout,_("4"));break;
5819 case 24 :fprintf(stdout,_("8."));break; //24=16*1.5
5820 case 16 :fprintf(stdout,_("8"));break;
5821 case 12 :fprintf(stdout,_("16."));break; //12=8*1.5
5822 case 8 :fprintf(stdout,_("16"));break;
5823 case 6 :fprintf(stdout,_("32."));break; //6=4*1.5
5824 case 4 :fprintf(stdout,_("32"));break;
5829 /* What note here ? */
5830 switch (GSM_GetNote(ringtone.notes[i].note)) {
5831 case Note_C :fprintf(stdout,_("c"));break;
5832 case Note_Cis:fprintf(stdout,_("#c"));break;
5833 case Note_D :fprintf(stdout,_("d"));break;
5834 case Note_Dis:fprintf(stdout,_("#d"));break;
5835 case Note_E :fprintf(stdout,_("e"));break;
5836 case Note_F :fprintf(stdout,_("f"));break;
5837 case Note_Fis:fprintf(stdout,_("#f"));break;
5838 case Note_G :fprintf(stdout,_("g"));break;
5839 case Note_Gis:fprintf(stdout,_("#g"));break;
5840 case Note_A :fprintf(stdout,_("a"));break;
5841 case Note_Ais:fprintf(stdout,_("#a"));break;
5842 case Note_H :fprintf(stdout,_("h"));break;
5843 default :fprintf(stdout,_("-"));unknown=true;break; //Pause ?
5847 fprintf(stdout,_("%i"),ringtone.notes[i].note/14);
5849 /* And separator before next note */
5850 if (i!=ringtone.NrNotes-1)
5851 fprintf(stdout,_(" "));
5857 fprintf(stdout,_("\n\nTo enter it please press: "));
5861 for (i=0;i<ringtone.NrNotes;i++) {
5864 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5872 /* What note here ? */
5873 switch (GSM_GetNote(ringtone.notes[i].note)) {
5874 case Note_C :fprintf(stdout,_("1"));break;
5875 case Note_Cis:fprintf(stdout,_("1"));break;
5876 case Note_D :fprintf(stdout,_("2"));break;
5877 case Note_Dis:fprintf(stdout,_("2"));break;
5878 case Note_E :fprintf(stdout,_("3"));break;
5879 case Note_F :fprintf(stdout,_("4"));break;
5880 case Note_Fis:fprintf(stdout,_("4"));break;
5881 case Note_G :fprintf(stdout,_("5"));break;
5882 case Note_Gis:fprintf(stdout,_("5"));break;
5883 case Note_A :fprintf(stdout,_("6"));break;
5884 case Note_Ais:fprintf(stdout,_("6"));break;
5885 case Note_H :fprintf(stdout,_("7"));break;
5886 default :fprintf(stdout,_("0"));unknown=true;break;
5889 switch (ringtone.notes[i].duration) {
5890 case 192:fprintf(stdout,_("(longer)"));break; //192=128*1.5
5891 case 96 :fprintf(stdout,_("(longer)"));break; //96=64*1.5
5892 case 48 :fprintf(stdout,_("(longer)"));break; //48=32*1.5
5893 case 24 :fprintf(stdout,_("(longer)"));break; //24=16*1.5
5894 case 12 :fprintf(stdout,_("(longer)"));break; //12=8*1.5
5895 case 6 :fprintf(stdout,_("(longer)"));break; //6=4*1.5
5899 /* What note here ? */
5900 switch (GSM_GetNote(ringtone.notes[i].note)) {
5901 case Note_Cis:fprintf(stdout,_("#"));break;
5902 case Note_Dis:fprintf(stdout,_("#"));break;
5903 case Note_Fis:fprintf(stdout,_("#"));break;
5904 case Note_Gis:fprintf(stdout,_("#"));break;
5905 case Note_Ais:fprintf(stdout,_("#"));break;
5911 nownotesscale=ringtone.notes[i].note/14;
5913 if (nownotesscale!=oldnotesscale) {
5914 switch (nownotesscale) {
5916 switch (oldnotesscale) {
5917 case 2:fprintf(stdout,_("**"));break;
5918 case 3:fprintf(stdout,_("*"));break;
5922 switch (oldnotesscale) {
5923 case 1:fprintf(stdout,_("*"));break;
5924 case 3:fprintf(stdout,_("**"));break;
5928 switch (oldnotesscale) {
5929 case 1:fprintf(stdout,_("**"));break;
5930 case 2:fprintf(stdout,_("*"));break;
5936 oldnotesscale=nownotesscale;
5940 oldnoteslen2=oldnoteslen;
5942 switch (ringtone.notes[i].duration) {
5943 case 192:nownoteslen=1;break; //192=128*1.5
5944 case 128:nownoteslen=1;break;
5945 case 96 :nownoteslen=2;break; //96=64*1.5
5946 case 64 :nownoteslen=2;break;
5947 case 48 :nownoteslen=4;break; //48=32*1.5
5948 case 32 :nownoteslen=4;break;
5949 case 24 :nownoteslen=8;break; //24=16*1.5
5950 case 16 :nownoteslen=8;break;
5951 case 12 :nownoteslen=16;break; //12=8*1.5
5952 case 8 :nownoteslen=16;break;
5953 case 6 :nownoteslen=32;break; //6=4*1.5
5954 case 4 :nownoteslen=32;break;
5957 if (nownoteslen>oldnoteslen) {
5958 while (oldnoteslen!=nownoteslen) {
5959 fprintf(stdout,_("8"));
5960 oldnoteslen=oldnoteslen*2;
5964 if (nownoteslen<oldnoteslen) {
5965 while (oldnoteslen!=nownoteslen) {
5966 fprintf(stdout,_("9"));
5967 oldnoteslen=oldnoteslen/2;
5971 if (GSM_GetNote(ringtone.notes[i].note)==Note_Pause)
5972 oldnoteslen=oldnoteslen2;
5974 /* And separator before next note */
5975 if (i!=ringtone.NrNotes-1)
5976 fprintf(stdout,_(" "));
5981 fprintf(stdout,_("\n"));
5987 int sendringtone(int argc, char *argv[])
5989 GSM_Ringtone ringtone;
5990 GSM_MultiSMSMessage SMS;
5992 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5994 if (GSM_ReadRingtoneFileOnConsole(argv[1], &ringtone)!=GE_NONE) return(-1);
5996 ringtone.allnotesscale=false;
5998 for (i=0;i<argc;i++) {
5999 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
6000 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
6003 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
6005 if (current!=ringtone.NrNotes) {
6006 if (current>FB61_MAX_RINGTONE_NOTES) {
6007 fprintf(stderr,_("Warning: due to phone limitation"));
6009 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
6011 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
6014 for (i=0;i<SMS.number;i++) {
6015 strcpy(SMS.SMS[i].Destination,argv[0]);
6018 /* Initialise the GSM interface. */
6021 GSM_SendMultiPartSMSOnConsole(&SMS, 2,argc,argv,false,true,true);
6026 int saveringtone(int argc, char *argv[])
6028 GSM_Ringtone ringtone;
6029 GSM_MultiSMSMessage SMS;
6031 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
6033 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
6035 ringtone.allnotesscale=false;
6037 for (i=0;i<argc;i++) {
6038 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
6039 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
6042 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
6044 if (current!=ringtone.NrNotes) {
6045 if (current>FB61_MAX_RINGTONE_NOTES) {
6046 fprintf(stderr,_("Warning: due to phone limitation"));
6048 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
6050 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
6053 for (i=0;i<SMS.number;i++) {
6054 /* Only 11 chars could be here */
6055 strncpy(SMS.SMS[i].Destination,ringtone.name,11);
6058 /* Initialise the GSM interface. */
6061 GSM_SaveMultiPartSMSOnConsole(&SMS,1,argc,argv,false,false,true,true);
6066 /* Converts logo files. */
6068 int bitmapconvert(int argc, char *argv[])
6071 GSM_NetworkInfo NetworkInfo;
6075 if (!strcmp(argv[0],argv[1]))
6077 fprintf(stderr, _("Files can't have the same names !\n"));
6081 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
6086 if (!strcmp(argv[2],"op"))
6089 if (argc<4) doit=true;
6090 if (argc<4 && bitmap.type!=GSM_OperatorLogo) doit=true;
6094 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
6097 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
6100 strncpy(bitmap.netcode,argv[3],7);
6101 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
6103 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
6109 if (!strcmp(argv[2],"7110op"))
6112 if (argc<4) doit=true;
6113 if (argc<4 && bitmap.type!=GSM_7110OperatorLogo) doit=true;
6117 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
6120 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
6123 strncpy(bitmap.netcode,argv[3],7);
6124 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
6126 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
6132 if (!strcmp(argv[2],"caller"))
6134 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
6138 if ((num<0)||(num>9)) num=0;
6146 if (!strcmp(argv[2],"startup"))
6148 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
6151 if (!strcmp(argv[2],"7110startup"))
6153 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
6156 if (!strcmp(argv[2],"6210startup"))
6158 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
6161 if (!strcmp(argv[2],"picture"))
6163 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
6168 fprintf(stderr,"Unknown type of logo: %s !\n",argv[2]);
6173 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
6178 int getphoneprofile()
6183 /* Initialise the GSM interface. */
6187 error=GSM->GetProductProfileSetting(&PPS);
6188 if (error!=GE_NONE) {
6189 fprintf(stdout,_("Error!\n"));
6193 fprintf(stdout,_("ALS : "));
6194 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6195 else fprintf(stdout,_("off\n"));
6197 PPS.Name=PPS_VibraMenu;
6198 GSM->GetProductProfileSetting(&PPS);
6199 fprintf(stdout,_("Vibra menu : "));
6200 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6201 else fprintf(stdout,_("off\n"));
6203 PPS.Name=PPS_GamesMenu;
6204 GSM->GetProductProfileSetting(&PPS);
6205 fprintf(stdout,_("Games menu : "));
6206 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6207 else fprintf(stdout,_("off\n"));
6209 PPS.Name=PPS_HRData;
6210 GSM->GetProductProfileSetting(&PPS);
6211 fprintf(stdout,_("HR Data : "));
6212 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6213 else fprintf(stdout,_("off\n"));
6215 PPS.Name=PPS_14400Data;
6216 GSM->GetProductProfileSetting(&PPS);
6217 fprintf(stdout,_("14400 Data : "));
6218 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6219 else fprintf(stdout,_("off\n"));
6221 PPS.Name=PPS_LCDContrast;
6222 GSM->GetProductProfileSetting(&PPS);
6223 fprintf(stdout,_("LCD Contrast : %i%%\n"),PPS.int_value);
6226 GSM->GetProductProfileSetting(&PPS);
6227 fprintf(stdout,_("EFR : "));
6228 switch (PPS.int_value) {
6229 case 0: fprintf(stdout,_("off\n")); break;
6230 case 1: fprintf(stdout,_("last\n")); break;
6231 case 2: fprintf(stdout,_("second\n"));break;
6232 case 3: fprintf(stdout,_("first\n")); break;
6236 GSM->GetProductProfileSetting(&PPS);
6237 fprintf(stdout,_("FR : "));
6238 switch (PPS.int_value) {
6239 case 0: fprintf(stdout,_("off\n")); break;
6240 case 1: fprintf(stdout,_("last\n")); break;
6241 case 2: fprintf(stdout,_("second\n"));break;
6242 case 3: fprintf(stdout,_("first\n")); break;
6246 GSM->GetProductProfileSetting(&PPS);
6247 fprintf(stdout,_("HR : "));
6248 switch (PPS.int_value) {
6249 case 0: fprintf(stdout,_("off\n")); break;
6250 case 1: fprintf(stdout,_("last\n")); break;
6251 case 2: fprintf(stdout,_("second\n"));break;
6252 case 3: fprintf(stdout,_("first\n")); break;
6261 int setphoneprofile(int argc, char *argv[])
6265 bool correct_arg1=false, correct_arg2=false;
6267 if (!strcmp(argv[0],"ALS")) {
6270 if (!strcmp(argv[1],"1")) {
6271 PPS.bool_value=true;
6274 if (!strcmp(argv[1],"0")) {
6275 PPS.bool_value=false;
6278 if (!correct_arg2) {
6279 fprintf(stdout,_("Settings for ALS parameter can be \"0\" or \"1\" !\n"));
6283 if (!strcmp(argv[0],"HRData")) {
6284 PPS.Name=PPS_HRData;
6286 if (!strcmp(argv[1],"1")) {
6287 PPS.bool_value=true;
6290 if (!strcmp(argv[1],"0")) {
6291 PPS.bool_value=false;
6294 if (!correct_arg2) {
6295 fprintf(stdout,_("Settings for HRData parameter can be \"0\" or \"1\" !\n"));
6299 if (!correct_arg1) {
6300 fprintf(stdout,_("First parameter can be \"ALS\" or \"HRData\" only !\n"));
6304 /* Initialise the GSM interface. */
6307 error=GSM->SetProductProfileSetting(&PPS);
6309 if (error!=GE_NONE) {
6310 fprintf(stdout,_("Error!\n"));
6323 int getoperatorname()
6326 GSM_Network network;
6328 /* Initialise the GSM interface. */
6331 if (GSM->GetOperatorName(&network)==GE_NONE)
6333 if (!strcmp(network.Name,"")) {
6334 fprintf(stdout,_("Phone doesn't have downloaded operator name\n"));
6336 fprintf(stdout,_("Phone has downloaded operator name (\"%s\") for \"%s\" (\"%s\") network\n"),
6337 network.Name,network.Code,GSM_GetNetworkName(network.Code));
6347 int setoperatorname(int argc, char *argv[])
6350 GSM_Network network;
6352 /* Initialise the GSM interface. */
6356 strncpy(network.Code,argv[0],7);
6357 strncpy(network.Name,argv[1],50);
6359 strcpy(network.Code,"000 00\0");
6360 strcpy(network.Name,"\0");
6363 if (GSM->SetOperatorName(&network)==GE_NONE) {
6364 if (GSM->GetOperatorName(&network)==GE_NONE) {
6365 if (!strcmp(network.Name,"")) {
6366 fprintf(stdout,_("Downloaded operator name is removed\n"));
6368 fprintf(stdout,_("Downloaded operator name changed for \"%s\" network (\"%s\") to \"%s\"\n"),
6369 network.Code,GSM_GetNetworkName(network.Code),network.Name);
6380 int getvoicemailbox()
6382 GSM_PhonebookEntry entry;
6384 /* Initialise the GSM interface. */
6387 if (GSM->GetVoiceMailbox(&entry)==GE_NONE) {
6388 fprintf(stdout,_("Voice mailbox number is "));
6389 if (!strcmp(entry.Number,""))
6390 fprintf(stdout,_("not set\n"));
6392 fprintf(stdout,_("\"%s\"\n"),entry.Number);
6401 ///////////////////////////////////////////////////////////////////////////////
6402 // flow diagram of netmonitordata():
6403 ///////////////////////////////////////////////////////////////////////////////
6405 // get command line argument
6409 // if specific phone model
6412 // identify-phone: (((((((( TO DO )))))))))))))
6416 // get_mon_param_info() get phone netmonitor parameters name
6417 // specifically to a 'model'
6420 // parse_check() check command line arguments
6421 // | if all OK, go on else stop.
6422 // | because we can have a input file
6423 // v containing multiple
6424 // parse_process() command lines, we process each at once
6425 // so we can exit early on errors.
6427 ///////////////////////////////////////////////////////////////////////////////
6429 // private functions, see netmonitordata()
6430 void free_nm_info(PARAM_INFO_MON *info)
6432 PARAM_INFO_MON *tmp; // pointer, iterator on info
6434 // go to end of list
6436 while (info->next != NULL)
6446 ///////////////////////////////////////////////////////////////////////////////
6447 // this func retrieve parameters info from a file
6448 // and load it in a dynamic array, NULL terminated,
6449 // if 2rd parameter is not NULL, it load also description of screen
6450 // return (PARAM_INFO_MON *start) if all is OK, else NULL
6451 ///////////////////////////////////////////////////////////////////////////////
6452 // start->->next->next->next-> ...->next->NULL
6455 // par0 par1 par2 parN
6456 ///////////////////////////////////////////////////////////////////////////////
6457 // this should be de-allocated from calling function,
6458 // also, screen_name should be deallocated from calling function
6459 ///////////////////////////////////////////////////////////////////////////////
6461 PARAM_INFO_MON *get_mon_param_info(char *f_name, char *screen_name[NM_MAX_SCREEN+1])
6463 PARAM_INFO_MON *start; // pointer to netmonitor parameters info
6464 PARAM_INFO_MON *info; // pointer, iterator on info
6465 PARAM_INFO_MON *check; // pointer, iterator on info, for check usage
6474 char tmp_mname[55]; // very larger, but if netmon bug ...
6475 int x, y, len, s, t; // x & y coord, len, screen nr, type
6478 if (screen_name != NULL)
6479 for (i = 0; i <= NM_MAX_SCREEN; i++)
6480 screen_name[i] = NULL;
6483 if ((f_info = fopen(f_name, "r")) == NULL)
6484 { fprintf(stderr, "Can' t open file parameter info: <%s>\n", f_name);
6488 if ((start = malloc(sizeof(PARAM_INFO_MON))) == NULL)
6489 { fprintf(stderr, "no mem\n");
6493 { start->next = NULL;
6497 while (fgets(buf, 256, f_info) != NULL)
6501 // Truncate from '#' at right of comments
6502 if ((tmp = strchr(param, '#')) != NULL)
6505 // Strip leading, trailing whitespace
6506 while(isspace((int) *param))
6509 while((strlen(param) > 0) && isspace((int) param[strlen(param) - 1]))
6510 param[strlen(param) - 1] = '\0';
6512 // Ignore blank lines
6513 if ((*param == '\n') || (*param == '\0'))
6518 fprintf(stderr, "%s: info line: <%s>\n", f_name, param);
6520 // check for param name
6521 if ((param_name = strtok(param, "=\t\n")) == NULL)
6524 // check if screen name
6525 if (strncmp("SCREEN", param_name, 6) == 0)
6527 // if we do not want screen names ...
6528 if (screen_name == NULL)
6531 // FIXME check for screen nr
6532 if ((tmp = strtok(NULL, ":\n")) == NULL)
6536 // FIXME: check if already defined screen
6538 if ((i <= 0) || (i > NM_MAX_SCREEN))
6540 // check for screen name
6541 if ((tmp = strtok(NULL, ":\n")) == NULL)
6544 screen_name[i] = strdup(tmp);
6550 // FIXME: check for NM_MAX_FIELDS
6552 // check for x coord
6553 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6557 // check for y coord
6558 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6563 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6568 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6572 // check for netmon manual name
6573 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6575 "%s: PARAMETER <%s> in screen <%d>, not have netmon manual reference\n",
6576 f_name, param_name, s);
6577 free_nm_info(start);
6580 strcpy(tmp_mname, tmp);
6582 // check for data type (optional)
6583 if ((tmp = strtok(NULL, ":\t\n")) != NULL)
6588 // check len, here, so we print parameter name
6591 "%s: PARAMETER <%s> in screen <%d>, has invalid data lenght\n",
6592 f_name, param_name, s);
6593 free_nm_info(start);
6597 // check if already defined same param_name
6599 while (check->next != NULL)
6600 { check = check->next;
6601 if (strcmp(param_name, check->name) == 0)
6604 "%s: PARAMETER <%s> in screen <%d> already defined as in screen <%d>\n",
6605 f_name, param_name, s, check->s_nr);
6606 free_nm_info(start);
6611 // make space, and add parameter
6612 if ((info->next = malloc(sizeof(PARAM_INFO_MON))) != NULL)
6615 info->name = strdup(param_name);
6620 info->mname = strdup(tmp_mname);
6623 info->next = NULL; // mark end
6627 fprintf(stderr, "no mem");
6628 free_nm_info(start);
6640 while (info->next != NULL)
6643 fprintf(stderr, "info name %s\n", info->name);
6649 // 2, parse the arguments and check command(s) line
6650 // command line, phone spec input, and output are complex,
6651 // so we exit printing info about error instead of std help
6652 ///////////////////////////////////////////////////////////////////////////////
6654 int parse_check(int argc, char *argv[], PARAM_INFO_MON *start, char *f_name, int line)
6663 PARAM_INFO_MON *info; // iterator on this list
6666 for (i = 0; i < argc; i++)
6667 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6677 { // should be one of the short option
6678 if (strcmp(argv[i], "-fs") == 0)
6679 { // field separator, next arg should be a string
6680 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6682 // arg OK, do nothing
6687 "-fs: Invalid field separator in <%s> at line %d\n",
6690 fprintf(stderr, "-fs: Invalid field separator\n");
6694 else if (strcmp(argv[i], "-ls") == 0)
6695 { // line separator, next arg should be a string
6696 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6698 // arg OK, do nothing
6703 "-ls: Invalid line separator in <%s> at line %d\n",
6706 fprintf(stderr, "-ls: Invalid line separator\n");
6710 else if (strcmp(argv[i], "-tm") == 0)
6711 { // time separator, next arg should be a millisecond (200-10000)
6715 "-tm, -ts, are mutually exclusive in <%s> at line %d\n",
6718 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6722 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6725 // arg OK, do nothing
6730 "-tm: Invalid argument (200-10000 milliseconds), in <%s> at line %d\n",
6733 fprintf(stderr, "-tm: Invalid argument (200-10000 milliseconds)\n");
6737 else if (strcmp(argv[i], "-ts") == 0)
6738 { // time separator, next arg should be a seconds (1-3600)
6742 "-tm, -ts, are mutually exclusive, in <%s> at line %d\n",
6745 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6749 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6752 // arg OK, do nothing
6757 "-ts: Invalid argument (1-3600 seconds) in <%s> at line %d\n",
6760 fprintf(stderr, "-ts: Invalid argument (1-3600 seconds)\n");
6764 else if (strcmp(argv[i], "-n") == 0)
6765 { // nr of data pump, before stop collection,
6766 // next arg should be a int > 0
6767 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6769 // arg OK, do nothing
6774 "-n: Invalid argument (1-99999 times) in <%s> at line %d\n",
6777 fprintf(stderr, "-n: Invalid argument (1-99999 times)\n");
6781 else if (strcmp(argv[i], "-h") == 0)
6782 { // we do NOT want header (default with header)
6783 // arg OK, do nothing
6785 else if (strcmp(argv[i], "-S") == 0)
6786 { // we have used use specs from a file instead of standard info,
6787 // next arg is an existing readable filename
6788 // as already parsed correctly, we skip here.
6791 else if (strcmp(argv[i], "-I") == 0)
6792 { // we have used input from a file instead of command line
6793 // next arg is an existing readable filename
6794 // as already parsed correctly, we skip here.
6800 fprintf(stderr, "Unrecognized option %s in <%s> at line %d\n",
6801 argv[i], f_name, line);
6803 fprintf(stderr, "Unrecognized option %s\n", argv[i]);
6808 { // should be required data
6809 tmp = strdup(argv[i]);
6810 p = strtok(tmp, ":\t\n");
6813 // check if there is an output format specification
6823 // we have 'minus', so, probably forget format ...
6827 "Required data <%s->, without format specifiers in <%s> at line %d\n",
6831 "Required data <%s->, without format specifiers\n", p);
6837 // we check for params
6840 while (info->next != NULL)
6843 if (strcmp(p, info->name) == 0)
6845 if (ctr > NM_MAX_FIELDS)
6849 "too much data field ... in file <%s> at line %d\n",
6852 fprintf(stderr, "too much data field ...\n");
6865 if (found_data == 0)
6869 "Required data <%s>, not found in info-mon specifications in <%s> at line %d\n",
6873 "Required data <%s>, not found in info-mon specifications\n", p);
6877 p = strtok(NULL, ":\t\n");
6879 } // end while strtok
6881 } // end else '-' (short options)
6890 fprintf(stderr, "no required data! in <%s> at line %d\n", f_name, line);
6892 fprintf(stderr, "no required data!\n");
6899 // 2, parse the arguments and process the command line
6900 // no checks are needed here, because already do in parse_check
6901 // it return a pointer to info needed for make output, or NULL if errors
6902 ///////////////////////////////////////////////////////////////////////////////
6903 OUT_INFO_MON *parse_process(int argc, char *argv[], PARAM_INFO_MON *start)
6914 PARAM_INFO_MON *info; // iterator on this list
6915 OUT_INFO_MON *out_param; // iterator on this list
6917 if ((out_param = malloc(sizeof(OUT_INFO_MON))) == NULL)
6918 { fprintf(stderr, "no mem\n");
6923 fprintf(stderr, "parse_process: argc = %d\n", argc);
6924 for (i = 0; i < argc; i++)
6925 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6928 for (i = 0; i < NM_MAX_FIELDS; i++)
6929 out_param->data[i] = NULL;
6931 strcpy(out_param->req_fs, " ");
6933 strcpy(out_param->req_ls, "\n\r");
6935 strcpy(out_param->req_ls, "\n");
6938 out_param->req_n = 0;
6939 out_param->req_header = 1;
6942 req_tm = 200; /* default wait */
6951 { // should be one of the short option
6952 if (strcmp(argv[i], "-fs") == 0)
6953 { // field separator, next arg should be a string
6954 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6956 strcpy(out_param->req_fs, argv[i]);
6959 { fprintf(stderr, "NEVER BE:-fs: Invalid field separator\n");
6963 else if (strcmp(argv[i], "-ls") == 0)
6964 { // line separator, next arg should be a string
6965 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6967 strcpy(out_param->req_ls, argv[i]);
6970 { fprintf(stderr, "NEVER BE:-ls: Invalid line separator\n");
6974 else if (strcmp(argv[i], "-tm") == 0)
6975 { // time separator, next arg should be a millisecond (200-10000)
6977 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6981 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6983 req_tm = atoi(argv[i]);
6987 { fprintf(stderr, "NEVER BE:-tm: Invalid argument (200-10000 milliseconds)\n");
6991 else if (strcmp(argv[i], "-ts") == 0)
6992 { // time separator, next arg should be a seconds (1-3600)
6994 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6998 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
7000 req_ts = atoi(argv[i]);
7007 { fprintf(stderr, "NEVER BE:-ts: Invalid argument (1-3600 seconds)\n");
7011 else if (strcmp(argv[i], "-n") == 0)
7012 { // nr of data pump, before stop collection,
7013 // next arg should be a int > 0
7014 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
7016 out_param->req_n = atoi(argv[i]);
7019 { fprintf(stderr, "NEVER BE:-n: Invalid argument (1-99999 times)\n");
7023 else if (strcmp(argv[i], "-h") == 0)
7024 { // we do NOT want header (default with header)
7025 out_param->req_header = 0;
7027 else if (strcmp(argv[i], "-S") == 0)
7028 { // we have used use specs from a file instead of standard info,
7029 // next arg is an existing readable filename
7030 // as already parsed correctly, we skip here.
7033 else if (strcmp(argv[i], "-I") == 0)
7034 { // we have used input from a file instead of command line
7035 // next arg is an existing readable filename
7036 // as already parsed correctly, we skip here.
7041 fprintf(stderr, "NEVER BE:Unrecognized option %s\n", argv[i]);
7046 { // should be required data
7047 tmp = strdup(argv[i]);
7048 p = strtok(tmp, ":\t\n");
7051 // check if there is an output format specification
7061 // we have 'minus', so, probably forget format ...
7064 "NEVER BE:Required data <%s->, without format specifiers\n", p);
7070 // we check for params
7073 while (info->next != NULL)
7076 if (strcmp(p, info->name) == 0)
7078 if (ctr > NM_MAX_FIELDS)
7080 fprintf(stderr, "NEVER BE:too much data field ...");
7083 out_param->data[ctr] = info;
7084 out_param->out_f[ctr] = *o;
7091 if (found_data == 0)
7094 "NEVER BE:Required data <%s>, not found in info-mon specifications\n", p);
7099 p = strtok(NULL, ":\t\n");
7101 } // end while strtok
7103 // here, we have an array of pointers to required data
7104 // and an array of output specifiers, from 0 to [ctr-1]
7106 } // end else '-' (short options)
7114 fprintf(stderr, "NEVER BE:no required data!\n");
7118 // now, what netmon screen we need to retrieve ?
7119 // we need somewhat were checking is faster, as our goal is lower cicle time
7121 // we can have NM_MAX_SCREEN=254 screens, so we use an array, of unsigned char,
7122 // each char contain number of needed screen, 255 is list terminator
7124 for (i = 0; i <= NM_MAX_SCREEN; i++)
7125 out_param->req_screen[i] = 255;
7129 fprintf(stderr, "Start Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
7131 while (out_param->data[ctr] != NULL)
7134 fprintf(stderr, "Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
7136 // check if screen already in
7139 while (out_param->req_screen[i] != 255)
7141 if (out_param->req_screen[i] == out_param->data[ctr]->s_nr)
7142 { // already load, skip
7149 if (found_data == 0)
7152 fprintf(stderr, "i = %d, out_param->req_screen[%d] = %d\n", i, i, out_param->data[ctr]->s_nr);
7154 out_param->req_screen[i] = out_param->data[ctr]->s_nr;
7163 while (out_param->req_screen[i] != 255)
7165 fprintf(stderr, "Required screen %d\n", out_param->req_screen[i]);
7171 out_param->req_wait = req_tm * 1000;
7173 out_param->req_wait = req_ts * 1000000;
7175 out_param->req_wait = req_tm * 1000;
7181 int nmd_output(OUT_INFO_MON *out_param)
7191 char Screen[NM_MAX_SCREEN_WIDTH];
7193 struct tm *date_time;
7195 if (out_param->req_header)
7197 // print phone help header
7199 while (out_param->data[d] != NULL)
7200 { len = out_param->data[d]->len;
7201 if (strlen(out_param->data[d]->name) > len)
7202 len = strlen(out_param->data[d]->name);
7203 if (strlen(out_param->data[d]->mname) > len)
7204 len = strlen(out_param->data[d]->mname);
7205 printf("%*.*s%s", len, len, out_param->data[d]->name, out_param->req_fs);
7208 printf("%s", out_param->req_ls);
7210 // print netmon manual header
7212 while (out_param->data[d] != NULL)
7213 { len = out_param->data[d]->len;
7214 if (strlen(out_param->data[d]->name) > len)
7215 len = strlen(out_param->data[d]->name);
7216 if (strlen(out_param->data[d]->mname) > len)
7217 len = strlen(out_param->data[d]->mname);
7218 printf("%*.*s%s", len, len, out_param->data[d]->mname, out_param->req_fs);
7221 printf("%s", out_param->req_ls);
7222 printf("%s", out_param->req_ls);
7228 // stop after n data punp
7231 if ((out_param->req_n) && (ctr > out_param->req_n))
7234 // datapump: for each screen, for each required data, load data info->value
7237 while(out_param->req_screen[i] != 255)
7239 if (out_param->req_screen[i] == 0)
7242 date_time = localtime(&sec);
7243 sprintf(Screen, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7245 date_time->tm_mon+1,
7246 date_time->tm_year+1900,
7251 fprintf(stderr, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7253 date_time->tm_mon+1,
7254 date_time->tm_year+1900,
7262 GSM->NetMonitor(out_param->req_screen[i], Screen);
7265 // we have one screen of data, load those required
7268 while (out_param->data[d] != NULL)
7270 if (out_param->data[d]->s_nr == out_param->req_screen[i])
7274 nr_line = out_param->data[d]->y;
7275 while ((*p) && (nr_line))
7283 fprintf(stderr, "\nthis line: %s\n\n", p);
7287 nr_chr = out_param->data[d]->x;
7288 while ((*p) && (nr_chr))
7292 // this the start of data
7294 len = out_param->data[d]->len;
7295 while ((*p) && (len))
7296 { out_param->data[d]->value[n] = *p;
7301 // pad with space if shorter than presumed
7302 while ((*p) && (len))
7303 { out_param->data[d]->value[n] = ' ';
7308 out_param->data[d]->value[n] = '\0';
7317 // print row of data
7319 while (out_param->data[d] != NULL)
7321 len = out_param->data[d]->len;
7322 if (out_param->req_header)
7323 { if (strlen(out_param->data[d]->name) > len)
7324 len = strlen(out_param->data[d]->name);
7325 if (strlen(out_param->data[d]->mname) > len)
7326 len = strlen(out_param->data[d]->mname);
7328 // FIXME check format
7329 printf("%*.*s%s", len, len, out_param->data[d]->value, out_param->req_fs);
7332 printf("%s", out_param->req_ls);
7334 usleep(out_param->req_wait);
7338 printf("%s%s", out_param->req_ls, out_param->req_ls);
7344 ///////////////////////////////////////////////////////////////////////////////
7345 int netmonitordata(int argc, char *argv[])
7347 char *loc_info = NULL; // path to --netmonitordata directory
7348 char *f_name; // absolute path of phone info-file
7349 int flag_phone_spec = 0; // flags, set if used -S option
7351 char model[20] = "phonepar"; // TO DO: PHONE AUTODETECTION
7352 // char phver[20] = "";
7354 PARAM_INFO_MON *start; // pointer to list of parsed phone params
7355 OUT_INFO_MON *out_param; // pointer to struct of output data
7357 char *f_commands = NULL; // file containings input line arguments
7358 FILE *commands; // Handle for this file
7359 char buf[1024]; // buffer
7360 char *f_argv[NM_MAX_FIELDS+30]; // space for parameters and cmdline options
7362 char *p, *tmp; // various counter, flags, tmp area ...
7369 signal(SIGINT, interrupted);
7371 // FIXME model, phone_version
7373 // before parsing phone-info-file, we check for user specified phone-info-file
7378 if (strcmp(argv[i], "-S") == 0)
7382 flag_phone_spec = 1;
7383 loc_info = strdup(argv[i+1]);
7387 { fprintf(stderr, "option -S require an argument ...\n");
7395 if (loc_info != NULL)
7396 { f_name = strdup(loc_info);
7398 else // we use standard file specification
7400 if ((tmp = getenv("INFOMONPATH")) == NULL)
7401 { loc_info = strdup(".");
7404 { loc_info = strdup(tmp);
7407 f_name = malloc(strlen(loc_info)+strlen(model)+10);
7408 sprintf(f_name, "%s/%s", loc_info, model);
7413 // fprintf(stderr, "Loc_info <%s> model <%s> version <%s>\n", loc_info, model, phver);
7414 fprintf(stderr, "Info file: <%s>\n", f_name);
7416 if ((start = get_mon_param_info(f_name, NULL)) == NULL)
7419 // option -I give us the possibility of specify a filename,
7420 // containing a "sequence" of command line args.
7421 // if you specify this option, you can use (on command line) only -S option.
7422 // other options may be specified inside the input-file.
7423 // contents of this file as the same sintax as the command line,
7424 // except it must not contain "--netmonitordata" or "-I" or "-S" options
7425 ///////////////////////////////////////////////////////////////////////
7430 if (strcmp(argv[i], "-I") == 0)
7434 if ((argc == 2) || ((argc == 4) && flag_phone_spec == 1))
7435 { f_commands = strdup(argv[i+1]);
7438 { fprintf(stderr, "option -I accept only additional -S option.\n");
7445 { fprintf(stderr, "option -I require an argument ...\n");
7453 // before all, we check all command line
7455 if (f_commands != NULL)
7458 fprintf(stderr, "netmonitordata(check): commands from <%s>\n", f_commands);
7462 // read line, make array f_argv, and counter f_argc
7463 // parse & check args, so errors are checked before real processing
7464 // (-I option here is ignored)
7465 // (-S option can be here, and it is used)
7468 if ((commands = fopen(f_commands, "r")) == NULL)
7469 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7473 // FIXME line may be be splitted
7475 while (fgets(buf, 1024, commands) != NULL)
7480 // Truncate from '#' at right of comments
7481 if ((tmp = strchr(p, '#')) != NULL)
7484 // Strip leading, trailing whitespace
7485 while(isspace((int) *p))
7488 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7489 p[strlen(p) - 1] = '\0';
7491 // Ignore blank lines
7492 if ((*p == '\n') || (*p == '\0'))
7496 fprintf(stderr, "netmonitordata(check): row <%s>\n", p);
7501 p = strtok(p, " \t");
7503 { f_argv[f_argc++] = strdup(p);
7505 fprintf(stderr, "netmonitordata(check): token <%s>\n", p);
7507 p = strtok(NULL, " \t"); // OK p, (NULL)
7509 while ((p != NULL) && (*p));
7511 // here we have f_argc, f_argv, this line is OK
7513 if (parse_check(f_argc, f_argv, start, f_commands, line) != 0)
7514 { free_nm_info(start);
7521 else // as above, but we have only command line, argv, argc.
7523 if (parse_check(argc, argv, start, NULL, 0) != 0)
7524 { free_nm_info(start);
7529 // here, all commands line are checked, and are correct
7531 if (f_commands != NULL)
7534 fprintf(stderr, "netmonitordata(process): commands from <%s>\n", f_commands);
7539 // read line, make array f_argv, and counter f_argc
7540 // parse_process argument, (-I option here is ignored)
7541 // (-S option can be here, and it is used)
7542 // (make header // these are in nmd_output();
7549 if ((commands = fopen(f_commands, "r")) == NULL)
7550 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7554 // FIXME line may be be splitted
7555 while (fgets(buf, 1024, commands) != NULL)
7559 // Truncate from '#' at right of comments
7560 if ((tmp = strchr(p, '#')) != NULL)
7563 // Strip leading, trailing whitespace
7564 while(isspace((int) *p))
7567 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7568 p[strlen(p) - 1] = '\0';
7570 // Ignore blank lines
7571 if ((*p == '\n') || (*p == '\0'))
7577 p = strtok(p, " \t");
7579 { f_argv[f_argc++] = strdup(p);
7580 p = strtok(NULL, " \t"); // OK p, (NULL)
7582 while ((p != NULL) && (*p));
7584 // here we have f_argc, f_argv, this line is OK
7586 if ((out_param = parse_process(f_argc, f_argv, start)) == NULL)
7587 { free_nm_info(start);
7588 return(-1); /* NEVER BE */
7591 // here, command line has no error ...
7593 nmd_output(out_param);
7600 else // as above, but we have only command line, argv, argc.
7602 if ((out_param = parse_process(argc, argv, start)) == NULL)
7603 { free_nm_info(start);
7604 return(-1); /* NEVER BE */
7606 nmd_output(out_param);
7615 /* I analised this source and this should be done. But when compile with VC6 */
7616 /* I have error. So, commented... MW */
7618 free_nm_info(start);
7625 // used by nm_collect()
7626 ///////////////////////////////////////////////////////////////////////////////
7627 char *rowScreen(char *s)
7631 // make Screen in one row
7643 void printtime(void)
7647 int Year; /* The complete year specification - e.g. 1999. Y2K :-) */
7648 int Month; /* January = 1 */
7653 int Timezone; /* The difference between local time and GMT */
7659 now=localtime(&nowh);
7661 Date.Year = now->tm_year;
7662 Date.Month = now->tm_mon+1;
7663 Date.Day = now->tm_mday;
7664 Date.Hour = now->tm_hour;
7665 Date.Minute = now->tm_min;
7666 Date.Second = now->tm_sec;
7668 /* I have 100 (for 2000) Year now :-) */
7669 if (Date.Year>99 && Date.Year<1900) {
7670 Date.Year=Date.Year+1900;
7673 printf("%d:%d:%d:%d:%d:%d ",Date.Day,Date.Month,Date.Year,Date.Hour,Date.Minute,Date.Second);
7677 // like netmonitor(), but print in one row, 1, 2 or 3 screen, every ~0.3 s
7678 ///////////////////////////////////////////////////////////////////////////////
7679 int nm_collect(int argc, char *argv[])
7681 int mode[MAX_NM_COLLECT];
7682 char Screen[NM_MAX_SCREEN_WIDTH];
7685 for (i=0;i<argc;i++) {
7686 argc > i ? (mode[i] = atoi(argv[i])): (mode[i] = 0);
7689 for (i=0;i<argc;i++) {
7690 if (mode[i]==0 && strcmp(argv[i],"-d")) {
7691 fprintf(stderr, "Wrong %i parameter (not number and not -d)\n",i);
7696 signal(SIGINT, interrupted);
7703 for (i=0;i<argc;i++) {
7704 if (!strcmp(argv[i],"-d")) {
7710 for (i=0;i<argc;i++) {
7713 GSM->NetMonitor(mode[i], Screen);
7714 printf("%s::", rowScreen(Screen));
7729 int sniff(int argc, char *argv[])
7731 /* base model comes from gnokiirc */
7732 strcat(model,"sniff");
7734 if (argc>0) strcpy(Port,argv[0]);
7736 /* Initialise the GSM interface. */
7739 /* Loop here indefinitely - allows you to see messages from GSM code in
7740 response to unknown messages etc. The loops ends after pressing the
7742 while (!bshutdown) {
7752 int decodefile(int argc, char *argv[])
7755 unsigned char in_buffer[255];
7759 /* base model comes from gnokiirc */
7760 strcat(model,"decode");
7762 /* Initialise the GSM interface. */
7765 printf ("open InPutFile: %s\n", argv[0]);
7766 if ( (infile = fopen( argv[0], "rb")) == NULL ) {
7767 printf ("Failed to open InPutFile: %s\n", argv[0]);
7770 while ( (nr_read = fread(in_buffer, 1, 16, infile)) > 0 ) {
7771 for (i=0; i < nr_read; i++)
7772 Protocol->StateMachine(in_buffer[i]);
7780 int getringtone(int argc, char *argv[])
7782 GSM_BinRingtone ringtone;
7784 GSM_Ringtone SMringtone;
7786 ringtone.location=1;
7787 if (argc>1) ringtone.location=atoi(argv[1]);
7789 /* Initialise the GSM interface. */
7792 error=GSM_GetPhoneRingtone(&ringtone,&SMringtone);
7794 fprintf(stdout, _("Downloaded ringtone, location %i: "),ringtone.location);
7798 fprintf(stdout, _("get succeeded!\n"));
7799 /* In 33.. we have normal "Smart Messaging" format */
7800 if (GetModelFeature (FN_RINGTONES)==F_RING_SM) {
7801 fprintf(stdout, _("Name: %s (normal format)\n"),SMringtone.name);
7802 GSM_SaveRingtoneFileOnConsole(argv[0], &SMringtone);
7804 fprintf(stdout, _("Name: %s (binary format)\n"),ringtone.name);
7805 GSM_SaveBinRingtoneFile(argv[0], &ringtone);
7810 case GE_INVALIDRINGLOCATION:
7811 fprintf(stdout, _("invalid location %i!\n"),ringtone.location);
7813 case GE_UNKNOWNMODEL:
7814 fprintf(stdout, _("mygnokii doesn't know format for this model!\n"));
7816 case GE_NOTIMPLEMENTED:
7817 fprintf(stdout, _("not implemented for this model!\n"));
7820 fprintf(stdout, _("not supported by this model!\n"));
7829 int binringtoneconvert(int argc, char *argv[])
7831 GSM_BinRingtone ringtone;
7840 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
7841 int binary_notes[12] =
7842 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
7844 if (GSM_ReadBinRingtoneFile(argv[0],&ringtone)!=GE_NONE) {
7845 fprintf(stdout,_("Failed to read %s file!\n"),argv[0]);
7849 file = fopen(argv[1], "wb");
7852 return(GE_CANTOPENFILE);
7856 if (ringtone.frame[i]==0) break;
7857 fprintf(file,_("%c"),ringtone.frame[i]);
7861 fprintf(file,_(":d=32,o=5,b=300:"));
7865 if (ringtone.frame[i]!=j) {
7872 if (!isok && j>=114 && j<=125) {
7873 j=14*3+binary_notes[j-114];
7876 if (!isok && j>=126 && j<=137) {
7877 j=14*1+binary_notes[j-126];
7880 if (!isok && j>=138 && j<=149) {
7881 j=14*2+binary_notes[j-138];
7884 if (!isok && j>=150 && j<=161) {
7885 j=14*4+binary_notes[j-150];
7890 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
7896 if (w>z && (w/2)<=z) {
7898 case 1:fprintf(file,_("16"));break;
7899 case 2:fprintf(file,_("8"));break;
7900 case 3:fprintf(file,_("4"));break;
7901 case 4:fprintf(file,_("2"));break;
7902 case 5:fprintf(file,_("1"));break;
7907 if (z>w) fprintf(file,_("1"));
7909 switch (GSM_GetNote(j)) {
7910 case Note_C :fprintf(file,_("c"));break;
7911 case Note_Cis:fprintf(file,_("c#"));break;
7912 case Note_D :fprintf(file,_("d"));break;
7913 case Note_Dis:fprintf(file,_("d#"));break;
7914 case Note_E :fprintf(file,_("e"));break;
7915 case Note_F :fprintf(file,_("f"));break;
7916 case Note_Fis:fprintf(file,_("f#"));break;
7917 case Note_G :fprintf(file,_("g"));break;
7918 case Note_Gis:fprintf(file,_("g#"));break;
7919 case Note_A :fprintf(file,_("a"));break;
7920 case Note_Ais:fprintf(file,_("a#"));break;
7921 case Note_H :fprintf(file,_("h"));break;
7922 default :pause=true;fprintf(file,_("p"));break; //Pause ?
7927 if (w>z && (w/2)<=z) {
7928 fprintf(file,_("."));
7932 if ((j/14)!=1 && !pause) fprintf(file,_("%i"),j/14);
7933 fprintf(file,_(","));
7936 j=ringtone.frame[i];
7937 z=ringtone.frame[i+1];
7939 z=z+ringtone.frame[i+1];
7942 if (i>=ringtone.length) break;
7951 int renamesmsc(int argc, char *argv[])
7953 GSM_MessageCenter MessageCenter;
7955 MessageCenter.No=atoi(argv[0]);
7957 /* Initialise the GSM interface. */
7960 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
7961 fprintf(stdout,_("SMSC number %i get OK\n"),MessageCenter.No);
7964 fprintf(stdout,_("Error getting SMSC number %i\n"),MessageCenter.No);
7968 strncpy(MessageCenter.Name,argv[1],10);
7970 if (GSM->SetSMSCenter(&MessageCenter) == GE_NONE) {
7971 fprintf(stdout,_("SMSC number %i set OK (renamed to \"%s\")\n"),MessageCenter.No,MessageCenter.Name);
7974 fprintf(stdout,_("Error setting SMSC number %i\n"),MessageCenter.No);
7983 #endif /* UCLINUX */
7986 * Returns number of sostituited characters.
7987 * ... may be useful one day ??
7989 static int semicolon_pipe_substitution( GSM_PhonebookEntry *pentry, unsigned int direction )
7990 /* direction = 0 : after reading phone memory (
7991 * 1 : writing phone memory
7995 register int count=0;
7996 char charfrom, charto;
7998 charfrom= (direction==0) ? ';' : '|';
7999 charto = (direction==0) ? '|' : ';';
8001 count+=str_substch(pentry->Name, charfrom, charto );
8002 count+=str_substch(pentry->Number, charfrom, charto );
8004 for( i = 0; i < pentry->SubEntriesCount; i++ )
8006 if( pentry->SubEntries[i].EntryType != GSM_Date )
8007 count+=str_substch(pentry->SubEntries[i].data.Number ,charfrom,charto);
8013 int str_substch( char *str, const char toric, const char sost )
8018 for( ct = 0; ct < strlen(str); ct++ )
8019 if( str[ct] == (unsigned char) toric )
8020 { str[ct] = sost; i_sost++; }
8027 extern GSM_Error N6110_EnableExtendedCommands (unsigned char status);
8029 /* Allows to set simlock state.
8030 With older phone (older 51xx, 61xx) can open them, with older
8031 and newer should be able to close them */
8032 /* DO NOT TRY, IF DON'T WANT, WHAT YOU DO !!!!!!!!!! */
8035 GSM_AllSimlocks siml;
8037 unsigned char closebuffer[20]=
8038 { 0x00, 0x01, 0x82, 0x01,
8039 0x00, /* which simlock */
8041 0x00, 0x00, 0x00, /* lock 1 info */
8042 0x00, 0x00, 0x00, 0x00, 0x00, /* lock 4 info */
8043 0x00, 0x00, /* lock 2 info */
8044 0x00, 0x00, /* lock 3 info */
8046 unsigned char openbuffer[10]= { 0x00, 0x01, 0x81, 0x01,
8047 0x00, /* lock number */
8048 0x10, 0x10, 0x10, 0x10, 0x10 };
8049 unsigned char openbuffer0[10]= {0x00, 0x01, 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00 };
8051 unsigned char info[120];
8054 /* Initialise the code for the GSM interface. */
8056 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
8058 fprintf(stderr,("Not supported\n"));
8062 N6110_EnableExtendedCommands(0x02);
8064 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
8065 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
8067 /* Opening all locks (we must check, if we can open them) */
8068 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
8069 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8070 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8071 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8072 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8073 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
8074 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
8077 if (siml.simlocks[i].enabled) {
8078 fprintf(stderr,_("Can not open simlock %i\n"),i+1);GSM->Terminate();return -1;
8081 /* Making frame for closing simlocks */
8082 strcpy(info,"00101");
8084 while (j!=strlen(info)) {
8085 if (j+2<=strlen(info)) {
8086 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
8088 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
8091 strcpy(info,"0000");j=0;i=15;
8092 while (j!=strlen(info)) {
8093 if (j+2<=strlen(info)) {
8094 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
8096 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
8099 strcpy(info,"0000");j=0;i=17;
8100 while (j!=strlen(info)) {
8101 if (j+2<=strlen(info)) {
8102 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
8104 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
8107 strcpy(info,"0000000001");j=0;i=9;
8108 while (j!=strlen(info)) {
8109 if (j+2<=strlen(info)) {
8111 closebuffer[i]=closebuffer[i] | (info[j] & 0x0f);j++;
8113 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
8116 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
8119 /* Closing simlock with given values */
8120 closebuffer[4]=1+2+4+8;
8121 NULL_SendMessageSequence(50, &CurrentMagicError, 20, 0x40,closebuffer);
8122 /* Opening all locks */
8123 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
8124 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8125 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8126 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8127 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8135 GSM_AllSimlocks siml;
8138 /* Initialise the code for the GSM interface. */
8141 if (GSM->SimlockInfo(&siml)!=GE_NONE) fprintf(stderr,_("Error\n"));
8143 fprintf(stdout,_("MCC + MNC : %s ("),siml.simlocks[0].data);
8144 if (siml.simlocks[0].enabled) fprintf(stdout,_("CLOSED"));
8145 else fprintf(stdout,_("opened"));
8146 if (siml.simlocks[0].factory) fprintf(stdout,_(") (factory"));
8147 else fprintf(stdout,_(") (user"));
8148 fprintf(stdout,_(") (counter %i"),siml.simlocks[0].counter);
8150 s[0]=siml.simlocks[0].data[0];
8151 s[1]=siml.simlocks[0].data[1];
8152 s[2]=siml.simlocks[0].data[2];
8154 s[4]=siml.simlocks[0].data[3];
8155 s[5]=siml.simlocks[0].data[4];
8158 if (strcmp(GSM_GetNetworkName(s),"unknown"))
8159 fprintf(stdout,_(") (network \"%s\""),GSM_GetNetworkName(s));
8161 fprintf(stdout,_(")\n"));
8163 fprintf(stdout,_("GID1 : %s ("),siml.simlocks[1].data);
8164 if (siml.simlocks[1].enabled) fprintf(stdout,_("CLOSED"));
8165 else fprintf(stdout,_("opened"));
8166 if (siml.simlocks[1].factory) fprintf(stdout,_(") (factory"));
8167 else fprintf(stdout,_(") (user"));
8168 fprintf(stdout,_(") (counter %i"),siml.simlocks[1].counter);
8169 fprintf(stdout,_(")\n"));
8171 fprintf(stdout,_("GID2 : %s ("),siml.simlocks[2].data);
8172 if (siml.simlocks[2].enabled) fprintf(stdout,_("CLOSED"));
8173 else fprintf(stdout,_("opened"));
8174 if (siml.simlocks[2].factory) fprintf(stdout,_(") (factory"));
8175 else fprintf(stdout,_(") (user"));
8176 fprintf(stdout,_(") (counter %i"),siml.simlocks[2].counter);
8177 fprintf(stdout,_(")\n"));
8179 fprintf(stdout,_("MSIN : %s ("),siml.simlocks[3].data);
8180 if (siml.simlocks[3].enabled) fprintf(stdout,_("CLOSED"));
8181 else fprintf(stdout,_("opened"));
8182 if (siml.simlocks[3].factory) fprintf(stdout,_(") (factory"));
8183 else fprintf(stdout,_(") (user"));
8184 fprintf(stdout,_(") (counter %i"),siml.simlocks[3].counter);
8185 fprintf(stdout,_(")\n"));
8192 /* Getting EEPROM from older phones */
8193 /* Tested with N5110 5.07, 6150 5.22 */
8198 unsigned char buffer[1000]={ 0x00, 0x01, 0xd4, 0x02, 0x00, 0xa0,
8199 0x00, 0x00, /* location Lo and Hi */
8200 0x10 }; /* how many bytes */
8202 strcpy(Connection,"mbus");
8203 fprintf(stderr,_("Switching connection type to MBUS\n"));
8205 strcpy(model,"5110");
8207 /* Initialise the code for the GSM interface. */
8210 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
8212 fprintf(stderr,("Not supported\n"));
8217 for (i=0;i<64;i++) {
8218 fprintf(stdout,_("%c"),0xff);
8225 if ((i/256)!=((i-1)/256)) fprintf(stderr,_("."));
8227 if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE) break;
8232 fprintf(stderr,_("\n"));
8241 GSM_SMSFolders folders;
8246 /* Initialise the code for the GSM interface. */
8251 error=GSM->GetSMSFolders(&folders);
8255 if (error!=GE_NONE && !folders.number) {
8256 fprintf(stdout,_("Error!\n"));
8260 for (i=0;i<folders.number;i++) {
8261 fprintf(stdout,_("%i. %s\n"),i+1,folders.Folder[i].Name);
8267 int resetphonesettings()
8269 /* Initialise the code for the GSM interface. */
8272 GSM->ResetPhoneSettings();
8281 /* Checked on 3310 4.02 and doesn't work.
8282 Possible reasons: SMSC has problems (possible), bug in phone firmware
8283 (very possible) or here in code.
8284 I quess, that the second is the most possible - 3310 treat only 3 SMS
8285 as linked (the most often profile needs 4 - 2 and few bytes in 3'th
8286 for screen saver, few bytes for profile name and 1 or 2 sms for ringtone).
8287 When send separate ringtone (see --sendringtone with --profilestyle)
8288 and screen saver (--sendlogo screensaver...), it's received OK.
8289 It's for checking in higher firmware. */
8290 int sendprofile(int argc, char *argv[])
8292 GSM_Ringtone ringtone;
8294 GSM_MultiSMSMessage MultiSMS;
8298 u8 MessageBuffer[140*4];
8299 u16 MessageLength=0;
8301 char profilename[10+1];
8303 if (GSM_ReadRingtoneFileOnConsole(argv[2], &ringtone)!=GE_NONE) return(-1);
8305 ringtone.allnotesscale=false;
8306 for (i=0;i<argc;i++)
8307 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
8309 /* The fourth argument is the bitmap file. */
8310 if (GSM_ReadBitmapFileOnConsole(argv[3], &bitmap)!=GE_NONE) return -1;
8312 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
8314 strncpy(profilename,argv[1],10);
8316 MessageBuffer[MessageLength++]=0x30; //SM version. Here 3.0
8318 MessageBuffer[MessageLength++]=SM30_PROFILENAME; //ID for profile name
8319 MessageBuffer[MessageLength++]=0x00; //length hi
8320 MessageBuffer[MessageLength++]=strlen(profilename);//length lo
8322 EncodeUnicode (MessageBuffer+MessageLength,profilename ,strlen(profilename));
8323 MessageLength=MessageLength+2*strlen(profilename);
8325 MessageBuffer[MessageLength++]=SM30_RINGTONE; //ID for ringtone
8327 MessageBuffer[MessageLength++]=0x01; //length hi
8328 MessageBuffer[MessageLength++]=0x00; //length lo
8330 j=SM30_MAX_RINGTONE_FRAME_LENGTH;
8331 current=GSM_PackRingtone(&ringtone, MessageBuffer+MessageLength, &j);
8332 MessageLength=MessageLength+j;
8334 if (current!=ringtone.NrNotes) {
8335 if (current>FB61_MAX_RINGTONE_NOTES) {
8336 fprintf(stderr,_("Warning: due to phone limitation"));
8338 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
8340 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
8343 MessageBuffer[i]=(j)/256;
8344 MessageBuffer[i+1]=(j)%256;
8346 MessageBuffer[MessageLength++]=SM30_SCREENSAVER; //ID for OTA screen saver
8347 MessageBuffer[MessageLength++]=0x01; //length hi
8348 MessageBuffer[MessageLength++]=0x00; //length lo
8349 MessageBuffer[MessageLength++]=0x00;
8350 MessageBuffer[MessageLength++]=bitmap.width;
8351 MessageBuffer[MessageLength++]=bitmap.height;
8352 MessageBuffer[MessageLength++]=0x01;
8354 memcpy(MessageBuffer+MessageLength,bitmap.bitmap,bitmap.size);
8355 MessageLength=MessageLength+bitmap.size;
8357 GSM_MakeMultiPartSMS2(&MultiSMS,MessageBuffer,MessageLength, GSM_ProfileUDH, GSM_Coding_Default);
8361 /* Initialise the GSM interface. */
8364 for (i=0;i<MultiSMS.number;i++)
8365 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
8367 return GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,false,false,false);
8370 int showbitmap(int argc, char *argv[])
8374 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
8376 GSM_PrintBitmap(&bitmap);
8381 int getwapsettings(int argc, char *argv[])
8383 GSM_WAPSettings settings;
8386 settings.location=atoi(argv[0]);
8388 /* Initialise the GSM interface. */
8391 error=GSM->GetWAPSettings(&settings);
8395 fprintf(stdout,_("%s."),argv[0]);
8396 if (!(strcmp(settings.title,""))) fprintf(stdout,_("Set %s\n"),argv[0]);
8397 else fprintf(stdout,_("%s\n"),settings.title);
8398 fprintf(stdout,_("Homepage: %s\n"),settings.homepage);
8399 if (settings.iscontinuous) fprintf(stdout,_("Connection type: continuous\n"));
8400 else fprintf(stdout,_("Connection type: temporary\n"));
8401 if (settings.issecurity) fprintf(stdout,_("Connection security: on\n"));
8402 else fprintf(stdout,_("Connection security: off\n"));
8403 switch (settings.bearer) {
8404 case WAPSETTINGS_BEARER_SMS:
8405 fprintf(stdout,_("Bearer: SMS\n"));
8406 fprintf(stdout,_("Server number: %s\n"),settings.server);
8407 fprintf(stdout,_("Service number: %s\n"),settings.service);
8409 case WAPSETTINGS_BEARER_DATA:
8410 fprintf(stdout,_("Bearer: Data (CSD)\n"));
8411 fprintf(stdout,_("Dial-up number: %s\n"),settings.dialup);
8412 fprintf(stdout,_("IP address: %s\n"),settings.ipaddress);
8413 if (settings.isnormalauthentication) fprintf(stdout,_("Authentication type: normal\n"));
8414 else fprintf(stdout,_("Authentication type: secure\n"));
8415 if (settings.isISDNcall) fprintf(stdout,_("Data call type: ISDN\n"));
8416 else fprintf(stdout,_("Data call type: analogue\n"));
8417 if (settings.isspeed14400) fprintf(stdout,_("Data call speed: 14400\n"));
8418 else fprintf(stdout,_("Data call speed: 9600\n"));
8419 fprintf(stdout,_("User name: %s\n"),settings.user);
8420 fprintf(stdout,_("Password: %s\n"),settings.password);
8422 case WAPSETTINGS_BEARER_USSD:
8423 fprintf(stdout,_("Bearer: USSD\n"));
8424 fprintf(stdout,_("Service code: %s\n"),settings.code);
8425 if (settings.isIP) fprintf(stdout,_("Address type: IP address\nIPaddress: %s\n"),settings.service);
8426 else fprintf(stdout,_("Address type: service number\nService number: %s\n"),settings.service);
8431 fprintf(stderr,_("%s\n"),print_error(error));
8440 /* Not full done now */
8441 int savewapsettings(int argc, char *argv[])
8443 GSM_WAPSettings settings;
8444 GSM_MultiSMSMessage MultiSMS;
8448 settings.location=atoi(argv[0]);
8450 /* Initialise the GSM interface. */
8453 error=GSM->GetWAPSettings(&settings);
8454 // strcpy(settings.homepage,"http://OtherSites/");
8455 // strcpy(settings.title,"Orange");
8461 /* Put settings into SMS structure */
8462 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8464 for (w=0;w<MultiSMS.number;w++)
8465 strcpy(MultiSMS.SMS[w].Destination,"WAPSettings");
8467 GSM_SaveMultiPartSMSOnConsole(&MultiSMS,1,argc,argv,false,false,false,false);
8472 fprintf(stderr,_("%s\n"),print_error(error));
8480 int sendwapsettings(int argc, char *argv[])
8482 GSM_WAPSettings settings;
8483 GSM_MultiSMSMessage MultiSMS;
8487 settings.location=atoi(argv[0]);
8489 /* Initialise the GSM interface. */
8492 error=GSM->GetWAPSettings(&settings);
8493 // strcpy(settings.homepage,"http://OtherSites/");
8494 // strcpy(settings.title,"Orange");
8500 /* Put settings into SMS structure */
8501 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8503 for (w=0;w<MultiSMS.number;w++)
8504 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8506 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8512 fprintf(stderr,_("%s\n"),print_error(error));
8520 int getwapbookmark(int argc, char *argv[])
8522 GSM_WAPBookmark bookmark;
8525 bookmark.location=atoi(argv[0]);
8527 /* Initialise the GSM interface. */
8530 error=GSM->GetWAPBookmark(&bookmark);
8534 if (bookmark.address[0]==0) {
8535 fprintf(stdout,_("Empty bookmark location\n"));
8537 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
8538 if (bookmark.title[0]==0)
8539 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
8541 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
8545 fprintf(stderr,_("%s\n"),print_error(error));
8554 int setwapbookmark(int argc, char *argv[])
8556 GSM_WAPBookmark bookmark;
8559 if (argc == 3) /* if location given, use it */
8560 bookmark.location=atoi(argv[2]);
8561 else /* else use first empty location */
8562 bookmark.location=0xffff;
8564 strcpy(bookmark.title, argv[0]);
8565 strcpy(bookmark.address, argv[1]);
8567 /* Initialise the GSM interface. */
8570 error=GSM->SetWAPBookmark(&bookmark);
8574 fprintf(stdout,_("No errors\n"));
8577 fprintf(stderr,_("%s\n"),print_error(error));
8586 int savewapbookmark(int argc, char *argv[])
8588 GSM_WAPBookmark bookmark;
8589 GSM_MultiSMSMessage MultiSMS;
8593 bookmark.location=atoi(argv[0]);
8595 /* Initialise the GSM interface. */
8598 error=GSM->GetWAPBookmark(&bookmark);
8600 // strcpy(bookmark.title,"tytulagagagagagagagagagagagagagagagagagagagagagend");
8601 // strcpy(bookmark.address,"http://jajajajajajajajajajajajagagagagagagagagagagagagagagagagagagagagagpapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap¥papapapapapapapapagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdstp");
8607 if (bookmark.address[0]==0) {
8608 fprintf(stdout,_("Empty bookmark location\n"));
8613 /* Put bookmark into SMS structure */
8614 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8616 for (w=0;w<MultiSMS.number;w++)
8617 strcpy(MultiSMS.SMS[w].Destination,"WAPBookmark");
8619 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 1,argc,argv,false,false,false,false);
8624 fprintf(stderr,_("%s\n"),print_error(error));
8633 int sendwapbookmark(int argc, char *argv[])
8635 GSM_WAPBookmark bookmark;
8636 GSM_MultiSMSMessage MultiSMS;
8640 bookmark.location=atoi(argv[0]);
8642 /* Initialise the GSM interface. */
8645 error=GSM->GetWAPBookmark(&bookmark);
8650 if (bookmark.address[0]==0) {
8651 fprintf(stdout,_("Empty bookmark location\n"));
8656 /* Put bookmark into SMS structure */
8657 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8659 for (w=0;w<MultiSMS.number;w++)
8660 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8662 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8667 fprintf(stderr,_("%s\n"),print_error(error));
8676 int savecalendarnote(int argc, char *argv[])
8678 GSM_MultiSMSMessage MultiSMS;
8680 GSM_CalendarNote CalendarNote;
8683 number=atoi(argv[1]);
8686 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8690 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
8693 case GE_CANTOPENFILE:
8694 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
8697 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8700 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
8706 /* Put note into SMS structure */
8707 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8709 for (w=0;w<MultiSMS.number;w++)
8710 strcpy(MultiSMS.SMS[w].Destination,"Calendar");
8712 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8717 int sendcalendarnote(int argc, char *argv[])
8719 GSM_MultiSMSMessage MultiSMS;
8721 GSM_CalendarNote CalendarNote;
8724 number=atoi(argv[2]);
8727 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8731 switch ( GSM_ReadVCalendarFile(argv[1], &CalendarNote, &number) ) {
8734 case GE_CANTOPENFILE:
8735 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[1]);
8738 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8741 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[1]);
8747 /* Put note into SMS structure */
8748 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8750 for (w=0;w<MultiSMS.number;w++)
8751 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8753 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8758 /* Example function for continuous receiving SMS */
8759 /* When phone receives SMS, it's read by mygnokii, ID number is created
8760 and SMS is saved to file. After it it's deleted
8761 Checking many errors is also done */
8762 int receivesms(int argc, char *argv[])
8766 GSM_SMSStatus SMSStatus = {0, 0};
8768 int read, location, number;
8769 unsigned char name[50],filename[400];
8770 char nowdate[12]="", nowtime[12]="";
8773 struct CFG_Header *cfg_info;
8775 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
8778 signal(SIGINT, interrupted);
8780 fprintf (stderr, _("Entering monitor mode (press CTRL+C to break)...\n"));
8782 cfg_info=CFG_FindGnokiirc();
8785 if (cfg_info!=NULL) {
8786 if (CFG_Get(cfg_info, "receivesms", "path")) {
8787 strcpy(Dir,CFG_Get(cfg_info, "receivesms", "path"));
8791 fprintf(stderr,_("Path for sms files is \"%s\"\n"),Dir);
8793 fprintf (stderr, _("Initialising GSM interface..."));
8795 /* Initialise the code for the GSM interface. */
8798 fprintf (stderr, _("done\n"));
8802 /* Loop here indefinitely - allows you to see messages from GSM code in
8803 response to unknown messages etc. The loops ends after pressing the
8805 while (!bshutdown) {
8806 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE) {
8807 if (SMSStatus.Number!=0) {
8809 GetMachineDateTime(nowdate, nowtime );
8810 logfile = fopen("log", "a");
8812 fprintf(logfile, _("%s %s SMS Messages: UnRead %d, Number %d\n"),
8813 nowdate, nowtime, SMSStatus.UnRead, SMSStatus.Number);
8820 while (!bshutdown) {
8822 SMS.Location=location;
8823 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
8824 if (SMS.folder==0 || SMS.folder==0x08) { //GST_7110_INBOX
8826 GetMachineDateTime(nowdate, nowtime );
8827 logfile = fopen("log", "a");
8829 fprintf(logfile,_("%s %s SMS on location %i\n"),
8830 nowdate,nowtime,SMS.MessageNumber);
8834 number= 16*(SMS.MessageText[2] >> 4)+ (SMS.MessageText[2] & 0x0f);
8835 number=number+ 256*16*(SMS.MessageText[1] >> 4)+ 256*(SMS.MessageText[1] & 0x0f);
8836 number=number+65536*16*(SMS.MessageText[0] >> 4)+65536*(SMS.MessageText[0] & 0x0f);
8838 sprintf( name, "%07i_%02d%02d%02d_%02d%02d%02d.sms", number,
8839 SMS.Time.Year, SMS.Time.Month, SMS.Time.Day,
8840 SMS.Time.Hour, SMS.Time.Minute, SMS.Time.Second);
8842 strcpy(filename,Dir);
8843 strcat(filename,name);
8845 logfile = fopen("log", "a");
8847 fprintf(logfile,_("%s %s Name is \"%s\"\n"),nowdate,nowtime,filename);
8851 file = fopen(filename, "rb");
8853 file = fopen(filename, "wb");
8855 GetMachineDateTime(nowdate, nowtime );
8856 fprintf(stderr,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8857 logfile = fopen("log", "a");
8859 fprintf(logfile,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8863 fwrite(SMS.MessageText,1,SMS.Length,file);
8869 GetMachineDateTime(nowdate, nowtime );
8870 fprintf(stderr,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8871 logfile = fopen("log", "a");
8873 fprintf(logfile,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8878 SMS.Location=SMS.MessageNumber;
8879 if (GSM->DeleteSMSMessage(&SMS)!=GE_NONE) {
8880 GetMachineDateTime(nowdate, nowtime );
8881 fprintf(stderr,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8882 logfile = fopen("log", "a");
8884 fprintf(logfile,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8892 if (read==SMSStatus.Number) break;
8896 GetMachineDateTime(nowdate, nowtime );
8897 fprintf(stderr,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8898 logfile = fopen("log", "a");
8900 fprintf(logfile,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8908 fprintf (stderr, _("Leaving monitor mode...\n"));
8915 int divert(int argc, char *argv[])
8920 memset(&cd, 0, sizeof(GSM_CallDivert));
8922 if (!strcmp("register", argv[0])){cd.Operation = GSM_CDV_Register ;}
8923 else if (!strcmp("enable" , argv[0])){cd.Operation = GSM_CDV_Enable ;}
8924 else if (!strcmp("disable" , argv[0])){cd.Operation = GSM_CDV_Disable ;}
8925 else if (!strcmp("erasure" , argv[0])){cd.Operation = GSM_CDV_Erasure ;}
8926 else if (!strcmp("query" , argv[0])){cd.Operation = GSM_CDV_Query ;}
8932 if (!strcmp("all" , argv[1])) {cd.DType = GSM_CDV_AllTypes ;}
8933 else if (!strcmp("busy" , argv[1])) {cd.DType = GSM_CDV_Busy ;}
8934 else if (!strcmp("noans" , argv[1])) {cd.DType = GSM_CDV_NoAnswer ;}
8935 else if (!strcmp("outofreach", argv[1])) {cd.DType = GSM_CDV_OutOfReach;}
8941 if (!strcmp("all" , argv[2])) {cd.CType = GSM_CDV_AllCalls ;}
8942 else if (!strcmp("voice", argv[2])) {cd.CType = GSM_CDV_VoiceCalls;}
8943 else if (!strcmp("fax" , argv[2])) {cd.CType = GSM_CDV_FaxCalls ;}
8944 else if (!strcmp("data" , argv[2])) {cd.CType = GSM_CDV_DataCalls ;}
8950 if (argc>3) strcpy(cd.Number, argv[3]);
8952 if (argc>4) cd.Timeout = atoi(argv[4]);
8954 /* Initialise the code for the GSM interface. */
8957 error=GSM->CallDivert(&cd);
8959 if (error == GE_NONE) {
8960 switch (cd.Operation)
8963 fprintf(stdout, _("Divert type: "));
8965 case GSM_CDV_Busy :fprintf(stdout, _("when busy"));break;
8966 case GSM_CDV_NoAnswer :fprintf(stdout, _("when not answered"));break;
8967 case GSM_CDV_OutOfReach:fprintf(stdout, _("when phone off or no coverage"));break;
8968 case GSM_CDV_AllTypes :fprintf(stdout, _("all call diverts"));break; //?
8969 default: fprintf(stdout, _("unknown %i"),cd.DType);break;
8972 fprintf(stdout, _("\nCalls type : "));
8974 case GSM_CDV_VoiceCalls: fprintf(stdout, _("voice"));break;
8975 case GSM_CDV_FaxCalls : fprintf(stdout, _("fax"));break;
8976 case GSM_CDV_DataCalls : fprintf(stdout, _("data"));break;
8977 case GSM_CDV_AllCalls : fprintf(stdout, _("voice, fax & data"));break;
8978 default: fprintf(stdout, _("unknown %i"),cd.CType);break;
8980 fprintf(stdout, _("\n"));
8983 fprintf(stdout, _("Status : active\n"));
8984 fprintf(stdout, _("Timeout : %i seconds\n"),cd.Timeout);
8985 fprintf(stdout, _("Number : %s\n"),cd.Number);
8987 fprintf(stdout, _("Status : deactivated\n"));
8992 fprintf(stdout,_("Divert done\n"));
8995 fprintf(stderr,_("%s\n"),print_error(error));
9002 int savephonebookentry(int argc, char *argv[])
9004 GSM_MultiSMSMessage MultiSMS;
9005 GSM_PhonebookEntry entry;
9011 /* Handle command line args that set type, start and end locations. */
9012 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
9014 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
9018 entry.Location=atoi(argv[1]);
9022 error=GSM->GetMemoryLocation(&entry);
9027 /* Put entry into SMS structure */
9029 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT) {
9030 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
9032 #endif /* UCLINUX */
9034 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
9037 for (w=0;w<MultiSMS.number;w++)
9038 strcpy(MultiSMS.SMS[w].Destination,"Phonebook");
9040 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
9044 fprintf(stdout,_("Error\n"));break;
9050 int sendphonebookentry(int argc, char *argv[])
9052 GSM_MultiSMSMessage MultiSMS;
9053 GSM_PhonebookEntry entry;
9059 /* Handle command line args that set type, start and end locations. */
9060 if (!GetMemoryTypeID(argv[1], &entry.MemoryType))
9062 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
9066 entry.Location=atoi(argv[2]);
9070 error=GSM->GetMemoryLocation(&entry);
9075 /* Put entry into SMS structure */
9076 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT) {
9077 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
9079 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
9082 for (w=0;w<MultiSMS.number;w++)
9083 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
9085 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
9090 fprintf(stdout,_("Error\n"));break;
9097 int getbinringfromfile(int argc, char *argv[])
9102 GSM_BinRingtone binring,ringtone;
9104 fprintf(stdout,_("Offset %ld\n"),atol(argv[2]));
9106 file = fopen(argv[0], "rb");
9108 if (!file) return(GE_CANTOPENFILE);
9110 fseek(file,atol(argv[2]),0);
9112 ringtone.length=fread(ringtone.frame, 1, 900, file);
9118 if (ringtone.frame[i ]==0x00 && ringtone.frame[i+1]==0x02 &&
9119 ringtone.frame[i+2]==0xFC && ringtone.frame[i+3]==0x09) {
9124 if (i==ringtone.length-3) break;
9128 fprintf(stdout,_("Start not found\n"));
9134 if (ringtone.frame[j]==0x07 && ringtone.frame[j+1]==0x0B) {
9139 if (j==ringtone.length-2) break;
9143 fprintf(stdout,_("End not found\n"));
9148 binring.frame[binring.length++]=0x00;
9149 binring.frame[binring.length++]=0x00;
9150 binring.frame[binring.length++]=0x0C;
9151 binring.frame[binring.length++]=0x01;
9152 binring.frame[binring.length++]=0x2C;
9154 memcpy(binring.frame+binring.length,argv[1],strlen(argv[1]));
9155 binring.length=binring.length+strlen(argv[1]);
9157 binring.frame[binring.length++]=0x00;
9159 memcpy(binring.frame+binring.length,ringtone.frame+i,j-i+2);
9160 binring.length=binring.length+j-i+2;
9162 GSM_SaveBinRingtoneFile(argv[3], &binring);
9168 #endif /* UCLINUX */