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.
23 #if defined(__svr4__) || defined(__FreeBSD__)
24 # include <strings.h> /* for bzero */
27 /* for VC6 make scripts save VERSION constant in mversion.h file */
35 #include "misc_win32.h"
38 #define DEV_CONSOLE "CON:"
45 #include <sys/types.h>
49 #define DEV_CONSOLE "/dev/tty"
53 #include "gsm-common.h"
55 #include "gsm-networks.h"
56 #include "gsm-ringtones.h"
57 #include "gsm-bitmaps.h"
60 #include "gsm-datetime.h"
61 #include "gsm-phonebook.h"
62 #include "gsm-calendar.h"
63 #include "gsm-coding.h"
64 #include "newmodules/n6110.h"
65 #include "files/cfgreader.h"
66 #include "files/gsm-filetypes.h"
73 char *model; /* Model from .gnokiirc file. */
74 char *Port; /* Port from .gnokiirc file */
75 char *Initlength; /* Init length from .gnokiirc file */
76 char *Connection; /* Connection type from .gnokiirc file */
77 char *SynchronizeTime; /* If we set date and time from computer to phone (from .gnokiirc file) */
78 char *BinDir; /* Binaries directory from .gnokiirc file - not used here yet */
80 GSM_SMSMessage SMS[4];
82 char *GetProfileCallAlertString(int code) {
85 case PROFILE_CALLALERT_RINGING : return "Ringing";
86 case PROFILE_CALLALERT_ASCENDING : return "Ascending";
87 case PROFILE_CALLALERT_RINGONCE : return "Ring once";
88 case PROFILE_CALLALERT_BEEPONCE : return "Beep once";
89 case PROFILE_CALLALERT_CALLERGROUPS: return "Caller groups";
90 case PROFILE_CALLALERT_OFF : return "Off";
91 default : return "Unknown";
95 char *GetProfileVolumeString(int code) {
98 case PROFILE_VOLUME_LEVEL1 : return "Level 1";
99 case PROFILE_VOLUME_LEVEL2 : return "Level 2";
100 case PROFILE_VOLUME_LEVEL3 : return "Level 3";
101 case PROFILE_VOLUME_LEVEL4 : return "Level 4";
102 case PROFILE_VOLUME_LEVEL5 : return "Level 5";
103 default : return "Unknown";
107 char *GetProfileKeypadToneString(int code) {
110 case PROFILE_KEYPAD_OFF : return "Off";
111 case PROFILE_KEYPAD_LEVEL1 : return "Level 1";
112 case PROFILE_KEYPAD_LEVEL2 : return "Level 2";
113 case PROFILE_KEYPAD_LEVEL3 : return "Level 3";
114 default : return "Unknown";
118 char *GetProfileMessageToneString(int code) {
121 case PROFILE_MESSAGE_NOTONE : return "No tone";
122 case PROFILE_MESSAGE_STANDARD : return "Standard";
123 case PROFILE_MESSAGE_SPECIAL : return "Special";
124 case PROFILE_MESSAGE_BEEPONCE : return "Beep once";
125 case PROFILE_MESSAGE_ASCENDING : return "Ascending";
126 default : return "Unknown";
130 char *GetProfileWarningToneString(int code) {
133 case PROFILE_WARNING_OFF : return "Off";
134 case PROFILE_WARNING_ON : return "On";
135 default : return "Unknown";
139 char *GetProfileOnOffString(int code) {
142 case 0x00 : return "Off";
143 case 0x01 : return "On";
144 default : return "Unknown";
148 static char *GetProfileVibrationString(int code)
151 case PROFILE_VIBRATION_OFF: return "Off";
152 case PROFILE_VIBRATION_ON: return "On";
153 case PROFILE_VIBRATION_FIRST: return "Vibrate first";
154 default: return "Unknown";
158 char BufferProfileGroups[90];
160 char *GetProfileCallerGroups(int code)
162 static char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
163 static bool enteronce=false;
167 if( code == PROFILE_CALLERGROUPS_ALL )
168 return _("All calls alert");
171 for(i=0;i<5;i++) az_group_name[i][0]='\0';
175 BufferProfileGroups[0]=0;
182 code2test=(i==0) ? 1 : 2<<(i-1);
184 if( code & code2test )
186 if (!strcmp(az_group_name[i],""))
188 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
189 bitmap.type=GSM_CallerLogo;
191 strcpy(z_gtype,_("unknown"));
192 if (GSM->GetBitmap(&bitmap)==GE_NONE)
193 strcpy( az_group_name[i], bitmap.text );
195 if ((!strcmp(az_group_name[i],""))) {
197 case 0:strcpy(az_group_name[i],_("Family"));break;
198 case 1:strcpy(az_group_name[i],_("VIP"));break;
199 case 2:strcpy(az_group_name[i],_("Friends"));break;
200 case 3:strcpy(az_group_name[i],_("Colleagues"));break;
201 case 4:strcpy(az_group_name[i],_("Other"));break;
206 strcpy(z_gtype,az_group_name[i]);
208 if( strlen(BufferProfileGroups) ) strcat(BufferProfileGroups,"+");
209 strcat(BufferProfileGroups, z_gtype);
214 return BufferProfileGroups;
217 char *print_error(GSM_Error e)
220 // case GE_DEVICEOPENFAILED: return "Couldn't open specified serial device.";
221 // case GE_UNKNOWNMODEL: return "Model specified isn't known/supported.";
222 // case GE_NOLINK: return "Couldn't establish link with phone.";
223 // case GE_TRYAGAIN: return "Try again.";
224 // case GE_INVALIDSMSLOCATION: return "Invalid SMS location.";
225 // case GE_INVALIDPHBOOKLOCATION: return "Invalid phonebook location.";
226 // case GE_INVALIDMEMORYTYPE: return "Invalid type of memory.";
227 // case GE_INVALIDSPEEDDIALLOCATION: return "Invalid speed dial location.";
228 // case GE_INVALIDCALNOTELOCATION: return "Invalid calendar note location.";
229 // case GE_INVALIDDATETIME: return "Invalid date, time or alarm specification.";
230 // case GE_EMPTYSMSLOCATION: return "SMS location is empty.";
231 // case GE_PHBOOKNAMETOOLONG: return "Phonebook name is too long.";
232 // case GE_PHBOOKNUMBERTOOLONG: return "Phonebook number is too long.";
233 // case GE_PHBOOKWRITEFAILED: return "Phonebook write failed.";
234 // case GE_SMSSENDOK: return "SMS was send correctly.";
235 // case GE_SMSSENDFAILED: return "SMS send fail.";
236 // case GE_SMSTOOLONG: return "SMS message too long.";
237 // case GE_NONEWCBRECEIVED: return "Attempt to read CB when no new CB received";
238 // case GE_INTERNALERROR: return "Problem occured internal to model specific code.";
239 // case GE_NOTSUPPORTED: return "Function not supported by the phone";
240 // case GE_BUSY: return "Command is still being executed.";
241 // case GE_USERCANCELED: return "User has cancelled the action.";
242 // case GE_UNKNOWN: return "Unknown error - well better than nothing!!";
243 // case GE_MEMORYFULL: return "Memory is full";
244 // case GE_LINEBUSY: return "Outgoing call requested reported line busy";
245 // case GE_NOCARRIER: return "No Carrier error during data call setup ?";
248 case GE_NONE: return "No error, done OK";
249 case GE_INVALIDSECURITYCODE: return "Invalid Security code.";
250 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";
251 case GE_TIMEOUT: return "Command timed out.";
252 case GE_CANTOPENFILE: return "Can't open file with bitmap/ringtone";
253 case GE_SUBFORMATNOTSUPPORTED: return "Subformat of file not supported";
254 case GE_WRONGNUMBEROFCOLORS: return "Wrong number of colors in specified bitmap file (only 2 colors files supported)";
255 case GE_WRONGCOLORS: return "Wrong colors in bitmap file";
256 case GE_INVALIDIMAGESIZE: return "Invalid size of bitmap (in file, sms etc.)";
257 case GE_INVALIDFILEFORMAT: return "Invalid format of file";
258 case GE_TOOSHORT: return "File too short";
259 case GE_INSIDEBOOKMARKSMENU: return "Inside WAP Bookmarks menu. Please leave it and try again";
260 case GE_INVALIDBOOKMARKLOCATION: return "Invalid or empty WAP bookmark location";
261 case GE_INSIDESETTINGSMENU: return "Inside WAP Settings menu. Please leave it and try again";
262 case GE_INVALIDSETTINGSLOCATION: return "Invalid or empty WAP settings location";
263 case GE_EMPTYSMSC: return "Empty SMSC number. Use --smsc";
264 default: return "Unknown error.";
269 GSM_Error GSM_ReadRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
273 error=GSM_ReadRingtoneFile(FileName, ringtone);
276 case GE_CANTOPENFILE:
277 case GE_SUBFORMATNOTSUPPORTED:
278 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
287 GSM_Error GSM_SaveRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
289 int confirm,confirm2;
294 /* Ask before overwriting */
295 while (stat(FileName, &buf) == 0) {
300 while (confirm < 0) {
301 fprintf(stderr, _("Saving ringtone. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
302 GetLine(stdin, ans, 4);
303 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
304 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
305 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
307 if (confirm==1) break;
309 while (confirm2 < 0) {
310 fprintf(stderr, _("Enter name of new file: "));
311 GetLine(stdin, FileName, 50);
312 if (&FileName[0]==0) return GE_USERCANCELED;
318 error=GSM_SaveRingtoneFile(FileName,ringtone);
321 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
329 GSM_Error GSM_ReadBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
333 error=GSM_ReadBitmapFile(FileName, bitmap);
336 case GE_CANTOPENFILE:
337 case GE_WRONGNUMBEROFCOLORS:
339 case GE_INVALIDFILEFORMAT:
340 case GE_SUBFORMATNOTSUPPORTED:
342 case GE_INVALIDIMAGESIZE:
343 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
352 GSM_Error GSM_SaveBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
354 int confirm,confirm2;
359 /* Ask before overwriting */
360 while (stat(FileName, &buf) == 0) {
365 while (confirm < 0) {
366 fprintf(stderr, _("Saving logo. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
367 GetLine(stdin, ans, 4);
368 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
369 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
370 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
372 if (confirm==1) break;
374 while (confirm2 < 0) {
375 fprintf(stderr, _("Enter name of new file: "));
376 GetLine(stdin, FileName, 50);
377 if (&FileName[0]==0) return GE_USERCANCELED;
383 error=GSM_SaveBitmapFile(FileName,bitmap);
386 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
394 /* mode == 0 -> overwrite
396 * mode == 2 -> append
398 int GSM_SaveTextFileOnConsole(char *FileName, char *text, int mode)
400 int confirm, confirm2;
405 /* Ask before overwriting */
407 while (stat(FileName, &buf) == 0 && mode==1) {
412 while (confirm < 0) {
413 fprintf(stderr, _("File \"%s\" exists. (O)verwrite, (a)ppend, create (n)ew or (s)kip ? "),FileName);
414 GetLine(stdin, ans, 4);
415 if (!strcmp(ans, "O") || !strcmp(ans, "o")) {
419 if (!strcmp(ans, "A") || !strcmp(ans, "a")) {
423 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm=2;
424 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return -1;
428 while (confirm2 < 0) {
429 fprintf(stderr, _("Enter name of new file: "));
430 GetLine(stdin, FileName, 50);
431 if (&FileName[0]==0) return -1;
440 error=GSM_SaveTextFile(FileName, text, mode);
443 case -1: fprintf(stderr, _("Failed to write file \"%s\"\n"), FileName);
451 int GSM_SendMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
452 bool unicode, bool profile, bool scale) {
456 struct option options[] = {
457 { "smscno", required_argument, NULL, '2'},
458 { "smsc", required_argument, NULL, '1'},
459 { "name", required_argument, NULL, '3'},
460 { "unicode", no_argument, NULL, '4'},
461 { "profilestyle", no_argument, NULL, '5'},
462 { "scale", no_argument, NULL, '6'},
468 for (w=0;w<MultiSMS->number;w++) {
473 /* We check optional parameters from ... */
476 while ((i = getopt_long(argc, argv, "v:ds", options, NULL)) != -1) {
479 case '1': /* SMSC number */
480 MultiSMS->SMS[w].MessageCenter.No = 0;
481 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
484 case '2': /* SMSC number index in phone memory */
485 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
487 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
488 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
494 case '3': /* Receiver/recipient */
495 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
497 case '4': /* Unicode */
500 case '5': /* Profile */
503 case '6': /* Scale */
506 case 'v': /* Set validaty of SMS */
507 MultiSMS->SMS[w].Validity = atoi(optarg);
510 case 'd': /* delivery report */
511 MultiSMS->SMS[w].Type=GST_DR;
514 case 's': /* Set replying via the same SMSC */
515 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
518 fprintf(stderr,_("Unknown option number %i\n"),argc);
526 error=GSM->SendSMSMessage(&MultiSMS->SMS[w]);
528 if (error == GE_SMSSENDOK) {
529 fprintf(stdout, _("SMS %i/%i sent OK !\n"),w+1,MultiSMS->number);
531 fprintf(stdout, _("SMS %i/%i, sending failed (%d, %s)\n"),w+1,MultiSMS->number, error,print_error(error));
541 int GSM_SaveMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
542 bool inter, bool unicode, bool profile, bool scale) {
546 GSM_SMSMessage SMSold;
548 struct option options[] = {
549 { "smscno", required_argument, NULL, '2'},
550 { "smsc", required_argument, NULL, '1'},
551 { "name", required_argument, NULL, '3'},
552 { "unicode", no_argument, NULL, '4'},
553 { "profilestyle", no_argument, NULL, '5'},
554 { "scale", no_argument, NULL, '6'},
566 for (w=0;w<MultiSMS->number;w++) {
571 /* We check optional parameters from ... */
574 while ((i = getopt_long(argc, argv, "risal:", options, NULL)) != -1) {
577 case '1': /* SMSC number */
578 MultiSMS->SMS[w].MessageCenter.No = 0;
579 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
582 case '2': /* SMSC number index in phone memory */
583 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
585 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
586 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
592 case '3': /* Receiver/recipient */
593 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
595 case '4': /* Unicode */
598 case '5': /* Profile */
601 case '6': /* Scale */
604 case 'r': /* mark as read */
605 MultiSMS->SMS[w].Status = GSS_SENTREAD; break;
607 case 'i': /* Save into Inbox */
608 MultiSMS->SMS[w].folder = GST_INBOX; break;
610 case 's': /* Set replying via the same SMSC */
611 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
613 case 'a': /* Ask before overwriting */
614 interactive=true;break;
616 case 'l': /* Specify location */
617 MultiSMS->SMS[0].Location = atoi(optarg); break;
620 fprintf(stderr,_("Unknown option number %i\n"),argc);
627 if (interactive && MultiSMS->SMS[0].Location!=0 && w==0) {
628 SMSold.Location=MultiSMS->SMS[0].Location;
629 error = GSM->GetSMSMessage(&SMSold);
632 fprintf(stderr, _("Message at specified location exists. "));
633 while (confirm < 0) {
634 fprintf(stderr, _("Overwrite? (yes/no) "));
635 GetLine(stdin, ans, 7);
636 if (!strcmp(ans, "yes")) confirm = 1;
637 if (!strcmp(ans, "no")) confirm = 0;
639 if (!confirm) { GSM->Terminate(); return 0; }
641 case GE_INVALIDSMSLOCATION:
642 fprintf(stderr, _("Invalid location\n"));
646 /* FIXME: Remove this fprintf when the function is thoroughly tested */
648 fprintf(stderr, _("Location %d empty. Saving\n"), SMS[w].Location);
654 error=GSM->SaveSMSMessage(&MultiSMS->SMS[w]);
656 if (error == GE_NONE)
657 fprintf(stdout, _("SMS %i/%i saved at location %i !\n"),w+1,MultiSMS->number,MultiSMS->SMS[w].MessageNumber);
659 fprintf(stdout, _("SMS %i/%i saving failed (%d, %s, location=%i)\n"), w+1, MultiSMS->number,error,print_error(error),MultiSMS->SMS[w].Location);
667 void GSM_PlayRingtoneOnConsole(GSM_Ringtone *ringtone)
674 for (i=0;i<ringtone->NrNotes;i++) {
681 GSM_PlayOneNote (ringtone->notes[i]);
683 GSM->PlayTone(255*255,0);
686 /* This function shows the copyright and some informations usefull for
691 fprintf(stdout, _("GNOKII Version %s\n"
692 "Copyright (C) Hugh Blemings <hugh@linuxcare.com>, 1999, 2000\n"
693 "Copyright (C) Pavel JanÃk ml. <Pavel.Janik@linux.cz>, 1999, 2000\n"
694 "Built %s %s for %s on %s \n"), VERSION, __TIME__, __DATE__, model, Port);
699 /* The function usage is only informative - it prints this program's usage and
700 command-line options. */
705 fprintf(stdout, _(" usage: gnokii [--help|--monitor [-noloop|-nl]|--version]\n"
706 " gnokii --getmemory memory_type [start [end]] [-short|-v30|-v21|-v]\n"
707 " gnokii --writephonebook [-i]\n"
708 " gnokii --sendphonebookentry destination memory_type location\n"
709 " [--smsc message_center_number] [--smscno message_center_index]\n"
710 " [-s] [-v n] [-d]\n"
711 " gnokii --savephonebookentry memory_type location\n"
712 " [--smsc message_center_number] [--smscno message_center_index]\n"
713 " [-r] [-i] [-s] [-a] [--name name]\n"
714 " gnokii --getvoicemailbox\n"
715 " gnokii --getspeeddial number\n"
716 " gnokii --setspeeddial number memory_type location\n\n"
718 " gnokii --getsms memory_type start [end] [-f file]\n"
719 " gnokii --getsmsstatus\n"
720 " gnokii --getsmsfolders\n"
721 " gnokii --deletesms memory_type start [end]\n"
722 " gnokii --sendsms destination [--smsc message_center_number |\n"
723 " --smscno message_center_index] [--long n] [-s] [-C n]\n"
724 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
725 " --enableemail|--disableemail|--void][--unicode][-v n][-d]\n"
726 " gnokii --savesms destination|\"\" [--smsc \n"
727 " message_center_number] [--smscno message_center_index]\n"
728 " [--long n] [-r] [-i] [-s][-C n][-a][-l][F n][--smsname name]\n"
729 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
730 " --enableemail|--disableemail|--void|--hang|--bug][--unicode]\n"
731 " gnokii --receivesms\n"
732 " gnokii --getsmsc message_center_number\n"
733 " gnokii --renamesmsc number new_name\n\n"
735 " gnokii --setdatetime [YYYY [MM [DD [HH [MM]]]]]\n"
736 " gnokii --getdatetime\n"
737 " gnokii --setalarm HH MM\n"
738 " gnokii --getalarm\n\n"
740 " gnokii --getcalendarnote { start end [-v30|-v10] | --short|-s }\n"
741 " gnokii --writecalendarnote vcardfile number\n"
742 " gnokii --deletecalendarnote index\n"
743 " gnokii --sendcalendarnote destination vcardfile number\n"
744 " [--smsc message_center_number] [--smscno message_center_index]\n"
745 " [-s] [-v n] [-d]\n"
746 " gnokii --savecalendarnote vcardfile number\n"
747 " [--smsc message_center_number] [--smscno message_center_index]\n"
748 " [-r] [-i] [-s] [-a] [--name name]\n\n"
750 " gnokii --netmonitor {reset|off|field|devel|next|nr}\n"
751 " gnokii --nm_collect screen1|-d [screen2|-d]...\n"
752 " gnokii --netmonitordata [-S file] [-I file] [-h] [-n n] [-ts n][-tm n]\n"
753 " [-fs str] [-ls str] FLD1:FLD2:FLDn:... \n"
754 " (see files netmonitordata_????_??? for details)\n\n"
756 " gnokii --bitmapconvert source destination\n"
757 " gnokii --bitmapconvert source destination op|7110op [network code]\n"
758 " gnokii --bitmapconvert source destination caller [caller group number]\n"
759 " gnokii --bitmapconvert source destination\n"
760 " startup|7110startup|6210startup\n"
761 " gnokii --bitmapconvert source destination picture\n"
762 " gnokii --showbitmap logofile\n"
763 " gnokii --sendlogo op destination logofile network_code\n"
764 " [--smsc message_center_number] [--smscno message_center_index]\n"
765 " [-s] [-v n] [-d]\n"
766 " gnokii --sendlogo picture destination logofile text\n"
767 " [--smsc message_center_number] [--smscno message_center_index]\n"
768 " [-s] [-v n] [-d] [--unicode]\n"
769 " gnokii --sendlogo screensaver destination logofile\n"
770 " [--smsc message_center_number] [--smscno message_center_index]\n"
771 " [-s] [-v n] [-d]\n"
772 " gnokii --sendlogo caller destination logofile\n"
773 " [--smsc message_center_number] [--smscno message_center_index]\n"
774 " [-s] [-v n] [-d]\n"
775 " gnokii --savelogo op logofile network_code\n"
776 " [--smsc message_center_number] [--smscno message_center_index]\n"
777 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
778 " gnokii --savelogo picture logofile text\n"
779 " [--smsc message_center_number] [--smscno message_center_index]\n"
780 " [-r] [-i] [-s] [-a] [-l] [--name name] [--unicode]\n"
781 " gnokii --savelogo screensaver logofile\n"
782 " [--smsc message_center_number] [--smscno message_center_index]\n"
783 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
784 " gnokii --savelogo caller logofile\n"
785 " [--smsc message_center_number] [--smscno message_center_index]\n"
786 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
787 " gnokii --setlogo op|7110op [logofile] [network code]\n"
788 " gnokii --setlogo startup|7110startup|6210startup [logofile]\n"
789 " gnokii --setlogo startup 1|2|3\n"
790 " gnokii --setlogo caller [logofile] [caller group number] [group name]\n"
791 " gnokii --setlogo picture [logofile] [number] [text] [sender]\n"
792 " gnokii --setlogo {dealer|text} [text]\n"
793 " gnokii --getlogo op|7110op [logofile] [network code]\n"
794 " gnokii --getlogo startup|7110startup|6210startup [logofile]\n"
795 " gnokii --getlogo caller [logofile][caller group number]\n"
796 " gnokii --getlogo picture [logofile][number]\n"
797 " gnokii --getlogo {dealer|text}\n\n"
799 " gnokii --sendringtone destination ringtonefile\n"
800 " [--smsc message_center_number] [--smscno message_center_index]\n"
801 " [-s] [-v n] [-d] [--scale] [--profilestyle]\n"
802 " gnokii --saveringtone ringtonefile\n"
803 " [--smsc message_center_number] [--smscno message_center_index]\n"
804 " [-r] [-i] [-s] [-a] [--name name] [--scale] [--profilestyle]\n"
805 " gnokii --setringtone ringtonefile [location]\n"
806 " gnokii --getringtone ringtonefile [location]\n"
807 " gnokii --ringtoneconvert source destination\n"
808 " gnokii --binringtoneconvert source destination\n"
809 " gnokii --playringtone ringtonefile\n"
810 " gnokii --composer ringtonefile\n"
811 " gnokii --allringtones\n\n"
813 " gnokii --getprofile [number]\n"
814 " gnokii --setprofile number feature value\n"
815 " gnokii --sendprofile destination profile_name ringtonefile\n"
816 " picturefile [--smsc message_center_number]\n"
817 " [--smscno message_center_index] [-s] [-v n] [-d] [--scale]\n\n"
819 " gnokii --reset [soft|hard]\n"
820 " gnokii --dialvoice number\n"
821 " gnokii --cancelcall\n"
822 " gnokii --displayoutput\n"
823 " gnokii --presskeysequence sequence\n"
824 " gnokii --backupsettings file\n"
825 " gnokii --restoresettings file\n"
826 " gnokii --getphoneprofile\n"
827 " gnokii --setphoneprofile feature value\n"
828 " gnokii --getoperatorname\n"
829 " gnokii --setoperatorname code name\n"
830 " gnokii --senddtmf string\n"
831 " gnokii --divert register|enable|query|disable|erasure\n"
832 " all|busy|noans|outofreach all|voice|fax|data\n"
833 " [number timeout]\n\n"
835 " gnokii --phonetests\n"
836 " gnokii --simlock\n"
837 " gnokii --getdisplaystatus\n"
838 " gnokii --identify\n\n"
840 " gnokii --getwapbookmark location\n"
841 " gnokii --setwapbookmark title url [location]\n"
842 " gnokii --sendwapbookmark location destination\n"
843 " [--smsc message_center_number] [--smscno message_center_index]\n"
844 " [-s] [-v n] [-d]\n"
845 " gnokii --savewapbookmark location\n"
846 " [--smsc message_center_number] [--smscno message_center_index]\n"
847 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
848 " gnokii --getwapsettings location\n"
849 " gnokii --savewapsettings location\n"
850 " [--smsc message_center_number] [--smscno message_center_index]\n"
851 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
852 " gnokii --sendwapsettings location destination\n"
853 " [--smsc message_center_number] [--smscno message_center_index]\n"
854 " [-s] [-v n] [-d]\n"
859 "\n gnokii --entersecuritycode PIN|PIN2|PUK|PUK2\n"
860 " gnokii --getsecuritycodestatus\n"
861 " gnokii --getsecuritycode PIN|PIN2|PUK|PUK2|SecurityCode\n"
862 " gnokii --geteeprom\n"
863 " gnokii --resetphonesettings\n"
869 " gnokii --sniff [port]\n"
870 " gnokii --decodefile file\n"
871 " gnokii --getbinringfromfile file name offset file2\n"
878 /* fbusinit is the generic function which waits for the FBUS link. The limit
879 is 10 seconds. After 10 seconds we quit. */
881 void fbusinit(void (*rlp_handler)(RLP_F96Frame *frame))
888 if (strcmp(GetMygnokiiVersion(),VERSION)!=0)
889 fprintf(stderr,_("WARNING: version of installed libmygnokii.so (%s) is different to version of gnokii (%s)\n"),GetMygnokiiVersion(),VERSION);
892 /* Initialise the code for the GSM interface. */
893 error = GSM_Initialise(model, Port, Initlength, GetConnectionTypeFromString(Connection), rlp_handler, SynchronizeTime);
895 if (error != GE_NONE) {
896 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
900 /* First (and important!) wait for GSM link to be active. We allow 10
902 while (count++ < 200 && *GSM_LinkOK == false)
905 if (*GSM_LinkOK == false) {
906 fprintf (stderr, _("Hmmm... GSM_LinkOK never went true. Quitting.\n"));
911 /* This function checks that the argument count for a given options is withing
914 int checkargs(int opt, struct gnokii_arg_len gals[], int argc)
919 /* Walk through the whole array with options requiring arguments. */
921 for(i = 0;!(gals[i].gal_min == 0 && gals[i].gal_max == 0); i++) {
923 /* Current option. */
925 if(gals[i].gal_opt == opt) {
927 /* Argument count checking. */
929 if(gals[i].gal_flags == GAL_XOR) {
930 if(gals[i].gal_min == argc || gals[i].gal_max == argc) return 0;
933 if(gals[i].gal_min <= argc && gals[i].gal_max >= argc) return 0;
942 /* We do not have options without arguments in the array, so check them. */
944 if (argc==0) return 0;
948 /* Main function - handles command line arguments, passes them to separate
949 functions accordingly. */
951 int main(int argc, char *argv[])
958 /* Every option should be in this array. */
960 static struct option long_options[] =
963 { "help", no_argument, NULL, OPT_HELP },// Display usage.
964 { "version", no_argument, NULL, OPT_VERSION },// Display version and build information.
965 { "getsmsfolders", no_argument, NULL, OPT_GETSMSFOLDERS },// Gets SMS folders
966 { "getsmsstatus", no_argument, NULL, OPT_GETSMSSTATUS },// Get SMS Folder Status
967 { "identify", no_argument, NULL, OPT_IDENTIFY },// Identify
968 { "pmon", no_argument, NULL, OPT_PMON },// For development purposes: run in passive monitoring mode
969 { "foogle", no_argument, NULL, OPT_FOOGLE },// For development purposes: insert you function calls here
970 { "getdatetime", no_argument, NULL, OPT_GETDATETIME },// Get date and time mode
971 { "getalarm", no_argument, NULL, OPT_GETALARM },// Get alarm
972 { "cancelcall", no_argument, NULL, OPT_CANCELCALL },// Cancel Call
973 { "getdisplaystatus", no_argument, NULL, OPT_GETDISPLAYSTATUS },// Get display status mode
974 { "allringtones", no_argument, NULL, OPT_ALLRINGTONES },/* Displays names of available ringtones */
975 { "displayoutput", no_argument, NULL, OPT_DISPLAYOUTPUT },/* Show texts from phone's display */
976 { "getphoneprofile", no_argument, NULL, OPT_GETPHONEPROFILE },/* Get/Set phone profile settings */
977 { "getoperatorname", no_argument, NULL, OPT_GETOPERATORNAME },/* Get downloaded operator name */
978 { "getvoicemailbox", no_argument, NULL, OPT_GETVOICEMAILBOX },/* Gets voice mailbox number */
979 { "phonetests", no_argument, NULL, OPT_PHONETESTS },
980 { "simlockinfo", no_argument, NULL, OPT_SIMLOCKINFO },
981 { "receivesms", no_argument, NULL, OPT_RECEIVESMS },
982 { "setoperatorname", optional_argument, NULL, OPT_SETOPERATORNAME },/* Set downloaded operator name */
983 { "setdatetime", optional_argument, NULL, OPT_SETDATETIME },// Set date and time
984 { "writephonebook", optional_argument, NULL, OPT_WRITEPHONEBOOK },// Write phonebook (memory) mode
985 { "reset", optional_argument, NULL, OPT_RESET },// Resets the phone
986 { "monitor", optional_argument, NULL, OPT_MONITOR },// Monitor mode
987 { "setlogo", optional_argument, NULL, OPT_SETLOGO },// Set logo
988 { "getprofile", optional_argument, NULL, OPT_GETPROFILE },// Show profile
989 { "setalarm", required_argument, NULL, OPT_SETALARM },// Set alarm
990 { "dialvoice", required_argument, NULL, OPT_DIALVOICE },// Voice call mode
991 { "getcalendarnote", required_argument, NULL, OPT_GETCALENDARNOTE },// Get calendar note mode
992 { "writecalendarnote", required_argument, NULL, OPT_WRITECALENDARNOTE},// Write calendar note mode
993 { "sendcalendarnote", required_argument, NULL, OPT_SENDCALENDARNOTE },
994 { "savecalendarnote", required_argument, NULL, OPT_SAVECALENDARNOTE },
995 { "sendphonebookentry", required_argument, NULL, OPT_SENDPHONEBOOKENTRY},
996 { "savephonebookentry", required_argument, NULL, OPT_SAVEPHONEBOOKENTRY},
997 { "deletecalendarnote", required_argument, NULL, OPT_DELCALENDARNOTE },// Delete calendar note mode
998 { "getmemory", required_argument, NULL, OPT_GETMEMORY },// Get memory mode
999 { "getspeeddial", required_argument, NULL, OPT_GETSPEEDDIAL },// Get speed dial mode
1000 { "setspeeddial", required_argument, NULL, OPT_SETSPEEDDIAL },// Set speed dial mode
1001 { "getsms", required_argument, NULL, OPT_GETSMS },// Get SMS message mode
1002 { "deletesms", required_argument, NULL, OPT_DELETESMS },// Delete SMS message mode
1003 { "sendsms", required_argument, NULL, OPT_SENDSMS },// Send SMS message mode
1004 { "savesms", required_argument, NULL, OPT_SAVESMS },// Save SMS message mode
1005 { "sendlogo", required_argument, NULL, OPT_SENDLOGO },// Send logo as SMS message mode
1006 { "savelogo", required_argument, NULL, OPT_SAVELOGO },// Save logo on SIM
1007 { "sendringtone", required_argument, NULL, OPT_SENDRINGTONE },// Send ringtone as SMS message
1008 { "saveringtone", required_argument, NULL, OPT_SAVERINGTONE },// Saves ringtone on SIM
1009 { "setringtone", required_argument, NULL, OPT_SETRINGTONE },// Set ringtone
1010 { "getringtone", required_argument, NULL, OPT_GETRINGTONE },// Get bin/normal ringtone
1011 { "presskeysequence", required_argument, NULL, OPT_PRESSKEYSEQUENCE },/* Presses keys in phone's display */
1012 { "getsmsc", required_argument, NULL, OPT_GETSMSC },// Get SMS center number mode
1013 { "renamesmsc", required_argument, NULL, OPT_RENAMESMSC },// Rename SMSC
1014 { "netmonitor", required_argument, NULL, OPT_NETMONITOR },// NetMonitor mode
1015 { "senddtmf", required_argument, NULL, OPT_SENDDTMF },// Send DTMF sequence
1016 { "getlogo", required_argument, NULL, OPT_GETLOGO },// Get logo
1017 { "setprofile", required_argument, NULL, OPT_SETPROFILE },// Set profile feature
1018 { "sendprofile", required_argument, NULL, OPT_SENDPROFILE },// Send profile via SMS
1019 { "setphoneprofile", required_argument, NULL, OPT_SETPHONEPROFILE },/* Get/Set phone profile settings */
1020 { "restoresettings", required_argument, NULL, OPT_RESTORESETTINGS },//Restore various settings from one file
1021 { "backupsettings", required_argument, NULL, OPT_BACKUPSETTINGS },//Backup various settings to one file
1022 { "playringtone", required_argument, NULL, OPT_PLAYRINGTONE },/* Plays ringtones */
1023 { "composer", required_argument, NULL, OPT_COMPOSER },/* Shows ringtone like in Nokia Composer */
1024 { "ringtoneconvert", required_argument, NULL, OPT_RINGTONECONVERT },/* Convert ringtone files */
1025 { "binringtoneconvert", required_argument, NULL, OPT_BINRINGTONECONVERT},/* Convert binary ringtone files */
1026 { "bitmapconvert", required_argument, NULL, OPT_BITMAPCONVERT },/* Convert bitmap files */
1027 { "showbitmap", required_argument, NULL, OPT_SHOWBITMAP },
1028 { "nm_collect", required_argument, NULL, OPT_NM_COLLECT },// NetMonitor periodical data collection mode (newbiee)
1029 { "netmonitordata", required_argument, NULL, OPT_NETMONITORDATA },// NetMonitor periodical data collection mode (advanced)
1030 { "getwapbookmark", required_argument, NULL, OPT_GETWAPBOOKMARK },
1031 { "setwapbookmark", required_argument, NULL, OPT_SETWAPBOOKMARK },
1032 { "savewapbookmark", required_argument, NULL, OPT_SAVEWAPBOOKMARK },
1033 { "savewapsettings", required_argument, NULL, OPT_SAVEWAPSETTINGS },
1034 { "sendwapsettings", required_argument, NULL, OPT_SENDWAPSETTINGS },
1035 { "sendwapbookmark", required_argument, NULL, OPT_SENDWAPBOOKMARK },
1036 { "getwapsettings", required_argument, NULL, OPT_GETWAPSETTINGS },
1037 { "divert", required_argument, NULL, OPT_DIVERT },
1040 { "entersecuritycode", required_argument, NULL, OPT_ENTERSECURITYCODE },// Enter Security Code mode
1041 { "getsecuritycode", required_argument, NULL, OPT_GETSECURITYCODE },// Get Security Code
1042 { "getsecuritycodestatus",no_argument, NULL, OPT_GETSECURITYCODESTATUS},// Get Security Code status
1043 { "geteeprom", no_argument, NULL, OPT_GETEEPROM },// Gets EEPROM
1044 { "resetphonesettings", no_argument, NULL, OPT_RESETPHONESETTINGS },// Reset phone settings
1045 { "setsimlock", no_argument, NULL, OPT_SETSIMLOCK },// Sets simlock
1049 { "sniff", optional_argument, NULL, OPT_SNIFFER },// Will show datas from port
1050 { "decodefile", required_argument, NULL, OPT_DECODEFILE },//decode input file
1051 { "getbinringfromfile", required_argument, NULL, OPT_GETBINRINGFROMFILE },
1057 /* Every command which requires arguments should have an appropriate entry
1060 struct gnokii_arg_len gals[] =
1063 { OPT_MONITOR, 0, 1, 0 },
1066 { OPT_ENTERSECURITYCODE, 1, 1, 0 },
1067 { OPT_GETSECURITYCODE, 1, 1, 0 },
1071 { OPT_SNIFFER, 0, 1, 0 },
1072 { OPT_DECODEFILE, 1, 1, 0 },
1073 { OPT_GETBINRINGFROMFILE,4, 4, 0 },
1076 { OPT_SETDATETIME, 0, 5, 0 },
1077 { OPT_BACKUPSETTINGS, 1, 1, 0 },
1078 { OPT_RESTORESETTINGS, 1, 1, 0 },
1079 { OPT_SETALARM, 2, 2, 0 },
1080 { OPT_DIALVOICE, 1, 1, 0 },
1081 { OPT_GETCALENDARNOTE, 1, 3, 0 },
1082 { OPT_WRITECALENDARNOTE, 2, 2, 0 },
1083 { OPT_SAVECALENDARNOTE, 2, 9, 0 },
1084 { OPT_SENDCALENDARNOTE, 3, 9, 0 },
1085 { OPT_SAVEPHONEBOOKENTRY,2, 9, 0 },
1086 { OPT_SENDPHONEBOOKENTRY,3, 9, 0 },
1087 { OPT_DELCALENDARNOTE, 1, 1, 0 },
1088 { OPT_GETMEMORY, 2, 4, 0 },
1089 { OPT_GETSPEEDDIAL, 1, 1, 0 },
1090 { OPT_SETSPEEDDIAL, 3, 3, 0 },
1091 { OPT_GETSMS, 2, 5, 0 },
1092 { OPT_DELETESMS, 2, 3, 0 },
1093 { OPT_SENDSMS, 1,10, 0 },
1094 { OPT_SAVESMS, 1,11, 0 },
1095 { OPT_SENDLOGO, 3, 9, 0 },
1096 { OPT_SAVELOGO, 2,10, 0 },
1097 { OPT_SENDRINGTONE, 2, 7, 0 },
1098 { OPT_SAVERINGTONE, 1, 9, 0 },
1099 { OPT_GETSMSC, 1, 1, 0 },
1100 { OPT_RENAMESMSC, 2, 2, 0 },
1101 { OPT_NETMONITOR, 1, 1, 0 },
1102 { OPT_SENDDTMF, 1, 1, 0 },
1103 { OPT_SETLOGO, 1, 5, 0 },
1104 { OPT_GETLOGO, 1, 4, 0 },
1105 { OPT_SETRINGTONE, 1, 3, 0 },
1106 { OPT_GETRINGTONE, 1, 2, 0 },
1107 { OPT_PRESSKEYSEQUENCE, 1, 1, 0 },
1108 { OPT_RESET, 0, 1, 0 },
1109 { OPT_GETPROFILE, 0, 1, 0 },
1110 { OPT_SETPROFILE, 3, 3, 0 },
1111 { OPT_SENDPROFILE, 4,10, 0 },
1112 { OPT_WRITEPHONEBOOK, 0, 1, 0 },
1113 { OPT_PLAYRINGTONE, 1, 1, 0 },
1114 { OPT_COMPOSER, 1, 1, 0 },
1115 { OPT_RINGTONECONVERT, 2, 2, 0 },
1116 { OPT_BINRINGTONECONVERT,2, 2, 0 },
1117 { OPT_BITMAPCONVERT, 2, 4, 0 },
1118 { OPT_SHOWBITMAP, 1, 1, 0 },
1119 { OPT_SETOPERATORNAME, 0, 2, 0 },
1120 { OPT_SETPHONEPROFILE, 2, 2, 0 },
1121 { OPT_NM_COLLECT, 1, MAX_NM_COLLECT, 0 },
1122 { OPT_NETMONITORDATA, 0,99, 0 },
1123 { OPT_GETWAPBOOKMARK, 1, 1, 0 },
1124 { OPT_SETWAPBOOKMARK, 2, 3, 0 },
1125 { OPT_SAVEWAPBOOKMARK, 1, 9, 0 },
1126 { OPT_SENDWAPBOOKMARK, 2, 9, 0 },
1127 { OPT_GETWAPSETTINGS, 1, 1, 0 },
1128 { OPT_SAVEWAPSETTINGS, 1, 9, 0 },
1129 { OPT_SENDWAPSETTINGS, 2, 9, 0 },
1130 { OPT_DIVERT, 3, 5, 0 },
1137 /* For GNU gettext */
1141 textdomain("gnokii");
1142 setlocale(LC_ALL, "pl_PL"); //here is string for Polish localisation
1144 setlocale(LC_ALL, ".852"); //Polish codepage for console, not "real" WIN CP
1149 /* Read config file */
1150 if (CFG_ReadConfig(&model, &Port, &Initlength, &Connection, &BinDir, &SynchronizeTime,false) < 0) {
1154 /* Handle command line arguments. */
1156 c = getopt_long(argc, argv, "", long_options, NULL);
1160 /* No argument given - we should display usage. */
1165 /* We have to build an array of the arguments which will be passed to the
1166 functions. Please note that every text after the --command will be
1167 passed as arguments. A syntax like gnokii --cmd1 args --cmd2 args will
1168 not work as expected; instead args --cmd2 args is passed as a
1171 if((nargv = malloc(sizeof(char *) * argc)) != NULL) {
1173 for(i = 2; i < argc; i++)
1174 nargv[i-2] = argv[i];
1176 if(checkargs(c, gals, nargc)) {
1180 /* Wrong number of arguments - we should display usage. */
1186 #if defined(__svr4__)
1187 /* have to ignore SIGALARM */
1194 // First, error conditions
1196 fprintf(stderr, _("Use '%s --help' for usage informations.\n"), argv[0]);
1199 // Then, options with no arguments
1200 case OPT_HELP: rc = usage(); break;
1201 case OPT_VERSION: rc = version(); break;
1202 case OPT_MONITOR: rc = monitormode(nargc, nargv); break;
1203 case OPT_GETSMSFOLDERS: rc = getsmsfolders(); break;
1204 case OPT_GETDATETIME: rc = getdatetime(); break;
1205 case OPT_GETALARM: rc = getalarm(); break;
1206 case OPT_GETDISPLAYSTATUS: rc = getdisplaystatus(); break;
1207 case OPT_PMON: rc = pmon(); break;
1208 case OPT_WRITEPHONEBOOK: rc = writephonebook(nargc, nargv);break;
1211 case OPT_ENTERSECURITYCODE: rc = entersecuritycode(optarg); break;
1212 case OPT_GETSECURITYCODESTATUS: rc = getsecuritycodestatus(); break;
1213 case OPT_GETSECURITYCODE: rc = getsecuritycode(optarg); break;
1214 case OPT_GETEEPROM: rc = geteeprom(); break;
1215 case OPT_RESETPHONESETTINGS: rc = resetphonesettings(); break;
1216 case OPT_SETSIMLOCK: rc = setsimlock(); break;
1220 case OPT_SNIFFER: rc = sniff(nargc, nargv); break;
1221 case OPT_DECODEFILE: rc = decodefile(nargc, nargv); break;
1222 case OPT_GETBINRINGFROMFILE: rc = getbinringfromfile(nargc, nargv);break;
1225 // Now, options with arguments
1226 case OPT_SETDATETIME: rc = setdatetime(nargc, nargv); break;
1227 case OPT_SETALARM: rc = setalarm(nargv); break;
1228 case OPT_DIALVOICE: rc = dialvoice(optarg); break;
1229 case OPT_CANCELCALL: rc = cancelcall(); break;
1230 case OPT_GETCALENDARNOTE: rc = getcalendarnote(nargc, nargv);break;
1231 case OPT_DELCALENDARNOTE: rc = deletecalendarnote(optarg);break;
1232 case OPT_SAVECALENDARNOTE: rc = savecalendarnote(nargc, nargv);break;
1233 case OPT_SENDCALENDARNOTE: rc = sendcalendarnote(nargc, nargv);break;
1234 case OPT_SAVEPHONEBOOKENTRY: rc = savephonebookentry(nargc, nargv);break;
1235 case OPT_SENDPHONEBOOKENTRY: rc = sendphonebookentry(nargc, nargv);break;
1236 case OPT_WRITECALENDARNOTE: rc = writecalendarnote(nargv); break;
1237 case OPT_GETMEMORY: rc = getmemory(nargc, nargv); break;
1238 case OPT_GETSPEEDDIAL: rc = getspeeddial(optarg); break;
1239 case OPT_SETSPEEDDIAL: rc = setspeeddial(nargv); break;
1240 case OPT_GETSMS: rc = getsms(argc, argv); break;
1241 case OPT_GETSMSSTATUS: rc = getsmsstatus(argc, argv); break;
1242 case OPT_DELETESMS: rc = deletesms(nargc, nargv); break;
1243 case OPT_SENDSMS: rc = sendsms(nargc, nargv); break;
1244 case OPT_SAVESMS: rc = savesms(nargc, nargv); break;
1245 case OPT_DIVERT: rc = divert(nargc, nargv); break;
1246 case OPT_SENDLOGO: rc = sendlogo(nargc, nargv); break;
1247 case OPT_SAVELOGO: rc = savelogo(nargc, nargv); break;
1248 case OPT_GETSMSC: rc = getsmsc(optarg); break;
1249 case OPT_RENAMESMSC: rc = renamesmsc(nargc,nargv); break;
1250 case OPT_NETMONITOR: rc = netmonitor(optarg); break;
1251 case OPT_IDENTIFY: rc = identify(); break;
1252 case OPT_SETLOGO: rc = setlogo(nargc, nargv); break;
1253 case OPT_GETLOGO: rc = getlogo(nargc, nargv); break;
1254 case OPT_RECEIVESMS: rc = receivesms(nargc, nargv); break;
1255 case OPT_SETRINGTONE: rc = setringtone(nargc, nargv); break;
1256 case OPT_GETRINGTONE: rc = getringtone(nargc, nargv); break;
1257 case OPT_PRESSKEYSEQUENCE: rc = presskeysequence(nargv); break;
1258 case OPT_SENDRINGTONE: rc = sendringtone(nargc, nargv);break;
1259 case OPT_SAVERINGTONE: rc = saveringtone(nargc, nargv);break;
1260 case OPT_GETPROFILE: rc = getprofile(nargc, nargv); break;
1261 case OPT_SETPROFILE: rc = setprofile(nargc, nargv); break;
1262 case OPT_SENDPROFILE: rc = sendprofile(nargc, nargv); break;
1263 case OPT_DISPLAYOUTPUT: rc = displayoutput(); break;
1264 case OPT_RESTORESETTINGS: rc = restoresettings(nargv); break;
1265 case OPT_BACKUPSETTINGS: rc = backupsettings(nargv); break;
1266 case OPT_RINGTONECONVERT: rc = ringtoneconvert(nargc, nargv);break;
1267 case OPT_BINRINGTONECONVERT: rc = binringtoneconvert(nargc, nargv);break;
1268 case OPT_BITMAPCONVERT: rc = bitmapconvert(nargc, nargv);break;
1269 case OPT_SHOWBITMAP: rc = showbitmap(nargc, nargv); break;
1270 case OPT_PLAYRINGTONE: rc = playringtone(nargc, nargv);break;
1271 case OPT_COMPOSER: rc = composer(nargc, nargv); break;
1272 case OPT_FOOGLE: rc = foogle(nargv); break;
1273 case OPT_PHONETESTS: rc = phonetests(); break;
1274 case OPT_SIMLOCKINFO: rc = simlockinfo(); break;
1275 case OPT_SENDDTMF: rc = senddtmf(optarg); break;
1276 case OPT_RESET: rc = reset(nargc,nargv); break;
1277 case OPT_GETOPERATORNAME: rc = getoperatorname(); break;
1278 case OPT_SETOPERATORNAME: rc = setoperatorname(nargc,nargv);break;
1279 case OPT_GETWAPBOOKMARK: rc = getwapbookmark(nargc,nargv);break;
1280 case OPT_SETWAPBOOKMARK: rc = setwapbookmark(nargc,nargv);break;
1281 case OPT_SAVEWAPBOOKMARK: rc = savewapbookmark(nargc,nargv);break;
1282 case OPT_SENDWAPBOOKMARK: rc = sendwapbookmark(nargc,nargv);break;
1283 case OPT_GETWAPSETTINGS: rc = getwapsettings(nargc,nargv);break;
1284 case OPT_SAVEWAPSETTINGS: rc = savewapsettings(nargc,nargv);break;
1285 case OPT_SENDWAPSETTINGS: rc = sendwapsettings(nargc,nargv);break;
1286 case OPT_ALLRINGTONES: rc = allringtones(); break;
1287 case OPT_GETPHONEPROFILE: rc = getphoneprofile(); break;
1288 case OPT_SETPHONEPROFILE: rc = setphoneprofile(nargc,nargv);break;
1289 case OPT_GETVOICEMAILBOX: rc = getvoicemailbox(); break;
1290 case OPT_NM_COLLECT: rc = nm_collect(nargc, nargv); break;
1291 case OPT_NETMONITORDATA: rc = netmonitordata(nargc, nargv);break;
1293 default: fprintf(stderr, _("Unknown option: %d\n"), c); break;
1302 fprintf(stderr, _("Wrong number of arguments\n"));
1307 /* Restores various phone settings from one file */
1308 int restoresettings(char *argv[])
1311 GSM_PhonebookEntry pbk;
1318 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1319 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1321 if (GSM_ReadBackupFile(argv[0], &Backup)!=GE_NONE) return 1;
1325 if (Backup.SIMPhonebookUsed!=0) {
1327 while (confirm < 0) {
1328 fprintf(stderr, _("Restore SIM phonebook ? "));
1329 GetLine(stdin, ans, 99);
1330 if (!strcmp(ans, "yes")) confirm = 1;
1331 if (!strcmp(ans, "no" )) confirm = 0;
1334 if (GSM->GetMemoryStatus(&SIMMemoryStatus) != GE_NONE) {
1335 fprintf(stderr,_("Error getting memory status !\n"));
1340 while ((pos-1)!=SIMMemoryStatus.Used+SIMMemoryStatus.Free) {
1342 pbk.MemoryType=GMT_SM;
1345 pbk.SubEntriesCount = 0;
1346 if (i<Backup.SIMPhonebookUsed) {
1347 if (Backup.SIMPhonebook[i].Location==pbk.Location) {
1348 pbk=Backup.SIMPhonebook[i];
1351 // fprintf(stdout,_("Copying from backup\n"));
1356 // fprintf(stdout,_("Setting location %i\n"),pbk.Location);
1358 GSM->WritePhonebookLocation(&pbk);
1359 fprintf(stderr,_("."));
1362 fprintf(stderr,_("\n"));
1365 if (Backup.PhonePhonebookUsed!=0) {
1367 while (confirm < 0) {
1368 fprintf(stderr, _("Restore phone phonebook ? "));
1369 GetLine(stdin, ans, 99);
1370 if (!strcmp(ans, "yes")) confirm = 1;
1371 if (!strcmp(ans, "no" )) confirm = 0;
1374 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) != GE_NONE) {
1375 fprintf(stderr,_("Error getting memory status !\n"));
1381 while ((pos-1)!=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free) {
1383 pbk.MemoryType=GMT_ME;
1386 pbk.SubEntriesCount = 0;
1387 if (i<Backup.PhonePhonebookUsed) {
1388 if (Backup.PhonePhonebook[i].Location==pbk.Location) {
1389 pbk=Backup.PhonePhonebook[i];
1392 // fprintf(stdout,_("Copying from backup\n"));
1397 // fprintf(stdout,_("Setting location %i\n"),pbk.Location);
1399 GSM->WritePhonebookLocation(&pbk);
1400 fprintf(stderr,_("."));
1403 fprintf(stderr,_("\n"));
1406 if (Backup.CallerAvailable==true) {
1408 while (confirm < 0) {
1409 fprintf(stderr, _("Restore caller groups ? "));
1410 GetLine(stdin, ans, 99);
1411 if (!strcmp(ans, "yes")) confirm = 1;
1412 if (!strcmp(ans, "no" )) confirm = 0;
1415 for (i=0;i<5;i++) GSM->SetBitmap(&Backup.CallerGroups[i]);
1418 if (Backup.OperatorLogoAvailable==true) {
1420 while (confirm < 0) {
1421 fprintf(stderr, _("Restore operator logo ? "));
1422 GetLine(stdin, ans, 99);
1423 if (!strcmp(ans, "yes")) confirm = 1;
1424 if (!strcmp(ans, "no" )) confirm = 0;
1427 GSM->SetBitmap(&Backup.OperatorLogo);
1430 if (Backup.StartupLogoAvailable==true) {
1432 while (confirm < 0) {
1433 fprintf(stderr, _("Restore startup logo ? "));
1434 GetLine(stdin, ans, 99);
1435 if (!strcmp(ans, "yes")) confirm = 1;
1436 if (!strcmp(ans, "no" )) confirm = 0;
1439 GSM->SetBitmap(&Backup.StartupLogo);
1448 /* Backup various phone settings from one file */
1449 int backupsettings(char *argv[])
1451 GSM_PhonebookEntry PbkEntry;
1456 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1457 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1461 fprintf(stderr,_("Backup phonebook from SIM..."));
1462 Backup.SIMPhonebookUsed=0;
1463 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE) {
1464 Backup.SIMPhonebookSize=SIMMemoryStatus.Used+SIMMemoryStatus.Free;
1466 PbkEntry.MemoryType=GMT_SM;
1468 for (i=0;i<Backup.SIMPhonebookSize;i++)
1470 if (SIMMemoryStatus.Used==Backup.SIMPhonebookUsed) break;
1472 PbkEntry.Location=i;
1474 error=GSM->GetMemoryLocation(&PbkEntry);
1477 Backup.SIMPhonebook[Backup.SIMPhonebookUsed]=PbkEntry;
1478 Backup.SIMPhonebookUsed++;
1479 fprintf(stderr,_("."));
1485 fprintf(stderr,_("Done\n"));
1486 } else fprintf(stderr,_("ERROR\n"));
1488 fprintf(stderr,_("Backup phonebook from phone..."));
1489 Backup.PhonePhonebookUsed=0;
1490 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE) {
1491 Backup.PhonePhonebookSize=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free;
1493 PbkEntry.MemoryType=GMT_ME;
1495 for (i=0;i<Backup.PhonePhonebookSize;i++)
1497 if (PhoneMemoryStatus.Used==Backup.PhonePhonebookUsed) break;
1499 PbkEntry.Location=i;
1501 error=GSM->GetMemoryLocation(&PbkEntry);
1504 Backup.PhonePhonebook[Backup.PhonePhonebookUsed]=PbkEntry;
1505 Backup.PhonePhonebookUsed++;
1506 fprintf(stderr,_("."));
1512 fprintf(stderr,_("Done\n"));
1513 } else fprintf(stderr,_("ERROR\n"));
1515 if( GetModelFeature (FN_CALLERGROUPS)!=0) {
1516 fprintf(stderr,_("Backup caller logos..."));
1517 Backup.CallerAvailable=true;
1519 Backup.CallerGroups[i].number=i;
1520 Backup.CallerGroups[i].type=GSM_CallerLogo;
1521 if (GSM->GetBitmap(&Backup.CallerGroups[i])!=GE_NONE) return 1;
1523 fprintf(stderr,_("Done\n"));
1524 } else Backup.CallerAvailable=false;
1526 // fprintf(stderr,_("Backup speed dials..."));
1527 Backup.SpeedAvailable=false;
1528 // for (i=0;i<8;i++) {
1529 // Backup.SpeedDials[i].Number=i+1;
1530 // if (GSM->GetSpeedDial(&Backup.SpeedDials[i])!=GE_NONE) return 1;
1532 // fprintf(stderr,_("Done\n"));
1534 fprintf(stderr,_("Backup operator logo..."));
1535 Backup.OperatorLogoAvailable=true;
1536 Backup.OperatorLogo.type=GSM_7110OperatorLogo;
1537 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1538 Backup.OperatorLogo.type=GSM_OperatorLogo;
1539 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1540 Backup.OperatorLogoAvailable=false;
1541 fprintf(stderr,_("Error\n"));
1542 } else fprintf(stderr,_("Done\n"));
1543 } else fprintf(stderr,_("Done\n"));
1545 Backup.StartupLogoAvailable=false;
1546 if( GetModelFeature (FN_STARTUP)!=0) {
1547 fprintf(stderr,_("Backup startup logo..."));
1548 Backup.StartupLogoAvailable=true;
1549 switch (GetModelFeature (FN_STARTUP)) {
1550 case F_STA62: Backup.StartupLogo.type=GSM_6210StartupLogo;break;
1551 case F_STA71: Backup.StartupLogo.type=GSM_7110StartupLogo;break;
1552 default : Backup.StartupLogo.type=GSM_StartupLogo;break;
1554 if (GSM->GetBitmap(&Backup.StartupLogo)!=GE_NONE) {
1555 Backup.StartupLogoAvailable=false;
1556 fprintf(stderr,_("Error\n"));
1557 } else fprintf(stderr,_("Done\n"));
1560 fprintf(stderr,_("Backup welcome note..."));
1561 Backup.StartupText.type=GSM_WelcomeNoteText;
1562 if (GSM->GetBitmap(&Backup.StartupText)!=GE_NONE) {
1563 fprintf(stderr,_("Error\n"));
1564 } else fprintf(stderr,_("Done\n"));
1568 GSM_SaveBackupFile(argv[0], &Backup);
1573 /* Presses keys on phone's keyboard */
1575 int presskeysequence(char *argv[])
1585 for (i=0;i<strlen(argv[0]);i++)
1591 if (key!='w' && key!='W')
1593 while (Keys[j].whatchar!=' ') {
1594 if (Keys[j].whatchar==key) {
1595 keycode=Keys[j].whatcode;
1602 fprintf(stderr,_("Unknown key: %c !\n"),key);
1607 if (GSM->PressKey(keycode,PRESSPHONEKEY)!=GE_NONE)
1609 fprintf(stderr,_("Can't press key !\n"));
1613 if (GSM->PressKey(keycode,RELEASEPHONEKEY)!=GE_NONE)
1615 fprintf(stderr,_("Can't release key !\n"));
1630 /* Send SMS messages. */
1631 int sendsms(int argc, char *argv[])
1633 GSM_MultiSMSMessage MultiSMS;
1634 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1635 int input_len, chars_read,i,msgnum;
1637 GSM_SMSMessageType SMSType=GST_SMS;
1638 int SMSValidity= 4320; /* 4320 minutes == 72 hours */
1639 bool SMSReply=false;
1640 int SMSClass=-1,SMSCenter=1;
1641 char SMSCNumber[100];
1642 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1643 GSM_UDH SMSUDHType=GSM_NoUDH;
1645 struct option options[] = {
1646 { "smscno", required_argument, NULL, '2'},
1647 { "smsc", required_argument, NULL, '1'},
1648 { "long", required_argument, NULL, '3'},
1649 { "enablevoice", no_argument, NULL, '4'},
1650 { "disablevoice", no_argument, NULL, '5'},
1651 { "enableemail", no_argument, NULL, '6'},
1652 { "disableemail", no_argument, NULL, '7'},
1653 { "enablefax", no_argument, NULL, '8'},
1654 { "disablefax", no_argument, NULL, '9'},
1655 { "unicode", no_argument, NULL, '-'},
1656 { "void", no_argument, NULL, '+'},
1657 { "hang", no_argument, NULL, '('},
1658 { "bug", no_argument, NULL, ')'},
1662 input_len = GSM_MAX_SMS_LENGTH;
1669 while ((i = getopt_long(argc, argv, "v:dsC:", options, NULL)) != -1) {
1672 case '1': /* SMSC number */
1674 strcpy(SMSCNumber,optarg);
1677 case '2': /* SMSC number index in phone memory */
1678 SMSCenter = atoi(optarg);
1680 if (SMSCenter < 1 || SMSCenter > 5) {
1681 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1687 case '3': /* we send long message */
1688 SMSUDHType=GSM_ConcatenatedMessages;
1689 input_len = atoi(optarg);
1690 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1691 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1696 case '4': /* SMS enables voice indicator */
1697 SMSUDHType=GSM_EnableVoice; break;
1699 case '5': /* SMS disables voice indicator */
1700 SMSUDHType=GSM_DisableVoice; break;
1702 case '6': /* SMS enables email indicator */
1703 SMSUDHType=GSM_EnableEmail; break;
1705 case '7': /* SMS disables email indicator */
1706 SMSUDHType=GSM_DisableEmail; break;
1708 case '8': /* SMS enables fax indicator */
1709 SMSUDHType=GSM_EnableFax; break;
1711 case '9': /* SMS disables fax indicator */
1712 SMSUDHType=GSM_DisableFax; break;
1714 case '-': /* SMS coding type */
1715 SMSCoding=GSM_Coding_Unicode; break;
1717 case '+': /* SMS ghost */
1718 SMSUDHType=GSM_VoidSMS; break;
1720 case '(': /* SMS hanging phone, when saved to Outbox */
1721 SMSUDHType=GSM_HangSMS; break;
1723 case ')': /* SMS showed incorrectly in phone */
1724 SMSUDHType=GSM_BugSMS; break;
1726 case 'v': /* Set validaty of SMS */
1727 SMSValidity = atoi(optarg); break;
1729 case 'd': /* delivery report */
1730 SMSType=GST_DR; break;
1732 case 's': /* Set replying via the same SMSC */
1733 SMSReply = true; break;
1735 case 'C': /* class Message */
1737 if (SMSUDHType!=GSM_NoUDH) {
1738 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1743 case '0': SMSClass = 0; break;
1744 case '1': SMSClass = 1; break;
1745 case '2': SMSClass = 2; break;
1746 case '3': SMSClass = 3; break;
1748 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1754 fprintf(stderr,_("Unknown option number %i\n"),argc);
1760 /* Get message text from stdin. */
1761 chars_read = fread(message_buffer, 1, input_len, stdin);
1763 if (chars_read == 0) {
1764 fprintf(stderr, _("Couldn't read from stdin!\n"));
1767 if (chars_read > input_len) {
1768 fprintf(stderr, _("Input too long!\n"));
1772 /* Null terminate. */
1773 message_buffer[chars_read] = 0x00;
1775 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1776 msgnum=MultiSMS.number;
1778 switch (SMSUDHType) {
1783 case GSM_EnableVoice:
1784 case GSM_DisableVoice:
1786 case GSM_DisableFax:
1787 case GSM_EnableEmail:
1788 case GSM_DisableEmail:
1789 fprintf(stdout,_("Warning: saving %i chars\n"),strlen(MultiSMS.SMS[0].MessageText));
1796 for (i=0;i<msgnum;i++) {
1797 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1799 MultiSMS.SMS[i].Class=SMSClass;
1800 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
1801 MultiSMS.SMS[i].Type=SMSType;
1802 MultiSMS.SMS[i].Validity=SMSValidity;
1805 /* Initialise the GSM interface. */
1808 MultiSMS.number=msgnum;
1809 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,false,false,false);
1814 int savesms(int argc, char *argv[])
1816 GSM_MultiSMSMessage MultiSMS;
1817 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1818 int input_len, chars_read,i,msgnum;
1820 int SMSClass=-1,SMSCenter=1;
1822 char SMSCNumber[100];
1823 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1824 GSM_UDH SMSUDHType=GSM_NoUDH;
1825 GSM_SMSMessageStatus SMSStatus;
1827 bool SMSReply=false;
1829 bool interactive=false;
1831 struct option options[] = {
1832 { "smscno", required_argument, NULL, '2'},
1833 { "smsc", required_argument, NULL, '1'},
1834 { "long", required_argument, NULL, '3'},
1835 { "enablevoice", no_argument, NULL, '4'},
1836 { "disablevoice", no_argument, NULL, '5'},
1837 { "enableemail", no_argument, NULL, '6'},
1838 { "disableemail", no_argument, NULL, '7'},
1839 { "enablefax", no_argument, NULL, '8'},
1840 { "disablefax", no_argument, NULL, '9'},
1841 { "unicode", no_argument, NULL, '-'},
1842 { "void", no_argument, NULL, '+'},
1843 { "hang", no_argument, NULL, '('},
1844 { "bug", no_argument, NULL, ')'},
1845 { "smsname", required_argument, NULL, '/'},
1851 SMSStatus=GSS_NOTSENTREAD;
1852 SMSFolder=GST_OUTBOX;
1854 input_len = GSM_MAX_SMS_LENGTH;
1861 while ((i = getopt_long(argc, argv, "risal:C:F:", options, NULL)) != -1) {
1864 case '1': /* SMSC number */
1866 strcpy(SMSCNumber,optarg);
1869 case '2': /* SMSC number index in phone memory */
1870 SMSCenter = atoi(optarg);
1872 if (SMSCenter < 1 || SMSCenter > 5) {
1873 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1879 case '3': /* we send long message */
1880 SMSUDHType=GSM_ConcatenatedMessages;
1881 input_len = atoi(optarg);
1882 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1883 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1888 case '4': /* SMS enables voice indicator */
1889 SMSUDHType=GSM_EnableVoice; break;
1891 case '5': /* SMS disables voice indicator */
1892 SMSUDHType=GSM_DisableVoice; break;
1894 case '6': /* SMS enables email indicator */
1895 SMSUDHType=GSM_EnableEmail; break;
1897 case '7': /* SMS disables email indicator */
1898 SMSUDHType=GSM_DisableEmail; break;
1900 case '8': /* SMS enables fax indicator */
1901 SMSUDHType=GSM_EnableFax; break;
1903 case '9': /* SMS disables fax indicator */
1904 SMSUDHType=GSM_DisableFax; break;
1906 case '-': /* SMS coding type */
1907 SMSCoding=GSM_Coding_Unicode; break;
1909 case '+': /* SMS ghost */
1910 SMSUDHType=GSM_VoidSMS; break;
1912 case '(': /* SMS hanging phone, when saved to Outbox */
1913 SMSUDHType=GSM_HangSMS; break;
1915 case ')': /* SMS showed incorrectly in phone */
1916 SMSUDHType=GSM_BugSMS; break;
1918 case 'r': /* mark as read */
1919 SMSStatus = GSS_SENTREAD; break;
1921 case 'i': /* Save into Inbox */
1922 SMSFolder = GST_INBOX; break;
1924 case 's': /* Set replying via the same SMSC */
1925 SMSReply = true; break;
1927 case 'a': /* Ask before overwriting */
1928 interactive=true;break;
1930 case 'l': /* Specify location */
1931 SMSLocation = atoi(optarg); break;
1933 case '/': /* Name */
1934 strncpy(SMSName,optarg,25);break;
1936 case 'C': /* class Message */
1938 if (SMSUDHType!=GSM_NoUDH) {
1939 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1944 case '0': SMSClass = 0; break;
1945 case '1': SMSClass = 1; break;
1946 case '2': SMSClass = 2; break;
1947 case '3': SMSClass = 3; break;
1949 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1954 case 'F': /* save into folder n */
1955 SMSFolder = atoi(optarg);
1959 fprintf(stderr,_("Unknown option number %i\n"),argc);
1965 /* Get message text from stdin. */
1966 chars_read = fread(message_buffer, 1, input_len, stdin);
1968 if (chars_read == 0) {
1969 fprintf(stderr, _("Couldn't read from stdin!\n"));
1972 if (chars_read > input_len) {
1973 fprintf(stderr, _("Input too long!\n"));
1977 /* Null terminate. */
1978 message_buffer[chars_read] = 0x00;
1980 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1981 msgnum=MultiSMS.number;
1983 switch (SMSUDHType) {
1988 case GSM_EnableVoice:
1989 case GSM_DisableVoice:
1991 case GSM_DisableFax:
1992 case GSM_EnableEmail:
1993 case GSM_DisableEmail:
1994 fprintf(stdout,_("Warning: saving %i chars\n"),strlen(MultiSMS.SMS[0].MessageText));
2001 for (i=0;i<msgnum;i++) {
2002 MultiSMS.SMS[i].Destination[0]=0;
2003 if (argc!=0) strcpy(MultiSMS.SMS[i].Destination,argv[0]);
2005 MultiSMS.SMS[i].Location=0;
2006 MultiSMS.SMS[i].Class=SMSClass;
2007 MultiSMS.SMS[i].MessageCenter.No=SMSCenter;
2008 strcpy(MultiSMS.SMS[i].MessageCenter.Number,SMSCNumber);
2009 MultiSMS.SMS[i].Status=SMSStatus;
2010 strcpy(MultiSMS.SMS[i].Name,SMSName);
2011 MultiSMS.SMS[i].folder=SMSFolder;
2012 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
2015 MultiSMS.SMS[0].Location=SMSLocation;
2017 /* Initialise the GSM interface. */
2020 MultiSMS.number=msgnum;
2021 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,interactive,false,false,false);
2026 /* Get SMSC number */
2028 int getsmsc(char *MessageCenterNumber)
2031 GSM_MessageCenter MessageCenter;
2033 MessageCenter.No=atoi(MessageCenterNumber);
2037 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
2039 fprintf(stdout, _("%d. SMS center ("),MessageCenter.No);
2041 if (!strcmp(MessageCenter.Name,""))
2042 fprintf(stdout,_("Set %d"),MessageCenter.No);
2043 else fprintf(stdout,_("%s"),MessageCenter.Name);
2045 fprintf(stdout,_(") number is "));
2047 if (!strcmp(MessageCenter.Number,"")) fprintf(stdout,_("not set\n"));
2048 else fprintf(stdout,_("%s\n"),MessageCenter.Number);
2050 fprintf(stdout,_("Default recipient number is "));
2052 if (!strcmp(MessageCenter.DefaultRecipient,""))
2053 fprintf(stdout,_("not set\n"));
2054 else fprintf(stdout,_("%s\n"),MessageCenter.DefaultRecipient);
2056 fprintf(stdout, _("Messages sent as "));
2058 switch (MessageCenter.Format) {
2059 case GSMF_Text :fprintf(stdout, _("Text"));break;
2060 case GSMF_Paging:fprintf(stdout, _("Paging"));break;
2061 case GSMF_Fax :fprintf(stdout, _("Fax"));break;
2063 case GSMF_UCI :fprintf(stdout, _("Email"));break;
2064 case GSMF_ERMES :fprintf(stdout, _("ERMES"));break;
2065 case GSMF_X400 :fprintf(stdout, _("X.400"));break;
2066 default :fprintf(stdout, _("Unknown"));
2071 fprintf(stdout, _("Message validity is "));
2073 switch (MessageCenter.Validity) {
2074 case GSMV_1_Hour :fprintf(stdout, _("1 hour"));break;
2075 case GSMV_6_Hours :fprintf(stdout, _("6 hours"));break;
2076 case GSMV_24_Hours:fprintf(stdout, _("24 hours"));break;
2077 case GSMV_72_Hours:fprintf(stdout, _("72 hours"));break;
2078 case GSMV_1_Week :fprintf(stdout, _("1 week"));break;
2079 case GSMV_Max_Time:fprintf(stdout, _("Maximum time"));break;
2080 default :fprintf(stdout, _("Unknown"));
2083 fprintf(stdout, "\n");
2087 fprintf(stdout, _("SMS center can not be found :-(\n"));
2094 /* Get SMS messages. */
2095 int getsms(int argc, char *argv[])
2098 GSM_SMSMessage message;
2099 GSM_WAPBookmark bookmark;
2100 char memory_type_string[20];
2101 int start_message, end_message, count, mode = 1;
2105 GSM_Ringtone ringtone;
2106 GSM_SMSFolders folders;
2108 int confirm = -1, i;
2111 /* Handle command line args that set type, start and end locations. */
2112 if (!GetMemoryTypeID(argv[2], &message.MemoryType))
2114 fprintf(stderr, _("Unknown memory type %s!\n"), argv[2]);
2117 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2119 for (i=0;i<64;i++) filename[i]=0;
2121 start_message = atoi(argv[3]);
2125 /* [end] can be only argv[4] */
2126 if (argv[4][0] == '-') { end_message = start_message; }
2127 else { end_message = atoi(argv[4]); }
2129 /* parse all options (beginning with '-' */
2130 while ((i = getopt(argc, argv, "f:")) != -1) {
2135 fprintf(stderr, _("Saving into file \"%s\"\n"), optarg);
2137 strncpy(filename, optarg, 64);
2138 if (strlen(optarg) > 63) {
2139 fprintf(stderr, _("Filename too long - will be truncated to 63 characters.\n"));
2142 filename[strlen(optarg)] = 0;
2155 end_message = start_message;
2158 /* Initialise the code for the GSM interface. */
2162 GSM->GetSMSFolders(&folders);
2165 /* Now retrieve the requested entries. */
2167 for (count = start_message; count <= end_message; count ++) {
2169 message.Location = count;
2171 error = GSM->GetSMSMessage(&message);
2177 switch (message.Type) {
2181 /* RTH FIXME: Test that out ! */
2182 fprintf(stdout, _("%d. Delivery Report "), message.MessageNumber);
2183 switch (message.Status)
2186 if (message.folder==0) fprintf(stdout, _("(read)\n")); //GST_INBOX
2187 else fprintf(stdout, _("(sent)\n"));
2189 case GSS_NOTSENTREAD:
2190 if (message.folder==0) fprintf(stdout, _("(unread)\n")); //GST_INBOX
2191 else fprintf(stdout, _("(not sent)\n"));
2194 fprintf(stdout, _("(not known :-()\n"));
2197 fprintf(stdout, _("(template)\n"));
2200 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2204 fprintf(stdout, _("Sending date/time : %s %02d/%02d/%02d %d:%02d:%02d "), \
2205 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2206 message.Time.Day, message.Time.Month, message.Time.Year, \
2207 message.Time.Hour, message.Time.Minute, message.Time.Second);
2209 if (message.Time.Timezone) {
2210 if (message.Time.Timezone > 0)
2211 fprintf(stdout,_("+%02d00"), message.Time.Timezone);
2213 fprintf(stdout,_("%02d00"), message.Time.Timezone);
2216 fprintf(stdout, "\n");
2218 fprintf(stdout, _("Response date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2219 DayOfWeek(message.SMSCTime.Year, message.SMSCTime.Month, message.SMSCTime.Day), \
2220 message.SMSCTime.Day, message.SMSCTime.Month, message.SMSCTime.Year, \
2221 message.SMSCTime.Hour, message.SMSCTime.Minute, message.SMSCTime.Second);
2223 if (message.SMSCTime.Timezone) {
2224 if (message.SMSCTime.Timezone > 0)
2225 fprintf(stdout,_("+%02d00"),message.SMSCTime.Timezone);
2227 fprintf(stdout,_("%02d00"),message.SMSCTime.Timezone);
2230 fprintf(stdout, "\n");
2232 fprintf(stdout, _("Receiver: %s Msg Center: %s\n"), message.Sender, message.MessageCenter.Number);
2233 fprintf(stdout, _("Text: %s\n\n"), message.MessageText);
2238 fprintf(stdout, _("%d. %s Message "), message.MessageNumber,
2239 folders.Folder[message.folder].Name);
2241 switch (message.Status)
2244 if (message.folder==0) fprintf(stdout, _("(read)\n")); //GST_INBOX
2245 else fprintf(stdout, _("(sent)\n"));
2247 case GSS_NOTSENTREAD:
2248 if (message.folder==0) fprintf(stdout, _("(unread)\n")); //GST_INBOX
2249 else fprintf(stdout, _("(not sent)\n"));
2252 fprintf(stdout, _("(not known :-()\n"));
2255 fprintf(stdout, _("(template)\n"));
2258 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2262 /* RTH FIXME: date for other status ok ? */
2263 if (message.SMSData) {
2265 fprintf(stdout, _("Date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2266 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2267 message.Time.Day, message.Time.Month, message.Time.Year, \
2268 message.Time.Hour, message.Time.Minute, message.Time.Second);
2270 if (message.Time.Timezone) {
2271 if (message.Time.Timezone > 0)
2272 fprintf(stdout,_("+%02d00"),message.Time.Timezone);
2274 fprintf(stdout,_("%02d00"),message.Time.Timezone);
2277 fprintf(stdout, "\n");
2279 fprintf(stdout, _("Msg Center: %s "), message.MessageCenter.Number);
2281 if (message.ReplyViaSameSMSC)
2282 fprintf(stdout, _("(centre set for reply) "));
2285 if (strcmp(message.Sender,"")) {
2286 if (message.folder==1) { //GST_OUTBOX
2287 fprintf(stdout, _("Recipient: %s"),message.Sender);
2289 fprintf(stdout, _("Sender: %s"),message.Sender);
2293 if (strcmp(message.Sender,"") || message.folder==0)
2294 fprintf(stdout, "\n");
2296 switch (message.UDHType) {
2300 /* put bitmap into bitmap structure */
2301 switch (GSM_ReadBitmap(&message, &bitmap)) {
2302 case GE_INVALIDIMAGESIZE:
2303 fprintf(stdout,_("Image size not supported\n"));
2306 fprintf(stdout, _("GSM operator logo for %s (%s) network.\n"), bitmap.netcode, GSM_GetNetworkName(bitmap.netcode));
2308 GSM_PrintBitmap(&bitmap);
2310 if (filename[0]!=0) {
2311 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2316 fprintf(stdout,_("Error reading image\n"));
2321 if (message.folder==0) { //GST_INBOX
2322 if (!strcmp(message.Sender, "+998000005") &&
2323 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2324 message.Time.Day==27 &&
2325 message.Time.Month==7 &&
2326 message.Time.Year==99 &&
2327 message.Time.Hour==0 &&
2328 message.Time.Minute==10 &&
2329 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2331 /* Is it changed in next versions ? Or what ? */
2332 if (!strcmp(message.Sender, "+998000002") ||
2333 !strcmp(message.Sender, "+998000003") ||
2334 !strcmp(message.Sender, "+998000004")) fprintf(stdout, _("Saved by Operator Logo Uploader by Thomas Kessler\n"));
2336 if (!strcmp(message.Sender, "+8861234567890") &&
2337 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2339 if (!strncmp(message.Sender, "OpLogo",6) &&
2340 strlen(message.Sender)==11)
2341 fprintf(stdout, _("Saved by gnokii\n"));
2346 case GSM_WAPBookmarkUDH:
2348 /* put bookmark into bookmark structure */
2349 switch (GSM_ReadWAPBookmark(&message, &bookmark)) {
2351 fprintf(stdout, ("WAP Bookmark\n"));
2353 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
2355 if (bookmark.title[0]==0)
2356 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
2358 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
2362 fprintf(stdout,_("Error reading WAP Bookmark\n"));
2367 if (!strcmp(message.Sender, "WAPBookmark"))
2368 fprintf(stdout, _("Saved by gnokii\n"));
2373 case GSM_CallerIDLogo:
2375 /* put bitmap into bitmap structure */
2376 switch (GSM_ReadBitmap(&message, &bitmap)) {
2377 case GE_INVALIDIMAGESIZE:
2378 fprintf(stdout,_("Image size not supported\n"));
2381 fprintf(stdout, ("Caller Logo\n"));
2383 GSM_PrintBitmap(&bitmap);
2385 if (filename[0]!=0) {
2386 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2391 fprintf(stdout,_("Error reading image\n"));
2396 if (message.folder==0) { //GST_INBOX
2397 if (!strcmp(message.Sender, "+998000005") &&
2398 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2399 message.Time.Day==27 &&
2400 message.Time.Month==7 &&
2401 message.Time.Year==99 &&
2402 message.Time.Hour==0 &&
2403 message.Time.Minute==10 &&
2404 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2406 if (!strcmp(message.Sender, "+8861234567890") &&
2407 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2409 if (!strcmp(message.Sender, "GroupLogo"))
2410 fprintf(stdout, _("Saved by gnokii\n"));
2415 case GSM_ProfileUDH:
2416 fprintf(stdout, ("Profile SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2419 case GSM_WAPBookmarkUDHLong:
2420 fprintf(stdout, ("WAP Bookmark, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2423 case GSM_WAPSettingsUDH:
2424 fprintf(stdout, ("WAP Settings, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2427 case GSM_RingtoneUDH:
2429 /* put ringtone into ringtone structure */
2430 switch (GSM_ReadRingtone(&message, &ringtone)) {
2433 fprintf(stdout, ("Ringtone \"%s\"\n"),ringtone.name);
2435 while (confirm < 0) {
2436 fprintf(stderr, _("Do you want to play it ? (yes/no) "));
2437 GetLine(stdin, ans, 7);
2438 if (!strcmp(ans, "yes")) confirm = 1;
2439 if (!strcmp(ans, "no")) confirm = 0;
2442 if (confirm==1) GSM_PlayRingtoneOnConsole(&ringtone);
2444 if (filename[0]!=0) GSM_SaveRingtoneFileOnConsole(filename, &ringtone);
2449 fprintf(stdout,_("Gnokii can't read this ringtone - there is probably error inside\n"));
2455 case GSM_CalendarNoteUDH:
2456 fprintf(stdout, ("Calendar note SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2457 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2458 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2461 case GSM_ConcatenatedMessages:
2462 fprintf(stdout, _("Linked (%d/%d)\nText:\n%s\n\n"),message.UDH[5],message.UDH[4], message.MessageText);
2463 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2466 case GSM_EnableVoice:
2467 fprintf(stdout, _("Enables voice indicator\nText:\n%s\n\n"), message.MessageText);
2468 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2471 case GSM_DisableVoice:
2472 fprintf(stdout, _("Disables voice indicator\nText:\n%s\n\n"), message.MessageText);
2473 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2477 fprintf(stdout, _("Enables fax indicator\nText:\n%s\n\n"), message.MessageText);
2478 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2481 case GSM_DisableFax:
2482 fprintf(stdout, _("Disables fax indicator\nText:\n%s\n\n"), message.MessageText);
2483 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2486 case GSM_EnableEmail:
2487 fprintf(stdout, _("Enables email indicator\nText:\n%s\n\n"), message.MessageText);
2488 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2491 case GSM_DisableEmail:
2492 fprintf(stdout, _("Disables email indicator\nText:\n%s\n\n"), message.MessageText);
2493 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2497 fprintf(stdout, _("Void SMS\nText:\n%s\n\n"), message.MessageText);
2498 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2502 if (message.Coding!=GSM_Coding_8bit) {
2503 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2504 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2506 fprintf(stdout, _("Message cannot be displayed here\n")); // like in phone :-)
2510 default: //GSM_UnknownUDH and other
2511 fprintf(stderr, _("Unknown\n"));
2517 fprintf(stdout,_("Unknown SMS type. Report it\n"));
2523 case GE_NOTIMPLEMENTED:
2525 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2529 case GE_INVALIDSMSLOCATION:
2531 fprintf(stderr, _("Invalid location: %s %d\n"), memory_type_string, count);
2535 case GE_EMPTYSMSLOCATION:
2537 fprintf(stderr, _("SMS location %s %d empty.\n"), memory_type_string, count);
2543 fprintf(stderr, _("No access to %s memory.\n"), memory_type_string);
2549 fprintf(stderr, _("GetSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2558 int getsmsstatus(int argc, char *argv[])
2560 GSM_SMSStatus SMSStatus;
2561 GSM_SMSFolders folders;
2567 /* Initialise the code for the GSM interface. */
2570 error = GSM->GetSMSStatus(&SMSStatus);
2571 if (error!=GE_NONE) return error;
2573 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"),SMSStatus.UnRead, SMSStatus.Number);
2575 error=GSM->GetSMSFolders(&folders);
2576 if (error!=GE_NONE) return error;
2578 /* For not 7110 compatible phones we have to read all SMS and prepare sms table */
2579 if( GetModelFeature (FN_SMS)!=F_SMS71 )
2583 if (j==SMSStatus.Number) break;
2585 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
2586 SMSStatus.foldertable[j].smsnum=i;
2588 /* We set such folders ID like in 7110 compatible phones */
2589 if (SMS.Status==GSS_NOTSENTREAD && SMS.folder==0) //GST_INBOX
2590 SMSStatus.foldertable[j].folder=0;
2592 switch (SMS.folder) {
2594 SMSStatus.foldertable[j].folder=GST_7110_INBOX;
2597 SMSStatus.foldertable[j].folder=GST_7110_OUTBOX;
2607 printf("0.Unread : ");
2608 for(j=0; j<SMSStatus.Number; j++)
2610 if (SMSStatus.foldertable[j].folder == 0)
2611 printf("%d ",SMSStatus.foldertable[j].smsnum);
2615 for (i=0;i<folders.number;i++) {
2616 fprintf(stdout,_("%d.%-15s: "),i+1,folders.Folder[i].Name);
2617 for(j=0; j<SMSStatus.Number; j++)
2619 if ( SMSStatus.foldertable[j].folder / 8 == i+1)
2620 printf("%d ",SMSStatus.foldertable[j].smsnum);
2630 /* Delete SMS messages. */
2631 int deletesms(int argc, char *argv[])
2634 GSM_SMSMessage message;
2635 char memory_type_string[20];
2636 int start_message, end_message, count;
2639 /* Handle command line args that set type, start and end locations. */
2640 if (!GetMemoryTypeID(argv[0], &message.MemoryType))
2642 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
2645 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2647 start_message = atoi (argv[1]);
2648 if (argc > 2) end_message = atoi (argv[2]);
2649 else end_message = start_message;
2651 /* Initialise the code for the GSM interface. */
2655 /* Now delete the requested entries. */
2657 for (count = start_message; count <= end_message; count ++) {
2659 message.Location = count;
2661 error = GSM->DeleteSMSMessage(&message);
2663 if (error == GE_NONE)
2664 fprintf(stdout, _("Deleted SMS %s %d\n"), memory_type_string, count);
2666 if (error == GE_NOTIMPLEMENTED) {
2667 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2671 fprintf(stdout, _("DeleteSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2680 static volatile bool bshutdown = false;
2682 /* SIGINT signal handler. */
2684 static void interrupted(int sig)
2687 signal(sig, SIG_IGN);
2694 /* In this mode we get the code from the keyboard and send it to the mobile
2697 int entersecuritycode(char *type)
2700 GSM_SecurityCode SecurityCode;
2702 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2703 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2704 else if (!strcmp(type,"PIN2"))SecurityCode.Type=GSCT_Pin2;
2705 else if (!strcmp(type,"PUK2"))SecurityCode.Type=GSCT_Puk2;
2707 // FIXME: Entering of SecurityCode does not work :-(
2708 // else if (!strcmp(type,"SecurityCode"))
2709 // SecurityCode.Type=GSCT_SecurityCode;
2712 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2717 printf("Enter your code: ");
2718 gets(SecurityCode.Code);
2720 strcpy(SecurityCode.Code,getpass(_("Enter your code: ")));
2725 test = GSM->EnterSecurityCode(SecurityCode);
2727 fprintf(stdout,_("Code OK !\n"));
2729 fprintf(stderr,_("%s\n"),print_error(test));
2736 int getsecuritycodestatus(void)
2743 if (GSM->GetSecurityCodeStatus(&Status) == GE_NONE) {
2745 fprintf(stdout, _("Security code status: "));
2748 case GSCT_SecurityCode:fprintf(stdout, _("waiting for Security Code.\n"));break;
2749 case GSCT_Pin: fprintf(stdout, _("waiting for PIN.\n")); break;
2750 case GSCT_Pin2: fprintf(stdout, _("waiting for PIN2.\n")); break;
2751 case GSCT_Puk: fprintf(stdout, _("waiting for PUK.\n")); break;
2752 case GSCT_Puk2: fprintf(stdout, _("waiting for PUK2.\n")); break;
2753 case GSCT_None: fprintf(stdout, _("nothing to enter.\n")); break;
2754 default: fprintf(stdout, _("Unknown!\n"));
2763 int getsecuritycode(char *type)
2766 GSM_SecurityCode SecurityCode;
2769 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2770 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2771 else if (!strcmp(type,"PIN2")) SecurityCode.Type=GSCT_Pin2;
2772 else if (!strcmp(type,"PUK2")) SecurityCode.Type=GSCT_Puk2;
2773 else if (!strcmp(type,"SecurityCode"))SecurityCode.Type=GSCT_SecurityCode;
2775 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2781 error=GSM->GetSecurityCode(&SecurityCode);
2784 case GE_INVALIDSECURITYCODE:
2785 fprintf(stdout, _("Error: getting "));
2786 switch (SecurityCode.Type) {
2787 case GSCT_SecurityCode:fprintf(stdout, _("security code"));break;
2788 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2789 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2790 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2791 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2794 fprintf(stdout, _(" not allowed\n"));
2797 switch (SecurityCode.Type) {
2798 case GSCT_SecurityCode:fprintf(stdout, _("Security code"));break;
2799 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2800 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2801 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2802 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2805 fprintf(stdout, _(" is %s\n"),SecurityCode.Code);
2808 fprintf(stderr, _("%s\n"),print_error(error));
2819 /* Voice dialing mode. */
2821 int dialvoice(char *Number)
2825 if (GSM->DialVoice(Number)!=GE_NONE) fprintf(stdout,_("Error!\n"));
2833 int cancelcall(void)
2837 if (GSM->CancelCall()!=GE_NONE) fprintf(stdout,_("Error!\n"));
2844 int savelogo(int argc, char *argv[])
2847 GSM_NetworkInfo NetworkInfo;
2848 GSM_MultiSMSMessage MultiSMS;
2850 /* Operator logos will be saved with this number */
2851 char oplogonumber[]={'O','p','L','o','g','o',
2852 '0','0','0','0','0', /* MMC+MNC */
2856 bool UnicodeText=false;
2858 /* The first argument is the type of the logo. */
2859 if (!strcmp(argv[0], "op")) {
2860 fprintf(stdout, _("Saving operator logo.\n"));
2861 } else if (!strcmp(argv[0], "caller")) {
2862 fprintf(stdout, _("Saving caller line identification logo.\n"));
2863 } else if (!strcmp(argv[0], "startup")) {
2864 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2866 } else if (!strcmp(argv[0], "7110startup")) {
2867 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2869 } else if (!strcmp(argv[0], "6210startup")) {
2870 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2872 } else if (!strcmp(argv[0], "7110op")) {
2873 fprintf(stderr, _("It isn't possible to save big operator logos!\n"));
2875 } else if (!strcmp(argv[0], "picture")) {
2876 fprintf(stderr, _("Saving picture image.\n"));
2877 } else if (!strcmp(argv[0], "screensaver")) {
2878 fprintf(stderr, _("Saving screen saver.\n"));
2880 fprintf(stderr, _("You should specify what kind of logo to save!\n"));
2884 /* The second argument is the bitmap file. */
2885 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return -1;
2887 /* Initialise the GSM interface. */
2890 /* We check optional parameters from 2'rd */
2893 if (!strcmp(argv[0], "op")) {
2894 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2896 /* The third argument, if present, is the Network code of the operator.
2897 * Network code is in this format: "xxx yy" */
2899 strcpy(bitmap.netcode, argv[2]);
2901 fprintf(stdout, _("Operator code: %s\n"), argv[2]);
2903 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
2904 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
2911 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
2913 bitmap.type=GSM_OperatorLogo;
2915 /* Put bitmap into SMS structure */
2916 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2918 oplogonumber[6]=bitmap.netcode[0];
2919 oplogonumber[7]=bitmap.netcode[1];
2920 oplogonumber[8]=bitmap.netcode[2];
2921 oplogonumber[9]=bitmap.netcode[4];
2922 oplogonumber[10]=bitmap.netcode[5];
2923 for(i=0;i<MultiSMS.number;i++)
2924 strcpy(MultiSMS.SMS[i].Destination,oplogonumber);
2926 if (!strcmp(argv[0], "caller")) {
2927 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2929 bitmap.type=GSM_CallerLogo;
2931 /* Put bitmap into SMS structure */
2932 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2934 for(i=0;i<MultiSMS.number;i++)
2935 strcpy(MultiSMS.SMS[i].Destination,"GroupLogo");
2937 if (!strcmp(argv[0], "screensaver")) {
2938 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2943 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2945 /* Put bitmap into SMS structure */
2946 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,true,UnicodeText);
2948 for(i=0;i<MultiSMS.number;i++)
2949 strcpy(MultiSMS.SMS[i].Destination,"ScreenSaver");
2951 if (!strcmp(argv[0], "picture")) {
2952 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2955 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2960 if (strlen(argv[2])>121) {
2961 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[2]);
2964 strcpy(bitmap.text,argv[2]);
2967 /* Put bitmap into SMS structure */
2968 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,UnicodeText);
2970 for(i=0;i<MultiSMS.number;i++)
2971 strcpy(MultiSMS.SMS[i].Destination,"Picture");
2974 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,true,false,false);
2979 /* The following function allows to send logos using SMS */
2980 int sendlogo(int argc, char *argv[])
2983 GSM_NetworkInfo NetworkInfo;
2984 GSM_MultiSMSMessage MultiSMS;
2988 bool UnicodeText=false;
2989 bool ScreenSaver=false;
2991 /* The first argument is the type of the logo. */
2992 if (!strcmp(argv[0], "op")) {
2993 fprintf(stdout, _("Sending operator logo.\n"));
2994 } else if (!strcmp(argv[0], "caller")) {
2995 fprintf(stdout, _("Sending caller line identification logo.\n"));
2996 } else if (!strcmp(argv[0], "picture")) {
2997 fprintf(stdout, _("Sending picture image.\n"));
2998 } else if (!strcmp(argv[0], "screensaver")) {
2999 fprintf(stdout, _("Sending screen saver.\n"));
3000 } else if (!strcmp(argv[0], "startup")) {
3001 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3003 } else if (!strcmp(argv[0], "7110startup")) {
3004 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3006 } else if (!strcmp(argv[0], "6210startup")) {
3007 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3009 } else if (!strcmp(argv[0], "7110op")) {
3010 fprintf(stderr, _("It isn't possible to send big operator logos!\n"));
3013 fprintf(stderr, _("You should specify what kind of logo to send!\n"));
3017 /* The third argument is the bitmap file. */
3018 if (GSM_ReadBitmapFileOnConsole(argv[2], &bitmap)!=GE_NONE) return -1;
3020 /* Initialise the GSM interface. */
3025 if (!strcmp(argv[0], "op")) {
3026 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3028 /* The third argument, if present, is the Network code of the operator.
3029 * Network code is in this format: "xxx yy" */
3031 strcpy(bitmap.netcode, argv[3]);
3033 fprintf(stdout, _("Operator code: %s\n"), argv[3]);
3035 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
3036 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3043 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3045 bitmap.type=GSM_OperatorLogo;
3047 if (!strcmp(argv[0], "caller")) {
3048 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3050 bitmap.type=GSM_CallerLogo;
3052 if (!strcmp(argv[0], "screensaver")) {
3053 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3058 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3062 if (!strcmp(argv[0], "picture")) {
3063 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3066 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3071 if (strlen(argv[3])>121) {
3072 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[3]);
3075 strcpy(bitmap.text,argv[3]);
3079 /* Put bitmap into SMS structure */
3080 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,ScreenSaver,UnicodeText);
3082 /* The second argument is the destination, ie the phone number of recipient. */
3083 for(i=0;i<MultiSMS.number;i++)
3084 strcpy(MultiSMS.SMS[i].Destination,argv[1]);
3086 GSM_SendMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,true,false,false);
3091 /* Getting logos. */
3093 int getlogo(int argc, char *argv[])
3099 bitmap.type=GSM_None;
3101 if (!strcmp(argv[0],"7110op"))
3102 bitmap.type=GSM_7110OperatorLogo;
3104 if (!strcmp(argv[0],"op"))
3105 bitmap.type=GSM_OperatorLogo;
3107 if (!strcmp(argv[0],"caller")) {
3108 /* There is caller group number missing in argument list. */
3111 if ((num<1)||(num>9)) num=1;
3118 bitmap.type=GSM_CallerLogo;
3121 if (!strcmp(argv[0],"picture")) {
3122 /* There is a number missing in argument list. */
3124 if (strlen(argv[2])==2) {
3125 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3136 bitmap.type=GSM_PictureImage;
3139 if (!strcmp(argv[0],"startup"))
3140 bitmap.type=GSM_StartupLogo;
3142 if (!strcmp(argv[0],"7110startup"))
3143 bitmap.type=GSM_7110StartupLogo;
3145 if (!strcmp(argv[0],"6210startup"))
3146 bitmap.type=GSM_6210StartupLogo;
3148 if (!strcmp(argv[0],"dealer"))
3149 bitmap.type=GSM_DealerNoteText;
3151 if (!strcmp(argv[0],"text"))
3152 bitmap.type=GSM_WelcomeNoteText;
3154 if (bitmap.type!=GSM_None) {
3158 fprintf(stdout, _("Getting Logo\n"));
3160 error=GSM->GetBitmap(&bitmap);
3167 if (bitmap.type==GSM_DealerNoteText) fprintf(stdout, _("Dealer welcome note "));
3168 if (bitmap.type==GSM_WelcomeNoteText) fprintf(stdout, _("Welcome note "));
3169 if (bitmap.type==GSM_DealerNoteText || bitmap.type==GSM_WelcomeNoteText)
3171 if (bitmap.text[0]!=0)
3173 fprintf(stdout, _("currently set to \"%s\"\n"), bitmap.text);
3175 fprintf(stdout, _("currently empty\n"));
3179 if (bitmap.width!=0)
3181 if (bitmap.type==GSM_OperatorLogo || bitmap.type==GSM_7110OperatorLogo)
3183 fprintf(stdout,"Operator logo for %s (%s) network got succesfully\n",bitmap.netcode,GSM_GetNetworkName(bitmap.netcode));
3185 if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_7110StartupLogo || bitmap.type==GSM_6210StartupLogo)
3187 fprintf(stdout,"Startup logo got successfully\n");
3189 if (bitmap.type==GSM_CallerLogo)
3191 fprintf(stdout,"Caller logo got successfully\n");
3193 if (bitmap.type==GSM_PictureImage)
3195 fprintf(stdout,"Picture Image got successfully");
3196 if (strcmp(bitmap.text,""))
3197 fprintf(stdout,_(", text \"%s\""),bitmap.text);
3198 if (strcmp(bitmap.Sender,""))
3199 fprintf(stdout,_(", sender \"%s\""),bitmap.Sender);
3200 fprintf(stdout,"\n");
3204 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
3208 fprintf(stdout,"Your phone doesn't have logo uploaded !\n");
3213 case GE_NOTIMPLEMENTED:
3214 fprintf(stderr, _("Function not implemented !\n"));
3216 case GE_NOTSUPPORTED:
3217 fprintf(stderr, _("This kind of logo is not supported !\n"));
3220 fprintf(stderr, _("Error getting logo (wrong location ?) !\n"));
3225 fprintf(stderr, _("What kind of logo do you want to get ?\n"));
3232 /* Setting logos. */
3234 int setlogo(int argc, char *argv[])
3237 GSM_Bitmap bitmap,oldbit;
3238 GSM_NetworkInfo NetworkInfo;
3249 if (!strcmp(argv[0],"text") || !strcmp(argv[0],"dealer"))
3251 if (!strcmp(argv[0],"text")) bitmap.type=GSM_WelcomeNoteText;
3252 else bitmap.type=GSM_DealerNoteText;
3253 bitmap.text[0]=0x00;
3254 if (argc>1) strncpy(bitmap.text,argv[1],255);
3257 if (!strcmp(argv[0],"op") || !strcmp(argv[0],"startup") || !strcmp(argv[0],"caller") ||
3258 !strcmp(argv[0],"7110op") || !strcmp(argv[0],"6210startup") || !strcmp(argv[0],"7110startup") ||
3259 !strcmp(argv[0],"picture"))
3263 if (!strcmp(argv[0],"startup"))
3265 bitmap.type=GSM_StartupLogo;
3268 bitmap.size=GSM_GetBitmapSize(&bitmap);
3270 if (num>=1 && num<=3) {
3273 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3278 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
3281 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3286 if (!strcmp(argv[0],"op"))
3288 if (bitmap.type!=GSM_OperatorLogo || argc<3)
3290 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3292 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
3295 strncpy(bitmap.netcode,argv[2],7);
3296 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3298 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3303 if (!strcmp(argv[0],"7110op"))
3305 if (bitmap.type!=GSM_7110OperatorLogo || argc<3)
3307 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3309 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
3312 strncpy(bitmap.netcode,argv[2],7);
3313 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3315 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3320 if (!strcmp(argv[0],"picture"))
3322 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3326 if (strlen(argv[2])==2) {
3327 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3337 strncpy(bitmap.text,argv[3],121);
3338 strcpy(bitmap.Sender,"\0");
3340 strncpy(bitmap.Sender,argv[4],GSM_MAX_SENDER_LENGTH);
3342 if (!strcmp(argv[0],"7110startup"))
3344 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
3346 if (!strcmp(argv[0],"6210startup"))
3348 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
3350 if (!strcmp(argv[0],"caller"))
3352 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3356 if ((num<0)||(num>9)) num=0;
3362 oldbit.type=GSM_CallerLogo;
3363 oldbit.number=bitmap.number;
3364 if (GSM->GetBitmap(&oldbit)==GE_NONE)
3366 /* We have to get the old name and ringtone!! */
3367 bitmap.ringtone=oldbit.ringtone;
3368 strncpy(bitmap.text,oldbit.text,255);
3370 if (argc>3) strncpy(bitmap.text,argv[3],255);
3372 fprintf(stdout, _("Setting Logo.\n"));
3375 /* FIX ME: is it possible to permanently remove op logo ? */
3376 if (!strcmp(argv[0],"op"))
3378 bitmap.type=GSM_OperatorLogo;
3379 strncpy(bitmap.netcode,"000 00",7);
3382 bitmap.size=GSM_GetBitmapSize(&bitmap);
3383 GSM_ClearBitmap(&bitmap);
3385 if (!strcmp(argv[0],"7110op"))
3387 bitmap.type=GSM_7110OperatorLogo;
3388 strncpy(bitmap.netcode,"000 00",7);
3391 bitmap.size=GSM_GetBitmapSize(&bitmap);
3392 GSM_ClearBitmap(&bitmap);
3394 /* FIX ME: how to remove startup and group logos ? */
3395 fprintf(stdout, _("Removing Logo.\n"));
3399 fprintf(stderr, _("What kind of logo do you want to set ?\n"));
3405 while (GSM->GetModel(model) != GE_NONE)
3408 /* For Nokia 6110/6130/6150 we use different method of uploading.
3409 Phone will display menu, when received it */
3410 if (!strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") || !strcmp(model,"NSM-1"))
3412 if (!strcmp(argv[0],"caller") && argc<3)
3414 if (!strcmp(argv[0],"op") && argc<3)
3418 error=GSM->SetBitmap(&bitmap);
3422 case GE_NONE: oldbit.type=bitmap.type;
3423 oldbit.number=bitmap.number;
3424 if (GSM->GetBitmap(&oldbit)==GE_NONE) {
3425 if (bitmap.type==GSM_WelcomeNoteText ||
3426 bitmap.type==GSM_DealerNoteText) {
3427 if (strcmp(bitmap.text,oldbit.text)) {
3428 fprintf(stderr, _("Error setting"));
3429 if (bitmap.type==GSM_DealerNoteText) fprintf(stderr, _(" dealer"));
3430 fprintf(stderr, _(" welcome note - "));
3432 /* I know, it looks horrible, but... */
3433 /* I set it to the short string - if it won't be set */
3434 /* it means, PIN is required. If it will be correct, previous */
3435 /* (user) text was too long */
3437 /* Without it, I could have such thing: */
3438 /* user set text to very short string (for example, "Marcin") */
3439 /* then enable phone without PIN and try to set it to the very long (too long for phone) */
3440 /* string (which start with "Marcin"). If we compare them as only length different, we could think, */
3441 /* that phone accepts strings 6 chars length only (length of "Marcin") */
3442 /* When we make it correct, we don't have this mistake */
3444 strcpy(oldbit.text,"!\0");
3445 GSM->SetBitmap(&oldbit);
3446 GSM->GetBitmap(&oldbit);
3447 if (oldbit.text[0]!='!') {
3448 fprintf(stderr, _("SIM card and PIN is required\n"));
3450 GSM->SetBitmap(&bitmap);
3451 GSM->GetBitmap(&oldbit);
3452 fprintf(stderr, _("too long, truncated to \"%s\" (length %i)\n"),oldbit.text,strlen(oldbit.text));
3457 if (bitmap.type==GSM_StartupLogo) {
3458 for (i=0;i<oldbit.size;i++) {
3459 if (oldbit.bitmap[i]!=bitmap.bitmap[i]) {
3460 fprintf(stderr, _("Error setting startup logo - SIM card and PIN is required\n"));
3468 if (ok) fprintf(stdout, _("Done.\n"));
3470 case GE_NOTIMPLEMENTED:fprintf(stderr, _("Function not implemented.\n"));
3472 case GE_NOTSUPPORTED:fprintf(stderr, _("This kind of logo is not supported.\n"));
3474 default:fprintf(stderr, _("Error (wrong location ?) !\n"));
3483 /* Calendar notes receiving. */
3485 int getcalendarnote(int argc, char *argv[])
3487 GSM_CalendarNote CalendarNote;
3488 GSM_NotesInfo NotesInfo;
3494 bool was_note=false;
3495 char z_text[MAX_CALENDAR_TEXT_LENGTH+11];
3497 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
3505 now=localtime(&nowh);
3507 Date.Year = now->tm_year;
3509 /* I have 100 (for 2000) Year now :-) */
3510 if (Date.Year>99 && Date.Year<1900) {
3511 Date.Year=Date.Year+1900;
3514 start=atoi(argv[0]);
3519 if (!strcmp(argv[argc-1],"-v10")) {
3522 if (!strcmp(argv[argc-1],"-v30")) {
3531 if (!strcmp(argv[argc-1],"-v10")) {
3534 if (!strcmp(argv[argc-1],"-v30")) {
3546 while (GSM->GetModel(model) != GE_NONE)
3549 if (!strcmp(argv[0],"-s") || !strcmp(argv[0],"--short"))
3551 else if (!isdigit(argv[0][0])) {
3556 error=GSM->GetCalendarNotesInfo(&NotesInfo);
3557 if ( error == GE_NONE ) {
3558 if( NotesInfo.HowMany == 0 ) {
3559 fprintf(stderr, _("Sorry! No Calendar Notes present on phone.\n"));
3560 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3563 fprintf(stdout, _(" CALENDAR NOTES INFO \n"));
3564 fprintf(stdout, _("---------------------\n"));
3565 fprintf(stdout, _("How Many Locations :%d\n"), NotesInfo.HowMany);
3567 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3568 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3569 fprintf(stdout, _("Locations are :\n"));
3570 for(i=0;i<NotesInfo.HowMany;i++)
3571 fprintf(stdout, _("%4d) %4d\n"), i+1, NotesInfo.Location[i]);
3575 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3576 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3577 fprintf(stderr, _("Can't read Notes Infos from phone.\n"));
3578 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3582 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) {
3584 NotesInfo.HowMany=200;
3585 for (i=0;i<200;i++) {
3586 NotesInfo.Location[i]=i+1;
3590 if( vInfo && stop!=(-1) && error==GE_NONE )
3592 /* Info datas (for 7110 and comp.) */
3593 fprintf(stdout, _(" CALENDAR NOTES SUMMARY INFORMATION \n"));
3594 fprintf(stdout, _(" ==================================\n"));
3595 if (GetModelFeature (FN_CALENDAR)==F_CAL71) {
3596 fprintf(stdout, _("Calendar notes present on phone: %d\n"), NotesInfo.HowMany);
3597 fprintf(stdout, _("Locations are :\n"));
3599 fprintf(stdout, "----------------------------------------------------------------------------\n");
3600 fprintf(stdout,_(" Loc Phys Type Summary description Dt start Alarm Recurs\n") );
3601 fprintf(stdout, "----------------------------------------------------------------------------\n");
3603 for(i=0;i<NotesInfo.HowMany;i++)
3605 /* very short format ... */
3607 fprintf(stdout, _("%4d) %4d\n"), i, NotesInfo.Location[i]);
3609 CalendarNote.Location=i+1;
3610 CalendarNote.ReadNotesInfo=false;
3612 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3615 switch (CalendarNote.Type) {
3616 case GCN_REMINDER:strcpy(z_type, "REMIND"); break;
3617 case GCN_CALL: strcpy(z_type, "CALL"); break;
3618 case GCN_MEETING: strcpy(z_type, "MEETING"); break;
3619 case GCN_BIRTHDAY:strcpy(z_type, "BDAY"); break;
3620 default: strcpy(z_type, "UNKNOWN"); break;
3623 if( CalendarNote.Recurrance ) {
3624 sprintf( z_recur,"%d ", CalendarNote.Recurrance/24 );
3625 strcat( z_recur, CalendarNote.Recurrance == 1 ? "day" : "days" );
3628 strcpy( z_recur, "No" );
3632 if( CalendarNote.Type == GCN_CALL )
3633 sprintf(z_text, "\"%s\"", CalendarNote.Phone );
3635 if (CalendarNote.Text[0]!=0)
3636 sprintf(z_text, "\"%s\"", CalendarNote.Text );
3638 if(CalendarNote.Type == GCN_BIRTHDAY) {
3640 i_age = Date.Year - CalendarNote.Time.Year;
3641 sprintf(z_text, "\"%s (%d %s)\"", CalendarNote.Text,
3642 i_age, (i_age==1)?"year":"years");
3643 strcpy( z_recur, "-" );
3644 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3646 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3647 i+1,NotesInfo.Location[i], z_type, z_text,
3648 CalendarNote.Time.Year,
3649 CalendarNote.Time.Month,
3650 CalendarNote.Time.Day,
3651 (CalendarNote.AlarmType==0x00) ? "Tone " : "Silent",
3655 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3656 i+1,NotesInfo.Location[i], z_type, z_text,
3657 CalendarNote.Time.Year,
3658 CalendarNote.Time.Month,
3659 CalendarNote.Time.Day,
3660 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3663 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
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 ",
3674 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s\n"),
3675 i+1,NotesInfo.Location[i], z_type, z_text,
3676 CalendarNote.Time.Year,
3677 CalendarNote.Time.Month,
3678 CalendarNote.Time.Day,
3679 (CalendarNote.Alarm.Year) ? "Yes" : "No ");
3681 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) break;
3686 for (i=start;i<=stop;i++) {
3687 if (error==GE_NONE) {
3688 if( i>NotesInfo.HowMany ) {
3689 fprintf(stderr, _("Only %d Calendar Notes present on phone!\n"),NotesInfo.HowMany);
3693 fprintf(stderr, _("Calendar Notes location can't be zero... skipping.\n"));
3698 CalendarNote.Location=i;
3699 CalendarNote.ReadNotesInfo=false;
3701 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3705 fprintf(stdout, GSM_GetVCALENDARStart(vCalVer));
3709 fprintf(stdout, GSM_GetVCALENDARNote(&CalendarNote,vCalVer));
3711 } else { /* not vCal */
3714 fprintf(stdout, "\n");
3719 fprintf(stdout, _(" Type of the note: "));
3721 switch (CalendarNote.Type) {
3723 case GCN_REMINDER:fprintf(stdout, _("Reminder\n"));break;
3724 case GCN_CALL :fprintf(stdout, _("Call\n")); break;
3725 case GCN_MEETING :fprintf(stdout, _("Meeting\n")); break;
3726 case GCN_BIRTHDAY:fprintf(stdout, _("Birthday\n"));break;
3727 default: fprintf(stdout, _("Unknown\n"));
3731 /* For 3310: set date to 2090! */
3732 if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
3733 fprintf(stdout, _(" Date: xxxx-%02d-%02d\n"), CalendarNote.Time.Month,
3734 CalendarNote.Time.Day);
3736 fprintf(stdout, _(" Date: %s %d-%02d-%02d\n"),
3737 DayOfWeek(CalendarNote.Time.Year, CalendarNote.Time.Month, CalendarNote.Time.Day),
3738 CalendarNote.Time.Year,
3739 CalendarNote.Time.Month,
3740 CalendarNote.Time.Day);
3743 fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CalendarNote.Time.Hour,
3744 CalendarNote.Time.Minute,
3745 CalendarNote.Time.Second);
3747 if (CalendarNote.Alarm.Year!=0) {
3748 fprintf(stdout, _(" Alarm date: %s %d-%02d-%02d\n"),
3749 DayOfWeek(CalendarNote.Alarm.Year, CalendarNote.Alarm.Month, CalendarNote.Alarm.Day),
3750 CalendarNote.Alarm.Year,
3751 CalendarNote.Alarm.Month,
3752 CalendarNote.Alarm.Day);
3754 fprintf(stdout, _(" Alarm time: %02d:%02d:%02d\n"), CalendarNote.Alarm.Hour,
3755 CalendarNote.Alarm.Minute,
3756 CalendarNote.Alarm.Second);
3757 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 )
3758 fprintf(stdout, _(" Alarm type: %s\n"), (CalendarNote.AlarmType==0x00) ?
3759 "With Tone" : "Silent" );
3762 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && CalendarNote.Recurrance!= 0 )
3763 fprintf(stdout, " It repeat every %d day%s\n", CalendarNote.Recurrance/24,
3764 ((CalendarNote.Recurrance/24)>1) ? "s":"" );
3766 if (CalendarNote.Type == GCN_BIRTHDAY)
3769 i_age = Date.Year - CalendarNote.Time.Year;
3770 fprintf(stdout, _(" Text: %s (%d %s)\n"), CalendarNote.Text,
3771 i_age, (i_age==1)?"year":"years");
3773 if (CalendarNote.Text[0]!=0)
3774 fprintf(stdout, _(" Text: %s\n"), CalendarNote.Text);
3777 if (CalendarNote.Type == GCN_CALL)
3778 fprintf(stdout, _(" Phone: %s\n"), CalendarNote.Phone);
3781 fprintf(stderr, _("The calendar note %i can not be read\n"),i);
3785 if (was_note && vCalVer!=0) {
3786 fprintf(stdout, GSM_GetVCALENDAREnd(vCalVer));
3794 /* Writing calendar notes. */
3796 int writecalendarnote(char *argv[])
3798 GSM_CalendarNote CalendarNote;
3802 number=atoi(argv[1]);
3805 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
3809 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
3812 case GE_CANTOPENFILE:
3813 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
3816 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
3819 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
3825 /* Error 22=Calendar full ;-) */
3827 error=GSM->WriteCalendarNote(&CalendarNote);
3830 fprintf(stdout, _("Succesfully written!\n"));break;
3832 fprintf(stdout, _("Too long text in calendar note!\n"));break;
3834 fprintf(stdout, _("Failed to write calendar note!\n"));break;
3842 /* Calendar note deleting. */
3844 int deletecalendarnote(char *Index)
3847 GSM_CalendarNote CalendarNote;
3849 CalendarNote.Location=atoi(Index);
3853 if (GSM->DeleteCalendarNote(&CalendarNote) == GE_NONE) {
3854 fprintf(stdout, _(" Calendar note deleted.\n"));
3857 fprintf(stderr, _("The calendar note can not be deleted\n"));
3868 /* Setting the date and time. */
3870 int setdatetime(int argc, char *argv[])
3879 now=localtime(&nowh);
3881 Date.Year = now->tm_year;
3882 Date.Month = now->tm_mon+1;
3883 Date.Day = now->tm_mday;
3884 Date.Hour = now->tm_hour;
3885 Date.Minute = now->tm_min;
3886 Date.Second = now->tm_sec;
3888 if (argc>0) Date.Year = atoi (argv[0]);
3889 if (argc>1) Date.Month = atoi (argv[1]);
3890 if (argc>2) Date.Day = atoi (argv[2]);
3891 if (argc>3) Date.Hour = atoi (argv[3]);
3892 if (argc>4) Date.Minute = atoi (argv[4]);
3897 /* Well, this thing is copyrighted in U.S. This technique is known as
3898 Windowing and you can read something about it in LinuxWeekly News:
3899 http://lwn.net/1999/features/Windowing.phtml. This thing is beeing
3900 written in Czech republic and Poland where algorithms are not allowed
3904 Date.Year = Date.Year+1900;
3906 Date.Year = Date.Year+2000;
3909 /* FIXME: Error checking should be here. */
3910 GSM->SetDateTime(&Date);
3917 /* In this mode we receive the date and time from mobile phone. */
3919 int getdatetime(void) {
3921 GSM_DateTime date_time;
3925 if (GSM->GetDateTime(&date_time)==GE_NONE) {
3926 if (date_time.IsSet) {
3927 fprintf(stdout, _("Date: %s %4d/%02d/%02d\n"),
3928 DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
3929 date_time.Year, date_time.Month, date_time.Day);
3930 fprintf(stdout, _("Time: %02d:%02d:%02d\n"), date_time.Hour, date_time.Minute, date_time.Second);
3932 fprintf(stdout, _("Date and time not set in phone\n"));
3935 fprintf(stdout,_("Error!\n"));
3943 /* Setting the alarm. */
3945 int setalarm(char *argv[])
3952 Date.Hour = atoi(argv[0]);
3953 Date.Minute = atoi(argv[1]);
3955 GSM->SetAlarm(1, &Date);
3962 /* Getting the alarm. */
3964 int getalarm(void) {
3966 GSM_DateTime date_time;
3970 if (GSM->GetAlarm(0, &date_time)==GE_NONE) {
3971 fprintf(stdout, _("Alarm: %s\n"), (date_time.IsSet)?"on":"off");
3972 fprintf(stdout, _("Time: %02d:%02d\n"), date_time.Hour, date_time.Minute);
3974 fprintf(stdout,_("Error!\n"));
3982 /* In monitor mode we don't do much, we just initialise the fbus code.
3983 Note that the fbus code no longer has an internal monitor mode switch,
3984 instead compile with DEBUG enabled to get all the gumpf. */
3986 int monitormode(int argc, char *argv[])
3989 float rflevel=-1, batterylevel=-1;
3990 unsigned char loop=1;
3992 GSM_PowerSource powersource=-1;
3993 GSM_RFUnits rf_units = GRF_Arbitrary;
3994 GSM_BatteryUnits batt_units = GBU_Arbitrary;
3996 GSM_NetworkInfo NetworkInfo;
3997 GSM_CBMessage CBMessage;
3999 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
4000 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
4001 GSM_MemoryStatus DC_MemoryStatus = {GMT_DC, 0, 0};
4002 GSM_MemoryStatus EN_MemoryStatus = {GMT_EN, 0, 0};
4003 GSM_MemoryStatus FD_MemoryStatus = {GMT_FD, 0, 0};
4004 GSM_MemoryStatus LD_MemoryStatus = {GMT_LD, 0, 0};
4005 GSM_MemoryStatus MC_MemoryStatus = {GMT_MC, 0, 0};
4006 GSM_MemoryStatus ON_MemoryStatus = {GMT_ON, 0, 0};
4007 GSM_MemoryStatus RC_MemoryStatus = {GMT_RC, 0, 0};
4009 GSM_SMSStatus SMSStatus = {0, 0};
4013 /* evaluate for presence of "-noloop" argument in parameter */
4016 if( strcmp(argv[0],"-noloop" ) && strcmp(argv[0],"-nl" ))
4025 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
4028 signal(SIGINT, interrupted);
4030 fprintf (stderr, _("Entering monitor mode...\n"));
4031 fprintf (stderr, _("Initialising GSM interface...\n"));
4033 /* Initialise the code for the GSM interface. */
4038 GSM->EnableCellBroadcast();
4040 /* Loop here indefinitely - allows you to see messages from GSM code in
4041 response to unknown messages etc. The loops ends after pressing the
4043 while (!bshutdown) {
4044 if (GSM->GetRFLevel(&rf_units, &rflevel) == GE_NONE)
4045 fprintf(stdout, _("RFLevel: %d\n"), (int)rflevel);
4047 if (GSM->GetBatteryLevel(&batt_units, &batterylevel) == GE_NONE)
4048 fprintf(stdout, _("Battery: %d\n"), (int)batterylevel);
4050 if (GSM->GetPowerSource(&powersource) == GE_NONE)
4051 fprintf(stdout, _("Power Source: %s\n"), (powersource==GPS_ACDC)?_("AC/DC"):_("battery"));
4053 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE)
4054 fprintf(stdout, _("SIM: Used %d, Free %d\n"), SIMMemoryStatus.Used, SIMMemoryStatus.Free);
4056 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE)
4057 fprintf(stdout, _("Phone: Used %d, Free %d\n"), PhoneMemoryStatus.Used, PhoneMemoryStatus.Free);
4059 if (GSM->GetMemoryStatus(&DC_MemoryStatus) == GE_NONE)
4060 fprintf(stdout, _("DC: Used %d, Free %d\n"), DC_MemoryStatus.Used, DC_MemoryStatus.Free);
4062 if (GSM->GetMemoryStatus(&EN_MemoryStatus) == GE_NONE)
4063 fprintf(stdout, _("EN: Used %d, Free %d\n"), EN_MemoryStatus.Used, EN_MemoryStatus.Free);
4065 if (GSM->GetMemoryStatus(&FD_MemoryStatus) == GE_NONE)
4066 fprintf(stdout, _("FD: Used %d, Free %d\n"), FD_MemoryStatus.Used, FD_MemoryStatus.Free);
4068 if (GSM->GetMemoryStatus(&LD_MemoryStatus) == GE_NONE)
4069 fprintf(stdout, _("LD: Used %d, Free %d\n"), LD_MemoryStatus.Used, LD_MemoryStatus.Free);
4071 if (GSM->GetMemoryStatus(&MC_MemoryStatus) == GE_NONE)
4072 fprintf(stdout, _("MC: Used %d, Free %d\n"), MC_MemoryStatus.Used, MC_MemoryStatus.Free);
4074 if (GSM->GetMemoryStatus(&ON_MemoryStatus) == GE_NONE)
4075 fprintf(stdout, _("ON: Used %d, Free %d\n"), ON_MemoryStatus.Used, ON_MemoryStatus.Free);
4077 if (GSM->GetMemoryStatus(&RC_MemoryStatus) == GE_NONE)
4078 fprintf(stdout, _("RC: Used %d, Free %d\n"), RC_MemoryStatus.Used, RC_MemoryStatus.Free);
4080 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE)
4081 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"), SMSStatus.UnRead, SMSStatus.Number);
4083 if (GSM->GetIncomingCallNr(Number) == GE_NONE)
4084 fprintf(stdout, _("Incoming call: %s\n"), Number);
4086 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE)
4087 fprintf(stdout, _("Network: %s (%s), LAC: %s, CellID: %s\n"), GSM_GetNetworkName (NetworkInfo.NetworkCode), GSM_GetCountryName(NetworkInfo.NetworkCode), NetworkInfo.LAC, NetworkInfo.CellID);
4089 if (GSM->ReadCellBroadcast(&CBMessage) == GE_NONE)
4090 fprintf(stdout, _("Cell broadcast received on channel %d: %s\n"), CBMessage.Channel, CBMessage.Message);
4097 if( loop ) fprintf (stderr, _("Leaving monitor mode...\n"));
4104 /* Shows texts from phone's display */
4113 error=GSM->EnableDisplayOutput();
4115 if (error == GE_NONE)
4118 /* We do not want to see texts forever - press Ctrl+C to stop. */
4120 signal(SIGINT, interrupted);
4122 fprintf (stderr, _("Entering display monitoring mode...\n"));
4124 /* Loop here indefinitely - allows you to read texts from phone's
4125 display. The loops ends after pressing the Ctrl+C. */
4130 fprintf (stderr, _("Leaving display monitor mode...\n"));
4132 error=GSM->DisableDisplayOutput();
4134 fprintf (stderr, _("Error!\n"));
4136 fprintf (stderr, _("Error!\n"));
4143 /* Displays names of available ringtones */
4146 char model[64], rev[64];
4151 while (GSM->GetRevision(rev) != GE_NONE)
4154 while (GSM->GetModel(model) != GE_NONE)
4157 strncpy(rev,rev+2,5);
4159 PrepareRingingTones(model,rev);
4161 for (i=1;i<=NumberOfRingtones();i++)
4163 fprintf(stdout,_("%i. %s\n"),i,RingingToneName(0,i));
4172 /* Reads profile from phone and displays its' settings */
4174 int getprofile(int argc, char *argv[])
4179 GSM_Profile profile;
4182 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4183 char model[64], rev[64];
4185 /* Initialise the code for the GSM interface. */
4190 error=GSM->GetProfile(&profile);
4192 if (error == GE_NONE)
4195 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4197 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4199 strncpy(rev,rev+2,5);
4201 PrepareRingingTones(model,rev);
4203 switch(GetModelFeature (FN_PROFILES)) {
4204 case F_PROF33:max_profiles=6;break;
4205 case F_PROF51:max_profiles=3;break;
4206 default :max_profiles=7;break;
4211 profile.Number=atoi(argv[0])-1;
4212 start=profile.Number;
4215 if (profile.Number < 0)
4217 fprintf(stderr, _("Profile number must be value from 1 to %d!\n"), max_profiles);
4222 if (profile.Number >= max_profiles)
4224 fprintf(stderr, _("This phone supports only %d profiles!\n"), max_profiles);
4238 if (profile.Number!=0) GSM->GetProfile(&profile);
4240 printf("%d. \"%s\"", (profile.Number+1), profile.Name);
4241 if (profile.DefaultName==-1) printf(" (name defined)");
4245 printf("Incoming call alert: %d\n", profile.CallAlert);
4246 printf("Ringtone ID: %d\n", profile.Ringtone);
4247 printf("Ringing volume: %d\n", profile.Volume);
4248 printf("Message alert tone: %d\n", profile.MessageTone);
4249 printf("Keypad tones: %d\n", profile.KeypadTone);
4250 printf("Warning and game tones: %d\n", profile.WarningTone);
4251 printf("Lights: %d\n", profile.Lights);
4252 printf("Vibration: %d\n", profile.Vibration);
4253 printf("Caller groups: 0x%02x\n", profile.CallerGroups);
4254 printf("Automatic answer: %d\n", profile.AutomaticAnswer);
4255 printf("Screen saver: %d\n", profile.ScreenSaver);
4259 printf("Incoming call alert: %s\n", GetProfileCallAlertString(profile.CallAlert));
4261 /* For different phones different ringtones names */
4262 if (strcmp(RingingToneName(profile.Ringtone,0),""))
4263 printf(_("Ringing tone: %s (number %d in phone menu)\n"),
4264 RingingToneName(profile.Ringtone,0), RingingToneMenu(profile.Ringtone));
4266 printf(_("Ringtone number: %d\n"), profile.Ringtone);
4268 printf(_("Ringing volume: %s\n"), GetProfileVolumeString(profile.Volume));
4270 printf(_("Message alert tone: %s\n"), GetProfileMessageToneString(profile.MessageTone));
4272 printf(_("Keypad tones: %s\n"), GetProfileKeypadToneString(profile.KeypadTone));
4274 printf(_("Warning and game tones: %s\n"), GetProfileWarningToneString(profile.WarningTone));
4276 if (GetModelFeature (FN_SCREENSAVER)!=0)
4277 printf(_("Screen saver: %s\n"), GetProfileOnOffString(profile.ScreenSaver));
4279 printf(_("Vibration: %s\n"), GetProfileVibrationString(profile.Vibration));
4281 /* It has been nice to add here reading caller group name. ;^) */
4282 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
4283 printf(_("Caller groups: %s\n"),
4284 GetProfileCallerGroups(profile.CallerGroups) );
4286 /* FIXME: need make investigation for 3310 for these features. For now unknown */
4287 if (GetModelFeature (FN_PROFILES)!=F_PROF33) {
4288 /* FIXME: Light settings is only used for Car */
4289 if (profile.Number==(max_profiles-2)) printf(_("Lights: %s\n"), profile.Lights ? _("On") : _("Automatic"));
4291 /* FIXME: Automatic answer is only used for Car and Headset. */
4292 if (profile.Number>=(max_profiles-2)) printf(_("Automatic answer: %s\n"), GetProfileOnOffString(profile.AutomaticAnswer));
4300 if (error == GE_NOTIMPLEMENTED) {
4301 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4306 fprintf(stderr, _("Unspecified error\n"));
4318 /* Sets profile feature */
4320 int setprofile(int argc, char *argv[])
4323 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4324 char model[64], rev[64];
4327 GSM_Profile profile;
4328 GSM_Profile profile2, profile3;
4333 /* Initialise the code for the GSM interface. */
4339 error = GSM->GetProfile(&profile);
4341 if (error == GE_NONE)
4344 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4346 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4348 strncpy(rev,rev+2,5);
4350 PrepareRingingTones(model,rev);
4352 switch(GetModelFeature (FN_PROFILES)) {
4353 case F_PROF33:max_profiles=6;break;
4354 case F_PROF51:max_profiles=3;break;
4355 default :max_profiles=7;break;
4358 profile.Number=atoi (argv[0]);
4359 profile.Number=profile.Number-1;
4361 if (profile.Number < 0)
4363 fprintf(stderr, _("Profile number must be value from 1 to %i!\n"), max_profiles);
4368 if (profile.Number >= max_profiles)
4370 fprintf(stderr, _("This phone supports only %i profiles!\n"), max_profiles);
4375 if (profile.Number!=0) GSM->GetProfile(&profile);
4380 if (strcmp(argv[1], "callalert")==0)
4382 if (strcmp(argv[2], "ringing")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGING;correct_arg2=true;}
4383 if (strcmp(argv[2], "ascending")==0) {profile.CallAlert=PROFILE_CALLALERT_ASCENDING;correct_arg2=true;}
4384 if (strcmp(argv[2], "ringonce")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGONCE;correct_arg2=true;}
4385 if (strcmp(argv[2], "beeponce")==0) {profile.CallAlert=PROFILE_CALLALERT_BEEPONCE;correct_arg2=true;}
4386 if (strcmp(argv[2], "groups")==0)
4388 profile.CallAlert=PROFILE_CALLALERT_CALLERGROUPS;
4390 /*Ignored by N5110*/
4391 /*FIX ME: it's ignored by N5130 and 3210 too*/
4392 if (max_profiles==3) fprintf(stdout, _("Warning: value \"groups\" for profile feature \"callalert\" will be ignored in this phone model !\n"));
4394 if (strcmp(argv[2], "off")==0 || strcmp(argv[2], "0")==0) {profile.CallAlert=PROFILE_CALLALERT_OFF;correct_arg2=true;}
4397 fprintf(stderr, _("Correct parameters for profile feature \"callalert\" are ringing|ascending|ringonce|beeponce|groups|off|0 !\n"));
4403 if (strcmp(argv[1], "volume")==0)
4405 if (strcmp(argv[2], "1")==0) {profile.Volume=PROFILE_VOLUME_LEVEL1;correct_arg2=true;}
4406 if (strcmp(argv[2], "2")==0) {profile.Volume=PROFILE_VOLUME_LEVEL2;correct_arg2=true;}
4407 if (strcmp(argv[2], "3")==0) {profile.Volume=PROFILE_VOLUME_LEVEL3;correct_arg2=true;}
4408 if (strcmp(argv[2], "4")==0) {profile.Volume=PROFILE_VOLUME_LEVEL4;correct_arg2=true;}
4409 if (strcmp(argv[2], "5")==0) {profile.Volume=PROFILE_VOLUME_LEVEL5;correct_arg2=true;}
4412 fprintf(stderr, _("Correct parameters for profile feature \"volume\" are 0|1|2|3|4|5 !\n"));
4418 if (strcmp(argv[1], "keypad")==0 || strcmp(argv[1], "keypadtone")==0)
4420 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.KeypadTone=PROFILE_KEYPAD_OFF;correct_arg2=true;}
4421 if (strcmp(argv[2], "1")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL1;correct_arg2=true;}
4422 if (strcmp(argv[2], "2")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL2;correct_arg2=true;}
4423 if (strcmp(argv[2], "3")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL3;correct_arg2=true;}
4426 fprintf(stderr, _("Correct parameters for profile feature \"keypad|keypadtone\" are off|0|1|2|3 !\n"));
4432 if (strcmp(argv[1], "messagetone")==0 || strcmp(argv[1], "smstone")==0 || strcmp(argv[1], "sms")==0 || strcmp(argv[1], "message")==0)
4434 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.MessageTone=PROFILE_MESSAGE_NOTONE;correct_arg2=true;}
4435 if (strcmp(argv[2], "standard")==0) {profile.MessageTone=PROFILE_MESSAGE_STANDARD;correct_arg2=true;}
4436 if (strcmp(argv[2], "special")==0) {profile.MessageTone=PROFILE_MESSAGE_SPECIAL;correct_arg2=true;}
4437 if (strcmp(argv[2], "beeponce")==0 || strcmp(argv[2], "once")==0) {profile.MessageTone=PROFILE_MESSAGE_BEEPONCE;correct_arg2=true;}
4438 if (strcmp(argv[2], "ascending")==0) {profile.MessageTone=PROFILE_MESSAGE_ASCENDING;correct_arg2=true;}
4441 fprintf(stderr, _("Correct parameters for profile feature \"messagetone|smstone|message|sms\" are 0|off|standard|special|beeponce|once|ascending !\n"));
4447 if (strcmp(argv[1], "warningtone")==0 || strcmp(argv[1], "warning")==0)
4449 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.WarningTone=PROFILE_WARNING_OFF;correct_arg2=true;}
4450 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.WarningTone=PROFILE_WARNING_ON;correct_arg2=true;}
4453 fprintf(stderr, _("Correct parameters for profile feature \"warningtone|warning\" are 0|off|1|on !\n"));
4459 if (strcmp(argv[1], "vibra")==0 || strcmp(argv[1], "vibration")==0)
4461 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Vibration=PROFILE_VIBRATION_OFF;correct_arg2=true;}
4462 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Vibration=PROFILE_VIBRATION_ON;correct_arg2=true;}
4465 fprintf(stderr, _("Correct parameters for profile feature \"vibration|vibra\" are 0|off|1|on !\n"));
4471 if (strcmp(argv[1], "lights")==0)
4473 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Lights=-1;correct_arg2=true;}
4474 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Lights=0;correct_arg2=true;}
4477 fprintf(stderr, _("Correct parameters for profile feature \"lights\" are 0|off|1|on !\n"));
4481 if (profile.Number!=(max_profiles-2))
4483 profile2.Number=max_profiles-2;
4484 if (GSM->GetProfile(&profile2)==GE_NONE)
4486 fprintf(stdout, _("Warning: \"Lights\" feature is ignored in this profile (only setting it for \"%s\" profile get some results) !\n"), profile2.Name);
4491 if (strcmp(argv[1], "answer")==0)
4493 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.AutomaticAnswer=-1;correct_arg2=true;}
4494 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.AutomaticAnswer=0;correct_arg2=true;}
4497 fprintf(stderr, _("Correct parameters for profile feature \"answer\" are 0|off|1|on !\n"));
4501 if (profile.Number<(max_profiles-2))
4503 profile2.Number=max_profiles-2;
4504 if (GSM->GetProfile(&profile2)==GE_NONE)
4506 profile3.Number=max_profiles-1;
4507 if (GSM->GetProfile(&profile3)==GE_NONE)
4509 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);
4515 if (strcmp(argv[1], "name")==0)
4517 strcpy(profile.Name,argv[2]);
4518 /*Ignored by N5110*/
4519 /*FIX ME: it's ignored by N5130 and 3210 too*/
4520 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change profile name !\n"));
4523 if (strcmp(argv[1], "ringtone")==0)
4525 profile.Ringtone=atoi(argv[2]);
4526 if (profile.Ringtone<1)
4528 /*With value 0 results are interesting in N5110, but can't be used for anything*/
4529 fprintf(stderr, _("Ringtone number must be higher than 0 !\n"));
4534 if (profile.Ringtone>NumberOfRingtones())
4536 fprintf(stderr, _("Ringtone number too high (max %i) !\n"),NumberOfRingtones());
4540 profile.Ringtone=RingingToneCode(profile.Ringtone);
4541 if (profile.Ringtone==0)
4543 fprintf(stderr, _("Warning: we don't know ringtones codes for this model ! Can you contact with gnokii authors to add it into source ?\n"));
4547 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"));
4551 if (strcmp(argv[1], "groups")==0)
4553 /*Ignored by N5110*/
4554 /*FIX ME: it's ignored by N5130 and 3210 too*/
4555 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change caller group name !\n"));
4556 profile.CallerGroups=atoi(argv[2]);
4562 fprintf(stderr, _("Correct profile feature names are callalert|volume|keypad|keypadtone|messagetone|smstone|message|sms|warningtone|warning|vibra|vibration|lights|answer|name|groups !\n"));
4567 GSM->SetProfile(&profile);
4570 if (error == GE_NOTIMPLEMENTED) {
4571 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4576 fprintf(stderr, _("Unspecified error\n"));
4588 /* Get requested range of memory storage entries and output to stdout in
4589 easy-to-parse format */
4591 int getmemory(int argc, char *argv[])
4594 GSM_PhonebookEntry entry;
4599 char memory_type_string[20];
4602 int i_used = 0, n_used=0;
4604 char *output_opt = NULL;
4606 char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
4607 bool formatdone=false;
4610 /* group names init */
4611 for(i=0;i<5;i++) az_group_name[i][0]='\0';
4613 /* Handle command line args that set type, start and end locations. */
4614 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
4616 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
4619 GetMemoryTypeString(memory_type_string, &entry.MemoryType);
4621 if (argv[argc-1][0] == '-')
4622 output_opt = argv[--argc];
4624 /* Do generic initialisation routine */
4628 while ((error = GSM->GetModel(buf)) != GE_NONE && i++ < 15)
4633 start_entry = atoi (argv[1]);
4634 end_entry = argc > 2 ? atoi( argv[2]) : start_entry;
4636 GSM_MemoryStatus stats = {entry.MemoryType, 0, 0};
4640 if (GSM->GetMemoryStatus( &stats) != GE_NONE) {
4641 fprintf( stderr, _("Error reading memory status.\n"));
4645 n_used = stats.Used;
4646 end_entry = stats.Used + stats.Free;
4650 /* Now retrieve the requested entries. */
4652 for (count = start_entry;
4653 count <= end_entry && (!do_all || i_used < n_used);
4656 entry.Location=count;
4658 error=GSM->GetMemoryLocation(&entry);
4662 if (entry.SubEntriesCount || strcmp( entry.Number, ""))
4666 if (output_opt && !strcmp( output_opt,"-v30")) {
4667 semicolon_pipe_substitution( &entry, 0 );
4668 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,30));
4671 if (output_opt && !strcmp(output_opt,"-v21")) {
4672 semicolon_pipe_substitution( &entry, 0 );
4673 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,21));
4676 if (output_opt && !strcmp(output_opt,"-v")) {
4677 semicolon_pipe_substitution( &entry, 0 );
4678 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,10));
4681 if (output_opt && !strcmp(output_opt,"-short")) {
4682 semicolon_pipe_substitution( &entry, 0 );
4683 fprintf(stdout, "%s;%s;%s;%d;%d;", entry.Name, entry.Number, memory_type_string, entry.Location, entry.Group);
4684 for( i = 0; i < entry.SubEntriesCount; i++ )
4686 if( entry.SubEntries[i].EntryType == GSM_Date )
4687 fprintf(stdout,_("%u;%u;%u;%02u.%02u.%04u;%02u:%02u:%02u;"),
4688 entry.SubEntries[i].EntryType,
4689 entry.SubEntries[i].NumberType,
4690 entry.SubEntries[i].BlockNumber,
4691 entry.SubEntries[i].data.Date.Day,
4692 entry.SubEntries[i].data.Date.Month,
4693 entry.SubEntries[i].data.Date.Year,
4694 entry.SubEntries[i].data.Date.Hour,
4695 entry.SubEntries[i].data.Date.Minute,
4696 entry.SubEntries[i].data.Date.Second );
4698 fprintf(stdout,_("%u;%u;%u;%s;"),
4699 entry.SubEntries[i].EntryType,
4700 entry.SubEntries[i].NumberType,
4701 entry.SubEntries[i].BlockNumber,
4702 entry.SubEntries[i].data.Number );
4704 fprintf(stdout,_("\n"));
4710 fprintf(stdout, "Memory %s, location %d\n",memory_type_string, entry.Location);
4712 // check if some info in subentries
4713 for( i = 0; i < entry.SubEntriesCount; i++ )
4714 if( entry.SubEntries[i].EntryType != GSM_Date &&
4715 strcmp(entry.SubEntries[i].data.Number,"") )
4718 if (strcmp(entry.Number,"") || i < entry.SubEntriesCount) {
4719 if (strcmp(entry.Name,"")) fprintf(stdout,_(" Name: %s\n"),entry.Name);
4720 if (strcmp(entry.Number,"")) fprintf(stdout,_(" Number: %s\n"),entry.Number);
4721 bitmap.type=GSM_CallerLogo;
4722 bitmap.number=entry.Group;
4723 strcpy(z_gtype,"unknown");
4724 if (entry.Group==5) strcpy(z_gtype,"No group");
4725 if (entry.Group<5 && entry.Group>=0) {
4726 if (!strcmp(az_group_name[entry.Group],"")) {
4727 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
4728 if (GSM->GetBitmap(&bitmap)==GE_NONE)
4729 strcpy( az_group_name[entry.Group], bitmap.text );
4731 if ((!strcmp(az_group_name[entry.Group],""))) {
4732 switch(entry.Group) {
4733 case 0:strcpy(az_group_name[entry.Group],"Family");break;
4734 case 1:strcpy(az_group_name[entry.Group],"VIP");break;
4735 case 2:strcpy(az_group_name[entry.Group],"Friends");break;
4736 case 3:strcpy(az_group_name[entry.Group],"Colleagues");break;
4737 case 4:strcpy(az_group_name[entry.Group],"Other");break;
4742 strcpy(z_gtype,az_group_name[entry.Group]);
4744 fprintf(stdout,_(" Group: %d (%s)\n"),entry.Group+1,z_gtype);
4745 for( i = 0; i < entry.SubEntriesCount; i++ )
4747 if( entry.SubEntries[i].EntryType == GSM_Date ) {
4748 fprintf(stdout, " Date and time: %s %02u.%02u.%04u %02u:%02u:%02u\n",
4749 DayOfWeek(entry.SubEntries[i].data.Date.Year,
4750 entry.SubEntries[i].data.Date.Month,
4751 entry.SubEntries[i].data.Date.Day),
4752 entry.SubEntries[i].data.Date.Day,
4753 entry.SubEntries[i].data.Date.Month,
4754 entry.SubEntries[i].data.Date.Year,
4755 entry.SubEntries[i].data.Date.Hour,
4756 entry.SubEntries[i].data.Date.Minute,
4757 entry.SubEntries[i].data.Date.Second);
4760 if( strcmp(entry.SubEntries[i].data.Number,"") ) {
4762 switch( entry.SubEntries[i].EntryType ) {
4764 switch( entry.SubEntries[i].NumberType ) {
4765 case GSM_General: strcpy(z_etype,"General "); break;
4766 case GSM_Home: strcpy(z_etype,"Home "); break;
4767 case GSM_Mobile: strcpy(z_etype,"Mobile "); break;
4768 case GSM_Work: strcpy(z_etype,"Work "); break;
4769 case GSM_Fax: strcpy(z_etype,"Fax "); break;
4770 default: strcpy(z_etype,""); break;
4772 strcat(z_etype,"Number"); break;
4774 strcpy(z_etype,"Note"); break;
4776 strcpy(z_etype,"Postal"); break;
4778 strcpy(z_etype,"E-Mail"); break;
4780 strcpy(z_etype,"unknown data"); break;
4783 fprintf(stdout,_(" ---> Subentry: %u\n"),i+1);
4784 fprintf(stdout,_(" Entry type: %u (%s)\n"),entry.SubEntries[i].EntryType,z_etype);
4785 fprintf(stdout,_(" Number type: %u\n"),entry.SubEntries[i].NumberType);
4786 fprintf(stdout,_(" Block Number: %u\n"),entry.SubEntries[i].BlockNumber);
4788 fprintf(stdout,_(" %s: %s\n"),z_etype,entry.SubEntries[i].data.Number);
4792 if ((entry.MemoryType==GMT_DC ||
4793 entry.MemoryType==GMT_RC ||
4794 entry.MemoryType==GMT_MC) && !wasdate)
4795 fprintf(stdout,_(" Date and time not available\n"));
4797 fprintf(stdout,_(" Location empty\n"));
4800 case GE_NOTIMPLEMENTED:
4801 fprintf( stderr, _("Function not implemented in %s model!\n"), model);
4804 case GE_INVALIDMEMORYTYPE:
4805 fprintf( stderr, _("Memory type %s not supported!\n"),
4806 memory_type_string);
4810 fprintf(stdout, _("%s|%d|Bad location or other error!(%d)\n"),
4811 memory_type_string, count, error);
4820 /* Read data from stdin, parse and write to phone. The parsing is relatively
4821 crude and doesn't allow for much variation from the stipulated format. */
4823 int writephonebook(int argc, char *args[])
4826 GSM_PhonebookEntry entry;
4828 char *memory_type_string;
4829 int line_count=0,current,i;
4832 char *Line, OLine[1024], BackLine[1024];
4835 /* Check argument */
4837 if (strcmp("-i", args[0])) {
4842 /* Initialise fbus code */
4848 /* Go through data from stdin. */
4850 while (GetLine(stdin, Line, sizeof(OLine))!=-1) {
4852 current=0;BackLine[current++]=Line[0];
4853 for (i=1;i<strlen(Line);i++) {
4854 if (Line[i-1]==';' && Line[i]==';') BackLine[current++]=' ';
4855 BackLine[current++]=Line[i];
4857 BackLine[current++]=0;
4859 strcpy(Line,BackLine);
4863 #if defined(__svr4__) || defined(__FreeBSD__)
4864 ptr=strtok(Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4867 ptr=strtok(NULL, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4869 ptr=strtok(NULL, ";");
4871 ptr=strsep(&Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4874 ptr=strsep(&Line, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4876 ptr=strsep(&Line, ";");
4880 fprintf(stderr, _("Format problem on line %d [%s] 1\n"), line_count, BackLine);
4885 if (!strncmp(ptr,"ME", 2))
4887 memory_type_string = "int";
4888 entry.MemoryType = GMT_ME;
4890 else if (!strncmp(ptr,"SM", 2))
4892 memory_type_string = "sim";
4893 entry.MemoryType = GMT_SM;
4897 fprintf(stderr, _("Format problem on line %d [%s] 2: %s\n"),
4898 line_count, BackLine,ptr);
4902 #if defined(__svr4__) || defined(__FreeBSD__)
4903 ptr=strtok(NULL, ";"); if (ptr) entry.Location=atoi(ptr);
4905 ptr=strtok(NULL, ";"); if (ptr) entry.Group=atoi(ptr);
4907 ptr=strsep(&Line, ";"); if (ptr) entry.Location=atoi(ptr);
4909 ptr=strsep(&Line, ";"); if (ptr) entry.Group=atoi(ptr);
4913 fprintf(stderr, _("Format problem on line %d [%s] 3\n"),
4914 line_count, BackLine);
4918 for( subentry = 0; ; subentry++ )
4920 #if defined(__svr4__) || defined(__FreeBSD__)
4921 ptr=strtok(NULL, ";");
4923 ptr=strsep(&Line, ";");
4925 if( ptr && *ptr != 0 )
4926 entry.SubEntries[subentry].EntryType=atoi(ptr);
4930 #if defined(__svr4__) || defined(__FreeBSD__)
4931 ptr=strtok(NULL, ";");
4933 ptr=strsep(&Line, ";");
4936 entry.SubEntries[subentry].NumberType=atoi(ptr);
4937 // Phone Numbers need to have a number type.
4938 if(!ptr && entry.SubEntries[subentry].EntryType == GSM_Number)
4940 fprintf(stderr, _("Missing phone number type on line %d"
4941 " entry %d [%s]\n"), line_count, subentry, BackLine);
4946 #if defined(__svr4__) || defined(__FreeBSD__)
4947 ptr=strtok(NULL, ";");
4949 ptr=strsep(&Line, ";");
4952 entry.SubEntries[subentry].BlockNumber=atoi(ptr);
4954 #if defined(__svr4__) || defined(__FreeBSD__)
4955 ptr=strtok(NULL, ";");
4957 ptr=strsep(&Line, ";");
4959 // 0x13 Date Type; it is only for Dailed Numbers, etc.
4960 // we don't store to this memories so it's an error to use it.
4961 if(!ptr || entry.SubEntries[subentry].EntryType == GSM_Date)
4963 fprintf(stderr, _("Is not a phone number on line %d entry %d [%s]\n"),
4964 line_count, subentry, BackLine);
4969 strcpy( entry.SubEntries[subentry].data.Number, ptr );
4972 entry.SubEntriesCount = subentry;
4975 /* This is to send other exports (like from 6110) to 7110 */
4976 if (!entry.SubEntriesCount) {
4977 entry.SubEntriesCount = 1;
4978 entry.SubEntries[subentry].EntryType = GSM_Number;
4979 entry.SubEntries[subentry].NumberType = GSM_General;
4980 entry.SubEntries[subentry].BlockNumber = 2;
4981 strcpy(entry.SubEntries[subentry].data.Number, entry.Number);
4987 GSM_PhonebookEntry tmp_entry;
4989 memcpy(&tmp_entry, &entry, sizeof(GSM_PhonebookEntry) );
4990 error = GSM->GetMemoryLocation(&tmp_entry);
4991 if (error == GE_NONE) {
4992 if (!tmp_entry.Empty) {
4995 FILE *input_flow; //for reading from console, even when input redir.
4997 input_flow = fopen(DEV_CONSOLE, "r");
5000 fprintf(stderr, _("Can't open \"%s\" for input !\n"),DEV_CONSOLE);
5004 fprintf(stderr, _("Location busy. "));
5005 while (confirm < 0) {
5006 fprintf(stderr, _("Overwrite? (yes/no) "));
5007 GetLine(input_flow, ans, 7);
5008 if (!strcmp(ans, "yes")) confirm = 1;
5009 else if (!strcmp(ans, "no")) confirm = 0;
5011 if (!confirm) continue;
5014 fprintf(stderr, _("Unknown error (%d)\n"), error);
5020 /* Do write and report success/failure. */
5021 semicolon_pipe_substitution( &entry, 1 );
5023 error = GSM->WritePhonebookLocation(&entry);
5025 if (error == GE_NONE)
5026 fprintf (stdout, _("Write Succeeded: memory type: %s, loc: %d, name: %s, number: %s\n"), memory_type_string, entry.Location, entry.Name, entry.Number);
5028 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);
5037 /* Getting speed dials. */
5039 int getspeeddial(char *Number) {
5041 GSM_SpeedDial entry;
5043 GSM_PhonebookEntry pbentry;
5045 entry.Number = atoi(Number);
5049 if (GSM->GetSpeedDial(&entry)==GE_NONE) {
5050 pbentry.Location=entry.Location;
5051 if (pbentry.Location==0) pbentry.Location=entry.Number;
5052 pbentry.MemoryType=entry.MemoryType;
5054 error=GSM->GetMemoryLocation(&pbentry);
5056 if (error == GE_NONE)
5058 fprintf(stdout, _("SpeedDial nr. %d: %d:%d (%s)\n"), entry.Number, entry.MemoryType, entry.Location,pbentry.Name);
5060 fprintf(stdout, _("Error\n"));
5062 fprintf(stdout, _("Error\n"));
5070 /* Setting speed dials. */
5072 int setspeeddial(char *argv[]) {
5074 GSM_SpeedDial entry;
5076 char *memory_type_string;
5078 /* Handle command line args that set type, start and end locations. */
5080 if (strcmp(argv[1], "ME") == 0) {
5081 entry.MemoryType = GMT_ME;
5082 memory_type_string = "ME";
5084 else if (strcmp(argv[1], "SM") == 0) {
5085 entry.MemoryType = GMT_SM;
5086 memory_type_string = "SM";
5089 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
5094 entry.Number = atoi(argv[0]);
5095 entry.Location = atoi(argv[2]);
5099 if (GSM->SetSpeedDial(&entry) == GE_NONE) {
5100 fprintf(stdout, _("Succesfully written!\n"));
5108 /* Getting the status of the display. */
5110 int getdisplaystatus()
5115 /* Initialise the code for the GSM interface. */
5119 if (GSM->GetDisplayStatus(&Status)==GE_NONE) {
5121 printf(_("Call in progress: %s\n"), Status & (1<<DS_Call_In_Progress)?_("on"):_("off"));
5122 printf(_("Unknown: %s\n"), Status & (1<<DS_Unknown)?_("on"):_("off"));
5123 printf(_("Unread SMS: %s\n"), Status & (1<<DS_Unread_SMS)?_("on"):_("off"));
5124 printf(_("Voice call: %s\n"), Status & (1<<DS_Voice_Call)?_("on"):_("off"));
5125 printf(_("Fax call active: %s\n"), Status & (1<<DS_Fax_Call)?_("on"):_("off"));
5126 printf(_("Data call active: %s\n"), Status & (1<<DS_Data_Call)?_("on"):_("off"));
5127 printf(_("Keyboard lock: %s\n"), Status & (1<<DS_Keyboard_Lock)?_("on"):_("off"));
5128 printf(_("SMS storage full: %s\n"), Status & (1<<DS_SMS_Storage_Full)?_("on"):_("off"));
5131 printf(_("Error\n"));
5139 int netmonitor(char *Mode)
5142 unsigned char mode=atoi(Mode);
5143 char Screen[NM_MAX_SCREEN_WIDTH];
5148 if (!strcmp(Mode,"reset")) mode=0xf0;
5149 else if (!strcmp(Mode,"off")) mode=0xf1;
5150 else if (!strcmp(Mode,"field"))mode=0xf2;
5151 else if (!strcmp(Mode,"devel"))mode=0xf3;
5152 else if (!strcmp(Mode,"next")) mode=0x00;
5155 for (i=0;i<NM_MAX_SCREEN_WIDTH;i++) Screen[i]=0;
5157 GSM->NetMonitor(mode, Screen);
5160 printf("%s\n", Screen);
5167 int identify( void )
5169 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
5170 char imei[64], model[64], rev[64], manufacturer[64];
5174 while (GSM->GetIMEI(imei) != GE_NONE) sleep(1);
5175 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
5176 while (GSM->GetModel(model) != GE_NONE) sleep(1);
5178 strcpy(manufacturer, "(unknown)");
5179 GSM->GetManufacturer(manufacturer);
5181 fprintf(stdout, _("IMEI: %s\n"), imei);
5182 fprintf(stdout, _("Model: %s %s (%s)\n"), manufacturer, GetModelName (model), model);
5183 fprintf(stdout, _("Revision: %s\n"), rev);
5190 int senddtmf(char *String)
5195 if (GSM->SendDTMF(String)!=GE_NONE) fprintf(stdout,_("Error!\n"));
5202 /* Resets the phone */
5203 int reset(int argc, char *argv[])
5206 unsigned char _type=0x03;
5211 if (!strcmp(argv[0],"soft")) _type = 0x03;
5213 /* Doesn't work with 5110 */
5214 if (!strcmp(argv[0],"hard")) _type = 0x04;
5217 fprintf(stderr, _("What kind of reset do you want (second parameter can be \"soft\" or \"hard\") ?\n"));
5231 /* This is a "convenience" function to allow quick test of new API stuff which
5232 doesn't warrant a "proper" command line function. */
5234 int foogle(char *argv[])
5236 /* Initialise the code for the GSM interface. */
5240 // Fill in what you would like to test here...
5251 /* Initialise the code for the GSM interface. */
5255 if (GSM->PhoneTests()!=GE_NONE) fprintf(stderr,_("Error\n"));
5262 /* pmon allows fbus code to run in a passive state - it doesn't worry about
5263 whether comms are established with the phone. A debugging/development
5270 GSM_ConnectionType connection=GCT_FBUS;
5272 /* Initialise the code for the GSM interface. */
5274 error = GSM_Initialise(model, Port, Initlength, connection, RLP_DisplayF96Frame, SynchronizeTime);
5276 if (error != GE_NONE) {
5277 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
5289 int setringtone(int argc, char *argv[])
5291 GSM_Ringtone ringtone;
5292 GSM_BinRingtone binringtone,binringtone2;
5296 int current=0; //number of packed notes or location
5301 /* If not binary ringtone */
5302 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone2)!=GE_NONE) {
5303 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5305 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5307 ringtone.location=1;
5308 if (argc>1) ringtone.location=atoi(argv[1]);
5310 ringtone.allnotesscale=false;
5312 /* Initialise the GSM interface. */
5315 while (GSM->GetModel(model) != GE_NONE)
5318 /* For Nokia 6110/6130/6150/6210 we use different method of uploading.
5319 Phone will display menu, when received it */
5320 if ( !strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") ||
5321 !strcmp(model,"NSM-1") || !strcmp(model,"NPE-3") ) {
5322 if (argc==1) ringtone.location=255;
5325 error=GSM->SetRingtone(&ringtone,¤t);
5327 if (current!=ringtone.NrNotes) {
5328 if (current>FB61_MAX_RINGTONE_NOTES) {
5329 fprintf(stderr,_("Warning: due to phone limitation"));
5331 fprintf(stderr,_("Warning: ringtone was too long to be saved into frame,"));
5333 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5337 fprintf(stdout, _("Set succeeded!\n"));
5339 fprintf(stdout, _("Setting failed\n"));
5341 } else { /* This IS binary ringtone */
5342 fprintf(stdout,_("Binary ringtone format\n"));
5345 binringtone.frame[current++]=0x00;
5346 binringtone.frame[current++]=0x00;
5347 binringtone.frame[current++]=0x0c;
5348 binringtone.frame[current++]=0x01;
5349 binringtone.frame[current++]=0x2c;
5352 memcpy(binringtone.frame+current,argv[2],strlen(argv[2]));
5353 current=current+strlen(argv[2]);
5357 while(binringtone2.frame[i]!=0x00) {
5358 if (i==binringtone.length) break;
5363 memcpy(binringtone.frame+current,binringtone2.frame+i,binringtone2.length-i);
5364 binringtone.length=binringtone2.length-i+current;
5367 memcpy(binringtone.frame+current,binringtone2.frame,binringtone2.length);
5368 binringtone.length=binringtone2.length;
5371 binringtone.location=1;
5372 if (argc>1) binringtone.location=atoi(argv[1]);
5374 /* Initialise the GSM interface. */
5377 error=GSM->SetBinRingtone(&binringtone);
5381 fprintf(stdout, _("Set succeeded!\n"));
5383 case GE_INVALIDRINGLOCATION:
5384 fprintf(stdout, _("Invalid location %i!\n"),binringtone.location);
5386 case GE_UNKNOWNMODEL:
5387 fprintf(stdout, _("Mygnokii doesn't know format for this model!\n"));
5389 case GE_NOTIMPLEMENTED:
5390 fprintf(stdout, _("Not implemented for this model!\n"));
5393 fprintf(stdout, _("Not supported by this model!\n"));
5403 int ringtoneconvert(int argc, char *argv[])
5405 GSM_Ringtone ringtone;
5407 if (!strcmp(argv[0],argv[1]))
5409 fprintf(stderr, _("Files can't have the same names !\n"));
5413 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5415 ringtone.allnotesscale=false;
5417 GSM_SaveRingtoneFileOnConsole(argv[1], &ringtone);
5422 int playringtone(int argc, char *argv[])
5424 GSM_Ringtone ringtone;
5426 GSM_BinRingtone binringtone;
5432 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
5433 int binary_notes[12] =
5434 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
5436 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone)!=GE_NONE) {
5437 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5439 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5441 /* Initialise the GSM interface. */
5444 fprintf(stdout,_("Playing \"%s\" (%i notes)\n"),ringtone.name,ringtone.NrNotes);
5446 GSM_PlayRingtoneOnConsole(&ringtone);
5450 fprintf(stdout,_("Binary ringtone format\n"));
5452 /* Initialise the GSM interface. */
5456 while (true) { //skipping name
5457 if (binringtone.frame[i]==0) break;
5463 if (binringtone.frame[i]!=j) {
5466 fprintf(stdout,_("Block in binary ringtone %i %i\n"),j,z);
5473 if (!isok && j>=114 && j<=125) {
5474 j=14*3+binary_notes[j-114];
5477 if (!isok && j>=126 && j<=137) {
5478 j=14*1+binary_notes[j-126];
5481 if (!isok && j>=138 && j<=149) {
5482 j=14*2+binary_notes[j-138];
5485 if (!isok && j>=150 && j<=161) {
5486 j=14*4+binary_notes[j-150];
5491 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
5494 Hz=GSM_GetFrequency(j);
5495 if (GSM->PlayTone(Hz,5)!=GE_NONE) fprintf(stdout,_("error during playing\n"));
5499 j=binringtone.frame[i];
5500 z=binringtone.frame[i+1];
5502 z=z+binringtone.frame[i+1];
5505 if (i>=binringtone.length) break;
5516 int composer(int argc, char *argv[])
5518 GSM_Ringtone ringtone;
5521 int oldnoteslen=4,nownoteslen,oldnoteslen2;
5522 int oldnotesscale=1,nownotesscale;
5523 bool firstnote=true;
5524 int DefNoteTempo=63;
5526 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5528 if (ringtone.NrNotes!=0)
5529 DefNoteTempo=ringtone.notes[0].tempo;
5531 fprintf(stdout,_("Ringtone \"%s\" (tempo = %i Beats Per Minute)\n\n"),ringtone.name,GSM_GetTempo(DefNoteTempo));
5533 for (i=0;i<ringtone.NrNotes;i++) {
5534 if (DefNoteTempo!=ringtone.notes[i].tempo) {
5535 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"));
5540 for (i=0;i<ringtone.NrNotes;i++) {
5543 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5553 if ((ringtone.NrNotes-i)>50)
5554 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);
5556 fprintf(stdout,_("This ringtone in Nokia Composer in phone should look: "));
5560 for (i=0;i<ringtone.NrNotes;i++) {
5563 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5569 switch (ringtone.notes[i].duration) {
5570 case 192:fprintf(stdout,_("1."));break; //192=128*1.5
5571 case 128:fprintf(stdout,_("1"));break;
5572 case 96 :fprintf(stdout,_("2."));break; //96=64*1.5
5573 case 64 :fprintf(stdout,_("2"));break;
5574 case 48 :fprintf(stdout,_("4."));break; //48=32*1.5
5575 case 32 :fprintf(stdout,_("4"));break;
5576 case 24 :fprintf(stdout,_("8."));break; //24=16*1.5
5577 case 16 :fprintf(stdout,_("8"));break;
5578 case 12 :fprintf(stdout,_("16."));break; //12=8*1.5
5579 case 8 :fprintf(stdout,_("16"));break;
5580 case 6 :fprintf(stdout,_("32."));break; //6=4*1.5
5581 case 4 :fprintf(stdout,_("32"));break;
5586 /* What note here ? */
5587 switch (GSM_GetNote(ringtone.notes[i].note)) {
5588 case Note_C :fprintf(stdout,_("c"));break;
5589 case Note_Cis:fprintf(stdout,_("#c"));break;
5590 case Note_D :fprintf(stdout,_("d"));break;
5591 case Note_Dis:fprintf(stdout,_("#d"));break;
5592 case Note_E :fprintf(stdout,_("e"));break;
5593 case Note_F :fprintf(stdout,_("f"));break;
5594 case Note_Fis:fprintf(stdout,_("#f"));break;
5595 case Note_G :fprintf(stdout,_("g"));break;
5596 case Note_Gis:fprintf(stdout,_("#g"));break;
5597 case Note_A :fprintf(stdout,_("a"));break;
5598 case Note_Ais:fprintf(stdout,_("#a"));break;
5599 case Note_H :fprintf(stdout,_("h"));break;
5600 default :fprintf(stdout,_("-"));unknown=true;break; //Pause ?
5604 fprintf(stdout,_("%i"),ringtone.notes[i].note/14);
5606 /* And separator before next note */
5607 if (i!=ringtone.NrNotes-1)
5608 fprintf(stdout,_(" "));
5614 fprintf(stdout,_("\n\nTo enter it please press: "));
5618 for (i=0;i<ringtone.NrNotes;i++) {
5621 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5629 /* What note here ? */
5630 switch (GSM_GetNote(ringtone.notes[i].note)) {
5631 case Note_C :fprintf(stdout,_("1"));break;
5632 case Note_Cis:fprintf(stdout,_("1"));break;
5633 case Note_D :fprintf(stdout,_("2"));break;
5634 case Note_Dis:fprintf(stdout,_("2"));break;
5635 case Note_E :fprintf(stdout,_("3"));break;
5636 case Note_F :fprintf(stdout,_("4"));break;
5637 case Note_Fis:fprintf(stdout,_("4"));break;
5638 case Note_G :fprintf(stdout,_("5"));break;
5639 case Note_Gis:fprintf(stdout,_("5"));break;
5640 case Note_A :fprintf(stdout,_("6"));break;
5641 case Note_Ais:fprintf(stdout,_("6"));break;
5642 case Note_H :fprintf(stdout,_("7"));break;
5643 default :fprintf(stdout,_("0"));unknown=true;break;
5646 switch (ringtone.notes[i].duration) {
5647 case 192:fprintf(stdout,_("(longer)"));break; //192=128*1.5
5648 case 96 :fprintf(stdout,_("(longer)"));break; //96=64*1.5
5649 case 48 :fprintf(stdout,_("(longer)"));break; //48=32*1.5
5650 case 24 :fprintf(stdout,_("(longer)"));break; //24=16*1.5
5651 case 12 :fprintf(stdout,_("(longer)"));break; //12=8*1.5
5652 case 6 :fprintf(stdout,_("(longer)"));break; //6=4*1.5
5656 /* What note here ? */
5657 switch (GSM_GetNote(ringtone.notes[i].note)) {
5658 case Note_Cis:fprintf(stdout,_("#"));break;
5659 case Note_Dis:fprintf(stdout,_("#"));break;
5660 case Note_Fis:fprintf(stdout,_("#"));break;
5661 case Note_Gis:fprintf(stdout,_("#"));break;
5662 case Note_Ais:fprintf(stdout,_("#"));break;
5668 nownotesscale=ringtone.notes[i].note/14;
5670 if (nownotesscale!=oldnotesscale) {
5671 switch (nownotesscale) {
5673 switch (oldnotesscale) {
5674 case 2:fprintf(stdout,_("**"));break;
5675 case 3:fprintf(stdout,_("*"));break;
5679 switch (oldnotesscale) {
5680 case 1:fprintf(stdout,_("*"));break;
5681 case 3:fprintf(stdout,_("**"));break;
5685 switch (oldnotesscale) {
5686 case 1:fprintf(stdout,_("**"));break;
5687 case 2:fprintf(stdout,_("*"));break;
5693 oldnotesscale=nownotesscale;
5697 oldnoteslen2=oldnoteslen;
5699 switch (ringtone.notes[i].duration) {
5700 case 192:nownoteslen=1;break; //192=128*1.5
5701 case 128:nownoteslen=1;break;
5702 case 96 :nownoteslen=2;break; //96=64*1.5
5703 case 64 :nownoteslen=2;break;
5704 case 48 :nownoteslen=4;break; //48=32*1.5
5705 case 32 :nownoteslen=4;break;
5706 case 24 :nownoteslen=8;break; //24=16*1.5
5707 case 16 :nownoteslen=8;break;
5708 case 12 :nownoteslen=16;break; //12=8*1.5
5709 case 8 :nownoteslen=16;break;
5710 case 6 :nownoteslen=32;break; //6=4*1.5
5711 case 4 :nownoteslen=32;break;
5714 if (nownoteslen>oldnoteslen) {
5715 while (oldnoteslen!=nownoteslen) {
5716 fprintf(stdout,_("8"));
5717 oldnoteslen=oldnoteslen*2;
5721 if (nownoteslen<oldnoteslen) {
5722 while (oldnoteslen!=nownoteslen) {
5723 fprintf(stdout,_("9"));
5724 oldnoteslen=oldnoteslen/2;
5728 if (GSM_GetNote(ringtone.notes[i].note)==Note_Pause)
5729 oldnoteslen=oldnoteslen2;
5731 /* And separator before next note */
5732 if (i!=ringtone.NrNotes-1)
5733 fprintf(stdout,_(" "));
5738 fprintf(stdout,_("\n"));
5744 int sendringtone(int argc, char *argv[])
5746 GSM_Ringtone ringtone;
5747 GSM_MultiSMSMessage SMS;
5749 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5751 if (GSM_ReadRingtoneFileOnConsole(argv[1], &ringtone)!=GE_NONE) return(-1);
5753 ringtone.allnotesscale=false;
5755 for (i=0;i<argc;i++) {
5756 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5757 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5760 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5762 if (current!=ringtone.NrNotes) {
5763 if (current>FB61_MAX_RINGTONE_NOTES) {
5764 fprintf(stderr,_("Warning: due to phone limitation"));
5766 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5768 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5771 for (i=0;i<SMS.number;i++) {
5772 strcpy(SMS.SMS[i].Destination,argv[0]);
5775 /* Initialise the GSM interface. */
5778 GSM_SendMultiPartSMSOnConsole(&SMS, 2,argc,argv,false,true,true);
5783 int saveringtone(int argc, char *argv[])
5785 GSM_Ringtone ringtone;
5786 GSM_MultiSMSMessage SMS;
5788 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5790 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5792 ringtone.allnotesscale=false;
5794 for (i=0;i<argc;i++) {
5795 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5796 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5799 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5801 if (current!=ringtone.NrNotes) {
5802 if (current>FB61_MAX_RINGTONE_NOTES) {
5803 fprintf(stderr,_("Warning: due to phone limitation"));
5805 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5807 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5810 for (i=0;i<SMS.number;i++) {
5811 /* Only 11 chars could be here */
5812 strncpy(SMS.SMS[i].Destination,ringtone.name,11);
5815 /* Initialise the GSM interface. */
5818 GSM_SaveMultiPartSMSOnConsole(&SMS,1,argc,argv,false,false,true,true);
5823 /* Converts logo files. */
5825 int bitmapconvert(int argc, char *argv[])
5828 GSM_NetworkInfo NetworkInfo;
5832 if (!strcmp(argv[0],argv[1]))
5834 fprintf(stderr, _("Files can't have the same names !\n"));
5838 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
5843 if (!strcmp(argv[2],"op"))
5846 if (argc<4) doit=true;
5847 if (argc<4 && bitmap.type!=GSM_OperatorLogo) doit=true;
5851 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5854 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
5857 strncpy(bitmap.netcode,argv[3],7);
5858 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5860 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5866 if (!strcmp(argv[2],"7110op"))
5869 if (argc<4) doit=true;
5870 if (argc<4 && bitmap.type!=GSM_7110OperatorLogo) doit=true;
5874 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5877 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
5880 strncpy(bitmap.netcode,argv[3],7);
5881 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5883 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5889 if (!strcmp(argv[2],"caller"))
5891 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
5895 if ((num<0)||(num>9)) num=0;
5903 if (!strcmp(argv[2],"startup"))
5905 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
5908 if (!strcmp(argv[2],"7110startup"))
5910 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
5913 if (!strcmp(argv[2],"6210startup"))
5915 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
5918 if (!strcmp(argv[2],"picture"))
5920 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
5925 fprintf(stderr,"Unknown type of logo: %s !\n",argv[2]);
5930 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
5935 int getphoneprofile()
5940 /* Initialise the GSM interface. */
5944 error=GSM->GetProductProfileSetting(&PPS);
5945 if (error!=GE_NONE) {
5946 fprintf(stdout,_("Error!\n"));
5950 fprintf(stdout,_("ALS : "));
5951 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5952 else fprintf(stdout,_("off\n"));
5954 PPS.Name=PPS_VibraMenu;
5955 GSM->GetProductProfileSetting(&PPS);
5956 fprintf(stdout,_("Vibra menu : "));
5957 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5958 else fprintf(stdout,_("off\n"));
5960 PPS.Name=PPS_GamesMenu;
5961 GSM->GetProductProfileSetting(&PPS);
5962 fprintf(stdout,_("Games menu : "));
5963 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5964 else fprintf(stdout,_("off\n"));
5966 PPS.Name=PPS_HRData;
5967 GSM->GetProductProfileSetting(&PPS);
5968 fprintf(stdout,_("HR Data : "));
5969 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5970 else fprintf(stdout,_("off\n"));
5972 PPS.Name=PPS_14400Data;
5973 GSM->GetProductProfileSetting(&PPS);
5974 fprintf(stdout,_("14400 Data : "));
5975 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5976 else fprintf(stdout,_("off\n"));
5978 PPS.Name=PPS_LCDContrast;
5979 GSM->GetProductProfileSetting(&PPS);
5980 fprintf(stdout,_("LCD Contrast : %i%%\n"),PPS.int_value);
5983 GSM->GetProductProfileSetting(&PPS);
5984 fprintf(stdout,_("EFR : "));
5985 switch (PPS.int_value) {
5986 case 0: fprintf(stdout,_("off\n")); break;
5987 case 1: fprintf(stdout,_("last\n")); break;
5988 case 2: fprintf(stdout,_("second\n"));break;
5989 case 3: fprintf(stdout,_("first\n")); break;
5993 GSM->GetProductProfileSetting(&PPS);
5994 fprintf(stdout,_("FR : "));
5995 switch (PPS.int_value) {
5996 case 0: fprintf(stdout,_("off\n")); break;
5997 case 1: fprintf(stdout,_("last\n")); break;
5998 case 2: fprintf(stdout,_("second\n"));break;
5999 case 3: fprintf(stdout,_("first\n")); break;
6003 GSM->GetProductProfileSetting(&PPS);
6004 fprintf(stdout,_("HR : "));
6005 switch (PPS.int_value) {
6006 case 0: fprintf(stdout,_("off\n")); break;
6007 case 1: fprintf(stdout,_("last\n")); break;
6008 case 2: fprintf(stdout,_("second\n"));break;
6009 case 3: fprintf(stdout,_("first\n")); break;
6018 int setphoneprofile(int argc, char *argv[])
6022 bool correct_arg1=false, correct_arg2=false;
6024 if (!strcmp(argv[0],"ALS")) {
6027 if (!strcmp(argv[1],"1")) {
6028 PPS.bool_value=true;
6031 if (!strcmp(argv[1],"0")) {
6032 PPS.bool_value=false;
6035 if (!correct_arg2) {
6036 fprintf(stdout,_("Settings for ALS parameter can be \"0\" or \"1\" !\n"));
6040 if (!strcmp(argv[0],"HRData")) {
6041 PPS.Name=PPS_HRData;
6043 if (!strcmp(argv[1],"1")) {
6044 PPS.bool_value=true;
6047 if (!strcmp(argv[1],"0")) {
6048 PPS.bool_value=false;
6051 if (!correct_arg2) {
6052 fprintf(stdout,_("Settings for HRData parameter can be \"0\" or \"1\" !\n"));
6056 if (!correct_arg1) {
6057 fprintf(stdout,_("First parameter can be \"ALS\" or \"HRData\" only !\n"));
6061 /* Initialise the GSM interface. */
6064 error=GSM->SetProductProfileSetting(&PPS);
6066 if (error!=GE_NONE) {
6067 fprintf(stdout,_("Error!\n"));
6080 int getoperatorname()
6083 GSM_Network network;
6085 /* Initialise the GSM interface. */
6088 if (GSM->GetOperatorName(&network)==GE_NONE)
6090 if (!strcmp(network.Name,"")) {
6091 fprintf(stdout,_("Phone doesn't have downloaded operator name\n"));
6093 fprintf(stdout,_("Phone has downloaded operator name (\"%s\") for \"%s\" (\"%s\") network\n"),
6094 network.Name,network.Code,GSM_GetNetworkName(network.Code));
6104 int setoperatorname(int argc, char *argv[])
6107 GSM_Network network;
6109 /* Initialise the GSM interface. */
6113 strncpy(network.Code,argv[0],7);
6114 strncpy(network.Name,argv[1],50);
6116 strcpy(network.Code,"000 00\0");
6117 strcpy(network.Name,"\0");
6120 if (GSM->SetOperatorName(&network)==GE_NONE) {
6121 if (GSM->GetOperatorName(&network)==GE_NONE) {
6122 if (!strcmp(network.Name,"")) {
6123 fprintf(stdout,_("Downloaded operator name is removed\n"));
6125 fprintf(stdout,_("Downloaded operator name changed for \"%s\" network (\"%s\") to \"%s\"\n"),
6126 network.Code,GSM_GetNetworkName(network.Code),network.Name);
6137 int getvoicemailbox()
6139 GSM_PhonebookEntry entry;
6141 /* Initialise the GSM interface. */
6144 if (GSM->GetVoiceMailbox(&entry)==GE_NONE) {
6145 fprintf(stdout,_("Voice mailbox number is "));
6146 if (!strcmp(entry.Number,""))
6147 fprintf(stdout,_("not set\n"));
6149 fprintf(stdout,_("\"%s\"\n"),entry.Number);
6158 ///////////////////////////////////////////////////////////////////////////////
6159 // flow diagram of netmonitordata():
6160 ///////////////////////////////////////////////////////////////////////////////
6162 // get command line argument
6166 // if specific phone model
6169 // identify-phone: (((((((( TO DO )))))))))))))
6173 // get_mon_param_info() get phone netmonitor parameters name
6174 // specifically to a 'model'
6177 // parse_check() check command line arguments
6178 // | if all OK, go on else stop.
6179 // | because we can have a input file
6180 // v containing multiple
6181 // parse_process() command lines, we process each at once
6182 // so we can exit early on errors.
6184 ///////////////////////////////////////////////////////////////////////////////
6186 // private functions, see netmonitordata()
6187 void free_nm_info(PARAM_INFO_MON *info)
6189 PARAM_INFO_MON *tmp; // pointer, iterator on info
6191 // go to end of list
6193 while (info->next != NULL)
6203 ///////////////////////////////////////////////////////////////////////////////
6204 // this func retrieve parameters info from a file
6205 // and load it in a dynamic array, NULL terminated,
6206 // if 2rd parameter is not NULL, it load also description of screen
6207 // return (PARAM_INFO_MON *start) if all is OK, else NULL
6208 ///////////////////////////////////////////////////////////////////////////////
6209 // start->->next->next->next-> ...->next->NULL
6212 // par0 par1 par2 parN
6213 ///////////////////////////////////////////////////////////////////////////////
6214 // this should be de-allocated from calling function,
6215 // also, screen_name should be deallocated from calling function
6216 ///////////////////////////////////////////////////////////////////////////////
6218 PARAM_INFO_MON *get_mon_param_info(char *f_name, char *screen_name[NM_MAX_SCREEN+1])
6220 PARAM_INFO_MON *start; // pointer to netmonitor parameters info
6221 PARAM_INFO_MON *info; // pointer, iterator on info
6222 PARAM_INFO_MON *check; // pointer, iterator on info, for check usage
6231 char tmp_mname[55]; // very larger, but if netmon bug ...
6232 int x, y, len, s, t; // x & y coord, len, screen nr, type
6235 if (screen_name != NULL)
6236 for (i = 0; i <= NM_MAX_SCREEN; i++)
6237 screen_name[i] = NULL;
6240 if ((f_info = fopen(f_name, "r")) == NULL)
6241 { fprintf(stderr, "Can' t open file parameter info: <%s>\n", f_name);
6245 if ((start = malloc(sizeof(PARAM_INFO_MON))) == NULL)
6246 { fprintf(stderr, "no mem\n");
6250 { start->next = NULL;
6254 while (fgets(buf, 256, f_info) != NULL)
6258 // Truncate from '#' at right of comments
6259 if ((tmp = strchr(param, '#')) != NULL)
6262 // Strip leading, trailing whitespace
6263 while(isspace((int) *param))
6266 while((strlen(param) > 0) && isspace((int) param[strlen(param) - 1]))
6267 param[strlen(param) - 1] = '\0';
6269 // Ignore blank lines
6270 if ((*param == '\n') || (*param == '\0'))
6275 fprintf(stderr, "%s: info line: <%s>\n", f_name, param);
6277 // check for param name
6278 if ((param_name = strtok(param, "=\t\n")) == NULL)
6281 // check if screen name
6282 if (strncmp("SCREEN", param_name, 6) == 0)
6284 // if we do not want screen names ...
6285 if (screen_name == NULL)
6288 // FIXME check for screen nr
6289 if ((tmp = strtok(NULL, ":\n")) == NULL)
6293 // FIXME: check if already defined screen
6295 if ((i <= 0) || (i > NM_MAX_SCREEN))
6297 // check for screen name
6298 if ((tmp = strtok(NULL, ":\n")) == NULL)
6301 screen_name[i] = strdup(tmp);
6307 // FIXME: check for NM_MAX_FIELDS
6309 // check for x coord
6310 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6314 // check for y coord
6315 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6320 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6325 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6329 // check for netmon manual name
6330 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6332 "%s: PARAMETER <%s> in screen <%d>, not have netmon manual reference\n",
6333 f_name, param_name, s);
6334 free_nm_info(start);
6337 strcpy(tmp_mname, tmp);
6339 // check for data type (optional)
6340 if ((tmp = strtok(NULL, ":\t\n")) != NULL)
6345 // check len, here, so we print parameter name
6348 "%s: PARAMETER <%s> in screen <%d>, has invalid data lenght\n",
6349 f_name, param_name, s);
6350 free_nm_info(start);
6354 // check if already defined same param_name
6356 while (check->next != NULL)
6357 { check = check->next;
6358 if (strcmp(param_name, check->name) == 0)
6361 "%s: PARAMETER <%s> in screen <%d> already defined as in screen <%d>\n",
6362 f_name, param_name, s, check->s_nr);
6363 free_nm_info(start);
6368 // make space, and add parameter
6369 if ((info->next = malloc(sizeof(PARAM_INFO_MON))) != NULL)
6372 info->name = strdup(param_name);
6377 info->mname = strdup(tmp_mname);
6380 info->next = NULL; // mark end
6384 fprintf(stderr, "no mem");
6385 free_nm_info(start);
6397 while (info->next != NULL)
6400 fprintf(stderr, "info name %s\n", info->name);
6406 // 2, parse the arguments and check command(s) line
6407 // command line, phone spec input, and output are complex,
6408 // so we exit printing info about error instead of std help
6409 ///////////////////////////////////////////////////////////////////////////////
6411 int parse_check(int argc, char *argv[], PARAM_INFO_MON *start, char *f_name, int line)
6420 PARAM_INFO_MON *info; // iterator on this list
6423 for (i = 0; i < argc; i++)
6424 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6434 { // should be one of the short option
6435 if (strcmp(argv[i], "-fs") == 0)
6436 { // field separator, next arg should be a string
6437 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6439 // arg OK, do nothing
6444 "-fs: Invalid field separator in <%s> at line %d\n",
6447 fprintf(stderr, "-fs: Invalid field separator\n");
6451 else if (strcmp(argv[i], "-ls") == 0)
6452 { // line separator, next arg should be a string
6453 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6455 // arg OK, do nothing
6460 "-ls: Invalid line separator in <%s> at line %d\n",
6463 fprintf(stderr, "-ls: Invalid line separator\n");
6467 else if (strcmp(argv[i], "-tm") == 0)
6468 { // time separator, next arg should be a millisecond (200-10000)
6472 "-tm, -ts, are mutually exclusive in <%s> at line %d\n",
6475 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6479 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6482 // arg OK, do nothing
6487 "-tm: Invalid argument (200-10000 milliseconds), in <%s> at line %d\n",
6490 fprintf(stderr, "-tm: Invalid argument (200-10000 milliseconds)\n");
6494 else if (strcmp(argv[i], "-ts") == 0)
6495 { // time separator, next arg should be a seconds (1-3600)
6499 "-tm, -ts, are mutually exclusive, in <%s> at line %d\n",
6502 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6506 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6509 // arg OK, do nothing
6514 "-ts: Invalid argument (1-3600 seconds) in <%s> at line %d\n",
6517 fprintf(stderr, "-ts: Invalid argument (1-3600 seconds)\n");
6521 else if (strcmp(argv[i], "-n") == 0)
6522 { // nr of data pump, before stop collection,
6523 // next arg should be a int > 0
6524 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6526 // arg OK, do nothing
6531 "-n: Invalid argument (1-99999 times) in <%s> at line %d\n",
6534 fprintf(stderr, "-n: Invalid argument (1-99999 times)\n");
6538 else if (strcmp(argv[i], "-h") == 0)
6539 { // we do NOT want header (default with header)
6540 // arg OK, do nothing
6542 else if (strcmp(argv[i], "-S") == 0)
6543 { // we have used use specs from a file instead of standard info,
6544 // next arg is an existing readable filename
6545 // as already parsed correctly, we skip here.
6548 else if (strcmp(argv[i], "-I") == 0)
6549 { // we have used input from a file instead of command line
6550 // next arg is an existing readable filename
6551 // as already parsed correctly, we skip here.
6557 fprintf(stderr, "Unrecognized option %s in <%s> at line %d\n",
6558 argv[i], f_name, line);
6560 fprintf(stderr, "Unrecognized option %s\n", argv[i]);
6565 { // should be required data
6566 tmp = strdup(argv[i]);
6567 p = strtok(tmp, ":\t\n");
6570 // check if there is an output format specification
6580 // we have 'minus', so, probably forget format ...
6584 "Required data <%s->, without format specifiers in <%s> at line %d\n",
6588 "Required data <%s->, without format specifiers\n", p);
6594 // we check for params
6597 while (info->next != NULL)
6600 if (strcmp(p, info->name) == 0)
6602 if (ctr > NM_MAX_FIELDS)
6606 "too much data field ... in file <%s> at line %d\n",
6609 fprintf(stderr, "too much data field ...\n");
6622 if (found_data == 0)
6626 "Required data <%s>, not found in info-mon specifications in <%s> at line %d\n",
6630 "Required data <%s>, not found in info-mon specifications\n", p);
6634 p = strtok(NULL, ":\t\n");
6636 } // end while strtok
6638 } // end else '-' (short options)
6647 fprintf(stderr, "no required data! in <%s> at line %d\n", f_name, line);
6649 fprintf(stderr, "no required data!\n");
6656 // 2, parse the arguments and process the command line
6657 // no checks are needed here, because already do in parse_check
6658 // it return a pointer to info needed for make output, or NULL if errors
6659 ///////////////////////////////////////////////////////////////////////////////
6660 OUT_INFO_MON *parse_process(int argc, char *argv[], PARAM_INFO_MON *start)
6671 PARAM_INFO_MON *info; // iterator on this list
6672 OUT_INFO_MON *out_param; // iterator on this list
6674 if ((out_param = malloc(sizeof(OUT_INFO_MON))) == NULL)
6675 { fprintf(stderr, "no mem\n");
6680 fprintf(stderr, "parse_process: argc = %d\n", argc);
6681 for (i = 0; i < argc; i++)
6682 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6685 for (i = 0; i < NM_MAX_FIELDS; i++)
6686 out_param->data[i] = NULL;
6688 strcpy(out_param->req_fs, " ");
6690 strcpy(out_param->req_ls, "\n\r");
6692 strcpy(out_param->req_ls, "\n");
6695 out_param->req_n = 0;
6696 out_param->req_header = 1;
6699 req_tm = 200; /* default wait */
6708 { // should be one of the short option
6709 if (strcmp(argv[i], "-fs") == 0)
6710 { // field separator, next arg should be a string
6711 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6713 strcpy(out_param->req_fs, argv[i]);
6716 { fprintf(stderr, "NEVER BE:-fs: Invalid field separator\n");
6720 else if (strcmp(argv[i], "-ls") == 0)
6721 { // line separator, next arg should be a string
6722 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6724 strcpy(out_param->req_ls, argv[i]);
6727 { fprintf(stderr, "NEVER BE:-ls: Invalid line separator\n");
6731 else if (strcmp(argv[i], "-tm") == 0)
6732 { // time separator, next arg should be a millisecond (200-10000)
6734 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6738 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6740 req_tm = atoi(argv[i]);
6744 { fprintf(stderr, "NEVER BE:-tm: Invalid argument (200-10000 milliseconds)\n");
6748 else if (strcmp(argv[i], "-ts") == 0)
6749 { // time separator, next arg should be a seconds (1-3600)
6751 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6755 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6757 req_ts = atoi(argv[i]);
6764 { fprintf(stderr, "NEVER BE:-ts: Invalid argument (1-3600 seconds)\n");
6768 else if (strcmp(argv[i], "-n") == 0)
6769 { // nr of data pump, before stop collection,
6770 // next arg should be a int > 0
6771 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6773 out_param->req_n = atoi(argv[i]);
6776 { fprintf(stderr, "NEVER BE:-n: Invalid argument (1-99999 times)\n");
6780 else if (strcmp(argv[i], "-h") == 0)
6781 { // we do NOT want header (default with header)
6782 out_param->req_header = 0;
6784 else if (strcmp(argv[i], "-S") == 0)
6785 { // we have used use specs from a file instead of standard info,
6786 // next arg is an existing readable filename
6787 // as already parsed correctly, we skip here.
6790 else if (strcmp(argv[i], "-I") == 0)
6791 { // we have used input from a file instead of command line
6792 // next arg is an existing readable filename
6793 // as already parsed correctly, we skip here.
6798 fprintf(stderr, "NEVER BE:Unrecognized option %s\n", argv[i]);
6803 { // should be required data
6804 tmp = strdup(argv[i]);
6805 p = strtok(tmp, ":\t\n");
6808 // check if there is an output format specification
6818 // we have 'minus', so, probably forget format ...
6821 "NEVER BE:Required data <%s->, without format specifiers\n", p);
6827 // we check for params
6830 while (info->next != NULL)
6833 if (strcmp(p, info->name) == 0)
6835 if (ctr > NM_MAX_FIELDS)
6837 fprintf(stderr, "NEVER BE:too much data field ...");
6840 out_param->data[ctr] = info;
6841 out_param->out_f[ctr] = *o;
6848 if (found_data == 0)
6851 "NEVER BE:Required data <%s>, not found in info-mon specifications\n", p);
6856 p = strtok(NULL, ":\t\n");
6858 } // end while strtok
6860 // here, we have an array of pointers to required data
6861 // and an array of output specifiers, from 0 to [ctr-1]
6863 } // end else '-' (short options)
6871 fprintf(stderr, "NEVER BE:no required data!\n");
6875 // now, what netmon screen we need to retrieve ?
6876 // we need somewhat were checking is faster, as our goal is lower cicle time
6878 // we can have NM_MAX_SCREEN=254 screens, so we use an array, of unsigned char,
6879 // each char contain number of needed screen, 255 is list terminator
6881 for (i = 0; i <= NM_MAX_SCREEN; i++)
6882 out_param->req_screen[i] = 255;
6886 fprintf(stderr, "Start Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6888 while (out_param->data[ctr] != NULL)
6891 fprintf(stderr, "Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6893 // check if screen already in
6896 while (out_param->req_screen[i] != 255)
6898 if (out_param->req_screen[i] == out_param->data[ctr]->s_nr)
6899 { // already load, skip
6906 if (found_data == 0)
6909 fprintf(stderr, "i = %d, out_param->req_screen[%d] = %d\n", i, i, out_param->data[ctr]->s_nr);
6911 out_param->req_screen[i] = out_param->data[ctr]->s_nr;
6920 while (out_param->req_screen[i] != 255)
6922 fprintf(stderr, "Required screen %d\n", out_param->req_screen[i]);
6928 out_param->req_wait = req_tm * 1000;
6930 out_param->req_wait = req_ts * 1000000;
6932 out_param->req_wait = req_tm * 1000;
6938 int nmd_output(OUT_INFO_MON *out_param)
6948 char Screen[NM_MAX_SCREEN_WIDTH];
6950 struct tm *date_time;
6952 if (out_param->req_header)
6954 // print phone help header
6956 while (out_param->data[d] != NULL)
6957 { len = out_param->data[d]->len;
6958 if (strlen(out_param->data[d]->name) > len)
6959 len = strlen(out_param->data[d]->name);
6960 if (strlen(out_param->data[d]->mname) > len)
6961 len = strlen(out_param->data[d]->mname);
6962 printf("%*.*s%s", len, len, out_param->data[d]->name, out_param->req_fs);
6965 printf("%s", out_param->req_ls);
6967 // print netmon manual header
6969 while (out_param->data[d] != NULL)
6970 { len = out_param->data[d]->len;
6971 if (strlen(out_param->data[d]->name) > len)
6972 len = strlen(out_param->data[d]->name);
6973 if (strlen(out_param->data[d]->mname) > len)
6974 len = strlen(out_param->data[d]->mname);
6975 printf("%*.*s%s", len, len, out_param->data[d]->mname, out_param->req_fs);
6978 printf("%s", out_param->req_ls);
6979 printf("%s", out_param->req_ls);
6985 // stop after n data punp
6988 if ((out_param->req_n) && (ctr > out_param->req_n))
6991 // datapump: for each screen, for each required data, load data info->value
6994 while(out_param->req_screen[i] != 255)
6996 if (out_param->req_screen[i] == 0)
6999 date_time = localtime(&sec);
7000 sprintf(Screen, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7002 date_time->tm_mon+1,
7003 date_time->tm_year+1900,
7008 fprintf(stderr, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7010 date_time->tm_mon+1,
7011 date_time->tm_year+1900,
7019 GSM->NetMonitor(out_param->req_screen[i], Screen);
7022 // we have one screen of data, load those required
7025 while (out_param->data[d] != NULL)
7027 if (out_param->data[d]->s_nr == out_param->req_screen[i])
7031 nr_line = out_param->data[d]->y;
7032 while ((*p) && (nr_line))
7040 fprintf(stderr, "\nthis line: %s\n\n", p);
7044 nr_chr = out_param->data[d]->x;
7045 while ((*p) && (nr_chr))
7049 // this the start of data
7051 len = out_param->data[d]->len;
7052 while ((*p) && (len))
7053 { out_param->data[d]->value[n] = *p;
7058 // pad with space if shorter than presumed
7059 while ((*p) && (len))
7060 { out_param->data[d]->value[n] = ' ';
7065 out_param->data[d]->value[n] = '\0';
7074 // print row of data
7076 while (out_param->data[d] != NULL)
7078 len = out_param->data[d]->len;
7079 if (out_param->req_header)
7080 { if (strlen(out_param->data[d]->name) > len)
7081 len = strlen(out_param->data[d]->name);
7082 if (strlen(out_param->data[d]->mname) > len)
7083 len = strlen(out_param->data[d]->mname);
7085 // FIXME check format
7086 printf("%*.*s%s", len, len, out_param->data[d]->value, out_param->req_fs);
7089 printf("%s", out_param->req_ls);
7091 usleep(out_param->req_wait);
7095 printf("%s%s", out_param->req_ls, out_param->req_ls);
7101 ///////////////////////////////////////////////////////////////////////////////
7102 int netmonitordata(int argc, char *argv[])
7104 char *loc_info = NULL; // path to --netmonitordata directory
7105 char *f_name; // absolute path of phone info-file
7106 int flag_phone_spec = 0; // flags, set if used -S option
7108 char model[20] = "phonepar"; // TO DO: PHONE AUTODETECTION
7109 // char phver[20] = "";
7111 PARAM_INFO_MON *start; // pointer to list of parsed phone params
7112 OUT_INFO_MON *out_param; // pointer to struct of output data
7114 char *f_commands = NULL; // file containings input line arguments
7115 FILE *commands; // Handle for this file
7116 char buf[1024]; // buffer
7117 char *f_argv[NM_MAX_FIELDS+30]; // space for parameters and cmdline options
7119 char *p, *tmp; // various counter, flags, tmp area ...
7126 signal(SIGINT, interrupted);
7128 // FIXME model, phone_version
7130 // before parsing phone-info-file, we check for user specified phone-info-file
7135 if (strcmp(argv[i], "-S") == 0)
7139 flag_phone_spec = 1;
7140 loc_info = strdup(argv[i+1]);
7144 { fprintf(stderr, "option -S require an argument ...\n");
7152 if (loc_info != NULL)
7153 { f_name = strdup(loc_info);
7155 else // we use standard file specification
7157 if ((tmp = getenv("INFOMONPATH")) == NULL)
7158 { loc_info = strdup(".");
7161 { loc_info = strdup(tmp);
7164 f_name = malloc(strlen(loc_info)+strlen(model)+10);
7165 sprintf(f_name, "%s/%s", loc_info, model);
7170 // fprintf(stderr, "Loc_info <%s> model <%s> version <%s>\n", loc_info, model, phver);
7171 fprintf(stderr, "Info file: <%s>\n", f_name);
7173 if ((start = get_mon_param_info(f_name, NULL)) == NULL)
7176 // option -I give us the possibility of specify a filename,
7177 // containing a "sequence" of command line args.
7178 // if you specify this option, you can use (on command line) only -S option.
7179 // other options may be specified inside the input-file.
7180 // contents of this file as the same sintax as the command line,
7181 // except it must not contain "--netmonitordata" or "-I" or "-S" options
7182 ///////////////////////////////////////////////////////////////////////
7187 if (strcmp(argv[i], "-I") == 0)
7191 if ((argc == 2) || ((argc == 4) && flag_phone_spec == 1))
7192 { f_commands = strdup(argv[i+1]);
7195 { fprintf(stderr, "option -I accept only additional -S option.\n");
7202 { fprintf(stderr, "option -I require an argument ...\n");
7210 // before all, we check all command line
7212 if (f_commands != NULL)
7215 fprintf(stderr, "netmonitordata(check): commands from <%s>\n", f_commands);
7219 // read line, make array f_argv, and counter f_argc
7220 // parse & check args, so errors are checked before real processing
7221 // (-I option here is ignored)
7222 // (-S option can be here, and it is used)
7225 if ((commands = fopen(f_commands, "r")) == NULL)
7226 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7230 // FIXME line may be be splitted
7232 while (fgets(buf, 1024, commands) != NULL)
7237 // Truncate from '#' at right of comments
7238 if ((tmp = strchr(p, '#')) != NULL)
7241 // Strip leading, trailing whitespace
7242 while(isspace((int) *p))
7245 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7246 p[strlen(p) - 1] = '\0';
7248 // Ignore blank lines
7249 if ((*p == '\n') || (*p == '\0'))
7253 fprintf(stderr, "netmonitordata(check): row <%s>\n", p);
7258 p = strtok(p, " \t");
7260 { f_argv[f_argc++] = strdup(p);
7262 fprintf(stderr, "netmonitordata(check): token <%s>\n", p);
7264 p = strtok(NULL, " \t"); // OK p, (NULL)
7266 while ((p != NULL) && (*p));
7268 // here we have f_argc, f_argv, this line is OK
7270 if (parse_check(f_argc, f_argv, start, f_commands, line) != 0)
7271 { free_nm_info(start);
7278 else // as above, but we have only command line, argv, argc.
7280 if (parse_check(argc, argv, start, NULL, 0) != 0)
7281 { free_nm_info(start);
7286 // here, all commands line are checked, and are correct
7288 if (f_commands != NULL)
7291 fprintf(stderr, "netmonitordata(process): commands from <%s>\n", f_commands);
7296 // read line, make array f_argv, and counter f_argc
7297 // parse_process argument, (-I option here is ignored)
7298 // (-S option can be here, and it is used)
7299 // (make header // these are in nmd_output();
7306 if ((commands = fopen(f_commands, "r")) == NULL)
7307 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7311 // FIXME line may be be splitted
7312 while (fgets(buf, 1024, commands) != NULL)
7316 // Truncate from '#' at right of comments
7317 if ((tmp = strchr(p, '#')) != NULL)
7320 // Strip leading, trailing whitespace
7321 while(isspace((int) *p))
7324 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7325 p[strlen(p) - 1] = '\0';
7327 // Ignore blank lines
7328 if ((*p == '\n') || (*p == '\0'))
7334 p = strtok(p, " \t");
7336 { f_argv[f_argc++] = strdup(p);
7337 p = strtok(NULL, " \t"); // OK p, (NULL)
7339 while ((p != NULL) && (*p));
7341 // here we have f_argc, f_argv, this line is OK
7343 if ((out_param = parse_process(f_argc, f_argv, start)) == NULL)
7344 { free_nm_info(start);
7345 return(-1); /* NEVER BE */
7348 // here, command line has no error ...
7350 nmd_output(out_param);
7357 else // as above, but we have only command line, argv, argc.
7359 if ((out_param = parse_process(argc, argv, start)) == NULL)
7360 { free_nm_info(start);
7361 return(-1); /* NEVER BE */
7363 nmd_output(out_param);
7372 /* I analised this source and this should be done. But when compile with VC6 */
7373 /* I have error. So, commented... MW */
7375 free_nm_info(start);
7382 // used by nm_collect()
7383 ///////////////////////////////////////////////////////////////////////////////
7384 char *rowScreen(char *s)
7388 // make Screen in one row
7400 void printtime(void)
7404 int Year; /* The complete year specification - e.g. 1999. Y2K :-) */
7405 int Month; /* January = 1 */
7410 int Timezone; /* The difference between local time and GMT */
7416 now=localtime(&nowh);
7418 Date.Year = now->tm_year;
7419 Date.Month = now->tm_mon+1;
7420 Date.Day = now->tm_mday;
7421 Date.Hour = now->tm_hour;
7422 Date.Minute = now->tm_min;
7423 Date.Second = now->tm_sec;
7425 /* I have 100 (for 2000) Year now :-) */
7426 if (Date.Year>99 && Date.Year<1900) {
7427 Date.Year=Date.Year+1900;
7430 printf("%d:%d:%d:%d:%d:%d ",Date.Day,Date.Month,Date.Year,Date.Hour,Date.Minute,Date.Second);
7434 // like netmonitor(), but print in one row, 1, 2 or 3 screen, every ~0.3 s
7435 ///////////////////////////////////////////////////////////////////////////////
7436 int nm_collect(int argc, char *argv[])
7438 int mode[MAX_NM_COLLECT];
7439 char Screen[NM_MAX_SCREEN_WIDTH];
7442 for (i=0;i<argc;i++) {
7443 argc > i ? (mode[i] = atoi(argv[i])): (mode[i] = 0);
7446 for (i=0;i<argc;i++) {
7447 if (mode[i]==0 && strcmp(argv[i],"-d")) {
7448 fprintf(stderr, "Wrong %i parameter (not number and not -d)\n",i);
7453 signal(SIGINT, interrupted);
7460 for (i=0;i<argc;i++) {
7461 if (!strcmp(argv[i],"-d")) {
7467 for (i=0;i<argc;i++) {
7470 GSM->NetMonitor(mode[i], Screen);
7471 printf("%s::", rowScreen(Screen));
7486 int sniff(int argc, char *argv[])
7488 /* base model comes from gnokiirc */
7489 strcat(model,"sniff");
7491 if (argc>0) strcpy(Port,argv[0]);
7493 /* Initialise the GSM interface. */
7496 /* Loop here indefinitely - allows you to see messages from GSM code in
7497 response to unknown messages etc. The loops ends after pressing the
7499 while (!bshutdown) {
7509 int decodefile(int argc, char *argv[])
7512 unsigned char in_buffer[255];
7516 /* base model comes from gnokiirc */
7517 strcat(model,"decode");
7519 /* Initialise the GSM interface. */
7522 printf ("open InPutFile: %s\n", argv[0]);
7523 if ( (infile = fopen( argv[0], "rb")) == NULL ) {
7524 printf ("Failed to open InPutFile: %s\n", argv[0]);
7527 while ( (nr_read = fread(in_buffer, 1, 16, infile)) > 0 ) {
7528 for (i=0; i < nr_read; i++)
7529 Protocol->StateMachine(in_buffer[i]);
7537 int getringtone(int argc, char *argv[])
7539 GSM_BinRingtone ringtone;
7541 GSM_Ringtone SMringtone;
7543 ringtone.location=1;
7544 if (argc>1) ringtone.location=atoi(argv[1]);
7546 /* Initialise the GSM interface. */
7549 error=GSM_GetPhoneRingtone(&ringtone,&SMringtone);
7551 fprintf(stdout, _("Downloaded ringtone, location %i: "),ringtone.location);
7555 fprintf(stdout, _("get succeeded!\n"));
7556 /* In 33.. we have normal "Smart Messaging" format */
7557 if (GetModelFeature (FN_RINGTONES)==F_RING_SM) {
7558 fprintf(stdout, _("Name: %s (normal format)\n"),SMringtone.name);
7559 GSM_SaveRingtoneFileOnConsole(argv[0], &SMringtone);
7561 fprintf(stdout, _("Name: %s (binary format)\n"),ringtone.name);
7562 GSM_SaveBinRingtoneFile(argv[0], &ringtone);
7567 case GE_INVALIDRINGLOCATION:
7568 fprintf(stdout, _("invalid location %i!\n"),ringtone.location);
7570 case GE_UNKNOWNMODEL:
7571 fprintf(stdout, _("mygnokii doesn't know format for this model!\n"));
7573 case GE_NOTIMPLEMENTED:
7574 fprintf(stdout, _("not implemented for this model!\n"));
7577 fprintf(stdout, _("not supported by this model!\n"));
7586 int binringtoneconvert(int argc, char *argv[])
7588 GSM_BinRingtone ringtone;
7597 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
7598 int binary_notes[12] =
7599 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
7601 if (GSM_ReadBinRingtoneFile(argv[0],&ringtone)!=GE_NONE) {
7602 fprintf(stdout,_("Failed to read %s file!\n"),argv[0]);
7606 file = fopen(argv[1], "wb");
7609 return(GE_CANTOPENFILE);
7613 if (ringtone.frame[i]==0) break;
7614 fprintf(file,_("%c"),ringtone.frame[i]);
7618 fprintf(file,_(":d=32,o=5,b=300:"));
7622 if (ringtone.frame[i]!=j) {
7629 if (!isok && j>=114 && j<=125) {
7630 j=14*3+binary_notes[j-114];
7633 if (!isok && j>=126 && j<=137) {
7634 j=14*1+binary_notes[j-126];
7637 if (!isok && j>=138 && j<=149) {
7638 j=14*2+binary_notes[j-138];
7641 if (!isok && j>=150 && j<=161) {
7642 j=14*4+binary_notes[j-150];
7647 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
7653 if (w>z && (w/2)<=z) {
7655 case 1:fprintf(file,_("16"));break;
7656 case 2:fprintf(file,_("8"));break;
7657 case 3:fprintf(file,_("4"));break;
7658 case 4:fprintf(file,_("2"));break;
7659 case 5:fprintf(file,_("1"));break;
7664 if (z>w) fprintf(file,_("1"));
7666 switch (GSM_GetNote(j)) {
7667 case Note_C :fprintf(file,_("c"));break;
7668 case Note_Cis:fprintf(file,_("c#"));break;
7669 case Note_D :fprintf(file,_("d"));break;
7670 case Note_Dis:fprintf(file,_("d#"));break;
7671 case Note_E :fprintf(file,_("e"));break;
7672 case Note_F :fprintf(file,_("f"));break;
7673 case Note_Fis:fprintf(file,_("f#"));break;
7674 case Note_G :fprintf(file,_("g"));break;
7675 case Note_Gis:fprintf(file,_("g#"));break;
7676 case Note_A :fprintf(file,_("a"));break;
7677 case Note_Ais:fprintf(file,_("a#"));break;
7678 case Note_H :fprintf(file,_("h"));break;
7679 default :pause=true;fprintf(file,_("p"));break; //Pause ?
7684 if (w>z && (w/2)<=z) {
7685 fprintf(file,_("."));
7689 if ((j/14)!=1 && !pause) fprintf(file,_("%i"),j/14);
7690 fprintf(file,_(","));
7693 j=ringtone.frame[i];
7694 z=ringtone.frame[i+1];
7696 z=z+ringtone.frame[i+1];
7699 if (i>=ringtone.length) break;
7708 int renamesmsc(int argc, char *argv[])
7710 GSM_MessageCenter MessageCenter;
7712 MessageCenter.No=atoi(argv[0]);
7714 /* Initialise the GSM interface. */
7717 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
7718 fprintf(stdout,_("SMSC number %i get OK\n"),MessageCenter.No);
7721 fprintf(stdout,_("Error getting SMSC number %i\n"),MessageCenter.No);
7725 strncpy(MessageCenter.Name,argv[1],10);
7727 if (GSM->SetSMSCenter(&MessageCenter) == GE_NONE) {
7728 fprintf(stdout,_("SMSC number %i set OK (renamed to \"%s\")\n"),MessageCenter.No,MessageCenter.Name);
7731 fprintf(stdout,_("Error setting SMSC number %i\n"),MessageCenter.No);
7741 * Returns number of sostituited characters.
7742 * ... may be useful one day ??
7744 int semicolon_pipe_substitution( GSM_PhonebookEntry *pentry, unsigned int direction )
7745 /* direction = 0 : after reading phone memory (
7746 * 1 : writing phone memory
7750 register int count=0;
7751 char charfrom, charto;
7753 charfrom= (direction==0) ? ';' : '|';
7754 charto = (direction==0) ? '|' : ';';
7756 count+=str_substch(pentry->Name, charfrom, charto );
7757 count+=str_substch(pentry->Number, charfrom, charto );
7759 for( i = 0; i < pentry->SubEntriesCount; i++ )
7761 if( pentry->SubEntries[i].EntryType != GSM_Date )
7762 count+=str_substch(pentry->SubEntries[i].data.Number ,charfrom,charto);
7768 int str_substch( char *str, const char toric, const char sost )
7773 for( ct = 0; ct < strlen(str); ct++ )
7774 if( str[ct] == (unsigned char) toric )
7775 { str[ct] = sost; i_sost++; }
7780 /* Allows to set simlock state.
7781 With older phone (older 51xx, 61xx) can open them, with older
7782 and newer should be able to close them */
7783 /* DO NOT TRY, IF DON'T WANT, WHAT YOU DO !!!!!!!!!! */
7786 GSM_AllSimlocks siml;
7788 unsigned char closebuffer[20]=
7789 { 0x00, 0x01, 0x82, 0x01,
7790 0x00, /* which simlock */
7792 0x00, 0x00, 0x00, /* lock 1 info */
7793 0x00, 0x00, 0x00, 0x00, 0x00, /* lock 4 info */
7794 0x00, 0x00, /* lock 2 info */
7795 0x00, 0x00, /* lock 3 info */
7797 unsigned char openbuffer[10]= { 0x00, 0x01, 0x81, 0x01,
7798 0x00, /* lock number */
7799 0x10, 0x10, 0x10, 0x10, 0x10 };
7800 unsigned char openbuffer0[10]= {0x00, 0x01, 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00 };
7802 unsigned char info[120];
7805 /* Initialise the code for the GSM interface. */
7807 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7809 fprintf(stderr,("Not supported\n"));
7813 N6110_EnableExtendedCommands(0x02);
7815 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7816 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7818 /* Opening all locks (we must check, if we can open them) */
7819 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7820 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7821 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7822 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7823 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7824 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7825 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7828 if (siml.simlocks[i].enabled) {
7829 fprintf(stderr,_("Can not open simlock %i\n"),i+1);GSM->Terminate();return -1;
7832 /* Making frame for closing simlocks */
7833 strcpy(info,"00101");
7835 while (j!=strlen(info)) {
7836 if (j+2<=strlen(info)) {
7837 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7839 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7842 strcpy(info,"0000");j=0;i=15;
7843 while (j!=strlen(info)) {
7844 if (j+2<=strlen(info)) {
7845 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7847 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7850 strcpy(info,"0000");j=0;i=17;
7851 while (j!=strlen(info)) {
7852 if (j+2<=strlen(info)) {
7853 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7855 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7858 strcpy(info,"0000000001");j=0;i=9;
7859 while (j!=strlen(info)) {
7860 if (j+2<=strlen(info)) {
7862 closebuffer[i]=closebuffer[i] | (info[j] & 0x0f);j++;
7864 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7867 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7870 /* Closing simlock with given values */
7871 closebuffer[4]=1+2+4+8;
7872 NULL_SendMessageSequence(50, &CurrentMagicError, 20, 0x40,closebuffer);
7873 /* Opening all locks */
7874 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7875 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7876 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7877 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7878 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7886 GSM_AllSimlocks siml;
7889 /* Initialise the code for the GSM interface. */
7892 if (GSM->SimlockInfo(&siml)!=GE_NONE) fprintf(stderr,_("Error\n"));
7894 fprintf(stdout,_("MCC + MNC : %s ("),siml.simlocks[0].data);
7895 if (siml.simlocks[0].enabled) fprintf(stdout,_("CLOSED"));
7896 else fprintf(stdout,_("opened"));
7897 if (siml.simlocks[0].factory) fprintf(stdout,_(") (factory"));
7898 else fprintf(stdout,_(") (user"));
7899 fprintf(stdout,_(") (counter %i"),siml.simlocks[0].counter);
7901 s[0]=siml.simlocks[0].data[0];
7902 s[1]=siml.simlocks[0].data[1];
7903 s[2]=siml.simlocks[0].data[2];
7905 s[4]=siml.simlocks[0].data[3];
7906 s[5]=siml.simlocks[0].data[4];
7909 if (strcmp(GSM_GetNetworkName(s),"unknown"))
7910 fprintf(stdout,_(") (network \"%s\""),GSM_GetNetworkName(s));
7912 fprintf(stdout,_(")\n"));
7914 fprintf(stdout,_("GID1 : %s ("),siml.simlocks[1].data);
7915 if (siml.simlocks[1].enabled) fprintf(stdout,_("CLOSED"));
7916 else fprintf(stdout,_("opened"));
7917 if (siml.simlocks[1].factory) fprintf(stdout,_(") (factory"));
7918 else fprintf(stdout,_(") (user"));
7919 fprintf(stdout,_(") (counter %i"),siml.simlocks[1].counter);
7920 fprintf(stdout,_(")\n"));
7922 fprintf(stdout,_("GID2 : %s ("),siml.simlocks[2].data);
7923 if (siml.simlocks[2].enabled) fprintf(stdout,_("CLOSED"));
7924 else fprintf(stdout,_("opened"));
7925 if (siml.simlocks[2].factory) fprintf(stdout,_(") (factory"));
7926 else fprintf(stdout,_(") (user"));
7927 fprintf(stdout,_(") (counter %i"),siml.simlocks[2].counter);
7928 fprintf(stdout,_(")\n"));
7930 fprintf(stdout,_("MSIN : %s ("),siml.simlocks[3].data);
7931 if (siml.simlocks[3].enabled) fprintf(stdout,_("CLOSED"));
7932 else fprintf(stdout,_("opened"));
7933 if (siml.simlocks[3].factory) fprintf(stdout,_(") (factory"));
7934 else fprintf(stdout,_(") (user"));
7935 fprintf(stdout,_(") (counter %i"),siml.simlocks[3].counter);
7936 fprintf(stdout,_(")\n"));
7943 /* Getting EEPROM from older phones */
7944 /* Tested with N5110 5.07, 6150 5.22 */
7949 unsigned char buffer[1000]={ 0x00, 0x01, 0xd4, 0x02, 0x00, 0xa0,
7950 0x00, 0x00, /* location Lo and Hi */
7951 0x10 }; /* how many bytes */
7953 strcpy(Connection,"mbus");
7954 fprintf(stderr,_("Switching connection type to MBUS\n"));
7956 strcpy(model,"5110");
7958 /* Initialise the code for the GSM interface. */
7961 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7963 fprintf(stderr,("Not supported\n"));
7968 for (i=0;i<64;i++) {
7969 fprintf(stdout,_("%c"),0xff);
7976 if ((i/256)!=((i-1)/256)) fprintf(stderr,_("."));
7978 if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE) break;
7983 fprintf(stderr,_("\n"));
7992 GSM_SMSFolders folders;
7997 /* Initialise the code for the GSM interface. */
8002 error=GSM->GetSMSFolders(&folders);
8006 if (error!=GE_NONE && !folders.number) {
8007 fprintf(stdout,_("Error!\n"));
8011 for (i=0;i<folders.number;i++) {
8012 fprintf(stdout,_("%i. %s\n"),i+1,folders.Folder[i].Name);
8018 int resetphonesettings()
8020 /* Initialise the code for the GSM interface. */
8023 GSM->ResetPhoneSettings();
8032 /* Checked on 3310 4.02 and doesn't work.
8033 Possible reasons: SMSC has problems (possible), bug in phone firmware
8034 (very possible) or here in code.
8035 I quess, that the second is the most possible - 3310 treat only 3 SMS
8036 as linked (the most often profile needs 4 - 2 and few bytes in 3'th
8037 for screen saver, few bytes for profile name and 1 or 2 sms for ringtone).
8038 When send separate ringtone (see --sendringtone with --profilestyle)
8039 and screen saver (--sendlogo screensaver...), it's received OK.
8040 It's for checking in higher firmware. */
8041 int sendprofile(int argc, char *argv[])
8043 GSM_Ringtone ringtone;
8045 GSM_MultiSMSMessage MultiSMS;
8049 u8 MessageBuffer[140*4];
8050 u16 MessageLength=0;
8052 char profilename[10+1];
8054 if (GSM_ReadRingtoneFileOnConsole(argv[2], &ringtone)!=GE_NONE) return(-1);
8056 ringtone.allnotesscale=false;
8057 for (i=0;i<argc;i++)
8058 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
8060 /* The fourth argument is the bitmap file. */
8061 if (GSM_ReadBitmapFileOnConsole(argv[3], &bitmap)!=GE_NONE) return -1;
8063 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
8065 strncpy(profilename,argv[1],10);
8067 MessageBuffer[MessageLength++]=0x30; //SM version. Here 3.0
8069 MessageBuffer[MessageLength++]=SM30_PROFILENAME; //ID for profile name
8070 MessageBuffer[MessageLength++]=0x00; //length hi
8071 MessageBuffer[MessageLength++]=strlen(profilename);//length lo
8073 EncodeUnicode (MessageBuffer+MessageLength,profilename ,strlen(profilename));
8074 MessageLength=MessageLength+2*strlen(profilename);
8076 MessageBuffer[MessageLength++]=SM30_RINGTONE; //ID for ringtone
8078 MessageBuffer[MessageLength++]=0x01; //length hi
8079 MessageBuffer[MessageLength++]=0x00; //length lo
8081 j=SM30_MAX_RINGTONE_FRAME_LENGTH;
8082 current=GSM_PackRingtone(&ringtone, MessageBuffer+MessageLength, &j);
8083 MessageLength=MessageLength+j;
8085 if (current!=ringtone.NrNotes) {
8086 if (current>FB61_MAX_RINGTONE_NOTES) {
8087 fprintf(stderr,_("Warning: due to phone limitation"));
8089 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
8091 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
8094 MessageBuffer[i]=(j)/256;
8095 MessageBuffer[i+1]=(j)%256;
8097 MessageBuffer[MessageLength++]=SM30_SCREENSAVER; //ID for OTA screen saver
8098 MessageBuffer[MessageLength++]=0x01; //length hi
8099 MessageBuffer[MessageLength++]=0x00; //length lo
8100 MessageBuffer[MessageLength++]=0x00;
8101 MessageBuffer[MessageLength++]=bitmap.width;
8102 MessageBuffer[MessageLength++]=bitmap.height;
8103 MessageBuffer[MessageLength++]=0x01;
8105 memcpy(MessageBuffer+MessageLength,bitmap.bitmap,bitmap.size);
8106 MessageLength=MessageLength+bitmap.size;
8108 GSM_MakeMultiPartSMS2(&MultiSMS,MessageBuffer,MessageLength, GSM_ProfileUDH, GSM_Coding_Default);
8112 /* Initialise the GSM interface. */
8115 for (i=0;i<MultiSMS.number;i++)
8116 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
8118 return GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,false,false,false);
8121 int showbitmap(int argc, char *argv[])
8125 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
8127 GSM_PrintBitmap(&bitmap);
8132 int getwapsettings(int argc, char *argv[])
8134 GSM_WAPSettings settings;
8137 settings.location=atoi(argv[0]);
8139 /* Initialise the GSM interface. */
8142 error=GSM->GetWAPSettings(&settings);
8146 fprintf(stdout,_("%s."),argv[0]);
8147 if (!(strcmp(settings.title,""))) fprintf(stdout,_("Set %s\n"),argv[0]);
8148 else fprintf(stdout,_("%s\n"),settings.title);
8149 fprintf(stdout,_("Homepage: %s\n"),settings.homepage);
8150 if (settings.iscontinuous) fprintf(stdout,_("Connection type: continuous\n"));
8151 else fprintf(stdout,_("Connection type: temporary\n"));
8152 if (settings.issecurity) fprintf(stdout,_("Connection security: on\n"));
8153 else fprintf(stdout,_("Connection security: off\n"));
8154 switch (settings.bearer) {
8155 case WAPSETTINGS_BEARER_SMS:
8156 fprintf(stdout,_("Bearer: SMS\n"));
8157 fprintf(stdout,_("Server number: %s\n"),settings.server);
8158 fprintf(stdout,_("Service number: %s\n"),settings.service);
8160 case WAPSETTINGS_BEARER_DATA:
8161 fprintf(stdout,_("Bearer: Data (CSD)\n"));
8162 fprintf(stdout,_("Dial-up number: %s\n"),settings.dialup);
8163 fprintf(stdout,_("IP address: %s\n"),settings.ipaddress);
8164 if (settings.isnormalauthentication) fprintf(stdout,_("Authentication type: normal\n"));
8165 else fprintf(stdout,_("Authentication type: secure\n"));
8166 if (settings.isISDNcall) fprintf(stdout,_("Data call type: ISDN\n"));
8167 else fprintf(stdout,_("Data call type: analogue\n"));
8168 if (settings.isspeed14400) fprintf(stdout,_("Data call speed: 14400\n"));
8169 else fprintf(stdout,_("Data call speed: 9600\n"));
8170 fprintf(stdout,_("User name: %s\n"),settings.user);
8171 fprintf(stdout,_("Password: %s\n"),settings.password);
8173 case WAPSETTINGS_BEARER_USSD:
8174 fprintf(stdout,_("Bearer: USSD\n"));
8175 fprintf(stdout,_("Service code: %s\n"),settings.code);
8176 if (settings.isIP) fprintf(stdout,_("Address type: IP address\nIPaddress: %s\n"),settings.service);
8177 else fprintf(stdout,_("Address type: service number\nService number: %s\n"),settings.service);
8182 fprintf(stderr,_("%s\n"),print_error(error));
8191 /* Not full done now */
8192 int savewapsettings(int argc, char *argv[])
8194 GSM_WAPSettings settings;
8195 GSM_MultiSMSMessage MultiSMS;
8199 settings.location=atoi(argv[0]);
8201 /* Initialise the GSM interface. */
8204 error=GSM->GetWAPSettings(&settings);
8205 // strcpy(settings.homepage,"http://OtherSites/");
8206 // strcpy(settings.title,"Orange");
8212 /* Put settings into SMS structure */
8213 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8215 for (w=0;w<MultiSMS.number;w++)
8216 strcpy(MultiSMS.SMS[w].Destination,"WAPSettings");
8218 GSM_SaveMultiPartSMSOnConsole(&MultiSMS,1,argc,argv,false,false,false,false);
8223 fprintf(stderr,_("%s\n"),print_error(error));
8231 int sendwapsettings(int argc, char *argv[])
8233 GSM_WAPSettings settings;
8234 GSM_MultiSMSMessage MultiSMS;
8238 settings.location=atoi(argv[0]);
8240 /* Initialise the GSM interface. */
8243 error=GSM->GetWAPSettings(&settings);
8244 // strcpy(settings.homepage,"http://OtherSites/");
8245 // strcpy(settings.title,"Orange");
8251 /* Put settings into SMS structure */
8252 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8254 for (w=0;w<MultiSMS.number;w++)
8255 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8257 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8263 fprintf(stderr,_("%s\n"),print_error(error));
8271 int getwapbookmark(int argc, char *argv[])
8273 GSM_WAPBookmark bookmark;
8276 bookmark.location=atoi(argv[0]);
8278 /* Initialise the GSM interface. */
8281 error=GSM->GetWAPBookmark(&bookmark);
8285 if (bookmark.address[0]==0) {
8286 fprintf(stdout,_("Empty bookmark location\n"));
8288 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
8289 if (bookmark.title[0]==0)
8290 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
8292 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
8296 fprintf(stderr,_("%s\n"),print_error(error));
8305 int setwapbookmark(int argc, char *argv[])
8307 GSM_WAPBookmark bookmark;
8310 if (argc == 3) /* if location given, use it */
8311 bookmark.location=atoi(argv[2]);
8312 else /* else use first empty location */
8313 bookmark.location=0xffff;
8315 strcpy(bookmark.title, argv[0]);
8316 strcpy(bookmark.address, argv[1]);
8318 /* Initialise the GSM interface. */
8321 error=GSM->SetWAPBookmark(&bookmark);
8325 fprintf(stdout,_("No errors\n"));
8328 fprintf(stderr,_("%s\n"),print_error(error));
8337 int savewapbookmark(int argc, char *argv[])
8339 GSM_WAPBookmark bookmark;
8340 GSM_MultiSMSMessage MultiSMS;
8344 bookmark.location=atoi(argv[0]);
8346 /* Initialise the GSM interface. */
8349 error=GSM->GetWAPBookmark(&bookmark);
8351 // strcpy(bookmark.title,"tytulagagagagagagagagagagagagagagagagagagagagagend");
8352 // strcpy(bookmark.address,"http://jajajajajajajajajajajajagagagagagagagagagagagagagagagagagagagagagpapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap¥papapapapapapapapagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdstp");
8358 if (bookmark.address[0]==0) {
8359 fprintf(stdout,_("Empty bookmark location\n"));
8364 /* Put bookmark into SMS structure */
8365 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8367 for (w=0;w<MultiSMS.number;w++)
8368 strcpy(MultiSMS.SMS[w].Destination,"WAPBookmark");
8370 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 1,argc,argv,false,false,false,false);
8375 fprintf(stderr,_("%s\n"),print_error(error));
8384 int sendwapbookmark(int argc, char *argv[])
8386 GSM_WAPBookmark bookmark;
8387 GSM_MultiSMSMessage MultiSMS;
8391 bookmark.location=atoi(argv[0]);
8393 /* Initialise the GSM interface. */
8396 error=GSM->GetWAPBookmark(&bookmark);
8401 if (bookmark.address[0]==0) {
8402 fprintf(stdout,_("Empty bookmark location\n"));
8407 /* Put bookmark into SMS structure */
8408 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8410 for (w=0;w<MultiSMS.number;w++)
8411 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8413 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8418 fprintf(stderr,_("%s\n"),print_error(error));
8427 int savecalendarnote(int argc, char *argv[])
8429 GSM_MultiSMSMessage MultiSMS;
8431 GSM_CalendarNote CalendarNote;
8434 number=atoi(argv[1]);
8437 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8441 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
8444 case GE_CANTOPENFILE:
8445 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
8448 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8451 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
8457 /* Put note into SMS structure */
8458 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8460 for (w=0;w<MultiSMS.number;w++)
8461 strcpy(MultiSMS.SMS[w].Destination,"Calendar");
8463 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8468 int sendcalendarnote(int argc, char *argv[])
8470 GSM_MultiSMSMessage MultiSMS;
8472 GSM_CalendarNote CalendarNote;
8475 number=atoi(argv[2]);
8478 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8482 switch ( GSM_ReadVCalendarFile(argv[1], &CalendarNote, &number) ) {
8485 case GE_CANTOPENFILE:
8486 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[1]);
8489 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8492 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[1]);
8498 /* Put note into SMS structure */
8499 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8501 for (w=0;w<MultiSMS.number;w++)
8502 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8504 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8509 /* Example function for continuous receiving SMS */
8510 /* When phone receives SMS, it's read by mygnokii, ID number is created
8511 and SMS is saved to file. After it it's deleted
8512 Checking many errors is also done */
8513 int receivesms(int argc, char *argv[])
8517 GSM_SMSStatus SMSStatus = {0, 0};
8519 int read, location, number;
8520 unsigned char name[50],filename[400];
8521 char nowdate[12]="", nowtime[12]="";
8524 struct CFG_Header *cfg_info;
8526 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
8529 signal(SIGINT, interrupted);
8531 fprintf (stderr, _("Entering monitor mode (press CTRL+C to break)...\n"));
8533 cfg_info=CFG_FindGnokiirc();
8536 if (cfg_info!=NULL) {
8537 if (CFG_Get(cfg_info, "receivesms", "path")) {
8538 strcpy(Dir,CFG_Get(cfg_info, "receivesms", "path"));
8542 fprintf(stderr,_("Path for sms files is \"%s\"\n"),Dir);
8544 fprintf (stderr, _("Initialising GSM interface..."));
8546 /* Initialise the code for the GSM interface. */
8549 fprintf (stderr, _("done\n"));
8553 /* Loop here indefinitely - allows you to see messages from GSM code in
8554 response to unknown messages etc. The loops ends after pressing the
8556 while (!bshutdown) {
8557 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE) {
8558 if (SMSStatus.Number!=0) {
8560 GetMachineDateTime(nowdate, nowtime );
8561 logfile = fopen("log", "a");
8563 fprintf(logfile, _("%s %s SMS Messages: UnRead %d, Number %d\n"),
8564 nowdate, nowtime, SMSStatus.UnRead, SMSStatus.Number);
8571 while (!bshutdown) {
8573 SMS.Location=location;
8574 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
8575 if (SMS.folder==0 || SMS.folder==0x08) { //GST_7110_INBOX
8577 GetMachineDateTime(nowdate, nowtime );
8578 logfile = fopen("log", "a");
8580 fprintf(logfile,_("%s %s SMS on location %i\n"),
8581 nowdate,nowtime,SMS.MessageNumber);
8585 number= 16*(SMS.MessageText[2] >> 4)+ (SMS.MessageText[2] & 0x0f);
8586 number=number+ 256*16*(SMS.MessageText[1] >> 4)+ 256*(SMS.MessageText[1] & 0x0f);
8587 number=number+65536*16*(SMS.MessageText[0] >> 4)+65536*(SMS.MessageText[0] & 0x0f);
8589 sprintf( name, "%07i_%02d%02d%02d_%02d%02d%02d.sms", number,
8590 SMS.Time.Year, SMS.Time.Month, SMS.Time.Day,
8591 SMS.Time.Hour, SMS.Time.Minute, SMS.Time.Second);
8593 strcpy(filename,Dir);
8594 strcat(filename,name);
8596 logfile = fopen("log", "a");
8598 fprintf(logfile,_("%s %s Name is \"%s\"\n"),nowdate,nowtime,filename);
8602 file = fopen(filename, "rb");
8604 file = fopen(filename, "wb");
8606 GetMachineDateTime(nowdate, nowtime );
8607 fprintf(stderr,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8608 logfile = fopen("log", "a");
8610 fprintf(logfile,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8614 fwrite(SMS.MessageText,1,SMS.Length,file);
8620 GetMachineDateTime(nowdate, nowtime );
8621 fprintf(stderr,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8622 logfile = fopen("log", "a");
8624 fprintf(logfile,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8629 SMS.Location=SMS.MessageNumber;
8630 if (GSM->DeleteSMSMessage(&SMS)!=GE_NONE) {
8631 GetMachineDateTime(nowdate, nowtime );
8632 fprintf(stderr,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8633 logfile = fopen("log", "a");
8635 fprintf(logfile,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8643 if (read==SMSStatus.Number) break;
8647 GetMachineDateTime(nowdate, nowtime );
8648 fprintf(stderr,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8649 logfile = fopen("log", "a");
8651 fprintf(logfile,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8659 fprintf (stderr, _("Leaving monitor mode...\n"));
8666 int divert(int argc, char *argv[])
8671 memset(&cd, 0, sizeof(GSM_CallDivert));
8673 if (!strcmp("register", argv[0])){cd.Operation = GSM_CDV_Register ;}
8674 else if (!strcmp("enable" , argv[0])){cd.Operation = GSM_CDV_Enable ;}
8675 else if (!strcmp("disable" , argv[0])){cd.Operation = GSM_CDV_Disable ;}
8676 else if (!strcmp("erasure" , argv[0])){cd.Operation = GSM_CDV_Erasure ;}
8677 else if (!strcmp("query" , argv[0])){cd.Operation = GSM_CDV_Query ;}
8683 if (!strcmp("all" , argv[1])) {cd.DType = GSM_CDV_AllTypes ;}
8684 else if (!strcmp("busy" , argv[1])) {cd.DType = GSM_CDV_Busy ;}
8685 else if (!strcmp("noans" , argv[1])) {cd.DType = GSM_CDV_NoAnswer ;}
8686 else if (!strcmp("outofreach", argv[1])) {cd.DType = GSM_CDV_OutOfReach;}
8692 if (!strcmp("all" , argv[2])) {cd.CType = GSM_CDV_AllCalls ;}
8693 else if (!strcmp("voice", argv[2])) {cd.CType = GSM_CDV_VoiceCalls;}
8694 else if (!strcmp("fax" , argv[2])) {cd.CType = GSM_CDV_FaxCalls ;}
8695 else if (!strcmp("data" , argv[2])) {cd.CType = GSM_CDV_DataCalls ;}
8701 if (argc>3) strcpy(cd.Number, argv[3]);
8703 if (argc>4) cd.Timeout = atoi(argv[4]);
8705 /* Initialise the code for the GSM interface. */
8708 error=GSM->CallDivert(&cd);
8710 if (error == GE_NONE) {
8711 switch (cd.Operation)
8714 fprintf(stdout, _("Divert type: "));
8716 case GSM_CDV_Busy :fprintf(stdout, _("when busy"));break;
8717 case GSM_CDV_NoAnswer :fprintf(stdout, _("when not answered"));break;
8718 case GSM_CDV_OutOfReach:fprintf(stdout, _("when phone off or no coverage"));break;
8719 case GSM_CDV_AllTypes :fprintf(stdout, _("all call diverts"));break; //?
8720 default: fprintf(stdout, _("unknown %i"),cd.DType);break;
8723 fprintf(stdout, _("\nCalls type : "));
8725 case GSM_CDV_VoiceCalls: fprintf(stdout, _("voice"));break;
8726 case GSM_CDV_FaxCalls : fprintf(stdout, _("fax"));break;
8727 case GSM_CDV_DataCalls : fprintf(stdout, _("data"));break;
8728 case GSM_CDV_AllCalls : fprintf(stdout, _("voice, fax & data"));break;
8729 default: fprintf(stdout, _("unknown %i"),cd.CType);break;
8731 fprintf(stdout, _("\n"));
8734 fprintf(stdout, _("Status : active\n"));
8735 fprintf(stdout, _("Timeout : %i seconds\n"),cd.Timeout);
8736 fprintf(stdout, _("Number : %s\n"),cd.Number);
8738 fprintf(stdout, _("Status : deactivated\n"));
8743 fprintf(stdout,_("Divert done\n"));
8746 fprintf(stderr,_("%s\n"),print_error(error));
8753 int savephonebookentry(int argc, char *argv[])
8755 GSM_MultiSMSMessage MultiSMS;
8756 GSM_PhonebookEntry entry;
8762 /* Handle command line args that set type, start and end locations. */
8763 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
8765 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
8769 entry.Location=atoi(argv[1]);
8773 error=GSM->GetMemoryLocation(&entry);
8778 /* Put entry into SMS structure */
8779 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT) {
8780 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8782 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8785 for (w=0;w<MultiSMS.number;w++)
8786 strcpy(MultiSMS.SMS[w].Destination,"Phonebook");
8788 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8792 fprintf(stdout,_("Error\n"));break;
8798 int sendphonebookentry(int argc, char *argv[])
8800 GSM_MultiSMSMessage MultiSMS;
8801 GSM_PhonebookEntry entry;
8807 /* Handle command line args that set type, start and end locations. */
8808 if (!GetMemoryTypeID(argv[1], &entry.MemoryType))
8810 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
8814 entry.Location=atoi(argv[2]);
8818 error=GSM->GetMemoryLocation(&entry);
8823 /* Put entry into SMS structure */
8824 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT) {
8825 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8827 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8830 for (w=0;w<MultiSMS.number;w++)
8831 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8833 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8838 fprintf(stdout,_("Error\n"));break;
8845 int getbinringfromfile(int argc, char *argv[])
8850 GSM_BinRingtone binring,ringtone;
8852 fprintf(stdout,_("Offset %ld\n"),atol(argv[2]));
8854 file = fopen(argv[0], "rb");
8856 if (!file) return(GE_CANTOPENFILE);
8858 fseek(file,atol(argv[2]),0);
8860 ringtone.length=fread(ringtone.frame, 1, 900, file);
8866 if (ringtone.frame[i ]==0x00 && ringtone.frame[i+1]==0x02 &&
8867 ringtone.frame[i+2]==0xFC && ringtone.frame[i+3]==0x09) {
8872 if (i==ringtone.length-3) break;
8876 fprintf(stdout,_("Start not found\n"));
8882 if (ringtone.frame[j]==0x07 && ringtone.frame[j+1]==0x0B) {
8887 if (j==ringtone.length-2) break;
8891 fprintf(stdout,_("End not found\n"));
8896 binring.frame[binring.length++]=0x00;
8897 binring.frame[binring.length++]=0x00;
8898 binring.frame[binring.length++]=0x0C;
8899 binring.frame[binring.length++]=0x01;
8900 binring.frame[binring.length++]=0x2C;
8902 memcpy(binring.frame+binring.length,argv[1],strlen(argv[1]));
8903 binring.length=binring.length+strlen(argv[1]);
8905 binring.frame[binring.length++]=0x00;
8907 memcpy(binring.frame+binring.length,ringtone.frame+i,j-i+2);
8908 binring.length=binring.length+j-i+2;
8910 GSM_SaveBinRingtoneFile(argv[3], &binring);