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.
25 /* <getopt.h> or "getopt.h" would include insufficient getopt.h from uClinux */
26 #include "../getopt/getopt.h"
30 #if defined(__svr4__) || defined(__FreeBSD__)
31 # include <strings.h> /* for bzero */
34 /* for VC6 make scripts save VERSION constant in mversion.h file */
42 #include "misc_win32.h"
45 #define DEV_CONSOLE "CON:"
52 #include <sys/types.h>
56 #define DEV_CONSOLE "/dev/tty"
60 #include "gsm-common.h"
62 #include "gsm-networks.h"
64 #include "gsm-ringtones.h"
65 #include "gsm-bitmaps.h"
68 #include "gsm-datetime.h"
70 #include "gsm-phonebook.h"
72 #include "gsm-calendar.h"
74 #include "gsm-coding.h"
76 #include "newmodules/n6110.h"
78 #include "files/cfgreader.h"
80 #include "files/gsm-filetypes.h"
84 #include "data/virtmodem.h"
91 static char *model; /* Model from .gnokiirc file. */
92 static char *Port; /* Port from .gnokiirc file */
93 static char *Initlength; /* Init length from .gnokiirc file */
94 static char *Connection; /* Connection type from .gnokiirc file */
96 char *SynchronizeTime; /* If we set date and time from computer to phone (from .gnokiirc file) */
98 static char *BinDir; /* Binaries directory from .gnokiirc file - not used here yet */
101 static GSM_SMSMessage SMS[4];
106 char *GetProfileCallAlertString(int code) {
109 case PROFILE_CALLALERT_RINGING : return "Ringing";
110 case PROFILE_CALLALERT_ASCENDING : return "Ascending";
111 case PROFILE_CALLALERT_RINGONCE : return "Ring once";
112 case PROFILE_CALLALERT_BEEPONCE : return "Beep once";
113 case PROFILE_CALLALERT_CALLERGROUPS: return "Caller groups";
114 case PROFILE_CALLALERT_OFF : return "Off";
115 default : return "Unknown";
119 char *GetProfileVolumeString(int code) {
122 case PROFILE_VOLUME_LEVEL1 : return "Level 1";
123 case PROFILE_VOLUME_LEVEL2 : return "Level 2";
124 case PROFILE_VOLUME_LEVEL3 : return "Level 3";
125 case PROFILE_VOLUME_LEVEL4 : return "Level 4";
126 case PROFILE_VOLUME_LEVEL5 : return "Level 5";
127 default : return "Unknown";
131 char *GetProfileKeypadToneString(int code) {
134 case PROFILE_KEYPAD_OFF : return "Off";
135 case PROFILE_KEYPAD_LEVEL1 : return "Level 1";
136 case PROFILE_KEYPAD_LEVEL2 : return "Level 2";
137 case PROFILE_KEYPAD_LEVEL3 : return "Level 3";
138 default : return "Unknown";
142 char *GetProfileMessageToneString(int code) {
145 case PROFILE_MESSAGE_NOTONE : return "No tone";
146 case PROFILE_MESSAGE_STANDARD : return "Standard";
147 case PROFILE_MESSAGE_SPECIAL : return "Special";
148 case PROFILE_MESSAGE_BEEPONCE : return "Beep once";
149 case PROFILE_MESSAGE_ASCENDING : return "Ascending";
150 default : return "Unknown";
154 char *GetProfileWarningToneString(int code) {
157 case PROFILE_WARNING_OFF : return "Off";
158 case PROFILE_WARNING_ON : return "On";
159 default : return "Unknown";
163 char *GetProfileOnOffString(int code) {
166 case 0x00 : return "Off";
167 case 0x01 : return "On";
168 default : return "Unknown";
172 static char *GetProfileVibrationString(int code)
175 case PROFILE_VIBRATION_OFF: return "Off";
176 case PROFILE_VIBRATION_ON: return "On";
177 case PROFILE_VIBRATION_FIRST: return "Vibrate first";
178 default: return "Unknown";
182 char BufferProfileGroups[90];
184 char *GetProfileCallerGroups(int code)
186 static char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
187 static bool enteronce=false;
191 if( code == PROFILE_CALLERGROUPS_ALL )
192 return _("All calls alert");
195 for(i=0;i<5;i++) az_group_name[i][0]='\0';
199 BufferProfileGroups[0]=0;
206 code2test=(i==0) ? 1 : 2<<(i-1);
208 if( code & code2test )
210 if (!strcmp(az_group_name[i],""))
212 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
213 bitmap.type=GSM_CallerLogo;
215 strcpy(z_gtype,_("unknown"));
216 if (GSM->GetBitmap(&bitmap)==GE_NONE)
217 strcpy( az_group_name[i], bitmap.text );
219 if ((!strcmp(az_group_name[i],""))) {
221 case 0:strcpy(az_group_name[i],_("Family"));break;
222 case 1:strcpy(az_group_name[i],_("VIP"));break;
223 case 2:strcpy(az_group_name[i],_("Friends"));break;
224 case 3:strcpy(az_group_name[i],_("Colleagues"));break;
225 case 4:strcpy(az_group_name[i],_("Other"));break;
230 strcpy(z_gtype,az_group_name[i]);
232 if( strlen(BufferProfileGroups) ) strcat(BufferProfileGroups,"+");
233 strcat(BufferProfileGroups, z_gtype);
238 return BufferProfileGroups;
241 static char *print_error(GSM_Error e)
244 // case GE_DEVICEOPENFAILED: return "Couldn't open specified serial device.";
245 // case GE_UNKNOWNMODEL: return "Model specified isn't known/supported.";
246 // case GE_NOLINK: return "Couldn't establish link with phone.";
247 // case GE_TRYAGAIN: return "Try again.";
248 // case GE_INVALIDSMSLOCATION: return "Invalid SMS location.";
249 // case GE_INVALIDPHBOOKLOCATION: return "Invalid phonebook location.";
250 // case GE_INVALIDMEMORYTYPE: return "Invalid type of memory.";
251 // case GE_INVALIDSPEEDDIALLOCATION: return "Invalid speed dial location.";
252 // case GE_INVALIDCALNOTELOCATION: return "Invalid calendar note location.";
253 // case GE_INVALIDDATETIME: return "Invalid date, time or alarm specification.";
254 // case GE_EMPTYSMSLOCATION: return "SMS location is empty.";
255 // case GE_PHBOOKNAMETOOLONG: return "Phonebook name is too long.";
256 // case GE_PHBOOKNUMBERTOOLONG: return "Phonebook number is too long.";
257 // case GE_PHBOOKWRITEFAILED: return "Phonebook write failed.";
258 // case GE_SMSSENDOK: return "SMS was send correctly.";
259 // case GE_SMSSENDFAILED: return "SMS send fail.";
260 // case GE_SMSTOOLONG: return "SMS message too long.";
261 // case GE_NONEWCBRECEIVED: return "Attempt to read CB when no new CB received";
262 // case GE_INTERNALERROR: return "Problem occured internal to model specific code.";
263 // case GE_NOTSUPPORTED: return "Function not supported by the phone";
264 // case GE_BUSY: return "Command is still being executed.";
265 // case GE_USERCANCELED: return "User has cancelled the action.";
266 // case GE_UNKNOWN: return "Unknown error - well better than nothing!!";
267 // case GE_MEMORYFULL: return "Memory is full";
268 // case GE_LINEBUSY: return "Outgoing call requested reported line busy";
269 // case GE_NOCARRIER: return "No Carrier error during data call setup ?";
272 case GE_NONE: return "No error, done OK";
273 case GE_INVALIDSECURITYCODE: return "Invalid Security code.";
274 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";
275 case GE_TIMEOUT: return "Command timed out.";
276 case GE_CANTOPENFILE: return "Can't open file with bitmap/ringtone";
277 case GE_SUBFORMATNOTSUPPORTED: return "Subformat of file not supported";
278 case GE_WRONGNUMBEROFCOLORS: return "Wrong number of colors in specified bitmap file (only 2 colors files supported)";
279 case GE_WRONGCOLORS: return "Wrong colors in bitmap file";
280 case GE_INVALIDIMAGESIZE: return "Invalid size of bitmap (in file, sms etc.)";
281 case GE_INVALIDFILEFORMAT: return "Invalid format of file";
282 case GE_TOOSHORT: return "File too short";
283 case GE_INSIDEBOOKMARKSMENU: return "Inside WAP Bookmarks menu. Please leave it and try again";
284 case GE_INVALIDBOOKMARKLOCATION: return "Invalid or empty WAP bookmark location";
285 case GE_INSIDESETTINGSMENU: return "Inside WAP Settings menu. Please leave it and try again";
286 case GE_INVALIDSETTINGSLOCATION: return "Invalid or empty WAP settings location";
287 default: return "Unknown error.";
291 GSM_Error GSM_ReadRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
295 error=GSM_ReadRingtoneFile(FileName, ringtone);
298 case GE_CANTOPENFILE:
299 case GE_SUBFORMATNOTSUPPORTED:
300 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
309 GSM_Error GSM_SaveRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
311 int confirm,confirm2;
316 /* Ask before overwriting */
317 while (stat(FileName, &buf) == 0) {
322 while (confirm < 0) {
323 fprintf(stderr, _("Saving ringtone. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
324 GetLine(stdin, ans, 4);
325 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
326 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
327 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
329 if (confirm==1) break;
331 while (confirm2 < 0) {
332 fprintf(stderr, _("Enter name of new file: "));
333 GetLine(stdin, FileName, 50);
334 if (&FileName[0]==0) return GE_USERCANCELED;
340 error=GSM_SaveRingtoneFile(FileName,ringtone);
343 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
351 GSM_Error GSM_ReadBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
355 error=GSM_ReadBitmapFile(FileName, bitmap);
358 case GE_CANTOPENFILE:
359 case GE_WRONGNUMBEROFCOLORS:
361 case GE_INVALIDFILEFORMAT:
362 case GE_SUBFORMATNOTSUPPORTED:
364 case GE_INVALIDIMAGESIZE:
365 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
374 GSM_Error GSM_SaveBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
376 int confirm,confirm2;
381 /* Ask before overwriting */
382 while (stat(FileName, &buf) == 0) {
387 while (confirm < 0) {
388 fprintf(stderr, _("Saving logo. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
389 GetLine(stdin, ans, 4);
390 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
391 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
392 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
394 if (confirm==1) break;
396 while (confirm2 < 0) {
397 fprintf(stderr, _("Enter name of new file: "));
398 GetLine(stdin, FileName, 50);
399 if (&FileName[0]==0) return GE_USERCANCELED;
405 error=GSM_SaveBitmapFile(FileName,bitmap);
408 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
416 /* mode == 0 -> overwrite
418 * mode == 2 -> append
420 int GSM_SaveTextFileOnConsole(char *FileName, char *text, int mode)
422 int confirm, confirm2;
427 /* Ask before overwriting */
429 while (stat(FileName, &buf) == 0 && mode==1) {
434 while (confirm < 0) {
435 fprintf(stderr, _("File \"%s\" exists. (O)verwrite, (a)ppend, create (n)ew or (s)kip ? "),FileName);
436 GetLine(stdin, ans, 4);
437 if (!strcmp(ans, "O") || !strcmp(ans, "o")) {
441 if (!strcmp(ans, "A") || !strcmp(ans, "a")) {
445 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm=2;
446 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return -1;
450 while (confirm2 < 0) {
451 fprintf(stderr, _("Enter name of new file: "));
452 GetLine(stdin, FileName, 50);
453 if (&FileName[0]==0) return -1;
462 error=GSM_SaveTextFile(FileName, text, mode);
465 case -1: fprintf(stderr, _("Failed to write file \"%s\"\n"), FileName);
473 int GSM_SendMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
474 bool unicode, bool profile, bool scale) {
478 struct option options[] = {
479 { "smscno", required_argument, NULL, '1'},
480 { "smsc", required_argument, NULL, '2'},
481 { "name", required_argument, NULL, '3'},
482 { "unicode", no_argument, NULL, '4'},
483 { "profilestyle", no_argument, NULL, '5'},
484 { "scale", no_argument, NULL, '6'},
490 for (w=0;w<MultiSMS->number;w++) {
495 /* We check optional parameters from ... */
498 while ((i = getopt_long(argc, argv, "v:ds", options, NULL)) != -1) {
501 case '1': /* SMSC number */
502 MultiSMS->SMS[w].MessageCenter.No = 0;
503 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
506 case '2': /* SMSC number index in phone memory */
507 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
509 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
510 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
516 case '3': /* Receiver/recipient */
517 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
519 case '4': /* Unicode */
522 case '5': /* Profile */
525 case '6': /* Scale */
528 case 'v': /* Set validaty of SMS */
529 MultiSMS->SMS[w].Validity = atoi(optarg);
532 case 'd': /* delivery report */
533 MultiSMS->SMS[w].Type=GST_DR;
536 case 's': /* Set replying via the same SMSC */
537 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
540 fprintf(stderr,_("Unknown option number %i\n"),argc);
548 error=GSM->SendSMSMessage(&MultiSMS->SMS[w]);
550 if (error == GE_SMSSENDOK) {
551 fprintf(stdout, _("SMS %i/%i sent OK !\n"),w+1,MultiSMS->number);
553 fprintf(stdout, _("SMS %i/%i, sending failed (error=%d)\n"),w+1,MultiSMS->number, error);
563 static int GSM_SaveMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
564 bool inter, bool unicode, bool profile, bool scale) {
568 GSM_SMSMessage SMSold;
570 struct option options[] = {
571 { "smscno", required_argument, NULL, '1'},
572 { "smsc", required_argument, NULL, '2'},
573 { "name", required_argument, NULL, '3'},
574 { "unicode", no_argument, NULL, '4'},
575 { "profilestyle", no_argument, NULL, '5'},
576 { "scale", no_argument, NULL, '6'},
588 for (w=0;w<MultiSMS->number;w++) {
593 /* We check optional parameters from ... */
596 while ((i = getopt_long(argc, argv, "risal:", options, NULL)) != -1) {
599 case '1': /* SMSC number */
600 MultiSMS->SMS[w].MessageCenter.No = 0;
601 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
604 case '2': /* SMSC number index in phone memory */
605 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
607 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
608 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
614 case '3': /* Receiver/recipient */
615 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
617 case '4': /* Unicode */
620 case '5': /* Profile */
623 case '6': /* Scale */
626 case 'r': /* mark as read */
627 MultiSMS->SMS[w].Status = GSS_SENTREAD; break;
629 case 'i': /* Save into Inbox */
630 MultiSMS->SMS[w].folder = GST_INBOX; break;
632 case 's': /* Set replying via the same SMSC */
633 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
635 case 'a': /* Ask before overwriting */
636 interactive=true;break;
638 case 'l': /* Specify location */
639 MultiSMS->SMS[0].Location = atoi(optarg); break;
642 fprintf(stderr,_("Unknown option number %i\n"),argc);
649 if (interactive && MultiSMS->SMS[0].Location!=0 && w==0) {
650 SMSold.Location=MultiSMS->SMS[0].Location;
651 error = GSM->GetSMSMessage(&SMSold);
654 fprintf(stderr, _("Message at specified location exists. "));
655 while (confirm < 0) {
656 fprintf(stderr, _("Overwrite? (yes/no) "));
657 GetLine(stdin, ans, 7);
658 if (!strcmp(ans, "yes")) confirm = 1;
659 if (!strcmp(ans, "no")) confirm = 0;
661 if (!confirm) { GSM->Terminate(); return 0; }
663 case GE_INVALIDSMSLOCATION:
664 fprintf(stderr, _("Invalid location\n"));
668 /* FIXME: Remove this fprintf when the function is thoroughly tested */
670 fprintf(stderr, _("Location %d empty. Saving\n"), SMS[w].Location);
676 error=GSM->SaveSMSMessage(&MultiSMS->SMS[w]);
678 if (error == GE_NONE)
679 fprintf(stdout, _("SMS %i/%i saved at location %i !\n"),w+1,MultiSMS->number,MultiSMS->SMS[w].MessageNumber);
681 fprintf(stdout, _("SMS %i/%i saving failed (error=%d, location=%i)\n"), w+1, MultiSMS->number, error,MultiSMS->SMS[w].Location);
689 void GSM_PlayRingtoneOnConsole(GSM_Ringtone *ringtone)
696 for (i=0;i<ringtone->NrNotes;i++) {
703 GSM_PlayOneNote (ringtone->notes[i]);
705 GSM->PlayTone(255*255,0);
710 /* This function shows the copyright and some informations usefull for
712 static int version(void)
715 fprintf(stdout, _("GNOKII Version %s\n"
716 "Copyright (C) Hugh Blemings <hugh@linuxcare.com>, 1999, 2000\n"
717 "Copyright (C) Pavel JanÃk ml. <Pavel.Janik@linux.cz>, 1999, 2000\n"
718 "Built %s %s for %s on %s \n"), VERSION, __TIME__, __DATE__, model, Port);
723 /* The function usage is only informative - it prints this program's usage and
724 command-line options. */
726 static int usage(void)
729 fprintf(stdout, _(" usage: gnokii [--help] [--version]\n"
732 " gnokii --monitor [-noloop|-nl]\n"
738 " gnokii --getmemory memory_type [start [end]] [-short|-v30|-v21|-v]\n"
742 " gnokii --getmemory memory_type [start [end]] [-short]\n"
747 " gnokii --writephonebook [-i]\n"
752 " gnokii --sendphonebookentry destination memory_type location\n"
753 " [--smsc message_center_number] [--smscno message_center_index]\n"
754 " [-s] [-v n] [-d]\n"
755 " gnokii --savephonebookentry memory_type location\n"
756 " [--smsc message_center_number] [--smscno message_center_index]\n"
757 " [-r] [-i] [-s] [-a] [--name name]\n"
758 " gnokii --getvoicemailbox\n"
763 " gnokii --getspeeddial number\n"
764 " gnokii --setspeeddial number memory_type location\n\n"
769 " gnokii --getsms memory_type start [end] [-f file]\n"
770 " gnokii --getsmsstatus\n"
771 " gnokii --getsmsfolders\n"
772 " gnokii --deletesms memory_type start [end]\n"
773 " gnokii --sendsms destination [--smsc message_center_number |\n"
774 " --smscno message_center_index] [--long n] [-s] [-C n]\n"
775 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
776 " --enableemail|--disableemail|--void][--unicode][-v n][-d]\n"
777 " gnokii --savesms destination|\"\" [--smsc \n"
778 " message_center_number] [--smscno message_center_index]\n"
779 " [--long n] [-r] [-i] [-s][-C n][-a][-l][F n][--smsname name]\n"
780 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
781 " --enableemail|--disableemail|--void|--hang|--bug][--unicode]\n"
782 " gnokii --receivesms\n"
783 " gnokii --getsmsc message_center_number\n"
784 " gnokii --renamesmsc number new_name\n\n"
786 " gnokii --setdatetime [YYYY [MM [DD [HH [MM]]]]]\n"
787 " gnokii --getdatetime\n"
788 " gnokii --setalarm HH MM\n"
789 " gnokii --getalarm\n\n"
791 " gnokii --getcalendarnote { start end [-v30|-v10] | --short|-s }\n"
792 " gnokii --writecalendarnote vcardfile number\n"
793 " gnokii --deletecalendarnote index\n"
794 " gnokii --sendcalendarnote destination vcardfile number\n"
795 " [--smsc message_center_number] [--smscno message_center_index]\n"
796 " [-s] [-v n] [-d]\n"
797 " gnokii --savecalendarnote vcardfile number\n"
798 " [--smsc message_center_number] [--smscno message_center_index]\n"
799 " [-r] [-i] [-s] [-a] [--name name]\n\n"
801 " gnokii --netmonitor {reset|off|field|devel|next|nr}\n"
802 " gnokii --nm_collect screen1|-d [screen2|-d]...\n"
803 " gnokii --netmonitordata [-S file] [-I file] [-h] [-n n] [-ts n][-tm n]\n"
804 " [-fs str] [-ls str] FLD1:FLD2:FLDn:... \n"
805 " (see files netmonitordata_????_??? for details)\n\n"
807 " gnokii --bitmapconvert source destination\n"
808 " gnokii --bitmapconvert source destination op|7110op [network code]\n"
809 " gnokii --bitmapconvert source destination caller [caller group number]\n"
810 " gnokii --bitmapconvert source destination\n"
811 " startup|7110startup|6210startup\n"
812 " gnokii --bitmapconvert source destination picture\n"
813 " gnokii --showbitmap logofile\n"
814 " gnokii --sendlogo op destination logofile network_code\n"
815 " [--smsc message_center_number] [--smscno message_center_index]\n"
816 " [-s] [-v n] [-d]\n"
817 " gnokii --sendlogo picture destination logofile text\n"
818 " [--smsc message_center_number] [--smscno message_center_index]\n"
819 " [-s] [-v n] [-d] [--unicode]\n"
820 " gnokii --sendlogo screensaver destination logofile\n"
821 " [--smsc message_center_number] [--smscno message_center_index]\n"
822 " [-s] [-v n] [-d]\n"
823 " gnokii --sendlogo caller destination logofile\n"
824 " [--smsc message_center_number] [--smscno message_center_index]\n"
825 " [-s] [-v n] [-d]\n"
826 " gnokii --savelogo op logofile network_code\n"
827 " [--smsc message_center_number] [--smscno message_center_index]\n"
828 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
829 " gnokii --savelogo picture logofile text\n"
830 " [--smsc message_center_number] [--smscno message_center_index]\n"
831 " [-r] [-i] [-s] [-a] [-l] [--name name] [--unicode]\n"
832 " gnokii --savelogo screensaver logofile\n"
833 " [--smsc message_center_number] [--smscno message_center_index]\n"
834 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
835 " gnokii --savelogo caller logofile\n"
836 " [--smsc message_center_number] [--smscno message_center_index]\n"
837 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
838 " gnokii --setlogo op|7110op [logofile] [network code]\n"
839 " gnokii --setlogo startup|7110startup|6210startup [logofile]\n"
840 " gnokii --setlogo startup 1|2|3\n"
841 " gnokii --setlogo caller [logofile] [caller group number] [group name]\n"
842 " gnokii --setlogo picture [logofile] [number] [text] [sender]\n"
843 " gnokii --setlogo {dealer|text} [text]\n"
844 " gnokii --getlogo op|7110op [logofile] [network code]\n"
845 " gnokii --getlogo startup|7110startup|6210startup [logofile]\n"
846 " gnokii --getlogo caller [logofile][caller group number]\n"
847 " gnokii --getlogo picture [logofile][number]\n"
848 " gnokii --getlogo {dealer|text}\n\n"
850 " gnokii --sendringtone destination ringtonefile\n"
851 " [--smsc message_center_number] [--smscno message_center_index]\n"
852 " [-s] [-v n] [-d] [--scale] [--profilestyle]\n"
853 " gnokii --saveringtone ringtonefile\n"
854 " [--smsc message_center_number] [--smscno message_center_index]\n"
855 " [-r] [-i] [-s] [-a] [--name name] [--scale] [--profilestyle]\n"
856 " gnokii --setringtone ringtonefile [location]\n"
857 " gnokii --getringtone ringtonefile [location]\n"
858 " gnokii --ringtoneconvert source destination\n"
859 " gnokii --binringtoneconvert source destination\n"
860 " gnokii --playringtone ringtonefile\n"
861 " gnokii --composer ringtonefile\n"
862 " gnokii --allringtones\n\n"
864 " gnokii --getprofile [number]\n"
865 " gnokii --setprofile number feature value\n"
866 " gnokii --sendprofile destination profile_name ringtonefile\n"
867 " picturefile [--smsc message_center_number]\n"
868 " [--smscno message_center_index] [-s] [-v n] [-d] [--scale]\n\n"
873 " gnokii --reset [soft|hard]\n"
878 " gnokii --dialvoice number\n"
883 " gnokii --cancelcall\n"
888 " gnokii --displayoutput\n"
889 " gnokii --presskeysequence sequence\n"
890 " gnokii --backupsettings file\n"
891 " gnokii --restoresettings file\n"
892 " gnokii --getphoneprofile\n"
893 " gnokii --setphoneprofile feature value\n"
894 " gnokii --getoperatorname\n"
895 " gnokii --setoperatorname code name\n"
896 " gnokii --senddtmf string\n"
897 " gnokii --divert register|enable|query|disable|erasure\n"
898 " all|busy|noans|outofreach all|voice|fax|data\n"
899 " [number timeout]\n\n"
901 " gnokii --phonetests\n"
902 " gnokii --simlock\n"
903 " gnokii --getdisplaystatus\n"
908 " gnokii --identify\n\n"
913 " gnokii --getwapbookmark location\n"
914 " gnokii --setwapbookmark title url [location]\n"
915 " gnokii --sendwapbookmark location destination\n"
916 " [--smsc message_center_number] [--smscno message_center_index]\n"
917 " [-s] [-v n] [-d]\n"
918 " gnokii --savewapbookmark location\n"
919 " [--smsc message_center_number] [--smscno message_center_index]\n"
920 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
921 " gnokii --getwapsettings location\n"
922 " gnokii --savewapsettings location\n"
923 " [--smsc message_center_number] [--smscno message_center_index]\n"
924 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
925 " gnokii --sendwapsettings location destination\n"
926 " [--smsc message_center_number] [--smscno message_center_index]\n"
927 " [-s] [-v n] [-d]\n"
932 "\n gnokii --entersecuritycode PIN|PIN2|PUK|PUK2\n"
933 " gnokii --getsecuritycodestatus\n"
934 " gnokii --getsecuritycode PIN|PIN2|PUK|PUK2|SecurityCode\n"
935 " gnokii --geteeprom\n"
936 " gnokii --resetphonesettings\n"
942 " gnokii --sniff [port]\n"
943 " gnokii --decodefile file\n"
951 " gnokii --gnokiid [--debug]\n"
958 /* fbusinit is the generic function which waits for the FBUS link. The limit
959 is 10 seconds. After 10 seconds we quit. */
961 static void fbusinit(void (*rlp_handler)(RLP_F96Frame *frame))
968 if (strcmp(GetMygnokiiVersion(),VERSION)!=0)
969 fprintf(stderr,_("WARNING: version of installed libmygnokii.so (%s) is different to version of gnokii (%s)\n"),GetMygnokiiVersion(),VERSION);
972 /* Initialise the code for the GSM interface. */
973 error = GSM_Initialise(model, Port, Initlength, GetConnectionTypeFromString(Connection), rlp_handler, ""/*SynchronizeTime*/);
975 if (error != GE_NONE) {
976 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
980 /* First (and important!) wait for GSM link to be active. We allow 10
982 while (count++ < 200 && *GSM_LinkOK == false)
985 if (*GSM_LinkOK == false) {
986 fprintf (stderr, _("Hmmm... GSM_LinkOK never went true. Quitting.\n"));
991 /* This function checks that the argument count for a given options is withing
994 static int checkargs(int opt, struct gnokii_arg_len gals[], int argc)
999 /* Walk through the whole array with options requiring arguments. */
1001 for(i = 0;!(gals[i].gal_min == 0 && gals[i].gal_max == 0); i++) {
1003 /* Current option. */
1005 if(gals[i].gal_opt == opt) {
1007 /* Argument count checking. */
1009 if(gals[i].gal_flags == GAL_XOR) {
1010 if(gals[i].gal_min == argc || gals[i].gal_max == argc) return 0;
1013 if(gals[i].gal_min <= argc && gals[i].gal_max >= argc) return 0;
1022 /* We do not have options without arguments in the array, so check them. */
1024 if (argc==0) return 0;
1028 static int gnokiid(int argc, char *argv[]);
1030 /* Main function - handles command line arguments, passes them to separate
1031 functions accordingly. */
1033 int main(int argc, char *argv[])
1040 /* Every option should be in this array. */
1042 static struct option long_options[] =
1045 { "help", no_argument, NULL, OPT_HELP },// Display usage.
1046 { "version", no_argument, NULL, OPT_VERSION },// Display version and build information.
1048 { "getsmsfolders", no_argument, NULL, OPT_GETSMSFOLDERS },// Gets SMS folders
1049 { "getsmsstatus", no_argument, NULL, OPT_GETSMSSTATUS },// Get SMS Folder Status
1050 #endif /* UCLINUX */
1051 { "identify", no_argument, NULL, OPT_IDENTIFY },// Identify
1053 { "pmon", no_argument, NULL, OPT_PMON },// For development purposes: run in passive monitoring mode
1054 { "foogle", no_argument, NULL, OPT_FOOGLE },// For development purposes: insert you function calls here
1055 { "getdatetime", no_argument, NULL, OPT_GETDATETIME },// Get date and time mode
1056 { "getalarm", no_argument, NULL, OPT_GETALARM },// Get alarm
1057 #endif /* UCLINUX */
1058 { "cancelcall", no_argument, NULL, OPT_CANCELCALL },// Cancel Call
1060 { "getdisplaystatus", no_argument, NULL, OPT_GETDISPLAYSTATUS },// Get display status mode
1061 { "allringtones", no_argument, NULL, OPT_ALLRINGTONES },/* Displays names of available ringtones */
1062 { "displayoutput", no_argument, NULL, OPT_DISPLAYOUTPUT },/* Show texts from phone's display */
1063 { "getphoneprofile", no_argument, NULL, OPT_GETPHONEPROFILE },/* Get/Set phone profile settings */
1064 { "getoperatorname", no_argument, NULL, OPT_GETOPERATORNAME },/* Get downloaded operator name */
1065 { "getvoicemailbox", no_argument, NULL, OPT_GETVOICEMAILBOX },/* Gets voice mailbox number */
1066 { "phonetests", no_argument, NULL, OPT_PHONETESTS },
1067 { "simlockinfo", no_argument, NULL, OPT_SIMLOCKINFO },
1068 { "receivesms", no_argument, NULL, OPT_RECEIVESMS },
1069 { "setoperatorname", optional_argument, NULL, OPT_SETOPERATORNAME },/* Set downloaded operator name */
1070 { "setdatetime", optional_argument, NULL, OPT_SETDATETIME },// Set date and time
1071 #endif /* UCLINUX */
1072 { "writephonebook", optional_argument, NULL, OPT_WRITEPHONEBOOK },// Write phonebook (memory) mode
1073 { "reset", optional_argument, NULL, OPT_RESET },// Resets the phone
1075 { "monitor", optional_argument, NULL, OPT_MONITOR },// Monitor mode
1076 { "setlogo", optional_argument, NULL, OPT_SETLOGO },// Set logo
1077 { "getprofile", optional_argument, NULL, OPT_GETPROFILE },// Show profile
1078 { "setalarm", required_argument, NULL, OPT_SETALARM },// Set alarm
1079 { "dialvoice", required_argument, NULL, OPT_DIALVOICE },// Voice call mode
1080 { "getcalendarnote", required_argument, NULL, OPT_GETCALENDARNOTE },// Get calendar note mode
1081 { "writecalendarnote", required_argument, NULL, OPT_WRITECALENDARNOTE},// Write calendar note mode
1082 { "sendcalendarnote", required_argument, NULL, OPT_SENDCALENDARNOTE },
1083 { "savecalendarnote", required_argument, NULL, OPT_SAVECALENDARNOTE },
1084 { "sendphonebookentry", required_argument, NULL, OPT_SENDPHONEBOOKENTRY},
1085 { "savephonebookentry", required_argument, NULL, OPT_SAVEPHONEBOOKENTRY},
1086 { "deletecalendarnote", required_argument, NULL, OPT_DELCALENDARNOTE },// Delete calendar note mode
1087 #endif /* UCLINUX */
1088 { "getmemory", required_argument, NULL, OPT_GETMEMORY },// Get memory mode
1089 { "getspeeddial", required_argument, NULL, OPT_GETSPEEDDIAL },// Get speed dial mode
1090 { "setspeeddial", required_argument, NULL, OPT_SETSPEEDDIAL },// Set speed dial mode
1092 { "getsms", required_argument, NULL, OPT_GETSMS },// Get SMS message mode
1093 { "deletesms", required_argument, NULL, OPT_DELETESMS },// Delete SMS message mode
1094 { "sendsms", required_argument, NULL, OPT_SENDSMS },// Send SMS message mode
1095 { "savesms", required_argument, NULL, OPT_SAVESMS },// Save SMS message mode
1096 { "sendlogo", required_argument, NULL, OPT_SENDLOGO },// Send logo as SMS message mode
1097 { "savelogo", required_argument, NULL, OPT_SAVELOGO },// Save logo on SIM
1098 { "sendringtone", required_argument, NULL, OPT_SENDRINGTONE },// Send ringtone as SMS message
1099 { "saveringtone", required_argument, NULL, OPT_SAVERINGTONE },// Saves ringtone on SIM
1100 { "setringtone", required_argument, NULL, OPT_SETRINGTONE },// Set ringtone
1101 { "getringtone", required_argument, NULL, OPT_GETRINGTONE },// Get bin/normal ringtone
1102 { "presskeysequence", required_argument, NULL, OPT_PRESSKEYSEQUENCE },/* Presses keys in phone's display */
1103 { "getsmsc", required_argument, NULL, OPT_GETSMSC },// Get SMS center number mode
1104 { "renamesmsc", required_argument, NULL, OPT_RENAMESMSC },// Rename SMSC
1105 { "netmonitor", required_argument, NULL, OPT_NETMONITOR },// NetMonitor mode
1106 { "senddtmf", required_argument, NULL, OPT_SENDDTMF },// Send DTMF sequence
1107 { "getlogo", required_argument, NULL, OPT_GETLOGO },// Get logo
1108 { "setprofile", required_argument, NULL, OPT_SETPROFILE },// Set profile feature
1109 { "sendprofile", required_argument, NULL, OPT_SENDPROFILE },// Send profile via SMS
1110 { "setphoneprofile", required_argument, NULL, OPT_SETPHONEPROFILE },/* Get/Set phone profile settings */
1111 { "restoresettings", required_argument, NULL, OPT_RESTORESETTINGS },//Restore various settings from one file
1112 { "backupsettings", required_argument, NULL, OPT_BACKUPSETTINGS },//Backup various settings to one file
1113 { "playringtone", required_argument, NULL, OPT_PLAYRINGTONE },/* Plays ringtones */
1114 { "composer", required_argument, NULL, OPT_COMPOSER },/* Shows ringtone like in Nokia Composer */
1115 { "ringtoneconvert", required_argument, NULL, OPT_RINGTONECONVERT },/* Convert ringtone files */
1116 { "binringtoneconvert", required_argument, NULL, OPT_BINRINGTONECONVERT},/* Convert binary ringtone files */
1117 { "bitmapconvert", required_argument, NULL, OPT_BITMAPCONVERT },/* Convert bitmap files */
1118 { "showbitmap", required_argument, NULL, OPT_SHOWBITMAP },
1119 { "nm_collect", required_argument, NULL, OPT_NM_COLLECT },// NetMonitor periodical data collection mode (newbiee)
1120 { "netmonitordata", required_argument, NULL, OPT_NETMONITORDATA },// NetMonitor periodical data collection mode (advanced)
1121 { "getwapbookmark", required_argument, NULL, OPT_GETWAPBOOKMARK },
1122 { "setwapbookmark", required_argument, NULL, OPT_SETWAPBOOKMARK },
1123 { "savewapbookmark", required_argument, NULL, OPT_SAVEWAPBOOKMARK },
1124 { "savewapsettings", required_argument, NULL, OPT_SAVEWAPSETTINGS },
1125 { "sendwapsettings", required_argument, NULL, OPT_SENDWAPSETTINGS },
1126 { "sendwapbookmark", required_argument, NULL, OPT_SENDWAPBOOKMARK },
1127 { "getwapsettings", required_argument, NULL, OPT_GETWAPSETTINGS },
1128 { "divert", required_argument, NULL, OPT_DIVERT },
1131 { "entersecuritycode", required_argument, NULL, OPT_ENTERSECURITYCODE },// Enter Security Code mode
1132 { "getsecuritycode", required_argument, NULL, OPT_GETSECURITYCODE },// Get Security Code
1133 { "getsecuritycodestatus",no_argument, NULL, OPT_GETSECURITYCODESTATUS},// Get Security Code status
1134 { "geteeprom", no_argument, NULL, OPT_GETEEPROM },// Gets EEPROM
1135 { "resetphonesettings", no_argument, NULL, OPT_RESETPHONESETTINGS },// Reset phone settings
1136 { "setsimlock", no_argument, NULL, OPT_SETSIMLOCK },// Sets simlock
1140 { "sniff", optional_argument, NULL, OPT_SNIFFER },// Will show datas from port
1141 { "decodefile", required_argument, NULL, OPT_DECODEFILE },//decode input file
1143 #endif /* UCLINUX */
1146 { "gnokiid", optional_argument, NULL, OPT_GNOKIID },// gnokiid mode
1147 #endif /* UCLINUX */
1152 /* Every command which requires arguments should have an appropriate entry
1155 struct gnokii_arg_len gals[] =
1159 { OPT_MONITOR, 0, 1, 0 },
1162 { OPT_ENTERSECURITYCODE, 1, 1, 0 },
1163 { OPT_GETSECURITYCODE, 1, 1, 0 },
1167 { OPT_SNIFFER, 0, 1, 0 },
1168 { OPT_DECODEFILE, 1, 1, 0 },
1171 { OPT_SETDATETIME, 0, 5, 0 },
1172 { OPT_BACKUPSETTINGS, 1, 1, 0 },
1173 { OPT_RESTORESETTINGS, 1, 1, 0 },
1174 { OPT_SETALARM, 2, 2, 0 },
1175 { OPT_DIALVOICE, 1, 1, 0 },
1176 { OPT_GETCALENDARNOTE, 1, 3, 0 },
1177 { OPT_WRITECALENDARNOTE, 2, 2, 0 },
1178 { OPT_SAVECALENDARNOTE, 2, 9, 0 },
1179 { OPT_SENDCALENDARNOTE, 3, 9, 0 },
1180 { OPT_SAVEPHONEBOOKENTRY,2, 9, 0 },
1181 { OPT_SENDPHONEBOOKENTRY,3, 9, 0 },
1182 { OPT_DELCALENDARNOTE, 1, 1, 0 },
1183 #endif /* UCLINUX */
1184 { OPT_GETMEMORY, 2, 4, 0 },
1185 { OPT_GETSPEEDDIAL, 1, 1, 0 },
1186 { OPT_SETSPEEDDIAL, 3, 3, 0 },
1188 { OPT_GETSMS, 2, 5, 0 },
1189 { OPT_DELETESMS, 2, 3, 0 },
1190 { OPT_SENDSMS, 1,10, 0 },
1191 { OPT_SAVESMS, 1,11, 0 },
1192 { OPT_SENDLOGO, 3, 9, 0 },
1193 { OPT_SAVELOGO, 2,10, 0 },
1194 { OPT_SENDRINGTONE, 2, 7, 0 },
1195 { OPT_SAVERINGTONE, 1, 9, 0 },
1196 { OPT_GETSMSC, 1, 1, 0 },
1197 { OPT_RENAMESMSC, 2, 2, 0 },
1198 { OPT_NETMONITOR, 1, 1, 0 },
1199 { OPT_SENDDTMF, 1, 1, 0 },
1200 { OPT_SETLOGO, 1, 5, 0 },
1201 { OPT_GETLOGO, 1, 4, 0 },
1202 { OPT_SETRINGTONE, 1, 3, 0 },
1203 { OPT_GETRINGTONE, 1, 2, 0 },
1204 { OPT_PRESSKEYSEQUENCE, 1, 1, 0 },
1205 #endif /* UCLINUX */
1206 { OPT_RESET, 0, 1, 0 },
1208 { OPT_GETPROFILE, 0, 1, 0 },
1209 { OPT_SETPROFILE, 3, 3, 0 },
1210 { OPT_SENDPROFILE, 4,10, 0 },
1211 #endif /* UCLINUX */
1212 { OPT_WRITEPHONEBOOK, 0, 1, 0 },
1214 { OPT_PLAYRINGTONE, 1, 1, 0 },
1215 { OPT_COMPOSER, 1, 1, 0 },
1216 { OPT_RINGTONECONVERT, 2, 2, 0 },
1217 { OPT_BINRINGTONECONVERT,2, 2, 0 },
1218 { OPT_BITMAPCONVERT, 2, 4, 0 },
1219 { OPT_SHOWBITMAP, 1, 1, 0 },
1220 { OPT_SETOPERATORNAME, 0, 2, 0 },
1221 { OPT_SETPHONEPROFILE, 2, 2, 0 },
1222 { OPT_NM_COLLECT, 1, MAX_NM_COLLECT, 0 },
1223 { OPT_NETMONITORDATA, 0,99, 0 },
1224 { OPT_GETWAPBOOKMARK, 1, 1, 0 },
1225 { OPT_SETWAPBOOKMARK, 2, 3, 0 },
1226 { OPT_SAVEWAPBOOKMARK, 1, 9, 0 },
1227 { OPT_SENDWAPBOOKMARK, 2, 9, 0 },
1228 { OPT_GETWAPSETTINGS, 1, 1, 0 },
1229 { OPT_SAVEWAPSETTINGS, 1, 9, 0 },
1230 { OPT_SENDWAPSETTINGS, 2, 9, 0 },
1231 { OPT_DIVERT, 3, 5, 0 },
1232 #endif /* UCLINUX */
1235 { OPT_GNOKIID, 0, 1, 0 },
1236 #endif /* UCLINUX */
1245 /* For GNU gettext */
1249 textdomain("gnokii");
1250 setlocale(LC_ALL, "pl_PL"); //here is string for Polish localisation
1252 setlocale(LC_ALL, ".852"); //Polish codepage for console, not "real" WIN CP
1257 /* Read config file */
1258 if (CFG_ReadConfig(&model, &Port, &Initlength, &Connection, &BinDir, false) < 0) {
1262 /* Handle command line arguments. */
1264 c = getopt_long(argc, argv, "", long_options, NULL);
1268 /* No argument given - we should display usage. */
1273 /* We have to build an array of the arguments which will be passed to the
1274 functions. Please note that every text after the --command will be
1275 passed as arguments. A syntax like gnokii --cmd1 args --cmd2 args will
1276 not work as expected; instead args --cmd2 args is passed as a
1279 if((nargv = malloc(sizeof(char *) * argc)) != NULL) {
1281 for(i = 2; i < argc; i++)
1282 nargv[i-2] = argv[i];
1284 if(checkargs(c, gals, nargc)) {
1288 /* Wrong number of arguments - we should display usage. */
1294 #if defined(__svr4__)
1295 /* have to ignore SIGALARM */
1302 // First, error conditions
1304 fprintf(stderr, _("Use '%s --help' for usage informations.\n"), argv[0]);
1307 // Then, options with no arguments
1308 case OPT_HELP: rc = usage(); break;
1309 case OPT_VERSION: rc = version(); break;
1311 case OPT_MONITOR: rc = monitormode(nargc, nargv); break;
1312 case OPT_GETSMSFOLDERS: rc = getsmsfolders(); break;
1313 case OPT_GETDATETIME: rc = getdatetime(); break;
1314 case OPT_GETALARM: rc = getalarm(); break;
1315 case OPT_GETDISPLAYSTATUS: rc = getdisplaystatus(); break;
1316 case OPT_PMON: rc = pmon(); break;
1317 #endif /* UCLINUX */
1318 case OPT_WRITEPHONEBOOK: rc = writephonebook(nargc, nargv);break;
1322 case OPT_ENTERSECURITYCODE: rc = entersecuritycode(optarg); break;
1323 case OPT_GETSECURITYCODESTATUS: rc = getsecuritycodestatus(); break;
1324 case OPT_GETSECURITYCODE: rc = getsecuritycode(optarg); break;
1325 case OPT_GETEEPROM: rc = geteeprom(); break;
1326 case OPT_RESETPHONESETTINGS: rc = resetphonesettings(); break;
1327 case OPT_SETSIMLOCK: rc = setsimlock(); break;
1331 case OPT_SNIFFER: rc = sniff(nargc, nargv); break;
1332 case OPT_DECODEFILE: rc = decodefile(nargc, nargv); break;
1335 // Now, options with arguments
1336 case OPT_SETDATETIME: rc = setdatetime(nargc, nargv); break;
1337 case OPT_SETALARM: rc = setalarm(nargv); break;
1338 case OPT_DIALVOICE: rc = dialvoice(optarg); break;
1339 #endif /* UCLINUX */
1340 case OPT_CANCELCALL: rc = cancelcall(); break;
1342 case OPT_GETCALENDARNOTE: rc = getcalendarnote(nargc, nargv);break;
1343 case OPT_DELCALENDARNOTE: rc = deletecalendarnote(optarg);break;
1344 case OPT_SAVECALENDARNOTE: rc = savecalendarnote(nargc, nargv);break;
1345 case OPT_SENDCALENDARNOTE: rc = sendcalendarnote(nargc, nargv);break;
1346 case OPT_SAVEPHONEBOOKENTRY: rc = savephonebookentry(nargc, nargv);break;
1347 case OPT_SENDPHONEBOOKENTRY: rc = sendphonebookentry(nargc, nargv);break;
1348 case OPT_WRITECALENDARNOTE: rc = writecalendarnote(nargv); break;
1349 #endif /* UCLINUX */
1350 case OPT_GETMEMORY: rc = getmemory(nargc, nargv); break;
1351 case OPT_GETSPEEDDIAL: rc = getspeeddial(optarg); break;
1352 case OPT_SETSPEEDDIAL: rc = setspeeddial(nargv); break;
1354 case OPT_GETSMS: rc = getsms(argc, argv); break;
1355 case OPT_GETSMSSTATUS: rc = getsmsstatus(argc, argv); break;
1356 case OPT_DELETESMS: rc = deletesms(nargc, nargv); break;
1357 case OPT_SENDSMS: rc = sendsms(nargc, nargv); break;
1358 case OPT_SAVESMS: rc = savesms(nargc, nargv); break;
1359 case OPT_DIVERT: rc = divert(nargc, nargv); break;
1360 case OPT_SENDLOGO: rc = sendlogo(nargc, nargv); break;
1361 case OPT_SAVELOGO: rc = savelogo(nargc, nargv); break;
1362 case OPT_GETSMSC: rc = getsmsc(optarg); break;
1363 case OPT_RENAMESMSC: rc = renamesmsc(nargc,nargv); break;
1364 case OPT_NETMONITOR: rc = netmonitor(optarg); break;
1365 #endif /* UCLINUX */
1366 case OPT_IDENTIFY: rc = identify(); break;
1368 case OPT_SETLOGO: rc = setlogo(nargc, nargv); break;
1369 case OPT_GETLOGO: rc = getlogo(nargc, nargv); break;
1370 case OPT_RECEIVESMS: rc = receivesms(nargc, nargv); break;
1371 case OPT_SETRINGTONE: rc = setringtone(nargc, nargv); break;
1372 case OPT_GETRINGTONE: rc = getringtone(nargc, nargv); break;
1373 case OPT_PRESSKEYSEQUENCE: rc = presskeysequence(nargv); break;
1374 case OPT_SENDRINGTONE: rc = sendringtone(nargc, nargv);break;
1375 case OPT_SAVERINGTONE: rc = saveringtone(nargc, nargv);break;
1376 case OPT_GETPROFILE: rc = getprofile(nargc, nargv); break;
1377 case OPT_SETPROFILE: rc = setprofile(nargc, nargv); break;
1378 case OPT_SENDPROFILE: rc = sendprofile(nargc, nargv); break;
1379 case OPT_DISPLAYOUTPUT: rc = displayoutput(); break;
1380 case OPT_RESTORESETTINGS: rc = restoresettings(nargv); break;
1381 case OPT_BACKUPSETTINGS: rc = backupsettings(nargv); break;
1382 case OPT_RINGTONECONVERT: rc = ringtoneconvert(nargc, nargv);break;
1383 case OPT_BINRINGTONECONVERT: rc = binringtoneconvert(nargc, nargv);break;
1384 case OPT_BITMAPCONVERT: rc = bitmapconvert(nargc, nargv);break;
1385 case OPT_SHOWBITMAP: rc = showbitmap(nargc, nargv); break;
1386 case OPT_PLAYRINGTONE: rc = playringtone(nargc, nargv);break;
1387 case OPT_COMPOSER: rc = composer(nargc, nargv); break;
1388 case OPT_FOOGLE: rc = foogle(nargv); break;
1389 case OPT_PHONETESTS: rc = phonetests(); break;
1390 case OPT_SIMLOCKINFO: rc = simlockinfo(); break;
1391 case OPT_SENDDTMF: rc = senddtmf(optarg); break;
1392 #endif /* UCLINUX */
1393 case OPT_RESET: rc = reset(nargc,nargv); break;
1395 case OPT_GETOPERATORNAME: rc = getoperatorname(); break;
1396 case OPT_SETOPERATORNAME: rc = setoperatorname(nargc,nargv);break;
1397 case OPT_GETWAPBOOKMARK: rc = getwapbookmark(nargc,nargv);break;
1398 case OPT_SETWAPBOOKMARK: rc = setwapbookmark(nargc,nargv);break;
1399 case OPT_SAVEWAPBOOKMARK: rc = savewapbookmark(nargc,nargv);break;
1400 case OPT_SENDWAPBOOKMARK: rc = sendwapbookmark(nargc,nargv);break;
1401 case OPT_GETWAPSETTINGS: rc = getwapsettings(nargc,nargv);break;
1402 case OPT_SAVEWAPSETTINGS: rc = savewapsettings(nargc,nargv);break;
1403 case OPT_SENDWAPSETTINGS: rc = sendwapsettings(nargc,nargv);break;
1404 case OPT_ALLRINGTONES: rc = allringtones(); break;
1405 case OPT_GETPHONEPROFILE: rc = getphoneprofile(); break;
1406 case OPT_SETPHONEPROFILE: rc = setphoneprofile(nargc,nargv);break;
1407 case OPT_GETVOICEMAILBOX: rc = getvoicemailbox(); break;
1408 case OPT_NM_COLLECT: rc = nm_collect(nargc, nargv); break;
1409 case OPT_NETMONITORDATA: rc = netmonitordata(nargc, nargv);break;
1410 #endif /* UCLINUX */
1413 case OPT_GNOKIID: rc = gnokiid(nargc, nargv); break;
1414 #endif /* UCLINUX */
1415 default: fprintf(stderr, _("Unknown option: %d\n"), c); break;
1424 fprintf(stderr, _("Wrong number of arguments\n"));
1431 /* Restores various phone settings from one file */
1432 int restoresettings(char *argv[])
1434 fprintf(stdout,_("Work in progress. Not usefull now. Sorry\n"));
1438 /* Backup various phone settings from one file */
1439 int backupsettings(char *argv[])
1441 GSM_PhonebookEntry PbkEntry;
1446 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1447 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1451 fprintf(stderr,_("Backup phonebook from SIM..."));
1452 Backup.SIMPhonebookUsed=0;
1453 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE) {//FIXME
1454 Backup.SIMPhonebookSize=SIMMemoryStatus.Used+SIMMemoryStatus.Free;
1456 PbkEntry.MemoryType=GMT_SM;
1458 for (i=0;i<Backup.SIMPhonebookSize;i++)
1460 if (SIMMemoryStatus.Used==Backup.SIMPhonebookUsed) break;
1462 PbkEntry.Location=i;
1464 error=GSM->GetMemoryLocation(&PbkEntry);
1467 Backup.SIMPhonebook[Backup.SIMPhonebookUsed]=PbkEntry;
1468 Backup.SIMPhonebookUsed++;
1469 fprintf(stderr,_("."));
1475 fprintf(stderr,_("Done\n"));
1476 } else fprintf(stderr,_("ERROR\n"));
1478 fprintf(stderr,_("Backup phonebook from phone..."));
1479 Backup.PhonePhonebookUsed=0;
1480 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE) {
1481 Backup.PhonePhonebookSize=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free;
1483 PbkEntry.MemoryType=GMT_ME;
1485 for (i=0;i<Backup.PhonePhonebookSize;i++)
1487 if (PhoneMemoryStatus.Used==Backup.PhonePhonebookUsed) break;
1489 PbkEntry.Location=i;
1491 error=GSM->GetMemoryLocation(&PbkEntry);
1494 Backup.PhonePhonebook[Backup.PhonePhonebookUsed]=PbkEntry;
1495 Backup.PhonePhonebookUsed++;
1496 fprintf(stderr,_("."));
1502 fprintf(stderr,_("Done\n"));
1503 } else fprintf(stderr,_("ERROR\n"));
1505 if( GetModelFeature (FN_CALLERGROUPS)!=0) {
1506 fprintf(stderr,_("Backup caller logos..."));
1507 Backup.CallerAvailable=true;
1509 Backup.CallerGroups[i].number=i;
1510 Backup.CallerGroups[i].type=GSM_CallerLogo;
1511 if (GSM->GetBitmap(&Backup.CallerGroups[i])!=GE_NONE) return 1;
1513 fprintf(stderr,_("Done\n"));
1514 } else Backup.CallerAvailable=false;
1516 // fprintf(stderr,_("Backup speed dials..."));
1517 Backup.SpeedAvailable=false;
1518 // for (i=0;i<8;i++) {
1519 // Backup.SpeedDials[i].Number=i+1;
1520 // if (GSM->GetSpeedDial(&Backup.SpeedDials[i])!=GE_NONE) return 1;
1522 // fprintf(stderr,_("Done\n"));
1524 fprintf(stderr,_("Backup operator logo..."));
1525 Backup.OperatorLogoAvailable=true;
1526 Backup.OperatorLogo.type=GSM_7110OperatorLogo;
1527 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1528 Backup.OperatorLogoAvailable=true;
1529 Backup.OperatorLogo.type=GSM_OperatorLogo;
1530 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1531 Backup.OperatorLogoAvailable=false;
1532 fprintf(stderr,_("Error\n"));
1533 } else fprintf(stderr,_("Done\n"));
1534 } else fprintf(stderr,_("Done\n"));
1536 Backup.StartupLogoAvailable=false;
1537 if( GetModelFeature (FN_STARTUP)!=0) {
1538 fprintf(stderr,_("Backup startup logo..."));
1539 Backup.StartupLogoAvailable=true;
1540 switch (GetModelFeature (FN_STARTUP)) {
1541 case F_STA62: Backup.StartupLogo.type=GSM_6210StartupLogo;break;
1542 case F_STA71: Backup.StartupLogo.type=GSM_7110StartupLogo;break;
1543 default : Backup.StartupLogo.type=GSM_StartupLogo;break;
1545 if (GSM->GetBitmap(&Backup.StartupLogo)!=GE_NONE) {
1546 Backup.StartupLogoAvailable=false;
1547 fprintf(stderr,_("Error\n"));
1548 } else fprintf(stderr,_("Done\n"));
1551 fprintf(stderr,_("Backup welcome note..."));
1552 Backup.StartupText.type=GSM_WelcomeNoteText;
1553 if (GSM->GetBitmap(&Backup.StartupText)!=GE_NONE) {
1554 fprintf(stderr,_("Error\n"));
1555 } else fprintf(stderr,_("Done\n"));
1559 GSM_SaveBackupFile(argv[0], &Backup);
1564 /* Presses keys on phone's keyboard */
1566 int presskeysequence(char *argv[])
1574 /* We need to make sure that the init is finished to avoid interrupted */
1575 /* multiframe packets... */
1579 for (i=0;i<strlen(argv[0]);i++)
1585 if (key!='w' && key!='W')
1587 while (Keys[j].whatchar!=' ') {
1588 if (Keys[j].whatchar==key) {
1589 keycode=Keys[j].whatcode;
1596 fprintf(stderr,_("Unknown key: %c !\n"),key);
1601 if (GSM->PressKey(keycode,PRESSPHONEKEY)!=GE_NONE)
1603 fprintf(stderr,_("Can't press key !\n"));
1607 if (GSM->PressKey(keycode,RELEASEPHONEKEY)!=GE_NONE)
1609 fprintf(stderr,_("Can't release key !\n"));
1624 /* Send SMS messages. */
1625 int sendsms(int argc, char *argv[])
1627 GSM_MultiSMSMessage MultiSMS;
1628 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1629 int input_len, chars_read,i,msgnum;
1631 GSM_SMSMessageType SMSType=GST_SMS;
1632 int SMSValidity= 4320; /* 4320 minutes == 72 hours */
1633 bool SMSReply=false;
1634 int SMSClass=-1,SMSCenter=1;
1635 char SMSCNumber[100];
1636 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1637 GSM_UDH SMSUDHType=GSM_NoUDH;
1639 struct option options[] = {
1640 { "smscno", required_argument, NULL, '1'},
1641 { "smsc", required_argument, NULL, '2'},
1642 { "long", required_argument, NULL, '3'},
1643 { "enablevoice", no_argument, NULL, '4'},
1644 { "disablevoice", no_argument, NULL, '5'},
1645 { "enableemail", no_argument, NULL, '6'},
1646 { "disableemail", no_argument, NULL, '7'},
1647 { "enablefax", no_argument, NULL, '8'},
1648 { "disablefax", no_argument, NULL, '9'},
1649 { "unicode", no_argument, NULL, '-'},
1650 { "void", no_argument, NULL, '+'},
1651 { "hang", no_argument, NULL, '('},
1652 { "bug", no_argument, NULL, ')'},
1656 input_len = GSM_MAX_SMS_LENGTH;
1663 while ((i = getopt_long(argc, argv, "v:dsC:", options, NULL)) != -1) {
1666 case '1': /* SMSC number */
1668 strcpy(SMSCNumber,optarg);
1671 case '2': /* SMSC number index in phone memory */
1672 SMSCenter = atoi(optarg);
1674 if (SMSCenter < 1 || SMSCenter > 5) {
1675 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1681 case '3': /* we send long message */
1682 SMSUDHType=GSM_ConcatenatedMessages;
1683 input_len = atoi(optarg);
1684 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1685 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1690 case '4': /* SMS enables voice indicator */
1691 SMSUDHType=GSM_EnableVoice; break;
1693 case '5': /* SMS disables voice indicator */
1694 SMSUDHType=GSM_DisableVoice; break;
1696 case '6': /* SMS enables email indicator */
1697 SMSUDHType=GSM_EnableEmail; break;
1699 case '7': /* SMS disables email indicator */
1700 SMSUDHType=GSM_DisableEmail; break;
1702 case '8': /* SMS enables fax indicator */
1703 SMSUDHType=GSM_EnableFax; break;
1705 case '9': /* SMS disables fax indicator */
1706 SMSUDHType=GSM_DisableFax; break;
1708 case '-': /* SMS coding type */
1709 SMSCoding=GSM_Coding_Unicode; break;
1711 case '+': /* SMS ghost */
1712 SMSUDHType=GSM_VoidSMS; break;
1714 case '(': /* SMS hanging phone, when saved to Outbox */
1715 SMSUDHType=GSM_HangSMS; break;
1717 case ')': /* SMS showed incorrectly in phone */
1718 SMSUDHType=GSM_BugSMS; break;
1720 case 'v': /* Set validaty of SMS */
1721 SMSValidity = atoi(optarg); break;
1723 case 'd': /* delivery report */
1724 SMSType=GST_DR; break;
1726 case 's': /* Set replying via the same SMSC */
1727 SMSReply = true; break;
1729 case 'C': /* class Message */
1731 if (SMSUDHType!=GSM_NoUDH) {
1732 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1737 case '0': SMSClass = 0; break;
1738 case '1': SMSClass = 1; break;
1739 case '2': SMSClass = 2; break;
1740 case '3': SMSClass = 3; break;
1742 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1748 fprintf(stderr,_("Unknown option number %i\n"),argc);
1754 /* Get message text from stdin. */
1755 chars_read = fread(message_buffer, 1, input_len, stdin);
1757 if (chars_read == 0) {
1758 fprintf(stderr, _("Couldn't read from stdin!\n"));
1761 if (chars_read > input_len) {
1762 fprintf(stderr, _("Input too long!\n"));
1766 /* Null terminate. */
1767 message_buffer[chars_read] = 0x00;
1769 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1770 msgnum=MultiSMS.number;
1772 switch (SMSUDHType) {
1777 case GSM_EnableVoice:
1778 case GSM_DisableVoice:
1780 case GSM_DisableFax:
1781 case GSM_EnableEmail:
1782 case GSM_DisableEmail:
1783 fprintf(stdout,_("Warning: saving %ld chars\n"),(long)strlen(MultiSMS.SMS[0].MessageText));
1790 for (i=0;i<msgnum;i++) {
1791 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1793 MultiSMS.SMS[i].Class=SMSClass;
1794 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
1795 MultiSMS.SMS[i].Type=SMSType;
1796 MultiSMS.SMS[i].Validity=SMSValidity;
1799 /* Initialise the GSM interface. */
1802 MultiSMS.number=msgnum;
1803 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,false,false,false);
1808 int savesms(int argc, char *argv[])
1810 GSM_MultiSMSMessage MultiSMS;
1811 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1812 int input_len, chars_read,i,msgnum;
1814 int SMSClass=-1,SMSCenter=1;
1816 char SMSCNumber[100];
1817 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1818 GSM_UDH SMSUDHType=GSM_NoUDH;
1819 GSM_SMSMessageStatus SMSStatus;
1821 bool SMSReply=false;
1823 bool interactive=false;
1825 struct option options[] = {
1826 { "smscno", required_argument, NULL, '1'},
1827 { "smsc", required_argument, NULL, '2'},
1828 { "long", required_argument, NULL, '3'},
1829 { "enablevoice", no_argument, NULL, '4'},
1830 { "disablevoice", no_argument, NULL, '5'},
1831 { "enableemail", no_argument, NULL, '6'},
1832 { "disableemail", no_argument, NULL, '7'},
1833 { "enablefax", no_argument, NULL, '8'},
1834 { "disablefax", no_argument, NULL, '9'},
1835 { "unicode", no_argument, NULL, '-'},
1836 { "void", no_argument, NULL, '+'},
1837 { "hang", no_argument, NULL, '('},
1838 { "bug", no_argument, NULL, ')'},
1839 { "smsname", required_argument, NULL, '/'},
1845 SMSStatus=GSS_NOTSENTREAD;
1846 SMSFolder=GST_OUTBOX;
1848 input_len = GSM_MAX_SMS_LENGTH;
1855 while ((i = getopt_long(argc, argv, "risal:C:F:", options, NULL)) != -1) {
1858 case '1': /* SMSC number */
1860 strcpy(SMSCNumber,optarg);
1863 case '2': /* SMSC number index in phone memory */
1864 SMSCenter = atoi(optarg);
1866 if (SMSCenter < 1 || SMSCenter > 5) {
1867 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1873 case '3': /* we send long message */
1874 SMSUDHType=GSM_ConcatenatedMessages;
1875 input_len = atoi(optarg);
1876 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1877 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1882 case '4': /* SMS enables voice indicator */
1883 SMSUDHType=GSM_EnableVoice; break;
1885 case '5': /* SMS disables voice indicator */
1886 SMSUDHType=GSM_DisableVoice; break;
1888 case '6': /* SMS enables email indicator */
1889 SMSUDHType=GSM_EnableEmail; break;
1891 case '7': /* SMS disables email indicator */
1892 SMSUDHType=GSM_DisableEmail; break;
1894 case '8': /* SMS enables fax indicator */
1895 SMSUDHType=GSM_EnableFax; break;
1897 case '9': /* SMS disables fax indicator */
1898 SMSUDHType=GSM_DisableFax; break;
1900 case '-': /* SMS coding type */
1901 SMSCoding=GSM_Coding_Unicode; break;
1903 case '+': /* SMS ghost */
1904 SMSUDHType=GSM_VoidSMS; break;
1906 case '(': /* SMS hanging phone, when saved to Outbox */
1907 SMSUDHType=GSM_HangSMS; break;
1909 case ')': /* SMS showed incorrectly in phone */
1910 SMSUDHType=GSM_BugSMS; break;
1912 case 'r': /* mark as read */
1913 SMSStatus = GSS_SENTREAD; break;
1915 case 'i': /* Save into Inbox */
1916 SMSFolder = GST_INBOX; break;
1918 case 's': /* Set replying via the same SMSC */
1919 SMSReply = true; break;
1921 case 'a': /* Ask before overwriting */
1922 interactive=true;break;
1924 case 'l': /* Specify location */
1925 SMSLocation = atoi(optarg); break;
1927 case '/': /* Name */
1928 strncpy(SMSName,optarg,25);break;
1930 case 'C': /* class Message */
1932 if (SMSUDHType!=GSM_NoUDH) {
1933 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1938 case '0': SMSClass = 0; break;
1939 case '1': SMSClass = 1; break;
1940 case '2': SMSClass = 2; break;
1941 case '3': SMSClass = 3; break;
1943 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1948 case 'F': /* save into folder n */
1949 SMSFolder = atoi(optarg);
1953 fprintf(stderr,_("Unknown option number %i\n"),argc);
1959 /* Get message text from stdin. */
1960 chars_read = fread(message_buffer, 1, input_len, stdin);
1962 if (chars_read == 0) {
1963 fprintf(stderr, _("Couldn't read from stdin!\n"));
1966 if (chars_read > input_len) {
1967 fprintf(stderr, _("Input too long!\n"));
1971 /* Null terminate. */
1972 message_buffer[chars_read] = 0x00;
1974 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1975 msgnum=MultiSMS.number;
1977 switch (SMSUDHType) {
1982 case GSM_EnableVoice:
1983 case GSM_DisableVoice:
1985 case GSM_DisableFax:
1986 case GSM_EnableEmail:
1987 case GSM_DisableEmail:
1988 fprintf(stdout,_("Warning: saving %ld chars\n"),(long)strlen(MultiSMS.SMS[0].MessageText));
1995 for (i=0;i<msgnum;i++) {
1996 MultiSMS.SMS[i].Destination[0]=0;
1997 if (argc!=0) strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1999 MultiSMS.SMS[i].Location=0;
2000 MultiSMS.SMS[i].Class=SMSClass;
2001 MultiSMS.SMS[i].MessageCenter.No=SMSCenter;
2002 strcpy(MultiSMS.SMS[i].MessageCenter.Number,SMSCNumber);
2003 MultiSMS.SMS[i].Status=SMSStatus;
2004 strcpy(MultiSMS.SMS[i].Name,SMSName);
2005 MultiSMS.SMS[i].folder=SMSFolder;
2006 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
2009 MultiSMS.SMS[0].Location=SMSLocation;
2011 /* Initialise the GSM interface. */
2014 MultiSMS.number=msgnum;
2015 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,interactive,false,false,false);
2020 /* Get SMSC number */
2022 int getsmsc(char *MessageCenterNumber)
2025 GSM_MessageCenter MessageCenter;
2027 MessageCenter.No=atoi(MessageCenterNumber);
2031 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
2033 fprintf(stdout, _("%d. SMS center ("),MessageCenter.No);
2035 if (!strcmp(MessageCenter.Name,""))
2036 fprintf(stdout,_("Set %d"),MessageCenter.No);
2037 else fprintf(stdout,_("%s"),MessageCenter.Name);
2039 fprintf(stdout,_(") number is "));
2041 if (!strcmp(MessageCenter.Number,"")) fprintf(stdout,_("not set\n"));
2042 else fprintf(stdout,_("%s\n"),MessageCenter.Number);
2044 fprintf(stdout,_("Default recipient number is "));
2046 if (!strcmp(MessageCenter.DefaultRecipient,""))
2047 fprintf(stdout,_("not set\n"));
2048 else fprintf(stdout,_("%s\n"),MessageCenter.DefaultRecipient);
2050 fprintf(stdout, _("Messages sent as "));
2052 switch (MessageCenter.Format) {
2053 case GSMF_Text :fprintf(stdout, _("Text"));break;
2054 case GSMF_Paging:fprintf(stdout, _("Paging"));break;
2055 case GSMF_Fax :fprintf(stdout, _("Fax"));break;
2057 case GSMF_UCI :fprintf(stdout, _("Email"));break;
2058 case GSMF_ERMES :fprintf(stdout, _("ERMES"));break;
2059 case GSMF_X400 :fprintf(stdout, _("X.400"));break;
2060 default :fprintf(stdout, _("Unknown"));
2065 fprintf(stdout, _("Message validity is "));
2067 switch (MessageCenter.Validity) {
2068 case GSMV_1_Hour :fprintf(stdout, _("1 hour"));break;
2069 case GSMV_6_Hours :fprintf(stdout, _("6 hours"));break;
2070 case GSMV_24_Hours:fprintf(stdout, _("24 hours"));break;
2071 case GSMV_72_Hours:fprintf(stdout, _("72 hours"));break;
2072 case GSMV_1_Week :fprintf(stdout, _("1 week"));break;
2073 case GSMV_Max_Time:fprintf(stdout, _("Maximum time"));break;
2074 default :fprintf(stdout, _("Unknown"));
2077 fprintf(stdout, "\n");
2081 fprintf(stdout, _("SMS center can not be found :-(\n"));
2088 /* Get SMS messages. */
2089 int getsms(int argc, char *argv[])
2092 GSM_SMSMessage message;
2093 GSM_WAPBookmark bookmark;
2094 char memory_type_string[20];
2095 int start_message, end_message, count, mode = 1;
2099 GSM_Ringtone ringtone;
2100 GSM_SMSFolders folders;
2102 int confirm = -1, i;
2105 /* Handle command line args that set type, start and end locations. */
2106 if (!GetMemoryTypeID(argv[2], &message.MemoryType))
2108 fprintf(stderr, _("Unknown memory type %s!\n"), argv[2]);
2111 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2113 for (i=0;i<64;i++) filename[i]=0;
2115 start_message = atoi(argv[3]);
2119 /* [end] can be only argv[4] */
2120 if (argv[4][0] == '-') {
2121 end_message = start_message;
2123 end_message = atoi(argv[4]);
2126 /* parse all options (beginning with '-' */
2127 while ((i = getopt(argc, argv, "f:")) != -1) {
2132 fprintf(stderr, _("Saving into file \"%s\"\n"), optarg);
2134 strncpy(filename, optarg, 64);
2135 if (strlen(optarg) > 63) {
2136 fprintf(stderr, _("Filename too long - will be truncated to 63 characters.\n"));
2139 filename[strlen(optarg)] = 0;
2152 end_message = start_message;
2155 /* Initialise the code for the GSM interface. */
2159 GSM->GetSMSFolders(&folders);
2162 /* Now retrieve the requested entries. */
2164 for (count = start_message; count <= end_message; count ++) {
2166 message.Location = count;
2168 error = GSM->GetSMSMessage(&message);
2174 switch (message.Type) {
2178 /* RTH FIXME: Test that out ! */
2179 fprintf(stdout, _("%d. Delivery Report "), message.MessageNumber);
2180 switch (message.Status)
2183 if (message.folder==0) //GST_INBOX
2184 fprintf(stdout, _("(read)\n"));
2186 fprintf(stdout, _("(sent)\n"));
2188 case GSS_NOTSENTREAD:
2189 if (message.folder==0) //GST_INBOX
2190 fprintf(stdout, _("(unread)\n"));
2192 fprintf(stdout, _("(not sent)\n"));
2195 fprintf(stdout, _("(not known :-()\n"));
2198 fprintf(stdout, _("(template)\n"));
2201 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2205 fprintf(stdout, _("Sending date/time : %s %02d/%02d/%02d %d:%02d:%02d "), \
2206 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2207 message.Time.Day, message.Time.Month, message.Time.Year, \
2208 message.Time.Hour, message.Time.Minute, message.Time.Second);
2210 if (message.Time.Timezone) {
2211 if (message.Time.Timezone > 0)
2212 fprintf(stdout,_("+%02d00"), message.Time.Timezone);
2214 fprintf(stdout,_("%02d00"), message.Time.Timezone);
2217 fprintf(stdout, "\n");
2219 fprintf(stdout, _("Response date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2220 DayOfWeek(message.SMSCTime.Year, message.SMSCTime.Month, message.SMSCTime.Day), \
2221 message.SMSCTime.Day, message.SMSCTime.Month, message.SMSCTime.Year, \
2222 message.SMSCTime.Hour, message.SMSCTime.Minute, message.SMSCTime.Second);
2224 if (message.SMSCTime.Timezone) {
2225 if (message.SMSCTime.Timezone > 0)
2226 fprintf(stdout,_("+%02d00"),message.SMSCTime.Timezone);
2228 fprintf(stdout,_("%02d00"),message.SMSCTime.Timezone);
2231 fprintf(stdout, "\n");
2233 fprintf(stdout, _("Receiver: %s Msg Center: %s\n"), message.Sender, message.MessageCenter.Number);
2234 fprintf(stdout, _("Text: %s\n\n"), message.MessageText);
2239 fprintf(stdout, _("%d. %s Message "), message.MessageNumber,
2240 folders.Folder[message.folder].Name);
2242 switch (message.Status)
2245 if (message.folder==0) //GST_INBOX
2246 fprintf(stdout, _("(read)\n"));
2248 fprintf(stdout, _("(sent)\n"));
2250 case GSS_NOTSENTREAD:
2251 if (message.folder==0) //GST_INBOX
2252 fprintf(stdout, _("(unread)\n"));
2254 fprintf(stdout, _("(not sent)\n"));
2257 fprintf(stdout, _("(not known :-()\n"));
2260 fprintf(stdout, _("(template)\n"));
2263 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2267 /* RTH FIXME: date for other status ok ? */
2268 if (message.SMSData) {
2270 fprintf(stdout, _("Date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2271 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2272 message.Time.Day, message.Time.Month, message.Time.Year, \
2273 message.Time.Hour, message.Time.Minute, message.Time.Second);
2275 if (message.Time.Timezone) {
2276 if (message.Time.Timezone > 0)
2277 fprintf(stdout,_("+%02d00"),message.Time.Timezone);
2279 fprintf(stdout,_("%02d00"),message.Time.Timezone);
2282 fprintf(stdout, "\n");
2284 fprintf(stdout, _("Msg Center: %s "), message.MessageCenter.Number);
2286 if (message.ReplyViaSameSMSC)
2287 fprintf(stdout, _("(centre set for reply) "));
2290 if (strcmp(message.Sender,"")) {
2291 if (message.folder==1) { //GST_OUTBOX
2292 fprintf(stdout, _("Recipient: %s"),message.Sender);
2294 fprintf(stdout, _("Sender: %s"),message.Sender);
2298 if (strcmp(message.Sender,"") || message.folder==0)
2299 fprintf(stdout, "\n");
2301 switch (message.UDHType) {
2305 /* put bitmap into bitmap structure */
2306 switch (GSM_ReadBitmap(&message, &bitmap)) {
2307 case GE_INVALIDIMAGESIZE:
2308 fprintf(stdout,_("Image size not supported\n"));
2311 fprintf(stdout, _("GSM operator logo for %s (%s) network.\n"), bitmap.netcode, GSM_GetNetworkName(bitmap.netcode));
2313 GSM_PrintBitmap(&bitmap);
2315 if (filename[0]!=0) {
2316 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2321 fprintf(stdout,_("Error reading image\n"));
2326 if (message.folder==0) { //GST_INBOX
2327 if (!strcmp(message.Sender, "+998000005") &&
2328 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2329 message.Time.Day==27 &&
2330 message.Time.Month==7 &&
2331 message.Time.Year==99 &&
2332 message.Time.Hour==0 &&
2333 message.Time.Minute==10 &&
2334 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2336 /* Is it changed in next versions ? Or what ? */
2337 if (!strcmp(message.Sender, "+998000002") ||
2338 !strcmp(message.Sender, "+998000003") ||
2339 !strcmp(message.Sender, "+998000004")) fprintf(stdout, _("Saved by Operator Logo Uploader by Thomas Kessler\n"));
2341 if (!strcmp(message.Sender, "+8861234567890") &&
2342 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2344 if (!strncmp(message.Sender, "OpLogo",6) &&
2345 strlen(message.Sender)==11)
2346 fprintf(stdout, _("Saved by gnokii\n"));
2351 case GSM_WAPBookmarkUDH:
2353 /* put bookmark into bookmark structure */
2354 switch (GSM_ReadWAPBookmark(&message, &bookmark)) {
2356 fprintf(stdout, ("WAP Bookmark\n"));
2358 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
2360 if (bookmark.title[0]==0)
2361 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
2363 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
2367 fprintf(stdout,_("Error reading WAP Bookmark\n"));
2372 if (!strcmp(message.Sender, "WAPBookmark"))
2373 fprintf(stdout, _("Saved by gnokii\n"));
2378 case GSM_CallerIDLogo:
2380 /* put bitmap into bitmap structure */
2381 switch (GSM_ReadBitmap(&message, &bitmap)) {
2382 case GE_INVALIDIMAGESIZE:
2383 fprintf(stdout,_("Image size not supported\n"));
2386 fprintf(stdout, ("Caller Logo\n"));
2388 GSM_PrintBitmap(&bitmap);
2390 if (filename[0]!=0) {
2391 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2396 fprintf(stdout,_("Error reading image\n"));
2401 if (message.folder==0) { //GST_INBOX
2402 if (!strcmp(message.Sender, "+998000005") &&
2403 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2404 message.Time.Day==27 &&
2405 message.Time.Month==7 &&
2406 message.Time.Year==99 &&
2407 message.Time.Hour==0 &&
2408 message.Time.Minute==10 &&
2409 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2411 if (!strcmp(message.Sender, "+8861234567890") &&
2412 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2414 if (!strcmp(message.Sender, "GroupLogo"))
2415 fprintf(stdout, _("Saved by gnokii\n"));
2420 case GSM_ProfileUDH:
2421 fprintf(stdout, ("Profile SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2424 case GSM_WAPBookmarkUDHLong:
2425 fprintf(stdout, ("WAP Bookmark, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2428 case GSM_WAPSettingsUDH:
2429 fprintf(stdout, ("WAP Settings, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2432 case GSM_RingtoneUDH:
2434 /* put ringtone into ringtone structure */
2435 switch (GSM_ReadRingtone(&message, &ringtone)) {
2438 fprintf(stdout, ("Ringtone \"%s\"\n"),ringtone.name);
2440 while (confirm < 0) {
2441 fprintf(stderr, _("Do you want to play it ? (yes/no) "));
2442 GetLine(stdin, ans, 7);
2443 if (!strcmp(ans, "yes")) confirm = 1;
2444 if (!strcmp(ans, "no")) confirm = 0;
2447 if (confirm==1) GSM_PlayRingtoneOnConsole(&ringtone);
2449 if (filename[0]!=0) GSM_SaveRingtoneFileOnConsole(filename, &ringtone);
2454 fprintf(stdout,_("Gnokii can't read this ringtone - there is probably error inside\n"));
2460 case GSM_CalendarNoteUDH:
2461 fprintf(stdout, ("Calendar note SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2462 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2463 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2466 case GSM_ConcatenatedMessages:
2467 fprintf(stdout, _("Linked (%d/%d)\nText:\n%s\n\n"),message.UDH[5],message.UDH[4], message.MessageText);
2468 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2471 case GSM_EnableVoice:
2472 fprintf(stdout, _("Enables voice indicator\nText:\n%s\n\n"), message.MessageText);
2473 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2476 case GSM_DisableVoice:
2477 fprintf(stdout, _("Disables voice indicator\nText:\n%s\n\n"), message.MessageText);
2478 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2482 fprintf(stdout, _("Enables fax indicator\nText:\n%s\n\n"), message.MessageText);
2483 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2486 case GSM_DisableFax:
2487 fprintf(stdout, _("Disables fax indicator\nText:\n%s\n\n"), message.MessageText);
2488 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2491 case GSM_EnableEmail:
2492 fprintf(stdout, _("Enables email indicator\nText:\n%s\n\n"), message.MessageText);
2493 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2496 case GSM_DisableEmail:
2497 fprintf(stdout, _("Disables email indicator\nText:\n%s\n\n"), message.MessageText);
2498 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2502 fprintf(stdout, _("Void SMS\nText:\n%s\n\n"), message.MessageText);
2503 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2507 if (message.Coding!=GSM_Coding_8bit) {
2508 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2509 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2511 fprintf(stdout, _("Message cannot be displayed here\n")); // like in phone :-)
2515 default: //GSM_UnknownUDH and other
2516 fprintf(stderr, _("Unknown\n"));
2522 fprintf(stdout,_("Unknown SMS type. Report it\n"));
2528 case GE_NOTIMPLEMENTED:
2530 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2534 case GE_INVALIDSMSLOCATION:
2536 fprintf(stderr, _("Invalid location: %s %d\n"), memory_type_string, count);
2540 case GE_EMPTYSMSLOCATION:
2542 fprintf(stderr, _("SMS location %s %d empty.\n"), memory_type_string, count);
2548 fprintf(stderr, _("No access to %s memory.\n"), memory_type_string);
2554 fprintf(stderr, _("GetSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2563 int getsmsstatus(int argc, char *argv[])
2565 GSM_SMSStatus SMSStatus;
2566 GSM_SMSFolders folders;
2572 /* Initialise the code for the GSM interface. */
2575 error = GSM->GetSMSStatus(&SMSStatus);
2576 if (error!=GE_NONE) return error;
2578 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"),SMSStatus.UnRead, SMSStatus.Number);
2580 error=GSM->GetSMSFolders(&folders);
2581 if (error!=GE_NONE) return error;
2583 /* For not 7110 compatible phones we have to read all SMS and prepare sms table */
2584 if( GetModelFeature (FN_SMS)!=F_SMS71 )
2588 if (j==SMSStatus.Number) break;
2590 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
2591 SMSStatus.foldertable[j].smsnum=i;
2593 /* We set such folders ID like in 7110 compatible phones */
2594 if (SMS.Status==GSS_NOTSENTREAD && SMS.folder==0) //GST_INBOX
2595 SMSStatus.foldertable[j].folder=0;
2597 switch (SMS.folder) {
2599 SMSStatus.foldertable[j].folder=GST_7110_INBOX;
2602 SMSStatus.foldertable[j].folder=GST_7110_OUTBOX;
2612 printf("0.Unread : ");
2613 for(j=0; j<SMSStatus.Number; j++)
2615 if (SMSStatus.foldertable[j].folder == 0)
2616 printf("%d ",SMSStatus.foldertable[j].smsnum);
2620 for (i=0;i<folders.number;i++) {
2621 fprintf(stdout,_("%d.%-15s: "),i+1,folders.Folder[i].Name);
2622 for(j=0; j<SMSStatus.Number; j++)
2624 if ( SMSStatus.foldertable[j].folder / 8 == i+1)
2625 printf("%d ",SMSStatus.foldertable[j].smsnum);
2635 /* Delete SMS messages. */
2636 int deletesms(int argc, char *argv[])
2639 GSM_SMSMessage message;
2640 char memory_type_string[20];
2641 int start_message, end_message, count;
2644 /* Handle command line args that set type, start and end locations. */
2645 if (!GetMemoryTypeID(argv[0], &message.MemoryType))
2647 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
2650 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2652 start_message = atoi (argv[1]);
2653 if (argc > 2) end_message = atoi (argv[2]);
2654 else end_message = start_message;
2656 /* Initialise the code for the GSM interface. */
2660 /* Now delete the requested entries. */
2662 for (count = start_message; count <= end_message; count ++) {
2664 message.Location = count;
2666 error = GSM->DeleteSMSMessage(&message);
2668 if (error == GE_NONE)
2669 fprintf(stdout, _("Deleted SMS %s %d\n"), memory_type_string, count);
2671 if (error == GE_NOTIMPLEMENTED) {
2672 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2676 fprintf(stdout, _("DeleteSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2685 static volatile bool bshutdown = false;
2687 /* SIGINT signal handler. */
2689 static void interrupted(int sig)
2692 signal(sig, SIG_IGN);
2699 /* In this mode we get the code from the keyboard and send it to the mobile
2702 int entersecuritycode(char *type)
2705 GSM_SecurityCode SecurityCode;
2707 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2708 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2709 else if (!strcmp(type,"PIN2"))SecurityCode.Type=GSCT_Pin2;
2710 else if (!strcmp(type,"PUK2"))SecurityCode.Type=GSCT_Puk2;
2712 // FIXME: Entering of SecurityCode does not work :-(
2713 // else if (!strcmp(type,"SecurityCode"))
2714 // SecurityCode.Type=GSCT_SecurityCode;
2717 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2722 printf("Enter your code: ");
2723 gets(SecurityCode.Code);
2725 strcpy(SecurityCode.Code,getpass(_("Enter your code: ")));
2730 test = GSM->EnterSecurityCode(SecurityCode);
2732 fprintf(stdout,_("Code OK !\n"));
2734 fprintf(stderr,_("%s\n"),print_error(test));
2741 int getsecuritycodestatus(void)
2748 if (GSM->GetSecurityCodeStatus(&Status) == GE_NONE) {
2750 fprintf(stdout, _("Security code status: "));
2753 case GSCT_SecurityCode:fprintf(stdout, _("waiting for Security Code.\n"));break;
2754 case GSCT_Pin: fprintf(stdout, _("waiting for PIN.\n")); break;
2755 case GSCT_Pin2: fprintf(stdout, _("waiting for PIN2.\n")); break;
2756 case GSCT_Puk: fprintf(stdout, _("waiting for PUK.\n")); break;
2757 case GSCT_Puk2: fprintf(stdout, _("waiting for PUK2.\n")); break;
2758 case GSCT_None: fprintf(stdout, _("nothing to enter.\n")); break;
2759 default: fprintf(stdout, _("Unknown!\n"));
2768 int getsecuritycode(char *type)
2771 GSM_SecurityCode SecurityCode;
2774 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2775 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2776 else if (!strcmp(type,"PIN2")) SecurityCode.Type=GSCT_Pin2;
2777 else if (!strcmp(type,"PUK2")) SecurityCode.Type=GSCT_Puk2;
2778 else if (!strcmp(type,"SecurityCode"))SecurityCode.Type=GSCT_SecurityCode;
2780 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2786 error=GSM->GetSecurityCode(&SecurityCode);
2789 case GE_INVALIDSECURITYCODE:
2790 fprintf(stdout, _("Error: getting "));
2791 switch (SecurityCode.Type) {
2792 case GSCT_SecurityCode:fprintf(stdout, _("security code"));break;
2793 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2794 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2795 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2796 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2799 fprintf(stdout, _(" not allowed\n"));
2802 switch (SecurityCode.Type) {
2803 case GSCT_SecurityCode:fprintf(stdout, _("Security code"));break;
2804 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2805 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2806 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2807 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2810 fprintf(stdout, _(" is %s\n"),SecurityCode.Code);
2813 fprintf(stderr, _("%s\n"),print_error(error));
2824 /* Voice dialing mode. */
2826 int dialvoice(char *Number)
2830 if (GSM->DialVoice(Number)!=GE_NONE) fprintf(stdout,_("Error!\n"));
2837 #endif /* UCLINUX */
2840 static int cancelcall(void)
2844 if (GSM->CancelCall()!=GE_NONE) fprintf(stdout,_("Error!\n"));
2853 int savelogo(int argc, char *argv[])
2856 GSM_NetworkInfo NetworkInfo;
2857 GSM_MultiSMSMessage MultiSMS;
2859 /* Operator logos will be saved with this number */
2860 char oplogonumber[]={'O','p','L','o','g','o',
2861 '0','0','0','0','0', /* MMC+MNC */
2865 bool UnicodeText=false;
2867 /* The first argument is the type of the logo. */
2868 if (!strcmp(argv[0], "op")) {
2869 fprintf(stdout, _("Saving operator logo.\n"));
2870 } else if (!strcmp(argv[0], "caller")) {
2871 fprintf(stdout, _("Saving caller line identification logo.\n"));
2872 } else if (!strcmp(argv[0], "startup")) {
2873 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2875 } else if (!strcmp(argv[0], "7110startup")) {
2876 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2878 } else if (!strcmp(argv[0], "6210startup")) {
2879 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2881 } else if (!strcmp(argv[0], "7110op")) {
2882 fprintf(stderr, _("It isn't possible to save big operator logos!\n"));
2884 } else if (!strcmp(argv[0], "picture")) {
2885 fprintf(stderr, _("Saving picture image.\n"));
2886 } else if (!strcmp(argv[0], "screensaver")) {
2887 fprintf(stderr, _("Saving screen saver.\n"));
2889 fprintf(stderr, _("You should specify what kind of logo to save!\n"));
2893 /* The second argument is the bitmap file. */
2894 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return -1;
2896 /* Initialise the GSM interface. */
2899 /* We check optional parameters from 2'rd */
2902 if (!strcmp(argv[0], "op")) {
2903 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2905 /* The third argument, if present, is the Network code of the operator.
2906 * Network code is in this format: "xxx yy" */
2908 strcpy(bitmap.netcode, argv[2]);
2910 fprintf(stdout, _("Operator code: %s\n"), argv[2]);
2912 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
2913 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
2920 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
2922 bitmap.type=GSM_OperatorLogo;
2924 /* Put bitmap into SMS structure */
2925 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2927 oplogonumber[6]=bitmap.netcode[0];
2928 oplogonumber[7]=bitmap.netcode[1];
2929 oplogonumber[8]=bitmap.netcode[2];
2930 oplogonumber[9]=bitmap.netcode[4];
2931 oplogonumber[10]=bitmap.netcode[5];
2932 for(i=0;i<MultiSMS.number;i++)
2933 strcpy(MultiSMS.SMS[i].Destination,oplogonumber);
2935 if (!strcmp(argv[0], "caller")) {
2936 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2938 bitmap.type=GSM_CallerLogo;
2940 /* Put bitmap into SMS structure */
2941 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2943 for(i=0;i<MultiSMS.number;i++)
2944 strcpy(MultiSMS.SMS[i].Destination,"GroupLogo");
2946 if (!strcmp(argv[0], "screensaver")) {
2947 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2952 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2954 /* Put bitmap into SMS structure */
2955 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,true,UnicodeText);
2957 for(i=0;i<MultiSMS.number;i++)
2958 strcpy(MultiSMS.SMS[i].Destination,"ScreenSaver");
2960 if (!strcmp(argv[0], "picture")) {
2961 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2964 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2969 if (strlen(argv[2])>121) {
2970 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[2]);
2973 strcpy(bitmap.text,argv[2]);
2976 /* Put bitmap into SMS structure */
2977 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,UnicodeText);
2979 for(i=0;i<MultiSMS.number;i++)
2980 strcpy(MultiSMS.SMS[i].Destination,"Picture");
2983 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,true,false,false);
2988 /* The following function allows to send logos using SMS */
2989 int sendlogo(int argc, char *argv[])
2992 GSM_NetworkInfo NetworkInfo;
2993 GSM_MultiSMSMessage MultiSMS;
2997 bool UnicodeText=false;
2998 bool ScreenSaver=false;
3000 /* The first argument is the type of the logo. */
3001 if (!strcmp(argv[0], "op")) {
3002 fprintf(stdout, _("Sending operator logo.\n"));
3003 } else if (!strcmp(argv[0], "caller")) {
3004 fprintf(stdout, _("Sending caller line identification logo.\n"));
3005 } else if (!strcmp(argv[0], "picture")) {
3006 fprintf(stdout, _("Sending picture image.\n"));
3007 } else if (!strcmp(argv[0], "screensaver")) {
3008 fprintf(stdout, _("Sending screen saver.\n"));
3009 } else if (!strcmp(argv[0], "startup")) {
3010 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3012 } else if (!strcmp(argv[0], "7110startup")) {
3013 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3015 } else if (!strcmp(argv[0], "6210startup")) {
3016 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3018 } else if (!strcmp(argv[0], "7110op")) {
3019 fprintf(stderr, _("It isn't possible to send big operator logos!\n"));
3022 fprintf(stderr, _("You should specify what kind of logo to send!\n"));
3026 /* The third argument is the bitmap file. */
3027 if (GSM_ReadBitmapFileOnConsole(argv[2], &bitmap)!=GE_NONE) return -1;
3029 /* Initialise the GSM interface. */
3034 if (!strcmp(argv[0], "op")) {
3035 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3037 /* The third argument, if present, is the Network code of the operator.
3038 * Network code is in this format: "xxx yy" */
3040 strcpy(bitmap.netcode, argv[3]);
3042 fprintf(stdout, _("Operator code: %s\n"), argv[3]);
3044 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
3045 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3052 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3054 bitmap.type=GSM_OperatorLogo;
3056 if (!strcmp(argv[0], "caller")) {
3057 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3059 bitmap.type=GSM_CallerLogo;
3061 if (!strcmp(argv[0], "screensaver")) {
3062 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3067 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3071 if (!strcmp(argv[0], "picture")) {
3072 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3075 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3080 if (strlen(argv[3])>121) {
3081 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[3]);
3084 strcpy(bitmap.text,argv[3]);
3088 /* Put bitmap into SMS structure */
3089 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,ScreenSaver,UnicodeText);
3091 /* The second argument is the destination, ie the phone number of recipient. */
3092 for(i=0;i<MultiSMS.number;i++)
3093 strcpy(MultiSMS.SMS[i].Destination,argv[1]);
3095 GSM_SendMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,true,false,false);
3100 /* Getting logos. */
3102 int getlogo(int argc, char *argv[])
3108 bitmap.type=GSM_None;
3110 if (!strcmp(argv[0],"7110op"))
3111 bitmap.type=GSM_7110OperatorLogo;
3113 if (!strcmp(argv[0],"op"))
3114 bitmap.type=GSM_OperatorLogo;
3116 if (!strcmp(argv[0],"caller")) {
3117 /* There is caller group number missing in argument list. */
3120 if ((num<1)||(num>9)) num=1;
3127 bitmap.type=GSM_CallerLogo;
3130 if (!strcmp(argv[0],"picture")) {
3131 /* There is a number missing in argument list. */
3133 if (strlen(argv[2])==2) {
3134 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3145 bitmap.type=GSM_PictureImage;
3148 if (!strcmp(argv[0],"startup"))
3149 bitmap.type=GSM_StartupLogo;
3151 if (!strcmp(argv[0],"7110startup"))
3152 bitmap.type=GSM_7110StartupLogo;
3154 if (!strcmp(argv[0],"6210startup"))
3155 bitmap.type=GSM_6210StartupLogo;
3157 if (!strcmp(argv[0],"dealer"))
3158 bitmap.type=GSM_DealerNoteText;
3160 if (!strcmp(argv[0],"text"))
3161 bitmap.type=GSM_WelcomeNoteText;
3163 if (bitmap.type!=GSM_None) {
3167 fprintf(stdout, _("Getting Logo\n"));
3169 error=GSM->GetBitmap(&bitmap);
3176 if (bitmap.type==GSM_DealerNoteText) fprintf(stdout, _("Dealer welcome note "));
3177 if (bitmap.type==GSM_WelcomeNoteText) fprintf(stdout, _("Welcome note "));
3178 if (bitmap.type==GSM_DealerNoteText || bitmap.type==GSM_WelcomeNoteText)
3180 if (bitmap.text[0]!=0)
3182 fprintf(stdout, _("currently set to \"%s\"\n"), bitmap.text);
3184 fprintf(stdout, _("currently empty\n"));
3188 if (bitmap.width!=0)
3190 if (bitmap.type==GSM_OperatorLogo || bitmap.type==GSM_7110OperatorLogo)
3192 fprintf(stdout,"Operator logo for %s (%s) network got succesfully\n",bitmap.netcode,GSM_GetNetworkName(bitmap.netcode));
3194 if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_7110StartupLogo || bitmap.type==GSM_6210StartupLogo)
3196 fprintf(stdout,"Startup logo got successfully\n");
3198 if (bitmap.type==GSM_CallerLogo)
3200 fprintf(stdout,"Caller logo got successfully\n");
3202 if (bitmap.type==GSM_PictureImage)
3204 fprintf(stdout,"Picture Image got successfully");
3205 if (strcmp(bitmap.text,""))
3206 fprintf(stdout,_(", text \"%s\""),bitmap.text);
3207 if (strcmp(bitmap.Sender,""))
3208 fprintf(stdout,_(", sender \"%s\""),bitmap.Sender);
3209 fprintf(stdout,"\n");
3213 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
3217 fprintf(stdout,"Your phone doesn't have logo uploaded !\n");
3222 case GE_NOTIMPLEMENTED:
3223 fprintf(stderr, _("Function not implemented !\n"));
3225 case GE_NOTSUPPORTED:
3226 fprintf(stderr, _("This kind of logo is not supported !\n"));
3229 fprintf(stderr, _("Error getting logo (wrong location ?) !\n"));
3234 fprintf(stderr, _("What kind of logo do you want to get ?\n"));
3241 /* Setting logos. */
3243 int setlogo(int argc, char *argv[])
3246 GSM_Bitmap bitmap,oldbit;
3247 GSM_NetworkInfo NetworkInfo;
3258 if (!strcmp(argv[0],"text") || !strcmp(argv[0],"dealer"))
3260 if (!strcmp(argv[0],"text")) bitmap.type=GSM_WelcomeNoteText;
3261 else bitmap.type=GSM_DealerNoteText;
3262 bitmap.text[0]=0x00;
3263 if (argc>1) strncpy(bitmap.text,argv[1],255);
3266 if (!strcmp(argv[0],"op") || !strcmp(argv[0],"startup") || !strcmp(argv[0],"caller") ||
3267 !strcmp(argv[0],"7110op") || !strcmp(argv[0],"6210startup") || !strcmp(argv[0],"7110startup") ||
3268 !strcmp(argv[0],"picture"))
3272 if (!strcmp(argv[0],"startup"))
3274 bitmap.type=GSM_StartupLogo;
3277 bitmap.size=bitmap.width*bitmap.height/8;
3279 if (num>=1 && num<=3) {
3282 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3287 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
3290 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3295 if (!strcmp(argv[0],"op"))
3297 if (bitmap.type!=GSM_OperatorLogo || argc<3)
3299 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3301 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
3304 strncpy(bitmap.netcode,argv[2],7);
3305 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3307 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3312 if (!strcmp(argv[0],"7110op"))
3314 if (bitmap.type!=GSM_7110OperatorLogo || argc<3)
3316 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3318 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
3321 strncpy(bitmap.netcode,argv[2],7);
3322 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3324 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3329 if (!strcmp(argv[0],"picture"))
3331 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3335 if (strlen(argv[2])==2) {
3336 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3346 strncpy(bitmap.text,argv[3],121);
3347 strcpy(bitmap.Sender,"\0");
3349 strncpy(bitmap.Sender,argv[4],GSM_MAX_SENDER_LENGTH);
3351 if (!strcmp(argv[0],"7110startup"))
3353 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
3355 if (!strcmp(argv[0],"6210startup"))
3357 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
3359 if (!strcmp(argv[0],"caller"))
3361 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3365 if ((num<0)||(num>9)) num=0;
3371 oldbit.type=GSM_CallerLogo;
3372 oldbit.number=bitmap.number;
3373 if (GSM->GetBitmap(&oldbit)==GE_NONE)
3375 /* We have to get the old name and ringtone!! */
3376 bitmap.ringtone=oldbit.ringtone;
3377 strncpy(bitmap.text,oldbit.text,255);
3379 if (argc>3) strncpy(bitmap.text,argv[3],255);
3381 fprintf(stdout, _("Setting Logo.\n"));
3384 /* FIX ME: is it possible to permanently remove op logo ? */
3385 if (!strcmp(argv[0],"op"))
3387 bitmap.type=GSM_OperatorLogo;
3388 strncpy(bitmap.netcode,"000 00",7);
3391 bitmap.size=bitmap.width*bitmap.height/8;
3392 GSM_ClearBitmap(&bitmap);
3394 if (!strcmp(argv[0],"7110op"))
3396 bitmap.type=GSM_7110OperatorLogo;
3397 strncpy(bitmap.netcode,"000 00",7);
3400 bitmap.size=(bitmap.width*bitmap.height + 7)/8;
3401 GSM_ClearBitmap(&bitmap);
3403 /* FIX ME: how to remove startup and group logos ? */
3404 fprintf(stdout, _("Removing Logo.\n"));
3408 fprintf(stderr, _("What kind of logo do you want to set ?\n"));
3414 while (GSM->GetModel(model) != GE_NONE)
3417 /* For Nokia 6110/6130/6150 we use different method of uploading.
3418 Phone will display menu, when received it */
3419 if (!strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") || !strcmp(model,"NSM-1"))
3421 if (!strcmp(argv[0],"caller") && argc<3)
3423 if (!strcmp(argv[0],"op") && argc<3)
3427 error=GSM->SetBitmap(&bitmap);
3431 case GE_NONE: oldbit.type=bitmap.type;
3432 oldbit.number=bitmap.number;
3433 if (GSM->GetBitmap(&oldbit)==GE_NONE) {
3434 if (bitmap.type==GSM_WelcomeNoteText ||
3435 bitmap.type==GSM_DealerNoteText) {
3436 if (strcmp(bitmap.text,oldbit.text)) {
3437 fprintf(stderr, _("Error setting"));
3438 if (bitmap.type==GSM_DealerNoteText) fprintf(stderr, _(" dealer"));
3439 fprintf(stderr, _(" welcome note - "));
3441 /* I know, it looks horrible, but... */
3442 /* I set it to the short string - if it won't be set */
3443 /* it means, PIN is required. If it will be correct, previous */
3444 /* (user) text was too long */
3446 /* Without it, I could have such thing: */
3447 /* user set text to very short string (for example, "Marcin") */
3448 /* then enable phone without PIN and try to set it to the very long (too long for phone) */
3449 /* string (which start with "Marcin"). If we compare them as only length different, we could think, */
3450 /* that phone accepts strings 6 chars length only (length of "Marcin") */
3451 /* When we make it correct, we don't have this mistake */
3453 strcpy(oldbit.text,"!\0");
3454 GSM->SetBitmap(&oldbit);
3455 GSM->GetBitmap(&oldbit);
3456 if (oldbit.text[0]!='!') {
3457 fprintf(stderr, _("SIM card and PIN is required\n"));
3459 GSM->SetBitmap(&bitmap);
3460 GSM->GetBitmap(&oldbit);
3461 fprintf(stderr, _("too long, truncated to \"%s\" (length %ld)\n"),oldbit.text,(long)strlen(oldbit.text));
3466 if (bitmap.type==GSM_StartupLogo) {
3467 for (i=0;i<oldbit.size;i++) {
3468 if (oldbit.bitmap[i]!=bitmap.bitmap[i]) {
3469 fprintf(stderr, _("Error setting startup logo - SIM card and PIN is required\n"));
3477 if (ok) fprintf(stdout, _("Done.\n"));
3479 case GE_NOTIMPLEMENTED:fprintf(stderr, _("Function not implemented.\n"));
3481 case GE_NOTSUPPORTED:fprintf(stderr, _("This kind of logo is not supported.\n"));
3483 default:fprintf(stderr, _("Error (wrong location ?) !\n"));
3492 /* Calendar notes receiving. */
3494 int getcalendarnote(int argc, char *argv[])
3496 GSM_CalendarNote CalendarNote;
3497 GSM_NotesInfo NotesInfo;
3503 bool was_note=false;
3504 char z_text[MAX_CALENDAR_TEXT_LENGTH+11];
3506 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
3514 now=localtime(&nowh);
3516 Date.Year = now->tm_year;
3518 /* I have 100 (for 2000) Year now :-) */
3519 if (Date.Year>99 && Date.Year<1900) {
3520 Date.Year=Date.Year+1900;
3523 start=atoi(argv[0]);
3528 if (!strcmp(argv[argc-1],"-v10")) {
3531 if (!strcmp(argv[argc-1],"-v30")) {
3540 if (!strcmp(argv[argc-1],"-v10")) {
3543 if (!strcmp(argv[argc-1],"-v30")) {
3555 while (GSM->GetModel(model) != GE_NONE)
3558 if (!strcmp(argv[0],"-s") || !strcmp(argv[0],"--short"))
3560 else if (!isdigit(argv[0][0])) {
3565 error=GSM->GetCalendarNotesInfo(&NotesInfo);
3566 if ( error == GE_NONE ) {
3567 if( NotesInfo.HowMany == 0 ) {
3568 fprintf(stderr, _("Sorry! No Calendar Notes present on phone.\n"));
3569 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3572 fprintf(stdout, _(" CALENDAR NOTES INFO \n"));
3573 fprintf(stdout, _("---------------------\n"));
3574 fprintf(stdout, _("How Many Locations :%d\n"), NotesInfo.HowMany);
3576 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3577 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3578 fprintf(stdout, _("Locations are :\n"));
3579 for(i=0;i<NotesInfo.HowMany;i++)
3580 fprintf(stdout, _("%4d) %4d\n"), i+1, NotesInfo.Location[i]);
3584 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3585 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3586 fprintf(stderr, _("Can't read Notes Infos from phone.\n"));
3587 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3591 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) {
3593 NotesInfo.HowMany=200;
3594 for (i=0;i<200;i++) {
3595 NotesInfo.Location[i]=i+1;
3599 if( vInfo && stop!=(-1) && error==GE_NONE )
3601 /* Info datas (for 7110 and comp.) */
3602 fprintf(stdout, _(" CALENDAR NOTES SUMMARY INFORMATION \n"));
3603 fprintf(stdout, _(" ==================================\n"));
3604 if (GetModelFeature (FN_CALENDAR)==F_CAL71) {
3605 fprintf(stdout, _("Calendar notes present on phone: %d\n"), NotesInfo.HowMany);
3606 fprintf(stdout, _("Locations are :\n"));
3608 fprintf(stdout, "----------------------------------------------------------------------------\n");
3609 fprintf(stdout,_(" Loc Phys Type Summary description Dt start Alarm Recurs\n") );
3610 fprintf(stdout, "----------------------------------------------------------------------------\n");
3612 for(i=0;i<NotesInfo.HowMany;i++)
3614 /* very short format ... */
3616 fprintf(stdout, _("%4d) %4d\n"), i, NotesInfo.Location[i]);
3618 CalendarNote.Location=i+1;
3619 CalendarNote.ReadNotesInfo=false;
3621 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3624 switch (CalendarNote.Type) {
3625 case GCN_REMINDER:strcpy(z_type, "REMIND"); break;
3626 case GCN_CALL: strcpy(z_type, "CALL"); break;
3627 case GCN_MEETING: strcpy(z_type, "MEETING"); break;
3628 case GCN_BIRTHDAY:strcpy(z_type, "BDAY"); break;
3629 default: strcpy(z_type, "UNKNOWN"); break;
3632 if( CalendarNote.Recurrance ) {
3633 sprintf( z_recur,"%d ", CalendarNote.Recurrance/24 );
3634 strcat( z_recur, CalendarNote.Recurrance == 1 ? "day" : "days" );
3637 strcpy( z_recur, "No" );
3641 if( CalendarNote.Type == GCN_CALL )
3642 sprintf(z_text, "\"%s\"", CalendarNote.Phone );
3644 if (CalendarNote.Text[0]!=0)
3645 sprintf(z_text, "\"%s\"", CalendarNote.Text );
3647 if(CalendarNote.Type == GCN_BIRTHDAY) {
3649 i_age = Date.Year - CalendarNote.Time.Year;
3650 sprintf(z_text, "\"%s (%d %s)\"", CalendarNote.Text,
3651 i_age, (i_age==1)?"year":"years");
3652 strcpy( z_recur, "-" );
3653 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3655 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3656 i+1,NotesInfo.Location[i], z_type, z_text,
3657 CalendarNote.Time.Year,
3658 CalendarNote.Time.Month,
3659 CalendarNote.Time.Day,
3660 (CalendarNote.AlarmType==0x00) ? "Tone " : "Silent",
3664 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3665 i+1,NotesInfo.Location[i], z_type, z_text,
3666 CalendarNote.Time.Year,
3667 CalendarNote.Time.Month,
3668 CalendarNote.Time.Day,
3669 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3672 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3674 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3675 i+1,NotesInfo.Location[i], z_type, z_text,
3676 CalendarNote.Time.Year,
3677 CalendarNote.Time.Month,
3678 CalendarNote.Time.Day,
3679 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3683 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s\n"),
3684 i+1,NotesInfo.Location[i], z_type, z_text,
3685 CalendarNote.Time.Year,
3686 CalendarNote.Time.Month,
3687 CalendarNote.Time.Day,
3688 (CalendarNote.Alarm.Year) ? "Yes" : "No ");
3690 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) break;
3695 for (i=start;i<=stop;i++) {
3696 if (error==GE_NONE) {
3697 if( i>NotesInfo.HowMany ) {
3698 fprintf(stderr, _("Only %d Calendar Notes present on phone!\n"),NotesInfo.HowMany);
3702 fprintf(stderr, _("Calendar Notes location can't be zero... skipping.\n"));
3707 CalendarNote.Location=i;
3708 CalendarNote.ReadNotesInfo=false;
3710 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3714 fprintf(stdout, GSM_GetVCALENDARStart(vCalVer));
3718 fprintf(stdout, GSM_GetVCALENDARNote(&CalendarNote,vCalVer));
3720 } else { /* not vCal */
3723 fprintf(stdout, "\n");
3728 fprintf(stdout, _(" Type of the note: "));
3730 switch (CalendarNote.Type) {
3732 case GCN_REMINDER:fprintf(stdout, _("Reminder\n"));break;
3733 case GCN_CALL :fprintf(stdout, _("Call\n")); break;
3734 case GCN_MEETING :fprintf(stdout, _("Meeting\n")); break;
3735 case GCN_BIRTHDAY:fprintf(stdout, _("Birthday\n"));break;
3736 default: fprintf(stdout, _("Unknown\n"));
3740 /* For 3310: set date to 2090! */
3741 if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
3742 fprintf(stdout, _(" Date: xxxx-%02d-%02d\n"), CalendarNote.Time.Month,
3743 CalendarNote.Time.Day);
3745 fprintf(stdout, _(" Date: %s %d-%02d-%02d\n"),
3746 DayOfWeek(CalendarNote.Time.Year, CalendarNote.Time.Month, CalendarNote.Time.Day),
3747 CalendarNote.Time.Year,
3748 CalendarNote.Time.Month,
3749 CalendarNote.Time.Day);
3752 fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CalendarNote.Time.Hour,
3753 CalendarNote.Time.Minute,
3754 CalendarNote.Time.Second);
3756 if (CalendarNote.Alarm.Year!=0) {
3757 fprintf(stdout, _(" Alarm date: %s %d-%02d-%02d\n"),
3758 DayOfWeek(CalendarNote.Alarm.Year, CalendarNote.Alarm.Month, CalendarNote.Alarm.Day),
3759 CalendarNote.Alarm.Year,
3760 CalendarNote.Alarm.Month,
3761 CalendarNote.Alarm.Day);
3763 fprintf(stdout, _(" Alarm time: %02d:%02d:%02d\n"), CalendarNote.Alarm.Hour,
3764 CalendarNote.Alarm.Minute,
3765 CalendarNote.Alarm.Second);
3766 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 )
3767 fprintf(stdout, _(" Alarm type: %s\n"), (CalendarNote.AlarmType==0x00) ?
3768 "With Tone" : "Silent" );
3771 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && CalendarNote.Recurrance!= 0 )
3772 fprintf(stdout, " It repeat every %d day%s\n", CalendarNote.Recurrance/24,
3773 ((CalendarNote.Recurrance/24)>1) ? "s":"" );
3775 if (CalendarNote.Type == GCN_BIRTHDAY)
3778 i_age = Date.Year - CalendarNote.Time.Year;
3779 fprintf(stdout, _(" Text: %s (%d %s)\n"), CalendarNote.Text,
3780 i_age, (i_age==1)?"year":"years");
3782 if (CalendarNote.Text[0]!=0)
3783 fprintf(stdout, _(" Text: %s\n"), CalendarNote.Text);
3786 if (CalendarNote.Type == GCN_CALL)
3787 fprintf(stdout, _(" Phone: %s\n"), CalendarNote.Phone);
3790 fprintf(stderr, _("The calendar note %i can not be read\n"),i);
3794 if (was_note && vCalVer!=0) {
3795 fprintf(stdout, GSM_GetVCALENDAREnd(vCalVer));
3803 /* Writing calendar notes. */
3805 int writecalendarnote(char *argv[])
3807 GSM_CalendarNote CalendarNote;
3811 number=atoi(argv[1]);
3814 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
3818 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
3821 case GE_CANTOPENFILE:
3822 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
3825 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
3828 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
3834 /* Error 22=Calendar full ;-) */
3836 error=GSM->WriteCalendarNote(&CalendarNote);
3839 fprintf(stdout, _("Succesfully written!\n"));break;
3841 fprintf(stdout, _("Too long text in calendar note!\n"));break;
3843 fprintf(stdout, _("Failed to write calendar note!\n"));break;
3851 /* Calendar note deleting. */
3853 int deletecalendarnote(char *Index)
3856 GSM_CalendarNote CalendarNote;
3858 CalendarNote.Location=atoi(Index);
3862 if (GSM->DeleteCalendarNote(&CalendarNote) == GE_NONE) {
3863 fprintf(stdout, _(" Calendar note deleted.\n"));
3866 fprintf(stderr, _("The calendar note can not be deleted\n"));
3877 /* Setting the date and time. */
3879 int setdatetime(int argc, char *argv[])
3888 now=localtime(&nowh);
3890 Date.Year = now->tm_year;
3891 Date.Month = now->tm_mon+1;
3892 Date.Day = now->tm_mday;
3893 Date.Hour = now->tm_hour;
3894 Date.Minute = now->tm_min;
3895 Date.Second = now->tm_sec;
3897 if (argc>0) Date.Year = atoi (argv[0]);
3898 if (argc>1) Date.Month = atoi (argv[1]);
3899 if (argc>2) Date.Day = atoi (argv[2]);
3900 if (argc>3) Date.Hour = atoi (argv[3]);
3901 if (argc>4) Date.Minute = atoi (argv[4]);
3906 /* Well, this thing is copyrighted in U.S. This technique is known as
3907 Windowing and you can read something about it in LinuxWeekly News:
3908 http://lwn.net/1999/features/Windowing.phtml. This thing is beeing
3909 written in Czech republic and Poland where algorithms are not allowed
3913 Date.Year = Date.Year+1900;
3915 Date.Year = Date.Year+2000;
3918 /* FIXME: Error checking should be here. */
3919 GSM->SetDateTime(&Date);
3926 /* In this mode we receive the date and time from mobile phone. */
3928 int getdatetime(void) {
3930 GSM_DateTime date_time;
3934 if (GSM->GetDateTime(&date_time)==GE_NONE) {
3935 if (date_time.IsSet) {
3936 fprintf(stdout, _("Date: %s %4d/%02d/%02d\n"),
3937 DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
3938 date_time.Year, date_time.Month, date_time.Day);
3939 fprintf(stdout, _("Time: %02d:%02d:%02d\n"), date_time.Hour, date_time.Minute, date_time.Second);
3941 fprintf(stdout, _("Date and time not set in phone\n"));
3944 fprintf(stdout,_("Error!\n"));
3952 /* Setting the alarm. */
3954 int setalarm(char *argv[])
3961 Date.Hour = atoi(argv[0]);
3962 Date.Minute = atoi(argv[1]);
3964 GSM->SetAlarm(1, &Date);
3971 /* Getting the alarm. */
3973 int getalarm(void) {
3975 GSM_DateTime date_time;
3979 if (GSM->GetAlarm(0, &date_time)==GE_NONE) {
3980 fprintf(stdout, _("Alarm: %s\n"), (date_time.IsSet)?"on":"off");
3981 fprintf(stdout, _("Time: %02d:%02d\n"), date_time.Hour, date_time.Minute);
3983 fprintf(stdout,_("Error!\n"));
3991 /* In monitor mode we don't do much, we just initialise the fbus code.
3992 Note that the fbus code no longer has an internal monitor mode switch,
3993 instead compile with DEBUG enabled to get all the gumpf. */
3995 int monitormode(int argc, char *argv[])
3998 float rflevel=-1, batterylevel=-1;
3999 unsigned char loop=1;
4001 GSM_PowerSource powersource=-1;
4002 GSM_RFUnits rf_units = GRF_Arbitrary;
4003 GSM_BatteryUnits batt_units = GBU_Arbitrary;
4005 GSM_NetworkInfo NetworkInfo;
4006 GSM_CBMessage CBMessage;
4008 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
4009 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
4010 GSM_MemoryStatus DC_MemoryStatus = {GMT_DC, 0, 0};
4011 GSM_MemoryStatus EN_MemoryStatus = {GMT_EN, 0, 0};
4012 GSM_MemoryStatus FD_MemoryStatus = {GMT_FD, 0, 0};
4013 GSM_MemoryStatus LD_MemoryStatus = {GMT_LD, 0, 0};
4014 GSM_MemoryStatus MC_MemoryStatus = {GMT_MC, 0, 0};
4015 GSM_MemoryStatus ON_MemoryStatus = {GMT_ON, 0, 0};
4016 GSM_MemoryStatus RC_MemoryStatus = {GMT_RC, 0, 0};
4018 GSM_SMSStatus SMSStatus = {0, 0};
4022 /* evaluate for presence of "-noloop" argument in parameter */
4025 if( strcmp(argv[0],"-noloop" ) && strcmp(argv[0],"-nl" ))
4034 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
4037 signal(SIGINT, interrupted);
4039 fprintf (stderr, _("Entering monitor mode...\n"));
4040 fprintf (stderr, _("Initialising GSM interface...\n"));
4042 /* Initialise the code for the GSM interface. */
4047 GSM->EnableCellBroadcast();
4049 /* Loop here indefinitely - allows you to see messages from GSM code in
4050 response to unknown messages etc. The loops ends after pressing the
4052 while (!bshutdown) {
4053 if (GSM->GetRFLevel(&rf_units, &rflevel) == GE_NONE)
4054 fprintf(stdout, _("RFLevel: %d\n"), (int)rflevel);
4056 if (GSM->GetBatteryLevel(&batt_units, &batterylevel) == GE_NONE)
4057 fprintf(stdout, _("Battery: %d\n"), (int)batterylevel);
4059 if (GSM->GetPowerSource(&powersource) == GE_NONE)
4060 fprintf(stdout, _("Power Source: %s\n"), (powersource==GPS_ACDC)?_("AC/DC"):_("battery"));
4062 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE)
4063 fprintf(stdout, _("SIM: Used %d, Free %d\n"), SIMMemoryStatus.Used, SIMMemoryStatus.Free);
4065 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE)
4066 fprintf(stdout, _("Phone: Used %d, Free %d\n"), PhoneMemoryStatus.Used, PhoneMemoryStatus.Free);
4068 if (GSM->GetMemoryStatus(&DC_MemoryStatus) == GE_NONE)
4069 fprintf(stdout, _("DC: Used %d, Free %d\n"), DC_MemoryStatus.Used, DC_MemoryStatus.Free);
4071 if (GSM->GetMemoryStatus(&EN_MemoryStatus) == GE_NONE)
4072 fprintf(stdout, _("EN: Used %d, Free %d\n"), EN_MemoryStatus.Used, EN_MemoryStatus.Free);
4074 if (GSM->GetMemoryStatus(&FD_MemoryStatus) == GE_NONE)
4075 fprintf(stdout, _("FD: Used %d, Free %d\n"), FD_MemoryStatus.Used, FD_MemoryStatus.Free);
4077 if (GSM->GetMemoryStatus(&LD_MemoryStatus) == GE_NONE)
4078 fprintf(stdout, _("LD: Used %d, Free %d\n"), LD_MemoryStatus.Used, LD_MemoryStatus.Free);
4080 if (GSM->GetMemoryStatus(&MC_MemoryStatus) == GE_NONE)
4081 fprintf(stdout, _("MC: Used %d, Free %d\n"), MC_MemoryStatus.Used, MC_MemoryStatus.Free);
4083 if (GSM->GetMemoryStatus(&ON_MemoryStatus) == GE_NONE)
4084 fprintf(stdout, _("ON: Used %d, Free %d\n"), ON_MemoryStatus.Used, ON_MemoryStatus.Free);
4086 if (GSM->GetMemoryStatus(&RC_MemoryStatus) == GE_NONE)
4087 fprintf(stdout, _("RC: Used %d, Free %d\n"), RC_MemoryStatus.Used, RC_MemoryStatus.Free);
4089 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE)
4090 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"), SMSStatus.UnRead, SMSStatus.Number);
4092 if (GSM->GetIncomingCallNr(Number) == GE_NONE)
4093 fprintf(stdout, _("Incoming call: %s\n"), Number);
4095 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE)
4096 fprintf(stdout, _("Network: %s (%s), LAC: %s, CellID: %s\n"), GSM_GetNetworkName (NetworkInfo.NetworkCode), GSM_GetCountryName(NetworkInfo.NetworkCode), NetworkInfo.LAC, NetworkInfo.CellID);
4098 if (GSM->ReadCellBroadcast(&CBMessage) == GE_NONE)
4099 fprintf(stdout, _("Cell broadcast received on channel %d: %s\n"), CBMessage.Channel, CBMessage.Message);
4106 if( loop ) fprintf (stderr, _("Leaving monitor mode...\n"));
4113 #endif /* UCLINUX */
4115 /* Emulation of separate gnokiid binary for uClinux */
4119 static int gnokiid(int argc, char *argv[])
4121 bool DebugMode; /* When true, run in debug mode */
4122 char *Model; /* Model from .gnokiirc file. */
4123 char *Port; /* Port from .gnokiirc file */
4124 char *Initlength; /* Init length from .gnokiirc file */
4125 char *Connection; /* Connection type from .gnokiirc file */
4126 char *BinDir; /* Directory of the mgnokiidev command */
4128 /* evaluate for presence of "--debug" argument in parameter */
4132 if( strcmp(argv[0],"--debug" ))
4142 fprintf (stderr, _("Entering gnokiid mode...\n"));
4145 if (CFG_ReadConfig(&Model, &Port, &Initlength, &Connection, &BinDir, true) < 0)
4148 if (VM_Initialise(Model, Port, Initlength, GCT_FBUS, BinDir, DebugMode, true, ""/*SynchronizeTime*/) == false)
4156 #endif /* UCLINUX */
4160 /* Shows texts from phone's display */
4169 error=GSM->EnableDisplayOutput();
4171 if (error == GE_NONE)
4174 /* We do not want to see texts forever - press Ctrl+C to stop. */
4176 signal(SIGINT, interrupted);
4178 fprintf (stderr, _("Entering display monitoring mode...\n"));
4180 /* Loop here indefinitely - allows you to read texts from phone's
4181 display. The loops ends after pressing the Ctrl+C. */
4186 fprintf (stderr, _("Leaving display monitor mode...\n"));
4188 error=GSM->DisableDisplayOutput();
4190 fprintf (stderr, _("Error!\n"));
4192 fprintf (stderr, _("Error!\n"));
4199 /* Displays names of available ringtones */
4202 char model[64], rev[64];
4207 while (GSM->GetRevision(rev) != GE_NONE)
4210 while (GSM->GetModel(model) != GE_NONE)
4213 strncpy(rev,rev+2,5);
4215 PrepareRingingTones(model,rev);
4217 for (i=1;i<=NumberOfRingtones();i++)
4219 fprintf(stdout,_("%i. %s\n"),i,RingingToneName(0,i));
4228 /* Reads profile from phone and displays its' settings */
4230 int getprofile(int argc, char *argv[])
4235 GSM_Profile profile;
4238 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4239 char model[64], rev[64];
4241 /* Initialise the code for the GSM interface. */
4246 error=GSM->GetProfile(&profile);
4248 if (error == GE_NONE)
4251 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4253 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4255 strncpy(rev,rev+2,5);
4257 PrepareRingingTones(model,rev);
4259 switch(GetModelFeature (FN_PROFILES)) {
4260 case F_PROF33:max_profiles=6;break;
4261 case F_PROF51:max_profiles=3;break;
4262 default :max_profiles=7;break;
4267 profile.Number=atoi(argv[0])-1;
4268 start=profile.Number;
4271 if (profile.Number < 0)
4273 fprintf(stderr, _("Profile number must be value from 1 to %d!\n"), max_profiles);
4278 if (profile.Number >= max_profiles)
4280 fprintf(stderr, _("This phone supports only %d profiles!\n"), max_profiles);
4294 if (profile.Number!=0) GSM->GetProfile(&profile);
4296 printf("%d. \"%s\"", (profile.Number+1), profile.Name);
4297 if (profile.DefaultName==-1) printf(" (name defined)");
4301 printf("Incoming call alert: %d\n", profile.CallAlert);
4302 printf("Ringtone ID: %d\n", profile.Ringtone);
4303 printf("Ringing volume: %d\n", profile.Volume);
4304 printf("Message alert tone: %d\n", profile.MessageTone);
4305 printf("Keypad tones: %d\n", profile.KeypadTone);
4306 printf("Warning and game tones: %d\n", profile.WarningTone);
4307 printf("Lights: %d\n", profile.Lights);
4308 printf("Vibration: %d\n", profile.Vibration);
4309 printf("Caller groups: 0x%02x\n", profile.CallerGroups);
4310 printf("Automatic answer: %d\n", profile.AutomaticAnswer);
4311 printf("Screen saver: %d\n", profile.ScreenSaver);
4315 printf("Incoming call alert: %s\n", GetProfileCallAlertString(profile.CallAlert));
4317 /* For different phones different ringtones names */
4318 if (strcmp(RingingToneName(profile.Ringtone,0),""))
4319 printf(_("Ringing tone: %s (number %d in phone menu)\n"),
4320 RingingToneName(profile.Ringtone,0), RingingToneMenu(profile.Ringtone));
4322 printf(_("Ringtone number: %d\n"), profile.Ringtone);
4324 printf(_("Ringing volume: %s\n"), GetProfileVolumeString(profile.Volume));
4326 printf(_("Message alert tone: %s\n"), GetProfileMessageToneString(profile.MessageTone));
4328 printf(_("Keypad tones: %s\n"), GetProfileKeypadToneString(profile.KeypadTone));
4330 printf(_("Warning and game tones: %s\n"), GetProfileWarningToneString(profile.WarningTone));
4332 if (GetModelFeature (FN_SCREENSAVER)!=0)
4333 printf(_("Screen saver: %s\n"), GetProfileOnOffString(profile.ScreenSaver));
4335 printf(_("Vibration: %s\n"), GetProfileVibrationString(profile.Vibration));
4337 /* It has been nice to add here reading caller group name. ;^) */
4338 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
4339 printf(_("Caller groups: %s\n"),
4340 GetProfileCallerGroups(profile.CallerGroups) );
4342 /* FIXME: need make investigation for 3310 for these features. For now unknown */
4343 if (GetModelFeature (FN_PROFILES)!=F_PROF33) {
4344 /* FIXME: Light settings is only used for Car */
4345 if (profile.Number==(max_profiles-2)) printf(_("Lights: %s\n"), profile.Lights ? _("On") : _("Automatic"));
4347 /* FIXME: Automatic answer is only used for Car and Headset. */
4348 if (profile.Number>=(max_profiles-2)) printf(_("Automatic answer: %s\n"), GetProfileOnOffString(profile.AutomaticAnswer));
4356 if (error == GE_NOTIMPLEMENTED) {
4357 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4362 fprintf(stderr, _("Unspecified error\n"));
4374 /* Sets profile feature */
4376 int setprofile(int argc, char *argv[])
4379 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4380 char model[64], rev[64];
4383 GSM_Profile profile;
4384 GSM_Profile profile2, profile3;
4389 /* Initialise the code for the GSM interface. */
4395 error = GSM->GetProfile(&profile);
4397 if (error == GE_NONE)
4400 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4402 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4404 strncpy(rev,rev+2,5);
4406 PrepareRingingTones(model,rev);
4408 switch(GetModelFeature (FN_PROFILES)) {
4409 case F_PROF33:max_profiles=6;break;
4410 case F_PROF51:max_profiles=3;break;
4411 default :max_profiles=7;break;
4414 profile.Number=atoi (argv[0]);
4415 profile.Number=profile.Number-1;
4417 if (profile.Number < 0)
4419 fprintf(stderr, _("Profile number must be value from 1 to %i!\n"), max_profiles);
4424 if (profile.Number >= max_profiles)
4426 fprintf(stderr, _("This phone supports only %i profiles!\n"), max_profiles);
4431 if (profile.Number!=0) GSM->GetProfile(&profile);
4436 if (strcmp(argv[1], "callalert")==0)
4438 if (strcmp(argv[2], "ringing")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGING;correct_arg2=true;}
4439 if (strcmp(argv[2], "ascending")==0) {profile.CallAlert=PROFILE_CALLALERT_ASCENDING;correct_arg2=true;}
4440 if (strcmp(argv[2], "ringonce")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGONCE;correct_arg2=true;}
4441 if (strcmp(argv[2], "beeponce")==0) {profile.CallAlert=PROFILE_CALLALERT_BEEPONCE;correct_arg2=true;}
4442 if (strcmp(argv[2], "groups")==0)
4444 profile.CallAlert=PROFILE_CALLALERT_CALLERGROUPS;
4446 /*Ignored by N5110*/
4447 /*FIX ME: it's ignored by N5130 and 3210 too*/
4448 if (max_profiles==3) fprintf(stdout, _("Warning: value \"groups\" for profile feature \"callalert\" will be ignored in this phone model !\n"));
4450 if (strcmp(argv[2], "off")==0 || strcmp(argv[2], "0")==0) {profile.CallAlert=PROFILE_CALLALERT_OFF;correct_arg2=true;}
4453 fprintf(stderr, _("Correct parameters for profile feature \"callalert\" are ringing|ascending|ringonce|beeponce|groups|off|0 !\n"));
4459 if (strcmp(argv[1], "volume")==0)
4461 if (strcmp(argv[2], "1")==0) {profile.Volume=PROFILE_VOLUME_LEVEL1;correct_arg2=true;}
4462 if (strcmp(argv[2], "2")==0) {profile.Volume=PROFILE_VOLUME_LEVEL2;correct_arg2=true;}
4463 if (strcmp(argv[2], "3")==0) {profile.Volume=PROFILE_VOLUME_LEVEL3;correct_arg2=true;}
4464 if (strcmp(argv[2], "4")==0) {profile.Volume=PROFILE_VOLUME_LEVEL4;correct_arg2=true;}
4465 if (strcmp(argv[2], "5")==0) {profile.Volume=PROFILE_VOLUME_LEVEL5;correct_arg2=true;}
4468 fprintf(stderr, _("Correct parameters for profile feature \"volume\" are 0|1|2|3|4|5 !\n"));
4474 if (strcmp(argv[1], "keypad")==0 || strcmp(argv[1], "keypadtone")==0)
4476 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.KeypadTone=PROFILE_KEYPAD_OFF;correct_arg2=true;}
4477 if (strcmp(argv[2], "1")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL1;correct_arg2=true;}
4478 if (strcmp(argv[2], "2")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL2;correct_arg2=true;}
4479 if (strcmp(argv[2], "3")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL3;correct_arg2=true;}
4482 fprintf(stderr, _("Correct parameters for profile feature \"keypad|keypadtone\" are off|0|1|2|3 !\n"));
4488 if (strcmp(argv[1], "messagetone")==0 || strcmp(argv[1], "smstone")==0 || strcmp(argv[1], "sms")==0 || strcmp(argv[1], "message")==0)
4490 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.MessageTone=PROFILE_MESSAGE_NOTONE;correct_arg2=true;}
4491 if (strcmp(argv[2], "standard")==0) {profile.MessageTone=PROFILE_MESSAGE_STANDARD;correct_arg2=true;}
4492 if (strcmp(argv[2], "special")==0) {profile.MessageTone=PROFILE_MESSAGE_SPECIAL;correct_arg2=true;}
4493 if (strcmp(argv[2], "beeponce")==0 || strcmp(argv[2], "once")==0) {profile.MessageTone=PROFILE_MESSAGE_BEEPONCE;correct_arg2=true;}
4494 if (strcmp(argv[2], "ascending")==0) {profile.MessageTone=PROFILE_MESSAGE_ASCENDING;correct_arg2=true;}
4497 fprintf(stderr, _("Correct parameters for profile feature \"messagetone|smstone|message|sms\" are 0|off|standard|special|beeponce|once|ascending !\n"));
4503 if (strcmp(argv[1], "warningtone")==0 || strcmp(argv[1], "warning")==0)
4505 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.WarningTone=PROFILE_WARNING_OFF;correct_arg2=true;}
4506 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.WarningTone=PROFILE_WARNING_ON;correct_arg2=true;}
4509 fprintf(stderr, _("Correct parameters for profile feature \"warningtone|warning\" are 0|off|1|on !\n"));
4515 if (strcmp(argv[1], "vibra")==0 || strcmp(argv[1], "vibration")==0)
4517 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Vibration=PROFILE_VIBRATION_OFF;correct_arg2=true;}
4518 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Vibration=PROFILE_VIBRATION_ON;correct_arg2=true;}
4521 fprintf(stderr, _("Correct parameters for profile feature \"vibration|vibra\" are 0|off|1|on !\n"));
4527 if (strcmp(argv[1], "lights")==0)
4529 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Lights=-1;correct_arg2=true;}
4530 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Lights=0;correct_arg2=true;}
4533 fprintf(stderr, _("Correct parameters for profile feature \"lights\" are 0|off|1|on !\n"));
4537 if (profile.Number!=(max_profiles-2))
4539 profile2.Number=max_profiles-2;
4540 if (GSM->GetProfile(&profile2)==GE_NONE)
4542 fprintf(stdout, _("Warning: \"Lights\" feature is ignored in this profile (only setting it for \"%s\" profile get some results) !\n"), profile2.Name);
4547 if (strcmp(argv[1], "answer")==0)
4549 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.AutomaticAnswer=-1;correct_arg2=true;}
4550 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.AutomaticAnswer=0;correct_arg2=true;}
4553 fprintf(stderr, _("Correct parameters for profile feature \"answer\" are 0|off|1|on !\n"));
4557 if (profile.Number<(max_profiles-2))
4559 profile2.Number=max_profiles-2;
4560 if (GSM->GetProfile(&profile2)==GE_NONE)
4562 profile3.Number=max_profiles-1;
4563 if (GSM->GetProfile(&profile3)==GE_NONE)
4565 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);
4571 if (strcmp(argv[1], "name")==0)
4573 strcpy(profile.Name,argv[2]);
4574 /*Ignored by N5110*/
4575 /*FIX ME: it's ignored by N5130 and 3210 too*/
4576 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change profile name !\n"));
4579 if (strcmp(argv[1], "ringtone")==0)
4581 profile.Ringtone=atoi(argv[2]);
4582 if (profile.Ringtone<1)
4584 /*With value 0 results are interesting in N5110, but can't be used for anything*/
4585 fprintf(stderr, _("Ringtone number must be higher than 0 !\n"));
4590 if (profile.Ringtone>NumberOfRingtones())
4592 fprintf(stderr, _("Ringtone number too high (max %i) !\n"),NumberOfRingtones());
4596 profile.Ringtone=RingingToneCode(profile.Ringtone);
4597 if (profile.Ringtone==0)
4599 fprintf(stderr, _("Warning: we don't know ringtones codes for this model ! Can you contact with gnokii authors to add it into source ?\n"));
4603 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"));
4607 if (strcmp(argv[1], "groups")==0)
4609 /*Ignored by N5110*/
4610 /*FIX ME: it's ignored by N5130 and 3210 too*/
4611 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change caller group name !\n"));
4612 profile.CallerGroups=atoi(argv[2]);
4618 fprintf(stderr, _("Correct profile feature names are callalert|volume|keypad|keypadtone|messagetone|smstone|message|sms|warningtone|warning|vibra|vibration|lights|answer|name|groups !\n"));
4623 GSM->SetProfile(&profile);
4626 if (error == GE_NOTIMPLEMENTED) {
4627 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4632 fprintf(stderr, _("Unspecified error\n"));
4644 #endif /* UCLINUX */
4646 /* Get requested range of memory storage entries and output to stdout in
4647 easy-to-parse format */
4649 static int getmemory(int argc, char *argv[])
4652 GSM_PhonebookEntry entry;
4657 char memory_type_string[20];
4660 int i_used = 0, n_used=0;
4662 char *output_opt = NULL;
4664 char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
4665 bool formatdone=false;
4668 /* group names init */
4669 for(i=0;i<5;i++) az_group_name[i][0]='\0';
4671 /* Handle command line args that set type, start and end locations. */
4672 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
4674 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
4678 GetMemoryTypeString(memory_type_string, &entry.MemoryType);
4680 if (argv[argc-1][0] == '-')
4681 output_opt = argv[--argc];
4683 /* Do generic initialisation routine */
4687 while ((error = GSM->GetModel(buf)) != GE_NONE && i++ < 15)
4692 start_entry = atoi (argv[1]);
4693 end_entry = argc > 2 ? atoi( argv[2]) : start_entry;
4695 GSM_MemoryStatus stats = {entry.MemoryType, 0, 0};
4699 if (GSM->GetMemoryStatus( &stats) != GE_NONE) {
4700 fprintf( stderr, _("Error reading memory status.\n"));
4704 n_used = stats.Used;
4705 end_entry = stats.Used + stats.Free;
4709 /* Now retrieve the requested entries. */
4711 for (count = start_entry;
4712 count <= end_entry && (!do_all || i_used < n_used);
4715 entry.Location=count;
4717 error=GSM->GetMemoryLocation(&entry);
4721 if (entry.SubEntriesCount || strcmp( entry.Number, ""))
4726 if (output_opt && !strcmp( output_opt,"-v30")) {
4727 semicolon_pipe_substitution( &entry, 0 );
4728 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,30));
4731 if (output_opt && !strcmp(output_opt,"-v21")) {
4732 semicolon_pipe_substitution( &entry, 0 );
4733 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,21));
4736 if (output_opt && !strcmp(output_opt,"-v")) {
4737 semicolon_pipe_substitution( &entry, 0 );
4738 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,10));
4741 #endif /* UCLINUX */
4742 if (output_opt && !strcmp(output_opt,"-short")) {
4743 semicolon_pipe_substitution( &entry, 0 );
4744 fprintf(stdout, "%s;%s;%s;%d;%d;", entry.Name, entry.Number, memory_type_string, entry.Location, entry.Group);
4745 for( i = 0; i < entry.SubEntriesCount; i++ )
4747 if( entry.SubEntries[i].EntryType == GSM_Date )
4748 fprintf(stdout,_("%u;%u;%u;%02u.%02u.%04u;%02u:%02u:%02u;"),
4749 entry.SubEntries[i].EntryType,
4750 entry.SubEntries[i].NumberType,
4751 entry.SubEntries[i].BlockNumber,
4752 entry.SubEntries[i].data.Date.Day,
4753 entry.SubEntries[i].data.Date.Month,
4754 entry.SubEntries[i].data.Date.Year,
4755 entry.SubEntries[i].data.Date.Hour,
4756 entry.SubEntries[i].data.Date.Minute,
4757 entry.SubEntries[i].data.Date.Second );
4759 fprintf(stdout,_("%u;%u;%u;%s;"),
4760 entry.SubEntries[i].EntryType,
4761 entry.SubEntries[i].NumberType,
4762 entry.SubEntries[i].BlockNumber,
4763 entry.SubEntries[i].data.Number );
4765 fprintf(stdout,_("\n"));
4771 fprintf(stdout, "Memory %s, location %d\n",memory_type_string, entry.Location);
4773 // check if some info in subentries
4774 for( i = 0; i < entry.SubEntriesCount; i++ )
4775 if( entry.SubEntries[i].EntryType != GSM_Date &&
4776 strcmp(entry.SubEntries[i].data.Number,"") )
4779 if (strcmp(entry.Number,"") || i < entry.SubEntriesCount) {
4780 if (strcmp(entry.Name,"")) fprintf(stdout,_(" Name: %s\n"),entry.Name);
4781 if (strcmp(entry.Number,"")) fprintf(stdout,_(" Number: %s\n"),entry.Number);
4782 bitmap.type=GSM_CallerLogo;
4783 bitmap.number=entry.Group;
4784 strcpy(z_gtype,"unknown");
4785 if (entry.Group==5) strcpy(z_gtype,"No group");
4786 if (entry.Group<5 && entry.Group>=0) {
4787 if (!strcmp(az_group_name[entry.Group],"")) {
4788 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
4789 if (GSM->GetBitmap(&bitmap)==GE_NONE)
4790 strcpy( az_group_name[entry.Group], bitmap.text );
4792 if ((!strcmp(az_group_name[entry.Group],""))) {
4793 switch(entry.Group) {
4794 case 0:strcpy(az_group_name[entry.Group],"Family");break;
4795 case 1:strcpy(az_group_name[entry.Group],"VIP");break;
4796 case 2:strcpy(az_group_name[entry.Group],"Friends");break;
4797 case 3:strcpy(az_group_name[entry.Group],"Colleagues");break;
4798 case 4:strcpy(az_group_name[entry.Group],"Other");break;
4803 strcpy(z_gtype,az_group_name[entry.Group]);
4805 fprintf(stdout,_(" Group: %d (%s)\n"),entry.Group+1,z_gtype);
4806 for( i = 0; i < entry.SubEntriesCount; i++ )
4808 if( entry.SubEntries[i].EntryType == GSM_Date ) {
4809 fprintf(stdout, " Date and time: %s %02u.%02u.%04u %02u:%02u:%02u\n",
4810 DayOfWeek(entry.SubEntries[i].data.Date.Year,
4811 entry.SubEntries[i].data.Date.Month,
4812 entry.SubEntries[i].data.Date.Day),
4813 entry.SubEntries[i].data.Date.Day,
4814 entry.SubEntries[i].data.Date.Month,
4815 entry.SubEntries[i].data.Date.Year,
4816 entry.SubEntries[i].data.Date.Hour,
4817 entry.SubEntries[i].data.Date.Minute,
4818 entry.SubEntries[i].data.Date.Second);
4821 if( strcmp(entry.SubEntries[i].data.Number,"") ) {
4823 switch( entry.SubEntries[i].EntryType ) {
4825 switch( entry.SubEntries[i].NumberType ) {
4826 case GSM_General: strcpy(z_etype,"General "); break;
4827 case GSM_Home: strcpy(z_etype,"Home "); break;
4828 case GSM_Mobile: strcpy(z_etype,"Mobile "); break;
4829 case GSM_Work: strcpy(z_etype,"Work "); break;
4830 case GSM_Fax: strcpy(z_etype,"Fax "); break;
4831 default: strcpy(z_etype,""); break;
4833 strcat(z_etype,"Number"); break;
4835 strcpy(z_etype,"Note"); break;
4837 strcpy(z_etype,"Postal"); break;
4839 strcpy(z_etype,"E-Mail"); break;
4841 strcpy(z_etype,"unknown data"); break;
4844 fprintf(stdout,_(" ---> Subentry: %u\n"),i+1);
4845 fprintf(stdout,_(" Entry type: %u (%s)\n"),entry.SubEntries[i].EntryType,z_etype);
4846 fprintf(stdout,_(" Number type: %u\n"),entry.SubEntries[i].NumberType);
4847 fprintf(stdout,_(" Block Number: %u\n"),entry.SubEntries[i].BlockNumber);
4849 fprintf(stdout,_(" %s: %s\n"),z_etype,entry.SubEntries[i].data.Number);
4853 if ((entry.MemoryType==GMT_DC ||
4854 entry.MemoryType==GMT_RC ||
4855 entry.MemoryType==GMT_MC) && !wasdate)
4856 fprintf(stdout,_(" Date and time not available\n"));
4858 fprintf(stdout,_(" Location empty\n"));
4861 case GE_NOTIMPLEMENTED:
4862 fprintf( stderr, _("Function not implemented in %s model!\n"), model);
4865 case GE_INVALIDMEMORYTYPE:
4866 fprintf( stderr, _("Memory type %s not supported!\n"),
4867 memory_type_string);
4871 fprintf(stdout, _("%s|%d|Bad location or other error!(%d)\n"),
4872 memory_type_string, count, error);
4881 /* Read data from stdin, parse and write to phone. The parsing is relatively
4882 crude and doesn't allow for much variation from the stipulated format. */
4884 static int writephonebook(int argc, char *args[])
4887 GSM_PhonebookEntry entry;
4889 char *memory_type_string;
4890 int line_count=0,current,i;
4893 char *Line, OLine[1024], BackLine[1024];
4896 /* Check argument */
4898 if (strcmp("-i", args[0])) {
4903 /* Initialise fbus code */
4909 /* Go through data from stdin. */
4911 while (GetLine(stdin, Line, sizeof(OLine))!=-1) {
4913 current=0;BackLine[current++]=Line[0];
4914 for (i=1;i<strlen(Line);i++) {
4915 if (Line[i-1]==';' && Line[i]==';') BackLine[current++]=' ';
4916 BackLine[current++]=Line[i];
4918 BackLine[current++]=0;
4920 strcpy(Line,BackLine);
4924 #if defined(__svr4__) || defined(__FreeBSD__)
4925 ptr=strtok(Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4928 ptr=strtok(NULL, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4930 ptr=strtok(NULL, ";");
4932 ptr=strsep(&Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4935 ptr=strsep(&Line, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4937 ptr=strsep(&Line, ";");
4941 fprintf(stderr, _("Format problem on line %d [%s] 1\n"), line_count, BackLine);
4946 if (!strncmp(ptr,"ME", 2))
4948 memory_type_string = "int";
4949 entry.MemoryType = GMT_ME;
4951 else if (!strncmp(ptr,"SM", 2))
4953 memory_type_string = "sim";
4954 entry.MemoryType = GMT_SM;
4958 fprintf(stderr, _("Format problem on line %d [%s] 2: %s\n"),
4959 line_count, BackLine,ptr);
4963 #if defined(__svr4__) || defined(__FreeBSD__)
4964 ptr=strtok(NULL, ";"); if (ptr) entry.Location=atoi(ptr);
4966 ptr=strtok(NULL, ";"); if (ptr) entry.Group=atoi(ptr);
4968 ptr=strsep(&Line, ";"); if (ptr) entry.Location=atoi(ptr);
4970 ptr=strsep(&Line, ";"); if (ptr) entry.Group=atoi(ptr);
4974 fprintf(stderr, _("Format problem on line %d [%s] 3\n"),
4975 line_count, BackLine);
4979 for( subentry = 0; ; subentry++ )
4981 #if defined(__svr4__) || defined(__FreeBSD__)
4982 ptr=strtok(NULL, ";");
4984 ptr=strsep(&Line, ";");
4986 if( ptr && *ptr != 0 )
4987 entry.SubEntries[subentry].EntryType=atoi(ptr);
4991 #if defined(__svr4__) || defined(__FreeBSD__)
4992 ptr=strtok(NULL, ";");
4994 ptr=strsep(&Line, ";");
4997 entry.SubEntries[subentry].NumberType=atoi(ptr);
4998 // Phone Numbers need to have a number type.
4999 if(!ptr && entry.SubEntries[subentry].EntryType == GSM_Number)
5001 fprintf(stderr, _("Missing phone number type on line %d"
5002 " entry %d [%s]\n"), line_count, subentry, BackLine);
5007 #if defined(__svr4__) || defined(__FreeBSD__)
5008 ptr=strtok(NULL, ";");
5010 ptr=strsep(&Line, ";");
5013 entry.SubEntries[subentry].BlockNumber=atoi(ptr);
5015 #if defined(__svr4__) || defined(__FreeBSD__)
5016 ptr=strtok(NULL, ";");
5018 ptr=strsep(&Line, ";");
5020 // 0x13 Date Type; it is only for Dailed Numbers, etc.
5021 // we don't store to this memories so it's an error to use it.
5022 if(!ptr || entry.SubEntries[subentry].EntryType == GSM_Date)
5024 fprintf(stderr, _("Is not a phone number on line %d entry %d [%s]\n"),
5025 line_count, subentry, BackLine);
5030 strcpy( entry.SubEntries[subentry].data.Number, ptr );
5033 entry.SubEntriesCount = subentry;
5036 /* This is to send other exports (like from 6110) to 7110 */
5037 if (!entry.SubEntriesCount) {
5038 entry.SubEntriesCount = 1;
5039 entry.SubEntries[subentry].EntryType = GSM_Number;
5040 entry.SubEntries[subentry].NumberType = GSM_General;
5041 entry.SubEntries[subentry].BlockNumber = 2;
5042 strcpy(entry.SubEntries[subentry].data.Number, entry.Number);
5048 GSM_PhonebookEntry tmp_entry;
5050 memcpy(&tmp_entry, &entry, sizeof(GSM_PhonebookEntry) );
5051 error = GSM->GetMemoryLocation(&tmp_entry);
5052 if (error == GE_NONE) {
5053 if (!tmp_entry.Empty) {
5056 FILE *input_flow; //for reading from console, even when input redir.
5058 input_flow = fopen(DEV_CONSOLE, "r");
5061 fprintf(stderr, _("Can't open \"%s\" for input !\n"),DEV_CONSOLE);
5065 fprintf(stderr, _("Location busy. "));
5066 while (confirm < 0) {
5067 fprintf(stderr, _("Overwrite? (yes/no) "));
5068 GetLine(input_flow, ans, 7);
5069 if (!strcmp(ans, "yes")) confirm = 1;
5070 else if (!strcmp(ans, "no")) confirm = 0;
5072 if (!confirm) continue;
5075 fprintf(stderr, _("Unknown error (%d)\n"), error);
5081 /* Do write and report success/failure. */
5082 semicolon_pipe_substitution( &entry, 1 );
5084 error = GSM->WritePhonebookLocation(&entry);
5086 if (error == GE_NONE)
5087 fprintf (stdout, _("Write Succeeded: memory type: %s, loc: %d, name: %s, number: %s\n"), memory_type_string, entry.Location, entry.Name, entry.Number);
5089 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);
5098 /* Getting speed dials. */
5100 static int getspeeddial(char *Number) {
5102 GSM_SpeedDial entry;
5104 GSM_PhonebookEntry pbentry;
5106 entry.Number = atoi(Number);
5110 if (GSM->GetSpeedDial(&entry)==GE_NONE) {
5111 pbentry.Location=entry.Location;
5112 if (pbentry.Location==0) pbentry.Location=entry.Number;
5113 pbentry.MemoryType=entry.MemoryType;
5115 error=GSM->GetMemoryLocation(&pbentry);
5117 if (error == GE_NONE)
5119 fprintf(stdout, _("SpeedDial nr. %d: %d:%d (%s)\n"), entry.Number, entry.MemoryType, entry.Location,pbentry.Name);
5121 fprintf(stdout, _("Error\n"));
5123 fprintf(stdout, _("Error\n"));
5131 /* Setting speed dials. */
5133 static int setspeeddial(char *argv[]) {
5135 GSM_SpeedDial entry;
5137 char *memory_type_string;
5139 /* Handle command line args that set type, start and end locations. */
5141 if (strcmp(argv[1], "ME") == 0) {
5142 entry.MemoryType = GMT_ME;
5143 memory_type_string = "ME";
5145 else if (strcmp(argv[1], "SM") == 0) {
5146 entry.MemoryType = GMT_SM;
5147 memory_type_string = "SM";
5150 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
5155 entry.Number = atoi(argv[0]);
5156 entry.Location = atoi(argv[2]);
5160 if (GSM->SetSpeedDial(&entry) == GE_NONE) {
5161 fprintf(stdout, _("Succesfully written!\n"));
5171 /* Getting the status of the display. */
5173 int getdisplaystatus()
5178 /* Initialise the code for the GSM interface. */
5182 if (GSM->GetDisplayStatus(&Status)==GE_NONE) {
5184 printf(_("Call in progress: %s\n"), Status & (1<<DS_Call_In_Progress)?_("on"):_("off"));
5185 printf(_("Unknown: %s\n"), Status & (1<<DS_Unknown)?_("on"):_("off"));
5186 printf(_("Unread SMS: %s\n"), Status & (1<<DS_Unread_SMS)?_("on"):_("off"));
5187 printf(_("Voice call: %s\n"), Status & (1<<DS_Voice_Call)?_("on"):_("off"));
5188 printf(_("Fax call active: %s\n"), Status & (1<<DS_Fax_Call)?_("on"):_("off"));
5189 printf(_("Data call active: %s\n"), Status & (1<<DS_Data_Call)?_("on"):_("off"));
5190 printf(_("Keyboard lock: %s\n"), Status & (1<<DS_Keyboard_Lock)?_("on"):_("off"));
5191 printf(_("SMS storage full: %s\n"), Status & (1<<DS_SMS_Storage_Full)?_("on"):_("off"));
5194 printf(_("Error\n"));
5202 int netmonitor(char *Mode)
5205 unsigned char mode=atoi(Mode);
5206 char Screen[NM_MAX_SCREEN_WIDTH];
5211 if (!strcmp(Mode,"reset")) mode=0xf0;
5212 else if (!strcmp(Mode,"off")) mode=0xf1;
5213 else if (!strcmp(Mode,"field"))mode=0xf2;
5214 else if (!strcmp(Mode,"devel"))mode=0xf3;
5215 else if (!strcmp(Mode,"next")) mode=0x00;
5218 for (i=0;i<NM_MAX_SCREEN_WIDTH;i++) Screen[i]=0;
5220 GSM->NetMonitor(mode, Screen);
5223 printf("%s\n", Screen);
5230 #endif /* UCLINUX */
5232 static int identify( void )
5234 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
5235 char imei[64], model[64], rev[64], manufacturer[64];
5241 while (GSM->GetIMEI(imei) != GE_NONE) sleep(1);
5243 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
5245 while (GSM->GetModel(model) != GE_NONE) sleep(1);
5248 strcpy(manufacturer, "(unknown)");
5250 GSM->GetManufacturer(manufacturer);
5253 fprintf(stdout, _("IMEI: %s\n"), imei);
5254 fprintf(stdout, _("Model: %s %s (%s)\n"), manufacturer, GetModelName (model), model);
5255 fprintf(stdout, _("Revision: %s\n"), rev);
5266 int senddtmf(char *String)
5271 if (GSM->SendDTMF(String)!=GE_NONE) fprintf(stdout,_("Error!\n"));
5278 #endif /* UCLINUX */
5280 /* Resets the phone */
5281 static int reset(int argc, char *argv[])
5284 unsigned char _type=0x03;
5289 if (!strcmp(argv[0],"soft")) _type = 0x03;
5291 /* Doesn't work with 5110 */
5292 if (!strcmp(argv[0],"hard")) _type = 0x04;
5295 fprintf(stderr, _("What kind of reset do you want (second parameter can be \"soft\" or \"hard\") ?\n"));
5311 /* This is a "convenience" function to allow quick test of new API stuff which
5312 doesn't warrant a "proper" command line function. */
5314 int foogle(char *argv[])
5316 /* Initialise the code for the GSM interface. */
5320 // Fill in what you would like to test here...
5331 /* Initialise the code for the GSM interface. */
5335 if (GSM->PhoneTests()!=GE_NONE) fprintf(stderr,_("Error\n"));
5342 /* pmon allows fbus code to run in a passive state - it doesn't worry about
5343 whether comms are established with the phone. A debugging/development
5350 GSM_ConnectionType connection=GCT_FBUS;
5352 /* Initialise the code for the GSM interface. */
5354 error = GSM_Initialise(model, Port, Initlength, connection, RLP_DisplayF96Frame, ""/*SynchronizeTime*/);
5356 if (error != GE_NONE) {
5357 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
5369 int setringtone(int argc, char *argv[])
5371 GSM_Ringtone ringtone;
5372 GSM_BinRingtone binringtone,binringtone2;
5376 int current=0; //number of packed notes or location
5381 /* If not binary ringtone */
5382 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone2)!=GE_NONE) {
5383 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5385 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5387 ringtone.location=1;
5388 if (argc>1) ringtone.location=atoi(argv[1]);
5390 ringtone.allnotesscale=false;
5392 /* Initialise the GSM interface. */
5395 while (GSM->GetModel(model) != GE_NONE)
5398 /* For Nokia 6110/6130/6150/6210 we use different method of uploading.
5399 Phone will display menu, when received it */
5400 if ( !strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") ||
5401 !strcmp(model,"NSM-1") || !strcmp(model,"NPE-3") ) {
5402 if (argc==1) ringtone.location=255;
5405 error=GSM->SetRingtone(&ringtone,¤t);
5407 if (current!=ringtone.NrNotes) {
5408 if (current>FB61_MAX_RINGTONE_NOTES) {
5409 fprintf(stderr,_("Warning: due to phone limitation"));
5411 fprintf(stderr,_("Warning: ringtone was too long to be saved into frame,"));
5413 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5417 fprintf(stdout, _("Set succeeded!\n"));
5419 fprintf(stdout, _("Setting failed\n"));
5421 } else { /* This IS binary ringtone */
5422 fprintf(stdout,_("Binary ringtone format\n"));
5425 binringtone.frame[current++]=0x00;
5426 binringtone.frame[current++]=0x00;
5427 binringtone.frame[current++]=0x0c;
5428 binringtone.frame[current++]=0x01;
5429 binringtone.frame[current++]=0x2c;
5432 memcpy(binringtone.frame+current,argv[2],strlen(argv[2]));
5433 current=current+strlen(argv[2]);
5437 while(binringtone2.frame[i]!=0x00) {
5438 if (i==binringtone.length) break;
5443 memcpy(binringtone.frame+current,binringtone2.frame+i,binringtone2.length-i);
5444 binringtone.length=binringtone2.length-i+current;
5447 memcpy(binringtone.frame+current,binringtone2.frame,binringtone2.length);
5448 binringtone.length=binringtone2.length;
5451 binringtone.location=1;
5452 if (argc>1) binringtone.location=atoi(argv[1]);
5454 /* Initialise the GSM interface. */
5457 error=GSM->SetBinRingtone(&binringtone);
5461 fprintf(stdout, _("Set succeeded!\n"));
5463 case GE_INVALIDRINGLOCATION:
5464 fprintf(stdout, _("Invalid location %i!\n"),binringtone.location);
5466 case GE_UNKNOWNMODEL:
5467 fprintf(stdout, _("Mygnokii doesn't know format for this model!\n"));
5469 case GE_NOTIMPLEMENTED:
5470 fprintf(stdout, _("Not implemented for this model!\n"));
5473 fprintf(stdout, _("Not supported by this model!\n"));
5483 int ringtoneconvert(int argc, char *argv[])
5485 GSM_Ringtone ringtone;
5487 if (!strcmp(argv[0],argv[1]))
5489 fprintf(stderr, _("Files can't have the same names !\n"));
5493 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5495 ringtone.allnotesscale=false;
5497 GSM_SaveRingtoneFileOnConsole(argv[1], &ringtone);
5502 int playringtone(int argc, char *argv[])
5504 GSM_Ringtone ringtone;
5506 GSM_BinRingtone binringtone;
5512 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
5513 int binary_notes[12] =
5514 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
5516 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone)!=GE_NONE) {
5517 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5519 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5521 /* Initialise the GSM interface. */
5524 fprintf(stdout,_("Playing \"%s\" (%i notes)\n"),ringtone.name,ringtone.NrNotes);
5526 GSM_PlayRingtoneOnConsole(&ringtone);
5530 fprintf(stdout,_("Binary ringtone format\n"));
5532 /* Initialise the GSM interface. */
5536 while (true) { //skipping name
5537 if (binringtone.frame[i]==0) break;
5543 if (binringtone.frame[i]!=j) {
5546 fprintf(stdout,_("Block in binary ringtone %i %i\n"),j,z);
5553 if (!isok && j>=114 && j<=125) {
5554 j=14*3+binary_notes[j-114];
5557 if (!isok && j>=126 && j<=137) {
5558 j=14*1+binary_notes[j-126];
5561 if (!isok && j>=138 && j<=149) {
5562 j=14*2+binary_notes[j-138];
5565 if (!isok && j>=150 && j<=161) {
5566 j=14*4+binary_notes[j-150];
5571 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
5574 Hz=GSM_GetFrequency(j);
5575 if (GSM->PlayTone(Hz,5)!=GE_NONE) fprintf(stdout,_("error during playing\n"));
5579 j=binringtone.frame[i];
5580 z=binringtone.frame[i+1];
5582 z=z+binringtone.frame[i+1];
5585 if (i>=binringtone.length) break;
5596 int composer(int argc, char *argv[])
5598 GSM_Ringtone ringtone;
5601 int oldnoteslen=4,nownoteslen,oldnoteslen2;
5602 int oldnotesscale=1,nownotesscale;
5603 bool firstnote=true;
5604 int DefNoteTempo=63;
5606 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5608 if (ringtone.NrNotes!=0)
5609 DefNoteTempo=ringtone.notes[0].tempo;
5611 fprintf(stdout,_("Ringtone \"%s\" (tempo = %i Beats Per Minute)\n\n"),ringtone.name,GSM_GetTempo(DefNoteTempo));
5613 for (i=0;i<ringtone.NrNotes;i++) {
5614 if (DefNoteTempo!=ringtone.notes[i].tempo) {
5615 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"));
5620 for (i=0;i<ringtone.NrNotes;i++) {
5623 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5633 if ((ringtone.NrNotes-i)>50)
5634 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);
5636 fprintf(stdout,_("This ringtone in Nokia Composer in phone should look: "));
5640 for (i=0;i<ringtone.NrNotes;i++) {
5643 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5649 switch (ringtone.notes[i].duration) {
5650 case 192:fprintf(stdout,_("1."));break; //192=128*1.5
5651 case 128:fprintf(stdout,_("1"));break;
5652 case 96 :fprintf(stdout,_("2."));break; //96=64*1.5
5653 case 64 :fprintf(stdout,_("2"));break;
5654 case 48 :fprintf(stdout,_("4."));break; //48=32*1.5
5655 case 32 :fprintf(stdout,_("4"));break;
5656 case 24 :fprintf(stdout,_("8."));break; //24=16*1.5
5657 case 16 :fprintf(stdout,_("8"));break;
5658 case 12 :fprintf(stdout,_("16."));break; //12=8*1.5
5659 case 8 :fprintf(stdout,_("16"));break;
5660 case 6 :fprintf(stdout,_("32."));break; //6=4*1.5
5661 case 4 :fprintf(stdout,_("32"));break;
5666 /* What note here ? */
5667 switch (GSM_GetNote(ringtone.notes[i].note)) {
5668 case Note_C :fprintf(stdout,_("c"));break;
5669 case Note_Cis:fprintf(stdout,_("#c"));break;
5670 case Note_D :fprintf(stdout,_("d"));break;
5671 case Note_Dis:fprintf(stdout,_("#d"));break;
5672 case Note_E :fprintf(stdout,_("e"));break;
5673 case Note_F :fprintf(stdout,_("f"));break;
5674 case Note_Fis:fprintf(stdout,_("#f"));break;
5675 case Note_G :fprintf(stdout,_("g"));break;
5676 case Note_Gis:fprintf(stdout,_("#g"));break;
5677 case Note_A :fprintf(stdout,_("a"));break;
5678 case Note_Ais:fprintf(stdout,_("#a"));break;
5679 case Note_H :fprintf(stdout,_("h"));break;
5680 default :fprintf(stdout,_("-"));unknown=true;break; //Pause ?
5684 fprintf(stdout,_("%i"),ringtone.notes[i].note/14);
5686 /* And separator before next note */
5687 if (i!=ringtone.NrNotes-1)
5688 fprintf(stdout,_(" "));
5694 fprintf(stdout,_("\n\nTo enter it please press: "));
5698 for (i=0;i<ringtone.NrNotes;i++) {
5701 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5709 /* What note here ? */
5710 switch (GSM_GetNote(ringtone.notes[i].note)) {
5711 case Note_C :fprintf(stdout,_("1"));break;
5712 case Note_Cis:fprintf(stdout,_("1"));break;
5713 case Note_D :fprintf(stdout,_("2"));break;
5714 case Note_Dis:fprintf(stdout,_("2"));break;
5715 case Note_E :fprintf(stdout,_("3"));break;
5716 case Note_F :fprintf(stdout,_("4"));break;
5717 case Note_Fis:fprintf(stdout,_("4"));break;
5718 case Note_G :fprintf(stdout,_("5"));break;
5719 case Note_Gis:fprintf(stdout,_("5"));break;
5720 case Note_A :fprintf(stdout,_("6"));break;
5721 case Note_Ais:fprintf(stdout,_("6"));break;
5722 case Note_H :fprintf(stdout,_("7"));break;
5723 default :fprintf(stdout,_("0"));unknown=true;break;
5726 switch (ringtone.notes[i].duration) {
5727 case 192:fprintf(stdout,_("(longer)"));break; //192=128*1.5
5728 case 96 :fprintf(stdout,_("(longer)"));break; //96=64*1.5
5729 case 48 :fprintf(stdout,_("(longer)"));break; //48=32*1.5
5730 case 24 :fprintf(stdout,_("(longer)"));break; //24=16*1.5
5731 case 12 :fprintf(stdout,_("(longer)"));break; //12=8*1.5
5732 case 6 :fprintf(stdout,_("(longer)"));break; //6=4*1.5
5736 /* What note here ? */
5737 switch (GSM_GetNote(ringtone.notes[i].note)) {
5738 case Note_Cis:fprintf(stdout,_("#"));break;
5739 case Note_Dis:fprintf(stdout,_("#"));break;
5740 case Note_Fis:fprintf(stdout,_("#"));break;
5741 case Note_Gis:fprintf(stdout,_("#"));break;
5742 case Note_Ais:fprintf(stdout,_("#"));break;
5748 nownotesscale=ringtone.notes[i].note/14;
5750 if (nownotesscale!=oldnotesscale) {
5751 switch (nownotesscale) {
5753 switch (oldnotesscale) {
5754 case 2:fprintf(stdout,_("**"));break;
5755 case 3:fprintf(stdout,_("*"));break;
5759 switch (oldnotesscale) {
5760 case 1:fprintf(stdout,_("*"));break;
5761 case 3:fprintf(stdout,_("**"));break;
5765 switch (oldnotesscale) {
5766 case 1:fprintf(stdout,_("**"));break;
5767 case 2:fprintf(stdout,_("*"));break;
5773 oldnotesscale=nownotesscale;
5777 oldnoteslen2=oldnoteslen;
5779 switch (ringtone.notes[i].duration) {
5780 case 192:nownoteslen=1;break; //192=128*1.5
5781 case 128:nownoteslen=1;break;
5782 case 96 :nownoteslen=2;break; //96=64*1.5
5783 case 64 :nownoteslen=2;break;
5784 case 48 :nownoteslen=4;break; //48=32*1.5
5785 case 32 :nownoteslen=4;break;
5786 case 24 :nownoteslen=8;break; //24=16*1.5
5787 case 16 :nownoteslen=8;break;
5788 case 12 :nownoteslen=16;break; //12=8*1.5
5789 case 8 :nownoteslen=16;break;
5790 case 6 :nownoteslen=32;break; //6=4*1.5
5791 case 4 :nownoteslen=32;break;
5794 if (nownoteslen>oldnoteslen) {
5795 while (oldnoteslen!=nownoteslen) {
5796 fprintf(stdout,_("8"));
5797 oldnoteslen=oldnoteslen*2;
5801 if (nownoteslen<oldnoteslen) {
5802 while (oldnoteslen!=nownoteslen) {
5803 fprintf(stdout,_("9"));
5804 oldnoteslen=oldnoteslen/2;
5808 if (GSM_GetNote(ringtone.notes[i].note)==Note_Pause)
5809 oldnoteslen=oldnoteslen2;
5811 /* And separator before next note */
5812 if (i!=ringtone.NrNotes-1)
5813 fprintf(stdout,_(" "));
5818 fprintf(stdout,_("\n"));
5824 int sendringtone(int argc, char *argv[])
5826 GSM_Ringtone ringtone;
5827 GSM_MultiSMSMessage SMS;
5829 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5831 if (GSM_ReadRingtoneFileOnConsole(argv[1], &ringtone)!=GE_NONE) return(-1);
5833 ringtone.allnotesscale=false;
5835 for (i=0;i<argc;i++) {
5836 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5837 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5840 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5842 if (current!=ringtone.NrNotes) {
5843 if (current>FB61_MAX_RINGTONE_NOTES) {
5844 fprintf(stderr,_("Warning: due to phone limitation"));
5846 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5848 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5851 for (i=0;i<SMS.number;i++) {
5852 strcpy(SMS.SMS[i].Destination,argv[0]);
5855 /* Initialise the GSM interface. */
5858 GSM_SendMultiPartSMSOnConsole(&SMS, 2,argc,argv,false,true,true);
5863 int saveringtone(int argc, char *argv[])
5865 GSM_Ringtone ringtone;
5866 GSM_MultiSMSMessage SMS;
5868 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5870 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5872 ringtone.allnotesscale=false;
5874 for (i=0;i<argc;i++) {
5875 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5876 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5879 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5881 if (current!=ringtone.NrNotes) {
5882 if (current>FB61_MAX_RINGTONE_NOTES) {
5883 fprintf(stderr,_("Warning: due to phone limitation"));
5885 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5887 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5890 for (i=0;i<SMS.number;i++) {
5891 /* Only 11 chars could be here */
5892 strncpy(SMS.SMS[i].Destination,ringtone.name,11);
5895 /* Initialise the GSM interface. */
5898 GSM_SaveMultiPartSMSOnConsole(&SMS,1,argc,argv,false,false,true,true);
5903 /* Converts logo files. */
5905 int bitmapconvert(int argc, char *argv[])
5908 GSM_NetworkInfo NetworkInfo;
5912 if (!strcmp(argv[0],argv[1]))
5914 fprintf(stderr, _("Files can't have the same names !\n"));
5918 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
5923 if (!strcmp(argv[2],"op"))
5926 if (argc<4) doit=true;
5927 if (argc<4 && bitmap.type!=GSM_OperatorLogo) doit=true;
5931 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5934 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
5937 strncpy(bitmap.netcode,argv[3],7);
5938 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5940 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5946 if (!strcmp(argv[2],"7110op"))
5949 if (argc<4) doit=true;
5950 if (argc<4 && bitmap.type!=GSM_7110OperatorLogo) doit=true;
5954 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5957 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
5960 strncpy(bitmap.netcode,argv[3],7);
5961 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5963 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5969 if (!strcmp(argv[2],"caller"))
5971 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
5975 if ((num<0)||(num>9)) num=0;
5983 if (!strcmp(argv[2],"startup"))
5985 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
5988 if (!strcmp(argv[2],"7110startup"))
5990 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
5993 if (!strcmp(argv[2],"6210startup"))
5995 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
5998 if (!strcmp(argv[2],"picture"))
6000 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
6005 fprintf(stderr,"Unknown type of logo: %s !\n",argv[2]);
6010 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
6015 int getphoneprofile()
6020 /* Initialise the GSM interface. */
6024 error=GSM->GetProductProfileSetting(&PPS);
6025 if (error!=GE_NONE) {
6026 fprintf(stdout,_("Error!\n"));
6030 fprintf(stdout,_("ALS : "));
6031 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6032 else fprintf(stdout,_("off\n"));
6034 PPS.Name=PPS_VibraMenu;
6035 GSM->GetProductProfileSetting(&PPS);
6036 fprintf(stdout,_("Vibra menu : "));
6037 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6038 else fprintf(stdout,_("off\n"));
6040 PPS.Name=PPS_GamesMenu;
6041 GSM->GetProductProfileSetting(&PPS);
6042 fprintf(stdout,_("Games menu : "));
6043 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6044 else fprintf(stdout,_("off\n"));
6046 PPS.Name=PPS_HRData;
6047 GSM->GetProductProfileSetting(&PPS);
6048 fprintf(stdout,_("HR Data : "));
6049 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6050 else fprintf(stdout,_("off\n"));
6052 PPS.Name=PPS_14400Data;
6053 GSM->GetProductProfileSetting(&PPS);
6054 fprintf(stdout,_("14400 Data : "));
6055 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6056 else fprintf(stdout,_("off\n"));
6058 PPS.Name=PPS_LCDContrast;
6059 GSM->GetProductProfileSetting(&PPS);
6060 fprintf(stdout,_("LCD Contrast : %i%%\n"),PPS.int_value);
6063 GSM->GetProductProfileSetting(&PPS);
6064 fprintf(stdout,_("EFR : "));
6065 switch (PPS.int_value) {
6066 case 0: fprintf(stdout,_("off\n")); break;
6067 case 1: fprintf(stdout,_("last\n")); break;
6068 case 2: fprintf(stdout,_("second\n"));break;
6069 case 3: fprintf(stdout,_("first\n")); break;
6073 GSM->GetProductProfileSetting(&PPS);
6074 fprintf(stdout,_("FR : "));
6075 switch (PPS.int_value) {
6076 case 0: fprintf(stdout,_("off\n")); break;
6077 case 1: fprintf(stdout,_("last\n")); break;
6078 case 2: fprintf(stdout,_("second\n"));break;
6079 case 3: fprintf(stdout,_("first\n")); break;
6083 GSM->GetProductProfileSetting(&PPS);
6084 fprintf(stdout,_("HR : "));
6085 switch (PPS.int_value) {
6086 case 0: fprintf(stdout,_("off\n")); break;
6087 case 1: fprintf(stdout,_("last\n")); break;
6088 case 2: fprintf(stdout,_("second\n"));break;
6089 case 3: fprintf(stdout,_("first\n")); break;
6098 int setphoneprofile(int argc, char *argv[])
6102 bool correct_arg1=false, correct_arg2=false;
6104 if (!strcmp(argv[0],"ALS")) {
6107 if (!strcmp(argv[1],"1")) {
6108 PPS.bool_value=true;
6111 if (!strcmp(argv[1],"0")) {
6112 PPS.bool_value=false;
6115 if (!correct_arg2) {
6116 fprintf(stdout,_("Settings for ALS parameter can be \"0\" or \"1\" !\n"));
6120 if (!strcmp(argv[0],"HRData")) {
6121 PPS.Name=PPS_HRData;
6123 if (!strcmp(argv[1],"1")) {
6124 PPS.bool_value=true;
6127 if (!strcmp(argv[1],"0")) {
6128 PPS.bool_value=false;
6131 if (!correct_arg2) {
6132 fprintf(stdout,_("Settings for HRData parameter can be \"0\" or \"1\" !\n"));
6136 if (!correct_arg1) {
6137 fprintf(stdout,_("First parameter can be \"ALS\" or \"HRData\" only !\n"));
6141 /* Initialise the GSM interface. */
6144 error=GSM->SetProductProfileSetting(&PPS);
6146 if (error!=GE_NONE) {
6147 fprintf(stdout,_("Error!\n"));
6160 int getoperatorname()
6163 GSM_Network network;
6165 /* Initialise the GSM interface. */
6168 if (GSM->GetOperatorName(&network)==GE_NONE)
6170 if (!strcmp(network.Name,"")) {
6171 fprintf(stdout,_("Phone doesn't have downloaded operator name\n"));
6173 fprintf(stdout,_("Phone has downloaded operator name (\"%s\") for \"%s\" (\"%s\") network\n"),
6174 network.Name,network.Code,GSM_GetNetworkName(network.Code));
6184 int setoperatorname(int argc, char *argv[])
6187 GSM_Network network;
6189 /* Initialise the GSM interface. */
6193 strncpy(network.Code,argv[0],7);
6194 strncpy(network.Name,argv[1],50);
6196 strcpy(network.Code,"000 00\0");
6197 strcpy(network.Name,"\0");
6200 if (GSM->SetOperatorName(&network)==GE_NONE) {
6201 if (GSM->GetOperatorName(&network)==GE_NONE) {
6202 if (!strcmp(network.Name,"")) {
6203 fprintf(stdout,_("Downloaded operator name is removed\n"));
6205 fprintf(stdout,_("Downloaded operator name changed for \"%s\" network (\"%s\") to \"%s\"\n"),
6206 network.Code,GSM_GetNetworkName(network.Code),network.Name);
6217 int getvoicemailbox()
6219 GSM_PhonebookEntry entry;
6221 /* Initialise the GSM interface. */
6224 if (GSM->GetVoiceMailbox(&entry)==GE_NONE) {
6225 fprintf(stdout,_("Voice mailbox number is "));
6226 if (!strcmp(entry.Number,""))
6227 fprintf(stdout,_("not set\n"));
6229 fprintf(stdout,_("\"%s\"\n"),entry.Number);
6238 ///////////////////////////////////////////////////////////////////////////////
6239 // flow diagram of netmonitordata():
6240 ///////////////////////////////////////////////////////////////////////////////
6242 // get command line argument
6246 // if specific phone model
6249 // identify-phone: (((((((( TO DO )))))))))))))
6253 // get_mon_param_info() get phone netmonitor parameters name
6254 // specifically to a 'model'
6257 // parse_check() check command line arguments
6258 // | if all OK, go on else stop.
6259 // | because we can have a input file
6260 // v containing multiple
6261 // parse_process() command lines, we process each at once
6262 // so we can exit early on errors.
6264 ///////////////////////////////////////////////////////////////////////////////
6266 // private functions, see netmonitordata()
6267 void free_nm_info(PARAM_INFO_MON *info)
6269 PARAM_INFO_MON *tmp; // pointer, iterator on info
6271 // go to end of list
6273 while (info->next != NULL)
6283 ///////////////////////////////////////////////////////////////////////////////
6284 // this func retrieve parameters info from a file
6285 // and load it in a dynamic array, NULL terminated,
6286 // if 2rd parameter is not NULL, it load also description of screen
6287 // return (PARAM_INFO_MON *start) if all is OK, else NULL
6288 ///////////////////////////////////////////////////////////////////////////////
6289 // start->->next->next->next-> ...->next->NULL
6292 // par0 par1 par2 parN
6293 ///////////////////////////////////////////////////////////////////////////////
6294 // this should be de-allocated from calling function,
6295 // also, screen_name should be deallocated from calling function
6296 ///////////////////////////////////////////////////////////////////////////////
6298 PARAM_INFO_MON *get_mon_param_info(char *f_name, char *screen_name[NM_MAX_SCREEN+1])
6300 PARAM_INFO_MON *start; // pointer to netmonitor parameters info
6301 PARAM_INFO_MON *info; // pointer, iterator on info
6302 PARAM_INFO_MON *check; // pointer, iterator on info, for check usage
6311 char tmp_mname[55]; // very larger, but if netmon bug ...
6312 int x, y, len, s, t; // x & y coord, len, screen nr, type
6315 if (screen_name != NULL)
6316 for (i = 0; i <= NM_MAX_SCREEN; i++)
6317 screen_name[i] = NULL;
6320 if ((f_info = fopen(f_name, "r")) == NULL)
6321 { fprintf(stderr, "Can' t open file parameter info: <%s>\n", f_name);
6325 if ((start = malloc(sizeof(PARAM_INFO_MON))) == NULL)
6326 { fprintf(stderr, "no mem\n");
6330 { start->next = NULL;
6334 while (fgets(buf, 256, f_info) != NULL)
6338 // Truncate from '#' at right of comments
6339 if ((tmp = strchr(param, '#')) != NULL)
6342 // Strip leading, trailing whitespace
6343 while(isspace((int) *param))
6346 while((strlen(param) > 0) && isspace((int) param[strlen(param) - 1]))
6347 param[strlen(param) - 1] = '\0';
6349 // Ignore blank lines
6350 if ((*param == '\n') || (*param == '\0'))
6355 fprintf(stderr, "%s: info line: <%s>\n", f_name, param);
6357 // check for param name
6358 if ((param_name = strtok(param, "=\t\n")) == NULL)
6361 // check if screen name
6362 if (strncmp("SCREEN", param_name, 6) == 0)
6364 // if we do not want screen names ...
6365 if (screen_name == NULL)
6368 // FIXME check for screen nr
6369 if ((tmp = strtok(NULL, ":\n")) == NULL)
6373 // FIXME: check if already defined screen
6375 if ((i <= 0) || (i > NM_MAX_SCREEN))
6377 // check for screen name
6378 if ((tmp = strtok(NULL, ":\n")) == NULL)
6381 screen_name[i] = strdup(tmp);
6387 // FIXME: check for NM_MAX_FIELDS
6389 // check for x coord
6390 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6394 // check for y coord
6395 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6400 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6405 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6409 // check for netmon manual name
6410 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6412 "%s: PARAMETER <%s> in screen <%d>, not have netmon manual reference\n",
6413 f_name, param_name, s);
6414 free_nm_info(start);
6417 strcpy(tmp_mname, tmp);
6419 // check for data type (optional)
6420 if ((tmp = strtok(NULL, ":\t\n")) != NULL)
6425 // check len, here, so we print parameter name
6428 "%s: PARAMETER <%s> in screen <%d>, has invalid data lenght\n",
6429 f_name, param_name, s);
6430 free_nm_info(start);
6434 // check if already defined same param_name
6436 while (check->next != NULL)
6437 { check = check->next;
6438 if (strcmp(param_name, check->name) == 0)
6441 "%s: PARAMETER <%s> in screen <%d> already defined as in screen <%d>\n",
6442 f_name, param_name, s, check->s_nr);
6443 free_nm_info(start);
6448 // make space, and add parameter
6449 if ((info->next = malloc(sizeof(PARAM_INFO_MON))) != NULL)
6452 info->name = strdup(param_name);
6457 info->mname = strdup(tmp_mname);
6460 info->next = NULL; // mark end
6464 fprintf(stderr, "no mem");
6465 free_nm_info(start);
6477 while (info->next != NULL)
6480 fprintf(stderr, "info name %s\n", info->name);
6486 // 2, parse the arguments and check command(s) line
6487 // command line, phone spec input, and output are complex,
6488 // so we exit printing info about error instead of std help
6489 ///////////////////////////////////////////////////////////////////////////////
6491 int parse_check(int argc, char *argv[], PARAM_INFO_MON *start, char *f_name, int line)
6500 PARAM_INFO_MON *info; // iterator on this list
6503 for (i = 0; i < argc; i++)
6504 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6514 { // should be one of the short option
6515 if (strcmp(argv[i], "-fs") == 0)
6516 { // field separator, next arg should be a string
6517 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6519 // arg OK, do nothing
6524 "-fs: Invalid field separator in <%s> at line %d\n",
6527 fprintf(stderr, "-fs: Invalid field separator\n");
6531 else if (strcmp(argv[i], "-ls") == 0)
6532 { // line separator, next arg should be a string
6533 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6535 // arg OK, do nothing
6540 "-ls: Invalid line separator in <%s> at line %d\n",
6543 fprintf(stderr, "-ls: Invalid line separator\n");
6547 else if (strcmp(argv[i], "-tm") == 0)
6548 { // time separator, next arg should be a millisecond (200-10000)
6552 "-tm, -ts, are mutually exclusive in <%s> at line %d\n",
6555 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6559 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6562 // arg OK, do nothing
6567 "-tm: Invalid argument (200-10000 milliseconds), in <%s> at line %d\n",
6570 fprintf(stderr, "-tm: Invalid argument (200-10000 milliseconds)\n");
6574 else if (strcmp(argv[i], "-ts") == 0)
6575 { // time separator, next arg should be a seconds (1-3600)
6579 "-tm, -ts, are mutually exclusive, in <%s> at line %d\n",
6582 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6586 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6589 // arg OK, do nothing
6594 "-ts: Invalid argument (1-3600 seconds) in <%s> at line %d\n",
6597 fprintf(stderr, "-ts: Invalid argument (1-3600 seconds)\n");
6601 else if (strcmp(argv[i], "-n") == 0)
6602 { // nr of data pump, before stop collection,
6603 // next arg should be a int > 0
6604 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6606 // arg OK, do nothing
6611 "-n: Invalid argument (1-99999 times) in <%s> at line %d\n",
6614 fprintf(stderr, "-n: Invalid argument (1-99999 times)\n");
6618 else if (strcmp(argv[i], "-h") == 0)
6619 { // we do NOT want header (default with header)
6620 // arg OK, do nothing
6622 else if (strcmp(argv[i], "-S") == 0)
6623 { // we have used use specs from a file instead of standard info,
6624 // next arg is an existing readable filename
6625 // as already parsed correctly, we skip here.
6628 else if (strcmp(argv[i], "-I") == 0)
6629 { // we have used input from a file instead of command line
6630 // next arg is an existing readable filename
6631 // as already parsed correctly, we skip here.
6637 fprintf(stderr, "Unrecognized option %s in <%s> at line %d\n",
6638 argv[i], f_name, line);
6640 fprintf(stderr, "Unrecognized option %s\n", argv[i]);
6645 { // should be required data
6646 tmp = strdup(argv[i]);
6647 p = strtok(tmp, ":\t\n");
6650 // check if there is an output format specification
6660 // we have 'minus', so, probably forget format ...
6664 "Required data <%s->, without format specifiers in <%s> at line %d\n",
6668 "Required data <%s->, without format specifiers\n", p);
6674 // we check for params
6677 while (info->next != NULL)
6680 if (strcmp(p, info->name) == 0)
6682 if (ctr > NM_MAX_FIELDS)
6686 "too much data field ... in file <%s> at line %d\n",
6689 fprintf(stderr, "too much data field ...\n");
6702 if (found_data == 0)
6706 "Required data <%s>, not found in info-mon specifications in <%s> at line %d\n",
6710 "Required data <%s>, not found in info-mon specifications\n", p);
6714 p = strtok(NULL, ":\t\n");
6716 } // end while strtok
6718 } // end else '-' (short options)
6727 fprintf(stderr, "no required data! in <%s> at line %d\n", f_name, line);
6729 fprintf(stderr, "no required data!\n");
6736 // 2, parse the arguments and process the command line
6737 // no checks are needed here, because already do in parse_check
6738 // it return a pointer to info needed for make output, or NULL if errors
6739 ///////////////////////////////////////////////////////////////////////////////
6740 OUT_INFO_MON *parse_process(int argc, char *argv[], PARAM_INFO_MON *start)
6751 PARAM_INFO_MON *info; // iterator on this list
6752 OUT_INFO_MON *out_param; // iterator on this list
6754 if ((out_param = malloc(sizeof(OUT_INFO_MON))) == NULL)
6755 { fprintf(stderr, "no mem\n");
6760 fprintf(stderr, "parse_process: argc = %d\n", argc);
6761 for (i = 0; i < argc; i++)
6762 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6765 for (i = 0; i < NM_MAX_FIELDS; i++)
6766 out_param->data[i] = NULL;
6768 strcpy(out_param->req_fs, " ");
6770 strcpy(out_param->req_ls, "\n\r");
6772 strcpy(out_param->req_ls, "\n");
6775 out_param->req_n = 0;
6776 out_param->req_header = 1;
6779 req_tm = 200; /* default wait */
6788 { // should be one of the short option
6789 if (strcmp(argv[i], "-fs") == 0)
6790 { // field separator, next arg should be a string
6791 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6793 strcpy(out_param->req_fs, argv[i]);
6796 { fprintf(stderr, "NEVER BE:-fs: Invalid field separator\n");
6800 else if (strcmp(argv[i], "-ls") == 0)
6801 { // line separator, next arg should be a string
6802 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6804 strcpy(out_param->req_ls, argv[i]);
6807 { fprintf(stderr, "NEVER BE:-ls: Invalid line separator\n");
6811 else if (strcmp(argv[i], "-tm") == 0)
6812 { // time separator, next arg should be a millisecond (200-10000)
6814 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6818 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6820 req_tm = atoi(argv[i]);
6824 { fprintf(stderr, "NEVER BE:-tm: Invalid argument (200-10000 milliseconds)\n");
6828 else if (strcmp(argv[i], "-ts") == 0)
6829 { // time separator, next arg should be a seconds (1-3600)
6831 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6835 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6837 req_ts = atoi(argv[i]);
6844 { fprintf(stderr, "NEVER BE:-ts: Invalid argument (1-3600 seconds)\n");
6848 else if (strcmp(argv[i], "-n") == 0)
6849 { // nr of data pump, before stop collection,
6850 // next arg should be a int > 0
6851 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6853 out_param->req_n = atoi(argv[i]);
6856 { fprintf(stderr, "NEVER BE:-n: Invalid argument (1-99999 times)\n");
6860 else if (strcmp(argv[i], "-h") == 0)
6861 { // we do NOT want header (default with header)
6862 out_param->req_header = 0;
6864 else if (strcmp(argv[i], "-S") == 0)
6865 { // we have used use specs from a file instead of standard info,
6866 // next arg is an existing readable filename
6867 // as already parsed correctly, we skip here.
6870 else if (strcmp(argv[i], "-I") == 0)
6871 { // we have used input from a file instead of command line
6872 // next arg is an existing readable filename
6873 // as already parsed correctly, we skip here.
6878 fprintf(stderr, "NEVER BE:Unrecognized option %s\n", argv[i]);
6883 { // should be required data
6884 tmp = strdup(argv[i]);
6885 p = strtok(tmp, ":\t\n");
6888 // check if there is an output format specification
6898 // we have 'minus', so, probably forget format ...
6901 "NEVER BE:Required data <%s->, without format specifiers\n", p);
6907 // we check for params
6910 while (info->next != NULL)
6913 if (strcmp(p, info->name) == 0)
6915 if (ctr > NM_MAX_FIELDS)
6917 fprintf(stderr, "NEVER BE:too much data field ...");
6920 out_param->data[ctr] = info;
6921 out_param->out_f[ctr] = *o;
6928 if (found_data == 0)
6931 "NEVER BE:Required data <%s>, not found in info-mon specifications\n", p);
6936 p = strtok(NULL, ":\t\n");
6938 } // end while strtok
6940 // here, we have an array of pointers to required data
6941 // and an array of output specifiers, from 0 to [ctr-1]
6943 } // end else '-' (short options)
6951 fprintf(stderr, "NEVER BE:no required data!\n");
6955 // now, what netmon screen we need to retrieve ?
6956 // we need somewhat were checking is faster, as our goal is lower cicle time
6958 // we can have NM_MAX_SCREEN=254 screens, so we use an array, of unsigned char,
6959 // each char contain number of needed screen, 255 is list terminator
6961 for (i = 0; i <= NM_MAX_SCREEN; i++)
6962 out_param->req_screen[i] = 255;
6966 fprintf(stderr, "Start Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6968 while (out_param->data[ctr] != NULL)
6971 fprintf(stderr, "Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6973 // check if screen already in
6976 while (out_param->req_screen[i] != 255)
6978 if (out_param->req_screen[i] == out_param->data[ctr]->s_nr)
6979 { // already load, skip
6986 if (found_data == 0)
6989 fprintf(stderr, "i = %d, out_param->req_screen[%d] = %d\n", i, i, out_param->data[ctr]->s_nr);
6991 out_param->req_screen[i] = out_param->data[ctr]->s_nr;
7000 while (out_param->req_screen[i] != 255)
7002 fprintf(stderr, "Required screen %d\n", out_param->req_screen[i]);
7008 out_param->req_wait = req_tm * 1000;
7010 out_param->req_wait = req_ts * 1000000;
7012 out_param->req_wait = req_tm * 1000;
7018 int nmd_output(OUT_INFO_MON *out_param)
7028 char Screen[NM_MAX_SCREEN_WIDTH];
7030 struct tm *date_time;
7032 if (out_param->req_header)
7034 // print phone help header
7036 while (out_param->data[d] != NULL)
7037 { len = out_param->data[d]->len;
7038 if (strlen(out_param->data[d]->name) > len)
7039 len = strlen(out_param->data[d]->name);
7040 if (strlen(out_param->data[d]->mname) > len)
7041 len = strlen(out_param->data[d]->mname);
7042 printf("%*.*s%s", len, len, out_param->data[d]->name, out_param->req_fs);
7045 printf("%s", out_param->req_ls);
7047 // print netmon manual header
7049 while (out_param->data[d] != NULL)
7050 { len = out_param->data[d]->len;
7051 if (strlen(out_param->data[d]->name) > len)
7052 len = strlen(out_param->data[d]->name);
7053 if (strlen(out_param->data[d]->mname) > len)
7054 len = strlen(out_param->data[d]->mname);
7055 printf("%*.*s%s", len, len, out_param->data[d]->mname, out_param->req_fs);
7058 printf("%s", out_param->req_ls);
7059 printf("%s", out_param->req_ls);
7065 // stop after n data punp
7068 if ((out_param->req_n) && (ctr > out_param->req_n))
7071 // datapump: for each screen, for each required data, load data info->value
7074 while(out_param->req_screen[i] != 255)
7076 if (out_param->req_screen[i] == 0)
7079 date_time = localtime(&sec);
7080 sprintf(Screen, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7082 date_time->tm_mon+1,
7083 date_time->tm_year+1900,
7088 fprintf(stderr, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7090 date_time->tm_mon+1,
7091 date_time->tm_year+1900,
7099 GSM->NetMonitor(out_param->req_screen[i], Screen);
7102 // we have one screen of data, load those required
7105 while (out_param->data[d] != NULL)
7107 if (out_param->data[d]->s_nr == out_param->req_screen[i])
7111 nr_line = out_param->data[d]->y;
7112 while ((*p) && (nr_line))
7120 fprintf(stderr, "\nthis line: %s\n\n", p);
7124 nr_chr = out_param->data[d]->x;
7125 while ((*p) && (nr_chr))
7129 // this the start of data
7131 len = out_param->data[d]->len;
7132 while ((*p) && (len))
7133 { out_param->data[d]->value[n] = *p;
7138 // pad with space if shorter than presumed
7139 while ((*p) && (len))
7140 { out_param->data[d]->value[n] = ' ';
7145 out_param->data[d]->value[n] = '\0';
7154 // print row of data
7156 while (out_param->data[d] != NULL)
7158 len = out_param->data[d]->len;
7159 if (out_param->req_header)
7160 { if (strlen(out_param->data[d]->name) > len)
7161 len = strlen(out_param->data[d]->name);
7162 if (strlen(out_param->data[d]->mname) > len)
7163 len = strlen(out_param->data[d]->mname);
7165 // FIXME check format
7166 printf("%*.*s%s", len, len, out_param->data[d]->value, out_param->req_fs);
7169 printf("%s", out_param->req_ls);
7171 usleep(out_param->req_wait);
7175 printf("%s%s", out_param->req_ls, out_param->req_ls);
7181 ///////////////////////////////////////////////////////////////////////////////
7182 int netmonitordata(int argc, char *argv[])
7184 char *loc_info = NULL; // path to --netmonitordata directory
7185 char *f_name; // absolute path of phone info-file
7186 int flag_phone_spec = 0; // flags, set if used -S option
7188 char model[20] = "phonepar"; // TO DO: PHONE AUTODETECTION
7189 // char phver[20] = "";
7191 PARAM_INFO_MON *start; // pointer to list of parsed phone params
7192 OUT_INFO_MON *out_param; // pointer to struct of output data
7194 char *f_commands = NULL; // file containings input line arguments
7195 FILE *commands; // Handle for this file
7196 char buf[1024]; // buffer
7197 char *f_argv[NM_MAX_FIELDS+30]; // space for parameters and cmdline options
7199 char *p, *tmp; // various counter, flags, tmp area ...
7206 signal(SIGINT, interrupted);
7208 // FIXME model, phone_version
7210 // before parsing phone-info-file, we check for user specified phone-info-file
7215 if (strcmp(argv[i], "-S") == 0)
7219 flag_phone_spec = 1;
7220 loc_info = strdup(argv[i+1]);
7224 { fprintf(stderr, "option -S require an argument ...\n");
7232 if (loc_info != NULL)
7233 { f_name = strdup(loc_info);
7235 else // we use standard file specification
7237 if ((tmp = getenv("INFOMONPATH")) == NULL)
7238 { loc_info = strdup(".");
7241 { loc_info = strdup(tmp);
7244 f_name = malloc(strlen(loc_info)+strlen(model)+10);
7245 sprintf(f_name, "%s/%s", loc_info, model);
7250 // fprintf(stderr, "Loc_info <%s> model <%s> version <%s>\n", loc_info, model, phver);
7251 fprintf(stderr, "Info file: <%s>\n", f_name);
7253 if ((start = get_mon_param_info(f_name, NULL)) == NULL)
7256 // option -I give us the possibility of specify a filename,
7257 // containing a "sequence" of command line args.
7258 // if you specify this option, you can use (on command line) only -S option.
7259 // other options may be specified inside the input-file.
7260 // contents of this file as the same sintax as the command line,
7261 // except it must not contain "--netmonitordata" or "-I" or "-S" options
7262 ///////////////////////////////////////////////////////////////////////
7267 if (strcmp(argv[i], "-I") == 0)
7271 if ((argc == 2) || ((argc == 4) && flag_phone_spec == 1))
7272 { f_commands = strdup(argv[i+1]);
7275 { fprintf(stderr, "option -I accept only additional -S option.\n");
7282 { fprintf(stderr, "option -I require an argument ...\n");
7290 // before all, we check all command line
7292 if (f_commands != NULL)
7295 fprintf(stderr, "netmonitordata(check): commands from <%s>\n", f_commands);
7299 // read line, make array f_argv, and counter f_argc
7300 // parse & check args, so errors are checked before real processing
7301 // (-I option here is ignored)
7302 // (-S option can be here, and it is used)
7305 if ((commands = fopen(f_commands, "r")) == NULL)
7306 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7310 // FIXME line may be be splitted
7312 while (fgets(buf, 1024, commands) != NULL)
7317 // Truncate from '#' at right of comments
7318 if ((tmp = strchr(p, '#')) != NULL)
7321 // Strip leading, trailing whitespace
7322 while(isspace((int) *p))
7325 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7326 p[strlen(p) - 1] = '\0';
7328 // Ignore blank lines
7329 if ((*p == '\n') || (*p == '\0'))
7333 fprintf(stderr, "netmonitordata(check): row <%s>\n", p);
7338 p = strtok(p, " \t");
7340 { f_argv[f_argc++] = strdup(p);
7342 fprintf(stderr, "netmonitordata(check): token <%s>\n", p);
7344 p = strtok(NULL, " \t"); // OK p, (NULL)
7346 while ((p != NULL) && (*p));
7348 // here we have f_argc, f_argv, this line is OK
7350 if (parse_check(f_argc, f_argv, start, f_commands, line) != 0)
7351 { free_nm_info(start);
7358 else // as above, but we have only command line, argv, argc.
7360 if (parse_check(argc, argv, start, NULL, 0) != 0)
7361 { free_nm_info(start);
7366 // here, all commands line are checked, and are correct
7368 if (f_commands != NULL)
7371 fprintf(stderr, "netmonitordata(process): commands from <%s>\n", f_commands);
7376 // read line, make array f_argv, and counter f_argc
7377 // parse_process argument, (-I option here is ignored)
7378 // (-S option can be here, and it is used)
7379 // (make header // these are in nmd_output();
7386 if ((commands = fopen(f_commands, "r")) == NULL)
7387 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7391 // FIXME line may be be splitted
7392 while (fgets(buf, 1024, commands) != NULL)
7396 // Truncate from '#' at right of comments
7397 if ((tmp = strchr(p, '#')) != NULL)
7400 // Strip leading, trailing whitespace
7401 while(isspace((int) *p))
7404 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7405 p[strlen(p) - 1] = '\0';
7407 // Ignore blank lines
7408 if ((*p == '\n') || (*p == '\0'))
7414 p = strtok(p, " \t");
7416 { f_argv[f_argc++] = strdup(p);
7417 p = strtok(NULL, " \t"); // OK p, (NULL)
7419 while ((p != NULL) && (*p));
7421 // here we have f_argc, f_argv, this line is OK
7423 if ((out_param = parse_process(f_argc, f_argv, start)) == NULL)
7424 { free_nm_info(start);
7425 return(-1); /* NEVER BE */
7428 // here, command line has no error ...
7430 nmd_output(out_param);
7437 else // as above, but we have only command line, argv, argc.
7439 if ((out_param = parse_process(argc, argv, start)) == NULL)
7440 { free_nm_info(start);
7441 return(-1); /* NEVER BE */
7443 nmd_output(out_param);
7452 /* I analised this source and this should be done. But when compile with VC6 */
7453 /* I have error. So, commented... MW */
7455 free_nm_info(start);
7462 // used by nm_collect()
7463 ///////////////////////////////////////////////////////////////////////////////
7464 char *rowScreen(char *s)
7468 // make Screen in one row
7480 void printtime(void)
7484 int Year; /* The complete year specification - e.g. 1999. Y2K :-) */
7485 int Month; /* January = 1 */
7490 int Timezone; /* The difference between local time and GMT */
7496 now=localtime(&nowh);
7498 Date.Year = now->tm_year;
7499 Date.Month = now->tm_mon+1;
7500 Date.Day = now->tm_mday;
7501 Date.Hour = now->tm_hour;
7502 Date.Minute = now->tm_min;
7503 Date.Second = now->tm_sec;
7505 /* I have 100 (for 2000) Year now :-) */
7506 if (Date.Year>99 && Date.Year<1900) {
7507 Date.Year=Date.Year+1900;
7510 printf("%d:%d:%d:%d:%d:%d ",Date.Day,Date.Month,Date.Year,Date.Hour,Date.Minute,Date.Second);
7514 // like netmonitor(), but print in one row, 1, 2 or 3 screen, every ~0.3 s
7515 ///////////////////////////////////////////////////////////////////////////////
7516 int nm_collect(int argc, char *argv[])
7518 int mode[MAX_NM_COLLECT];
7519 char Screen[NM_MAX_SCREEN_WIDTH];
7522 for (i=0;i<argc;i++) {
7523 argc > i ? (mode[i] = atoi(argv[i])): (mode[i] = 0);
7526 for (i=0;i<argc;i++) {
7527 if (mode[i]==0 && strcmp(argv[i],"-d")) {
7528 fprintf(stderr, "Wrong %i parameter (not number and not -d)\n",i);
7533 signal(SIGINT, interrupted);
7540 for (i=0;i<argc;i++) {
7541 if (!strcmp(argv[i],"-d")) {
7547 for (i=0;i<argc;i++) {
7550 GSM->NetMonitor(mode[i], Screen);
7551 printf("%s::", rowScreen(Screen));
7566 int sniff(int argc, char *argv[])
7568 /* base model comes from gnokiirc */
7569 strcat(model,"sniff");
7571 if (argc>0) strcpy(Port,argv[0]);
7573 /* Initialise the GSM interface. */
7576 /* Loop here indefinitely - allows you to see messages from GSM code in
7577 response to unknown messages etc. The loops ends after pressing the
7579 while (!bshutdown) {
7589 int decodefile(int argc, char *argv[])
7592 unsigned char in_buffer[255];
7596 /* base model comes from gnokiirc */
7597 strcat(model,"decode");
7599 /* Initialise the GSM interface. */
7602 printf ("open InPutFile: %s\n", argv[0]);
7603 if ( (infile = fopen( argv[0], "rb")) == NULL ) {
7604 printf ("Failed to open InPutFile: %s\n", argv[0]);
7607 while ( (nr_read = fread(in_buffer, 1, 16, infile)) > 0 ) {
7608 for (i=0; i < nr_read; i++)
7609 Protocol->StateMachine(in_buffer[i]);
7617 int getringtone(int argc, char *argv[])
7619 GSM_BinRingtone ringtone;
7621 GSM_Ringtone SMringtone;
7629 ringtone.location=1;
7630 if (argc>1) ringtone.location=atoi(argv[1]);
7632 /* Initialise the GSM interface. */
7635 error=GSM->GetBinRingtone(&ringtone);
7637 while (GSM->GetModel(model) != GE_NONE)
7642 fprintf(stdout, _("Downloaded ringtone, location %i: "),ringtone.location);
7646 fprintf(stdout, _("get succeeded!\n"));
7647 fprintf(stdout, _("Name: %s (binary format)\n"),ringtone.name);
7649 case GE_INVALIDRINGLOCATION:
7650 fprintf(stdout, _("invalid location %i!\n"),ringtone.location);
7652 case GE_UNKNOWNMODEL:
7654 /* In 3310 we have normal "Smart Messaging" format */
7655 if (GetModelFeature (FN_RINGTONES)==F_RING_SM) {
7658 if (ringtone.frame[9]==0x4a && ringtone.frame[10]==0x3a) i=8;
7659 ringtone.frame[i]=0x02;
7661 GSM_UnPackRingtone(&SMringtone, ringtone.frame+i, ringtone.length-i);
7663 fprintf(stdout, _("Name: %s (normal format)\n"),SMringtone.name);
7665 GSM_SaveRingtoneFileOnConsole(argv[0], &SMringtone);
7670 fprintf(stdout, _("mygnokii doesn't know format for this model!\n"));
7672 case GE_NOTIMPLEMENTED:
7673 fprintf(stdout, _("not implemented for this model!\n"));
7676 fprintf(stdout, _("not supported by this model!\n"));
7683 file = fopen(argv[0], "wb");
7686 return(GE_CANTOPENFILE);
7688 fwrite(ringtone.frame, 1, ringtone.length, file);
7696 int binringtoneconvert(int argc, char *argv[])
7698 GSM_BinRingtone ringtone;
7707 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
7708 int binary_notes[12] =
7709 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
7711 if (GSM_ReadBinRingtoneFile(argv[0],&ringtone)!=GE_NONE) {
7712 fprintf(stdout,_("Failed to read %s file!\n"),argv[0]);
7716 file = fopen(argv[1], "wb");
7719 return(GE_CANTOPENFILE);
7723 if (ringtone.frame[i]==0) break;
7724 fprintf(file,_("%c"),ringtone.frame[i]);
7728 fprintf(file,_(":d=32,o=5,b=300:"));
7732 if (ringtone.frame[i]!=j) {
7739 if (!isok && j>=114 && j<=125) {
7740 j=14*3+binary_notes[j-114];
7743 if (!isok && j>=126 && j<=137) {
7744 j=14*1+binary_notes[j-126];
7747 if (!isok && j>=138 && j<=149) {
7748 j=14*2+binary_notes[j-138];
7751 if (!isok && j>=150 && j<=161) {
7752 j=14*4+binary_notes[j-150];
7757 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
7763 if (w>z && (w/2)<=z) {
7765 case 1:fprintf(file,_("16"));break;
7766 case 2:fprintf(file,_("8"));break;
7767 case 3:fprintf(file,_("4"));break;
7768 case 4:fprintf(file,_("2"));break;
7769 case 5:fprintf(file,_("1"));break;
7774 if (z>w) fprintf(file,_("1"));
7776 switch (GSM_GetNote(j)) {
7777 case Note_C :fprintf(file,_("c"));break;
7778 case Note_Cis:fprintf(file,_("c#"));break;
7779 case Note_D :fprintf(file,_("d"));break;
7780 case Note_Dis:fprintf(file,_("d#"));break;
7781 case Note_E :fprintf(file,_("e"));break;
7782 case Note_F :fprintf(file,_("f"));break;
7783 case Note_Fis:fprintf(file,_("f#"));break;
7784 case Note_G :fprintf(file,_("g"));break;
7785 case Note_Gis:fprintf(file,_("g#"));break;
7786 case Note_A :fprintf(file,_("a"));break;
7787 case Note_Ais:fprintf(file,_("a#"));break;
7788 case Note_H :fprintf(file,_("h"));break;
7789 default :pause=true;fprintf(file,_("p"));break; //Pause ?
7794 if (w>z && (w/2)<=z) {
7795 fprintf(file,_("."));
7799 if ((j/14)!=1 && !pause) fprintf(file,_("%i"),j/14);
7800 fprintf(file,_(","));
7803 j=ringtone.frame[i];
7804 z=ringtone.frame[i+1];
7806 z=z+ringtone.frame[i+1];
7809 if (i>=ringtone.length) break;
7818 int renamesmsc(int argc, char *argv[])
7820 GSM_MessageCenter MessageCenter;
7822 MessageCenter.No=atoi(argv[0]);
7824 /* Initialise the GSM interface. */
7827 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
7828 fprintf(stdout,_("SMSC number %i get OK\n"),MessageCenter.No);
7831 fprintf(stdout,_("Error getting SMSC number %i\n"),MessageCenter.No);
7835 strncpy(MessageCenter.Name,argv[1],10);
7837 if (GSM->SetSMSCenter(&MessageCenter) == GE_NONE) {
7838 fprintf(stdout,_("SMSC number %i set OK (renamed to \"%s\")\n"),MessageCenter.No,MessageCenter.Name);
7841 fprintf(stdout,_("Error setting SMSC number %i\n"),MessageCenter.No);
7850 #endif /* UCLINUX */
7853 * Returns number of sostituited characters.
7854 * ... may be useful one day ??
7856 static int semicolon_pipe_substitution( GSM_PhonebookEntry *pentry, unsigned int direction )
7857 /* direction = 0 : after reading phone memory (
7858 * 1 : writing phone memory
7862 register int count=0;
7863 char charfrom, charto;
7865 charfrom= (direction==0) ? ';' : '|';
7866 charto = (direction==0) ? '|' : ';';
7868 count+=str_substch(pentry->Name, charfrom, charto );
7869 count+=str_substch(pentry->Number, charfrom, charto );
7871 for( i = 0; i < pentry->SubEntriesCount; i++ )
7873 if( pentry->SubEntries[i].EntryType != GSM_Date )
7874 count+=str_substch(pentry->SubEntries[i].data.Number ,charfrom,charto);
7880 int str_substch( char *str, const char toric, const char sost )
7885 for( ct = 0; ct < strlen(str); ct++ )
7886 if( str[ct] == (unsigned char) toric )
7887 { str[ct] = sost; i_sost++; }
7894 extern GSM_Error N6110_EnableExtendedCommands (unsigned char status);
7896 /* Allows to set simlock state.
7897 With older phone (older 51xx, 61xx) can open them, with older
7898 and newer should be able to close them */
7899 /* DO NOT TRY, IF DON'T WANT, WHAT YOU DO !!!!!!!!!! */
7902 GSM_AllSimlocks siml;
7904 unsigned char closebuffer[20]=
7905 { 0x00, 0x01, 0x82, 0x01,
7906 0x00, /* which simlock */
7908 0x00, 0x00, 0x00, /* lock 1 info */
7909 0x00, 0x00, 0x00, 0x00, 0x00, /* lock 4 info */
7910 0x00, 0x00, /* lock 2 info */
7911 0x00, 0x00, /* lock 3 info */
7913 unsigned char openbuffer[10]= { 0x00, 0x01, 0x81, 0x01,
7914 0x00, /* lock number */
7915 0x10, 0x10, 0x10, 0x10, 0x10 };
7916 unsigned char openbuffer0[10]= {0x00, 0x01, 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00 };
7918 unsigned char info[120];
7921 /* Initialise the code for the GSM interface. */
7923 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7925 fprintf(stderr,("Not supported\n"));
7929 N6110_EnableExtendedCommands(0x02);
7931 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7932 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7934 /* Opening all locks (we must check, if we can open them) */
7935 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7936 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7937 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7938 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7939 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7940 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7941 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7944 if (siml.simlocks[i].enabled) {
7945 fprintf(stderr,_("Can not open simlock %i\n"),i+1);GSM->Terminate();return -1;
7948 /* Making frame for closing simlocks */
7949 strcpy(info,"00101");
7951 while (j!=strlen(info)) {
7952 if (j+2<=strlen(info)) {
7953 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7955 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7958 strcpy(info,"0000");j=0;i=15;
7959 while (j!=strlen(info)) {
7960 if (j+2<=strlen(info)) {
7961 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7963 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7966 strcpy(info,"0000");j=0;i=17;
7967 while (j!=strlen(info)) {
7968 if (j+2<=strlen(info)) {
7969 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7971 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7974 strcpy(info,"0000000001");j=0;i=9;
7975 while (j!=strlen(info)) {
7976 if (j+2<=strlen(info)) {
7978 closebuffer[i]=closebuffer[i] | (info[j] & 0x0f);j++;
7980 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7983 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7986 /* Closing simlock with given values */
7987 closebuffer[4]=1+2+4+8;
7988 NULL_SendMessageSequence(50, &CurrentMagicError, 20, 0x40,closebuffer);
7989 /* Opening all locks */
7990 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7991 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7992 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7993 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7994 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8002 GSM_AllSimlocks siml;
8005 /* Initialise the code for the GSM interface. */
8008 if (GSM->SimlockInfo(&siml)!=GE_NONE) fprintf(stderr,_("Error\n"));
8010 fprintf(stdout,_("MCC + MNC : %s ("),siml.simlocks[0].data);
8011 if (siml.simlocks[0].enabled) fprintf(stdout,_("CLOSED"));
8012 else fprintf(stdout,_("opened"));
8013 if (siml.simlocks[0].factory) fprintf(stdout,_(") (factory"));
8014 else fprintf(stdout,_(") (user"));
8015 fprintf(stdout,_(") (counter %i"),siml.simlocks[0].counter);
8017 s[0]=siml.simlocks[0].data[0];
8018 s[1]=siml.simlocks[0].data[1];
8019 s[2]=siml.simlocks[0].data[2];
8021 s[4]=siml.simlocks[0].data[3];
8022 s[5]=siml.simlocks[0].data[4];
8025 if (strcmp(GSM_GetNetworkName(s),"unknown"))
8026 fprintf(stdout,_(") (network \"%s\""),GSM_GetNetworkName(s));
8028 fprintf(stdout,_(")\n"));
8030 fprintf(stdout,_("GID1 : %s ("),siml.simlocks[1].data);
8031 if (siml.simlocks[1].enabled) fprintf(stdout,_("CLOSED"));
8032 else fprintf(stdout,_("opened"));
8033 if (siml.simlocks[1].factory) fprintf(stdout,_(") (factory"));
8034 else fprintf(stdout,_(") (user"));
8035 fprintf(stdout,_(") (counter %i"),siml.simlocks[1].counter);
8036 fprintf(stdout,_(")\n"));
8038 fprintf(stdout,_("GID2 : %s ("),siml.simlocks[2].data);
8039 if (siml.simlocks[2].enabled) fprintf(stdout,_("CLOSED"));
8040 else fprintf(stdout,_("opened"));
8041 if (siml.simlocks[2].factory) fprintf(stdout,_(") (factory"));
8042 else fprintf(stdout,_(") (user"));
8043 fprintf(stdout,_(") (counter %i"),siml.simlocks[2].counter);
8044 fprintf(stdout,_(")\n"));
8046 fprintf(stdout,_("MSIN : %s ("),siml.simlocks[3].data);
8047 if (siml.simlocks[3].enabled) fprintf(stdout,_("CLOSED"));
8048 else fprintf(stdout,_("opened"));
8049 if (siml.simlocks[3].factory) fprintf(stdout,_(") (factory"));
8050 else fprintf(stdout,_(") (user"));
8051 fprintf(stdout,_(") (counter %i"),siml.simlocks[3].counter);
8052 fprintf(stdout,_(")\n"));
8059 /* Getting EEPROM from older phones */
8060 /* Tested with N5110 5.07, 6150 5.22 */
8065 unsigned char buffer[1000]={ 0x00, 0x01, 0xd4, 0x02, 0x00, 0xa0,
8066 0x00, 0x00, /* location Lo and Hi */
8067 0x10 }; /* how many bytes */
8069 strcpy(Connection,"mbus");
8070 fprintf(stderr,_("Switching connection type to MBUS\n"));
8072 strcpy(model,"5110");
8074 /* Initialise the code for the GSM interface. */
8077 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
8079 fprintf(stderr,("Not supported\n"));
8084 for (i=0;i<64;i++) {
8085 fprintf(stdout,_("%c"),0xff);
8092 if ((i/256)!=((i-1)/256)) fprintf(stderr,_("."));
8094 if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE) break;
8099 fprintf(stderr,_("\n"));
8108 GSM_SMSFolders folders;
8113 /* Initialise the code for the GSM interface. */
8118 error=GSM->GetSMSFolders(&folders);
8122 if (error!=GE_NONE && !folders.number) {
8123 fprintf(stdout,_("Error!\n"));
8127 for (i=0;i<folders.number;i++) {
8128 fprintf(stdout,_("%i. %s\n"),i+1,folders.Folder[i].Name);
8134 int resetphonesettings()
8136 /* Initialise the code for the GSM interface. */
8139 GSM->ResetPhoneSettings();
8148 /* Checked on 3310 4.02 and doesn't work.
8149 Possible reasons: SMSC has problems (possible), bug in phone firmware
8150 (very possible) or here in code.
8151 I quess, that the second is the most possible - 3310 treat only 3 SMS
8152 as linked (the most often profile needs 4 - 2 and few bytes in 3'th
8153 for screen saver, few bytes for profile name and 1 or 2 sms for ringtone).
8154 When send separate ringtone (see --sendringtone with --profilestyle)
8155 and screen saver (--sendlogo screensaver...), it's received OK.
8156 It's for checking in higher firmware. */
8157 int sendprofile(int argc, char *argv[])
8159 GSM_Ringtone ringtone;
8161 GSM_MultiSMSMessage MultiSMS;
8165 u8 MessageBuffer[140*4];
8166 u16 MessageLength=0;
8168 char profilename[10+1];
8170 if (GSM_ReadRingtoneFileOnConsole(argv[2], &ringtone)!=GE_NONE) return(-1);
8172 ringtone.allnotesscale=false;
8173 for (i=0;i<argc;i++)
8174 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
8176 /* The fourth argument is the bitmap file. */
8177 if (GSM_ReadBitmapFileOnConsole(argv[3], &bitmap)!=GE_NONE) return -1;
8179 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
8181 strncpy(profilename,argv[1],10);
8183 MessageBuffer[MessageLength++]=0x30; //SM version. Here 3.0
8185 MessageBuffer[MessageLength++]=SM30_PROFILENAME; //ID for profile name
8186 MessageBuffer[MessageLength++]=0x00; //length hi
8187 MessageBuffer[MessageLength++]=strlen(profilename);//length lo
8189 EncodeUnicode (MessageBuffer+MessageLength,profilename ,strlen(profilename));
8190 MessageLength=MessageLength+2*strlen(profilename);
8192 MessageBuffer[MessageLength++]=SM30_RINGTONE; //ID for ringtone
8194 MessageBuffer[MessageLength++]=0x01; //length hi
8195 MessageBuffer[MessageLength++]=0x00; //length lo
8197 j=SM30_MAX_RINGTONE_FRAME_LENGTH;
8198 current=GSM_PackRingtone(&ringtone, MessageBuffer+MessageLength, &j);
8199 MessageLength=MessageLength+j;
8201 if (current!=ringtone.NrNotes) {
8202 if (current>FB61_MAX_RINGTONE_NOTES) {
8203 fprintf(stderr,_("Warning: due to phone limitation"));
8205 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
8207 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
8210 MessageBuffer[i]=(j)/256;
8211 MessageBuffer[i+1]=(j)%256;
8213 MessageBuffer[MessageLength++]=SM30_SCREENSAVER; //ID for OTA screen saver
8214 MessageBuffer[MessageLength++]=0x01; //length hi
8215 MessageBuffer[MessageLength++]=0x00; //length lo
8216 MessageBuffer[MessageLength++]=0x00;
8217 MessageBuffer[MessageLength++]=bitmap.width;
8218 MessageBuffer[MessageLength++]=bitmap.height;
8219 MessageBuffer[MessageLength++]=0x01;
8221 memcpy(MessageBuffer+MessageLength,bitmap.bitmap,bitmap.size);
8222 MessageLength=MessageLength+bitmap.size;
8224 GSM_MakeMultiPartSMS2(&MultiSMS,MessageBuffer,MessageLength, GSM_ProfileUDH, GSM_Coding_Default);
8228 /* Initialise the GSM interface. */
8231 for (i=0;i<MultiSMS.number;i++)
8232 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
8234 return GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,false,false,false);
8237 int showbitmap(int argc, char *argv[])
8241 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
8243 GSM_PrintBitmap(&bitmap);
8248 int getwapsettings(int argc, char *argv[])
8250 GSM_WAPSettings settings;
8253 settings.location=atoi(argv[0]);
8255 /* Initialise the GSM interface. */
8258 error=GSM->GetWAPSettings(&settings);
8262 fprintf(stdout,_("%s."),argv[0]);
8263 if (!(strcmp(settings.title,""))) fprintf(stdout,_("Set %s\n"),argv[0]);
8264 else fprintf(stdout,_("%s\n"),settings.title);
8265 fprintf(stdout,_("Homepage: %s\n"),settings.homepage);
8266 if (settings.iscontinuous) fprintf(stdout,_("Connection type: continuous\n"));
8267 else fprintf(stdout,_("Connection type: temporary\n"));
8268 if (settings.issecurity) fprintf(stdout,_("Connection security: on\n"));
8269 else fprintf(stdout,_("Connection security: off\n"));
8270 switch (settings.bearer) {
8271 case WAPSETTINGS_BEARER_SMS:
8272 fprintf(stdout,_("Bearer: SMS\n"));
8273 fprintf(stdout,_("Server number: %s\n"),settings.server);
8274 fprintf(stdout,_("Service number: %s\n"),settings.service);
8276 case WAPSETTINGS_BEARER_DATA:
8277 fprintf(stdout,_("Bearer: Data (CSD)\n"));
8278 fprintf(stdout,_("Dial-up number: %s\n"),settings.dialup);
8279 fprintf(stdout,_("IP address: %s\n"),settings.ipaddress);
8280 if (settings.isnormalauthentication) fprintf(stdout,_("Authentication type: normal\n"));
8281 else fprintf(stdout,_("Authentication type: secure\n"));
8282 if (settings.isISDNcall) fprintf(stdout,_("Data call type: ISDN\n"));
8283 else fprintf(stdout,_("Data call type: analogue\n"));
8284 if (settings.isspeed14400) fprintf(stdout,_("Data call speed: 14400\n"));
8285 else fprintf(stdout,_("Data call speed: 9600\n"));
8286 fprintf(stdout,_("User name: %s\n"),settings.user);
8287 fprintf(stdout,_("Password: %s\n"),settings.password);
8289 case WAPSETTINGS_BEARER_USSD:
8290 fprintf(stdout,_("Bearer: USSD\n"));
8291 fprintf(stdout,_("Service code: %s\n"),settings.code);
8292 if (settings.isIP) fprintf(stdout,_("Address type: IP address\nIPaddress: %s\n"),settings.service);
8293 else fprintf(stdout,_("Address type: service number\nService number: %s\n"),settings.service);
8298 fprintf(stderr,_("%s\n"),print_error(error));
8307 /* Not full done now */
8308 int savewapsettings(int argc, char *argv[])
8310 GSM_WAPSettings settings;
8311 GSM_MultiSMSMessage MultiSMS;
8315 settings.location=atoi(argv[0]);
8317 /* Initialise the GSM interface. */
8320 error=GSM->GetWAPSettings(&settings);
8321 // strcpy(settings.homepage,"http://OtherSites/");
8322 // strcpy(settings.title,"Orange");
8328 /* Put settings into SMS structure */
8329 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8331 for (w=0;w<MultiSMS.number;w++)
8332 strcpy(MultiSMS.SMS[w].Destination,"WAPSettings");
8334 GSM_SaveMultiPartSMSOnConsole(&MultiSMS,1,argc,argv,false,false,false,false);
8339 fprintf(stderr,_("%s\n"),print_error(error));
8347 int sendwapsettings(int argc, char *argv[])
8349 GSM_WAPSettings settings;
8350 GSM_MultiSMSMessage MultiSMS;
8354 settings.location=atoi(argv[0]);
8356 /* Initialise the GSM interface. */
8359 error=GSM->GetWAPSettings(&settings);
8360 // strcpy(settings.homepage,"http://OtherSites/");
8361 // strcpy(settings.title,"Orange");
8367 /* Put settings into SMS structure */
8368 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8370 for (w=0;w<MultiSMS.number;w++)
8371 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8373 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8379 fprintf(stderr,_("%s\n"),print_error(error));
8387 int getwapbookmark(int argc, char *argv[])
8389 GSM_WAPBookmark bookmark;
8392 bookmark.location=atoi(argv[0]);
8394 /* Initialise the GSM interface. */
8397 error=GSM->GetWAPBookmark(&bookmark);
8401 if (bookmark.address[0]==0) {
8402 fprintf(stdout,_("Empty bookmark location\n"));
8404 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
8405 if (bookmark.title[0]==0)
8406 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
8408 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
8412 fprintf(stderr,_("%s\n"),print_error(error));
8421 int setwapbookmark(int argc, char *argv[])
8423 GSM_WAPBookmark bookmark;
8426 if (argc == 3) /* if location given, use it */
8427 bookmark.location=atoi(argv[2]);
8428 else /* else use first empty location */
8429 bookmark.location=0xffff;
8431 strcpy(bookmark.title, argv[0]);
8432 strcpy(bookmark.address, argv[1]);
8434 /* Initialise the GSM interface. */
8437 error=GSM->SetWAPBookmark(&bookmark);
8441 fprintf(stdout,_("No errors\n"));
8444 fprintf(stderr,_("%s\n"),print_error(error));
8453 int savewapbookmark(int argc, char *argv[])
8455 GSM_WAPBookmark bookmark;
8456 GSM_MultiSMSMessage MultiSMS;
8460 bookmark.location=atoi(argv[0]);
8462 /* Initialise the GSM interface. */
8465 error=GSM->GetWAPBookmark(&bookmark);
8467 // strcpy(bookmark.title,"tytulagagagagagagagagagagagagagagagagagagagagagend");
8468 // strcpy(bookmark.address,"http://jajajajajajajajajajajajagagagagagagagagagagagagagagagagagagagagagpapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap¥papapapapapapapapagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdstp");
8474 if (bookmark.address[0]==0) {
8475 fprintf(stdout,_("Empty bookmark location\n"));
8480 /* Put bookmark into SMS structure */
8481 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8483 for (w=0;w<MultiSMS.number;w++)
8484 strcpy(MultiSMS.SMS[w].Destination,"WAPBookmark");
8486 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 1,argc,argv,false,false,false,false);
8491 fprintf(stderr,_("%s\n"),print_error(error));
8500 int sendwapbookmark(int argc, char *argv[])
8502 GSM_WAPBookmark bookmark;
8503 GSM_MultiSMSMessage MultiSMS;
8507 bookmark.location=atoi(argv[0]);
8509 /* Initialise the GSM interface. */
8512 error=GSM->GetWAPBookmark(&bookmark);
8517 if (bookmark.address[0]==0) {
8518 fprintf(stdout,_("Empty bookmark location\n"));
8523 /* Put bookmark into SMS structure */
8524 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8526 for (w=0;w<MultiSMS.number;w++)
8527 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8529 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8534 fprintf(stderr,_("%s\n"),print_error(error));
8543 int savecalendarnote(int argc, char *argv[])
8545 GSM_MultiSMSMessage MultiSMS;
8547 GSM_CalendarNote CalendarNote;
8550 number=atoi(argv[1]);
8553 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8557 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
8560 case GE_CANTOPENFILE:
8561 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
8564 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8567 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
8573 /* Put note into SMS structure */
8574 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8576 for (w=0;w<MultiSMS.number;w++)
8577 strcpy(MultiSMS.SMS[w].Destination,"Calendar");
8579 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8584 int sendcalendarnote(int argc, char *argv[])
8586 GSM_MultiSMSMessage MultiSMS;
8588 GSM_CalendarNote CalendarNote;
8591 number=atoi(argv[2]);
8594 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8598 switch ( GSM_ReadVCalendarFile(argv[1], &CalendarNote, &number) ) {
8601 case GE_CANTOPENFILE:
8602 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[1]);
8605 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8608 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[1]);
8614 /* Put note into SMS structure */
8615 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8617 for (w=0;w<MultiSMS.number;w++)
8618 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8620 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8625 /* Example function for continuous receiving SMS */
8626 /* When phone receives SMS, it's read by mygnokii, ID number is created
8627 and SMS is saved to file. After it it's deleted
8628 Checking many errors is also done */
8629 int receivesms(int argc, char *argv[])
8633 GSM_SMSStatus SMSStatus = {0, 0};
8635 int read, location, number;
8636 unsigned char name[50],filename[400];
8637 char nowdate[12]="", nowtime[12]="";
8640 struct CFG_Header *cfg_info;
8642 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
8645 signal(SIGINT, interrupted);
8647 fprintf (stderr, _("Entering monitor mode (press CTRL+C to break)...\n"));
8649 cfg_info=CFG_FindGnokiirc();
8652 if (cfg_info!=NULL) {
8653 if (CFG_Get(cfg_info, "receivesms", "path")) {
8654 strcpy(Dir,CFG_Get(cfg_info, "receivesms", "path"));
8658 fprintf(stderr,_("Path for sms files is \"%s\"\n"),Dir);
8660 fprintf (stderr, _("Initialising GSM interface..."));
8662 /* Initialise the code for the GSM interface. */
8665 fprintf (stderr, _("done\n"));
8669 /* Loop here indefinitely - allows you to see messages from GSM code in
8670 response to unknown messages etc. The loops ends after pressing the
8672 while (!bshutdown) {
8673 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE) {
8674 if (SMSStatus.Number!=0) {
8676 GetMachineDateTime(nowdate, nowtime );
8677 logfile = fopen("log", "a");
8679 fprintf(logfile, _("%s %s SMS Messages: UnRead %d, Number %d\n"),
8680 nowdate, nowtime, SMSStatus.UnRead, SMSStatus.Number);
8687 while (!bshutdown) {
8689 SMS.Location=location;
8690 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
8691 if (SMS.folder==0 || SMS.folder==0x08) { //GST_7110_INBOX
8693 GetMachineDateTime(nowdate, nowtime );
8694 logfile = fopen("log", "a");
8696 fprintf(logfile,_("%s %s SMS on location %i\n"),
8697 nowdate,nowtime,SMS.MessageNumber);
8701 number= 16*(SMS.MessageText[2] >> 4)+ (SMS.MessageText[2] & 0x0f);
8702 number=number+ 256*16*(SMS.MessageText[1] >> 4)+ 256*(SMS.MessageText[1] & 0x0f);
8703 number=number+65536*16*(SMS.MessageText[0] >> 4)+65536*(SMS.MessageText[0] & 0x0f);
8705 sprintf( name, "%07i_%02d%02d%02d_%02d%02d%02d.sms", number,
8706 SMS.Time.Year, SMS.Time.Month, SMS.Time.Day,
8707 SMS.Time.Hour, SMS.Time.Minute, SMS.Time.Second);
8709 strcpy(filename,Dir);
8710 strcat(filename,name);
8712 logfile = fopen("log", "a");
8714 fprintf(logfile,_("%s %s Name is \"%s\"\n"),nowdate,nowtime,filename);
8718 file = fopen(filename, "rb");
8720 file = fopen(filename, "wb");
8722 GetMachineDateTime(nowdate, nowtime );
8723 fprintf(stderr,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8724 logfile = fopen("log", "a");
8726 fprintf(logfile,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8730 fwrite(SMS.MessageText,1,SMS.Length,file);
8736 GetMachineDateTime(nowdate, nowtime );
8737 fprintf(stderr,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8738 logfile = fopen("log", "a");
8740 fprintf(logfile,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8745 SMS.Location=SMS.MessageNumber;
8746 if (GSM->DeleteSMSMessage(&SMS)!=GE_NONE) {
8747 GetMachineDateTime(nowdate, nowtime );
8748 fprintf(stderr,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8749 logfile = fopen("log", "a");
8751 fprintf(logfile,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8759 if (read==SMSStatus.Number) break;
8763 GetMachineDateTime(nowdate, nowtime );
8764 fprintf(stderr,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8765 logfile = fopen("log", "a");
8767 fprintf(logfile,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8775 fprintf (stderr, _("Leaving monitor mode...\n"));
8782 int divert(int argc, char *argv[])
8787 memset(&cd, 0, sizeof(GSM_CallDivert));
8789 if (!strcmp("register", argv[0])){cd.Operation = GSM_CDV_Register ;}
8790 else if (!strcmp("enable" , argv[0])){cd.Operation = GSM_CDV_Enable ;}
8791 else if (!strcmp("disable" , argv[0])){cd.Operation = GSM_CDV_Disable ;}
8792 else if (!strcmp("erasure" , argv[0])){cd.Operation = GSM_CDV_Erasure ;}
8793 else if (!strcmp("query" , argv[0])){cd.Operation = GSM_CDV_Query ;}
8799 if (!strcmp("all" , argv[1])) {cd.DType = GSM_CDV_AllTypes ;}
8800 else if (!strcmp("busy" , argv[1])) {cd.DType = GSM_CDV_Busy ;}
8801 else if (!strcmp("noans" , argv[1])) {cd.DType = GSM_CDV_NoAnswer ;}
8802 else if (!strcmp("outofreach", argv[1])) {cd.DType = GSM_CDV_OutOfReach;}
8808 if (!strcmp("all" , argv[2])) {cd.CType = GSM_CDV_AllCalls ;}
8809 else if (!strcmp("voice", argv[2])) {cd.CType = GSM_CDV_VoiceCalls;}
8810 else if (!strcmp("fax" , argv[2])) {cd.CType = GSM_CDV_FaxCalls ;}
8811 else if (!strcmp("data" , argv[2])) {cd.CType = GSM_CDV_DataCalls ;}
8817 if (argc>3) strcpy(cd.Number, argv[3]);
8819 if (argc>4) cd.Timeout = atoi(argv[4]);
8821 /* Initialise the code for the GSM interface. */
8824 error=GSM->CallDivert(&cd);
8826 if (error == GE_NONE) {
8827 switch (cd.Operation)
8830 fprintf(stdout, _("Divert type: "));
8832 case GSM_CDV_Busy :fprintf(stdout, _("when busy"));break;
8833 case GSM_CDV_NoAnswer :fprintf(stdout, _("when not answered"));break;
8834 case GSM_CDV_OutOfReach:fprintf(stdout, _("when phone off or no coverage"));break;
8835 case GSM_CDV_AllTypes :fprintf(stdout, _("all call diverts"));break; //?
8836 default: fprintf(stdout, _("unknown %i"),cd.DType);break;
8839 fprintf(stdout, _("\nCalls type : "));
8841 case GSM_CDV_VoiceCalls: fprintf(stdout, _("voice"));break;
8842 case GSM_CDV_FaxCalls : fprintf(stdout, _("fax"));break;
8843 case GSM_CDV_DataCalls : fprintf(stdout, _("data"));break;
8844 case GSM_CDV_AllCalls : fprintf(stdout, _("voice, fax & data"));break;
8845 default: fprintf(stdout, _("unknown %i"),cd.CType);break;
8847 fprintf(stdout, _("\n"));
8850 fprintf(stdout, _("Status : active\n"));
8851 fprintf(stdout, _("Timeout : %i seconds\n"),cd.Timeout);
8852 fprintf(stdout, _("Number : %s\n"),cd.Number);
8854 fprintf(stdout, _("Status : deactivated\n"));
8859 fprintf(stdout,_("Divert done\n"));
8862 fprintf(stderr,_("%s\n"),print_error(error));
8869 int savephonebookentry(int argc, char *argv[])
8871 GSM_MultiSMSMessage MultiSMS;
8872 GSM_PhonebookEntry entry;
8878 /* Handle command line args that set type, start and end locations. */
8879 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
8881 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
8885 entry.Location=atoi(argv[1]);
8889 error=GSM->GetMemoryLocation(&entry);
8894 /* Put entry into SMS structure */
8896 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71) {
8897 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8899 #endif /* UCLINUX */
8901 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8904 for (w=0;w<MultiSMS.number;w++)
8905 strcpy(MultiSMS.SMS[w].Destination,"Phonebook");
8907 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8911 fprintf(stdout,_("Error\n"));break;
8917 int sendphonebookentry(int argc, char *argv[])
8919 GSM_MultiSMSMessage MultiSMS;
8920 GSM_PhonebookEntry entry;
8926 /* Handle command line args that set type, start and end locations. */
8927 if (!GetMemoryTypeID(argv[1], &entry.MemoryType))
8929 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
8933 entry.Location=atoi(argv[2]);
8937 error=GSM->GetMemoryLocation(&entry);
8942 /* Put entry into SMS structure */
8943 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71) {
8944 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8946 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8949 for (w=0;w<MultiSMS.number;w++)
8950 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8952 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8957 fprintf(stdout,_("Error\n"));break;
8963 #endif /* UCLINUX */