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] [<child to run> [<child args>...]]\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, INT_MAX, 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];
1283 nargv[argc] = NULL; /* required by gnokiid() for execv(3) */
1285 if(checkargs(c, gals, nargc)) {
1289 /* Wrong number of arguments - we should display usage. */
1295 #if defined(__svr4__)
1296 /* have to ignore SIGALARM */
1303 // First, error conditions
1305 fprintf(stderr, _("Use '%s --help' for usage informations.\n"), argv[0]);
1308 // Then, options with no arguments
1309 case OPT_HELP: rc = usage(); break;
1310 case OPT_VERSION: rc = version(); break;
1312 case OPT_MONITOR: rc = monitormode(nargc, nargv); break;
1313 case OPT_GETSMSFOLDERS: rc = getsmsfolders(); break;
1314 case OPT_GETDATETIME: rc = getdatetime(); break;
1315 case OPT_GETALARM: rc = getalarm(); break;
1316 case OPT_GETDISPLAYSTATUS: rc = getdisplaystatus(); break;
1317 case OPT_PMON: rc = pmon(); break;
1318 #endif /* UCLINUX */
1319 case OPT_WRITEPHONEBOOK: rc = writephonebook(nargc, nargv);break;
1323 case OPT_ENTERSECURITYCODE: rc = entersecuritycode(optarg); break;
1324 case OPT_GETSECURITYCODESTATUS: rc = getsecuritycodestatus(); break;
1325 case OPT_GETSECURITYCODE: rc = getsecuritycode(optarg); break;
1326 case OPT_GETEEPROM: rc = geteeprom(); break;
1327 case OPT_RESETPHONESETTINGS: rc = resetphonesettings(); break;
1328 case OPT_SETSIMLOCK: rc = setsimlock(); break;
1332 case OPT_SNIFFER: rc = sniff(nargc, nargv); break;
1333 case OPT_DECODEFILE: rc = decodefile(nargc, nargv); break;
1336 // Now, options with arguments
1337 case OPT_SETDATETIME: rc = setdatetime(nargc, nargv); break;
1338 case OPT_SETALARM: rc = setalarm(nargv); break;
1339 case OPT_DIALVOICE: rc = dialvoice(optarg); break;
1340 #endif /* UCLINUX */
1341 case OPT_CANCELCALL: rc = cancelcall(); break;
1343 case OPT_GETCALENDARNOTE: rc = getcalendarnote(nargc, nargv);break;
1344 case OPT_DELCALENDARNOTE: rc = deletecalendarnote(optarg);break;
1345 case OPT_SAVECALENDARNOTE: rc = savecalendarnote(nargc, nargv);break;
1346 case OPT_SENDCALENDARNOTE: rc = sendcalendarnote(nargc, nargv);break;
1347 case OPT_SAVEPHONEBOOKENTRY: rc = savephonebookentry(nargc, nargv);break;
1348 case OPT_SENDPHONEBOOKENTRY: rc = sendphonebookentry(nargc, nargv);break;
1349 case OPT_WRITECALENDARNOTE: rc = writecalendarnote(nargv); break;
1350 #endif /* UCLINUX */
1351 case OPT_GETMEMORY: rc = getmemory(nargc, nargv); break;
1352 case OPT_GETSPEEDDIAL: rc = getspeeddial(optarg); break;
1353 case OPT_SETSPEEDDIAL: rc = setspeeddial(nargv); break;
1355 case OPT_GETSMS: rc = getsms(argc, argv); break;
1356 case OPT_GETSMSSTATUS: rc = getsmsstatus(argc, argv); break;
1357 case OPT_DELETESMS: rc = deletesms(nargc, nargv); break;
1358 case OPT_SENDSMS: rc = sendsms(nargc, nargv); break;
1359 case OPT_SAVESMS: rc = savesms(nargc, nargv); break;
1360 case OPT_DIVERT: rc = divert(nargc, nargv); break;
1361 case OPT_SENDLOGO: rc = sendlogo(nargc, nargv); break;
1362 case OPT_SAVELOGO: rc = savelogo(nargc, nargv); break;
1363 case OPT_GETSMSC: rc = getsmsc(optarg); break;
1364 case OPT_RENAMESMSC: rc = renamesmsc(nargc,nargv); break;
1365 case OPT_NETMONITOR: rc = netmonitor(optarg); break;
1366 #endif /* UCLINUX */
1367 case OPT_IDENTIFY: rc = identify(); break;
1369 case OPT_SETLOGO: rc = setlogo(nargc, nargv); break;
1370 case OPT_GETLOGO: rc = getlogo(nargc, nargv); break;
1371 case OPT_RECEIVESMS: rc = receivesms(nargc, nargv); break;
1372 case OPT_SETRINGTONE: rc = setringtone(nargc, nargv); break;
1373 case OPT_GETRINGTONE: rc = getringtone(nargc, nargv); break;
1374 case OPT_PRESSKEYSEQUENCE: rc = presskeysequence(nargv); break;
1375 case OPT_SENDRINGTONE: rc = sendringtone(nargc, nargv);break;
1376 case OPT_SAVERINGTONE: rc = saveringtone(nargc, nargv);break;
1377 case OPT_GETPROFILE: rc = getprofile(nargc, nargv); break;
1378 case OPT_SETPROFILE: rc = setprofile(nargc, nargv); break;
1379 case OPT_SENDPROFILE: rc = sendprofile(nargc, nargv); break;
1380 case OPT_DISPLAYOUTPUT: rc = displayoutput(); break;
1381 case OPT_RESTORESETTINGS: rc = restoresettings(nargv); break;
1382 case OPT_BACKUPSETTINGS: rc = backupsettings(nargv); break;
1383 case OPT_RINGTONECONVERT: rc = ringtoneconvert(nargc, nargv);break;
1384 case OPT_BINRINGTONECONVERT: rc = binringtoneconvert(nargc, nargv);break;
1385 case OPT_BITMAPCONVERT: rc = bitmapconvert(nargc, nargv);break;
1386 case OPT_SHOWBITMAP: rc = showbitmap(nargc, nargv); break;
1387 case OPT_PLAYRINGTONE: rc = playringtone(nargc, nargv);break;
1388 case OPT_COMPOSER: rc = composer(nargc, nargv); break;
1389 case OPT_FOOGLE: rc = foogle(nargv); break;
1390 case OPT_PHONETESTS: rc = phonetests(); break;
1391 case OPT_SIMLOCKINFO: rc = simlockinfo(); break;
1392 case OPT_SENDDTMF: rc = senddtmf(optarg); break;
1393 #endif /* UCLINUX */
1394 case OPT_RESET: rc = reset(nargc,nargv); break;
1396 case OPT_GETOPERATORNAME: rc = getoperatorname(); break;
1397 case OPT_SETOPERATORNAME: rc = setoperatorname(nargc,nargv);break;
1398 case OPT_GETWAPBOOKMARK: rc = getwapbookmark(nargc,nargv);break;
1399 case OPT_SETWAPBOOKMARK: rc = setwapbookmark(nargc,nargv);break;
1400 case OPT_SAVEWAPBOOKMARK: rc = savewapbookmark(nargc,nargv);break;
1401 case OPT_SENDWAPBOOKMARK: rc = sendwapbookmark(nargc,nargv);break;
1402 case OPT_GETWAPSETTINGS: rc = getwapsettings(nargc,nargv);break;
1403 case OPT_SAVEWAPSETTINGS: rc = savewapsettings(nargc,nargv);break;
1404 case OPT_SENDWAPSETTINGS: rc = sendwapsettings(nargc,nargv);break;
1405 case OPT_ALLRINGTONES: rc = allringtones(); break;
1406 case OPT_GETPHONEPROFILE: rc = getphoneprofile(); break;
1407 case OPT_SETPHONEPROFILE: rc = setphoneprofile(nargc,nargv);break;
1408 case OPT_GETVOICEMAILBOX: rc = getvoicemailbox(); break;
1409 case OPT_NM_COLLECT: rc = nm_collect(nargc, nargv); break;
1410 case OPT_NETMONITORDATA: rc = netmonitordata(nargc, nargv);break;
1411 #endif /* UCLINUX */
1414 case OPT_GNOKIID: rc = gnokiid(nargc, nargv); break;
1415 #endif /* UCLINUX */
1416 default: fprintf(stderr, _("Unknown option: %d\n"), c); break;
1425 fprintf(stderr, _("Wrong number of arguments\n"));
1432 /* Restores various phone settings from one file */
1433 int restoresettings(char *argv[])
1435 fprintf(stdout,_("Work in progress. Not usefull now. Sorry\n"));
1439 /* Backup various phone settings from one file */
1440 int backupsettings(char *argv[])
1442 GSM_PhonebookEntry PbkEntry;
1447 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1448 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1452 fprintf(stderr,_("Backup phonebook from SIM..."));
1453 Backup.SIMPhonebookUsed=0;
1454 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE) {//FIXME
1455 Backup.SIMPhonebookSize=SIMMemoryStatus.Used+SIMMemoryStatus.Free;
1457 PbkEntry.MemoryType=GMT_SM;
1459 for (i=0;i<Backup.SIMPhonebookSize;i++)
1461 if (SIMMemoryStatus.Used==Backup.SIMPhonebookUsed) break;
1463 PbkEntry.Location=i;
1465 error=GSM->GetMemoryLocation(&PbkEntry);
1468 Backup.SIMPhonebook[Backup.SIMPhonebookUsed]=PbkEntry;
1469 Backup.SIMPhonebookUsed++;
1470 fprintf(stderr,_("."));
1476 fprintf(stderr,_("Done\n"));
1477 } else fprintf(stderr,_("ERROR\n"));
1479 fprintf(stderr,_("Backup phonebook from phone..."));
1480 Backup.PhonePhonebookUsed=0;
1481 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE) {
1482 Backup.PhonePhonebookSize=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free;
1484 PbkEntry.MemoryType=GMT_ME;
1486 for (i=0;i<Backup.PhonePhonebookSize;i++)
1488 if (PhoneMemoryStatus.Used==Backup.PhonePhonebookUsed) break;
1490 PbkEntry.Location=i;
1492 error=GSM->GetMemoryLocation(&PbkEntry);
1495 Backup.PhonePhonebook[Backup.PhonePhonebookUsed]=PbkEntry;
1496 Backup.PhonePhonebookUsed++;
1497 fprintf(stderr,_("."));
1503 fprintf(stderr,_("Done\n"));
1504 } else fprintf(stderr,_("ERROR\n"));
1506 if( GetModelFeature (FN_CALLERGROUPS)!=0) {
1507 fprintf(stderr,_("Backup caller logos..."));
1508 Backup.CallerAvailable=true;
1510 Backup.CallerGroups[i].number=i;
1511 Backup.CallerGroups[i].type=GSM_CallerLogo;
1512 if (GSM->GetBitmap(&Backup.CallerGroups[i])!=GE_NONE) return 1;
1514 fprintf(stderr,_("Done\n"));
1515 } else Backup.CallerAvailable=false;
1517 // fprintf(stderr,_("Backup speed dials..."));
1518 Backup.SpeedAvailable=false;
1519 // for (i=0;i<8;i++) {
1520 // Backup.SpeedDials[i].Number=i+1;
1521 // if (GSM->GetSpeedDial(&Backup.SpeedDials[i])!=GE_NONE) return 1;
1523 // fprintf(stderr,_("Done\n"));
1525 fprintf(stderr,_("Backup operator logo..."));
1526 Backup.OperatorLogoAvailable=true;
1527 Backup.OperatorLogo.type=GSM_7110OperatorLogo;
1528 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1529 Backup.OperatorLogoAvailable=true;
1530 Backup.OperatorLogo.type=GSM_OperatorLogo;
1531 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1532 Backup.OperatorLogoAvailable=false;
1533 fprintf(stderr,_("Error\n"));
1534 } else fprintf(stderr,_("Done\n"));
1535 } else fprintf(stderr,_("Done\n"));
1537 Backup.StartupLogoAvailable=false;
1538 if( GetModelFeature (FN_STARTUP)!=0) {
1539 fprintf(stderr,_("Backup startup logo..."));
1540 Backup.StartupLogoAvailable=true;
1541 switch (GetModelFeature (FN_STARTUP)) {
1542 case F_STA62: Backup.StartupLogo.type=GSM_6210StartupLogo;break;
1543 case F_STA71: Backup.StartupLogo.type=GSM_7110StartupLogo;break;
1544 default : Backup.StartupLogo.type=GSM_StartupLogo;break;
1546 if (GSM->GetBitmap(&Backup.StartupLogo)!=GE_NONE) {
1547 Backup.StartupLogoAvailable=false;
1548 fprintf(stderr,_("Error\n"));
1549 } else fprintf(stderr,_("Done\n"));
1552 fprintf(stderr,_("Backup welcome note..."));
1553 Backup.StartupText.type=GSM_WelcomeNoteText;
1554 if (GSM->GetBitmap(&Backup.StartupText)!=GE_NONE) {
1555 fprintf(stderr,_("Error\n"));
1556 } else fprintf(stderr,_("Done\n"));
1560 GSM_SaveBackupFile(argv[0], &Backup);
1565 /* Presses keys on phone's keyboard */
1567 int presskeysequence(char *argv[])
1575 /* We need to make sure that the init is finished to avoid interrupted */
1576 /* multiframe packets... */
1580 for (i=0;i<strlen(argv[0]);i++)
1586 if (key!='w' && key!='W')
1588 while (Keys[j].whatchar!=' ') {
1589 if (Keys[j].whatchar==key) {
1590 keycode=Keys[j].whatcode;
1597 fprintf(stderr,_("Unknown key: %c !\n"),key);
1602 if (GSM->PressKey(keycode,PRESSPHONEKEY)!=GE_NONE)
1604 fprintf(stderr,_("Can't press key !\n"));
1608 if (GSM->PressKey(keycode,RELEASEPHONEKEY)!=GE_NONE)
1610 fprintf(stderr,_("Can't release key !\n"));
1625 /* Send SMS messages. */
1626 int sendsms(int argc, char *argv[])
1628 GSM_MultiSMSMessage MultiSMS;
1629 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1630 int input_len, chars_read,i,msgnum;
1632 GSM_SMSMessageType SMSType=GST_SMS;
1633 int SMSValidity= 4320; /* 4320 minutes == 72 hours */
1634 bool SMSReply=false;
1635 int SMSClass=-1,SMSCenter=1;
1636 char SMSCNumber[100];
1637 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1638 GSM_UDH SMSUDHType=GSM_NoUDH;
1640 struct option options[] = {
1641 { "smscno", required_argument, NULL, '1'},
1642 { "smsc", required_argument, NULL, '2'},
1643 { "long", required_argument, NULL, '3'},
1644 { "enablevoice", no_argument, NULL, '4'},
1645 { "disablevoice", no_argument, NULL, '5'},
1646 { "enableemail", no_argument, NULL, '6'},
1647 { "disableemail", no_argument, NULL, '7'},
1648 { "enablefax", no_argument, NULL, '8'},
1649 { "disablefax", no_argument, NULL, '9'},
1650 { "unicode", no_argument, NULL, '-'},
1651 { "void", no_argument, NULL, '+'},
1652 { "hang", no_argument, NULL, '('},
1653 { "bug", no_argument, NULL, ')'},
1657 input_len = GSM_MAX_SMS_LENGTH;
1664 while ((i = getopt_long(argc, argv, "v:dsC:", options, NULL)) != -1) {
1667 case '1': /* SMSC number */
1669 strcpy(SMSCNumber,optarg);
1672 case '2': /* SMSC number index in phone memory */
1673 SMSCenter = atoi(optarg);
1675 if (SMSCenter < 1 || SMSCenter > 5) {
1676 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1682 case '3': /* we send long message */
1683 SMSUDHType=GSM_ConcatenatedMessages;
1684 input_len = atoi(optarg);
1685 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1686 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1691 case '4': /* SMS enables voice indicator */
1692 SMSUDHType=GSM_EnableVoice; break;
1694 case '5': /* SMS disables voice indicator */
1695 SMSUDHType=GSM_DisableVoice; break;
1697 case '6': /* SMS enables email indicator */
1698 SMSUDHType=GSM_EnableEmail; break;
1700 case '7': /* SMS disables email indicator */
1701 SMSUDHType=GSM_DisableEmail; break;
1703 case '8': /* SMS enables fax indicator */
1704 SMSUDHType=GSM_EnableFax; break;
1706 case '9': /* SMS disables fax indicator */
1707 SMSUDHType=GSM_DisableFax; break;
1709 case '-': /* SMS coding type */
1710 SMSCoding=GSM_Coding_Unicode; break;
1712 case '+': /* SMS ghost */
1713 SMSUDHType=GSM_VoidSMS; break;
1715 case '(': /* SMS hanging phone, when saved to Outbox */
1716 SMSUDHType=GSM_HangSMS; break;
1718 case ')': /* SMS showed incorrectly in phone */
1719 SMSUDHType=GSM_BugSMS; break;
1721 case 'v': /* Set validaty of SMS */
1722 SMSValidity = atoi(optarg); break;
1724 case 'd': /* delivery report */
1725 SMSType=GST_DR; break;
1727 case 's': /* Set replying via the same SMSC */
1728 SMSReply = true; break;
1730 case 'C': /* class Message */
1732 if (SMSUDHType!=GSM_NoUDH) {
1733 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1738 case '0': SMSClass = 0; break;
1739 case '1': SMSClass = 1; break;
1740 case '2': SMSClass = 2; break;
1741 case '3': SMSClass = 3; break;
1743 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1749 fprintf(stderr,_("Unknown option number %i\n"),argc);
1755 /* Get message text from stdin. */
1756 chars_read = fread(message_buffer, 1, input_len, stdin);
1758 if (chars_read == 0) {
1759 fprintf(stderr, _("Couldn't read from stdin!\n"));
1762 if (chars_read > input_len) {
1763 fprintf(stderr, _("Input too long!\n"));
1767 /* Null terminate. */
1768 message_buffer[chars_read] = 0x00;
1770 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1771 msgnum=MultiSMS.number;
1773 switch (SMSUDHType) {
1778 case GSM_EnableVoice:
1779 case GSM_DisableVoice:
1781 case GSM_DisableFax:
1782 case GSM_EnableEmail:
1783 case GSM_DisableEmail:
1784 fprintf(stdout,_("Warning: saving %ld chars\n"),(long)strlen(MultiSMS.SMS[0].MessageText));
1791 for (i=0;i<msgnum;i++) {
1792 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1794 MultiSMS.SMS[i].Class=SMSClass;
1795 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
1796 MultiSMS.SMS[i].Type=SMSType;
1797 MultiSMS.SMS[i].Validity=SMSValidity;
1800 /* Initialise the GSM interface. */
1803 MultiSMS.number=msgnum;
1804 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,false,false,false);
1809 int savesms(int argc, char *argv[])
1811 GSM_MultiSMSMessage MultiSMS;
1812 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1813 int input_len, chars_read,i,msgnum;
1815 int SMSClass=-1,SMSCenter=1;
1817 char SMSCNumber[100];
1818 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1819 GSM_UDH SMSUDHType=GSM_NoUDH;
1820 GSM_SMSMessageStatus SMSStatus;
1822 bool SMSReply=false;
1824 bool interactive=false;
1826 struct option options[] = {
1827 { "smscno", required_argument, NULL, '1'},
1828 { "smsc", required_argument, NULL, '2'},
1829 { "long", required_argument, NULL, '3'},
1830 { "enablevoice", no_argument, NULL, '4'},
1831 { "disablevoice", no_argument, NULL, '5'},
1832 { "enableemail", no_argument, NULL, '6'},
1833 { "disableemail", no_argument, NULL, '7'},
1834 { "enablefax", no_argument, NULL, '8'},
1835 { "disablefax", no_argument, NULL, '9'},
1836 { "unicode", no_argument, NULL, '-'},
1837 { "void", no_argument, NULL, '+'},
1838 { "hang", no_argument, NULL, '('},
1839 { "bug", no_argument, NULL, ')'},
1840 { "smsname", required_argument, NULL, '/'},
1846 SMSStatus=GSS_NOTSENTREAD;
1847 SMSFolder=GST_OUTBOX;
1849 input_len = GSM_MAX_SMS_LENGTH;
1856 while ((i = getopt_long(argc, argv, "risal:C:F:", options, NULL)) != -1) {
1859 case '1': /* SMSC number */
1861 strcpy(SMSCNumber,optarg);
1864 case '2': /* SMSC number index in phone memory */
1865 SMSCenter = atoi(optarg);
1867 if (SMSCenter < 1 || SMSCenter > 5) {
1868 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1874 case '3': /* we send long message */
1875 SMSUDHType=GSM_ConcatenatedMessages;
1876 input_len = atoi(optarg);
1877 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1878 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1883 case '4': /* SMS enables voice indicator */
1884 SMSUDHType=GSM_EnableVoice; break;
1886 case '5': /* SMS disables voice indicator */
1887 SMSUDHType=GSM_DisableVoice; break;
1889 case '6': /* SMS enables email indicator */
1890 SMSUDHType=GSM_EnableEmail; break;
1892 case '7': /* SMS disables email indicator */
1893 SMSUDHType=GSM_DisableEmail; break;
1895 case '8': /* SMS enables fax indicator */
1896 SMSUDHType=GSM_EnableFax; break;
1898 case '9': /* SMS disables fax indicator */
1899 SMSUDHType=GSM_DisableFax; break;
1901 case '-': /* SMS coding type */
1902 SMSCoding=GSM_Coding_Unicode; break;
1904 case '+': /* SMS ghost */
1905 SMSUDHType=GSM_VoidSMS; break;
1907 case '(': /* SMS hanging phone, when saved to Outbox */
1908 SMSUDHType=GSM_HangSMS; break;
1910 case ')': /* SMS showed incorrectly in phone */
1911 SMSUDHType=GSM_BugSMS; break;
1913 case 'r': /* mark as read */
1914 SMSStatus = GSS_SENTREAD; break;
1916 case 'i': /* Save into Inbox */
1917 SMSFolder = GST_INBOX; break;
1919 case 's': /* Set replying via the same SMSC */
1920 SMSReply = true; break;
1922 case 'a': /* Ask before overwriting */
1923 interactive=true;break;
1925 case 'l': /* Specify location */
1926 SMSLocation = atoi(optarg); break;
1928 case '/': /* Name */
1929 strncpy(SMSName,optarg,25);break;
1931 case 'C': /* class Message */
1933 if (SMSUDHType!=GSM_NoUDH) {
1934 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1939 case '0': SMSClass = 0; break;
1940 case '1': SMSClass = 1; break;
1941 case '2': SMSClass = 2; break;
1942 case '3': SMSClass = 3; break;
1944 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1949 case 'F': /* save into folder n */
1950 SMSFolder = atoi(optarg);
1954 fprintf(stderr,_("Unknown option number %i\n"),argc);
1960 /* Get message text from stdin. */
1961 chars_read = fread(message_buffer, 1, input_len, stdin);
1963 if (chars_read == 0) {
1964 fprintf(stderr, _("Couldn't read from stdin!\n"));
1967 if (chars_read > input_len) {
1968 fprintf(stderr, _("Input too long!\n"));
1972 /* Null terminate. */
1973 message_buffer[chars_read] = 0x00;
1975 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1976 msgnum=MultiSMS.number;
1978 switch (SMSUDHType) {
1983 case GSM_EnableVoice:
1984 case GSM_DisableVoice:
1986 case GSM_DisableFax:
1987 case GSM_EnableEmail:
1988 case GSM_DisableEmail:
1989 fprintf(stdout,_("Warning: saving %ld chars\n"),(long)strlen(MultiSMS.SMS[0].MessageText));
1996 for (i=0;i<msgnum;i++) {
1997 MultiSMS.SMS[i].Destination[0]=0;
1998 if (argc!=0) strcpy(MultiSMS.SMS[i].Destination,argv[0]);
2000 MultiSMS.SMS[i].Location=0;
2001 MultiSMS.SMS[i].Class=SMSClass;
2002 MultiSMS.SMS[i].MessageCenter.No=SMSCenter;
2003 strcpy(MultiSMS.SMS[i].MessageCenter.Number,SMSCNumber);
2004 MultiSMS.SMS[i].Status=SMSStatus;
2005 strcpy(MultiSMS.SMS[i].Name,SMSName);
2006 MultiSMS.SMS[i].folder=SMSFolder;
2007 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
2010 MultiSMS.SMS[0].Location=SMSLocation;
2012 /* Initialise the GSM interface. */
2015 MultiSMS.number=msgnum;
2016 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,interactive,false,false,false);
2021 /* Get SMSC number */
2023 int getsmsc(char *MessageCenterNumber)
2026 GSM_MessageCenter MessageCenter;
2028 MessageCenter.No=atoi(MessageCenterNumber);
2032 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
2034 fprintf(stdout, _("%d. SMS center ("),MessageCenter.No);
2036 if (!strcmp(MessageCenter.Name,""))
2037 fprintf(stdout,_("Set %d"),MessageCenter.No);
2038 else fprintf(stdout,_("%s"),MessageCenter.Name);
2040 fprintf(stdout,_(") number is "));
2042 if (!strcmp(MessageCenter.Number,"")) fprintf(stdout,_("not set\n"));
2043 else fprintf(stdout,_("%s\n"),MessageCenter.Number);
2045 fprintf(stdout,_("Default recipient number is "));
2047 if (!strcmp(MessageCenter.DefaultRecipient,""))
2048 fprintf(stdout,_("not set\n"));
2049 else fprintf(stdout,_("%s\n"),MessageCenter.DefaultRecipient);
2051 fprintf(stdout, _("Messages sent as "));
2053 switch (MessageCenter.Format) {
2054 case GSMF_Text :fprintf(stdout, _("Text"));break;
2055 case GSMF_Paging:fprintf(stdout, _("Paging"));break;
2056 case GSMF_Fax :fprintf(stdout, _("Fax"));break;
2058 case GSMF_UCI :fprintf(stdout, _("Email"));break;
2059 case GSMF_ERMES :fprintf(stdout, _("ERMES"));break;
2060 case GSMF_X400 :fprintf(stdout, _("X.400"));break;
2061 default :fprintf(stdout, _("Unknown"));
2066 fprintf(stdout, _("Message validity is "));
2068 switch (MessageCenter.Validity) {
2069 case GSMV_1_Hour :fprintf(stdout, _("1 hour"));break;
2070 case GSMV_6_Hours :fprintf(stdout, _("6 hours"));break;
2071 case GSMV_24_Hours:fprintf(stdout, _("24 hours"));break;
2072 case GSMV_72_Hours:fprintf(stdout, _("72 hours"));break;
2073 case GSMV_1_Week :fprintf(stdout, _("1 week"));break;
2074 case GSMV_Max_Time:fprintf(stdout, _("Maximum time"));break;
2075 default :fprintf(stdout, _("Unknown"));
2078 fprintf(stdout, "\n");
2082 fprintf(stdout, _("SMS center can not be found :-(\n"));
2089 /* Get SMS messages. */
2090 int getsms(int argc, char *argv[])
2093 GSM_SMSMessage message;
2094 GSM_WAPBookmark bookmark;
2095 char memory_type_string[20];
2096 int start_message, end_message, count, mode = 1;
2100 GSM_Ringtone ringtone;
2101 GSM_SMSFolders folders;
2103 int confirm = -1, i;
2106 /* Handle command line args that set type, start and end locations. */
2107 if (!GetMemoryTypeID(argv[2], &message.MemoryType))
2109 fprintf(stderr, _("Unknown memory type %s!\n"), argv[2]);
2112 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2114 for (i=0;i<64;i++) filename[i]=0;
2116 start_message = atoi(argv[3]);
2120 /* [end] can be only argv[4] */
2121 if (argv[4][0] == '-') {
2122 end_message = start_message;
2124 end_message = atoi(argv[4]);
2127 /* parse all options (beginning with '-' */
2128 while ((i = getopt(argc, argv, "f:")) != -1) {
2133 fprintf(stderr, _("Saving into file \"%s\"\n"), optarg);
2135 strncpy(filename, optarg, 64);
2136 if (strlen(optarg) > 63) {
2137 fprintf(stderr, _("Filename too long - will be truncated to 63 characters.\n"));
2140 filename[strlen(optarg)] = 0;
2153 end_message = start_message;
2156 /* Initialise the code for the GSM interface. */
2160 GSM->GetSMSFolders(&folders);
2163 /* Now retrieve the requested entries. */
2165 for (count = start_message; count <= end_message; count ++) {
2167 message.Location = count;
2169 error = GSM->GetSMSMessage(&message);
2175 switch (message.Type) {
2179 /* RTH FIXME: Test that out ! */
2180 fprintf(stdout, _("%d. Delivery Report "), message.MessageNumber);
2181 switch (message.Status)
2184 if (message.folder==0) //GST_INBOX
2185 fprintf(stdout, _("(read)\n"));
2187 fprintf(stdout, _("(sent)\n"));
2189 case GSS_NOTSENTREAD:
2190 if (message.folder==0) //GST_INBOX
2191 fprintf(stdout, _("(unread)\n"));
2193 fprintf(stdout, _("(not sent)\n"));
2196 fprintf(stdout, _("(not known :-()\n"));
2199 fprintf(stdout, _("(template)\n"));
2202 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2206 fprintf(stdout, _("Sending date/time : %s %02d/%02d/%02d %d:%02d:%02d "), \
2207 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2208 message.Time.Day, message.Time.Month, message.Time.Year, \
2209 message.Time.Hour, message.Time.Minute, message.Time.Second);
2211 if (message.Time.Timezone) {
2212 if (message.Time.Timezone > 0)
2213 fprintf(stdout,_("+%02d00"), message.Time.Timezone);
2215 fprintf(stdout,_("%02d00"), message.Time.Timezone);
2218 fprintf(stdout, "\n");
2220 fprintf(stdout, _("Response date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2221 DayOfWeek(message.SMSCTime.Year, message.SMSCTime.Month, message.SMSCTime.Day), \
2222 message.SMSCTime.Day, message.SMSCTime.Month, message.SMSCTime.Year, \
2223 message.SMSCTime.Hour, message.SMSCTime.Minute, message.SMSCTime.Second);
2225 if (message.SMSCTime.Timezone) {
2226 if (message.SMSCTime.Timezone > 0)
2227 fprintf(stdout,_("+%02d00"),message.SMSCTime.Timezone);
2229 fprintf(stdout,_("%02d00"),message.SMSCTime.Timezone);
2232 fprintf(stdout, "\n");
2234 fprintf(stdout, _("Receiver: %s Msg Center: %s\n"), message.Sender, message.MessageCenter.Number);
2235 fprintf(stdout, _("Text: %s\n\n"), message.MessageText);
2240 fprintf(stdout, _("%d. %s Message "), message.MessageNumber,
2241 folders.Folder[message.folder].Name);
2243 switch (message.Status)
2246 if (message.folder==0) //GST_INBOX
2247 fprintf(stdout, _("(read)\n"));
2249 fprintf(stdout, _("(sent)\n"));
2251 case GSS_NOTSENTREAD:
2252 if (message.folder==0) //GST_INBOX
2253 fprintf(stdout, _("(unread)\n"));
2255 fprintf(stdout, _("(not sent)\n"));
2258 fprintf(stdout, _("(not known :-()\n"));
2261 fprintf(stdout, _("(template)\n"));
2264 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2268 /* RTH FIXME: date for other status ok ? */
2269 if (message.SMSData) {
2271 fprintf(stdout, _("Date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2272 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2273 message.Time.Day, message.Time.Month, message.Time.Year, \
2274 message.Time.Hour, message.Time.Minute, message.Time.Second);
2276 if (message.Time.Timezone) {
2277 if (message.Time.Timezone > 0)
2278 fprintf(stdout,_("+%02d00"),message.Time.Timezone);
2280 fprintf(stdout,_("%02d00"),message.Time.Timezone);
2283 fprintf(stdout, "\n");
2285 fprintf(stdout, _("Msg Center: %s "), message.MessageCenter.Number);
2287 if (message.ReplyViaSameSMSC)
2288 fprintf(stdout, _("(centre set for reply) "));
2291 if (strcmp(message.Sender,"")) {
2292 if (message.folder==1) { //GST_OUTBOX
2293 fprintf(stdout, _("Recipient: %s"),message.Sender);
2295 fprintf(stdout, _("Sender: %s"),message.Sender);
2299 if (strcmp(message.Sender,"") || message.folder==0)
2300 fprintf(stdout, "\n");
2302 switch (message.UDHType) {
2306 /* put bitmap into bitmap structure */
2307 switch (GSM_ReadBitmap(&message, &bitmap)) {
2308 case GE_INVALIDIMAGESIZE:
2309 fprintf(stdout,_("Image size not supported\n"));
2312 fprintf(stdout, _("GSM operator logo for %s (%s) network.\n"), bitmap.netcode, GSM_GetNetworkName(bitmap.netcode));
2314 GSM_PrintBitmap(&bitmap);
2316 if (filename[0]!=0) {
2317 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2322 fprintf(stdout,_("Error reading image\n"));
2327 if (message.folder==0) { //GST_INBOX
2328 if (!strcmp(message.Sender, "+998000005") &&
2329 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2330 message.Time.Day==27 &&
2331 message.Time.Month==7 &&
2332 message.Time.Year==99 &&
2333 message.Time.Hour==0 &&
2334 message.Time.Minute==10 &&
2335 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2337 /* Is it changed in next versions ? Or what ? */
2338 if (!strcmp(message.Sender, "+998000002") ||
2339 !strcmp(message.Sender, "+998000003") ||
2340 !strcmp(message.Sender, "+998000004")) fprintf(stdout, _("Saved by Operator Logo Uploader by Thomas Kessler\n"));
2342 if (!strcmp(message.Sender, "+8861234567890") &&
2343 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2345 if (!strncmp(message.Sender, "OpLogo",6) &&
2346 strlen(message.Sender)==11)
2347 fprintf(stdout, _("Saved by gnokii\n"));
2352 case GSM_WAPBookmarkUDH:
2354 /* put bookmark into bookmark structure */
2355 switch (GSM_ReadWAPBookmark(&message, &bookmark)) {
2357 fprintf(stdout, ("WAP Bookmark\n"));
2359 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
2361 if (bookmark.title[0]==0)
2362 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
2364 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
2368 fprintf(stdout,_("Error reading WAP Bookmark\n"));
2373 if (!strcmp(message.Sender, "WAPBookmark"))
2374 fprintf(stdout, _("Saved by gnokii\n"));
2379 case GSM_CallerIDLogo:
2381 /* put bitmap into bitmap structure */
2382 switch (GSM_ReadBitmap(&message, &bitmap)) {
2383 case GE_INVALIDIMAGESIZE:
2384 fprintf(stdout,_("Image size not supported\n"));
2387 fprintf(stdout, ("Caller Logo\n"));
2389 GSM_PrintBitmap(&bitmap);
2391 if (filename[0]!=0) {
2392 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2397 fprintf(stdout,_("Error reading image\n"));
2402 if (message.folder==0) { //GST_INBOX
2403 if (!strcmp(message.Sender, "+998000005") &&
2404 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2405 message.Time.Day==27 &&
2406 message.Time.Month==7 &&
2407 message.Time.Year==99 &&
2408 message.Time.Hour==0 &&
2409 message.Time.Minute==10 &&
2410 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2412 if (!strcmp(message.Sender, "+8861234567890") &&
2413 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2415 if (!strcmp(message.Sender, "GroupLogo"))
2416 fprintf(stdout, _("Saved by gnokii\n"));
2421 case GSM_ProfileUDH:
2422 fprintf(stdout, ("Profile SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2425 case GSM_WAPBookmarkUDHLong:
2426 fprintf(stdout, ("WAP Bookmark, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2429 case GSM_WAPSettingsUDH:
2430 fprintf(stdout, ("WAP Settings, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2433 case GSM_RingtoneUDH:
2435 /* put ringtone into ringtone structure */
2436 switch (GSM_ReadRingtone(&message, &ringtone)) {
2439 fprintf(stdout, ("Ringtone \"%s\"\n"),ringtone.name);
2441 while (confirm < 0) {
2442 fprintf(stderr, _("Do you want to play it ? (yes/no) "));
2443 GetLine(stdin, ans, 7);
2444 if (!strcmp(ans, "yes")) confirm = 1;
2445 if (!strcmp(ans, "no")) confirm = 0;
2448 if (confirm==1) GSM_PlayRingtoneOnConsole(&ringtone);
2450 if (filename[0]!=0) GSM_SaveRingtoneFileOnConsole(filename, &ringtone);
2455 fprintf(stdout,_("Gnokii can't read this ringtone - there is probably error inside\n"));
2461 case GSM_CalendarNoteUDH:
2462 fprintf(stdout, ("Calendar note SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2463 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2464 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2467 case GSM_ConcatenatedMessages:
2468 fprintf(stdout, _("Linked (%d/%d)\nText:\n%s\n\n"),message.UDH[5],message.UDH[4], message.MessageText);
2469 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2472 case GSM_EnableVoice:
2473 fprintf(stdout, _("Enables voice indicator\nText:\n%s\n\n"), message.MessageText);
2474 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2477 case GSM_DisableVoice:
2478 fprintf(stdout, _("Disables voice indicator\nText:\n%s\n\n"), message.MessageText);
2479 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2483 fprintf(stdout, _("Enables fax indicator\nText:\n%s\n\n"), message.MessageText);
2484 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2487 case GSM_DisableFax:
2488 fprintf(stdout, _("Disables fax indicator\nText:\n%s\n\n"), message.MessageText);
2489 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2492 case GSM_EnableEmail:
2493 fprintf(stdout, _("Enables email indicator\nText:\n%s\n\n"), message.MessageText);
2494 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2497 case GSM_DisableEmail:
2498 fprintf(stdout, _("Disables email indicator\nText:\n%s\n\n"), message.MessageText);
2499 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2503 fprintf(stdout, _("Void SMS\nText:\n%s\n\n"), message.MessageText);
2504 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2508 if (message.Coding!=GSM_Coding_8bit) {
2509 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2510 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2512 fprintf(stdout, _("Message cannot be displayed here\n")); // like in phone :-)
2516 default: //GSM_UnknownUDH and other
2517 fprintf(stderr, _("Unknown\n"));
2523 fprintf(stdout,_("Unknown SMS type. Report it\n"));
2529 case GE_NOTIMPLEMENTED:
2531 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2535 case GE_INVALIDSMSLOCATION:
2537 fprintf(stderr, _("Invalid location: %s %d\n"), memory_type_string, count);
2541 case GE_EMPTYSMSLOCATION:
2543 fprintf(stderr, _("SMS location %s %d empty.\n"), memory_type_string, count);
2549 fprintf(stderr, _("No access to %s memory.\n"), memory_type_string);
2555 fprintf(stderr, _("GetSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2564 int getsmsstatus(int argc, char *argv[])
2566 GSM_SMSStatus SMSStatus;
2567 GSM_SMSFolders folders;
2573 /* Initialise the code for the GSM interface. */
2576 error = GSM->GetSMSStatus(&SMSStatus);
2577 if (error!=GE_NONE) return error;
2579 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"),SMSStatus.UnRead, SMSStatus.Number);
2581 error=GSM->GetSMSFolders(&folders);
2582 if (error!=GE_NONE) return error;
2584 /* For not 7110 compatible phones we have to read all SMS and prepare sms table */
2585 if( GetModelFeature (FN_SMS)!=F_SMS71 )
2589 if (j==SMSStatus.Number) break;
2591 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
2592 SMSStatus.foldertable[j].smsnum=i;
2594 /* We set such folders ID like in 7110 compatible phones */
2595 if (SMS.Status==GSS_NOTSENTREAD && SMS.folder==0) //GST_INBOX
2596 SMSStatus.foldertable[j].folder=0;
2598 switch (SMS.folder) {
2600 SMSStatus.foldertable[j].folder=GST_7110_INBOX;
2603 SMSStatus.foldertable[j].folder=GST_7110_OUTBOX;
2613 printf("0.Unread : ");
2614 for(j=0; j<SMSStatus.Number; j++)
2616 if (SMSStatus.foldertable[j].folder == 0)
2617 printf("%d ",SMSStatus.foldertable[j].smsnum);
2621 for (i=0;i<folders.number;i++) {
2622 fprintf(stdout,_("%d.%-15s: "),i+1,folders.Folder[i].Name);
2623 for(j=0; j<SMSStatus.Number; j++)
2625 if ( SMSStatus.foldertable[j].folder / 8 == i+1)
2626 printf("%d ",SMSStatus.foldertable[j].smsnum);
2636 /* Delete SMS messages. */
2637 int deletesms(int argc, char *argv[])
2640 GSM_SMSMessage message;
2641 char memory_type_string[20];
2642 int start_message, end_message, count;
2645 /* Handle command line args that set type, start and end locations. */
2646 if (!GetMemoryTypeID(argv[0], &message.MemoryType))
2648 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
2651 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2653 start_message = atoi (argv[1]);
2654 if (argc > 2) end_message = atoi (argv[2]);
2655 else end_message = start_message;
2657 /* Initialise the code for the GSM interface. */
2661 /* Now delete the requested entries. */
2663 for (count = start_message; count <= end_message; count ++) {
2665 message.Location = count;
2667 error = GSM->DeleteSMSMessage(&message);
2669 if (error == GE_NONE)
2670 fprintf(stdout, _("Deleted SMS %s %d\n"), memory_type_string, count);
2672 if (error == GE_NOTIMPLEMENTED) {
2673 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2677 fprintf(stdout, _("DeleteSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2686 static volatile bool bshutdown = false;
2688 /* SIGINT signal handler. */
2690 static void interrupted(int sig)
2693 signal(sig, SIG_IGN);
2700 /* In this mode we get the code from the keyboard and send it to the mobile
2703 int entersecuritycode(char *type)
2706 GSM_SecurityCode SecurityCode;
2708 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2709 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2710 else if (!strcmp(type,"PIN2"))SecurityCode.Type=GSCT_Pin2;
2711 else if (!strcmp(type,"PUK2"))SecurityCode.Type=GSCT_Puk2;
2713 // FIXME: Entering of SecurityCode does not work :-(
2714 // else if (!strcmp(type,"SecurityCode"))
2715 // SecurityCode.Type=GSCT_SecurityCode;
2718 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2723 printf("Enter your code: ");
2724 gets(SecurityCode.Code);
2726 strcpy(SecurityCode.Code,getpass(_("Enter your code: ")));
2731 test = GSM->EnterSecurityCode(SecurityCode);
2733 fprintf(stdout,_("Code OK !\n"));
2735 fprintf(stderr,_("%s\n"),print_error(test));
2742 int getsecuritycodestatus(void)
2749 if (GSM->GetSecurityCodeStatus(&Status) == GE_NONE) {
2751 fprintf(stdout, _("Security code status: "));
2754 case GSCT_SecurityCode:fprintf(stdout, _("waiting for Security Code.\n"));break;
2755 case GSCT_Pin: fprintf(stdout, _("waiting for PIN.\n")); break;
2756 case GSCT_Pin2: fprintf(stdout, _("waiting for PIN2.\n")); break;
2757 case GSCT_Puk: fprintf(stdout, _("waiting for PUK.\n")); break;
2758 case GSCT_Puk2: fprintf(stdout, _("waiting for PUK2.\n")); break;
2759 case GSCT_None: fprintf(stdout, _("nothing to enter.\n")); break;
2760 default: fprintf(stdout, _("Unknown!\n"));
2769 int getsecuritycode(char *type)
2772 GSM_SecurityCode SecurityCode;
2775 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2776 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2777 else if (!strcmp(type,"PIN2")) SecurityCode.Type=GSCT_Pin2;
2778 else if (!strcmp(type,"PUK2")) SecurityCode.Type=GSCT_Puk2;
2779 else if (!strcmp(type,"SecurityCode"))SecurityCode.Type=GSCT_SecurityCode;
2781 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2787 error=GSM->GetSecurityCode(&SecurityCode);
2790 case GE_INVALIDSECURITYCODE:
2791 fprintf(stdout, _("Error: getting "));
2792 switch (SecurityCode.Type) {
2793 case GSCT_SecurityCode:fprintf(stdout, _("security code"));break;
2794 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2795 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2796 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2797 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2800 fprintf(stdout, _(" not allowed\n"));
2803 switch (SecurityCode.Type) {
2804 case GSCT_SecurityCode:fprintf(stdout, _("Security code"));break;
2805 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2806 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2807 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2808 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2811 fprintf(stdout, _(" is %s\n"),SecurityCode.Code);
2814 fprintf(stderr, _("%s\n"),print_error(error));
2825 /* Voice dialing mode. */
2827 int dialvoice(char *Number)
2831 if (GSM->DialVoice(Number)!=GE_NONE) fprintf(stdout,_("Error!\n"));
2838 #endif /* UCLINUX */
2841 static int cancelcall(void)
2845 if (GSM->CancelCall()!=GE_NONE) fprintf(stdout,_("Error!\n"));
2854 int savelogo(int argc, char *argv[])
2857 GSM_NetworkInfo NetworkInfo;
2858 GSM_MultiSMSMessage MultiSMS;
2860 /* Operator logos will be saved with this number */
2861 char oplogonumber[]={'O','p','L','o','g','o',
2862 '0','0','0','0','0', /* MMC+MNC */
2866 bool UnicodeText=false;
2868 /* The first argument is the type of the logo. */
2869 if (!strcmp(argv[0], "op")) {
2870 fprintf(stdout, _("Saving operator logo.\n"));
2871 } else if (!strcmp(argv[0], "caller")) {
2872 fprintf(stdout, _("Saving caller line identification logo.\n"));
2873 } else if (!strcmp(argv[0], "startup")) {
2874 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2876 } else if (!strcmp(argv[0], "7110startup")) {
2877 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2879 } else if (!strcmp(argv[0], "6210startup")) {
2880 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2882 } else if (!strcmp(argv[0], "7110op")) {
2883 fprintf(stderr, _("It isn't possible to save big operator logos!\n"));
2885 } else if (!strcmp(argv[0], "picture")) {
2886 fprintf(stderr, _("Saving picture image.\n"));
2887 } else if (!strcmp(argv[0], "screensaver")) {
2888 fprintf(stderr, _("Saving screen saver.\n"));
2890 fprintf(stderr, _("You should specify what kind of logo to save!\n"));
2894 /* The second argument is the bitmap file. */
2895 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return -1;
2897 /* Initialise the GSM interface. */
2900 /* We check optional parameters from 2'rd */
2903 if (!strcmp(argv[0], "op")) {
2904 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2906 /* The third argument, if present, is the Network code of the operator.
2907 * Network code is in this format: "xxx yy" */
2909 strcpy(bitmap.netcode, argv[2]);
2911 fprintf(stdout, _("Operator code: %s\n"), argv[2]);
2913 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
2914 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
2921 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
2923 bitmap.type=GSM_OperatorLogo;
2925 /* Put bitmap into SMS structure */
2926 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2928 oplogonumber[6]=bitmap.netcode[0];
2929 oplogonumber[7]=bitmap.netcode[1];
2930 oplogonumber[8]=bitmap.netcode[2];
2931 oplogonumber[9]=bitmap.netcode[4];
2932 oplogonumber[10]=bitmap.netcode[5];
2933 for(i=0;i<MultiSMS.number;i++)
2934 strcpy(MultiSMS.SMS[i].Destination,oplogonumber);
2936 if (!strcmp(argv[0], "caller")) {
2937 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2939 bitmap.type=GSM_CallerLogo;
2941 /* Put bitmap into SMS structure */
2942 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2944 for(i=0;i<MultiSMS.number;i++)
2945 strcpy(MultiSMS.SMS[i].Destination,"GroupLogo");
2947 if (!strcmp(argv[0], "screensaver")) {
2948 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2953 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2955 /* Put bitmap into SMS structure */
2956 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,true,UnicodeText);
2958 for(i=0;i<MultiSMS.number;i++)
2959 strcpy(MultiSMS.SMS[i].Destination,"ScreenSaver");
2961 if (!strcmp(argv[0], "picture")) {
2962 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2965 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2970 if (strlen(argv[2])>121) {
2971 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[2]);
2974 strcpy(bitmap.text,argv[2]);
2977 /* Put bitmap into SMS structure */
2978 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,UnicodeText);
2980 for(i=0;i<MultiSMS.number;i++)
2981 strcpy(MultiSMS.SMS[i].Destination,"Picture");
2984 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,true,false,false);
2989 /* The following function allows to send logos using SMS */
2990 int sendlogo(int argc, char *argv[])
2993 GSM_NetworkInfo NetworkInfo;
2994 GSM_MultiSMSMessage MultiSMS;
2998 bool UnicodeText=false;
2999 bool ScreenSaver=false;
3001 /* The first argument is the type of the logo. */
3002 if (!strcmp(argv[0], "op")) {
3003 fprintf(stdout, _("Sending operator logo.\n"));
3004 } else if (!strcmp(argv[0], "caller")) {
3005 fprintf(stdout, _("Sending caller line identification logo.\n"));
3006 } else if (!strcmp(argv[0], "picture")) {
3007 fprintf(stdout, _("Sending picture image.\n"));
3008 } else if (!strcmp(argv[0], "screensaver")) {
3009 fprintf(stdout, _("Sending screen saver.\n"));
3010 } else if (!strcmp(argv[0], "startup")) {
3011 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3013 } else if (!strcmp(argv[0], "7110startup")) {
3014 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3016 } else if (!strcmp(argv[0], "6210startup")) {
3017 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3019 } else if (!strcmp(argv[0], "7110op")) {
3020 fprintf(stderr, _("It isn't possible to send big operator logos!\n"));
3023 fprintf(stderr, _("You should specify what kind of logo to send!\n"));
3027 /* The third argument is the bitmap file. */
3028 if (GSM_ReadBitmapFileOnConsole(argv[2], &bitmap)!=GE_NONE) return -1;
3030 /* Initialise the GSM interface. */
3035 if (!strcmp(argv[0], "op")) {
3036 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3038 /* The third argument, if present, is the Network code of the operator.
3039 * Network code is in this format: "xxx yy" */
3041 strcpy(bitmap.netcode, argv[3]);
3043 fprintf(stdout, _("Operator code: %s\n"), argv[3]);
3045 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
3046 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3053 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3055 bitmap.type=GSM_OperatorLogo;
3057 if (!strcmp(argv[0], "caller")) {
3058 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3060 bitmap.type=GSM_CallerLogo;
3062 if (!strcmp(argv[0], "screensaver")) {
3063 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3068 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3072 if (!strcmp(argv[0], "picture")) {
3073 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3076 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3081 if (strlen(argv[3])>121) {
3082 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[3]);
3085 strcpy(bitmap.text,argv[3]);
3089 /* Put bitmap into SMS structure */
3090 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,ScreenSaver,UnicodeText);
3092 /* The second argument is the destination, ie the phone number of recipient. */
3093 for(i=0;i<MultiSMS.number;i++)
3094 strcpy(MultiSMS.SMS[i].Destination,argv[1]);
3096 GSM_SendMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,true,false,false);
3101 /* Getting logos. */
3103 int getlogo(int argc, char *argv[])
3109 bitmap.type=GSM_None;
3111 if (!strcmp(argv[0],"7110op"))
3112 bitmap.type=GSM_7110OperatorLogo;
3114 if (!strcmp(argv[0],"op"))
3115 bitmap.type=GSM_OperatorLogo;
3117 if (!strcmp(argv[0],"caller")) {
3118 /* There is caller group number missing in argument list. */
3121 if ((num<1)||(num>9)) num=1;
3128 bitmap.type=GSM_CallerLogo;
3131 if (!strcmp(argv[0],"picture")) {
3132 /* There is a number missing in argument list. */
3134 if (strlen(argv[2])==2) {
3135 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3146 bitmap.type=GSM_PictureImage;
3149 if (!strcmp(argv[0],"startup"))
3150 bitmap.type=GSM_StartupLogo;
3152 if (!strcmp(argv[0],"7110startup"))
3153 bitmap.type=GSM_7110StartupLogo;
3155 if (!strcmp(argv[0],"6210startup"))
3156 bitmap.type=GSM_6210StartupLogo;
3158 if (!strcmp(argv[0],"dealer"))
3159 bitmap.type=GSM_DealerNoteText;
3161 if (!strcmp(argv[0],"text"))
3162 bitmap.type=GSM_WelcomeNoteText;
3164 if (bitmap.type!=GSM_None) {
3168 fprintf(stdout, _("Getting Logo\n"));
3170 error=GSM->GetBitmap(&bitmap);
3177 if (bitmap.type==GSM_DealerNoteText) fprintf(stdout, _("Dealer welcome note "));
3178 if (bitmap.type==GSM_WelcomeNoteText) fprintf(stdout, _("Welcome note "));
3179 if (bitmap.type==GSM_DealerNoteText || bitmap.type==GSM_WelcomeNoteText)
3181 if (bitmap.text[0]!=0)
3183 fprintf(stdout, _("currently set to \"%s\"\n"), bitmap.text);
3185 fprintf(stdout, _("currently empty\n"));
3189 if (bitmap.width!=0)
3191 if (bitmap.type==GSM_OperatorLogo || bitmap.type==GSM_7110OperatorLogo)
3193 fprintf(stdout,"Operator logo for %s (%s) network got succesfully\n",bitmap.netcode,GSM_GetNetworkName(bitmap.netcode));
3195 if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_7110StartupLogo || bitmap.type==GSM_6210StartupLogo)
3197 fprintf(stdout,"Startup logo got successfully\n");
3199 if (bitmap.type==GSM_CallerLogo)
3201 fprintf(stdout,"Caller logo got successfully\n");
3203 if (bitmap.type==GSM_PictureImage)
3205 fprintf(stdout,"Picture Image got successfully");
3206 if (strcmp(bitmap.text,""))
3207 fprintf(stdout,_(", text \"%s\""),bitmap.text);
3208 if (strcmp(bitmap.Sender,""))
3209 fprintf(stdout,_(", sender \"%s\""),bitmap.Sender);
3210 fprintf(stdout,"\n");
3214 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
3218 fprintf(stdout,"Your phone doesn't have logo uploaded !\n");
3223 case GE_NOTIMPLEMENTED:
3224 fprintf(stderr, _("Function not implemented !\n"));
3226 case GE_NOTSUPPORTED:
3227 fprintf(stderr, _("This kind of logo is not supported !\n"));
3230 fprintf(stderr, _("Error getting logo (wrong location ?) !\n"));
3235 fprintf(stderr, _("What kind of logo do you want to get ?\n"));
3242 /* Setting logos. */
3244 int setlogo(int argc, char *argv[])
3247 GSM_Bitmap bitmap,oldbit;
3248 GSM_NetworkInfo NetworkInfo;
3259 if (!strcmp(argv[0],"text") || !strcmp(argv[0],"dealer"))
3261 if (!strcmp(argv[0],"text")) bitmap.type=GSM_WelcomeNoteText;
3262 else bitmap.type=GSM_DealerNoteText;
3263 bitmap.text[0]=0x00;
3264 if (argc>1) strncpy(bitmap.text,argv[1],255);
3267 if (!strcmp(argv[0],"op") || !strcmp(argv[0],"startup") || !strcmp(argv[0],"caller") ||
3268 !strcmp(argv[0],"7110op") || !strcmp(argv[0],"6210startup") || !strcmp(argv[0],"7110startup") ||
3269 !strcmp(argv[0],"picture"))
3273 if (!strcmp(argv[0],"startup"))
3275 bitmap.type=GSM_StartupLogo;
3278 bitmap.size=bitmap.width*bitmap.height/8;
3280 if (num>=1 && num<=3) {
3283 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3288 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
3291 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3296 if (!strcmp(argv[0],"op"))
3298 if (bitmap.type!=GSM_OperatorLogo || argc<3)
3300 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3302 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
3305 strncpy(bitmap.netcode,argv[2],7);
3306 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3308 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3313 if (!strcmp(argv[0],"7110op"))
3315 if (bitmap.type!=GSM_7110OperatorLogo || argc<3)
3317 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3319 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
3322 strncpy(bitmap.netcode,argv[2],7);
3323 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3325 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3330 if (!strcmp(argv[0],"picture"))
3332 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3336 if (strlen(argv[2])==2) {
3337 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3347 strncpy(bitmap.text,argv[3],121);
3348 strcpy(bitmap.Sender,"\0");
3350 strncpy(bitmap.Sender,argv[4],GSM_MAX_SENDER_LENGTH);
3352 if (!strcmp(argv[0],"7110startup"))
3354 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
3356 if (!strcmp(argv[0],"6210startup"))
3358 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
3360 if (!strcmp(argv[0],"caller"))
3362 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3366 if ((num<0)||(num>9)) num=0;
3372 oldbit.type=GSM_CallerLogo;
3373 oldbit.number=bitmap.number;
3374 if (GSM->GetBitmap(&oldbit)==GE_NONE)
3376 /* We have to get the old name and ringtone!! */
3377 bitmap.ringtone=oldbit.ringtone;
3378 strncpy(bitmap.text,oldbit.text,255);
3380 if (argc>3) strncpy(bitmap.text,argv[3],255);
3382 fprintf(stdout, _("Setting Logo.\n"));
3385 /* FIX ME: is it possible to permanently remove op logo ? */
3386 if (!strcmp(argv[0],"op"))
3388 bitmap.type=GSM_OperatorLogo;
3389 strncpy(bitmap.netcode,"000 00",7);
3392 bitmap.size=bitmap.width*bitmap.height/8;
3393 GSM_ClearBitmap(&bitmap);
3395 if (!strcmp(argv[0],"7110op"))
3397 bitmap.type=GSM_7110OperatorLogo;
3398 strncpy(bitmap.netcode,"000 00",7);
3401 bitmap.size=(bitmap.width*bitmap.height + 7)/8;
3402 GSM_ClearBitmap(&bitmap);
3404 /* FIX ME: how to remove startup and group logos ? */
3405 fprintf(stdout, _("Removing Logo.\n"));
3409 fprintf(stderr, _("What kind of logo do you want to set ?\n"));
3415 while (GSM->GetModel(model) != GE_NONE)
3418 /* For Nokia 6110/6130/6150 we use different method of uploading.
3419 Phone will display menu, when received it */
3420 if (!strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") || !strcmp(model,"NSM-1"))
3422 if (!strcmp(argv[0],"caller") && argc<3)
3424 if (!strcmp(argv[0],"op") && argc<3)
3428 error=GSM->SetBitmap(&bitmap);
3432 case GE_NONE: oldbit.type=bitmap.type;
3433 oldbit.number=bitmap.number;
3434 if (GSM->GetBitmap(&oldbit)==GE_NONE) {
3435 if (bitmap.type==GSM_WelcomeNoteText ||
3436 bitmap.type==GSM_DealerNoteText) {
3437 if (strcmp(bitmap.text,oldbit.text)) {
3438 fprintf(stderr, _("Error setting"));
3439 if (bitmap.type==GSM_DealerNoteText) fprintf(stderr, _(" dealer"));
3440 fprintf(stderr, _(" welcome note - "));
3442 /* I know, it looks horrible, but... */
3443 /* I set it to the short string - if it won't be set */
3444 /* it means, PIN is required. If it will be correct, previous */
3445 /* (user) text was too long */
3447 /* Without it, I could have such thing: */
3448 /* user set text to very short string (for example, "Marcin") */
3449 /* then enable phone without PIN and try to set it to the very long (too long for phone) */
3450 /* string (which start with "Marcin"). If we compare them as only length different, we could think, */
3451 /* that phone accepts strings 6 chars length only (length of "Marcin") */
3452 /* When we make it correct, we don't have this mistake */
3454 strcpy(oldbit.text,"!\0");
3455 GSM->SetBitmap(&oldbit);
3456 GSM->GetBitmap(&oldbit);
3457 if (oldbit.text[0]!='!') {
3458 fprintf(stderr, _("SIM card and PIN is required\n"));
3460 GSM->SetBitmap(&bitmap);
3461 GSM->GetBitmap(&oldbit);
3462 fprintf(stderr, _("too long, truncated to \"%s\" (length %ld)\n"),oldbit.text,(long)strlen(oldbit.text));
3467 if (bitmap.type==GSM_StartupLogo) {
3468 for (i=0;i<oldbit.size;i++) {
3469 if (oldbit.bitmap[i]!=bitmap.bitmap[i]) {
3470 fprintf(stderr, _("Error setting startup logo - SIM card and PIN is required\n"));
3478 if (ok) fprintf(stdout, _("Done.\n"));
3480 case GE_NOTIMPLEMENTED:fprintf(stderr, _("Function not implemented.\n"));
3482 case GE_NOTSUPPORTED:fprintf(stderr, _("This kind of logo is not supported.\n"));
3484 default:fprintf(stderr, _("Error (wrong location ?) !\n"));
3493 /* Calendar notes receiving. */
3495 int getcalendarnote(int argc, char *argv[])
3497 GSM_CalendarNote CalendarNote;
3498 GSM_NotesInfo NotesInfo;
3504 bool was_note=false;
3505 char z_text[MAX_CALENDAR_TEXT_LENGTH+11];
3507 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
3515 now=localtime(&nowh);
3517 Date.Year = now->tm_year;
3519 /* I have 100 (for 2000) Year now :-) */
3520 if (Date.Year>99 && Date.Year<1900) {
3521 Date.Year=Date.Year+1900;
3524 start=atoi(argv[0]);
3529 if (!strcmp(argv[argc-1],"-v10")) {
3532 if (!strcmp(argv[argc-1],"-v30")) {
3541 if (!strcmp(argv[argc-1],"-v10")) {
3544 if (!strcmp(argv[argc-1],"-v30")) {
3556 while (GSM->GetModel(model) != GE_NONE)
3559 if (!strcmp(argv[0],"-s") || !strcmp(argv[0],"--short"))
3561 else if (!isdigit(argv[0][0])) {
3566 error=GSM->GetCalendarNotesInfo(&NotesInfo);
3567 if ( error == GE_NONE ) {
3568 if( NotesInfo.HowMany == 0 ) {
3569 fprintf(stderr, _("Sorry! No Calendar Notes present on phone.\n"));
3570 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3573 fprintf(stdout, _(" CALENDAR NOTES INFO \n"));
3574 fprintf(stdout, _("---------------------\n"));
3575 fprintf(stdout, _("How Many Locations :%d\n"), NotesInfo.HowMany);
3577 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3578 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3579 fprintf(stdout, _("Locations are :\n"));
3580 for(i=0;i<NotesInfo.HowMany;i++)
3581 fprintf(stdout, _("%4d) %4d\n"), i+1, NotesInfo.Location[i]);
3585 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3586 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3587 fprintf(stderr, _("Can't read Notes Infos from phone.\n"));
3588 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3592 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) {
3594 NotesInfo.HowMany=200;
3595 for (i=0;i<200;i++) {
3596 NotesInfo.Location[i]=i+1;
3600 if( vInfo && stop!=(-1) && error==GE_NONE )
3602 /* Info datas (for 7110 and comp.) */
3603 fprintf(stdout, _(" CALENDAR NOTES SUMMARY INFORMATION \n"));
3604 fprintf(stdout, _(" ==================================\n"));
3605 if (GetModelFeature (FN_CALENDAR)==F_CAL71) {
3606 fprintf(stdout, _("Calendar notes present on phone: %d\n"), NotesInfo.HowMany);
3607 fprintf(stdout, _("Locations are :\n"));
3609 fprintf(stdout, "----------------------------------------------------------------------------\n");
3610 fprintf(stdout,_(" Loc Phys Type Summary description Dt start Alarm Recurs\n") );
3611 fprintf(stdout, "----------------------------------------------------------------------------\n");
3613 for(i=0;i<NotesInfo.HowMany;i++)
3615 /* very short format ... */
3617 fprintf(stdout, _("%4d) %4d\n"), i, NotesInfo.Location[i]);
3619 CalendarNote.Location=i+1;
3620 CalendarNote.ReadNotesInfo=false;
3622 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3625 switch (CalendarNote.Type) {
3626 case GCN_REMINDER:strcpy(z_type, "REMIND"); break;
3627 case GCN_CALL: strcpy(z_type, "CALL"); break;
3628 case GCN_MEETING: strcpy(z_type, "MEETING"); break;
3629 case GCN_BIRTHDAY:strcpy(z_type, "BDAY"); break;
3630 default: strcpy(z_type, "UNKNOWN"); break;
3633 if( CalendarNote.Recurrance ) {
3634 sprintf( z_recur,"%d ", CalendarNote.Recurrance/24 );
3635 strcat( z_recur, CalendarNote.Recurrance == 1 ? "day" : "days" );
3638 strcpy( z_recur, "No" );
3642 if( CalendarNote.Type == GCN_CALL )
3643 sprintf(z_text, "\"%s\"", CalendarNote.Phone );
3645 if (CalendarNote.Text[0]!=0)
3646 sprintf(z_text, "\"%s\"", CalendarNote.Text );
3648 if(CalendarNote.Type == GCN_BIRTHDAY) {
3650 i_age = Date.Year - CalendarNote.Time.Year;
3651 sprintf(z_text, "\"%s (%d %s)\"", CalendarNote.Text,
3652 i_age, (i_age==1)?"year":"years");
3653 strcpy( z_recur, "-" );
3654 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3656 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3657 i+1,NotesInfo.Location[i], z_type, z_text,
3658 CalendarNote.Time.Year,
3659 CalendarNote.Time.Month,
3660 CalendarNote.Time.Day,
3661 (CalendarNote.AlarmType==0x00) ? "Tone " : "Silent",
3665 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3666 i+1,NotesInfo.Location[i], z_type, z_text,
3667 CalendarNote.Time.Year,
3668 CalendarNote.Time.Month,
3669 CalendarNote.Time.Day,
3670 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3673 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3675 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3676 i+1,NotesInfo.Location[i], z_type, z_text,
3677 CalendarNote.Time.Year,
3678 CalendarNote.Time.Month,
3679 CalendarNote.Time.Day,
3680 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3684 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s\n"),
3685 i+1,NotesInfo.Location[i], z_type, z_text,
3686 CalendarNote.Time.Year,
3687 CalendarNote.Time.Month,
3688 CalendarNote.Time.Day,
3689 (CalendarNote.Alarm.Year) ? "Yes" : "No ");
3691 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) break;
3696 for (i=start;i<=stop;i++) {
3697 if (error==GE_NONE) {
3698 if( i>NotesInfo.HowMany ) {
3699 fprintf(stderr, _("Only %d Calendar Notes present on phone!\n"),NotesInfo.HowMany);
3703 fprintf(stderr, _("Calendar Notes location can't be zero... skipping.\n"));
3708 CalendarNote.Location=i;
3709 CalendarNote.ReadNotesInfo=false;
3711 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3715 fprintf(stdout, GSM_GetVCALENDARStart(vCalVer));
3719 fprintf(stdout, GSM_GetVCALENDARNote(&CalendarNote,vCalVer));
3721 } else { /* not vCal */
3724 fprintf(stdout, "\n");
3729 fprintf(stdout, _(" Type of the note: "));
3731 switch (CalendarNote.Type) {
3733 case GCN_REMINDER:fprintf(stdout, _("Reminder\n"));break;
3734 case GCN_CALL :fprintf(stdout, _("Call\n")); break;
3735 case GCN_MEETING :fprintf(stdout, _("Meeting\n")); break;
3736 case GCN_BIRTHDAY:fprintf(stdout, _("Birthday\n"));break;
3737 default: fprintf(stdout, _("Unknown\n"));
3741 /* For 3310: set date to 2090! */
3742 if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
3743 fprintf(stdout, _(" Date: xxxx-%02d-%02d\n"), CalendarNote.Time.Month,
3744 CalendarNote.Time.Day);
3746 fprintf(stdout, _(" Date: %s %d-%02d-%02d\n"),
3747 DayOfWeek(CalendarNote.Time.Year, CalendarNote.Time.Month, CalendarNote.Time.Day),
3748 CalendarNote.Time.Year,
3749 CalendarNote.Time.Month,
3750 CalendarNote.Time.Day);
3753 fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CalendarNote.Time.Hour,
3754 CalendarNote.Time.Minute,
3755 CalendarNote.Time.Second);
3757 if (CalendarNote.Alarm.Year!=0) {
3758 fprintf(stdout, _(" Alarm date: %s %d-%02d-%02d\n"),
3759 DayOfWeek(CalendarNote.Alarm.Year, CalendarNote.Alarm.Month, CalendarNote.Alarm.Day),
3760 CalendarNote.Alarm.Year,
3761 CalendarNote.Alarm.Month,
3762 CalendarNote.Alarm.Day);
3764 fprintf(stdout, _(" Alarm time: %02d:%02d:%02d\n"), CalendarNote.Alarm.Hour,
3765 CalendarNote.Alarm.Minute,
3766 CalendarNote.Alarm.Second);
3767 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 )
3768 fprintf(stdout, _(" Alarm type: %s\n"), (CalendarNote.AlarmType==0x00) ?
3769 "With Tone" : "Silent" );
3772 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && CalendarNote.Recurrance!= 0 )
3773 fprintf(stdout, " It repeat every %d day%s\n", CalendarNote.Recurrance/24,
3774 ((CalendarNote.Recurrance/24)>1) ? "s":"" );
3776 if (CalendarNote.Type == GCN_BIRTHDAY)
3779 i_age = Date.Year - CalendarNote.Time.Year;
3780 fprintf(stdout, _(" Text: %s (%d %s)\n"), CalendarNote.Text,
3781 i_age, (i_age==1)?"year":"years");
3783 if (CalendarNote.Text[0]!=0)
3784 fprintf(stdout, _(" Text: %s\n"), CalendarNote.Text);
3787 if (CalendarNote.Type == GCN_CALL)
3788 fprintf(stdout, _(" Phone: %s\n"), CalendarNote.Phone);
3791 fprintf(stderr, _("The calendar note %i can not be read\n"),i);
3795 if (was_note && vCalVer!=0) {
3796 fprintf(stdout, GSM_GetVCALENDAREnd(vCalVer));
3804 /* Writing calendar notes. */
3806 int writecalendarnote(char *argv[])
3808 GSM_CalendarNote CalendarNote;
3812 number=atoi(argv[1]);
3815 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
3819 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
3822 case GE_CANTOPENFILE:
3823 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
3826 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
3829 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
3835 /* Error 22=Calendar full ;-) */
3837 error=GSM->WriteCalendarNote(&CalendarNote);
3840 fprintf(stdout, _("Succesfully written!\n"));break;
3842 fprintf(stdout, _("Too long text in calendar note!\n"));break;
3844 fprintf(stdout, _("Failed to write calendar note!\n"));break;
3852 /* Calendar note deleting. */
3854 int deletecalendarnote(char *Index)
3857 GSM_CalendarNote CalendarNote;
3859 CalendarNote.Location=atoi(Index);
3863 if (GSM->DeleteCalendarNote(&CalendarNote) == GE_NONE) {
3864 fprintf(stdout, _(" Calendar note deleted.\n"));
3867 fprintf(stderr, _("The calendar note can not be deleted\n"));
3878 /* Setting the date and time. */
3880 int setdatetime(int argc, char *argv[])
3889 now=localtime(&nowh);
3891 Date.Year = now->tm_year;
3892 Date.Month = now->tm_mon+1;
3893 Date.Day = now->tm_mday;
3894 Date.Hour = now->tm_hour;
3895 Date.Minute = now->tm_min;
3896 Date.Second = now->tm_sec;
3898 if (argc>0) Date.Year = atoi (argv[0]);
3899 if (argc>1) Date.Month = atoi (argv[1]);
3900 if (argc>2) Date.Day = atoi (argv[2]);
3901 if (argc>3) Date.Hour = atoi (argv[3]);
3902 if (argc>4) Date.Minute = atoi (argv[4]);
3907 /* Well, this thing is copyrighted in U.S. This technique is known as
3908 Windowing and you can read something about it in LinuxWeekly News:
3909 http://lwn.net/1999/features/Windowing.phtml. This thing is beeing
3910 written in Czech republic and Poland where algorithms are not allowed
3914 Date.Year = Date.Year+1900;
3916 Date.Year = Date.Year+2000;
3919 /* FIXME: Error checking should be here. */
3920 GSM->SetDateTime(&Date);
3927 /* In this mode we receive the date and time from mobile phone. */
3929 int getdatetime(void) {
3931 GSM_DateTime date_time;
3935 if (GSM->GetDateTime(&date_time)==GE_NONE) {
3936 if (date_time.IsSet) {
3937 fprintf(stdout, _("Date: %s %4d/%02d/%02d\n"),
3938 DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
3939 date_time.Year, date_time.Month, date_time.Day);
3940 fprintf(stdout, _("Time: %02d:%02d:%02d\n"), date_time.Hour, date_time.Minute, date_time.Second);
3942 fprintf(stdout, _("Date and time not set in phone\n"));
3945 fprintf(stdout,_("Error!\n"));
3953 /* Setting the alarm. */
3955 int setalarm(char *argv[])
3962 Date.Hour = atoi(argv[0]);
3963 Date.Minute = atoi(argv[1]);
3965 GSM->SetAlarm(1, &Date);
3972 /* Getting the alarm. */
3974 int getalarm(void) {
3976 GSM_DateTime date_time;
3980 if (GSM->GetAlarm(0, &date_time)==GE_NONE) {
3981 fprintf(stdout, _("Alarm: %s\n"), (date_time.IsSet)?"on":"off");
3982 fprintf(stdout, _("Time: %02d:%02d\n"), date_time.Hour, date_time.Minute);
3984 fprintf(stdout,_("Error!\n"));
3992 /* In monitor mode we don't do much, we just initialise the fbus code.
3993 Note that the fbus code no longer has an internal monitor mode switch,
3994 instead compile with DEBUG enabled to get all the gumpf. */
3996 int monitormode(int argc, char *argv[])
3999 float rflevel=-1, batterylevel=-1;
4000 unsigned char loop=1;
4002 GSM_PowerSource powersource=-1;
4003 GSM_RFUnits rf_units = GRF_Arbitrary;
4004 GSM_BatteryUnits batt_units = GBU_Arbitrary;
4006 GSM_NetworkInfo NetworkInfo;
4007 GSM_CBMessage CBMessage;
4009 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
4010 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
4011 GSM_MemoryStatus DC_MemoryStatus = {GMT_DC, 0, 0};
4012 GSM_MemoryStatus EN_MemoryStatus = {GMT_EN, 0, 0};
4013 GSM_MemoryStatus FD_MemoryStatus = {GMT_FD, 0, 0};
4014 GSM_MemoryStatus LD_MemoryStatus = {GMT_LD, 0, 0};
4015 GSM_MemoryStatus MC_MemoryStatus = {GMT_MC, 0, 0};
4016 GSM_MemoryStatus ON_MemoryStatus = {GMT_ON, 0, 0};
4017 GSM_MemoryStatus RC_MemoryStatus = {GMT_RC, 0, 0};
4019 GSM_SMSStatus SMSStatus = {0, 0};
4023 /* evaluate for presence of "-noloop" argument in parameter */
4026 if( strcmp(argv[0],"-noloop" ) && strcmp(argv[0],"-nl" ))
4035 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
4038 signal(SIGINT, interrupted);
4040 fprintf (stderr, _("Entering monitor mode...\n"));
4041 fprintf (stderr, _("Initialising GSM interface...\n"));
4043 /* Initialise the code for the GSM interface. */
4048 GSM->EnableCellBroadcast();
4050 /* Loop here indefinitely - allows you to see messages from GSM code in
4051 response to unknown messages etc. The loops ends after pressing the
4053 while (!bshutdown) {
4054 if (GSM->GetRFLevel(&rf_units, &rflevel) == GE_NONE)
4055 fprintf(stdout, _("RFLevel: %d\n"), (int)rflevel);
4057 if (GSM->GetBatteryLevel(&batt_units, &batterylevel) == GE_NONE)
4058 fprintf(stdout, _("Battery: %d\n"), (int)batterylevel);
4060 if (GSM->GetPowerSource(&powersource) == GE_NONE)
4061 fprintf(stdout, _("Power Source: %s\n"), (powersource==GPS_ACDC)?_("AC/DC"):_("battery"));
4063 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE)
4064 fprintf(stdout, _("SIM: Used %d, Free %d\n"), SIMMemoryStatus.Used, SIMMemoryStatus.Free);
4066 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE)
4067 fprintf(stdout, _("Phone: Used %d, Free %d\n"), PhoneMemoryStatus.Used, PhoneMemoryStatus.Free);
4069 if (GSM->GetMemoryStatus(&DC_MemoryStatus) == GE_NONE)
4070 fprintf(stdout, _("DC: Used %d, Free %d\n"), DC_MemoryStatus.Used, DC_MemoryStatus.Free);
4072 if (GSM->GetMemoryStatus(&EN_MemoryStatus) == GE_NONE)
4073 fprintf(stdout, _("EN: Used %d, Free %d\n"), EN_MemoryStatus.Used, EN_MemoryStatus.Free);
4075 if (GSM->GetMemoryStatus(&FD_MemoryStatus) == GE_NONE)
4076 fprintf(stdout, _("FD: Used %d, Free %d\n"), FD_MemoryStatus.Used, FD_MemoryStatus.Free);
4078 if (GSM->GetMemoryStatus(&LD_MemoryStatus) == GE_NONE)
4079 fprintf(stdout, _("LD: Used %d, Free %d\n"), LD_MemoryStatus.Used, LD_MemoryStatus.Free);
4081 if (GSM->GetMemoryStatus(&MC_MemoryStatus) == GE_NONE)
4082 fprintf(stdout, _("MC: Used %d, Free %d\n"), MC_MemoryStatus.Used, MC_MemoryStatus.Free);
4084 if (GSM->GetMemoryStatus(&ON_MemoryStatus) == GE_NONE)
4085 fprintf(stdout, _("ON: Used %d, Free %d\n"), ON_MemoryStatus.Used, ON_MemoryStatus.Free);
4087 if (GSM->GetMemoryStatus(&RC_MemoryStatus) == GE_NONE)
4088 fprintf(stdout, _("RC: Used %d, Free %d\n"), RC_MemoryStatus.Used, RC_MemoryStatus.Free);
4090 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE)
4091 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"), SMSStatus.UnRead, SMSStatus.Number);
4093 if (GSM->GetIncomingCallNr(Number) == GE_NONE)
4094 fprintf(stdout, _("Incoming call: %s\n"), Number);
4096 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE)
4097 fprintf(stdout, _("Network: %s (%s), LAC: %s, CellID: %s\n"), GSM_GetNetworkName (NetworkInfo.NetworkCode), GSM_GetCountryName(NetworkInfo.NetworkCode), NetworkInfo.LAC, NetworkInfo.CellID);
4099 if (GSM->ReadCellBroadcast(&CBMessage) == GE_NONE)
4100 fprintf(stdout, _("Cell broadcast received on channel %d: %s\n"), CBMessage.Channel, CBMessage.Message);
4107 if( loop ) fprintf (stderr, _("Leaving monitor mode...\n"));
4114 #endif /* UCLINUX */
4116 /* Emulation of separate gnokiid binary for uClinux */
4120 static int gnokiid(int argc, char *argv[])
4122 bool DebugMode; /* When true, run in debug mode */
4123 char *Model; /* Model from .gnokiirc file. */
4124 char *Port; /* Port from .gnokiirc file */
4125 char *Initlength; /* Init length from .gnokiirc file */
4126 char *Connection; /* Connection type from .gnokiirc file */
4127 char *BinDir; /* Directory of the mgnokiidev command */
4129 /* evaluate for presence of "--debug" argument in parameter */
4133 if( !strcmp(argv[0],"--debug" ))
4142 fprintf (stderr, _("Initializing 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)
4153 fprintf (stderr, _("Spawning gnokiid startup child process \"%s\"...\n"), *argv);
4155 /* default action for SIGCHLD is SIG_IGN, should be OK */
4158 case -1: /* vfork() failure */
4159 fprintf (stderr, _("vfork() failed! (%m)\n"));
4163 fprintf (stderr, _("Spawn of child process failed! (%m)\n"));
4166 default: /* parent */
4173 fprintf (stderr, _("Entering gnokiid virtual modem main loop...\n"));
4183 #endif /* UCLINUX */
4187 /* Shows texts from phone's display */
4196 error=GSM->EnableDisplayOutput();
4198 if (error == GE_NONE)
4201 /* We do not want to see texts forever - press Ctrl+C to stop. */
4203 signal(SIGINT, interrupted);
4205 fprintf (stderr, _("Entering display monitoring mode...\n"));
4207 /* Loop here indefinitely - allows you to read texts from phone's
4208 display. The loops ends after pressing the Ctrl+C. */
4213 fprintf (stderr, _("Leaving display monitor mode...\n"));
4215 error=GSM->DisableDisplayOutput();
4217 fprintf (stderr, _("Error!\n"));
4219 fprintf (stderr, _("Error!\n"));
4226 /* Displays names of available ringtones */
4229 char model[64], rev[64];
4234 while (GSM->GetRevision(rev) != GE_NONE)
4237 while (GSM->GetModel(model) != GE_NONE)
4240 strncpy(rev,rev+2,5);
4242 PrepareRingingTones(model,rev);
4244 for (i=1;i<=NumberOfRingtones();i++)
4246 fprintf(stdout,_("%i. %s\n"),i,RingingToneName(0,i));
4255 /* Reads profile from phone and displays its' settings */
4257 int getprofile(int argc, char *argv[])
4262 GSM_Profile profile;
4265 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4266 char model[64], rev[64];
4268 /* Initialise the code for the GSM interface. */
4273 error=GSM->GetProfile(&profile);
4275 if (error == GE_NONE)
4278 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4280 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4282 strncpy(rev,rev+2,5);
4284 PrepareRingingTones(model,rev);
4286 switch(GetModelFeature (FN_PROFILES)) {
4287 case F_PROF33:max_profiles=6;break;
4288 case F_PROF51:max_profiles=3;break;
4289 default :max_profiles=7;break;
4294 profile.Number=atoi(argv[0])-1;
4295 start=profile.Number;
4298 if (profile.Number < 0)
4300 fprintf(stderr, _("Profile number must be value from 1 to %d!\n"), max_profiles);
4305 if (profile.Number >= max_profiles)
4307 fprintf(stderr, _("This phone supports only %d profiles!\n"), max_profiles);
4321 if (profile.Number!=0) GSM->GetProfile(&profile);
4323 printf("%d. \"%s\"", (profile.Number+1), profile.Name);
4324 if (profile.DefaultName==-1) printf(" (name defined)");
4328 printf("Incoming call alert: %d\n", profile.CallAlert);
4329 printf("Ringtone ID: %d\n", profile.Ringtone);
4330 printf("Ringing volume: %d\n", profile.Volume);
4331 printf("Message alert tone: %d\n", profile.MessageTone);
4332 printf("Keypad tones: %d\n", profile.KeypadTone);
4333 printf("Warning and game tones: %d\n", profile.WarningTone);
4334 printf("Lights: %d\n", profile.Lights);
4335 printf("Vibration: %d\n", profile.Vibration);
4336 printf("Caller groups: 0x%02x\n", profile.CallerGroups);
4337 printf("Automatic answer: %d\n", profile.AutomaticAnswer);
4338 printf("Screen saver: %d\n", profile.ScreenSaver);
4342 printf("Incoming call alert: %s\n", GetProfileCallAlertString(profile.CallAlert));
4344 /* For different phones different ringtones names */
4345 if (strcmp(RingingToneName(profile.Ringtone,0),""))
4346 printf(_("Ringing tone: %s (number %d in phone menu)\n"),
4347 RingingToneName(profile.Ringtone,0), RingingToneMenu(profile.Ringtone));
4349 printf(_("Ringtone number: %d\n"), profile.Ringtone);
4351 printf(_("Ringing volume: %s\n"), GetProfileVolumeString(profile.Volume));
4353 printf(_("Message alert tone: %s\n"), GetProfileMessageToneString(profile.MessageTone));
4355 printf(_("Keypad tones: %s\n"), GetProfileKeypadToneString(profile.KeypadTone));
4357 printf(_("Warning and game tones: %s\n"), GetProfileWarningToneString(profile.WarningTone));
4359 if (GetModelFeature (FN_SCREENSAVER)!=0)
4360 printf(_("Screen saver: %s\n"), GetProfileOnOffString(profile.ScreenSaver));
4362 printf(_("Vibration: %s\n"), GetProfileVibrationString(profile.Vibration));
4364 /* It has been nice to add here reading caller group name. ;^) */
4365 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
4366 printf(_("Caller groups: %s\n"),
4367 GetProfileCallerGroups(profile.CallerGroups) );
4369 /* FIXME: need make investigation for 3310 for these features. For now unknown */
4370 if (GetModelFeature (FN_PROFILES)!=F_PROF33) {
4371 /* FIXME: Light settings is only used for Car */
4372 if (profile.Number==(max_profiles-2)) printf(_("Lights: %s\n"), profile.Lights ? _("On") : _("Automatic"));
4374 /* FIXME: Automatic answer is only used for Car and Headset. */
4375 if (profile.Number>=(max_profiles-2)) printf(_("Automatic answer: %s\n"), GetProfileOnOffString(profile.AutomaticAnswer));
4383 if (error == GE_NOTIMPLEMENTED) {
4384 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4389 fprintf(stderr, _("Unspecified error\n"));
4401 /* Sets profile feature */
4403 int setprofile(int argc, char *argv[])
4406 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4407 char model[64], rev[64];
4410 GSM_Profile profile;
4411 GSM_Profile profile2, profile3;
4416 /* Initialise the code for the GSM interface. */
4422 error = GSM->GetProfile(&profile);
4424 if (error == GE_NONE)
4427 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4429 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4431 strncpy(rev,rev+2,5);
4433 PrepareRingingTones(model,rev);
4435 switch(GetModelFeature (FN_PROFILES)) {
4436 case F_PROF33:max_profiles=6;break;
4437 case F_PROF51:max_profiles=3;break;
4438 default :max_profiles=7;break;
4441 profile.Number=atoi (argv[0]);
4442 profile.Number=profile.Number-1;
4444 if (profile.Number < 0)
4446 fprintf(stderr, _("Profile number must be value from 1 to %i!\n"), max_profiles);
4451 if (profile.Number >= max_profiles)
4453 fprintf(stderr, _("This phone supports only %i profiles!\n"), max_profiles);
4458 if (profile.Number!=0) GSM->GetProfile(&profile);
4463 if (strcmp(argv[1], "callalert")==0)
4465 if (strcmp(argv[2], "ringing")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGING;correct_arg2=true;}
4466 if (strcmp(argv[2], "ascending")==0) {profile.CallAlert=PROFILE_CALLALERT_ASCENDING;correct_arg2=true;}
4467 if (strcmp(argv[2], "ringonce")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGONCE;correct_arg2=true;}
4468 if (strcmp(argv[2], "beeponce")==0) {profile.CallAlert=PROFILE_CALLALERT_BEEPONCE;correct_arg2=true;}
4469 if (strcmp(argv[2], "groups")==0)
4471 profile.CallAlert=PROFILE_CALLALERT_CALLERGROUPS;
4473 /*Ignored by N5110*/
4474 /*FIX ME: it's ignored by N5130 and 3210 too*/
4475 if (max_profiles==3) fprintf(stdout, _("Warning: value \"groups\" for profile feature \"callalert\" will be ignored in this phone model !\n"));
4477 if (strcmp(argv[2], "off")==0 || strcmp(argv[2], "0")==0) {profile.CallAlert=PROFILE_CALLALERT_OFF;correct_arg2=true;}
4480 fprintf(stderr, _("Correct parameters for profile feature \"callalert\" are ringing|ascending|ringonce|beeponce|groups|off|0 !\n"));
4486 if (strcmp(argv[1], "volume")==0)
4488 if (strcmp(argv[2], "1")==0) {profile.Volume=PROFILE_VOLUME_LEVEL1;correct_arg2=true;}
4489 if (strcmp(argv[2], "2")==0) {profile.Volume=PROFILE_VOLUME_LEVEL2;correct_arg2=true;}
4490 if (strcmp(argv[2], "3")==0) {profile.Volume=PROFILE_VOLUME_LEVEL3;correct_arg2=true;}
4491 if (strcmp(argv[2], "4")==0) {profile.Volume=PROFILE_VOLUME_LEVEL4;correct_arg2=true;}
4492 if (strcmp(argv[2], "5")==0) {profile.Volume=PROFILE_VOLUME_LEVEL5;correct_arg2=true;}
4495 fprintf(stderr, _("Correct parameters for profile feature \"volume\" are 0|1|2|3|4|5 !\n"));
4501 if (strcmp(argv[1], "keypad")==0 || strcmp(argv[1], "keypadtone")==0)
4503 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.KeypadTone=PROFILE_KEYPAD_OFF;correct_arg2=true;}
4504 if (strcmp(argv[2], "1")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL1;correct_arg2=true;}
4505 if (strcmp(argv[2], "2")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL2;correct_arg2=true;}
4506 if (strcmp(argv[2], "3")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL3;correct_arg2=true;}
4509 fprintf(stderr, _("Correct parameters for profile feature \"keypad|keypadtone\" are off|0|1|2|3 !\n"));
4515 if (strcmp(argv[1], "messagetone")==0 || strcmp(argv[1], "smstone")==0 || strcmp(argv[1], "sms")==0 || strcmp(argv[1], "message")==0)
4517 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.MessageTone=PROFILE_MESSAGE_NOTONE;correct_arg2=true;}
4518 if (strcmp(argv[2], "standard")==0) {profile.MessageTone=PROFILE_MESSAGE_STANDARD;correct_arg2=true;}
4519 if (strcmp(argv[2], "special")==0) {profile.MessageTone=PROFILE_MESSAGE_SPECIAL;correct_arg2=true;}
4520 if (strcmp(argv[2], "beeponce")==0 || strcmp(argv[2], "once")==0) {profile.MessageTone=PROFILE_MESSAGE_BEEPONCE;correct_arg2=true;}
4521 if (strcmp(argv[2], "ascending")==0) {profile.MessageTone=PROFILE_MESSAGE_ASCENDING;correct_arg2=true;}
4524 fprintf(stderr, _("Correct parameters for profile feature \"messagetone|smstone|message|sms\" are 0|off|standard|special|beeponce|once|ascending !\n"));
4530 if (strcmp(argv[1], "warningtone")==0 || strcmp(argv[1], "warning")==0)
4532 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.WarningTone=PROFILE_WARNING_OFF;correct_arg2=true;}
4533 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.WarningTone=PROFILE_WARNING_ON;correct_arg2=true;}
4536 fprintf(stderr, _("Correct parameters for profile feature \"warningtone|warning\" are 0|off|1|on !\n"));
4542 if (strcmp(argv[1], "vibra")==0 || strcmp(argv[1], "vibration")==0)
4544 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Vibration=PROFILE_VIBRATION_OFF;correct_arg2=true;}
4545 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Vibration=PROFILE_VIBRATION_ON;correct_arg2=true;}
4548 fprintf(stderr, _("Correct parameters for profile feature \"vibration|vibra\" are 0|off|1|on !\n"));
4554 if (strcmp(argv[1], "lights")==0)
4556 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Lights=-1;correct_arg2=true;}
4557 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Lights=0;correct_arg2=true;}
4560 fprintf(stderr, _("Correct parameters for profile feature \"lights\" are 0|off|1|on !\n"));
4564 if (profile.Number!=(max_profiles-2))
4566 profile2.Number=max_profiles-2;
4567 if (GSM->GetProfile(&profile2)==GE_NONE)
4569 fprintf(stdout, _("Warning: \"Lights\" feature is ignored in this profile (only setting it for \"%s\" profile get some results) !\n"), profile2.Name);
4574 if (strcmp(argv[1], "answer")==0)
4576 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.AutomaticAnswer=-1;correct_arg2=true;}
4577 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.AutomaticAnswer=0;correct_arg2=true;}
4580 fprintf(stderr, _("Correct parameters for profile feature \"answer\" are 0|off|1|on !\n"));
4584 if (profile.Number<(max_profiles-2))
4586 profile2.Number=max_profiles-2;
4587 if (GSM->GetProfile(&profile2)==GE_NONE)
4589 profile3.Number=max_profiles-1;
4590 if (GSM->GetProfile(&profile3)==GE_NONE)
4592 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);
4598 if (strcmp(argv[1], "name")==0)
4600 strcpy(profile.Name,argv[2]);
4601 /*Ignored by N5110*/
4602 /*FIX ME: it's ignored by N5130 and 3210 too*/
4603 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change profile name !\n"));
4606 if (strcmp(argv[1], "ringtone")==0)
4608 profile.Ringtone=atoi(argv[2]);
4609 if (profile.Ringtone<1)
4611 /*With value 0 results are interesting in N5110, but can't be used for anything*/
4612 fprintf(stderr, _("Ringtone number must be higher than 0 !\n"));
4617 if (profile.Ringtone>NumberOfRingtones())
4619 fprintf(stderr, _("Ringtone number too high (max %i) !\n"),NumberOfRingtones());
4623 profile.Ringtone=RingingToneCode(profile.Ringtone);
4624 if (profile.Ringtone==0)
4626 fprintf(stderr, _("Warning: we don't know ringtones codes for this model ! Can you contact with gnokii authors to add it into source ?\n"));
4630 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"));
4634 if (strcmp(argv[1], "groups")==0)
4636 /*Ignored by N5110*/
4637 /*FIX ME: it's ignored by N5130 and 3210 too*/
4638 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change caller group name !\n"));
4639 profile.CallerGroups=atoi(argv[2]);
4645 fprintf(stderr, _("Correct profile feature names are callalert|volume|keypad|keypadtone|messagetone|smstone|message|sms|warningtone|warning|vibra|vibration|lights|answer|name|groups !\n"));
4650 GSM->SetProfile(&profile);
4653 if (error == GE_NOTIMPLEMENTED) {
4654 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4659 fprintf(stderr, _("Unspecified error\n"));
4671 #endif /* UCLINUX */
4673 /* Get requested range of memory storage entries and output to stdout in
4674 easy-to-parse format */
4676 static int getmemory(int argc, char *argv[])
4679 GSM_PhonebookEntry entry;
4684 char memory_type_string[20];
4687 int i_used = 0, n_used=0;
4689 char *output_opt = NULL;
4691 char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
4692 bool formatdone=false;
4695 /* group names init */
4696 for(i=0;i<5;i++) az_group_name[i][0]='\0';
4698 /* Handle command line args that set type, start and end locations. */
4699 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
4701 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
4705 GetMemoryTypeString(memory_type_string, &entry.MemoryType);
4707 if (argv[argc-1][0] == '-')
4708 output_opt = argv[--argc];
4710 /* Do generic initialisation routine */
4714 while ((error = GSM->GetModel(buf)) != GE_NONE && i++ < 15)
4719 start_entry = atoi (argv[1]);
4720 end_entry = argc > 2 ? atoi( argv[2]) : start_entry;
4722 GSM_MemoryStatus stats = {entry.MemoryType, 0, 0};
4726 if (GSM->GetMemoryStatus( &stats) != GE_NONE) {
4727 fprintf( stderr, _("Error reading memory status.\n"));
4731 n_used = stats.Used;
4732 end_entry = stats.Used + stats.Free;
4736 /* Now retrieve the requested entries. */
4738 for (count = start_entry;
4739 count <= end_entry && (!do_all || i_used < n_used);
4742 entry.Location=count;
4744 error=GSM->GetMemoryLocation(&entry);
4748 if (entry.SubEntriesCount || strcmp( entry.Number, ""))
4753 if (output_opt && !strcmp( output_opt,"-v30")) {
4754 semicolon_pipe_substitution( &entry, 0 );
4755 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,30));
4758 if (output_opt && !strcmp(output_opt,"-v21")) {
4759 semicolon_pipe_substitution( &entry, 0 );
4760 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,21));
4763 if (output_opt && !strcmp(output_opt,"-v")) {
4764 semicolon_pipe_substitution( &entry, 0 );
4765 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,10));
4768 #endif /* UCLINUX */
4769 if (output_opt && !strcmp(output_opt,"-short")) {
4770 semicolon_pipe_substitution( &entry, 0 );
4771 fprintf(stdout, "%s;%s;%s;%d;%d;", entry.Name, entry.Number, memory_type_string, entry.Location, entry.Group);
4772 for( i = 0; i < entry.SubEntriesCount; i++ )
4774 if( entry.SubEntries[i].EntryType == GSM_Date )
4775 fprintf(stdout,_("%u;%u;%u;%02u.%02u.%04u;%02u:%02u:%02u;"),
4776 entry.SubEntries[i].EntryType,
4777 entry.SubEntries[i].NumberType,
4778 entry.SubEntries[i].BlockNumber,
4779 entry.SubEntries[i].data.Date.Day,
4780 entry.SubEntries[i].data.Date.Month,
4781 entry.SubEntries[i].data.Date.Year,
4782 entry.SubEntries[i].data.Date.Hour,
4783 entry.SubEntries[i].data.Date.Minute,
4784 entry.SubEntries[i].data.Date.Second );
4786 fprintf(stdout,_("%u;%u;%u;%s;"),
4787 entry.SubEntries[i].EntryType,
4788 entry.SubEntries[i].NumberType,
4789 entry.SubEntries[i].BlockNumber,
4790 entry.SubEntries[i].data.Number );
4792 fprintf(stdout,_("\n"));
4798 fprintf(stdout, "Memory %s, location %d\n",memory_type_string, entry.Location);
4800 // check if some info in subentries
4801 for( i = 0; i < entry.SubEntriesCount; i++ )
4802 if( entry.SubEntries[i].EntryType != GSM_Date &&
4803 strcmp(entry.SubEntries[i].data.Number,"") )
4806 if (strcmp(entry.Number,"") || i < entry.SubEntriesCount) {
4807 if (strcmp(entry.Name,"")) fprintf(stdout,_(" Name: %s\n"),entry.Name);
4808 if (strcmp(entry.Number,"")) fprintf(stdout,_(" Number: %s\n"),entry.Number);
4809 bitmap.type=GSM_CallerLogo;
4810 bitmap.number=entry.Group;
4811 strcpy(z_gtype,"unknown");
4812 if (entry.Group==5) strcpy(z_gtype,"No group");
4813 if (entry.Group<5 && entry.Group>=0) {
4814 if (!strcmp(az_group_name[entry.Group],"")) {
4815 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
4816 if (GSM->GetBitmap(&bitmap)==GE_NONE)
4817 strcpy( az_group_name[entry.Group], bitmap.text );
4819 if ((!strcmp(az_group_name[entry.Group],""))) {
4820 switch(entry.Group) {
4821 case 0:strcpy(az_group_name[entry.Group],"Family");break;
4822 case 1:strcpy(az_group_name[entry.Group],"VIP");break;
4823 case 2:strcpy(az_group_name[entry.Group],"Friends");break;
4824 case 3:strcpy(az_group_name[entry.Group],"Colleagues");break;
4825 case 4:strcpy(az_group_name[entry.Group],"Other");break;
4830 strcpy(z_gtype,az_group_name[entry.Group]);
4832 fprintf(stdout,_(" Group: %d (%s)\n"),entry.Group+1,z_gtype);
4833 for( i = 0; i < entry.SubEntriesCount; i++ )
4835 if( entry.SubEntries[i].EntryType == GSM_Date ) {
4836 fprintf(stdout, " Date and time: %s %02u.%02u.%04u %02u:%02u:%02u\n",
4837 DayOfWeek(entry.SubEntries[i].data.Date.Year,
4838 entry.SubEntries[i].data.Date.Month,
4839 entry.SubEntries[i].data.Date.Day),
4840 entry.SubEntries[i].data.Date.Day,
4841 entry.SubEntries[i].data.Date.Month,
4842 entry.SubEntries[i].data.Date.Year,
4843 entry.SubEntries[i].data.Date.Hour,
4844 entry.SubEntries[i].data.Date.Minute,
4845 entry.SubEntries[i].data.Date.Second);
4848 if( strcmp(entry.SubEntries[i].data.Number,"") ) {
4850 switch( entry.SubEntries[i].EntryType ) {
4852 switch( entry.SubEntries[i].NumberType ) {
4853 case GSM_General: strcpy(z_etype,"General "); break;
4854 case GSM_Home: strcpy(z_etype,"Home "); break;
4855 case GSM_Mobile: strcpy(z_etype,"Mobile "); break;
4856 case GSM_Work: strcpy(z_etype,"Work "); break;
4857 case GSM_Fax: strcpy(z_etype,"Fax "); break;
4858 default: strcpy(z_etype,""); break;
4860 strcat(z_etype,"Number"); break;
4862 strcpy(z_etype,"Note"); break;
4864 strcpy(z_etype,"Postal"); break;
4866 strcpy(z_etype,"E-Mail"); break;
4868 strcpy(z_etype,"unknown data"); break;
4871 fprintf(stdout,_(" ---> Subentry: %u\n"),i+1);
4872 fprintf(stdout,_(" Entry type: %u (%s)\n"),entry.SubEntries[i].EntryType,z_etype);
4873 fprintf(stdout,_(" Number type: %u\n"),entry.SubEntries[i].NumberType);
4874 fprintf(stdout,_(" Block Number: %u\n"),entry.SubEntries[i].BlockNumber);
4876 fprintf(stdout,_(" %s: %s\n"),z_etype,entry.SubEntries[i].data.Number);
4880 if ((entry.MemoryType==GMT_DC ||
4881 entry.MemoryType==GMT_RC ||
4882 entry.MemoryType==GMT_MC) && !wasdate)
4883 fprintf(stdout,_(" Date and time not available\n"));
4885 fprintf(stdout,_(" Location empty\n"));
4888 case GE_NOTIMPLEMENTED:
4889 fprintf( stderr, _("Function not implemented in %s model!\n"), model);
4892 case GE_INVALIDMEMORYTYPE:
4893 fprintf( stderr, _("Memory type %s not supported!\n"),
4894 memory_type_string);
4898 fprintf(stdout, _("%s|%d|Bad location or other error!(%d)\n"),
4899 memory_type_string, count, error);
4908 /* Read data from stdin, parse and write to phone. The parsing is relatively
4909 crude and doesn't allow for much variation from the stipulated format. */
4911 static int writephonebook(int argc, char *args[])
4914 GSM_PhonebookEntry entry;
4916 char *memory_type_string;
4917 int line_count=0,current,i;
4920 char *Line, OLine[1024], BackLine[1024];
4923 /* Check argument */
4925 if (strcmp("-i", args[0])) {
4930 /* Initialise fbus code */
4936 /* Go through data from stdin. */
4938 while (GetLine(stdin, Line, sizeof(OLine))!=-1) {
4940 current=0;BackLine[current++]=Line[0];
4941 for (i=1;i<strlen(Line);i++) {
4942 if (Line[i-1]==';' && Line[i]==';') BackLine[current++]=' ';
4943 BackLine[current++]=Line[i];
4945 BackLine[current++]=0;
4947 strcpy(Line,BackLine);
4951 #if defined(__svr4__) || defined(__FreeBSD__)
4952 ptr=strtok(Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4955 ptr=strtok(NULL, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4957 ptr=strtok(NULL, ";");
4959 ptr=strsep(&Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4962 ptr=strsep(&Line, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4964 ptr=strsep(&Line, ";");
4968 fprintf(stderr, _("Format problem on line %d [%s] 1\n"), line_count, BackLine);
4973 if (!strncmp(ptr,"ME", 2))
4975 memory_type_string = "int";
4976 entry.MemoryType = GMT_ME;
4978 else if (!strncmp(ptr,"SM", 2))
4980 memory_type_string = "sim";
4981 entry.MemoryType = GMT_SM;
4985 fprintf(stderr, _("Format problem on line %d [%s] 2: %s\n"),
4986 line_count, BackLine,ptr);
4990 #if defined(__svr4__) || defined(__FreeBSD__)
4991 ptr=strtok(NULL, ";"); if (ptr) entry.Location=atoi(ptr);
4993 ptr=strtok(NULL, ";"); if (ptr) entry.Group=atoi(ptr);
4995 ptr=strsep(&Line, ";"); if (ptr) entry.Location=atoi(ptr);
4997 ptr=strsep(&Line, ";"); if (ptr) entry.Group=atoi(ptr);
5001 fprintf(stderr, _("Format problem on line %d [%s] 3\n"),
5002 line_count, BackLine);
5006 for( subentry = 0; ; subentry++ )
5008 #if defined(__svr4__) || defined(__FreeBSD__)
5009 ptr=strtok(NULL, ";");
5011 ptr=strsep(&Line, ";");
5013 if( ptr && *ptr != 0 )
5014 entry.SubEntries[subentry].EntryType=atoi(ptr);
5018 #if defined(__svr4__) || defined(__FreeBSD__)
5019 ptr=strtok(NULL, ";");
5021 ptr=strsep(&Line, ";");
5024 entry.SubEntries[subentry].NumberType=atoi(ptr);
5025 // Phone Numbers need to have a number type.
5026 if(!ptr && entry.SubEntries[subentry].EntryType == GSM_Number)
5028 fprintf(stderr, _("Missing phone number type on line %d"
5029 " entry %d [%s]\n"), line_count, subentry, BackLine);
5034 #if defined(__svr4__) || defined(__FreeBSD__)
5035 ptr=strtok(NULL, ";");
5037 ptr=strsep(&Line, ";");
5040 entry.SubEntries[subentry].BlockNumber=atoi(ptr);
5042 #if defined(__svr4__) || defined(__FreeBSD__)
5043 ptr=strtok(NULL, ";");
5045 ptr=strsep(&Line, ";");
5047 // 0x13 Date Type; it is only for Dailed Numbers, etc.
5048 // we don't store to this memories so it's an error to use it.
5049 if(!ptr || entry.SubEntries[subentry].EntryType == GSM_Date)
5051 fprintf(stderr, _("Is not a phone number on line %d entry %d [%s]\n"),
5052 line_count, subentry, BackLine);
5057 strcpy( entry.SubEntries[subentry].data.Number, ptr );
5060 entry.SubEntriesCount = subentry;
5063 /* This is to send other exports (like from 6110) to 7110 */
5064 if (!entry.SubEntriesCount) {
5065 entry.SubEntriesCount = 1;
5066 entry.SubEntries[subentry].EntryType = GSM_Number;
5067 entry.SubEntries[subentry].NumberType = GSM_General;
5068 entry.SubEntries[subentry].BlockNumber = 2;
5069 strcpy(entry.SubEntries[subentry].data.Number, entry.Number);
5075 GSM_PhonebookEntry tmp_entry;
5077 memcpy(&tmp_entry, &entry, sizeof(GSM_PhonebookEntry) );
5078 error = GSM->GetMemoryLocation(&tmp_entry);
5079 if (error == GE_NONE) {
5080 if (!tmp_entry.Empty) {
5083 FILE *input_flow; //for reading from console, even when input redir.
5085 input_flow = fopen(DEV_CONSOLE, "r");
5088 fprintf(stderr, _("Can't open \"%s\" for input !\n"),DEV_CONSOLE);
5092 fprintf(stderr, _("Location busy. "));
5093 while (confirm < 0) {
5094 fprintf(stderr, _("Overwrite? (yes/no) "));
5095 GetLine(input_flow, ans, 7);
5096 if (!strcmp(ans, "yes")) confirm = 1;
5097 else if (!strcmp(ans, "no")) confirm = 0;
5099 if (!confirm) continue;
5102 fprintf(stderr, _("Unknown error (%d)\n"), error);
5108 /* Do write and report success/failure. */
5109 semicolon_pipe_substitution( &entry, 1 );
5111 error = GSM->WritePhonebookLocation(&entry);
5113 if (error == GE_NONE)
5114 fprintf (stdout, _("Write Succeeded: memory type: %s, loc: %d, name: %s, number: %s\n"), memory_type_string, entry.Location, entry.Name, entry.Number);
5116 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);
5125 /* Getting speed dials. */
5127 static int getspeeddial(char *Number) {
5129 GSM_SpeedDial entry;
5131 GSM_PhonebookEntry pbentry;
5133 entry.Number = atoi(Number);
5137 if (GSM->GetSpeedDial(&entry)==GE_NONE) {
5138 pbentry.Location=entry.Location;
5139 if (pbentry.Location==0) pbentry.Location=entry.Number;
5140 pbentry.MemoryType=entry.MemoryType;
5142 error=GSM->GetMemoryLocation(&pbentry);
5144 if (error == GE_NONE)
5146 fprintf(stdout, _("SpeedDial nr. %d: %d:%d (%s)\n"), entry.Number, entry.MemoryType, entry.Location,pbentry.Name);
5148 fprintf(stdout, _("Error\n"));
5150 fprintf(stdout, _("Error\n"));
5158 /* Setting speed dials. */
5160 static int setspeeddial(char *argv[]) {
5162 GSM_SpeedDial entry;
5164 char *memory_type_string;
5166 /* Handle command line args that set type, start and end locations. */
5168 if (strcmp(argv[1], "ME") == 0) {
5169 entry.MemoryType = GMT_ME;
5170 memory_type_string = "ME";
5172 else if (strcmp(argv[1], "SM") == 0) {
5173 entry.MemoryType = GMT_SM;
5174 memory_type_string = "SM";
5177 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
5182 entry.Number = atoi(argv[0]);
5183 entry.Location = atoi(argv[2]);
5187 if (GSM->SetSpeedDial(&entry) == GE_NONE) {
5188 fprintf(stdout, _("Succesfully written!\n"));
5198 /* Getting the status of the display. */
5200 int getdisplaystatus()
5205 /* Initialise the code for the GSM interface. */
5209 if (GSM->GetDisplayStatus(&Status)==GE_NONE) {
5211 printf(_("Call in progress: %s\n"), Status & (1<<DS_Call_In_Progress)?_("on"):_("off"));
5212 printf(_("Unknown: %s\n"), Status & (1<<DS_Unknown)?_("on"):_("off"));
5213 printf(_("Unread SMS: %s\n"), Status & (1<<DS_Unread_SMS)?_("on"):_("off"));
5214 printf(_("Voice call: %s\n"), Status & (1<<DS_Voice_Call)?_("on"):_("off"));
5215 printf(_("Fax call active: %s\n"), Status & (1<<DS_Fax_Call)?_("on"):_("off"));
5216 printf(_("Data call active: %s\n"), Status & (1<<DS_Data_Call)?_("on"):_("off"));
5217 printf(_("Keyboard lock: %s\n"), Status & (1<<DS_Keyboard_Lock)?_("on"):_("off"));
5218 printf(_("SMS storage full: %s\n"), Status & (1<<DS_SMS_Storage_Full)?_("on"):_("off"));
5221 printf(_("Error\n"));
5229 int netmonitor(char *Mode)
5232 unsigned char mode=atoi(Mode);
5233 char Screen[NM_MAX_SCREEN_WIDTH];
5238 if (!strcmp(Mode,"reset")) mode=0xf0;
5239 else if (!strcmp(Mode,"off")) mode=0xf1;
5240 else if (!strcmp(Mode,"field"))mode=0xf2;
5241 else if (!strcmp(Mode,"devel"))mode=0xf3;
5242 else if (!strcmp(Mode,"next")) mode=0x00;
5245 for (i=0;i<NM_MAX_SCREEN_WIDTH;i++) Screen[i]=0;
5247 GSM->NetMonitor(mode, Screen);
5250 printf("%s\n", Screen);
5257 #endif /* UCLINUX */
5259 static int identify( void )
5261 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
5262 char imei[64], model[64], rev[64], manufacturer[64];
5268 while (GSM->GetIMEI(imei) != GE_NONE) sleep(1);
5270 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
5272 while (GSM->GetModel(model) != GE_NONE) sleep(1);
5275 strcpy(manufacturer, "(unknown)");
5277 GSM->GetManufacturer(manufacturer);
5280 fprintf(stdout, _("IMEI: %s\n"), imei);
5281 fprintf(stdout, _("Model: %s %s (%s)\n"), manufacturer, GetModelName (model), model);
5282 fprintf(stdout, _("Revision: %s\n"), rev);
5293 int senddtmf(char *String)
5298 if (GSM->SendDTMF(String)!=GE_NONE) fprintf(stdout,_("Error!\n"));
5305 #endif /* UCLINUX */
5307 /* Resets the phone */
5308 static int reset(int argc, char *argv[])
5311 unsigned char _type=0x03;
5316 if (!strcmp(argv[0],"soft")) _type = 0x03;
5318 /* Doesn't work with 5110 */
5319 if (!strcmp(argv[0],"hard")) _type = 0x04;
5322 fprintf(stderr, _("What kind of reset do you want (second parameter can be \"soft\" or \"hard\") ?\n"));
5338 /* This is a "convenience" function to allow quick test of new API stuff which
5339 doesn't warrant a "proper" command line function. */
5341 int foogle(char *argv[])
5343 /* Initialise the code for the GSM interface. */
5347 // Fill in what you would like to test here...
5358 /* Initialise the code for the GSM interface. */
5362 if (GSM->PhoneTests()!=GE_NONE) fprintf(stderr,_("Error\n"));
5369 /* pmon allows fbus code to run in a passive state - it doesn't worry about
5370 whether comms are established with the phone. A debugging/development
5377 GSM_ConnectionType connection=GCT_FBUS;
5379 /* Initialise the code for the GSM interface. */
5381 error = GSM_Initialise(model, Port, Initlength, connection, RLP_DisplayF96Frame, ""/*SynchronizeTime*/);
5383 if (error != GE_NONE) {
5384 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
5396 int setringtone(int argc, char *argv[])
5398 GSM_Ringtone ringtone;
5399 GSM_BinRingtone binringtone,binringtone2;
5403 int current=0; //number of packed notes or location
5408 /* If not binary ringtone */
5409 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone2)!=GE_NONE) {
5410 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5412 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5414 ringtone.location=1;
5415 if (argc>1) ringtone.location=atoi(argv[1]);
5417 ringtone.allnotesscale=false;
5419 /* Initialise the GSM interface. */
5422 while (GSM->GetModel(model) != GE_NONE)
5425 /* For Nokia 6110/6130/6150/6210 we use different method of uploading.
5426 Phone will display menu, when received it */
5427 if ( !strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") ||
5428 !strcmp(model,"NSM-1") || !strcmp(model,"NPE-3") ) {
5429 if (argc==1) ringtone.location=255;
5432 error=GSM->SetRingtone(&ringtone,¤t);
5434 if (current!=ringtone.NrNotes) {
5435 if (current>FB61_MAX_RINGTONE_NOTES) {
5436 fprintf(stderr,_("Warning: due to phone limitation"));
5438 fprintf(stderr,_("Warning: ringtone was too long to be saved into frame,"));
5440 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5444 fprintf(stdout, _("Set succeeded!\n"));
5446 fprintf(stdout, _("Setting failed\n"));
5448 } else { /* This IS binary ringtone */
5449 fprintf(stdout,_("Binary ringtone format\n"));
5452 binringtone.frame[current++]=0x00;
5453 binringtone.frame[current++]=0x00;
5454 binringtone.frame[current++]=0x0c;
5455 binringtone.frame[current++]=0x01;
5456 binringtone.frame[current++]=0x2c;
5459 memcpy(binringtone.frame+current,argv[2],strlen(argv[2]));
5460 current=current+strlen(argv[2]);
5464 while(binringtone2.frame[i]!=0x00) {
5465 if (i==binringtone.length) break;
5470 memcpy(binringtone.frame+current,binringtone2.frame+i,binringtone2.length-i);
5471 binringtone.length=binringtone2.length-i+current;
5474 memcpy(binringtone.frame+current,binringtone2.frame,binringtone2.length);
5475 binringtone.length=binringtone2.length;
5478 binringtone.location=1;
5479 if (argc>1) binringtone.location=atoi(argv[1]);
5481 /* Initialise the GSM interface. */
5484 error=GSM->SetBinRingtone(&binringtone);
5488 fprintf(stdout, _("Set succeeded!\n"));
5490 case GE_INVALIDRINGLOCATION:
5491 fprintf(stdout, _("Invalid location %i!\n"),binringtone.location);
5493 case GE_UNKNOWNMODEL:
5494 fprintf(stdout, _("Mygnokii doesn't know format for this model!\n"));
5496 case GE_NOTIMPLEMENTED:
5497 fprintf(stdout, _("Not implemented for this model!\n"));
5500 fprintf(stdout, _("Not supported by this model!\n"));
5510 int ringtoneconvert(int argc, char *argv[])
5512 GSM_Ringtone ringtone;
5514 if (!strcmp(argv[0],argv[1]))
5516 fprintf(stderr, _("Files can't have the same names !\n"));
5520 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5522 ringtone.allnotesscale=false;
5524 GSM_SaveRingtoneFileOnConsole(argv[1], &ringtone);
5529 int playringtone(int argc, char *argv[])
5531 GSM_Ringtone ringtone;
5533 GSM_BinRingtone binringtone;
5539 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
5540 int binary_notes[12] =
5541 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
5543 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone)!=GE_NONE) {
5544 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5546 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5548 /* Initialise the GSM interface. */
5551 fprintf(stdout,_("Playing \"%s\" (%i notes)\n"),ringtone.name,ringtone.NrNotes);
5553 GSM_PlayRingtoneOnConsole(&ringtone);
5557 fprintf(stdout,_("Binary ringtone format\n"));
5559 /* Initialise the GSM interface. */
5563 while (true) { //skipping name
5564 if (binringtone.frame[i]==0) break;
5570 if (binringtone.frame[i]!=j) {
5573 fprintf(stdout,_("Block in binary ringtone %i %i\n"),j,z);
5580 if (!isok && j>=114 && j<=125) {
5581 j=14*3+binary_notes[j-114];
5584 if (!isok && j>=126 && j<=137) {
5585 j=14*1+binary_notes[j-126];
5588 if (!isok && j>=138 && j<=149) {
5589 j=14*2+binary_notes[j-138];
5592 if (!isok && j>=150 && j<=161) {
5593 j=14*4+binary_notes[j-150];
5598 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
5601 Hz=GSM_GetFrequency(j);
5602 if (GSM->PlayTone(Hz,5)!=GE_NONE) fprintf(stdout,_("error during playing\n"));
5606 j=binringtone.frame[i];
5607 z=binringtone.frame[i+1];
5609 z=z+binringtone.frame[i+1];
5612 if (i>=binringtone.length) break;
5623 int composer(int argc, char *argv[])
5625 GSM_Ringtone ringtone;
5628 int oldnoteslen=4,nownoteslen,oldnoteslen2;
5629 int oldnotesscale=1,nownotesscale;
5630 bool firstnote=true;
5631 int DefNoteTempo=63;
5633 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5635 if (ringtone.NrNotes!=0)
5636 DefNoteTempo=ringtone.notes[0].tempo;
5638 fprintf(stdout,_("Ringtone \"%s\" (tempo = %i Beats Per Minute)\n\n"),ringtone.name,GSM_GetTempo(DefNoteTempo));
5640 for (i=0;i<ringtone.NrNotes;i++) {
5641 if (DefNoteTempo!=ringtone.notes[i].tempo) {
5642 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"));
5647 for (i=0;i<ringtone.NrNotes;i++) {
5650 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5660 if ((ringtone.NrNotes-i)>50)
5661 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);
5663 fprintf(stdout,_("This ringtone in Nokia Composer in phone should look: "));
5667 for (i=0;i<ringtone.NrNotes;i++) {
5670 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5676 switch (ringtone.notes[i].duration) {
5677 case 192:fprintf(stdout,_("1."));break; //192=128*1.5
5678 case 128:fprintf(stdout,_("1"));break;
5679 case 96 :fprintf(stdout,_("2."));break; //96=64*1.5
5680 case 64 :fprintf(stdout,_("2"));break;
5681 case 48 :fprintf(stdout,_("4."));break; //48=32*1.5
5682 case 32 :fprintf(stdout,_("4"));break;
5683 case 24 :fprintf(stdout,_("8."));break; //24=16*1.5
5684 case 16 :fprintf(stdout,_("8"));break;
5685 case 12 :fprintf(stdout,_("16."));break; //12=8*1.5
5686 case 8 :fprintf(stdout,_("16"));break;
5687 case 6 :fprintf(stdout,_("32."));break; //6=4*1.5
5688 case 4 :fprintf(stdout,_("32"));break;
5693 /* What note here ? */
5694 switch (GSM_GetNote(ringtone.notes[i].note)) {
5695 case Note_C :fprintf(stdout,_("c"));break;
5696 case Note_Cis:fprintf(stdout,_("#c"));break;
5697 case Note_D :fprintf(stdout,_("d"));break;
5698 case Note_Dis:fprintf(stdout,_("#d"));break;
5699 case Note_E :fprintf(stdout,_("e"));break;
5700 case Note_F :fprintf(stdout,_("f"));break;
5701 case Note_Fis:fprintf(stdout,_("#f"));break;
5702 case Note_G :fprintf(stdout,_("g"));break;
5703 case Note_Gis:fprintf(stdout,_("#g"));break;
5704 case Note_A :fprintf(stdout,_("a"));break;
5705 case Note_Ais:fprintf(stdout,_("#a"));break;
5706 case Note_H :fprintf(stdout,_("h"));break;
5707 default :fprintf(stdout,_("-"));unknown=true;break; //Pause ?
5711 fprintf(stdout,_("%i"),ringtone.notes[i].note/14);
5713 /* And separator before next note */
5714 if (i!=ringtone.NrNotes-1)
5715 fprintf(stdout,_(" "));
5721 fprintf(stdout,_("\n\nTo enter it please press: "));
5725 for (i=0;i<ringtone.NrNotes;i++) {
5728 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5736 /* What note here ? */
5737 switch (GSM_GetNote(ringtone.notes[i].note)) {
5738 case Note_C :fprintf(stdout,_("1"));break;
5739 case Note_Cis:fprintf(stdout,_("1"));break;
5740 case Note_D :fprintf(stdout,_("2"));break;
5741 case Note_Dis:fprintf(stdout,_("2"));break;
5742 case Note_E :fprintf(stdout,_("3"));break;
5743 case Note_F :fprintf(stdout,_("4"));break;
5744 case Note_Fis:fprintf(stdout,_("4"));break;
5745 case Note_G :fprintf(stdout,_("5"));break;
5746 case Note_Gis:fprintf(stdout,_("5"));break;
5747 case Note_A :fprintf(stdout,_("6"));break;
5748 case Note_Ais:fprintf(stdout,_("6"));break;
5749 case Note_H :fprintf(stdout,_("7"));break;
5750 default :fprintf(stdout,_("0"));unknown=true;break;
5753 switch (ringtone.notes[i].duration) {
5754 case 192:fprintf(stdout,_("(longer)"));break; //192=128*1.5
5755 case 96 :fprintf(stdout,_("(longer)"));break; //96=64*1.5
5756 case 48 :fprintf(stdout,_("(longer)"));break; //48=32*1.5
5757 case 24 :fprintf(stdout,_("(longer)"));break; //24=16*1.5
5758 case 12 :fprintf(stdout,_("(longer)"));break; //12=8*1.5
5759 case 6 :fprintf(stdout,_("(longer)"));break; //6=4*1.5
5763 /* What note here ? */
5764 switch (GSM_GetNote(ringtone.notes[i].note)) {
5765 case Note_Cis:fprintf(stdout,_("#"));break;
5766 case Note_Dis:fprintf(stdout,_("#"));break;
5767 case Note_Fis:fprintf(stdout,_("#"));break;
5768 case Note_Gis:fprintf(stdout,_("#"));break;
5769 case Note_Ais:fprintf(stdout,_("#"));break;
5775 nownotesscale=ringtone.notes[i].note/14;
5777 if (nownotesscale!=oldnotesscale) {
5778 switch (nownotesscale) {
5780 switch (oldnotesscale) {
5781 case 2:fprintf(stdout,_("**"));break;
5782 case 3:fprintf(stdout,_("*"));break;
5786 switch (oldnotesscale) {
5787 case 1:fprintf(stdout,_("*"));break;
5788 case 3:fprintf(stdout,_("**"));break;
5792 switch (oldnotesscale) {
5793 case 1:fprintf(stdout,_("**"));break;
5794 case 2:fprintf(stdout,_("*"));break;
5800 oldnotesscale=nownotesscale;
5804 oldnoteslen2=oldnoteslen;
5806 switch (ringtone.notes[i].duration) {
5807 case 192:nownoteslen=1;break; //192=128*1.5
5808 case 128:nownoteslen=1;break;
5809 case 96 :nownoteslen=2;break; //96=64*1.5
5810 case 64 :nownoteslen=2;break;
5811 case 48 :nownoteslen=4;break; //48=32*1.5
5812 case 32 :nownoteslen=4;break;
5813 case 24 :nownoteslen=8;break; //24=16*1.5
5814 case 16 :nownoteslen=8;break;
5815 case 12 :nownoteslen=16;break; //12=8*1.5
5816 case 8 :nownoteslen=16;break;
5817 case 6 :nownoteslen=32;break; //6=4*1.5
5818 case 4 :nownoteslen=32;break;
5821 if (nownoteslen>oldnoteslen) {
5822 while (oldnoteslen!=nownoteslen) {
5823 fprintf(stdout,_("8"));
5824 oldnoteslen=oldnoteslen*2;
5828 if (nownoteslen<oldnoteslen) {
5829 while (oldnoteslen!=nownoteslen) {
5830 fprintf(stdout,_("9"));
5831 oldnoteslen=oldnoteslen/2;
5835 if (GSM_GetNote(ringtone.notes[i].note)==Note_Pause)
5836 oldnoteslen=oldnoteslen2;
5838 /* And separator before next note */
5839 if (i!=ringtone.NrNotes-1)
5840 fprintf(stdout,_(" "));
5845 fprintf(stdout,_("\n"));
5851 int sendringtone(int argc, char *argv[])
5853 GSM_Ringtone ringtone;
5854 GSM_MultiSMSMessage SMS;
5856 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5858 if (GSM_ReadRingtoneFileOnConsole(argv[1], &ringtone)!=GE_NONE) return(-1);
5860 ringtone.allnotesscale=false;
5862 for (i=0;i<argc;i++) {
5863 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5864 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5867 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5869 if (current!=ringtone.NrNotes) {
5870 if (current>FB61_MAX_RINGTONE_NOTES) {
5871 fprintf(stderr,_("Warning: due to phone limitation"));
5873 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5875 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5878 for (i=0;i<SMS.number;i++) {
5879 strcpy(SMS.SMS[i].Destination,argv[0]);
5882 /* Initialise the GSM interface. */
5885 GSM_SendMultiPartSMSOnConsole(&SMS, 2,argc,argv,false,true,true);
5890 int saveringtone(int argc, char *argv[])
5892 GSM_Ringtone ringtone;
5893 GSM_MultiSMSMessage SMS;
5895 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5897 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5899 ringtone.allnotesscale=false;
5901 for (i=0;i<argc;i++) {
5902 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5903 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5906 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5908 if (current!=ringtone.NrNotes) {
5909 if (current>FB61_MAX_RINGTONE_NOTES) {
5910 fprintf(stderr,_("Warning: due to phone limitation"));
5912 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5914 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5917 for (i=0;i<SMS.number;i++) {
5918 /* Only 11 chars could be here */
5919 strncpy(SMS.SMS[i].Destination,ringtone.name,11);
5922 /* Initialise the GSM interface. */
5925 GSM_SaveMultiPartSMSOnConsole(&SMS,1,argc,argv,false,false,true,true);
5930 /* Converts logo files. */
5932 int bitmapconvert(int argc, char *argv[])
5935 GSM_NetworkInfo NetworkInfo;
5939 if (!strcmp(argv[0],argv[1]))
5941 fprintf(stderr, _("Files can't have the same names !\n"));
5945 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
5950 if (!strcmp(argv[2],"op"))
5953 if (argc<4) doit=true;
5954 if (argc<4 && bitmap.type!=GSM_OperatorLogo) doit=true;
5958 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5961 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
5964 strncpy(bitmap.netcode,argv[3],7);
5965 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5967 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5973 if (!strcmp(argv[2],"7110op"))
5976 if (argc<4) doit=true;
5977 if (argc<4 && bitmap.type!=GSM_7110OperatorLogo) doit=true;
5981 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5984 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
5987 strncpy(bitmap.netcode,argv[3],7);
5988 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5990 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5996 if (!strcmp(argv[2],"caller"))
5998 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
6002 if ((num<0)||(num>9)) num=0;
6010 if (!strcmp(argv[2],"startup"))
6012 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
6015 if (!strcmp(argv[2],"7110startup"))
6017 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
6020 if (!strcmp(argv[2],"6210startup"))
6022 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
6025 if (!strcmp(argv[2],"picture"))
6027 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
6032 fprintf(stderr,"Unknown type of logo: %s !\n",argv[2]);
6037 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
6042 int getphoneprofile()
6047 /* Initialise the GSM interface. */
6051 error=GSM->GetProductProfileSetting(&PPS);
6052 if (error!=GE_NONE) {
6053 fprintf(stdout,_("Error!\n"));
6057 fprintf(stdout,_("ALS : "));
6058 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6059 else fprintf(stdout,_("off\n"));
6061 PPS.Name=PPS_VibraMenu;
6062 GSM->GetProductProfileSetting(&PPS);
6063 fprintf(stdout,_("Vibra menu : "));
6064 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6065 else fprintf(stdout,_("off\n"));
6067 PPS.Name=PPS_GamesMenu;
6068 GSM->GetProductProfileSetting(&PPS);
6069 fprintf(stdout,_("Games menu : "));
6070 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6071 else fprintf(stdout,_("off\n"));
6073 PPS.Name=PPS_HRData;
6074 GSM->GetProductProfileSetting(&PPS);
6075 fprintf(stdout,_("HR Data : "));
6076 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6077 else fprintf(stdout,_("off\n"));
6079 PPS.Name=PPS_14400Data;
6080 GSM->GetProductProfileSetting(&PPS);
6081 fprintf(stdout,_("14400 Data : "));
6082 if (PPS.bool_value) fprintf(stdout,_("on\n"));
6083 else fprintf(stdout,_("off\n"));
6085 PPS.Name=PPS_LCDContrast;
6086 GSM->GetProductProfileSetting(&PPS);
6087 fprintf(stdout,_("LCD Contrast : %i%%\n"),PPS.int_value);
6090 GSM->GetProductProfileSetting(&PPS);
6091 fprintf(stdout,_("EFR : "));
6092 switch (PPS.int_value) {
6093 case 0: fprintf(stdout,_("off\n")); break;
6094 case 1: fprintf(stdout,_("last\n")); break;
6095 case 2: fprintf(stdout,_("second\n"));break;
6096 case 3: fprintf(stdout,_("first\n")); break;
6100 GSM->GetProductProfileSetting(&PPS);
6101 fprintf(stdout,_("FR : "));
6102 switch (PPS.int_value) {
6103 case 0: fprintf(stdout,_("off\n")); break;
6104 case 1: fprintf(stdout,_("last\n")); break;
6105 case 2: fprintf(stdout,_("second\n"));break;
6106 case 3: fprintf(stdout,_("first\n")); break;
6110 GSM->GetProductProfileSetting(&PPS);
6111 fprintf(stdout,_("HR : "));
6112 switch (PPS.int_value) {
6113 case 0: fprintf(stdout,_("off\n")); break;
6114 case 1: fprintf(stdout,_("last\n")); break;
6115 case 2: fprintf(stdout,_("second\n"));break;
6116 case 3: fprintf(stdout,_("first\n")); break;
6125 int setphoneprofile(int argc, char *argv[])
6129 bool correct_arg1=false, correct_arg2=false;
6131 if (!strcmp(argv[0],"ALS")) {
6134 if (!strcmp(argv[1],"1")) {
6135 PPS.bool_value=true;
6138 if (!strcmp(argv[1],"0")) {
6139 PPS.bool_value=false;
6142 if (!correct_arg2) {
6143 fprintf(stdout,_("Settings for ALS parameter can be \"0\" or \"1\" !\n"));
6147 if (!strcmp(argv[0],"HRData")) {
6148 PPS.Name=PPS_HRData;
6150 if (!strcmp(argv[1],"1")) {
6151 PPS.bool_value=true;
6154 if (!strcmp(argv[1],"0")) {
6155 PPS.bool_value=false;
6158 if (!correct_arg2) {
6159 fprintf(stdout,_("Settings for HRData parameter can be \"0\" or \"1\" !\n"));
6163 if (!correct_arg1) {
6164 fprintf(stdout,_("First parameter can be \"ALS\" or \"HRData\" only !\n"));
6168 /* Initialise the GSM interface. */
6171 error=GSM->SetProductProfileSetting(&PPS);
6173 if (error!=GE_NONE) {
6174 fprintf(stdout,_("Error!\n"));
6187 int getoperatorname()
6190 GSM_Network network;
6192 /* Initialise the GSM interface. */
6195 if (GSM->GetOperatorName(&network)==GE_NONE)
6197 if (!strcmp(network.Name,"")) {
6198 fprintf(stdout,_("Phone doesn't have downloaded operator name\n"));
6200 fprintf(stdout,_("Phone has downloaded operator name (\"%s\") for \"%s\" (\"%s\") network\n"),
6201 network.Name,network.Code,GSM_GetNetworkName(network.Code));
6211 int setoperatorname(int argc, char *argv[])
6214 GSM_Network network;
6216 /* Initialise the GSM interface. */
6220 strncpy(network.Code,argv[0],7);
6221 strncpy(network.Name,argv[1],50);
6223 strcpy(network.Code,"000 00\0");
6224 strcpy(network.Name,"\0");
6227 if (GSM->SetOperatorName(&network)==GE_NONE) {
6228 if (GSM->GetOperatorName(&network)==GE_NONE) {
6229 if (!strcmp(network.Name,"")) {
6230 fprintf(stdout,_("Downloaded operator name is removed\n"));
6232 fprintf(stdout,_("Downloaded operator name changed for \"%s\" network (\"%s\") to \"%s\"\n"),
6233 network.Code,GSM_GetNetworkName(network.Code),network.Name);
6244 int getvoicemailbox()
6246 GSM_PhonebookEntry entry;
6248 /* Initialise the GSM interface. */
6251 if (GSM->GetVoiceMailbox(&entry)==GE_NONE) {
6252 fprintf(stdout,_("Voice mailbox number is "));
6253 if (!strcmp(entry.Number,""))
6254 fprintf(stdout,_("not set\n"));
6256 fprintf(stdout,_("\"%s\"\n"),entry.Number);
6265 ///////////////////////////////////////////////////////////////////////////////
6266 // flow diagram of netmonitordata():
6267 ///////////////////////////////////////////////////////////////////////////////
6269 // get command line argument
6273 // if specific phone model
6276 // identify-phone: (((((((( TO DO )))))))))))))
6280 // get_mon_param_info() get phone netmonitor parameters name
6281 // specifically to a 'model'
6284 // parse_check() check command line arguments
6285 // | if all OK, go on else stop.
6286 // | because we can have a input file
6287 // v containing multiple
6288 // parse_process() command lines, we process each at once
6289 // so we can exit early on errors.
6291 ///////////////////////////////////////////////////////////////////////////////
6293 // private functions, see netmonitordata()
6294 void free_nm_info(PARAM_INFO_MON *info)
6296 PARAM_INFO_MON *tmp; // pointer, iterator on info
6298 // go to end of list
6300 while (info->next != NULL)
6310 ///////////////////////////////////////////////////////////////////////////////
6311 // this func retrieve parameters info from a file
6312 // and load it in a dynamic array, NULL terminated,
6313 // if 2rd parameter is not NULL, it load also description of screen
6314 // return (PARAM_INFO_MON *start) if all is OK, else NULL
6315 ///////////////////////////////////////////////////////////////////////////////
6316 // start->->next->next->next-> ...->next->NULL
6319 // par0 par1 par2 parN
6320 ///////////////////////////////////////////////////////////////////////////////
6321 // this should be de-allocated from calling function,
6322 // also, screen_name should be deallocated from calling function
6323 ///////////////////////////////////////////////////////////////////////////////
6325 PARAM_INFO_MON *get_mon_param_info(char *f_name, char *screen_name[NM_MAX_SCREEN+1])
6327 PARAM_INFO_MON *start; // pointer to netmonitor parameters info
6328 PARAM_INFO_MON *info; // pointer, iterator on info
6329 PARAM_INFO_MON *check; // pointer, iterator on info, for check usage
6338 char tmp_mname[55]; // very larger, but if netmon bug ...
6339 int x, y, len, s, t; // x & y coord, len, screen nr, type
6342 if (screen_name != NULL)
6343 for (i = 0; i <= NM_MAX_SCREEN; i++)
6344 screen_name[i] = NULL;
6347 if ((f_info = fopen(f_name, "r")) == NULL)
6348 { fprintf(stderr, "Can' t open file parameter info: <%s>\n", f_name);
6352 if ((start = malloc(sizeof(PARAM_INFO_MON))) == NULL)
6353 { fprintf(stderr, "no mem\n");
6357 { start->next = NULL;
6361 while (fgets(buf, 256, f_info) != NULL)
6365 // Truncate from '#' at right of comments
6366 if ((tmp = strchr(param, '#')) != NULL)
6369 // Strip leading, trailing whitespace
6370 while(isspace((int) *param))
6373 while((strlen(param) > 0) && isspace((int) param[strlen(param) - 1]))
6374 param[strlen(param) - 1] = '\0';
6376 // Ignore blank lines
6377 if ((*param == '\n') || (*param == '\0'))
6382 fprintf(stderr, "%s: info line: <%s>\n", f_name, param);
6384 // check for param name
6385 if ((param_name = strtok(param, "=\t\n")) == NULL)
6388 // check if screen name
6389 if (strncmp("SCREEN", param_name, 6) == 0)
6391 // if we do not want screen names ...
6392 if (screen_name == NULL)
6395 // FIXME check for screen nr
6396 if ((tmp = strtok(NULL, ":\n")) == NULL)
6400 // FIXME: check if already defined screen
6402 if ((i <= 0) || (i > NM_MAX_SCREEN))
6404 // check for screen name
6405 if ((tmp = strtok(NULL, ":\n")) == NULL)
6408 screen_name[i] = strdup(tmp);
6414 // FIXME: check for NM_MAX_FIELDS
6416 // check for x coord
6417 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6421 // check for y coord
6422 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6427 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6432 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6436 // check for netmon manual name
6437 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6439 "%s: PARAMETER <%s> in screen <%d>, not have netmon manual reference\n",
6440 f_name, param_name, s);
6441 free_nm_info(start);
6444 strcpy(tmp_mname, tmp);
6446 // check for data type (optional)
6447 if ((tmp = strtok(NULL, ":\t\n")) != NULL)
6452 // check len, here, so we print parameter name
6455 "%s: PARAMETER <%s> in screen <%d>, has invalid data lenght\n",
6456 f_name, param_name, s);
6457 free_nm_info(start);
6461 // check if already defined same param_name
6463 while (check->next != NULL)
6464 { check = check->next;
6465 if (strcmp(param_name, check->name) == 0)
6468 "%s: PARAMETER <%s> in screen <%d> already defined as in screen <%d>\n",
6469 f_name, param_name, s, check->s_nr);
6470 free_nm_info(start);
6475 // make space, and add parameter
6476 if ((info->next = malloc(sizeof(PARAM_INFO_MON))) != NULL)
6479 info->name = strdup(param_name);
6484 info->mname = strdup(tmp_mname);
6487 info->next = NULL; // mark end
6491 fprintf(stderr, "no mem");
6492 free_nm_info(start);
6504 while (info->next != NULL)
6507 fprintf(stderr, "info name %s\n", info->name);
6513 // 2, parse the arguments and check command(s) line
6514 // command line, phone spec input, and output are complex,
6515 // so we exit printing info about error instead of std help
6516 ///////////////////////////////////////////////////////////////////////////////
6518 int parse_check(int argc, char *argv[], PARAM_INFO_MON *start, char *f_name, int line)
6527 PARAM_INFO_MON *info; // iterator on this list
6530 for (i = 0; i < argc; i++)
6531 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6541 { // should be one of the short option
6542 if (strcmp(argv[i], "-fs") == 0)
6543 { // field separator, next arg should be a string
6544 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6546 // arg OK, do nothing
6551 "-fs: Invalid field separator in <%s> at line %d\n",
6554 fprintf(stderr, "-fs: Invalid field separator\n");
6558 else if (strcmp(argv[i], "-ls") == 0)
6559 { // line separator, next arg should be a string
6560 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6562 // arg OK, do nothing
6567 "-ls: Invalid line separator in <%s> at line %d\n",
6570 fprintf(stderr, "-ls: Invalid line separator\n");
6574 else if (strcmp(argv[i], "-tm") == 0)
6575 { // time separator, next arg should be a millisecond (200-10000)
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]) >= 200) && (atoi(argv[i+1]) <= 10000))
6589 // arg OK, do nothing
6594 "-tm: Invalid argument (200-10000 milliseconds), in <%s> at line %d\n",
6597 fprintf(stderr, "-tm: Invalid argument (200-10000 milliseconds)\n");
6601 else if (strcmp(argv[i], "-ts") == 0)
6602 { // time separator, next arg should be a seconds (1-3600)
6606 "-tm, -ts, are mutually exclusive, in <%s> at line %d\n",
6609 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6613 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6616 // arg OK, do nothing
6621 "-ts: Invalid argument (1-3600 seconds) in <%s> at line %d\n",
6624 fprintf(stderr, "-ts: Invalid argument (1-3600 seconds)\n");
6628 else if (strcmp(argv[i], "-n") == 0)
6629 { // nr of data pump, before stop collection,
6630 // next arg should be a int > 0
6631 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6633 // arg OK, do nothing
6638 "-n: Invalid argument (1-99999 times) in <%s> at line %d\n",
6641 fprintf(stderr, "-n: Invalid argument (1-99999 times)\n");
6645 else if (strcmp(argv[i], "-h") == 0)
6646 { // we do NOT want header (default with header)
6647 // arg OK, do nothing
6649 else if (strcmp(argv[i], "-S") == 0)
6650 { // we have used use specs from a file instead of standard info,
6651 // next arg is an existing readable filename
6652 // as already parsed correctly, we skip here.
6655 else if (strcmp(argv[i], "-I") == 0)
6656 { // we have used input from a file instead of command line
6657 // next arg is an existing readable filename
6658 // as already parsed correctly, we skip here.
6664 fprintf(stderr, "Unrecognized option %s in <%s> at line %d\n",
6665 argv[i], f_name, line);
6667 fprintf(stderr, "Unrecognized option %s\n", argv[i]);
6672 { // should be required data
6673 tmp = strdup(argv[i]);
6674 p = strtok(tmp, ":\t\n");
6677 // check if there is an output format specification
6687 // we have 'minus', so, probably forget format ...
6691 "Required data <%s->, without format specifiers in <%s> at line %d\n",
6695 "Required data <%s->, without format specifiers\n", p);
6701 // we check for params
6704 while (info->next != NULL)
6707 if (strcmp(p, info->name) == 0)
6709 if (ctr > NM_MAX_FIELDS)
6713 "too much data field ... in file <%s> at line %d\n",
6716 fprintf(stderr, "too much data field ...\n");
6729 if (found_data == 0)
6733 "Required data <%s>, not found in info-mon specifications in <%s> at line %d\n",
6737 "Required data <%s>, not found in info-mon specifications\n", p);
6741 p = strtok(NULL, ":\t\n");
6743 } // end while strtok
6745 } // end else '-' (short options)
6754 fprintf(stderr, "no required data! in <%s> at line %d\n", f_name, line);
6756 fprintf(stderr, "no required data!\n");
6763 // 2, parse the arguments and process the command line
6764 // no checks are needed here, because already do in parse_check
6765 // it return a pointer to info needed for make output, or NULL if errors
6766 ///////////////////////////////////////////////////////////////////////////////
6767 OUT_INFO_MON *parse_process(int argc, char *argv[], PARAM_INFO_MON *start)
6778 PARAM_INFO_MON *info; // iterator on this list
6779 OUT_INFO_MON *out_param; // iterator on this list
6781 if ((out_param = malloc(sizeof(OUT_INFO_MON))) == NULL)
6782 { fprintf(stderr, "no mem\n");
6787 fprintf(stderr, "parse_process: argc = %d\n", argc);
6788 for (i = 0; i < argc; i++)
6789 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6792 for (i = 0; i < NM_MAX_FIELDS; i++)
6793 out_param->data[i] = NULL;
6795 strcpy(out_param->req_fs, " ");
6797 strcpy(out_param->req_ls, "\n\r");
6799 strcpy(out_param->req_ls, "\n");
6802 out_param->req_n = 0;
6803 out_param->req_header = 1;
6806 req_tm = 200; /* default wait */
6815 { // should be one of the short option
6816 if (strcmp(argv[i], "-fs") == 0)
6817 { // field separator, next arg should be a string
6818 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6820 strcpy(out_param->req_fs, argv[i]);
6823 { fprintf(stderr, "NEVER BE:-fs: Invalid field separator\n");
6827 else if (strcmp(argv[i], "-ls") == 0)
6828 { // line separator, next arg should be a string
6829 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6831 strcpy(out_param->req_ls, argv[i]);
6834 { fprintf(stderr, "NEVER BE:-ls: Invalid line separator\n");
6838 else if (strcmp(argv[i], "-tm") == 0)
6839 { // time separator, next arg should be a millisecond (200-10000)
6841 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6845 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6847 req_tm = atoi(argv[i]);
6851 { fprintf(stderr, "NEVER BE:-tm: Invalid argument (200-10000 milliseconds)\n");
6855 else if (strcmp(argv[i], "-ts") == 0)
6856 { // time separator, next arg should be a seconds (1-3600)
6858 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6862 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6864 req_ts = atoi(argv[i]);
6871 { fprintf(stderr, "NEVER BE:-ts: Invalid argument (1-3600 seconds)\n");
6875 else if (strcmp(argv[i], "-n") == 0)
6876 { // nr of data pump, before stop collection,
6877 // next arg should be a int > 0
6878 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6880 out_param->req_n = atoi(argv[i]);
6883 { fprintf(stderr, "NEVER BE:-n: Invalid argument (1-99999 times)\n");
6887 else if (strcmp(argv[i], "-h") == 0)
6888 { // we do NOT want header (default with header)
6889 out_param->req_header = 0;
6891 else if (strcmp(argv[i], "-S") == 0)
6892 { // we have used use specs from a file instead of standard info,
6893 // next arg is an existing readable filename
6894 // as already parsed correctly, we skip here.
6897 else if (strcmp(argv[i], "-I") == 0)
6898 { // we have used input from a file instead of command line
6899 // next arg is an existing readable filename
6900 // as already parsed correctly, we skip here.
6905 fprintf(stderr, "NEVER BE:Unrecognized option %s\n", argv[i]);
6910 { // should be required data
6911 tmp = strdup(argv[i]);
6912 p = strtok(tmp, ":\t\n");
6915 // check if there is an output format specification
6925 // we have 'minus', so, probably forget format ...
6928 "NEVER BE:Required data <%s->, without format specifiers\n", p);
6934 // we check for params
6937 while (info->next != NULL)
6940 if (strcmp(p, info->name) == 0)
6942 if (ctr > NM_MAX_FIELDS)
6944 fprintf(stderr, "NEVER BE:too much data field ...");
6947 out_param->data[ctr] = info;
6948 out_param->out_f[ctr] = *o;
6955 if (found_data == 0)
6958 "NEVER BE:Required data <%s>, not found in info-mon specifications\n", p);
6963 p = strtok(NULL, ":\t\n");
6965 } // end while strtok
6967 // here, we have an array of pointers to required data
6968 // and an array of output specifiers, from 0 to [ctr-1]
6970 } // end else '-' (short options)
6978 fprintf(stderr, "NEVER BE:no required data!\n");
6982 // now, what netmon screen we need to retrieve ?
6983 // we need somewhat were checking is faster, as our goal is lower cicle time
6985 // we can have NM_MAX_SCREEN=254 screens, so we use an array, of unsigned char,
6986 // each char contain number of needed screen, 255 is list terminator
6988 for (i = 0; i <= NM_MAX_SCREEN; i++)
6989 out_param->req_screen[i] = 255;
6993 fprintf(stderr, "Start Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6995 while (out_param->data[ctr] != NULL)
6998 fprintf(stderr, "Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
7000 // check if screen already in
7003 while (out_param->req_screen[i] != 255)
7005 if (out_param->req_screen[i] == out_param->data[ctr]->s_nr)
7006 { // already load, skip
7013 if (found_data == 0)
7016 fprintf(stderr, "i = %d, out_param->req_screen[%d] = %d\n", i, i, out_param->data[ctr]->s_nr);
7018 out_param->req_screen[i] = out_param->data[ctr]->s_nr;
7027 while (out_param->req_screen[i] != 255)
7029 fprintf(stderr, "Required screen %d\n", out_param->req_screen[i]);
7035 out_param->req_wait = req_tm * 1000;
7037 out_param->req_wait = req_ts * 1000000;
7039 out_param->req_wait = req_tm * 1000;
7045 int nmd_output(OUT_INFO_MON *out_param)
7055 char Screen[NM_MAX_SCREEN_WIDTH];
7057 struct tm *date_time;
7059 if (out_param->req_header)
7061 // print phone help header
7063 while (out_param->data[d] != NULL)
7064 { len = out_param->data[d]->len;
7065 if (strlen(out_param->data[d]->name) > len)
7066 len = strlen(out_param->data[d]->name);
7067 if (strlen(out_param->data[d]->mname) > len)
7068 len = strlen(out_param->data[d]->mname);
7069 printf("%*.*s%s", len, len, out_param->data[d]->name, out_param->req_fs);
7072 printf("%s", out_param->req_ls);
7074 // print netmon manual header
7076 while (out_param->data[d] != NULL)
7077 { len = out_param->data[d]->len;
7078 if (strlen(out_param->data[d]->name) > len)
7079 len = strlen(out_param->data[d]->name);
7080 if (strlen(out_param->data[d]->mname) > len)
7081 len = strlen(out_param->data[d]->mname);
7082 printf("%*.*s%s", len, len, out_param->data[d]->mname, out_param->req_fs);
7085 printf("%s", out_param->req_ls);
7086 printf("%s", out_param->req_ls);
7092 // stop after n data punp
7095 if ((out_param->req_n) && (ctr > out_param->req_n))
7098 // datapump: for each screen, for each required data, load data info->value
7101 while(out_param->req_screen[i] != 255)
7103 if (out_param->req_screen[i] == 0)
7106 date_time = localtime(&sec);
7107 sprintf(Screen, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7109 date_time->tm_mon+1,
7110 date_time->tm_year+1900,
7115 fprintf(stderr, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7117 date_time->tm_mon+1,
7118 date_time->tm_year+1900,
7126 GSM->NetMonitor(out_param->req_screen[i], Screen);
7129 // we have one screen of data, load those required
7132 while (out_param->data[d] != NULL)
7134 if (out_param->data[d]->s_nr == out_param->req_screen[i])
7138 nr_line = out_param->data[d]->y;
7139 while ((*p) && (nr_line))
7147 fprintf(stderr, "\nthis line: %s\n\n", p);
7151 nr_chr = out_param->data[d]->x;
7152 while ((*p) && (nr_chr))
7156 // this the start of data
7158 len = out_param->data[d]->len;
7159 while ((*p) && (len))
7160 { out_param->data[d]->value[n] = *p;
7165 // pad with space if shorter than presumed
7166 while ((*p) && (len))
7167 { out_param->data[d]->value[n] = ' ';
7172 out_param->data[d]->value[n] = '\0';
7181 // print row of data
7183 while (out_param->data[d] != NULL)
7185 len = out_param->data[d]->len;
7186 if (out_param->req_header)
7187 { if (strlen(out_param->data[d]->name) > len)
7188 len = strlen(out_param->data[d]->name);
7189 if (strlen(out_param->data[d]->mname) > len)
7190 len = strlen(out_param->data[d]->mname);
7192 // FIXME check format
7193 printf("%*.*s%s", len, len, out_param->data[d]->value, out_param->req_fs);
7196 printf("%s", out_param->req_ls);
7198 usleep(out_param->req_wait);
7202 printf("%s%s", out_param->req_ls, out_param->req_ls);
7208 ///////////////////////////////////////////////////////////////////////////////
7209 int netmonitordata(int argc, char *argv[])
7211 char *loc_info = NULL; // path to --netmonitordata directory
7212 char *f_name; // absolute path of phone info-file
7213 int flag_phone_spec = 0; // flags, set if used -S option
7215 char model[20] = "phonepar"; // TO DO: PHONE AUTODETECTION
7216 // char phver[20] = "";
7218 PARAM_INFO_MON *start; // pointer to list of parsed phone params
7219 OUT_INFO_MON *out_param; // pointer to struct of output data
7221 char *f_commands = NULL; // file containings input line arguments
7222 FILE *commands; // Handle for this file
7223 char buf[1024]; // buffer
7224 char *f_argv[NM_MAX_FIELDS+30]; // space for parameters and cmdline options
7226 char *p, *tmp; // various counter, flags, tmp area ...
7233 signal(SIGINT, interrupted);
7235 // FIXME model, phone_version
7237 // before parsing phone-info-file, we check for user specified phone-info-file
7242 if (strcmp(argv[i], "-S") == 0)
7246 flag_phone_spec = 1;
7247 loc_info = strdup(argv[i+1]);
7251 { fprintf(stderr, "option -S require an argument ...\n");
7259 if (loc_info != NULL)
7260 { f_name = strdup(loc_info);
7262 else // we use standard file specification
7264 if ((tmp = getenv("INFOMONPATH")) == NULL)
7265 { loc_info = strdup(".");
7268 { loc_info = strdup(tmp);
7271 f_name = malloc(strlen(loc_info)+strlen(model)+10);
7272 sprintf(f_name, "%s/%s", loc_info, model);
7277 // fprintf(stderr, "Loc_info <%s> model <%s> version <%s>\n", loc_info, model, phver);
7278 fprintf(stderr, "Info file: <%s>\n", f_name);
7280 if ((start = get_mon_param_info(f_name, NULL)) == NULL)
7283 // option -I give us the possibility of specify a filename,
7284 // containing a "sequence" of command line args.
7285 // if you specify this option, you can use (on command line) only -S option.
7286 // other options may be specified inside the input-file.
7287 // contents of this file as the same sintax as the command line,
7288 // except it must not contain "--netmonitordata" or "-I" or "-S" options
7289 ///////////////////////////////////////////////////////////////////////
7294 if (strcmp(argv[i], "-I") == 0)
7298 if ((argc == 2) || ((argc == 4) && flag_phone_spec == 1))
7299 { f_commands = strdup(argv[i+1]);
7302 { fprintf(stderr, "option -I accept only additional -S option.\n");
7309 { fprintf(stderr, "option -I require an argument ...\n");
7317 // before all, we check all command line
7319 if (f_commands != NULL)
7322 fprintf(stderr, "netmonitordata(check): commands from <%s>\n", f_commands);
7326 // read line, make array f_argv, and counter f_argc
7327 // parse & check args, so errors are checked before real processing
7328 // (-I option here is ignored)
7329 // (-S option can be here, and it is used)
7332 if ((commands = fopen(f_commands, "r")) == NULL)
7333 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7337 // FIXME line may be be splitted
7339 while (fgets(buf, 1024, commands) != NULL)
7344 // Truncate from '#' at right of comments
7345 if ((tmp = strchr(p, '#')) != NULL)
7348 // Strip leading, trailing whitespace
7349 while(isspace((int) *p))
7352 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7353 p[strlen(p) - 1] = '\0';
7355 // Ignore blank lines
7356 if ((*p == '\n') || (*p == '\0'))
7360 fprintf(stderr, "netmonitordata(check): row <%s>\n", p);
7365 p = strtok(p, " \t");
7367 { f_argv[f_argc++] = strdup(p);
7369 fprintf(stderr, "netmonitordata(check): token <%s>\n", p);
7371 p = strtok(NULL, " \t"); // OK p, (NULL)
7373 while ((p != NULL) && (*p));
7375 // here we have f_argc, f_argv, this line is OK
7377 if (parse_check(f_argc, f_argv, start, f_commands, line) != 0)
7378 { free_nm_info(start);
7385 else // as above, but we have only command line, argv, argc.
7387 if (parse_check(argc, argv, start, NULL, 0) != 0)
7388 { free_nm_info(start);
7393 // here, all commands line are checked, and are correct
7395 if (f_commands != NULL)
7398 fprintf(stderr, "netmonitordata(process): commands from <%s>\n", f_commands);
7403 // read line, make array f_argv, and counter f_argc
7404 // parse_process argument, (-I option here is ignored)
7405 // (-S option can be here, and it is used)
7406 // (make header // these are in nmd_output();
7413 if ((commands = fopen(f_commands, "r")) == NULL)
7414 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7418 // FIXME line may be be splitted
7419 while (fgets(buf, 1024, commands) != NULL)
7423 // Truncate from '#' at right of comments
7424 if ((tmp = strchr(p, '#')) != NULL)
7427 // Strip leading, trailing whitespace
7428 while(isspace((int) *p))
7431 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7432 p[strlen(p) - 1] = '\0';
7434 // Ignore blank lines
7435 if ((*p == '\n') || (*p == '\0'))
7441 p = strtok(p, " \t");
7443 { f_argv[f_argc++] = strdup(p);
7444 p = strtok(NULL, " \t"); // OK p, (NULL)
7446 while ((p != NULL) && (*p));
7448 // here we have f_argc, f_argv, this line is OK
7450 if ((out_param = parse_process(f_argc, f_argv, start)) == NULL)
7451 { free_nm_info(start);
7452 return(-1); /* NEVER BE */
7455 // here, command line has no error ...
7457 nmd_output(out_param);
7464 else // as above, but we have only command line, argv, argc.
7466 if ((out_param = parse_process(argc, argv, start)) == NULL)
7467 { free_nm_info(start);
7468 return(-1); /* NEVER BE */
7470 nmd_output(out_param);
7479 /* I analised this source and this should be done. But when compile with VC6 */
7480 /* I have error. So, commented... MW */
7482 free_nm_info(start);
7489 // used by nm_collect()
7490 ///////////////////////////////////////////////////////////////////////////////
7491 char *rowScreen(char *s)
7495 // make Screen in one row
7507 void printtime(void)
7511 int Year; /* The complete year specification - e.g. 1999. Y2K :-) */
7512 int Month; /* January = 1 */
7517 int Timezone; /* The difference between local time and GMT */
7523 now=localtime(&nowh);
7525 Date.Year = now->tm_year;
7526 Date.Month = now->tm_mon+1;
7527 Date.Day = now->tm_mday;
7528 Date.Hour = now->tm_hour;
7529 Date.Minute = now->tm_min;
7530 Date.Second = now->tm_sec;
7532 /* I have 100 (for 2000) Year now :-) */
7533 if (Date.Year>99 && Date.Year<1900) {
7534 Date.Year=Date.Year+1900;
7537 printf("%d:%d:%d:%d:%d:%d ",Date.Day,Date.Month,Date.Year,Date.Hour,Date.Minute,Date.Second);
7541 // like netmonitor(), but print in one row, 1, 2 or 3 screen, every ~0.3 s
7542 ///////////////////////////////////////////////////////////////////////////////
7543 int nm_collect(int argc, char *argv[])
7545 int mode[MAX_NM_COLLECT];
7546 char Screen[NM_MAX_SCREEN_WIDTH];
7549 for (i=0;i<argc;i++) {
7550 argc > i ? (mode[i] = atoi(argv[i])): (mode[i] = 0);
7553 for (i=0;i<argc;i++) {
7554 if (mode[i]==0 && strcmp(argv[i],"-d")) {
7555 fprintf(stderr, "Wrong %i parameter (not number and not -d)\n",i);
7560 signal(SIGINT, interrupted);
7567 for (i=0;i<argc;i++) {
7568 if (!strcmp(argv[i],"-d")) {
7574 for (i=0;i<argc;i++) {
7577 GSM->NetMonitor(mode[i], Screen);
7578 printf("%s::", rowScreen(Screen));
7593 int sniff(int argc, char *argv[])
7595 /* base model comes from gnokiirc */
7596 strcat(model,"sniff");
7598 if (argc>0) strcpy(Port,argv[0]);
7600 /* Initialise the GSM interface. */
7603 /* Loop here indefinitely - allows you to see messages from GSM code in
7604 response to unknown messages etc. The loops ends after pressing the
7606 while (!bshutdown) {
7616 int decodefile(int argc, char *argv[])
7619 unsigned char in_buffer[255];
7623 /* base model comes from gnokiirc */
7624 strcat(model,"decode");
7626 /* Initialise the GSM interface. */
7629 printf ("open InPutFile: %s\n", argv[0]);
7630 if ( (infile = fopen( argv[0], "rb")) == NULL ) {
7631 printf ("Failed to open InPutFile: %s\n", argv[0]);
7634 while ( (nr_read = fread(in_buffer, 1, 16, infile)) > 0 ) {
7635 for (i=0; i < nr_read; i++)
7636 Protocol->StateMachine(in_buffer[i]);
7644 int getringtone(int argc, char *argv[])
7646 GSM_BinRingtone ringtone;
7648 GSM_Ringtone SMringtone;
7656 ringtone.location=1;
7657 if (argc>1) ringtone.location=atoi(argv[1]);
7659 /* Initialise the GSM interface. */
7662 error=GSM->GetBinRingtone(&ringtone);
7664 while (GSM->GetModel(model) != GE_NONE)
7669 fprintf(stdout, _("Downloaded ringtone, location %i: "),ringtone.location);
7673 fprintf(stdout, _("get succeeded!\n"));
7674 fprintf(stdout, _("Name: %s (binary format)\n"),ringtone.name);
7676 case GE_INVALIDRINGLOCATION:
7677 fprintf(stdout, _("invalid location %i!\n"),ringtone.location);
7679 case GE_UNKNOWNMODEL:
7681 /* In 3310 we have normal "Smart Messaging" format */
7682 if (GetModelFeature (FN_RINGTONES)==F_RING_SM) {
7685 if (ringtone.frame[9]==0x4a && ringtone.frame[10]==0x3a) i=8;
7686 ringtone.frame[i]=0x02;
7688 GSM_UnPackRingtone(&SMringtone, ringtone.frame+i, ringtone.length-i);
7690 fprintf(stdout, _("Name: %s (normal format)\n"),SMringtone.name);
7692 GSM_SaveRingtoneFileOnConsole(argv[0], &SMringtone);
7697 fprintf(stdout, _("mygnokii doesn't know format for this model!\n"));
7699 case GE_NOTIMPLEMENTED:
7700 fprintf(stdout, _("not implemented for this model!\n"));
7703 fprintf(stdout, _("not supported by this model!\n"));
7710 file = fopen(argv[0], "wb");
7713 return(GE_CANTOPENFILE);
7715 fwrite(ringtone.frame, 1, ringtone.length, file);
7723 int binringtoneconvert(int argc, char *argv[])
7725 GSM_BinRingtone ringtone;
7734 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
7735 int binary_notes[12] =
7736 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
7738 if (GSM_ReadBinRingtoneFile(argv[0],&ringtone)!=GE_NONE) {
7739 fprintf(stdout,_("Failed to read %s file!\n"),argv[0]);
7743 file = fopen(argv[1], "wb");
7746 return(GE_CANTOPENFILE);
7750 if (ringtone.frame[i]==0) break;
7751 fprintf(file,_("%c"),ringtone.frame[i]);
7755 fprintf(file,_(":d=32,o=5,b=300:"));
7759 if (ringtone.frame[i]!=j) {
7766 if (!isok && j>=114 && j<=125) {
7767 j=14*3+binary_notes[j-114];
7770 if (!isok && j>=126 && j<=137) {
7771 j=14*1+binary_notes[j-126];
7774 if (!isok && j>=138 && j<=149) {
7775 j=14*2+binary_notes[j-138];
7778 if (!isok && j>=150 && j<=161) {
7779 j=14*4+binary_notes[j-150];
7784 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
7790 if (w>z && (w/2)<=z) {
7792 case 1:fprintf(file,_("16"));break;
7793 case 2:fprintf(file,_("8"));break;
7794 case 3:fprintf(file,_("4"));break;
7795 case 4:fprintf(file,_("2"));break;
7796 case 5:fprintf(file,_("1"));break;
7801 if (z>w) fprintf(file,_("1"));
7803 switch (GSM_GetNote(j)) {
7804 case Note_C :fprintf(file,_("c"));break;
7805 case Note_Cis:fprintf(file,_("c#"));break;
7806 case Note_D :fprintf(file,_("d"));break;
7807 case Note_Dis:fprintf(file,_("d#"));break;
7808 case Note_E :fprintf(file,_("e"));break;
7809 case Note_F :fprintf(file,_("f"));break;
7810 case Note_Fis:fprintf(file,_("f#"));break;
7811 case Note_G :fprintf(file,_("g"));break;
7812 case Note_Gis:fprintf(file,_("g#"));break;
7813 case Note_A :fprintf(file,_("a"));break;
7814 case Note_Ais:fprintf(file,_("a#"));break;
7815 case Note_H :fprintf(file,_("h"));break;
7816 default :pause=true;fprintf(file,_("p"));break; //Pause ?
7821 if (w>z && (w/2)<=z) {
7822 fprintf(file,_("."));
7826 if ((j/14)!=1 && !pause) fprintf(file,_("%i"),j/14);
7827 fprintf(file,_(","));
7830 j=ringtone.frame[i];
7831 z=ringtone.frame[i+1];
7833 z=z+ringtone.frame[i+1];
7836 if (i>=ringtone.length) break;
7845 int renamesmsc(int argc, char *argv[])
7847 GSM_MessageCenter MessageCenter;
7849 MessageCenter.No=atoi(argv[0]);
7851 /* Initialise the GSM interface. */
7854 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
7855 fprintf(stdout,_("SMSC number %i get OK\n"),MessageCenter.No);
7858 fprintf(stdout,_("Error getting SMSC number %i\n"),MessageCenter.No);
7862 strncpy(MessageCenter.Name,argv[1],10);
7864 if (GSM->SetSMSCenter(&MessageCenter) == GE_NONE) {
7865 fprintf(stdout,_("SMSC number %i set OK (renamed to \"%s\")\n"),MessageCenter.No,MessageCenter.Name);
7868 fprintf(stdout,_("Error setting SMSC number %i\n"),MessageCenter.No);
7877 #endif /* UCLINUX */
7880 * Returns number of sostituited characters.
7881 * ... may be useful one day ??
7883 static int semicolon_pipe_substitution( GSM_PhonebookEntry *pentry, unsigned int direction )
7884 /* direction = 0 : after reading phone memory (
7885 * 1 : writing phone memory
7889 register int count=0;
7890 char charfrom, charto;
7892 charfrom= (direction==0) ? ';' : '|';
7893 charto = (direction==0) ? '|' : ';';
7895 count+=str_substch(pentry->Name, charfrom, charto );
7896 count+=str_substch(pentry->Number, charfrom, charto );
7898 for( i = 0; i < pentry->SubEntriesCount; i++ )
7900 if( pentry->SubEntries[i].EntryType != GSM_Date )
7901 count+=str_substch(pentry->SubEntries[i].data.Number ,charfrom,charto);
7907 int str_substch( char *str, const char toric, const char sost )
7912 for( ct = 0; ct < strlen(str); ct++ )
7913 if( str[ct] == (unsigned char) toric )
7914 { str[ct] = sost; i_sost++; }
7921 extern GSM_Error N6110_EnableExtendedCommands (unsigned char status);
7923 /* Allows to set simlock state.
7924 With older phone (older 51xx, 61xx) can open them, with older
7925 and newer should be able to close them */
7926 /* DO NOT TRY, IF DON'T WANT, WHAT YOU DO !!!!!!!!!! */
7929 GSM_AllSimlocks siml;
7931 unsigned char closebuffer[20]=
7932 { 0x00, 0x01, 0x82, 0x01,
7933 0x00, /* which simlock */
7935 0x00, 0x00, 0x00, /* lock 1 info */
7936 0x00, 0x00, 0x00, 0x00, 0x00, /* lock 4 info */
7937 0x00, 0x00, /* lock 2 info */
7938 0x00, 0x00, /* lock 3 info */
7940 unsigned char openbuffer[10]= { 0x00, 0x01, 0x81, 0x01,
7941 0x00, /* lock number */
7942 0x10, 0x10, 0x10, 0x10, 0x10 };
7943 unsigned char openbuffer0[10]= {0x00, 0x01, 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00 };
7945 unsigned char info[120];
7948 /* Initialise the code for the GSM interface. */
7950 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7952 fprintf(stderr,("Not supported\n"));
7956 N6110_EnableExtendedCommands(0x02);
7958 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7959 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7961 /* Opening all locks (we must check, if we can open them) */
7962 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7963 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7964 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7965 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7966 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7967 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7968 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7971 if (siml.simlocks[i].enabled) {
7972 fprintf(stderr,_("Can not open simlock %i\n"),i+1);GSM->Terminate();return -1;
7975 /* Making frame for closing simlocks */
7976 strcpy(info,"00101");
7978 while (j!=strlen(info)) {
7979 if (j+2<=strlen(info)) {
7980 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7982 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7985 strcpy(info,"0000");j=0;i=15;
7986 while (j!=strlen(info)) {
7987 if (j+2<=strlen(info)) {
7988 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7990 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7993 strcpy(info,"0000");j=0;i=17;
7994 while (j!=strlen(info)) {
7995 if (j+2<=strlen(info)) {
7996 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7998 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
8001 strcpy(info,"0000000001");j=0;i=9;
8002 while (j!=strlen(info)) {
8003 if (j+2<=strlen(info)) {
8005 closebuffer[i]=closebuffer[i] | (info[j] & 0x0f);j++;
8007 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
8010 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
8013 /* Closing simlock with given values */
8014 closebuffer[4]=1+2+4+8;
8015 NULL_SendMessageSequence(50, &CurrentMagicError, 20, 0x40,closebuffer);
8016 /* Opening all locks */
8017 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
8018 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8019 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8020 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8021 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
8029 GSM_AllSimlocks siml;
8032 /* Initialise the code for the GSM interface. */
8035 if (GSM->SimlockInfo(&siml)!=GE_NONE) fprintf(stderr,_("Error\n"));
8037 fprintf(stdout,_("MCC + MNC : %s ("),siml.simlocks[0].data);
8038 if (siml.simlocks[0].enabled) fprintf(stdout,_("CLOSED"));
8039 else fprintf(stdout,_("opened"));
8040 if (siml.simlocks[0].factory) fprintf(stdout,_(") (factory"));
8041 else fprintf(stdout,_(") (user"));
8042 fprintf(stdout,_(") (counter %i"),siml.simlocks[0].counter);
8044 s[0]=siml.simlocks[0].data[0];
8045 s[1]=siml.simlocks[0].data[1];
8046 s[2]=siml.simlocks[0].data[2];
8048 s[4]=siml.simlocks[0].data[3];
8049 s[5]=siml.simlocks[0].data[4];
8052 if (strcmp(GSM_GetNetworkName(s),"unknown"))
8053 fprintf(stdout,_(") (network \"%s\""),GSM_GetNetworkName(s));
8055 fprintf(stdout,_(")\n"));
8057 fprintf(stdout,_("GID1 : %s ("),siml.simlocks[1].data);
8058 if (siml.simlocks[1].enabled) fprintf(stdout,_("CLOSED"));
8059 else fprintf(stdout,_("opened"));
8060 if (siml.simlocks[1].factory) fprintf(stdout,_(") (factory"));
8061 else fprintf(stdout,_(") (user"));
8062 fprintf(stdout,_(") (counter %i"),siml.simlocks[1].counter);
8063 fprintf(stdout,_(")\n"));
8065 fprintf(stdout,_("GID2 : %s ("),siml.simlocks[2].data);
8066 if (siml.simlocks[2].enabled) fprintf(stdout,_("CLOSED"));
8067 else fprintf(stdout,_("opened"));
8068 if (siml.simlocks[2].factory) fprintf(stdout,_(") (factory"));
8069 else fprintf(stdout,_(") (user"));
8070 fprintf(stdout,_(") (counter %i"),siml.simlocks[2].counter);
8071 fprintf(stdout,_(")\n"));
8073 fprintf(stdout,_("MSIN : %s ("),siml.simlocks[3].data);
8074 if (siml.simlocks[3].enabled) fprintf(stdout,_("CLOSED"));
8075 else fprintf(stdout,_("opened"));
8076 if (siml.simlocks[3].factory) fprintf(stdout,_(") (factory"));
8077 else fprintf(stdout,_(") (user"));
8078 fprintf(stdout,_(") (counter %i"),siml.simlocks[3].counter);
8079 fprintf(stdout,_(")\n"));
8086 /* Getting EEPROM from older phones */
8087 /* Tested with N5110 5.07, 6150 5.22 */
8092 unsigned char buffer[1000]={ 0x00, 0x01, 0xd4, 0x02, 0x00, 0xa0,
8093 0x00, 0x00, /* location Lo and Hi */
8094 0x10 }; /* how many bytes */
8096 strcpy(Connection,"mbus");
8097 fprintf(stderr,_("Switching connection type to MBUS\n"));
8099 strcpy(model,"5110");
8101 /* Initialise the code for the GSM interface. */
8104 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
8106 fprintf(stderr,("Not supported\n"));
8111 for (i=0;i<64;i++) {
8112 fprintf(stdout,_("%c"),0xff);
8119 if ((i/256)!=((i-1)/256)) fprintf(stderr,_("."));
8121 if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE) break;
8126 fprintf(stderr,_("\n"));
8135 GSM_SMSFolders folders;
8140 /* Initialise the code for the GSM interface. */
8145 error=GSM->GetSMSFolders(&folders);
8149 if (error!=GE_NONE && !folders.number) {
8150 fprintf(stdout,_("Error!\n"));
8154 for (i=0;i<folders.number;i++) {
8155 fprintf(stdout,_("%i. %s\n"),i+1,folders.Folder[i].Name);
8161 int resetphonesettings()
8163 /* Initialise the code for the GSM interface. */
8166 GSM->ResetPhoneSettings();
8175 /* Checked on 3310 4.02 and doesn't work.
8176 Possible reasons: SMSC has problems (possible), bug in phone firmware
8177 (very possible) or here in code.
8178 I quess, that the second is the most possible - 3310 treat only 3 SMS
8179 as linked (the most often profile needs 4 - 2 and few bytes in 3'th
8180 for screen saver, few bytes for profile name and 1 or 2 sms for ringtone).
8181 When send separate ringtone (see --sendringtone with --profilestyle)
8182 and screen saver (--sendlogo screensaver...), it's received OK.
8183 It's for checking in higher firmware. */
8184 int sendprofile(int argc, char *argv[])
8186 GSM_Ringtone ringtone;
8188 GSM_MultiSMSMessage MultiSMS;
8192 u8 MessageBuffer[140*4];
8193 u16 MessageLength=0;
8195 char profilename[10+1];
8197 if (GSM_ReadRingtoneFileOnConsole(argv[2], &ringtone)!=GE_NONE) return(-1);
8199 ringtone.allnotesscale=false;
8200 for (i=0;i<argc;i++)
8201 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
8203 /* The fourth argument is the bitmap file. */
8204 if (GSM_ReadBitmapFileOnConsole(argv[3], &bitmap)!=GE_NONE) return -1;
8206 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
8208 strncpy(profilename,argv[1],10);
8210 MessageBuffer[MessageLength++]=0x30; //SM version. Here 3.0
8212 MessageBuffer[MessageLength++]=SM30_PROFILENAME; //ID for profile name
8213 MessageBuffer[MessageLength++]=0x00; //length hi
8214 MessageBuffer[MessageLength++]=strlen(profilename);//length lo
8216 EncodeUnicode (MessageBuffer+MessageLength,profilename ,strlen(profilename));
8217 MessageLength=MessageLength+2*strlen(profilename);
8219 MessageBuffer[MessageLength++]=SM30_RINGTONE; //ID for ringtone
8221 MessageBuffer[MessageLength++]=0x01; //length hi
8222 MessageBuffer[MessageLength++]=0x00; //length lo
8224 j=SM30_MAX_RINGTONE_FRAME_LENGTH;
8225 current=GSM_PackRingtone(&ringtone, MessageBuffer+MessageLength, &j);
8226 MessageLength=MessageLength+j;
8228 if (current!=ringtone.NrNotes) {
8229 if (current>FB61_MAX_RINGTONE_NOTES) {
8230 fprintf(stderr,_("Warning: due to phone limitation"));
8232 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
8234 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
8237 MessageBuffer[i]=(j)/256;
8238 MessageBuffer[i+1]=(j)%256;
8240 MessageBuffer[MessageLength++]=SM30_SCREENSAVER; //ID for OTA screen saver
8241 MessageBuffer[MessageLength++]=0x01; //length hi
8242 MessageBuffer[MessageLength++]=0x00; //length lo
8243 MessageBuffer[MessageLength++]=0x00;
8244 MessageBuffer[MessageLength++]=bitmap.width;
8245 MessageBuffer[MessageLength++]=bitmap.height;
8246 MessageBuffer[MessageLength++]=0x01;
8248 memcpy(MessageBuffer+MessageLength,bitmap.bitmap,bitmap.size);
8249 MessageLength=MessageLength+bitmap.size;
8251 GSM_MakeMultiPartSMS2(&MultiSMS,MessageBuffer,MessageLength, GSM_ProfileUDH, GSM_Coding_Default);
8255 /* Initialise the GSM interface. */
8258 for (i=0;i<MultiSMS.number;i++)
8259 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
8261 return GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,false,false,false);
8264 int showbitmap(int argc, char *argv[])
8268 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
8270 GSM_PrintBitmap(&bitmap);
8275 int getwapsettings(int argc, char *argv[])
8277 GSM_WAPSettings settings;
8280 settings.location=atoi(argv[0]);
8282 /* Initialise the GSM interface. */
8285 error=GSM->GetWAPSettings(&settings);
8289 fprintf(stdout,_("%s."),argv[0]);
8290 if (!(strcmp(settings.title,""))) fprintf(stdout,_("Set %s\n"),argv[0]);
8291 else fprintf(stdout,_("%s\n"),settings.title);
8292 fprintf(stdout,_("Homepage: %s\n"),settings.homepage);
8293 if (settings.iscontinuous) fprintf(stdout,_("Connection type: continuous\n"));
8294 else fprintf(stdout,_("Connection type: temporary\n"));
8295 if (settings.issecurity) fprintf(stdout,_("Connection security: on\n"));
8296 else fprintf(stdout,_("Connection security: off\n"));
8297 switch (settings.bearer) {
8298 case WAPSETTINGS_BEARER_SMS:
8299 fprintf(stdout,_("Bearer: SMS\n"));
8300 fprintf(stdout,_("Server number: %s\n"),settings.server);
8301 fprintf(stdout,_("Service number: %s\n"),settings.service);
8303 case WAPSETTINGS_BEARER_DATA:
8304 fprintf(stdout,_("Bearer: Data (CSD)\n"));
8305 fprintf(stdout,_("Dial-up number: %s\n"),settings.dialup);
8306 fprintf(stdout,_("IP address: %s\n"),settings.ipaddress);
8307 if (settings.isnormalauthentication) fprintf(stdout,_("Authentication type: normal\n"));
8308 else fprintf(stdout,_("Authentication type: secure\n"));
8309 if (settings.isISDNcall) fprintf(stdout,_("Data call type: ISDN\n"));
8310 else fprintf(stdout,_("Data call type: analogue\n"));
8311 if (settings.isspeed14400) fprintf(stdout,_("Data call speed: 14400\n"));
8312 else fprintf(stdout,_("Data call speed: 9600\n"));
8313 fprintf(stdout,_("User name: %s\n"),settings.user);
8314 fprintf(stdout,_("Password: %s\n"),settings.password);
8316 case WAPSETTINGS_BEARER_USSD:
8317 fprintf(stdout,_("Bearer: USSD\n"));
8318 fprintf(stdout,_("Service code: %s\n"),settings.code);
8319 if (settings.isIP) fprintf(stdout,_("Address type: IP address\nIPaddress: %s\n"),settings.service);
8320 else fprintf(stdout,_("Address type: service number\nService number: %s\n"),settings.service);
8325 fprintf(stderr,_("%s\n"),print_error(error));
8334 /* Not full done now */
8335 int savewapsettings(int argc, char *argv[])
8337 GSM_WAPSettings settings;
8338 GSM_MultiSMSMessage MultiSMS;
8342 settings.location=atoi(argv[0]);
8344 /* Initialise the GSM interface. */
8347 error=GSM->GetWAPSettings(&settings);
8348 // strcpy(settings.homepage,"http://OtherSites/");
8349 // strcpy(settings.title,"Orange");
8355 /* Put settings into SMS structure */
8356 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8358 for (w=0;w<MultiSMS.number;w++)
8359 strcpy(MultiSMS.SMS[w].Destination,"WAPSettings");
8361 GSM_SaveMultiPartSMSOnConsole(&MultiSMS,1,argc,argv,false,false,false,false);
8366 fprintf(stderr,_("%s\n"),print_error(error));
8374 int sendwapsettings(int argc, char *argv[])
8376 GSM_WAPSettings settings;
8377 GSM_MultiSMSMessage MultiSMS;
8381 settings.location=atoi(argv[0]);
8383 /* Initialise the GSM interface. */
8386 error=GSM->GetWAPSettings(&settings);
8387 // strcpy(settings.homepage,"http://OtherSites/");
8388 // strcpy(settings.title,"Orange");
8394 /* Put settings into SMS structure */
8395 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8397 for (w=0;w<MultiSMS.number;w++)
8398 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8400 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8406 fprintf(stderr,_("%s\n"),print_error(error));
8414 int getwapbookmark(int argc, char *argv[])
8416 GSM_WAPBookmark bookmark;
8419 bookmark.location=atoi(argv[0]);
8421 /* Initialise the GSM interface. */
8424 error=GSM->GetWAPBookmark(&bookmark);
8428 if (bookmark.address[0]==0) {
8429 fprintf(stdout,_("Empty bookmark location\n"));
8431 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
8432 if (bookmark.title[0]==0)
8433 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
8435 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
8439 fprintf(stderr,_("%s\n"),print_error(error));
8448 int setwapbookmark(int argc, char *argv[])
8450 GSM_WAPBookmark bookmark;
8453 if (argc == 3) /* if location given, use it */
8454 bookmark.location=atoi(argv[2]);
8455 else /* else use first empty location */
8456 bookmark.location=0xffff;
8458 strcpy(bookmark.title, argv[0]);
8459 strcpy(bookmark.address, argv[1]);
8461 /* Initialise the GSM interface. */
8464 error=GSM->SetWAPBookmark(&bookmark);
8468 fprintf(stdout,_("No errors\n"));
8471 fprintf(stderr,_("%s\n"),print_error(error));
8480 int savewapbookmark(int argc, char *argv[])
8482 GSM_WAPBookmark bookmark;
8483 GSM_MultiSMSMessage MultiSMS;
8487 bookmark.location=atoi(argv[0]);
8489 /* Initialise the GSM interface. */
8492 error=GSM->GetWAPBookmark(&bookmark);
8494 // strcpy(bookmark.title,"tytulagagagagagagagagagagagagagagagagagagagagagend");
8495 // strcpy(bookmark.address,"http://jajajajajajajajajajajajagagagagagagagagagagagagagagagagagagagagagpapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap¥papapapapapapapapagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdstp");
8501 if (bookmark.address[0]==0) {
8502 fprintf(stdout,_("Empty bookmark location\n"));
8507 /* Put bookmark into SMS structure */
8508 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8510 for (w=0;w<MultiSMS.number;w++)
8511 strcpy(MultiSMS.SMS[w].Destination,"WAPBookmark");
8513 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 1,argc,argv,false,false,false,false);
8518 fprintf(stderr,_("%s\n"),print_error(error));
8527 int sendwapbookmark(int argc, char *argv[])
8529 GSM_WAPBookmark bookmark;
8530 GSM_MultiSMSMessage MultiSMS;
8534 bookmark.location=atoi(argv[0]);
8536 /* Initialise the GSM interface. */
8539 error=GSM->GetWAPBookmark(&bookmark);
8544 if (bookmark.address[0]==0) {
8545 fprintf(stdout,_("Empty bookmark location\n"));
8550 /* Put bookmark into SMS structure */
8551 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8553 for (w=0;w<MultiSMS.number;w++)
8554 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8556 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8561 fprintf(stderr,_("%s\n"),print_error(error));
8570 int savecalendarnote(int argc, char *argv[])
8572 GSM_MultiSMSMessage MultiSMS;
8574 GSM_CalendarNote CalendarNote;
8577 number=atoi(argv[1]);
8580 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8584 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
8587 case GE_CANTOPENFILE:
8588 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
8591 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8594 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
8600 /* Put note into SMS structure */
8601 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8603 for (w=0;w<MultiSMS.number;w++)
8604 strcpy(MultiSMS.SMS[w].Destination,"Calendar");
8606 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8611 int sendcalendarnote(int argc, char *argv[])
8613 GSM_MultiSMSMessage MultiSMS;
8615 GSM_CalendarNote CalendarNote;
8618 number=atoi(argv[2]);
8621 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8625 switch ( GSM_ReadVCalendarFile(argv[1], &CalendarNote, &number) ) {
8628 case GE_CANTOPENFILE:
8629 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[1]);
8632 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8635 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[1]);
8641 /* Put note into SMS structure */
8642 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8644 for (w=0;w<MultiSMS.number;w++)
8645 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8647 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8652 /* Example function for continuous receiving SMS */
8653 /* When phone receives SMS, it's read by mygnokii, ID number is created
8654 and SMS is saved to file. After it it's deleted
8655 Checking many errors is also done */
8656 int receivesms(int argc, char *argv[])
8660 GSM_SMSStatus SMSStatus = {0, 0};
8662 int read, location, number;
8663 unsigned char name[50],filename[400];
8664 char nowdate[12]="", nowtime[12]="";
8667 struct CFG_Header *cfg_info;
8669 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
8672 signal(SIGINT, interrupted);
8674 fprintf (stderr, _("Entering monitor mode (press CTRL+C to break)...\n"));
8676 cfg_info=CFG_FindGnokiirc();
8679 if (cfg_info!=NULL) {
8680 if (CFG_Get(cfg_info, "receivesms", "path")) {
8681 strcpy(Dir,CFG_Get(cfg_info, "receivesms", "path"));
8685 fprintf(stderr,_("Path for sms files is \"%s\"\n"),Dir);
8687 fprintf (stderr, _("Initialising GSM interface..."));
8689 /* Initialise the code for the GSM interface. */
8692 fprintf (stderr, _("done\n"));
8696 /* Loop here indefinitely - allows you to see messages from GSM code in
8697 response to unknown messages etc. The loops ends after pressing the
8699 while (!bshutdown) {
8700 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE) {
8701 if (SMSStatus.Number!=0) {
8703 GetMachineDateTime(nowdate, nowtime );
8704 logfile = fopen("log", "a");
8706 fprintf(logfile, _("%s %s SMS Messages: UnRead %d, Number %d\n"),
8707 nowdate, nowtime, SMSStatus.UnRead, SMSStatus.Number);
8714 while (!bshutdown) {
8716 SMS.Location=location;
8717 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
8718 if (SMS.folder==0 || SMS.folder==0x08) { //GST_7110_INBOX
8720 GetMachineDateTime(nowdate, nowtime );
8721 logfile = fopen("log", "a");
8723 fprintf(logfile,_("%s %s SMS on location %i\n"),
8724 nowdate,nowtime,SMS.MessageNumber);
8728 number= 16*(SMS.MessageText[2] >> 4)+ (SMS.MessageText[2] & 0x0f);
8729 number=number+ 256*16*(SMS.MessageText[1] >> 4)+ 256*(SMS.MessageText[1] & 0x0f);
8730 number=number+65536*16*(SMS.MessageText[0] >> 4)+65536*(SMS.MessageText[0] & 0x0f);
8732 sprintf( name, "%07i_%02d%02d%02d_%02d%02d%02d.sms", number,
8733 SMS.Time.Year, SMS.Time.Month, SMS.Time.Day,
8734 SMS.Time.Hour, SMS.Time.Minute, SMS.Time.Second);
8736 strcpy(filename,Dir);
8737 strcat(filename,name);
8739 logfile = fopen("log", "a");
8741 fprintf(logfile,_("%s %s Name is \"%s\"\n"),nowdate,nowtime,filename);
8745 file = fopen(filename, "rb");
8747 file = fopen(filename, "wb");
8749 GetMachineDateTime(nowdate, nowtime );
8750 fprintf(stderr,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8751 logfile = fopen("log", "a");
8753 fprintf(logfile,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8757 fwrite(SMS.MessageText,1,SMS.Length,file);
8763 GetMachineDateTime(nowdate, nowtime );
8764 fprintf(stderr,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8765 logfile = fopen("log", "a");
8767 fprintf(logfile,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8772 SMS.Location=SMS.MessageNumber;
8773 if (GSM->DeleteSMSMessage(&SMS)!=GE_NONE) {
8774 GetMachineDateTime(nowdate, nowtime );
8775 fprintf(stderr,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8776 logfile = fopen("log", "a");
8778 fprintf(logfile,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8786 if (read==SMSStatus.Number) break;
8790 GetMachineDateTime(nowdate, nowtime );
8791 fprintf(stderr,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8792 logfile = fopen("log", "a");
8794 fprintf(logfile,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8802 fprintf (stderr, _("Leaving monitor mode...\n"));
8809 int divert(int argc, char *argv[])
8814 memset(&cd, 0, sizeof(GSM_CallDivert));
8816 if (!strcmp("register", argv[0])){cd.Operation = GSM_CDV_Register ;}
8817 else if (!strcmp("enable" , argv[0])){cd.Operation = GSM_CDV_Enable ;}
8818 else if (!strcmp("disable" , argv[0])){cd.Operation = GSM_CDV_Disable ;}
8819 else if (!strcmp("erasure" , argv[0])){cd.Operation = GSM_CDV_Erasure ;}
8820 else if (!strcmp("query" , argv[0])){cd.Operation = GSM_CDV_Query ;}
8826 if (!strcmp("all" , argv[1])) {cd.DType = GSM_CDV_AllTypes ;}
8827 else if (!strcmp("busy" , argv[1])) {cd.DType = GSM_CDV_Busy ;}
8828 else if (!strcmp("noans" , argv[1])) {cd.DType = GSM_CDV_NoAnswer ;}
8829 else if (!strcmp("outofreach", argv[1])) {cd.DType = GSM_CDV_OutOfReach;}
8835 if (!strcmp("all" , argv[2])) {cd.CType = GSM_CDV_AllCalls ;}
8836 else if (!strcmp("voice", argv[2])) {cd.CType = GSM_CDV_VoiceCalls;}
8837 else if (!strcmp("fax" , argv[2])) {cd.CType = GSM_CDV_FaxCalls ;}
8838 else if (!strcmp("data" , argv[2])) {cd.CType = GSM_CDV_DataCalls ;}
8844 if (argc>3) strcpy(cd.Number, argv[3]);
8846 if (argc>4) cd.Timeout = atoi(argv[4]);
8848 /* Initialise the code for the GSM interface. */
8851 error=GSM->CallDivert(&cd);
8853 if (error == GE_NONE) {
8854 switch (cd.Operation)
8857 fprintf(stdout, _("Divert type: "));
8859 case GSM_CDV_Busy :fprintf(stdout, _("when busy"));break;
8860 case GSM_CDV_NoAnswer :fprintf(stdout, _("when not answered"));break;
8861 case GSM_CDV_OutOfReach:fprintf(stdout, _("when phone off or no coverage"));break;
8862 case GSM_CDV_AllTypes :fprintf(stdout, _("all call diverts"));break; //?
8863 default: fprintf(stdout, _("unknown %i"),cd.DType);break;
8866 fprintf(stdout, _("\nCalls type : "));
8868 case GSM_CDV_VoiceCalls: fprintf(stdout, _("voice"));break;
8869 case GSM_CDV_FaxCalls : fprintf(stdout, _("fax"));break;
8870 case GSM_CDV_DataCalls : fprintf(stdout, _("data"));break;
8871 case GSM_CDV_AllCalls : fprintf(stdout, _("voice, fax & data"));break;
8872 default: fprintf(stdout, _("unknown %i"),cd.CType);break;
8874 fprintf(stdout, _("\n"));
8877 fprintf(stdout, _("Status : active\n"));
8878 fprintf(stdout, _("Timeout : %i seconds\n"),cd.Timeout);
8879 fprintf(stdout, _("Number : %s\n"),cd.Number);
8881 fprintf(stdout, _("Status : deactivated\n"));
8886 fprintf(stdout,_("Divert done\n"));
8889 fprintf(stderr,_("%s\n"),print_error(error));
8896 int savephonebookentry(int argc, char *argv[])
8898 GSM_MultiSMSMessage MultiSMS;
8899 GSM_PhonebookEntry entry;
8905 /* Handle command line args that set type, start and end locations. */
8906 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
8908 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
8912 entry.Location=atoi(argv[1]);
8916 error=GSM->GetMemoryLocation(&entry);
8921 /* Put entry into SMS structure */
8923 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71) {
8924 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8926 #endif /* UCLINUX */
8928 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8931 for (w=0;w<MultiSMS.number;w++)
8932 strcpy(MultiSMS.SMS[w].Destination,"Phonebook");
8934 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8938 fprintf(stdout,_("Error\n"));break;
8944 int sendphonebookentry(int argc, char *argv[])
8946 GSM_MultiSMSMessage MultiSMS;
8947 GSM_PhonebookEntry entry;
8953 /* Handle command line args that set type, start and end locations. */
8954 if (!GetMemoryTypeID(argv[1], &entry.MemoryType))
8956 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
8960 entry.Location=atoi(argv[2]);
8964 error=GSM->GetMemoryLocation(&entry);
8969 /* Put entry into SMS structure */
8970 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71) {
8971 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8973 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8976 for (w=0;w<MultiSMS.number;w++)
8977 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8979 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8984 fprintf(stdout,_("Error\n"));break;
8990 #endif /* UCLINUX */