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 default: return "Unknown error.";
268 GSM_Error GSM_ReadRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
272 error=GSM_ReadRingtoneFile(FileName, ringtone);
275 case GE_CANTOPENFILE:
276 case GE_SUBFORMATNOTSUPPORTED:
277 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
286 GSM_Error GSM_SaveRingtoneFileOnConsole(char *FileName, GSM_Ringtone *ringtone)
288 int confirm,confirm2;
293 /* Ask before overwriting */
294 while (stat(FileName, &buf) == 0) {
299 while (confirm < 0) {
300 fprintf(stderr, _("Saving ringtone. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
301 GetLine(stdin, ans, 4);
302 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
303 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
304 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
306 if (confirm==1) break;
308 while (confirm2 < 0) {
309 fprintf(stderr, _("Enter name of new file: "));
310 GetLine(stdin, FileName, 50);
311 if (&FileName[0]==0) return GE_USERCANCELED;
317 error=GSM_SaveRingtoneFile(FileName,ringtone);
320 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
328 GSM_Error GSM_ReadBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
332 error=GSM_ReadBitmapFile(FileName, bitmap);
335 case GE_CANTOPENFILE:
336 case GE_WRONGNUMBEROFCOLORS:
338 case GE_INVALIDFILEFORMAT:
339 case GE_SUBFORMATNOTSUPPORTED:
341 case GE_INVALIDIMAGESIZE:
342 fprintf(stderr, _("File \"%s\"\nError: %s\n"),FileName,print_error(error));
351 GSM_Error GSM_SaveBitmapFileOnConsole(char *FileName, GSM_Bitmap *bitmap)
353 int confirm,confirm2;
358 /* Ask before overwriting */
359 while (stat(FileName, &buf) == 0) {
364 while (confirm < 0) {
365 fprintf(stderr, _("Saving logo. File \"%s\" exists. (O)verwrite, create (n)ew or (s)kip ? "),FileName);
366 GetLine(stdin, ans, 4);
367 if (!strcmp(ans, "O") || !strcmp(ans, "o")) confirm = 1;
368 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm = 2;
369 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return GE_USERCANCELED;
371 if (confirm==1) break;
373 while (confirm2 < 0) {
374 fprintf(stderr, _("Enter name of new file: "));
375 GetLine(stdin, FileName, 50);
376 if (&FileName[0]==0) return GE_USERCANCELED;
382 error=GSM_SaveBitmapFile(FileName,bitmap);
385 case GE_CANTOPENFILE: fprintf(stderr, _("Failed to write file \"%s\"\n"),FileName);
393 /* mode == 0 -> overwrite
395 * mode == 2 -> append
397 int GSM_SaveTextFileOnConsole(char *FileName, char *text, int mode)
399 int confirm, confirm2;
404 /* Ask before overwriting */
406 while (stat(FileName, &buf) == 0 && mode==1) {
411 while (confirm < 0) {
412 fprintf(stderr, _("File \"%s\" exists. (O)verwrite, (a)ppend, create (n)ew or (s)kip ? "),FileName);
413 GetLine(stdin, ans, 4);
414 if (!strcmp(ans, "O") || !strcmp(ans, "o")) {
418 if (!strcmp(ans, "A") || !strcmp(ans, "a")) {
422 if (!strcmp(ans, "N") || !strcmp(ans, "n")) confirm=2;
423 if (!strcmp(ans, "S") || !strcmp(ans, "s")) return -1;
427 while (confirm2 < 0) {
428 fprintf(stderr, _("Enter name of new file: "));
429 GetLine(stdin, FileName, 50);
430 if (&FileName[0]==0) return -1;
439 error=GSM_SaveTextFile(FileName, text, mode);
442 case -1: fprintf(stderr, _("Failed to write file \"%s\"\n"), FileName);
450 int GSM_SendMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
451 bool unicode, bool profile, bool scale) {
455 struct option options[] = {
456 { "smscno", required_argument, NULL, '1'},
457 { "smsc", required_argument, NULL, '2'},
458 { "name", required_argument, NULL, '3'},
459 { "unicode", no_argument, NULL, '4'},
460 { "profilestyle", no_argument, NULL, '5'},
461 { "scale", no_argument, NULL, '6'},
467 for (w=0;w<MultiSMS->number;w++) {
472 /* We check optional parameters from ... */
475 while ((i = getopt_long(argc, argv, "v:ds", options, NULL)) != -1) {
478 case '1': /* SMSC number */
479 MultiSMS->SMS[w].MessageCenter.No = 0;
480 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
483 case '2': /* SMSC number index in phone memory */
484 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
486 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
487 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
493 case '3': /* Receiver/recipient */
494 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
496 case '4': /* Unicode */
499 case '5': /* Profile */
502 case '6': /* Scale */
505 case 'v': /* Set validaty of SMS */
506 MultiSMS->SMS[w].Validity = atoi(optarg);
509 case 'd': /* delivery report */
510 MultiSMS->SMS[w].Type=GST_DR;
513 case 's': /* Set replying via the same SMSC */
514 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
517 fprintf(stderr,_("Unknown option number %i\n"),argc);
525 error=GSM->SendSMSMessage(&MultiSMS->SMS[w]);
527 if (error == GE_SMSSENDOK) {
528 fprintf(stdout, _("SMS %i/%i sent OK !\n"),w+1,MultiSMS->number);
530 fprintf(stdout, _("SMS %i/%i, sending failed (error=%d)\n"),w+1,MultiSMS->number, error);
540 int GSM_SaveMultiPartSMSOnConsole(GSM_MultiSMSMessage *MultiSMS, int argnum, int argc, char *argv[],
541 bool inter, bool unicode, bool profile, bool scale) {
545 GSM_SMSMessage SMSold;
547 struct option options[] = {
548 { "smscno", required_argument, NULL, '1'},
549 { "smsc", required_argument, NULL, '2'},
550 { "name", required_argument, NULL, '3'},
551 { "unicode", no_argument, NULL, '4'},
552 { "profilestyle", no_argument, NULL, '5'},
553 { "scale", no_argument, NULL, '6'},
565 for (w=0;w<MultiSMS->number;w++) {
570 /* We check optional parameters from ... */
573 while ((i = getopt_long(argc, argv, "risal:", options, NULL)) != -1) {
576 case '1': /* SMSC number */
577 MultiSMS->SMS[w].MessageCenter.No = 0;
578 strcpy(MultiSMS->SMS[w].MessageCenter.Number,optarg);
581 case '2': /* SMSC number index in phone memory */
582 MultiSMS->SMS[w].MessageCenter.No = atoi(optarg);
584 if (MultiSMS->SMS[w].MessageCenter.No < 1 || MultiSMS->SMS[w].MessageCenter.No > 5) {
585 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
591 case '3': /* Receiver/recipient */
592 strncpy(MultiSMS->SMS[w].Destination,optarg,11); break;
594 case '4': /* Unicode */
597 case '5': /* Profile */
600 case '6': /* Scale */
603 case 'r': /* mark as read */
604 MultiSMS->SMS[w].Status = GSS_SENTREAD; break;
606 case 'i': /* Save into Inbox */
607 MultiSMS->SMS[w].folder = GST_INBOX; break;
609 case 's': /* Set replying via the same SMSC */
610 MultiSMS->SMS[w].ReplyViaSameSMSC = true; break;
612 case 'a': /* Ask before overwriting */
613 interactive=true;break;
615 case 'l': /* Specify location */
616 MultiSMS->SMS[0].Location = atoi(optarg); break;
619 fprintf(stderr,_("Unknown option number %i\n"),argc);
626 if (interactive && MultiSMS->SMS[0].Location!=0 && w==0) {
627 SMSold.Location=MultiSMS->SMS[0].Location;
628 error = GSM->GetSMSMessage(&SMSold);
631 fprintf(stderr, _("Message at specified location exists. "));
632 while (confirm < 0) {
633 fprintf(stderr, _("Overwrite? (yes/no) "));
634 GetLine(stdin, ans, 7);
635 if (!strcmp(ans, "yes")) confirm = 1;
636 if (!strcmp(ans, "no")) confirm = 0;
638 if (!confirm) { GSM->Terminate(); return 0; }
640 case GE_INVALIDSMSLOCATION:
641 fprintf(stderr, _("Invalid location\n"));
645 /* FIXME: Remove this fprintf when the function is thoroughly tested */
647 fprintf(stderr, _("Location %d empty. Saving\n"), SMS[w].Location);
653 error=GSM->SaveSMSMessage(&MultiSMS->SMS[w]);
655 if (error == GE_NONE)
656 fprintf(stdout, _("SMS %i/%i saved at location %i !\n"),w+1,MultiSMS->number,MultiSMS->SMS[w].MessageNumber);
658 fprintf(stdout, _("SMS %i/%i saving failed (error=%d, location=%i)\n"), w+1, MultiSMS->number, error,MultiSMS->SMS[w].Location);
666 void GSM_PlayRingtoneOnConsole(GSM_Ringtone *ringtone)
673 for (i=0;i<ringtone->NrNotes;i++) {
680 GSM_PlayOneNote (ringtone->notes[i]);
682 GSM->PlayTone(255*255,0);
685 /* This function shows the copyright and some informations usefull for
690 fprintf(stdout, _("GNOKII Version %s\n"
691 "Copyright (C) Hugh Blemings <hugh@linuxcare.com>, 1999, 2000\n"
692 "Copyright (C) Pavel JanÃk ml. <Pavel.Janik@linux.cz>, 1999, 2000\n"
693 "Built %s %s for %s on %s \n"), VERSION, __TIME__, __DATE__, model, Port);
698 /* The function usage is only informative - it prints this program's usage and
699 command-line options. */
704 fprintf(stdout, _(" usage: gnokii [--help|--monitor [-noloop|-nl]|--version]\n"
705 " gnokii --getmemory memory_type [start [end]] [-short|-v30|-v21|-v]\n"
706 " gnokii --writephonebook [-i]\n"
707 " gnokii --sendphonebookentry destination memory_type location\n"
708 " [--smsc message_center_number] [--smscno message_center_index]\n"
709 " [-s] [-v n] [-d]\n"
710 " gnokii --savephonebookentry memory_type location\n"
711 " [--smsc message_center_number] [--smscno message_center_index]\n"
712 " [-r] [-i] [-s] [-a] [--name name]\n"
713 " gnokii --getvoicemailbox\n"
714 " gnokii --getspeeddial number\n"
715 " gnokii --setspeeddial number memory_type location\n\n"
717 " gnokii --getsms memory_type start [end] [-f file]\n"
718 " gnokii --getsmsstatus\n"
719 " gnokii --getsmsfolders\n"
720 " gnokii --deletesms memory_type start [end]\n"
721 " gnokii --sendsms destination [--smsc message_center_number |\n"
722 " --smscno message_center_index] [--long n] [-s] [-C n]\n"
723 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
724 " --enableemail|--disableemail|--void][--unicode][-v n][-d]\n"
725 " gnokii --savesms destination|\"\" [--smsc \n"
726 " message_center_number] [--smscno message_center_index]\n"
727 " [--long n] [-r] [-i] [-s][-C n][-a][-l][F n][--smsname name]\n"
728 " [--enablevoice|--disablevoice|--enablefax|--disablefax|\n"
729 " --enableemail|--disableemail|--void|--hang|--bug][--unicode]\n"
730 " gnokii --receivesms\n"
731 " gnokii --getsmsc message_center_number\n"
732 " gnokii --renamesmsc number new_name\n\n"
734 " gnokii --setdatetime [YYYY [MM [DD [HH [MM]]]]]\n"
735 " gnokii --getdatetime\n"
736 " gnokii --setalarm HH MM\n"
737 " gnokii --getalarm\n\n"
739 " gnokii --getcalendarnote { start end [-v30|-v10] | --short|-s }\n"
740 " gnokii --writecalendarnote vcardfile number\n"
741 " gnokii --deletecalendarnote index\n"
742 " gnokii --sendcalendarnote destination vcardfile number\n"
743 " [--smsc message_center_number] [--smscno message_center_index]\n"
744 " [-s] [-v n] [-d]\n"
745 " gnokii --savecalendarnote vcardfile number\n"
746 " [--smsc message_center_number] [--smscno message_center_index]\n"
747 " [-r] [-i] [-s] [-a] [--name name]\n\n"
749 " gnokii --netmonitor {reset|off|field|devel|next|nr}\n"
750 " gnokii --nm_collect screen1|-d [screen2|-d]...\n"
751 " gnokii --netmonitordata [-S file] [-I file] [-h] [-n n] [-ts n][-tm n]\n"
752 " [-fs str] [-ls str] FLD1:FLD2:FLDn:... \n"
753 " (see files netmonitordata_????_??? for details)\n\n"
755 " gnokii --bitmapconvert source destination\n"
756 " gnokii --bitmapconvert source destination op|7110op [network code]\n"
757 " gnokii --bitmapconvert source destination caller [caller group number]\n"
758 " gnokii --bitmapconvert source destination\n"
759 " startup|7110startup|6210startup\n"
760 " gnokii --bitmapconvert source destination picture\n"
761 " gnokii --showbitmap logofile\n"
762 " gnokii --sendlogo op destination logofile network_code\n"
763 " [--smsc message_center_number] [--smscno message_center_index]\n"
764 " [-s] [-v n] [-d]\n"
765 " gnokii --sendlogo picture destination logofile text\n"
766 " [--smsc message_center_number] [--smscno message_center_index]\n"
767 " [-s] [-v n] [-d] [--unicode]\n"
768 " gnokii --sendlogo screensaver destination logofile\n"
769 " [--smsc message_center_number] [--smscno message_center_index]\n"
770 " [-s] [-v n] [-d]\n"
771 " gnokii --sendlogo caller destination logofile\n"
772 " [--smsc message_center_number] [--smscno message_center_index]\n"
773 " [-s] [-v n] [-d]\n"
774 " gnokii --savelogo op logofile network_code\n"
775 " [--smsc message_center_number] [--smscno message_center_index]\n"
776 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
777 " gnokii --savelogo picture logofile text\n"
778 " [--smsc message_center_number] [--smscno message_center_index]\n"
779 " [-r] [-i] [-s] [-a] [-l] [--name name] [--unicode]\n"
780 " gnokii --savelogo screensaver logofile\n"
781 " [--smsc message_center_number] [--smscno message_center_index]\n"
782 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
783 " gnokii --savelogo caller logofile\n"
784 " [--smsc message_center_number] [--smscno message_center_index]\n"
785 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
786 " gnokii --setlogo op|7110op [logofile] [network code]\n"
787 " gnokii --setlogo startup|7110startup|6210startup [logofile]\n"
788 " gnokii --setlogo startup 1|2|3\n"
789 " gnokii --setlogo caller [logofile] [caller group number] [group name]\n"
790 " gnokii --setlogo picture [logofile] [number] [text] [sender]\n"
791 " gnokii --setlogo {dealer|text} [text]\n"
792 " gnokii --getlogo op|7110op [logofile] [network code]\n"
793 " gnokii --getlogo startup|7110startup|6210startup [logofile]\n"
794 " gnokii --getlogo caller [logofile][caller group number]\n"
795 " gnokii --getlogo picture [logofile][number]\n"
796 " gnokii --getlogo {dealer|text}\n\n"
798 " gnokii --sendringtone destination ringtonefile\n"
799 " [--smsc message_center_number] [--smscno message_center_index]\n"
800 " [-s] [-v n] [-d] [--scale] [--profilestyle]\n"
801 " gnokii --saveringtone ringtonefile\n"
802 " [--smsc message_center_number] [--smscno message_center_index]\n"
803 " [-r] [-i] [-s] [-a] [--name name] [--scale] [--profilestyle]\n"
804 " gnokii --setringtone ringtonefile [location]\n"
805 " gnokii --getringtone ringtonefile [location]\n"
806 " gnokii --ringtoneconvert source destination\n"
807 " gnokii --binringtoneconvert source destination\n"
808 " gnokii --playringtone ringtonefile\n"
809 " gnokii --composer ringtonefile\n"
810 " gnokii --allringtones\n\n"
812 " gnokii --getprofile [number]\n"
813 " gnokii --setprofile number feature value\n"
814 " gnokii --sendprofile destination profile_name ringtonefile\n"
815 " picturefile [--smsc message_center_number]\n"
816 " [--smscno message_center_index] [-s] [-v n] [-d] [--scale]\n\n"
818 " gnokii --reset [soft|hard]\n"
819 " gnokii --dialvoice number\n"
820 " gnokii --cancelcall\n"
821 " gnokii --displayoutput\n"
822 " gnokii --presskeysequence sequence\n"
823 " gnokii --backupsettings file\n"
824 " gnokii --restoresettings file\n"
825 " gnokii --getphoneprofile\n"
826 " gnokii --setphoneprofile feature value\n"
827 " gnokii --getoperatorname\n"
828 " gnokii --setoperatorname code name\n"
829 " gnokii --senddtmf string\n"
830 " gnokii --divert register|enable|query|disable|erasure\n"
831 " all|busy|noans|outofreach all|voice|fax|data\n"
832 " [number timeout]\n\n"
834 " gnokii --phonetests\n"
835 " gnokii --simlock\n"
836 " gnokii --getdisplaystatus\n"
837 " gnokii --identify\n\n"
839 " gnokii --getwapbookmark location\n"
840 " gnokii --setwapbookmark title url [location]\n"
841 " gnokii --sendwapbookmark location destination\n"
842 " [--smsc message_center_number] [--smscno message_center_index]\n"
843 " [-s] [-v n] [-d]\n"
844 " gnokii --savewapbookmark location\n"
845 " [--smsc message_center_number] [--smscno message_center_index]\n"
846 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
847 " gnokii --getwapsettings location\n"
848 " gnokii --savewapsettings location\n"
849 " [--smsc message_center_number] [--smscno message_center_index]\n"
850 " [-r] [-i] [-s] [-a] [-l] [--name name]\n"
851 " gnokii --sendwapsettings location destination\n"
852 " [--smsc message_center_number] [--smscno message_center_index]\n"
853 " [-s] [-v n] [-d]\n"
858 "\n gnokii --entersecuritycode PIN|PIN2|PUK|PUK2\n"
859 " gnokii --getsecuritycodestatus\n"
860 " gnokii --getsecuritycode PIN|PIN2|PUK|PUK2|SecurityCode\n"
861 " gnokii --geteeprom\n"
862 " gnokii --resetphonesettings\n"
868 " gnokii --sniff [port]\n"
869 " gnokii --decodefile file\n"
870 " gnokii --getbinringfromfile file name offset file2\n"
877 /* fbusinit is the generic function which waits for the FBUS link. The limit
878 is 10 seconds. After 10 seconds we quit. */
880 void fbusinit(void (*rlp_handler)(RLP_F96Frame *frame))
887 if (strcmp(GetMygnokiiVersion(),VERSION)!=0)
888 fprintf(stderr,_("WARNING: version of installed libmygnokii.so (%s) is different to version of gnokii (%s)\n"),GetMygnokiiVersion(),VERSION);
891 /* Initialise the code for the GSM interface. */
892 error = GSM_Initialise(model, Port, Initlength, GetConnectionTypeFromString(Connection), rlp_handler, SynchronizeTime);
894 if (error != GE_NONE) {
895 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
899 /* First (and important!) wait for GSM link to be active. We allow 10
901 while (count++ < 200 && *GSM_LinkOK == false)
904 if (*GSM_LinkOK == false) {
905 fprintf (stderr, _("Hmmm... GSM_LinkOK never went true. Quitting.\n"));
910 /* This function checks that the argument count for a given options is withing
913 int checkargs(int opt, struct gnokii_arg_len gals[], int argc)
918 /* Walk through the whole array with options requiring arguments. */
920 for(i = 0;!(gals[i].gal_min == 0 && gals[i].gal_max == 0); i++) {
922 /* Current option. */
924 if(gals[i].gal_opt == opt) {
926 /* Argument count checking. */
928 if(gals[i].gal_flags == GAL_XOR) {
929 if(gals[i].gal_min == argc || gals[i].gal_max == argc) return 0;
932 if(gals[i].gal_min <= argc && gals[i].gal_max >= argc) return 0;
941 /* We do not have options without arguments in the array, so check them. */
943 if (argc==0) return 0;
947 /* Main function - handles command line arguments, passes them to separate
948 functions accordingly. */
950 int main(int argc, char *argv[])
957 /* Every option should be in this array. */
959 static struct option long_options[] =
962 { "help", no_argument, NULL, OPT_HELP },// Display usage.
963 { "version", no_argument, NULL, OPT_VERSION },// Display version and build information.
964 { "getsmsfolders", no_argument, NULL, OPT_GETSMSFOLDERS },// Gets SMS folders
965 { "getsmsstatus", no_argument, NULL, OPT_GETSMSSTATUS },// Get SMS Folder Status
966 { "identify", no_argument, NULL, OPT_IDENTIFY },// Identify
967 { "pmon", no_argument, NULL, OPT_PMON },// For development purposes: run in passive monitoring mode
968 { "foogle", no_argument, NULL, OPT_FOOGLE },// For development purposes: insert you function calls here
969 { "getdatetime", no_argument, NULL, OPT_GETDATETIME },// Get date and time mode
970 { "getalarm", no_argument, NULL, OPT_GETALARM },// Get alarm
971 { "cancelcall", no_argument, NULL, OPT_CANCELCALL },// Cancel Call
972 { "getdisplaystatus", no_argument, NULL, OPT_GETDISPLAYSTATUS },// Get display status mode
973 { "allringtones", no_argument, NULL, OPT_ALLRINGTONES },/* Displays names of available ringtones */
974 { "displayoutput", no_argument, NULL, OPT_DISPLAYOUTPUT },/* Show texts from phone's display */
975 { "getphoneprofile", no_argument, NULL, OPT_GETPHONEPROFILE },/* Get/Set phone profile settings */
976 { "getoperatorname", no_argument, NULL, OPT_GETOPERATORNAME },/* Get downloaded operator name */
977 { "getvoicemailbox", no_argument, NULL, OPT_GETVOICEMAILBOX },/* Gets voice mailbox number */
978 { "phonetests", no_argument, NULL, OPT_PHONETESTS },
979 { "simlockinfo", no_argument, NULL, OPT_SIMLOCKINFO },
980 { "receivesms", no_argument, NULL, OPT_RECEIVESMS },
981 { "setoperatorname", optional_argument, NULL, OPT_SETOPERATORNAME },/* Set downloaded operator name */
982 { "setdatetime", optional_argument, NULL, OPT_SETDATETIME },// Set date and time
983 { "writephonebook", optional_argument, NULL, OPT_WRITEPHONEBOOK },// Write phonebook (memory) mode
984 { "reset", optional_argument, NULL, OPT_RESET },// Resets the phone
985 { "monitor", optional_argument, NULL, OPT_MONITOR },// Monitor mode
986 { "setlogo", optional_argument, NULL, OPT_SETLOGO },// Set logo
987 { "getprofile", optional_argument, NULL, OPT_GETPROFILE },// Show profile
988 { "setalarm", required_argument, NULL, OPT_SETALARM },// Set alarm
989 { "dialvoice", required_argument, NULL, OPT_DIALVOICE },// Voice call mode
990 { "getcalendarnote", required_argument, NULL, OPT_GETCALENDARNOTE },// Get calendar note mode
991 { "writecalendarnote", required_argument, NULL, OPT_WRITECALENDARNOTE},// Write calendar note mode
992 { "sendcalendarnote", required_argument, NULL, OPT_SENDCALENDARNOTE },
993 { "savecalendarnote", required_argument, NULL, OPT_SAVECALENDARNOTE },
994 { "sendphonebookentry", required_argument, NULL, OPT_SENDPHONEBOOKENTRY},
995 { "savephonebookentry", required_argument, NULL, OPT_SAVEPHONEBOOKENTRY},
996 { "deletecalendarnote", required_argument, NULL, OPT_DELCALENDARNOTE },// Delete calendar note mode
997 { "getmemory", required_argument, NULL, OPT_GETMEMORY },// Get memory mode
998 { "getspeeddial", required_argument, NULL, OPT_GETSPEEDDIAL },// Get speed dial mode
999 { "setspeeddial", required_argument, NULL, OPT_SETSPEEDDIAL },// Set speed dial mode
1000 { "getsms", required_argument, NULL, OPT_GETSMS },// Get SMS message mode
1001 { "deletesms", required_argument, NULL, OPT_DELETESMS },// Delete SMS message mode
1002 { "sendsms", required_argument, NULL, OPT_SENDSMS },// Send SMS message mode
1003 { "savesms", required_argument, NULL, OPT_SAVESMS },// Save SMS message mode
1004 { "sendlogo", required_argument, NULL, OPT_SENDLOGO },// Send logo as SMS message mode
1005 { "savelogo", required_argument, NULL, OPT_SAVELOGO },// Save logo on SIM
1006 { "sendringtone", required_argument, NULL, OPT_SENDRINGTONE },// Send ringtone as SMS message
1007 { "saveringtone", required_argument, NULL, OPT_SAVERINGTONE },// Saves ringtone on SIM
1008 { "setringtone", required_argument, NULL, OPT_SETRINGTONE },// Set ringtone
1009 { "getringtone", required_argument, NULL, OPT_GETRINGTONE },// Get bin/normal ringtone
1010 { "presskeysequence", required_argument, NULL, OPT_PRESSKEYSEQUENCE },/* Presses keys in phone's display */
1011 { "getsmsc", required_argument, NULL, OPT_GETSMSC },// Get SMS center number mode
1012 { "renamesmsc", required_argument, NULL, OPT_RENAMESMSC },// Rename SMSC
1013 { "netmonitor", required_argument, NULL, OPT_NETMONITOR },// NetMonitor mode
1014 { "senddtmf", required_argument, NULL, OPT_SENDDTMF },// Send DTMF sequence
1015 { "getlogo", required_argument, NULL, OPT_GETLOGO },// Get logo
1016 { "setprofile", required_argument, NULL, OPT_SETPROFILE },// Set profile feature
1017 { "sendprofile", required_argument, NULL, OPT_SENDPROFILE },// Send profile via SMS
1018 { "setphoneprofile", required_argument, NULL, OPT_SETPHONEPROFILE },/* Get/Set phone profile settings */
1019 { "restoresettings", required_argument, NULL, OPT_RESTORESETTINGS },//Restore various settings from one file
1020 { "backupsettings", required_argument, NULL, OPT_BACKUPSETTINGS },//Backup various settings to one file
1021 { "playringtone", required_argument, NULL, OPT_PLAYRINGTONE },/* Plays ringtones */
1022 { "composer", required_argument, NULL, OPT_COMPOSER },/* Shows ringtone like in Nokia Composer */
1023 { "ringtoneconvert", required_argument, NULL, OPT_RINGTONECONVERT },/* Convert ringtone files */
1024 { "binringtoneconvert", required_argument, NULL, OPT_BINRINGTONECONVERT},/* Convert binary ringtone files */
1025 { "bitmapconvert", required_argument, NULL, OPT_BITMAPCONVERT },/* Convert bitmap files */
1026 { "showbitmap", required_argument, NULL, OPT_SHOWBITMAP },
1027 { "nm_collect", required_argument, NULL, OPT_NM_COLLECT },// NetMonitor periodical data collection mode (newbiee)
1028 { "netmonitordata", required_argument, NULL, OPT_NETMONITORDATA },// NetMonitor periodical data collection mode (advanced)
1029 { "getwapbookmark", required_argument, NULL, OPT_GETWAPBOOKMARK },
1030 { "setwapbookmark", required_argument, NULL, OPT_SETWAPBOOKMARK },
1031 { "savewapbookmark", required_argument, NULL, OPT_SAVEWAPBOOKMARK },
1032 { "savewapsettings", required_argument, NULL, OPT_SAVEWAPSETTINGS },
1033 { "sendwapsettings", required_argument, NULL, OPT_SENDWAPSETTINGS },
1034 { "sendwapbookmark", required_argument, NULL, OPT_SENDWAPBOOKMARK },
1035 { "getwapsettings", required_argument, NULL, OPT_GETWAPSETTINGS },
1036 { "divert", required_argument, NULL, OPT_DIVERT },
1039 { "entersecuritycode", required_argument, NULL, OPT_ENTERSECURITYCODE },// Enter Security Code mode
1040 { "getsecuritycode", required_argument, NULL, OPT_GETSECURITYCODE },// Get Security Code
1041 { "getsecuritycodestatus",no_argument, NULL, OPT_GETSECURITYCODESTATUS},// Get Security Code status
1042 { "geteeprom", no_argument, NULL, OPT_GETEEPROM },// Gets EEPROM
1043 { "resetphonesettings", no_argument, NULL, OPT_RESETPHONESETTINGS },// Reset phone settings
1044 { "setsimlock", no_argument, NULL, OPT_SETSIMLOCK },// Sets simlock
1048 { "sniff", optional_argument, NULL, OPT_SNIFFER },// Will show datas from port
1049 { "decodefile", required_argument, NULL, OPT_DECODEFILE },//decode input file
1050 { "getbinringfromfile", required_argument, NULL, OPT_GETBINRINGFROMFILE },
1056 /* Every command which requires arguments should have an appropriate entry
1059 struct gnokii_arg_len gals[] =
1062 { OPT_MONITOR, 0, 1, 0 },
1065 { OPT_ENTERSECURITYCODE, 1, 1, 0 },
1066 { OPT_GETSECURITYCODE, 1, 1, 0 },
1070 { OPT_SNIFFER, 0, 1, 0 },
1071 { OPT_DECODEFILE, 1, 1, 0 },
1072 { OPT_GETBINRINGFROMFILE,4, 4, 0 },
1075 { OPT_SETDATETIME, 0, 5, 0 },
1076 { OPT_BACKUPSETTINGS, 1, 1, 0 },
1077 { OPT_RESTORESETTINGS, 1, 1, 0 },
1078 { OPT_SETALARM, 2, 2, 0 },
1079 { OPT_DIALVOICE, 1, 1, 0 },
1080 { OPT_GETCALENDARNOTE, 1, 3, 0 },
1081 { OPT_WRITECALENDARNOTE, 2, 2, 0 },
1082 { OPT_SAVECALENDARNOTE, 2, 9, 0 },
1083 { OPT_SENDCALENDARNOTE, 3, 9, 0 },
1084 { OPT_SAVEPHONEBOOKENTRY,2, 9, 0 },
1085 { OPT_SENDPHONEBOOKENTRY,3, 9, 0 },
1086 { OPT_DELCALENDARNOTE, 1, 1, 0 },
1087 { OPT_GETMEMORY, 2, 4, 0 },
1088 { OPT_GETSPEEDDIAL, 1, 1, 0 },
1089 { OPT_SETSPEEDDIAL, 3, 3, 0 },
1090 { OPT_GETSMS, 2, 5, 0 },
1091 { OPT_DELETESMS, 2, 3, 0 },
1092 { OPT_SENDSMS, 1,10, 0 },
1093 { OPT_SAVESMS, 1,11, 0 },
1094 { OPT_SENDLOGO, 3, 9, 0 },
1095 { OPT_SAVELOGO, 2,10, 0 },
1096 { OPT_SENDRINGTONE, 2, 7, 0 },
1097 { OPT_SAVERINGTONE, 1, 9, 0 },
1098 { OPT_GETSMSC, 1, 1, 0 },
1099 { OPT_RENAMESMSC, 2, 2, 0 },
1100 { OPT_NETMONITOR, 1, 1, 0 },
1101 { OPT_SENDDTMF, 1, 1, 0 },
1102 { OPT_SETLOGO, 1, 5, 0 },
1103 { OPT_GETLOGO, 1, 4, 0 },
1104 { OPT_SETRINGTONE, 1, 3, 0 },
1105 { OPT_GETRINGTONE, 1, 2, 0 },
1106 { OPT_PRESSKEYSEQUENCE, 1, 1, 0 },
1107 { OPT_RESET, 0, 1, 0 },
1108 { OPT_GETPROFILE, 0, 1, 0 },
1109 { OPT_SETPROFILE, 3, 3, 0 },
1110 { OPT_SENDPROFILE, 4,10, 0 },
1111 { OPT_WRITEPHONEBOOK, 0, 1, 0 },
1112 { OPT_PLAYRINGTONE, 1, 1, 0 },
1113 { OPT_COMPOSER, 1, 1, 0 },
1114 { OPT_RINGTONECONVERT, 2, 2, 0 },
1115 { OPT_BINRINGTONECONVERT,2, 2, 0 },
1116 { OPT_BITMAPCONVERT, 2, 4, 0 },
1117 { OPT_SHOWBITMAP, 1, 1, 0 },
1118 { OPT_SETOPERATORNAME, 0, 2, 0 },
1119 { OPT_SETPHONEPROFILE, 2, 2, 0 },
1120 { OPT_NM_COLLECT, 1, MAX_NM_COLLECT, 0 },
1121 { OPT_NETMONITORDATA, 0,99, 0 },
1122 { OPT_GETWAPBOOKMARK, 1, 1, 0 },
1123 { OPT_SETWAPBOOKMARK, 2, 3, 0 },
1124 { OPT_SAVEWAPBOOKMARK, 1, 9, 0 },
1125 { OPT_SENDWAPBOOKMARK, 2, 9, 0 },
1126 { OPT_GETWAPSETTINGS, 1, 1, 0 },
1127 { OPT_SAVEWAPSETTINGS, 1, 9, 0 },
1128 { OPT_SENDWAPSETTINGS, 2, 9, 0 },
1129 { OPT_DIVERT, 3, 5, 0 },
1136 /* For GNU gettext */
1140 textdomain("gnokii");
1141 setlocale(LC_ALL, "pl_PL"); //here is string for Polish localisation
1143 setlocale(LC_ALL, ".852"); //Polish codepage for console, not "real" WIN CP
1148 /* Read config file */
1149 if (CFG_ReadConfig(&model, &Port, &Initlength, &Connection, &BinDir, &SynchronizeTime,false) < 0) {
1153 /* Handle command line arguments. */
1155 c = getopt_long(argc, argv, "", long_options, NULL);
1159 /* No argument given - we should display usage. */
1164 /* We have to build an array of the arguments which will be passed to the
1165 functions. Please note that every text after the --command will be
1166 passed as arguments. A syntax like gnokii --cmd1 args --cmd2 args will
1167 not work as expected; instead args --cmd2 args is passed as a
1170 if((nargv = malloc(sizeof(char *) * argc)) != NULL) {
1172 for(i = 2; i < argc; i++)
1173 nargv[i-2] = argv[i];
1175 if(checkargs(c, gals, nargc)) {
1179 /* Wrong number of arguments - we should display usage. */
1185 #if defined(__svr4__)
1186 /* have to ignore SIGALARM */
1193 // First, error conditions
1195 fprintf(stderr, _("Use '%s --help' for usage informations.\n"), argv[0]);
1198 // Then, options with no arguments
1199 case OPT_HELP: rc = usage(); break;
1200 case OPT_VERSION: rc = version(); break;
1201 case OPT_MONITOR: rc = monitormode(nargc, nargv); break;
1202 case OPT_GETSMSFOLDERS: rc = getsmsfolders(); break;
1203 case OPT_GETDATETIME: rc = getdatetime(); break;
1204 case OPT_GETALARM: rc = getalarm(); break;
1205 case OPT_GETDISPLAYSTATUS: rc = getdisplaystatus(); break;
1206 case OPT_PMON: rc = pmon(); break;
1207 case OPT_WRITEPHONEBOOK: rc = writephonebook(nargc, nargv);break;
1210 case OPT_ENTERSECURITYCODE: rc = entersecuritycode(optarg); break;
1211 case OPT_GETSECURITYCODESTATUS: rc = getsecuritycodestatus(); break;
1212 case OPT_GETSECURITYCODE: rc = getsecuritycode(optarg); break;
1213 case OPT_GETEEPROM: rc = geteeprom(); break;
1214 case OPT_RESETPHONESETTINGS: rc = resetphonesettings(); break;
1215 case OPT_SETSIMLOCK: rc = setsimlock(); break;
1219 case OPT_SNIFFER: rc = sniff(nargc, nargv); break;
1220 case OPT_DECODEFILE: rc = decodefile(nargc, nargv); break;
1221 case OPT_GETBINRINGFROMFILE: rc = getbinringfromfile(nargc, nargv);break;
1224 // Now, options with arguments
1225 case OPT_SETDATETIME: rc = setdatetime(nargc, nargv); break;
1226 case OPT_SETALARM: rc = setalarm(nargv); break;
1227 case OPT_DIALVOICE: rc = dialvoice(optarg); break;
1228 case OPT_CANCELCALL: rc = cancelcall(); break;
1229 case OPT_GETCALENDARNOTE: rc = getcalendarnote(nargc, nargv);break;
1230 case OPT_DELCALENDARNOTE: rc = deletecalendarnote(optarg);break;
1231 case OPT_SAVECALENDARNOTE: rc = savecalendarnote(nargc, nargv);break;
1232 case OPT_SENDCALENDARNOTE: rc = sendcalendarnote(nargc, nargv);break;
1233 case OPT_SAVEPHONEBOOKENTRY: rc = savephonebookentry(nargc, nargv);break;
1234 case OPT_SENDPHONEBOOKENTRY: rc = sendphonebookentry(nargc, nargv);break;
1235 case OPT_WRITECALENDARNOTE: rc = writecalendarnote(nargv); break;
1236 case OPT_GETMEMORY: rc = getmemory(nargc, nargv); break;
1237 case OPT_GETSPEEDDIAL: rc = getspeeddial(optarg); break;
1238 case OPT_SETSPEEDDIAL: rc = setspeeddial(nargv); break;
1239 case OPT_GETSMS: rc = getsms(argc, argv); break;
1240 case OPT_GETSMSSTATUS: rc = getsmsstatus(argc, argv); break;
1241 case OPT_DELETESMS: rc = deletesms(nargc, nargv); break;
1242 case OPT_SENDSMS: rc = sendsms(nargc, nargv); break;
1243 case OPT_SAVESMS: rc = savesms(nargc, nargv); break;
1244 case OPT_DIVERT: rc = divert(nargc, nargv); break;
1245 case OPT_SENDLOGO: rc = sendlogo(nargc, nargv); break;
1246 case OPT_SAVELOGO: rc = savelogo(nargc, nargv); break;
1247 case OPT_GETSMSC: rc = getsmsc(optarg); break;
1248 case OPT_RENAMESMSC: rc = renamesmsc(nargc,nargv); break;
1249 case OPT_NETMONITOR: rc = netmonitor(optarg); break;
1250 case OPT_IDENTIFY: rc = identify(); break;
1251 case OPT_SETLOGO: rc = setlogo(nargc, nargv); break;
1252 case OPT_GETLOGO: rc = getlogo(nargc, nargv); break;
1253 case OPT_RECEIVESMS: rc = receivesms(nargc, nargv); break;
1254 case OPT_SETRINGTONE: rc = setringtone(nargc, nargv); break;
1255 case OPT_GETRINGTONE: rc = getringtone(nargc, nargv); break;
1256 case OPT_PRESSKEYSEQUENCE: rc = presskeysequence(nargv); break;
1257 case OPT_SENDRINGTONE: rc = sendringtone(nargc, nargv);break;
1258 case OPT_SAVERINGTONE: rc = saveringtone(nargc, nargv);break;
1259 case OPT_GETPROFILE: rc = getprofile(nargc, nargv); break;
1260 case OPT_SETPROFILE: rc = setprofile(nargc, nargv); break;
1261 case OPT_SENDPROFILE: rc = sendprofile(nargc, nargv); break;
1262 case OPT_DISPLAYOUTPUT: rc = displayoutput(); break;
1263 case OPT_RESTORESETTINGS: rc = restoresettings(nargv); break;
1264 case OPT_BACKUPSETTINGS: rc = backupsettings(nargv); break;
1265 case OPT_RINGTONECONVERT: rc = ringtoneconvert(nargc, nargv);break;
1266 case OPT_BINRINGTONECONVERT: rc = binringtoneconvert(nargc, nargv);break;
1267 case OPT_BITMAPCONVERT: rc = bitmapconvert(nargc, nargv);break;
1268 case OPT_SHOWBITMAP: rc = showbitmap(nargc, nargv); break;
1269 case OPT_PLAYRINGTONE: rc = playringtone(nargc, nargv);break;
1270 case OPT_COMPOSER: rc = composer(nargc, nargv); break;
1271 case OPT_FOOGLE: rc = foogle(nargv); break;
1272 case OPT_PHONETESTS: rc = phonetests(); break;
1273 case OPT_SIMLOCKINFO: rc = simlockinfo(); break;
1274 case OPT_SENDDTMF: rc = senddtmf(optarg); break;
1275 case OPT_RESET: rc = reset(nargc,nargv); break;
1276 case OPT_GETOPERATORNAME: rc = getoperatorname(); break;
1277 case OPT_SETOPERATORNAME: rc = setoperatorname(nargc,nargv);break;
1278 case OPT_GETWAPBOOKMARK: rc = getwapbookmark(nargc,nargv);break;
1279 case OPT_SETWAPBOOKMARK: rc = setwapbookmark(nargc,nargv);break;
1280 case OPT_SAVEWAPBOOKMARK: rc = savewapbookmark(nargc,nargv);break;
1281 case OPT_SENDWAPBOOKMARK: rc = sendwapbookmark(nargc,nargv);break;
1282 case OPT_GETWAPSETTINGS: rc = getwapsettings(nargc,nargv);break;
1283 case OPT_SAVEWAPSETTINGS: rc = savewapsettings(nargc,nargv);break;
1284 case OPT_SENDWAPSETTINGS: rc = sendwapsettings(nargc,nargv);break;
1285 case OPT_ALLRINGTONES: rc = allringtones(); break;
1286 case OPT_GETPHONEPROFILE: rc = getphoneprofile(); break;
1287 case OPT_SETPHONEPROFILE: rc = setphoneprofile(nargc,nargv);break;
1288 case OPT_GETVOICEMAILBOX: rc = getvoicemailbox(); break;
1289 case OPT_NM_COLLECT: rc = nm_collect(nargc, nargv); break;
1290 case OPT_NETMONITORDATA: rc = netmonitordata(nargc, nargv);break;
1292 default: fprintf(stderr, _("Unknown option: %d\n"), c); break;
1301 fprintf(stderr, _("Wrong number of arguments\n"));
1306 /* Restores various phone settings from one file */
1307 int restoresettings(char *argv[])
1310 GSM_PhonebookEntry pbk;
1317 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1318 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1320 if (GSM_ReadBackupFile(argv[0], &Backup)!=GE_NONE) return 1;
1324 if (Backup.SIMPhonebookUsed!=0) {
1326 while (confirm < 0) {
1327 fprintf(stderr, _("Restore SIM phonebook ? "));
1328 GetLine(stdin, ans, 99);
1329 if (!strcmp(ans, "yes")) confirm = 1;
1330 if (!strcmp(ans, "no" )) confirm = 0;
1333 if (GSM->GetMemoryStatus(&SIMMemoryStatus) != GE_NONE) {
1334 fprintf(stderr,_("Error getting memory status !\n"));
1339 while ((pos-1)!=SIMMemoryStatus.Used+SIMMemoryStatus.Free) {
1341 pbk.MemoryType=GMT_SM;
1344 pbk.SubEntriesCount = 0;
1345 if (i<Backup.SIMPhonebookUsed) {
1346 if (Backup.SIMPhonebook[i].Location==pbk.Location) {
1347 pbk=Backup.SIMPhonebook[i];
1350 // fprintf(stdout,_("Copying from backup\n"));
1355 // fprintf(stdout,_("Setting location %i\n"),pbk.Location);
1357 GSM->WritePhonebookLocation(&pbk);
1358 fprintf(stderr,_("."));
1361 fprintf(stderr,_("\n"));
1364 if (Backup.PhonePhonebookUsed!=0) {
1366 while (confirm < 0) {
1367 fprintf(stderr, _("Restore phone phonebook ? "));
1368 GetLine(stdin, ans, 99);
1369 if (!strcmp(ans, "yes")) confirm = 1;
1370 if (!strcmp(ans, "no" )) confirm = 0;
1373 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) != GE_NONE) {
1374 fprintf(stderr,_("Error getting memory status !\n"));
1380 while ((pos-1)!=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free) {
1382 pbk.MemoryType=GMT_ME;
1385 pbk.SubEntriesCount = 0;
1386 if (i<Backup.PhonePhonebookUsed) {
1387 if (Backup.PhonePhonebook[i].Location==pbk.Location) {
1388 pbk=Backup.PhonePhonebook[i];
1391 // fprintf(stdout,_("Copying from backup\n"));
1396 // fprintf(stdout,_("Setting location %i\n"),pbk.Location);
1398 GSM->WritePhonebookLocation(&pbk);
1399 fprintf(stderr,_("."));
1402 fprintf(stderr,_("\n"));
1405 if (Backup.CallerAvailable==true) {
1407 while (confirm < 0) {
1408 fprintf(stderr, _("Restore caller groups ? "));
1409 GetLine(stdin, ans, 99);
1410 if (!strcmp(ans, "yes")) confirm = 1;
1411 if (!strcmp(ans, "no" )) confirm = 0;
1414 for (i=0;i<5;i++) GSM->SetBitmap(&Backup.CallerGroups[i]);
1417 if (Backup.OperatorLogoAvailable==true) {
1419 while (confirm < 0) {
1420 fprintf(stderr, _("Restore operator logo ? "));
1421 GetLine(stdin, ans, 99);
1422 if (!strcmp(ans, "yes")) confirm = 1;
1423 if (!strcmp(ans, "no" )) confirm = 0;
1426 GSM->SetBitmap(&Backup.OperatorLogo);
1429 if (Backup.StartupLogoAvailable==true) {
1431 while (confirm < 0) {
1432 fprintf(stderr, _("Restore startup logo ? "));
1433 GetLine(stdin, ans, 99);
1434 if (!strcmp(ans, "yes")) confirm = 1;
1435 if (!strcmp(ans, "no" )) confirm = 0;
1438 GSM->SetBitmap(&Backup.StartupLogo);
1447 /* Backup various phone settings from one file */
1448 int backupsettings(char *argv[])
1450 GSM_PhonebookEntry PbkEntry;
1455 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1456 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1460 fprintf(stderr,_("Backup phonebook from SIM..."));
1461 Backup.SIMPhonebookUsed=0;
1462 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE) {
1463 Backup.SIMPhonebookSize=SIMMemoryStatus.Used+SIMMemoryStatus.Free;
1465 PbkEntry.MemoryType=GMT_SM;
1467 for (i=0;i<Backup.SIMPhonebookSize;i++)
1469 if (SIMMemoryStatus.Used==Backup.SIMPhonebookUsed) break;
1471 PbkEntry.Location=i;
1473 error=GSM->GetMemoryLocation(&PbkEntry);
1476 Backup.SIMPhonebook[Backup.SIMPhonebookUsed]=PbkEntry;
1477 Backup.SIMPhonebookUsed++;
1478 fprintf(stderr,_("."));
1484 fprintf(stderr,_("Done\n"));
1485 } else fprintf(stderr,_("ERROR\n"));
1487 fprintf(stderr,_("Backup phonebook from phone..."));
1488 Backup.PhonePhonebookUsed=0;
1489 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE) {
1490 Backup.PhonePhonebookSize=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free;
1492 PbkEntry.MemoryType=GMT_ME;
1494 for (i=0;i<Backup.PhonePhonebookSize;i++)
1496 if (PhoneMemoryStatus.Used==Backup.PhonePhonebookUsed) break;
1498 PbkEntry.Location=i;
1500 error=GSM->GetMemoryLocation(&PbkEntry);
1503 Backup.PhonePhonebook[Backup.PhonePhonebookUsed]=PbkEntry;
1504 Backup.PhonePhonebookUsed++;
1505 fprintf(stderr,_("."));
1511 fprintf(stderr,_("Done\n"));
1512 } else fprintf(stderr,_("ERROR\n"));
1514 if( GetModelFeature (FN_CALLERGROUPS)!=0) {
1515 fprintf(stderr,_("Backup caller logos..."));
1516 Backup.CallerAvailable=true;
1518 Backup.CallerGroups[i].number=i;
1519 Backup.CallerGroups[i].type=GSM_CallerLogo;
1520 if (GSM->GetBitmap(&Backup.CallerGroups[i])!=GE_NONE) return 1;
1522 fprintf(stderr,_("Done\n"));
1523 } else Backup.CallerAvailable=false;
1525 // fprintf(stderr,_("Backup speed dials..."));
1526 Backup.SpeedAvailable=false;
1527 // for (i=0;i<8;i++) {
1528 // Backup.SpeedDials[i].Number=i+1;
1529 // if (GSM->GetSpeedDial(&Backup.SpeedDials[i])!=GE_NONE) return 1;
1531 // fprintf(stderr,_("Done\n"));
1533 fprintf(stderr,_("Backup operator logo..."));
1534 Backup.OperatorLogoAvailable=true;
1535 Backup.OperatorLogo.type=GSM_7110OperatorLogo;
1536 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1537 Backup.OperatorLogo.type=GSM_OperatorLogo;
1538 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1539 Backup.OperatorLogoAvailable=false;
1540 fprintf(stderr,_("Error\n"));
1541 } else fprintf(stderr,_("Done\n"));
1542 } else fprintf(stderr,_("Done\n"));
1544 Backup.StartupLogoAvailable=false;
1545 if( GetModelFeature (FN_STARTUP)!=0) {
1546 fprintf(stderr,_("Backup startup logo..."));
1547 Backup.StartupLogoAvailable=true;
1548 switch (GetModelFeature (FN_STARTUP)) {
1549 case F_STA62: Backup.StartupLogo.type=GSM_6210StartupLogo;break;
1550 case F_STA71: Backup.StartupLogo.type=GSM_7110StartupLogo;break;
1551 default : Backup.StartupLogo.type=GSM_StartupLogo;break;
1553 if (GSM->GetBitmap(&Backup.StartupLogo)!=GE_NONE) {
1554 Backup.StartupLogoAvailable=false;
1555 fprintf(stderr,_("Error\n"));
1556 } else fprintf(stderr,_("Done\n"));
1559 fprintf(stderr,_("Backup welcome note..."));
1560 Backup.StartupText.type=GSM_WelcomeNoteText;
1561 if (GSM->GetBitmap(&Backup.StartupText)!=GE_NONE) {
1562 fprintf(stderr,_("Error\n"));
1563 } else fprintf(stderr,_("Done\n"));
1567 GSM_SaveBackupFile(argv[0], &Backup);
1572 /* Presses keys on phone's keyboard */
1574 int presskeysequence(char *argv[])
1584 for (i=0;i<strlen(argv[0]);i++)
1590 if (key!='w' && key!='W')
1592 while (Keys[j].whatchar!=' ') {
1593 if (Keys[j].whatchar==key) {
1594 keycode=Keys[j].whatcode;
1601 fprintf(stderr,_("Unknown key: %c !\n"),key);
1606 if (GSM->PressKey(keycode,PRESSPHONEKEY)!=GE_NONE)
1608 fprintf(stderr,_("Can't press key !\n"));
1612 if (GSM->PressKey(keycode,RELEASEPHONEKEY)!=GE_NONE)
1614 fprintf(stderr,_("Can't release key !\n"));
1629 /* Send SMS messages. */
1630 int sendsms(int argc, char *argv[])
1632 GSM_MultiSMSMessage MultiSMS;
1633 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1634 int input_len, chars_read,i,msgnum;
1636 GSM_SMSMessageType SMSType=GST_SMS;
1637 int SMSValidity= 4320; /* 4320 minutes == 72 hours */
1638 bool SMSReply=false;
1639 int SMSClass=-1,SMSCenter=1;
1640 char SMSCNumber[100];
1641 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1642 GSM_UDH SMSUDHType=GSM_NoUDH;
1644 struct option options[] = {
1645 { "smscno", required_argument, NULL, '1'},
1646 { "smsc", required_argument, NULL, '2'},
1647 { "long", required_argument, NULL, '3'},
1648 { "enablevoice", no_argument, NULL, '4'},
1649 { "disablevoice", no_argument, NULL, '5'},
1650 { "enableemail", no_argument, NULL, '6'},
1651 { "disableemail", no_argument, NULL, '7'},
1652 { "enablefax", no_argument, NULL, '8'},
1653 { "disablefax", no_argument, NULL, '9'},
1654 { "unicode", no_argument, NULL, '-'},
1655 { "void", no_argument, NULL, '+'},
1656 { "hang", no_argument, NULL, '('},
1657 { "bug", no_argument, NULL, ')'},
1661 input_len = GSM_MAX_SMS_LENGTH;
1668 while ((i = getopt_long(argc, argv, "v:dsC:", options, NULL)) != -1) {
1671 case '1': /* SMSC number */
1673 strcpy(SMSCNumber,optarg);
1676 case '2': /* SMSC number index in phone memory */
1677 SMSCenter = atoi(optarg);
1679 if (SMSCenter < 1 || SMSCenter > 5) {
1680 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1686 case '3': /* we send long message */
1687 SMSUDHType=GSM_ConcatenatedMessages;
1688 input_len = atoi(optarg);
1689 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1690 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1695 case '4': /* SMS enables voice indicator */
1696 SMSUDHType=GSM_EnableVoice; break;
1698 case '5': /* SMS disables voice indicator */
1699 SMSUDHType=GSM_DisableVoice; break;
1701 case '6': /* SMS enables email indicator */
1702 SMSUDHType=GSM_EnableEmail; break;
1704 case '7': /* SMS disables email indicator */
1705 SMSUDHType=GSM_DisableEmail; break;
1707 case '8': /* SMS enables fax indicator */
1708 SMSUDHType=GSM_EnableFax; break;
1710 case '9': /* SMS disables fax indicator */
1711 SMSUDHType=GSM_DisableFax; break;
1713 case '-': /* SMS coding type */
1714 SMSCoding=GSM_Coding_Unicode; break;
1716 case '+': /* SMS ghost */
1717 SMSUDHType=GSM_VoidSMS; break;
1719 case '(': /* SMS hanging phone, when saved to Outbox */
1720 SMSUDHType=GSM_HangSMS; break;
1722 case ')': /* SMS showed incorrectly in phone */
1723 SMSUDHType=GSM_BugSMS; break;
1725 case 'v': /* Set validaty of SMS */
1726 SMSValidity = atoi(optarg); break;
1728 case 'd': /* delivery report */
1729 SMSType=GST_DR; break;
1731 case 's': /* Set replying via the same SMSC */
1732 SMSReply = true; break;
1734 case 'C': /* class Message */
1736 if (SMSUDHType!=GSM_NoUDH) {
1737 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1742 case '0': SMSClass = 0; break;
1743 case '1': SMSClass = 1; break;
1744 case '2': SMSClass = 2; break;
1745 case '3': SMSClass = 3; break;
1747 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1753 fprintf(stderr,_("Unknown option number %i\n"),argc);
1759 /* Get message text from stdin. */
1760 chars_read = fread(message_buffer, 1, input_len, stdin);
1762 if (chars_read == 0) {
1763 fprintf(stderr, _("Couldn't read from stdin!\n"));
1766 if (chars_read > input_len) {
1767 fprintf(stderr, _("Input too long!\n"));
1771 /* Null terminate. */
1772 message_buffer[chars_read] = 0x00;
1774 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1775 msgnum=MultiSMS.number;
1777 switch (SMSUDHType) {
1782 case GSM_EnableVoice:
1783 case GSM_DisableVoice:
1785 case GSM_DisableFax:
1786 case GSM_EnableEmail:
1787 case GSM_DisableEmail:
1788 fprintf(stdout,_("Warning: saving %i chars\n"),strlen(MultiSMS.SMS[0].MessageText));
1795 for (i=0;i<msgnum;i++) {
1796 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1798 MultiSMS.SMS[i].Class=SMSClass;
1799 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
1800 MultiSMS.SMS[i].Type=SMSType;
1801 MultiSMS.SMS[i].Validity=SMSValidity;
1804 /* Initialise the GSM interface. */
1807 MultiSMS.number=msgnum;
1808 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,false,false,false);
1813 int savesms(int argc, char *argv[])
1815 GSM_MultiSMSMessage MultiSMS;
1816 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1817 int input_len, chars_read,i,msgnum;
1819 int SMSClass=-1,SMSCenter=1;
1821 char SMSCNumber[100];
1822 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1823 GSM_UDH SMSUDHType=GSM_NoUDH;
1824 GSM_SMSMessageStatus SMSStatus;
1826 bool SMSReply=false;
1828 bool interactive=false;
1830 struct option options[] = {
1831 { "smscno", required_argument, NULL, '1'},
1832 { "smsc", required_argument, NULL, '2'},
1833 { "long", required_argument, NULL, '3'},
1834 { "enablevoice", no_argument, NULL, '4'},
1835 { "disablevoice", no_argument, NULL, '5'},
1836 { "enableemail", no_argument, NULL, '6'},
1837 { "disableemail", no_argument, NULL, '7'},
1838 { "enablefax", no_argument, NULL, '8'},
1839 { "disablefax", no_argument, NULL, '9'},
1840 { "unicode", no_argument, NULL, '-'},
1841 { "void", no_argument, NULL, '+'},
1842 { "hang", no_argument, NULL, '('},
1843 { "bug", no_argument, NULL, ')'},
1844 { "smsname", required_argument, NULL, '/'},
1850 SMSStatus=GSS_NOTSENTREAD;
1851 SMSFolder=GST_OUTBOX;
1853 input_len = GSM_MAX_SMS_LENGTH;
1860 while ((i = getopt_long(argc, argv, "risal:C:F:", options, NULL)) != -1) {
1863 case '1': /* SMSC number */
1865 strcpy(SMSCNumber,optarg);
1868 case '2': /* SMSC number index in phone memory */
1869 SMSCenter = atoi(optarg);
1871 if (SMSCenter < 1 || SMSCenter > 5) {
1872 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1878 case '3': /* we send long message */
1879 SMSUDHType=GSM_ConcatenatedMessages;
1880 input_len = atoi(optarg);
1881 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1882 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1887 case '4': /* SMS enables voice indicator */
1888 SMSUDHType=GSM_EnableVoice; break;
1890 case '5': /* SMS disables voice indicator */
1891 SMSUDHType=GSM_DisableVoice; break;
1893 case '6': /* SMS enables email indicator */
1894 SMSUDHType=GSM_EnableEmail; break;
1896 case '7': /* SMS disables email indicator */
1897 SMSUDHType=GSM_DisableEmail; break;
1899 case '8': /* SMS enables fax indicator */
1900 SMSUDHType=GSM_EnableFax; break;
1902 case '9': /* SMS disables fax indicator */
1903 SMSUDHType=GSM_DisableFax; break;
1905 case '-': /* SMS coding type */
1906 SMSCoding=GSM_Coding_Unicode; break;
1908 case '+': /* SMS ghost */
1909 SMSUDHType=GSM_VoidSMS; break;
1911 case '(': /* SMS hanging phone, when saved to Outbox */
1912 SMSUDHType=GSM_HangSMS; break;
1914 case ')': /* SMS showed incorrectly in phone */
1915 SMSUDHType=GSM_BugSMS; break;
1917 case 'r': /* mark as read */
1918 SMSStatus = GSS_SENTREAD; break;
1920 case 'i': /* Save into Inbox */
1921 SMSFolder = GST_INBOX; break;
1923 case 's': /* Set replying via the same SMSC */
1924 SMSReply = true; break;
1926 case 'a': /* Ask before overwriting */
1927 interactive=true;break;
1929 case 'l': /* Specify location */
1930 SMSLocation = atoi(optarg); break;
1932 case '/': /* Name */
1933 strncpy(SMSName,optarg,25);break;
1935 case 'C': /* class Message */
1937 if (SMSUDHType!=GSM_NoUDH) {
1938 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1943 case '0': SMSClass = 0; break;
1944 case '1': SMSClass = 1; break;
1945 case '2': SMSClass = 2; break;
1946 case '3': SMSClass = 3; break;
1948 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1953 case 'F': /* save into folder n */
1954 SMSFolder = atoi(optarg);
1958 fprintf(stderr,_("Unknown option number %i\n"),argc);
1964 /* Get message text from stdin. */
1965 chars_read = fread(message_buffer, 1, input_len, stdin);
1967 if (chars_read == 0) {
1968 fprintf(stderr, _("Couldn't read from stdin!\n"));
1971 if (chars_read > input_len) {
1972 fprintf(stderr, _("Input too long!\n"));
1976 /* Null terminate. */
1977 message_buffer[chars_read] = 0x00;
1979 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1980 msgnum=MultiSMS.number;
1982 switch (SMSUDHType) {
1987 case GSM_EnableVoice:
1988 case GSM_DisableVoice:
1990 case GSM_DisableFax:
1991 case GSM_EnableEmail:
1992 case GSM_DisableEmail:
1993 fprintf(stdout,_("Warning: saving %i chars\n"),strlen(MultiSMS.SMS[0].MessageText));
2000 for (i=0;i<msgnum;i++) {
2001 MultiSMS.SMS[i].Destination[0]=0;
2002 if (argc!=0) strcpy(MultiSMS.SMS[i].Destination,argv[0]);
2004 MultiSMS.SMS[i].Location=0;
2005 MultiSMS.SMS[i].Class=SMSClass;
2006 MultiSMS.SMS[i].MessageCenter.No=SMSCenter;
2007 strcpy(MultiSMS.SMS[i].MessageCenter.Number,SMSCNumber);
2008 MultiSMS.SMS[i].Status=SMSStatus;
2009 strcpy(MultiSMS.SMS[i].Name,SMSName);
2010 MultiSMS.SMS[i].folder=SMSFolder;
2011 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
2014 MultiSMS.SMS[0].Location=SMSLocation;
2016 /* Initialise the GSM interface. */
2019 MultiSMS.number=msgnum;
2020 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,interactive,false,false,false);
2025 /* Get SMSC number */
2027 int getsmsc(char *MessageCenterNumber)
2030 GSM_MessageCenter MessageCenter;
2032 MessageCenter.No=atoi(MessageCenterNumber);
2036 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
2038 fprintf(stdout, _("%d. SMS center ("),MessageCenter.No);
2040 if (!strcmp(MessageCenter.Name,""))
2041 fprintf(stdout,_("Set %d"),MessageCenter.No);
2042 else fprintf(stdout,_("%s"),MessageCenter.Name);
2044 fprintf(stdout,_(") number is "));
2046 if (!strcmp(MessageCenter.Number,"")) fprintf(stdout,_("not set\n"));
2047 else fprintf(stdout,_("%s\n"),MessageCenter.Number);
2049 fprintf(stdout,_("Default recipient number is "));
2051 if (!strcmp(MessageCenter.DefaultRecipient,""))
2052 fprintf(stdout,_("not set\n"));
2053 else fprintf(stdout,_("%s\n"),MessageCenter.DefaultRecipient);
2055 fprintf(stdout, _("Messages sent as "));
2057 switch (MessageCenter.Format) {
2058 case GSMF_Text :fprintf(stdout, _("Text"));break;
2059 case GSMF_Paging:fprintf(stdout, _("Paging"));break;
2060 case GSMF_Fax :fprintf(stdout, _("Fax"));break;
2062 case GSMF_UCI :fprintf(stdout, _("Email"));break;
2063 case GSMF_ERMES :fprintf(stdout, _("ERMES"));break;
2064 case GSMF_X400 :fprintf(stdout, _("X.400"));break;
2065 default :fprintf(stdout, _("Unknown"));
2070 fprintf(stdout, _("Message validity is "));
2072 switch (MessageCenter.Validity) {
2073 case GSMV_1_Hour :fprintf(stdout, _("1 hour"));break;
2074 case GSMV_6_Hours :fprintf(stdout, _("6 hours"));break;
2075 case GSMV_24_Hours:fprintf(stdout, _("24 hours"));break;
2076 case GSMV_72_Hours:fprintf(stdout, _("72 hours"));break;
2077 case GSMV_1_Week :fprintf(stdout, _("1 week"));break;
2078 case GSMV_Max_Time:fprintf(stdout, _("Maximum time"));break;
2079 default :fprintf(stdout, _("Unknown"));
2082 fprintf(stdout, "\n");
2086 fprintf(stdout, _("SMS center can not be found :-(\n"));
2093 /* Get SMS messages. */
2094 int getsms(int argc, char *argv[])
2097 GSM_SMSMessage message;
2098 GSM_WAPBookmark bookmark;
2099 char memory_type_string[20];
2100 int start_message, end_message, count, mode = 1;
2104 GSM_Ringtone ringtone;
2105 GSM_SMSFolders folders;
2107 int confirm = -1, i;
2110 /* Handle command line args that set type, start and end locations. */
2111 if (!GetMemoryTypeID(argv[2], &message.MemoryType))
2113 fprintf(stderr, _("Unknown memory type %s!\n"), argv[2]);
2116 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2118 for (i=0;i<64;i++) filename[i]=0;
2120 start_message = atoi(argv[3]);
2124 /* [end] can be only argv[4] */
2125 if (argv[4][0] == '-') { end_message = start_message; }
2126 else { end_message = atoi(argv[4]); }
2128 /* parse all options (beginning with '-' */
2129 while ((i = getopt(argc, argv, "f:")) != -1) {
2134 fprintf(stderr, _("Saving into file \"%s\"\n"), optarg);
2136 strncpy(filename, optarg, 64);
2137 if (strlen(optarg) > 63) {
2138 fprintf(stderr, _("Filename too long - will be truncated to 63 characters.\n"));
2141 filename[strlen(optarg)] = 0;
2154 end_message = start_message;
2157 /* Initialise the code for the GSM interface. */
2161 GSM->GetSMSFolders(&folders);
2164 /* Now retrieve the requested entries. */
2166 for (count = start_message; count <= end_message; count ++) {
2168 message.Location = count;
2170 error = GSM->GetSMSMessage(&message);
2176 switch (message.Type) {
2180 /* RTH FIXME: Test that out ! */
2181 fprintf(stdout, _("%d. Delivery Report "), message.MessageNumber);
2182 switch (message.Status)
2185 if (message.folder==0) fprintf(stdout, _("(read)\n")); //GST_INBOX
2186 else fprintf(stdout, _("(sent)\n"));
2188 case GSS_NOTSENTREAD:
2189 if (message.folder==0) fprintf(stdout, _("(unread)\n")); //GST_INBOX
2190 else fprintf(stdout, _("(not sent)\n"));
2193 fprintf(stdout, _("(not known :-()\n"));
2196 fprintf(stdout, _("(template)\n"));
2199 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2203 fprintf(stdout, _("Sending date/time : %s %02d/%02d/%02d %d:%02d:%02d "), \
2204 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2205 message.Time.Day, message.Time.Month, message.Time.Year, \
2206 message.Time.Hour, message.Time.Minute, message.Time.Second);
2208 if (message.Time.Timezone) {
2209 if (message.Time.Timezone > 0)
2210 fprintf(stdout,_("+%02d00"), message.Time.Timezone);
2212 fprintf(stdout,_("%02d00"), message.Time.Timezone);
2215 fprintf(stdout, "\n");
2217 fprintf(stdout, _("Response date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2218 DayOfWeek(message.SMSCTime.Year, message.SMSCTime.Month, message.SMSCTime.Day), \
2219 message.SMSCTime.Day, message.SMSCTime.Month, message.SMSCTime.Year, \
2220 message.SMSCTime.Hour, message.SMSCTime.Minute, message.SMSCTime.Second);
2222 if (message.SMSCTime.Timezone) {
2223 if (message.SMSCTime.Timezone > 0)
2224 fprintf(stdout,_("+%02d00"),message.SMSCTime.Timezone);
2226 fprintf(stdout,_("%02d00"),message.SMSCTime.Timezone);
2229 fprintf(stdout, "\n");
2231 fprintf(stdout, _("Receiver: %s Msg Center: %s\n"), message.Sender, message.MessageCenter.Number);
2232 fprintf(stdout, _("Text: %s\n\n"), message.MessageText);
2237 fprintf(stdout, _("%d. %s Message "), message.MessageNumber,
2238 folders.Folder[message.folder].Name);
2240 switch (message.Status)
2243 if (message.folder==0) fprintf(stdout, _("(read)\n")); //GST_INBOX
2244 else fprintf(stdout, _("(sent)\n"));
2246 case GSS_NOTSENTREAD:
2247 if (message.folder==0) fprintf(stdout, _("(unread)\n")); //GST_INBOX
2248 else fprintf(stdout, _("(not sent)\n"));
2251 fprintf(stdout, _("(not known :-()\n"));
2254 fprintf(stdout, _("(template)\n"));
2257 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2261 /* RTH FIXME: date for other status ok ? */
2262 if (message.SMSData) {
2264 fprintf(stdout, _("Date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2265 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2266 message.Time.Day, message.Time.Month, message.Time.Year, \
2267 message.Time.Hour, message.Time.Minute, message.Time.Second);
2269 if (message.Time.Timezone) {
2270 if (message.Time.Timezone > 0)
2271 fprintf(stdout,_("+%02d00"),message.Time.Timezone);
2273 fprintf(stdout,_("%02d00"),message.Time.Timezone);
2276 fprintf(stdout, "\n");
2278 fprintf(stdout, _("Msg Center: %s "), message.MessageCenter.Number);
2280 if (message.ReplyViaSameSMSC)
2281 fprintf(stdout, _("(centre set for reply) "));
2284 if (strcmp(message.Sender,"")) {
2285 if (message.folder==1) { //GST_OUTBOX
2286 fprintf(stdout, _("Recipient: %s"),message.Sender);
2288 fprintf(stdout, _("Sender: %s"),message.Sender);
2292 if (strcmp(message.Sender,"") || message.folder==0)
2293 fprintf(stdout, "\n");
2295 switch (message.UDHType) {
2299 /* put bitmap into bitmap structure */
2300 switch (GSM_ReadBitmap(&message, &bitmap)) {
2301 case GE_INVALIDIMAGESIZE:
2302 fprintf(stdout,_("Image size not supported\n"));
2305 fprintf(stdout, _("GSM operator logo for %s (%s) network.\n"), bitmap.netcode, GSM_GetNetworkName(bitmap.netcode));
2307 GSM_PrintBitmap(&bitmap);
2309 if (filename[0]!=0) {
2310 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2315 fprintf(stdout,_("Error reading image\n"));
2320 if (message.folder==0) { //GST_INBOX
2321 if (!strcmp(message.Sender, "+998000005") &&
2322 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2323 message.Time.Day==27 &&
2324 message.Time.Month==7 &&
2325 message.Time.Year==99 &&
2326 message.Time.Hour==0 &&
2327 message.Time.Minute==10 &&
2328 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2330 /* Is it changed in next versions ? Or what ? */
2331 if (!strcmp(message.Sender, "+998000002") ||
2332 !strcmp(message.Sender, "+998000003") ||
2333 !strcmp(message.Sender, "+998000004")) fprintf(stdout, _("Saved by Operator Logo Uploader by Thomas Kessler\n"));
2335 if (!strcmp(message.Sender, "+8861234567890") &&
2336 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2338 if (!strncmp(message.Sender, "OpLogo",6) &&
2339 strlen(message.Sender)==11)
2340 fprintf(stdout, _("Saved by gnokii\n"));
2345 case GSM_WAPBookmarkUDH:
2347 /* put bookmark into bookmark structure */
2348 switch (GSM_ReadWAPBookmark(&message, &bookmark)) {
2350 fprintf(stdout, ("WAP Bookmark\n"));
2352 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
2354 if (bookmark.title[0]==0)
2355 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
2357 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
2361 fprintf(stdout,_("Error reading WAP Bookmark\n"));
2366 if (!strcmp(message.Sender, "WAPBookmark"))
2367 fprintf(stdout, _("Saved by gnokii\n"));
2372 case GSM_CallerIDLogo:
2374 /* put bitmap into bitmap structure */
2375 switch (GSM_ReadBitmap(&message, &bitmap)) {
2376 case GE_INVALIDIMAGESIZE:
2377 fprintf(stdout,_("Image size not supported\n"));
2380 fprintf(stdout, ("Caller Logo\n"));
2382 GSM_PrintBitmap(&bitmap);
2384 if (filename[0]!=0) {
2385 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2390 fprintf(stdout,_("Error reading image\n"));
2395 if (message.folder==0) { //GST_INBOX
2396 if (!strcmp(message.Sender, "+998000005") &&
2397 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2398 message.Time.Day==27 &&
2399 message.Time.Month==7 &&
2400 message.Time.Year==99 &&
2401 message.Time.Hour==0 &&
2402 message.Time.Minute==10 &&
2403 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2405 if (!strcmp(message.Sender, "+8861234567890") &&
2406 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2408 if (!strcmp(message.Sender, "GroupLogo"))
2409 fprintf(stdout, _("Saved by gnokii\n"));
2414 case GSM_ProfileUDH:
2415 fprintf(stdout, ("Profile SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2418 case GSM_WAPBookmarkUDHLong:
2419 fprintf(stdout, ("WAP Bookmark, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2422 case GSM_WAPSettingsUDH:
2423 fprintf(stdout, ("WAP Settings, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2426 case GSM_RingtoneUDH:
2428 /* put ringtone into ringtone structure */
2429 switch (GSM_ReadRingtone(&message, &ringtone)) {
2432 fprintf(stdout, ("Ringtone \"%s\"\n"),ringtone.name);
2434 while (confirm < 0) {
2435 fprintf(stderr, _("Do you want to play it ? (yes/no) "));
2436 GetLine(stdin, ans, 7);
2437 if (!strcmp(ans, "yes")) confirm = 1;
2438 if (!strcmp(ans, "no")) confirm = 0;
2441 if (confirm==1) GSM_PlayRingtoneOnConsole(&ringtone);
2443 if (filename[0]!=0) GSM_SaveRingtoneFileOnConsole(filename, &ringtone);
2448 fprintf(stdout,_("Gnokii can't read this ringtone - there is probably error inside\n"));
2454 case GSM_CalendarNoteUDH:
2455 fprintf(stdout, ("Calendar note SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2456 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2457 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2460 case GSM_ConcatenatedMessages:
2461 fprintf(stdout, _("Linked (%d/%d)\nText:\n%s\n\n"),message.UDH[5],message.UDH[4], message.MessageText);
2462 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2465 case GSM_EnableVoice:
2466 fprintf(stdout, _("Enables voice indicator\nText:\n%s\n\n"), message.MessageText);
2467 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2470 case GSM_DisableVoice:
2471 fprintf(stdout, _("Disables voice indicator\nText:\n%s\n\n"), message.MessageText);
2472 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2476 fprintf(stdout, _("Enables fax indicator\nText:\n%s\n\n"), message.MessageText);
2477 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2480 case GSM_DisableFax:
2481 fprintf(stdout, _("Disables fax indicator\nText:\n%s\n\n"), message.MessageText);
2482 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2485 case GSM_EnableEmail:
2486 fprintf(stdout, _("Enables email indicator\nText:\n%s\n\n"), message.MessageText);
2487 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2490 case GSM_DisableEmail:
2491 fprintf(stdout, _("Disables email indicator\nText:\n%s\n\n"), message.MessageText);
2492 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2496 fprintf(stdout, _("Void SMS\nText:\n%s\n\n"), message.MessageText);
2497 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2501 if (message.Coding!=GSM_Coding_8bit) {
2502 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2503 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2505 fprintf(stdout, _("Message cannot be displayed here\n")); // like in phone :-)
2509 default: //GSM_UnknownUDH and other
2510 fprintf(stderr, _("Unknown\n"));
2516 fprintf(stdout,_("Unknown SMS type. Report it\n"));
2522 case GE_NOTIMPLEMENTED:
2524 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2528 case GE_INVALIDSMSLOCATION:
2530 fprintf(stderr, _("Invalid location: %s %d\n"), memory_type_string, count);
2534 case GE_EMPTYSMSLOCATION:
2536 fprintf(stderr, _("SMS location %s %d empty.\n"), memory_type_string, count);
2542 fprintf(stderr, _("No access to %s memory.\n"), memory_type_string);
2548 fprintf(stderr, _("GetSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2557 int getsmsstatus(int argc, char *argv[])
2559 GSM_SMSStatus SMSStatus;
2560 GSM_SMSFolders folders;
2566 /* Initialise the code for the GSM interface. */
2569 error = GSM->GetSMSStatus(&SMSStatus);
2570 if (error!=GE_NONE) return error;
2572 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"),SMSStatus.UnRead, SMSStatus.Number);
2574 error=GSM->GetSMSFolders(&folders);
2575 if (error!=GE_NONE) return error;
2577 /* For not 7110 compatible phones we have to read all SMS and prepare sms table */
2578 if( GetModelFeature (FN_SMS)!=F_SMS71 )
2582 if (j==SMSStatus.Number) break;
2584 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
2585 SMSStatus.foldertable[j].smsnum=i;
2587 /* We set such folders ID like in 7110 compatible phones */
2588 if (SMS.Status==GSS_NOTSENTREAD && SMS.folder==0) //GST_INBOX
2589 SMSStatus.foldertable[j].folder=0;
2591 switch (SMS.folder) {
2593 SMSStatus.foldertable[j].folder=GST_7110_INBOX;
2596 SMSStatus.foldertable[j].folder=GST_7110_OUTBOX;
2606 printf("0.Unread : ");
2607 for(j=0; j<SMSStatus.Number; j++)
2609 if (SMSStatus.foldertable[j].folder == 0)
2610 printf("%d ",SMSStatus.foldertable[j].smsnum);
2614 for (i=0;i<folders.number;i++) {
2615 fprintf(stdout,_("%d.%-15s: "),i+1,folders.Folder[i].Name);
2616 for(j=0; j<SMSStatus.Number; j++)
2618 if ( SMSStatus.foldertable[j].folder / 8 == i+1)
2619 printf("%d ",SMSStatus.foldertable[j].smsnum);
2629 /* Delete SMS messages. */
2630 int deletesms(int argc, char *argv[])
2633 GSM_SMSMessage message;
2634 char memory_type_string[20];
2635 int start_message, end_message, count;
2638 /* Handle command line args that set type, start and end locations. */
2639 if (!GetMemoryTypeID(argv[0], &message.MemoryType))
2641 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
2644 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2646 start_message = atoi (argv[1]);
2647 if (argc > 2) end_message = atoi (argv[2]);
2648 else end_message = start_message;
2650 /* Initialise the code for the GSM interface. */
2654 /* Now delete the requested entries. */
2656 for (count = start_message; count <= end_message; count ++) {
2658 message.Location = count;
2660 error = GSM->DeleteSMSMessage(&message);
2662 if (error == GE_NONE)
2663 fprintf(stdout, _("Deleted SMS %s %d\n"), memory_type_string, count);
2665 if (error == GE_NOTIMPLEMENTED) {
2666 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2670 fprintf(stdout, _("DeleteSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2679 static volatile bool bshutdown = false;
2681 /* SIGINT signal handler. */
2683 static void interrupted(int sig)
2686 signal(sig, SIG_IGN);
2693 /* In this mode we get the code from the keyboard and send it to the mobile
2696 int entersecuritycode(char *type)
2699 GSM_SecurityCode SecurityCode;
2701 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2702 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2703 else if (!strcmp(type,"PIN2"))SecurityCode.Type=GSCT_Pin2;
2704 else if (!strcmp(type,"PUK2"))SecurityCode.Type=GSCT_Puk2;
2706 // FIXME: Entering of SecurityCode does not work :-(
2707 // else if (!strcmp(type,"SecurityCode"))
2708 // SecurityCode.Type=GSCT_SecurityCode;
2711 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2716 printf("Enter your code: ");
2717 gets(SecurityCode.Code);
2719 strcpy(SecurityCode.Code,getpass(_("Enter your code: ")));
2724 test = GSM->EnterSecurityCode(SecurityCode);
2726 fprintf(stdout,_("Code OK !\n"));
2728 fprintf(stderr,_("%s\n"),print_error(test));
2735 int getsecuritycodestatus(void)
2742 if (GSM->GetSecurityCodeStatus(&Status) == GE_NONE) {
2744 fprintf(stdout, _("Security code status: "));
2747 case GSCT_SecurityCode:fprintf(stdout, _("waiting for Security Code.\n"));break;
2748 case GSCT_Pin: fprintf(stdout, _("waiting for PIN.\n")); break;
2749 case GSCT_Pin2: fprintf(stdout, _("waiting for PIN2.\n")); break;
2750 case GSCT_Puk: fprintf(stdout, _("waiting for PUK.\n")); break;
2751 case GSCT_Puk2: fprintf(stdout, _("waiting for PUK2.\n")); break;
2752 case GSCT_None: fprintf(stdout, _("nothing to enter.\n")); break;
2753 default: fprintf(stdout, _("Unknown!\n"));
2762 int getsecuritycode(char *type)
2765 GSM_SecurityCode SecurityCode;
2768 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2769 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2770 else if (!strcmp(type,"PIN2")) SecurityCode.Type=GSCT_Pin2;
2771 else if (!strcmp(type,"PUK2")) SecurityCode.Type=GSCT_Puk2;
2772 else if (!strcmp(type,"SecurityCode"))SecurityCode.Type=GSCT_SecurityCode;
2774 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2780 error=GSM->GetSecurityCode(&SecurityCode);
2783 case GE_INVALIDSECURITYCODE:
2784 fprintf(stdout, _("Error: getting "));
2785 switch (SecurityCode.Type) {
2786 case GSCT_SecurityCode:fprintf(stdout, _("security code"));break;
2787 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2788 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2789 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2790 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2793 fprintf(stdout, _(" not allowed\n"));
2796 switch (SecurityCode.Type) {
2797 case GSCT_SecurityCode:fprintf(stdout, _("Security code"));break;
2798 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2799 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2800 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2801 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2804 fprintf(stdout, _(" is %s\n"),SecurityCode.Code);
2807 fprintf(stderr, _("%s\n"),print_error(error));
2818 /* Voice dialing mode. */
2820 int dialvoice(char *Number)
2824 if (GSM->DialVoice(Number)!=GE_NONE) fprintf(stdout,_("Error!\n"));
2832 int cancelcall(void)
2836 if (GSM->CancelCall()!=GE_NONE) fprintf(stdout,_("Error!\n"));
2843 int savelogo(int argc, char *argv[])
2846 GSM_NetworkInfo NetworkInfo;
2847 GSM_MultiSMSMessage MultiSMS;
2849 /* Operator logos will be saved with this number */
2850 char oplogonumber[]={'O','p','L','o','g','o',
2851 '0','0','0','0','0', /* MMC+MNC */
2855 bool UnicodeText=false;
2857 /* The first argument is the type of the logo. */
2858 if (!strcmp(argv[0], "op")) {
2859 fprintf(stdout, _("Saving operator logo.\n"));
2860 } else if (!strcmp(argv[0], "caller")) {
2861 fprintf(stdout, _("Saving caller line identification logo.\n"));
2862 } else if (!strcmp(argv[0], "startup")) {
2863 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2865 } else if (!strcmp(argv[0], "7110startup")) {
2866 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2868 } else if (!strcmp(argv[0], "6210startup")) {
2869 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2871 } else if (!strcmp(argv[0], "7110op")) {
2872 fprintf(stderr, _("It isn't possible to save big operator logos!\n"));
2874 } else if (!strcmp(argv[0], "picture")) {
2875 fprintf(stderr, _("Saving picture image.\n"));
2876 } else if (!strcmp(argv[0], "screensaver")) {
2877 fprintf(stderr, _("Saving screen saver.\n"));
2879 fprintf(stderr, _("You should specify what kind of logo to save!\n"));
2883 /* The second argument is the bitmap file. */
2884 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return -1;
2886 /* Initialise the GSM interface. */
2889 /* We check optional parameters from 2'rd */
2892 if (!strcmp(argv[0], "op")) {
2893 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2895 /* The third argument, if present, is the Network code of the operator.
2896 * Network code is in this format: "xxx yy" */
2898 strcpy(bitmap.netcode, argv[2]);
2900 fprintf(stdout, _("Operator code: %s\n"), argv[2]);
2902 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
2903 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
2910 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
2912 bitmap.type=GSM_OperatorLogo;
2914 /* Put bitmap into SMS structure */
2915 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2917 oplogonumber[6]=bitmap.netcode[0];
2918 oplogonumber[7]=bitmap.netcode[1];
2919 oplogonumber[8]=bitmap.netcode[2];
2920 oplogonumber[9]=bitmap.netcode[4];
2921 oplogonumber[10]=bitmap.netcode[5];
2922 for(i=0;i<MultiSMS.number;i++)
2923 strcpy(MultiSMS.SMS[i].Destination,oplogonumber);
2925 if (!strcmp(argv[0], "caller")) {
2926 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2928 bitmap.type=GSM_CallerLogo;
2930 /* Put bitmap into SMS structure */
2931 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2933 for(i=0;i<MultiSMS.number;i++)
2934 strcpy(MultiSMS.SMS[i].Destination,"GroupLogo");
2936 if (!strcmp(argv[0], "screensaver")) {
2937 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2942 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2944 /* Put bitmap into SMS structure */
2945 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,true,UnicodeText);
2947 for(i=0;i<MultiSMS.number;i++)
2948 strcpy(MultiSMS.SMS[i].Destination,"ScreenSaver");
2950 if (!strcmp(argv[0], "picture")) {
2951 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2954 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2959 if (strlen(argv[2])>121) {
2960 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[2]);
2963 strcpy(bitmap.text,argv[2]);
2966 /* Put bitmap into SMS structure */
2967 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,UnicodeText);
2969 for(i=0;i<MultiSMS.number;i++)
2970 strcpy(MultiSMS.SMS[i].Destination,"Picture");
2973 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,true,false,false);
2978 /* The following function allows to send logos using SMS */
2979 int sendlogo(int argc, char *argv[])
2982 GSM_NetworkInfo NetworkInfo;
2983 GSM_MultiSMSMessage MultiSMS;
2987 bool UnicodeText=false;
2988 bool ScreenSaver=false;
2990 /* The first argument is the type of the logo. */
2991 if (!strcmp(argv[0], "op")) {
2992 fprintf(stdout, _("Sending operator logo.\n"));
2993 } else if (!strcmp(argv[0], "caller")) {
2994 fprintf(stdout, _("Sending caller line identification logo.\n"));
2995 } else if (!strcmp(argv[0], "picture")) {
2996 fprintf(stdout, _("Sending picture image.\n"));
2997 } else if (!strcmp(argv[0], "screensaver")) {
2998 fprintf(stdout, _("Sending screen saver.\n"));
2999 } else if (!strcmp(argv[0], "startup")) {
3000 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3002 } else if (!strcmp(argv[0], "7110startup")) {
3003 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3005 } else if (!strcmp(argv[0], "6210startup")) {
3006 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
3008 } else if (!strcmp(argv[0], "7110op")) {
3009 fprintf(stderr, _("It isn't possible to send big operator logos!\n"));
3012 fprintf(stderr, _("You should specify what kind of logo to send!\n"));
3016 /* The third argument is the bitmap file. */
3017 if (GSM_ReadBitmapFileOnConsole(argv[2], &bitmap)!=GE_NONE) return -1;
3019 /* Initialise the GSM interface. */
3024 if (!strcmp(argv[0], "op")) {
3025 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3027 /* The third argument, if present, is the Network code of the operator.
3028 * Network code is in this format: "xxx yy" */
3030 strcpy(bitmap.netcode, argv[3]);
3032 fprintf(stdout, _("Operator code: %s\n"), argv[3]);
3034 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
3035 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3042 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3044 bitmap.type=GSM_OperatorLogo;
3046 if (!strcmp(argv[0], "caller")) {
3047 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3049 bitmap.type=GSM_CallerLogo;
3051 if (!strcmp(argv[0], "screensaver")) {
3052 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3057 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3061 if (!strcmp(argv[0], "picture")) {
3062 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3065 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
3070 if (strlen(argv[3])>121) {
3071 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[3]);
3074 strcpy(bitmap.text,argv[3]);
3078 /* Put bitmap into SMS structure */
3079 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,ScreenSaver,UnicodeText);
3081 /* The second argument is the destination, ie the phone number of recipient. */
3082 for(i=0;i<MultiSMS.number;i++)
3083 strcpy(MultiSMS.SMS[i].Destination,argv[1]);
3085 GSM_SendMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,true,false,false);
3090 /* Getting logos. */
3092 int getlogo(int argc, char *argv[])
3098 bitmap.type=GSM_None;
3100 if (!strcmp(argv[0],"7110op"))
3101 bitmap.type=GSM_7110OperatorLogo;
3103 if (!strcmp(argv[0],"op"))
3104 bitmap.type=GSM_OperatorLogo;
3106 if (!strcmp(argv[0],"caller")) {
3107 /* There is caller group number missing in argument list. */
3110 if ((num<1)||(num>9)) num=1;
3117 bitmap.type=GSM_CallerLogo;
3120 if (!strcmp(argv[0],"picture")) {
3121 /* There is a number missing in argument list. */
3123 if (strlen(argv[2])==2) {
3124 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3135 bitmap.type=GSM_PictureImage;
3138 if (!strcmp(argv[0],"startup"))
3139 bitmap.type=GSM_StartupLogo;
3141 if (!strcmp(argv[0],"7110startup"))
3142 bitmap.type=GSM_7110StartupLogo;
3144 if (!strcmp(argv[0],"6210startup"))
3145 bitmap.type=GSM_6210StartupLogo;
3147 if (!strcmp(argv[0],"dealer"))
3148 bitmap.type=GSM_DealerNoteText;
3150 if (!strcmp(argv[0],"text"))
3151 bitmap.type=GSM_WelcomeNoteText;
3153 if (bitmap.type!=GSM_None) {
3157 fprintf(stdout, _("Getting Logo\n"));
3159 error=GSM->GetBitmap(&bitmap);
3166 if (bitmap.type==GSM_DealerNoteText) fprintf(stdout, _("Dealer welcome note "));
3167 if (bitmap.type==GSM_WelcomeNoteText) fprintf(stdout, _("Welcome note "));
3168 if (bitmap.type==GSM_DealerNoteText || bitmap.type==GSM_WelcomeNoteText)
3170 if (bitmap.text[0]!=0)
3172 fprintf(stdout, _("currently set to \"%s\"\n"), bitmap.text);
3174 fprintf(stdout, _("currently empty\n"));
3178 if (bitmap.width!=0)
3180 if (bitmap.type==GSM_OperatorLogo || bitmap.type==GSM_7110OperatorLogo)
3182 fprintf(stdout,"Operator logo for %s (%s) network got succesfully\n",bitmap.netcode,GSM_GetNetworkName(bitmap.netcode));
3184 if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_7110StartupLogo || bitmap.type==GSM_6210StartupLogo)
3186 fprintf(stdout,"Startup logo got successfully\n");
3188 if (bitmap.type==GSM_CallerLogo)
3190 fprintf(stdout,"Caller logo got successfully\n");
3192 if (bitmap.type==GSM_PictureImage)
3194 fprintf(stdout,"Picture Image got successfully");
3195 if (strcmp(bitmap.text,""))
3196 fprintf(stdout,_(", text \"%s\""),bitmap.text);
3197 if (strcmp(bitmap.Sender,""))
3198 fprintf(stdout,_(", sender \"%s\""),bitmap.Sender);
3199 fprintf(stdout,"\n");
3203 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
3207 fprintf(stdout,"Your phone doesn't have logo uploaded !\n");
3212 case GE_NOTIMPLEMENTED:
3213 fprintf(stderr, _("Function not implemented !\n"));
3215 case GE_NOTSUPPORTED:
3216 fprintf(stderr, _("This kind of logo is not supported !\n"));
3219 fprintf(stderr, _("Error getting logo (wrong location ?) !\n"));
3224 fprintf(stderr, _("What kind of logo do you want to get ?\n"));
3231 /* Setting logos. */
3233 int setlogo(int argc, char *argv[])
3236 GSM_Bitmap bitmap,oldbit;
3237 GSM_NetworkInfo NetworkInfo;
3248 if (!strcmp(argv[0],"text") || !strcmp(argv[0],"dealer"))
3250 if (!strcmp(argv[0],"text")) bitmap.type=GSM_WelcomeNoteText;
3251 else bitmap.type=GSM_DealerNoteText;
3252 bitmap.text[0]=0x00;
3253 if (argc>1) strncpy(bitmap.text,argv[1],255);
3256 if (!strcmp(argv[0],"op") || !strcmp(argv[0],"startup") || !strcmp(argv[0],"caller") ||
3257 !strcmp(argv[0],"7110op") || !strcmp(argv[0],"6210startup") || !strcmp(argv[0],"7110startup") ||
3258 !strcmp(argv[0],"picture"))
3262 if (!strcmp(argv[0],"startup"))
3264 bitmap.type=GSM_StartupLogo;
3267 bitmap.size=GSM_GetBitmapSize(&bitmap);
3269 if (num>=1 && num<=3) {
3272 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3277 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
3280 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3285 if (!strcmp(argv[0],"op"))
3287 if (bitmap.type!=GSM_OperatorLogo || argc<3)
3289 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3291 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
3294 strncpy(bitmap.netcode,argv[2],7);
3295 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3297 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3302 if (!strcmp(argv[0],"7110op"))
3304 if (bitmap.type!=GSM_7110OperatorLogo || argc<3)
3306 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3308 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
3311 strncpy(bitmap.netcode,argv[2],7);
3312 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3314 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3319 if (!strcmp(argv[0],"picture"))
3321 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3325 if (strlen(argv[2])==2) {
3326 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3336 strncpy(bitmap.text,argv[3],121);
3337 strcpy(bitmap.Sender,"\0");
3339 strncpy(bitmap.Sender,argv[4],GSM_MAX_SENDER_LENGTH);
3341 if (!strcmp(argv[0],"7110startup"))
3343 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
3345 if (!strcmp(argv[0],"6210startup"))
3347 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
3349 if (!strcmp(argv[0],"caller"))
3351 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3355 if ((num<0)||(num>9)) num=0;
3361 oldbit.type=GSM_CallerLogo;
3362 oldbit.number=bitmap.number;
3363 if (GSM->GetBitmap(&oldbit)==GE_NONE)
3365 /* We have to get the old name and ringtone!! */
3366 bitmap.ringtone=oldbit.ringtone;
3367 strncpy(bitmap.text,oldbit.text,255);
3369 if (argc>3) strncpy(bitmap.text,argv[3],255);
3371 fprintf(stdout, _("Setting Logo.\n"));
3374 /* FIX ME: is it possible to permanently remove op logo ? */
3375 if (!strcmp(argv[0],"op"))
3377 bitmap.type=GSM_OperatorLogo;
3378 strncpy(bitmap.netcode,"000 00",7);
3381 bitmap.size=GSM_GetBitmapSize(&bitmap);
3382 GSM_ClearBitmap(&bitmap);
3384 if (!strcmp(argv[0],"7110op"))
3386 bitmap.type=GSM_7110OperatorLogo;
3387 strncpy(bitmap.netcode,"000 00",7);
3390 bitmap.size=GSM_GetBitmapSize(&bitmap);
3391 GSM_ClearBitmap(&bitmap);
3393 /* FIX ME: how to remove startup and group logos ? */
3394 fprintf(stdout, _("Removing Logo.\n"));
3398 fprintf(stderr, _("What kind of logo do you want to set ?\n"));
3404 while (GSM->GetModel(model) != GE_NONE)
3407 /* For Nokia 6110/6130/6150 we use different method of uploading.
3408 Phone will display menu, when received it */
3409 if (!strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") || !strcmp(model,"NSM-1"))
3411 if (!strcmp(argv[0],"caller") && argc<3)
3413 if (!strcmp(argv[0],"op") && argc<3)
3417 error=GSM->SetBitmap(&bitmap);
3421 case GE_NONE: oldbit.type=bitmap.type;
3422 oldbit.number=bitmap.number;
3423 if (GSM->GetBitmap(&oldbit)==GE_NONE) {
3424 if (bitmap.type==GSM_WelcomeNoteText ||
3425 bitmap.type==GSM_DealerNoteText) {
3426 if (strcmp(bitmap.text,oldbit.text)) {
3427 fprintf(stderr, _("Error setting"));
3428 if (bitmap.type==GSM_DealerNoteText) fprintf(stderr, _(" dealer"));
3429 fprintf(stderr, _(" welcome note - "));
3431 /* I know, it looks horrible, but... */
3432 /* I set it to the short string - if it won't be set */
3433 /* it means, PIN is required. If it will be correct, previous */
3434 /* (user) text was too long */
3436 /* Without it, I could have such thing: */
3437 /* user set text to very short string (for example, "Marcin") */
3438 /* then enable phone without PIN and try to set it to the very long (too long for phone) */
3439 /* string (which start with "Marcin"). If we compare them as only length different, we could think, */
3440 /* that phone accepts strings 6 chars length only (length of "Marcin") */
3441 /* When we make it correct, we don't have this mistake */
3443 strcpy(oldbit.text,"!\0");
3444 GSM->SetBitmap(&oldbit);
3445 GSM->GetBitmap(&oldbit);
3446 if (oldbit.text[0]!='!') {
3447 fprintf(stderr, _("SIM card and PIN is required\n"));
3449 GSM->SetBitmap(&bitmap);
3450 GSM->GetBitmap(&oldbit);
3451 fprintf(stderr, _("too long, truncated to \"%s\" (length %i)\n"),oldbit.text,strlen(oldbit.text));
3456 if (bitmap.type==GSM_StartupLogo) {
3457 for (i=0;i<oldbit.size;i++) {
3458 if (oldbit.bitmap[i]!=bitmap.bitmap[i]) {
3459 fprintf(stderr, _("Error setting startup logo - SIM card and PIN is required\n"));
3467 if (ok) fprintf(stdout, _("Done.\n"));
3469 case GE_NOTIMPLEMENTED:fprintf(stderr, _("Function not implemented.\n"));
3471 case GE_NOTSUPPORTED:fprintf(stderr, _("This kind of logo is not supported.\n"));
3473 default:fprintf(stderr, _("Error (wrong location ?) !\n"));
3482 /* Calendar notes receiving. */
3484 int getcalendarnote(int argc, char *argv[])
3486 GSM_CalendarNote CalendarNote;
3487 GSM_NotesInfo NotesInfo;
3493 bool was_note=false;
3494 char z_text[MAX_CALENDAR_TEXT_LENGTH+11];
3496 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
3504 now=localtime(&nowh);
3506 Date.Year = now->tm_year;
3508 /* I have 100 (for 2000) Year now :-) */
3509 if (Date.Year>99 && Date.Year<1900) {
3510 Date.Year=Date.Year+1900;
3513 start=atoi(argv[0]);
3518 if (!strcmp(argv[argc-1],"-v10")) {
3521 if (!strcmp(argv[argc-1],"-v30")) {
3530 if (!strcmp(argv[argc-1],"-v10")) {
3533 if (!strcmp(argv[argc-1],"-v30")) {
3545 while (GSM->GetModel(model) != GE_NONE)
3548 if (!strcmp(argv[0],"-s") || !strcmp(argv[0],"--short"))
3550 else if (!isdigit(argv[0][0])) {
3555 error=GSM->GetCalendarNotesInfo(&NotesInfo);
3556 if ( error == GE_NONE ) {
3557 if( NotesInfo.HowMany == 0 ) {
3558 fprintf(stderr, _("Sorry! No Calendar Notes present on phone.\n"));
3559 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3562 fprintf(stdout, _(" CALENDAR NOTES INFO \n"));
3563 fprintf(stdout, _("---------------------\n"));
3564 fprintf(stdout, _("How Many Locations :%d\n"), NotesInfo.HowMany);
3566 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3567 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3568 fprintf(stdout, _("Locations are :\n"));
3569 for(i=0;i<NotesInfo.HowMany;i++)
3570 fprintf(stdout, _("%4d) %4d\n"), i+1, NotesInfo.Location[i]);
3574 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3575 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3576 fprintf(stderr, _("Can't read Notes Infos from phone.\n"));
3577 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3581 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) {
3583 NotesInfo.HowMany=200;
3584 for (i=0;i<200;i++) {
3585 NotesInfo.Location[i]=i+1;
3589 if( vInfo && stop!=(-1) && error==GE_NONE )
3591 /* Info datas (for 7110 and comp.) */
3592 fprintf(stdout, _(" CALENDAR NOTES SUMMARY INFORMATION \n"));
3593 fprintf(stdout, _(" ==================================\n"));
3594 if (GetModelFeature (FN_CALENDAR)==F_CAL71) {
3595 fprintf(stdout, _("Calendar notes present on phone: %d\n"), NotesInfo.HowMany);
3596 fprintf(stdout, _("Locations are :\n"));
3598 fprintf(stdout, "----------------------------------------------------------------------------\n");
3599 fprintf(stdout,_(" Loc Phys Type Summary description Dt start Alarm Recurs\n") );
3600 fprintf(stdout, "----------------------------------------------------------------------------\n");
3602 for(i=0;i<NotesInfo.HowMany;i++)
3604 /* very short format ... */
3606 fprintf(stdout, _("%4d) %4d\n"), i, NotesInfo.Location[i]);
3608 CalendarNote.Location=i+1;
3609 CalendarNote.ReadNotesInfo=false;
3611 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3614 switch (CalendarNote.Type) {
3615 case GCN_REMINDER:strcpy(z_type, "REMIND"); break;
3616 case GCN_CALL: strcpy(z_type, "CALL"); break;
3617 case GCN_MEETING: strcpy(z_type, "MEETING"); break;
3618 case GCN_BIRTHDAY:strcpy(z_type, "BDAY"); break;
3619 default: strcpy(z_type, "UNKNOWN"); break;
3622 if( CalendarNote.Recurrance ) {
3623 sprintf( z_recur,"%d ", CalendarNote.Recurrance/24 );
3624 strcat( z_recur, CalendarNote.Recurrance == 1 ? "day" : "days" );
3627 strcpy( z_recur, "No" );
3631 if( CalendarNote.Type == GCN_CALL )
3632 sprintf(z_text, "\"%s\"", CalendarNote.Phone );
3634 if (CalendarNote.Text[0]!=0)
3635 sprintf(z_text, "\"%s\"", CalendarNote.Text );
3637 if(CalendarNote.Type == GCN_BIRTHDAY) {
3639 i_age = Date.Year - CalendarNote.Time.Year;
3640 sprintf(z_text, "\"%s (%d %s)\"", CalendarNote.Text,
3641 i_age, (i_age==1)?"year":"years");
3642 strcpy( z_recur, "-" );
3643 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3645 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3646 i+1,NotesInfo.Location[i], z_type, z_text,
3647 CalendarNote.Time.Year,
3648 CalendarNote.Time.Month,
3649 CalendarNote.Time.Day,
3650 (CalendarNote.AlarmType==0x00) ? "Tone " : "Silent",
3654 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3655 i+1,NotesInfo.Location[i], z_type, z_text,
3656 CalendarNote.Time.Year,
3657 CalendarNote.Time.Month,
3658 CalendarNote.Time.Day,
3659 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3662 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3664 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3665 i+1,NotesInfo.Location[i], z_type, z_text,
3666 CalendarNote.Time.Year,
3667 CalendarNote.Time.Month,
3668 CalendarNote.Time.Day,
3669 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3673 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s\n"),
3674 i+1,NotesInfo.Location[i], z_type, z_text,
3675 CalendarNote.Time.Year,
3676 CalendarNote.Time.Month,
3677 CalendarNote.Time.Day,
3678 (CalendarNote.Alarm.Year) ? "Yes" : "No ");
3680 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) break;
3685 for (i=start;i<=stop;i++) {
3686 if (error==GE_NONE) {
3687 if( i>NotesInfo.HowMany ) {
3688 fprintf(stderr, _("Only %d Calendar Notes present on phone!\n"),NotesInfo.HowMany);
3692 fprintf(stderr, _("Calendar Notes location can't be zero... skipping.\n"));
3697 CalendarNote.Location=i;
3698 CalendarNote.ReadNotesInfo=false;
3700 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3704 fprintf(stdout, GSM_GetVCALENDARStart(vCalVer));
3708 fprintf(stdout, GSM_GetVCALENDARNote(&CalendarNote,vCalVer));
3710 } else { /* not vCal */
3713 fprintf(stdout, "\n");
3718 fprintf(stdout, _(" Type of the note: "));
3720 switch (CalendarNote.Type) {
3722 case GCN_REMINDER:fprintf(stdout, _("Reminder\n"));break;
3723 case GCN_CALL :fprintf(stdout, _("Call\n")); break;
3724 case GCN_MEETING :fprintf(stdout, _("Meeting\n")); break;
3725 case GCN_BIRTHDAY:fprintf(stdout, _("Birthday\n"));break;
3726 default: fprintf(stdout, _("Unknown\n"));
3730 /* For 3310: set date to 2090! */
3731 if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
3732 fprintf(stdout, _(" Date: xxxx-%02d-%02d\n"), CalendarNote.Time.Month,
3733 CalendarNote.Time.Day);
3735 fprintf(stdout, _(" Date: %s %d-%02d-%02d\n"),
3736 DayOfWeek(CalendarNote.Time.Year, CalendarNote.Time.Month, CalendarNote.Time.Day),
3737 CalendarNote.Time.Year,
3738 CalendarNote.Time.Month,
3739 CalendarNote.Time.Day);
3742 fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CalendarNote.Time.Hour,
3743 CalendarNote.Time.Minute,
3744 CalendarNote.Time.Second);
3746 if (CalendarNote.Alarm.Year!=0) {
3747 fprintf(stdout, _(" Alarm date: %s %d-%02d-%02d\n"),
3748 DayOfWeek(CalendarNote.Alarm.Year, CalendarNote.Alarm.Month, CalendarNote.Alarm.Day),
3749 CalendarNote.Alarm.Year,
3750 CalendarNote.Alarm.Month,
3751 CalendarNote.Alarm.Day);
3753 fprintf(stdout, _(" Alarm time: %02d:%02d:%02d\n"), CalendarNote.Alarm.Hour,
3754 CalendarNote.Alarm.Minute,
3755 CalendarNote.Alarm.Second);
3756 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 )
3757 fprintf(stdout, _(" Alarm type: %s\n"), (CalendarNote.AlarmType==0x00) ?
3758 "With Tone" : "Silent" );
3761 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && CalendarNote.Recurrance!= 0 )
3762 fprintf(stdout, " It repeat every %d day%s\n", CalendarNote.Recurrance/24,
3763 ((CalendarNote.Recurrance/24)>1) ? "s":"" );
3765 if (CalendarNote.Type == GCN_BIRTHDAY)
3768 i_age = Date.Year - CalendarNote.Time.Year;
3769 fprintf(stdout, _(" Text: %s (%d %s)\n"), CalendarNote.Text,
3770 i_age, (i_age==1)?"year":"years");
3772 if (CalendarNote.Text[0]!=0)
3773 fprintf(stdout, _(" Text: %s\n"), CalendarNote.Text);
3776 if (CalendarNote.Type == GCN_CALL)
3777 fprintf(stdout, _(" Phone: %s\n"), CalendarNote.Phone);
3780 fprintf(stderr, _("The calendar note %i can not be read\n"),i);
3784 if (was_note && vCalVer!=0) {
3785 fprintf(stdout, GSM_GetVCALENDAREnd(vCalVer));
3793 /* Writing calendar notes. */
3795 int writecalendarnote(char *argv[])
3797 GSM_CalendarNote CalendarNote;
3801 number=atoi(argv[1]);
3804 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
3808 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
3811 case GE_CANTOPENFILE:
3812 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
3815 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
3818 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
3824 /* Error 22=Calendar full ;-) */
3826 error=GSM->WriteCalendarNote(&CalendarNote);
3829 fprintf(stdout, _("Succesfully written!\n"));break;
3831 fprintf(stdout, _("Too long text in calendar note!\n"));break;
3833 fprintf(stdout, _("Failed to write calendar note!\n"));break;
3841 /* Calendar note deleting. */
3843 int deletecalendarnote(char *Index)
3846 GSM_CalendarNote CalendarNote;
3848 CalendarNote.Location=atoi(Index);
3852 if (GSM->DeleteCalendarNote(&CalendarNote) == GE_NONE) {
3853 fprintf(stdout, _(" Calendar note deleted.\n"));
3856 fprintf(stderr, _("The calendar note can not be deleted\n"));
3867 /* Setting the date and time. */
3869 int setdatetime(int argc, char *argv[])
3878 now=localtime(&nowh);
3880 Date.Year = now->tm_year;
3881 Date.Month = now->tm_mon+1;
3882 Date.Day = now->tm_mday;
3883 Date.Hour = now->tm_hour;
3884 Date.Minute = now->tm_min;
3885 Date.Second = now->tm_sec;
3887 if (argc>0) Date.Year = atoi (argv[0]);
3888 if (argc>1) Date.Month = atoi (argv[1]);
3889 if (argc>2) Date.Day = atoi (argv[2]);
3890 if (argc>3) Date.Hour = atoi (argv[3]);
3891 if (argc>4) Date.Minute = atoi (argv[4]);
3896 /* Well, this thing is copyrighted in U.S. This technique is known as
3897 Windowing and you can read something about it in LinuxWeekly News:
3898 http://lwn.net/1999/features/Windowing.phtml. This thing is beeing
3899 written in Czech republic and Poland where algorithms are not allowed
3903 Date.Year = Date.Year+1900;
3905 Date.Year = Date.Year+2000;
3908 /* FIXME: Error checking should be here. */
3909 GSM->SetDateTime(&Date);
3916 /* In this mode we receive the date and time from mobile phone. */
3918 int getdatetime(void) {
3920 GSM_DateTime date_time;
3924 if (GSM->GetDateTime(&date_time)==GE_NONE) {
3925 if (date_time.IsSet) {
3926 fprintf(stdout, _("Date: %s %4d/%02d/%02d\n"),
3927 DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
3928 date_time.Year, date_time.Month, date_time.Day);
3929 fprintf(stdout, _("Time: %02d:%02d:%02d\n"), date_time.Hour, date_time.Minute, date_time.Second);
3931 fprintf(stdout, _("Date and time not set in phone\n"));
3934 fprintf(stdout,_("Error!\n"));
3942 /* Setting the alarm. */
3944 int setalarm(char *argv[])
3951 Date.Hour = atoi(argv[0]);
3952 Date.Minute = atoi(argv[1]);
3954 GSM->SetAlarm(1, &Date);
3961 /* Getting the alarm. */
3963 int getalarm(void) {
3965 GSM_DateTime date_time;
3969 if (GSM->GetAlarm(0, &date_time)==GE_NONE) {
3970 fprintf(stdout, _("Alarm: %s\n"), (date_time.IsSet)?"on":"off");
3971 fprintf(stdout, _("Time: %02d:%02d\n"), date_time.Hour, date_time.Minute);
3973 fprintf(stdout,_("Error!\n"));
3981 /* In monitor mode we don't do much, we just initialise the fbus code.
3982 Note that the fbus code no longer has an internal monitor mode switch,
3983 instead compile with DEBUG enabled to get all the gumpf. */
3985 int monitormode(int argc, char *argv[])
3988 float rflevel=-1, batterylevel=-1;
3989 unsigned char loop=1;
3991 GSM_PowerSource powersource=-1;
3992 GSM_RFUnits rf_units = GRF_Arbitrary;
3993 GSM_BatteryUnits batt_units = GBU_Arbitrary;
3995 GSM_NetworkInfo NetworkInfo;
3996 GSM_CBMessage CBMessage;
3998 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
3999 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
4000 GSM_MemoryStatus DC_MemoryStatus = {GMT_DC, 0, 0};
4001 GSM_MemoryStatus EN_MemoryStatus = {GMT_EN, 0, 0};
4002 GSM_MemoryStatus FD_MemoryStatus = {GMT_FD, 0, 0};
4003 GSM_MemoryStatus LD_MemoryStatus = {GMT_LD, 0, 0};
4004 GSM_MemoryStatus MC_MemoryStatus = {GMT_MC, 0, 0};
4005 GSM_MemoryStatus ON_MemoryStatus = {GMT_ON, 0, 0};
4006 GSM_MemoryStatus RC_MemoryStatus = {GMT_RC, 0, 0};
4008 GSM_SMSStatus SMSStatus = {0, 0};
4012 /* evaluate for presence of "-noloop" argument in parameter */
4015 if( strcmp(argv[0],"-noloop" ) && strcmp(argv[0],"-nl" ))
4024 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
4027 signal(SIGINT, interrupted);
4029 fprintf (stderr, _("Entering monitor mode...\n"));
4030 fprintf (stderr, _("Initialising GSM interface...\n"));
4032 /* Initialise the code for the GSM interface. */
4037 GSM->EnableCellBroadcast();
4039 /* Loop here indefinitely - allows you to see messages from GSM code in
4040 response to unknown messages etc. The loops ends after pressing the
4042 while (!bshutdown) {
4043 if (GSM->GetRFLevel(&rf_units, &rflevel) == GE_NONE)
4044 fprintf(stdout, _("RFLevel: %d\n"), (int)rflevel);
4046 if (GSM->GetBatteryLevel(&batt_units, &batterylevel) == GE_NONE)
4047 fprintf(stdout, _("Battery: %d\n"), (int)batterylevel);
4049 if (GSM->GetPowerSource(&powersource) == GE_NONE)
4050 fprintf(stdout, _("Power Source: %s\n"), (powersource==GPS_ACDC)?_("AC/DC"):_("battery"));
4052 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE)
4053 fprintf(stdout, _("SIM: Used %d, Free %d\n"), SIMMemoryStatus.Used, SIMMemoryStatus.Free);
4055 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE)
4056 fprintf(stdout, _("Phone: Used %d, Free %d\n"), PhoneMemoryStatus.Used, PhoneMemoryStatus.Free);
4058 if (GSM->GetMemoryStatus(&DC_MemoryStatus) == GE_NONE)
4059 fprintf(stdout, _("DC: Used %d, Free %d\n"), DC_MemoryStatus.Used, DC_MemoryStatus.Free);
4061 if (GSM->GetMemoryStatus(&EN_MemoryStatus) == GE_NONE)
4062 fprintf(stdout, _("EN: Used %d, Free %d\n"), EN_MemoryStatus.Used, EN_MemoryStatus.Free);
4064 if (GSM->GetMemoryStatus(&FD_MemoryStatus) == GE_NONE)
4065 fprintf(stdout, _("FD: Used %d, Free %d\n"), FD_MemoryStatus.Used, FD_MemoryStatus.Free);
4067 if (GSM->GetMemoryStatus(&LD_MemoryStatus) == GE_NONE)
4068 fprintf(stdout, _("LD: Used %d, Free %d\n"), LD_MemoryStatus.Used, LD_MemoryStatus.Free);
4070 if (GSM->GetMemoryStatus(&MC_MemoryStatus) == GE_NONE)
4071 fprintf(stdout, _("MC: Used %d, Free %d\n"), MC_MemoryStatus.Used, MC_MemoryStatus.Free);
4073 if (GSM->GetMemoryStatus(&ON_MemoryStatus) == GE_NONE)
4074 fprintf(stdout, _("ON: Used %d, Free %d\n"), ON_MemoryStatus.Used, ON_MemoryStatus.Free);
4076 if (GSM->GetMemoryStatus(&RC_MemoryStatus) == GE_NONE)
4077 fprintf(stdout, _("RC: Used %d, Free %d\n"), RC_MemoryStatus.Used, RC_MemoryStatus.Free);
4079 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE)
4080 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"), SMSStatus.UnRead, SMSStatus.Number);
4082 if (GSM->GetIncomingCallNr(Number) == GE_NONE)
4083 fprintf(stdout, _("Incoming call: %s\n"), Number);
4085 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE)
4086 fprintf(stdout, _("Network: %s (%s), LAC: %s, CellID: %s\n"), GSM_GetNetworkName (NetworkInfo.NetworkCode), GSM_GetCountryName(NetworkInfo.NetworkCode), NetworkInfo.LAC, NetworkInfo.CellID);
4088 if (GSM->ReadCellBroadcast(&CBMessage) == GE_NONE)
4089 fprintf(stdout, _("Cell broadcast received on channel %d: %s\n"), CBMessage.Channel, CBMessage.Message);
4096 if( loop ) fprintf (stderr, _("Leaving monitor mode...\n"));
4103 /* Shows texts from phone's display */
4112 error=GSM->EnableDisplayOutput();
4114 if (error == GE_NONE)
4117 /* We do not want to see texts forever - press Ctrl+C to stop. */
4119 signal(SIGINT, interrupted);
4121 fprintf (stderr, _("Entering display monitoring mode...\n"));
4123 /* Loop here indefinitely - allows you to read texts from phone's
4124 display. The loops ends after pressing the Ctrl+C. */
4129 fprintf (stderr, _("Leaving display monitor mode...\n"));
4131 error=GSM->DisableDisplayOutput();
4133 fprintf (stderr, _("Error!\n"));
4135 fprintf (stderr, _("Error!\n"));
4142 /* Displays names of available ringtones */
4145 char model[64], rev[64];
4150 while (GSM->GetRevision(rev) != GE_NONE)
4153 while (GSM->GetModel(model) != GE_NONE)
4156 strncpy(rev,rev+2,5);
4158 PrepareRingingTones(model,rev);
4160 for (i=1;i<=NumberOfRingtones();i++)
4162 fprintf(stdout,_("%i. %s\n"),i,RingingToneName(0,i));
4171 /* Reads profile from phone and displays its' settings */
4173 int getprofile(int argc, char *argv[])
4178 GSM_Profile profile;
4181 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4182 char model[64], rev[64];
4184 /* Initialise the code for the GSM interface. */
4189 error=GSM->GetProfile(&profile);
4191 if (error == GE_NONE)
4194 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4196 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4198 strncpy(rev,rev+2,5);
4200 PrepareRingingTones(model,rev);
4202 switch(GetModelFeature (FN_PROFILES)) {
4203 case F_PROF33:max_profiles=6;break;
4204 case F_PROF51:max_profiles=3;break;
4205 default :max_profiles=7;break;
4210 profile.Number=atoi(argv[0])-1;
4211 start=profile.Number;
4214 if (profile.Number < 0)
4216 fprintf(stderr, _("Profile number must be value from 1 to %d!\n"), max_profiles);
4221 if (profile.Number >= max_profiles)
4223 fprintf(stderr, _("This phone supports only %d profiles!\n"), max_profiles);
4237 if (profile.Number!=0) GSM->GetProfile(&profile);
4239 printf("%d. \"%s\"", (profile.Number+1), profile.Name);
4240 if (profile.DefaultName==-1) printf(" (name defined)");
4244 printf("Incoming call alert: %d\n", profile.CallAlert);
4245 printf("Ringtone ID: %d\n", profile.Ringtone);
4246 printf("Ringing volume: %d\n", profile.Volume);
4247 printf("Message alert tone: %d\n", profile.MessageTone);
4248 printf("Keypad tones: %d\n", profile.KeypadTone);
4249 printf("Warning and game tones: %d\n", profile.WarningTone);
4250 printf("Lights: %d\n", profile.Lights);
4251 printf("Vibration: %d\n", profile.Vibration);
4252 printf("Caller groups: 0x%02x\n", profile.CallerGroups);
4253 printf("Automatic answer: %d\n", profile.AutomaticAnswer);
4254 printf("Screen saver: %d\n", profile.ScreenSaver);
4258 printf("Incoming call alert: %s\n", GetProfileCallAlertString(profile.CallAlert));
4260 /* For different phones different ringtones names */
4261 if (strcmp(RingingToneName(profile.Ringtone,0),""))
4262 printf(_("Ringing tone: %s (number %d in phone menu)\n"),
4263 RingingToneName(profile.Ringtone,0), RingingToneMenu(profile.Ringtone));
4265 printf(_("Ringtone number: %d\n"), profile.Ringtone);
4267 printf(_("Ringing volume: %s\n"), GetProfileVolumeString(profile.Volume));
4269 printf(_("Message alert tone: %s\n"), GetProfileMessageToneString(profile.MessageTone));
4271 printf(_("Keypad tones: %s\n"), GetProfileKeypadToneString(profile.KeypadTone));
4273 printf(_("Warning and game tones: %s\n"), GetProfileWarningToneString(profile.WarningTone));
4275 if (GetModelFeature (FN_SCREENSAVER)!=0)
4276 printf(_("Screen saver: %s\n"), GetProfileOnOffString(profile.ScreenSaver));
4278 printf(_("Vibration: %s\n"), GetProfileVibrationString(profile.Vibration));
4280 /* It has been nice to add here reading caller group name. ;^) */
4281 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
4282 printf(_("Caller groups: %s\n"),
4283 GetProfileCallerGroups(profile.CallerGroups) );
4285 /* FIXME: need make investigation for 3310 for these features. For now unknown */
4286 if (GetModelFeature (FN_PROFILES)!=F_PROF33) {
4287 /* FIXME: Light settings is only used for Car */
4288 if (profile.Number==(max_profiles-2)) printf(_("Lights: %s\n"), profile.Lights ? _("On") : _("Automatic"));
4290 /* FIXME: Automatic answer is only used for Car and Headset. */
4291 if (profile.Number>=(max_profiles-2)) printf(_("Automatic answer: %s\n"), GetProfileOnOffString(profile.AutomaticAnswer));
4299 if (error == GE_NOTIMPLEMENTED) {
4300 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4305 fprintf(stderr, _("Unspecified error\n"));
4317 /* Sets profile feature */
4319 int setprofile(int argc, char *argv[])
4322 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4323 char model[64], rev[64];
4326 GSM_Profile profile;
4327 GSM_Profile profile2, profile3;
4332 /* Initialise the code for the GSM interface. */
4338 error = GSM->GetProfile(&profile);
4340 if (error == GE_NONE)
4343 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4345 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4347 strncpy(rev,rev+2,5);
4349 PrepareRingingTones(model,rev);
4351 switch(GetModelFeature (FN_PROFILES)) {
4352 case F_PROF33:max_profiles=6;break;
4353 case F_PROF51:max_profiles=3;break;
4354 default :max_profiles=7;break;
4357 profile.Number=atoi (argv[0]);
4358 profile.Number=profile.Number-1;
4360 if (profile.Number < 0)
4362 fprintf(stderr, _("Profile number must be value from 1 to %i!\n"), max_profiles);
4367 if (profile.Number >= max_profiles)
4369 fprintf(stderr, _("This phone supports only %i profiles!\n"), max_profiles);
4374 if (profile.Number!=0) GSM->GetProfile(&profile);
4379 if (strcmp(argv[1], "callalert")==0)
4381 if (strcmp(argv[2], "ringing")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGING;correct_arg2=true;}
4382 if (strcmp(argv[2], "ascending")==0) {profile.CallAlert=PROFILE_CALLALERT_ASCENDING;correct_arg2=true;}
4383 if (strcmp(argv[2], "ringonce")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGONCE;correct_arg2=true;}
4384 if (strcmp(argv[2], "beeponce")==0) {profile.CallAlert=PROFILE_CALLALERT_BEEPONCE;correct_arg2=true;}
4385 if (strcmp(argv[2], "groups")==0)
4387 profile.CallAlert=PROFILE_CALLALERT_CALLERGROUPS;
4389 /*Ignored by N5110*/
4390 /*FIX ME: it's ignored by N5130 and 3210 too*/
4391 if (max_profiles==3) fprintf(stdout, _("Warning: value \"groups\" for profile feature \"callalert\" will be ignored in this phone model !\n"));
4393 if (strcmp(argv[2], "off")==0 || strcmp(argv[2], "0")==0) {profile.CallAlert=PROFILE_CALLALERT_OFF;correct_arg2=true;}
4396 fprintf(stderr, _("Correct parameters for profile feature \"callalert\" are ringing|ascending|ringonce|beeponce|groups|off|0 !\n"));
4402 if (strcmp(argv[1], "volume")==0)
4404 if (strcmp(argv[2], "1")==0) {profile.Volume=PROFILE_VOLUME_LEVEL1;correct_arg2=true;}
4405 if (strcmp(argv[2], "2")==0) {profile.Volume=PROFILE_VOLUME_LEVEL2;correct_arg2=true;}
4406 if (strcmp(argv[2], "3")==0) {profile.Volume=PROFILE_VOLUME_LEVEL3;correct_arg2=true;}
4407 if (strcmp(argv[2], "4")==0) {profile.Volume=PROFILE_VOLUME_LEVEL4;correct_arg2=true;}
4408 if (strcmp(argv[2], "5")==0) {profile.Volume=PROFILE_VOLUME_LEVEL5;correct_arg2=true;}
4411 fprintf(stderr, _("Correct parameters for profile feature \"volume\" are 0|1|2|3|4|5 !\n"));
4417 if (strcmp(argv[1], "keypad")==0 || strcmp(argv[1], "keypadtone")==0)
4419 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.KeypadTone=PROFILE_KEYPAD_OFF;correct_arg2=true;}
4420 if (strcmp(argv[2], "1")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL1;correct_arg2=true;}
4421 if (strcmp(argv[2], "2")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL2;correct_arg2=true;}
4422 if (strcmp(argv[2], "3")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL3;correct_arg2=true;}
4425 fprintf(stderr, _("Correct parameters for profile feature \"keypad|keypadtone\" are off|0|1|2|3 !\n"));
4431 if (strcmp(argv[1], "messagetone")==0 || strcmp(argv[1], "smstone")==0 || strcmp(argv[1], "sms")==0 || strcmp(argv[1], "message")==0)
4433 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.MessageTone=PROFILE_MESSAGE_NOTONE;correct_arg2=true;}
4434 if (strcmp(argv[2], "standard")==0) {profile.MessageTone=PROFILE_MESSAGE_STANDARD;correct_arg2=true;}
4435 if (strcmp(argv[2], "special")==0) {profile.MessageTone=PROFILE_MESSAGE_SPECIAL;correct_arg2=true;}
4436 if (strcmp(argv[2], "beeponce")==0 || strcmp(argv[2], "once")==0) {profile.MessageTone=PROFILE_MESSAGE_BEEPONCE;correct_arg2=true;}
4437 if (strcmp(argv[2], "ascending")==0) {profile.MessageTone=PROFILE_MESSAGE_ASCENDING;correct_arg2=true;}
4440 fprintf(stderr, _("Correct parameters for profile feature \"messagetone|smstone|message|sms\" are 0|off|standard|special|beeponce|once|ascending !\n"));
4446 if (strcmp(argv[1], "warningtone")==0 || strcmp(argv[1], "warning")==0)
4448 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.WarningTone=PROFILE_WARNING_OFF;correct_arg2=true;}
4449 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.WarningTone=PROFILE_WARNING_ON;correct_arg2=true;}
4452 fprintf(stderr, _("Correct parameters for profile feature \"warningtone|warning\" are 0|off|1|on !\n"));
4458 if (strcmp(argv[1], "vibra")==0 || strcmp(argv[1], "vibration")==0)
4460 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Vibration=PROFILE_VIBRATION_OFF;correct_arg2=true;}
4461 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Vibration=PROFILE_VIBRATION_ON;correct_arg2=true;}
4464 fprintf(stderr, _("Correct parameters for profile feature \"vibration|vibra\" are 0|off|1|on !\n"));
4470 if (strcmp(argv[1], "lights")==0)
4472 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Lights=-1;correct_arg2=true;}
4473 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Lights=0;correct_arg2=true;}
4476 fprintf(stderr, _("Correct parameters for profile feature \"lights\" are 0|off|1|on !\n"));
4480 if (profile.Number!=(max_profiles-2))
4482 profile2.Number=max_profiles-2;
4483 if (GSM->GetProfile(&profile2)==GE_NONE)
4485 fprintf(stdout, _("Warning: \"Lights\" feature is ignored in this profile (only setting it for \"%s\" profile get some results) !\n"), profile2.Name);
4490 if (strcmp(argv[1], "answer")==0)
4492 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.AutomaticAnswer=-1;correct_arg2=true;}
4493 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.AutomaticAnswer=0;correct_arg2=true;}
4496 fprintf(stderr, _("Correct parameters for profile feature \"answer\" are 0|off|1|on !\n"));
4500 if (profile.Number<(max_profiles-2))
4502 profile2.Number=max_profiles-2;
4503 if (GSM->GetProfile(&profile2)==GE_NONE)
4505 profile3.Number=max_profiles-1;
4506 if (GSM->GetProfile(&profile3)==GE_NONE)
4508 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);
4514 if (strcmp(argv[1], "name")==0)
4516 strcpy(profile.Name,argv[2]);
4517 /*Ignored by N5110*/
4518 /*FIX ME: it's ignored by N5130 and 3210 too*/
4519 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change profile name !\n"));
4522 if (strcmp(argv[1], "ringtone")==0)
4524 profile.Ringtone=atoi(argv[2]);
4525 if (profile.Ringtone<1)
4527 /*With value 0 results are interesting in N5110, but can't be used for anything*/
4528 fprintf(stderr, _("Ringtone number must be higher than 0 !\n"));
4533 if (profile.Ringtone>NumberOfRingtones())
4535 fprintf(stderr, _("Ringtone number too high (max %i) !\n"),NumberOfRingtones());
4539 profile.Ringtone=RingingToneCode(profile.Ringtone);
4540 if (profile.Ringtone==0)
4542 fprintf(stderr, _("Warning: we don't know ringtones codes for this model ! Can you contact with gnokii authors to add it into source ?\n"));
4546 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"));
4550 if (strcmp(argv[1], "groups")==0)
4552 /*Ignored by N5110*/
4553 /*FIX ME: it's ignored by N5130 and 3210 too*/
4554 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change caller group name !\n"));
4555 profile.CallerGroups=atoi(argv[2]);
4561 fprintf(stderr, _("Correct profile feature names are callalert|volume|keypad|keypadtone|messagetone|smstone|message|sms|warningtone|warning|vibra|vibration|lights|answer|name|groups !\n"));
4566 GSM->SetProfile(&profile);
4569 if (error == GE_NOTIMPLEMENTED) {
4570 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4575 fprintf(stderr, _("Unspecified error\n"));
4587 /* Get requested range of memory storage entries and output to stdout in
4588 easy-to-parse format */
4590 int getmemory(int argc, char *argv[])
4593 GSM_PhonebookEntry entry;
4598 char memory_type_string[20];
4601 int i_used = 0, n_used=0;
4603 char *output_opt = NULL;
4605 char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
4606 bool formatdone=false;
4609 /* group names init */
4610 for(i=0;i<5;i++) az_group_name[i][0]='\0';
4612 /* Handle command line args that set type, start and end locations. */
4613 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
4615 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
4618 GetMemoryTypeString(memory_type_string, &entry.MemoryType);
4620 if (argv[argc-1][0] == '-')
4621 output_opt = argv[--argc];
4623 /* Do generic initialisation routine */
4627 while ((error = GSM->GetModel(buf)) != GE_NONE && i++ < 15)
4632 start_entry = atoi (argv[1]);
4633 end_entry = argc > 2 ? atoi( argv[2]) : start_entry;
4635 GSM_MemoryStatus stats = {entry.MemoryType, 0, 0};
4639 if (GSM->GetMemoryStatus( &stats) != GE_NONE) {
4640 fprintf( stderr, _("Error reading memory status.\n"));
4644 n_used = stats.Used;
4645 end_entry = stats.Used + stats.Free;
4649 /* Now retrieve the requested entries. */
4651 for (count = start_entry;
4652 count <= end_entry && (!do_all || i_used < n_used);
4655 entry.Location=count;
4657 error=GSM->GetMemoryLocation(&entry);
4661 if (entry.SubEntriesCount || strcmp( entry.Number, ""))
4665 if (output_opt && !strcmp( output_opt,"-v30")) {
4666 semicolon_pipe_substitution( &entry, 0 );
4667 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,30));
4670 if (output_opt && !strcmp(output_opt,"-v21")) {
4671 semicolon_pipe_substitution( &entry, 0 );
4672 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,21));
4675 if (output_opt && !strcmp(output_opt,"-v")) {
4676 semicolon_pipe_substitution( &entry, 0 );
4677 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,10));
4680 if (output_opt && !strcmp(output_opt,"-short")) {
4681 semicolon_pipe_substitution( &entry, 0 );
4682 fprintf(stdout, "%s;%s;%s;%d;%d;", entry.Name, entry.Number, memory_type_string, entry.Location, entry.Group);
4683 for( i = 0; i < entry.SubEntriesCount; i++ )
4685 if( entry.SubEntries[i].EntryType == GSM_Date )
4686 fprintf(stdout,_("%u;%u;%u;%02u.%02u.%04u;%02u:%02u:%02u;"),
4687 entry.SubEntries[i].EntryType,
4688 entry.SubEntries[i].NumberType,
4689 entry.SubEntries[i].BlockNumber,
4690 entry.SubEntries[i].data.Date.Day,
4691 entry.SubEntries[i].data.Date.Month,
4692 entry.SubEntries[i].data.Date.Year,
4693 entry.SubEntries[i].data.Date.Hour,
4694 entry.SubEntries[i].data.Date.Minute,
4695 entry.SubEntries[i].data.Date.Second );
4697 fprintf(stdout,_("%u;%u;%u;%s;"),
4698 entry.SubEntries[i].EntryType,
4699 entry.SubEntries[i].NumberType,
4700 entry.SubEntries[i].BlockNumber,
4701 entry.SubEntries[i].data.Number );
4703 fprintf(stdout,_("\n"));
4709 fprintf(stdout, "Memory %s, location %d\n",memory_type_string, entry.Location);
4711 // check if some info in subentries
4712 for( i = 0; i < entry.SubEntriesCount; i++ )
4713 if( entry.SubEntries[i].EntryType != GSM_Date &&
4714 strcmp(entry.SubEntries[i].data.Number,"") )
4717 if (strcmp(entry.Number,"") || i < entry.SubEntriesCount) {
4718 if (strcmp(entry.Name,"")) fprintf(stdout,_(" Name: %s\n"),entry.Name);
4719 if (strcmp(entry.Number,"")) fprintf(stdout,_(" Number: %s\n"),entry.Number);
4720 bitmap.type=GSM_CallerLogo;
4721 bitmap.number=entry.Group;
4722 strcpy(z_gtype,"unknown");
4723 if (entry.Group==5) strcpy(z_gtype,"No group");
4724 if (entry.Group<5 && entry.Group>=0) {
4725 if (!strcmp(az_group_name[entry.Group],"")) {
4726 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
4727 if (GSM->GetBitmap(&bitmap)==GE_NONE)
4728 strcpy( az_group_name[entry.Group], bitmap.text );
4730 if ((!strcmp(az_group_name[entry.Group],""))) {
4731 switch(entry.Group) {
4732 case 0:strcpy(az_group_name[entry.Group],"Family");break;
4733 case 1:strcpy(az_group_name[entry.Group],"VIP");break;
4734 case 2:strcpy(az_group_name[entry.Group],"Friends");break;
4735 case 3:strcpy(az_group_name[entry.Group],"Colleagues");break;
4736 case 4:strcpy(az_group_name[entry.Group],"Other");break;
4741 strcpy(z_gtype,az_group_name[entry.Group]);
4743 fprintf(stdout,_(" Group: %d (%s)\n"),entry.Group+1,z_gtype);
4744 for( i = 0; i < entry.SubEntriesCount; i++ )
4746 if( entry.SubEntries[i].EntryType == GSM_Date ) {
4747 fprintf(stdout, " Date and time: %s %02u.%02u.%04u %02u:%02u:%02u\n",
4748 DayOfWeek(entry.SubEntries[i].data.Date.Year,
4749 entry.SubEntries[i].data.Date.Month,
4750 entry.SubEntries[i].data.Date.Day),
4751 entry.SubEntries[i].data.Date.Day,
4752 entry.SubEntries[i].data.Date.Month,
4753 entry.SubEntries[i].data.Date.Year,
4754 entry.SubEntries[i].data.Date.Hour,
4755 entry.SubEntries[i].data.Date.Minute,
4756 entry.SubEntries[i].data.Date.Second);
4759 if( strcmp(entry.SubEntries[i].data.Number,"") ) {
4761 switch( entry.SubEntries[i].EntryType ) {
4763 switch( entry.SubEntries[i].NumberType ) {
4764 case GSM_General: strcpy(z_etype,"General "); break;
4765 case GSM_Home: strcpy(z_etype,"Home "); break;
4766 case GSM_Mobile: strcpy(z_etype,"Mobile "); break;
4767 case GSM_Work: strcpy(z_etype,"Work "); break;
4768 case GSM_Fax: strcpy(z_etype,"Fax "); break;
4769 default: strcpy(z_etype,""); break;
4771 strcat(z_etype,"Number"); break;
4773 strcpy(z_etype,"Note"); break;
4775 strcpy(z_etype,"Postal"); break;
4777 strcpy(z_etype,"E-Mail"); break;
4779 strcpy(z_etype,"unknown data"); break;
4782 fprintf(stdout,_(" ---> Subentry: %u\n"),i+1);
4783 fprintf(stdout,_(" Entry type: %u (%s)\n"),entry.SubEntries[i].EntryType,z_etype);
4784 fprintf(stdout,_(" Number type: %u\n"),entry.SubEntries[i].NumberType);
4785 fprintf(stdout,_(" Block Number: %u\n"),entry.SubEntries[i].BlockNumber);
4787 fprintf(stdout,_(" %s: %s\n"),z_etype,entry.SubEntries[i].data.Number);
4791 if ((entry.MemoryType==GMT_DC ||
4792 entry.MemoryType==GMT_RC ||
4793 entry.MemoryType==GMT_MC) && !wasdate)
4794 fprintf(stdout,_(" Date and time not available\n"));
4796 fprintf(stdout,_(" Location empty\n"));
4799 case GE_NOTIMPLEMENTED:
4800 fprintf( stderr, _("Function not implemented in %s model!\n"), model);
4803 case GE_INVALIDMEMORYTYPE:
4804 fprintf( stderr, _("Memory type %s not supported!\n"),
4805 memory_type_string);
4809 fprintf(stdout, _("%s|%d|Bad location or other error!(%d)\n"),
4810 memory_type_string, count, error);
4819 /* Read data from stdin, parse and write to phone. The parsing is relatively
4820 crude and doesn't allow for much variation from the stipulated format. */
4822 int writephonebook(int argc, char *args[])
4825 GSM_PhonebookEntry entry;
4827 char *memory_type_string;
4828 int line_count=0,current,i;
4831 char *Line, OLine[1024], BackLine[1024];
4834 /* Check argument */
4836 if (strcmp("-i", args[0])) {
4841 /* Initialise fbus code */
4847 /* Go through data from stdin. */
4849 while (GetLine(stdin, Line, sizeof(OLine))!=-1) {
4851 current=0;BackLine[current++]=Line[0];
4852 for (i=1;i<strlen(Line);i++) {
4853 if (Line[i-1]==';' && Line[i]==';') BackLine[current++]=' ';
4854 BackLine[current++]=Line[i];
4856 BackLine[current++]=0;
4858 strcpy(Line,BackLine);
4862 #if defined(__svr4__) || defined(__FreeBSD__)
4863 ptr=strtok(Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4866 ptr=strtok(NULL, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4868 ptr=strtok(NULL, ";");
4870 ptr=strsep(&Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4873 ptr=strsep(&Line, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4875 ptr=strsep(&Line, ";");
4879 fprintf(stderr, _("Format problem on line %d [%s] 1\n"), line_count, BackLine);
4884 if (!strncmp(ptr,"ME", 2))
4886 memory_type_string = "int";
4887 entry.MemoryType = GMT_ME;
4889 else if (!strncmp(ptr,"SM", 2))
4891 memory_type_string = "sim";
4892 entry.MemoryType = GMT_SM;
4896 fprintf(stderr, _("Format problem on line %d [%s] 2: %s\n"),
4897 line_count, BackLine,ptr);
4901 #if defined(__svr4__) || defined(__FreeBSD__)
4902 ptr=strtok(NULL, ";"); if (ptr) entry.Location=atoi(ptr);
4904 ptr=strtok(NULL, ";"); if (ptr) entry.Group=atoi(ptr);
4906 ptr=strsep(&Line, ";"); if (ptr) entry.Location=atoi(ptr);
4908 ptr=strsep(&Line, ";"); if (ptr) entry.Group=atoi(ptr);
4912 fprintf(stderr, _("Format problem on line %d [%s] 3\n"),
4913 line_count, BackLine);
4917 for( subentry = 0; ; subentry++ )
4919 #if defined(__svr4__) || defined(__FreeBSD__)
4920 ptr=strtok(NULL, ";");
4922 ptr=strsep(&Line, ";");
4924 if( ptr && *ptr != 0 )
4925 entry.SubEntries[subentry].EntryType=atoi(ptr);
4929 #if defined(__svr4__) || defined(__FreeBSD__)
4930 ptr=strtok(NULL, ";");
4932 ptr=strsep(&Line, ";");
4935 entry.SubEntries[subentry].NumberType=atoi(ptr);
4936 // Phone Numbers need to have a number type.
4937 if(!ptr && entry.SubEntries[subentry].EntryType == GSM_Number)
4939 fprintf(stderr, _("Missing phone number type on line %d"
4940 " entry %d [%s]\n"), line_count, subentry, BackLine);
4945 #if defined(__svr4__) || defined(__FreeBSD__)
4946 ptr=strtok(NULL, ";");
4948 ptr=strsep(&Line, ";");
4951 entry.SubEntries[subentry].BlockNumber=atoi(ptr);
4953 #if defined(__svr4__) || defined(__FreeBSD__)
4954 ptr=strtok(NULL, ";");
4956 ptr=strsep(&Line, ";");
4958 // 0x13 Date Type; it is only for Dailed Numbers, etc.
4959 // we don't store to this memories so it's an error to use it.
4960 if(!ptr || entry.SubEntries[subentry].EntryType == GSM_Date)
4962 fprintf(stderr, _("Is not a phone number on line %d entry %d [%s]\n"),
4963 line_count, subentry, BackLine);
4968 strcpy( entry.SubEntries[subentry].data.Number, ptr );
4971 entry.SubEntriesCount = subentry;
4974 /* This is to send other exports (like from 6110) to 7110 */
4975 if (!entry.SubEntriesCount) {
4976 entry.SubEntriesCount = 1;
4977 entry.SubEntries[subentry].EntryType = GSM_Number;
4978 entry.SubEntries[subentry].NumberType = GSM_General;
4979 entry.SubEntries[subentry].BlockNumber = 2;
4980 strcpy(entry.SubEntries[subentry].data.Number, entry.Number);
4986 GSM_PhonebookEntry tmp_entry;
4988 memcpy(&tmp_entry, &entry, sizeof(GSM_PhonebookEntry) );
4989 error = GSM->GetMemoryLocation(&tmp_entry);
4990 if (error == GE_NONE) {
4991 if (!tmp_entry.Empty) {
4994 FILE *input_flow; //for reading from console, even when input redir.
4996 input_flow = fopen(DEV_CONSOLE, "r");
4999 fprintf(stderr, _("Can't open \"%s\" for input !\n"),DEV_CONSOLE);
5003 fprintf(stderr, _("Location busy. "));
5004 while (confirm < 0) {
5005 fprintf(stderr, _("Overwrite? (yes/no) "));
5006 GetLine(input_flow, ans, 7);
5007 if (!strcmp(ans, "yes")) confirm = 1;
5008 else if (!strcmp(ans, "no")) confirm = 0;
5010 if (!confirm) continue;
5013 fprintf(stderr, _("Unknown error (%d)\n"), error);
5019 /* Do write and report success/failure. */
5020 semicolon_pipe_substitution( &entry, 1 );
5022 error = GSM->WritePhonebookLocation(&entry);
5024 if (error == GE_NONE)
5025 fprintf (stdout, _("Write Succeeded: memory type: %s, loc: %d, name: %s, number: %s\n"), memory_type_string, entry.Location, entry.Name, entry.Number);
5027 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);
5036 /* Getting speed dials. */
5038 int getspeeddial(char *Number) {
5040 GSM_SpeedDial entry;
5042 GSM_PhonebookEntry pbentry;
5044 entry.Number = atoi(Number);
5048 if (GSM->GetSpeedDial(&entry)==GE_NONE) {
5049 pbentry.Location=entry.Location;
5050 if (pbentry.Location==0) pbentry.Location=entry.Number;
5051 pbentry.MemoryType=entry.MemoryType;
5053 error=GSM->GetMemoryLocation(&pbentry);
5055 if (error == GE_NONE)
5057 fprintf(stdout, _("SpeedDial nr. %d: %d:%d (%s)\n"), entry.Number, entry.MemoryType, entry.Location,pbentry.Name);
5059 fprintf(stdout, _("Error\n"));
5061 fprintf(stdout, _("Error\n"));
5069 /* Setting speed dials. */
5071 int setspeeddial(char *argv[]) {
5073 GSM_SpeedDial entry;
5075 char *memory_type_string;
5077 /* Handle command line args that set type, start and end locations. */
5079 if (strcmp(argv[1], "ME") == 0) {
5080 entry.MemoryType = GMT_ME;
5081 memory_type_string = "ME";
5083 else if (strcmp(argv[1], "SM") == 0) {
5084 entry.MemoryType = GMT_SM;
5085 memory_type_string = "SM";
5088 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
5093 entry.Number = atoi(argv[0]);
5094 entry.Location = atoi(argv[2]);
5098 if (GSM->SetSpeedDial(&entry) == GE_NONE) {
5099 fprintf(stdout, _("Succesfully written!\n"));
5107 /* Getting the status of the display. */
5109 int getdisplaystatus()
5114 /* Initialise the code for the GSM interface. */
5118 if (GSM->GetDisplayStatus(&Status)==GE_NONE) {
5120 printf(_("Call in progress: %s\n"), Status & (1<<DS_Call_In_Progress)?_("on"):_("off"));
5121 printf(_("Unknown: %s\n"), Status & (1<<DS_Unknown)?_("on"):_("off"));
5122 printf(_("Unread SMS: %s\n"), Status & (1<<DS_Unread_SMS)?_("on"):_("off"));
5123 printf(_("Voice call: %s\n"), Status & (1<<DS_Voice_Call)?_("on"):_("off"));
5124 printf(_("Fax call active: %s\n"), Status & (1<<DS_Fax_Call)?_("on"):_("off"));
5125 printf(_("Data call active: %s\n"), Status & (1<<DS_Data_Call)?_("on"):_("off"));
5126 printf(_("Keyboard lock: %s\n"), Status & (1<<DS_Keyboard_Lock)?_("on"):_("off"));
5127 printf(_("SMS storage full: %s\n"), Status & (1<<DS_SMS_Storage_Full)?_("on"):_("off"));
5130 printf(_("Error\n"));
5138 int netmonitor(char *Mode)
5141 unsigned char mode=atoi(Mode);
5142 char Screen[NM_MAX_SCREEN_WIDTH];
5147 if (!strcmp(Mode,"reset")) mode=0xf0;
5148 else if (!strcmp(Mode,"off")) mode=0xf1;
5149 else if (!strcmp(Mode,"field"))mode=0xf2;
5150 else if (!strcmp(Mode,"devel"))mode=0xf3;
5151 else if (!strcmp(Mode,"next")) mode=0x00;
5154 for (i=0;i<NM_MAX_SCREEN_WIDTH;i++) Screen[i]=0;
5156 GSM->NetMonitor(mode, Screen);
5159 printf("%s\n", Screen);
5166 int identify( void )
5168 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
5169 char imei[64], model[64], rev[64], manufacturer[64];
5173 while (GSM->GetIMEI(imei) != GE_NONE) sleep(1);
5174 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
5175 while (GSM->GetModel(model) != GE_NONE) sleep(1);
5177 strcpy(manufacturer, "(unknown)");
5178 GSM->GetManufacturer(manufacturer);
5180 fprintf(stdout, _("IMEI: %s\n"), imei);
5181 fprintf(stdout, _("Model: %s %s (%s)\n"), manufacturer, GetModelName (model), model);
5182 fprintf(stdout, _("Revision: %s\n"), rev);
5189 int senddtmf(char *String)
5194 if (GSM->SendDTMF(String)!=GE_NONE) fprintf(stdout,_("Error!\n"));
5201 /* Resets the phone */
5202 int reset(int argc, char *argv[])
5205 unsigned char _type=0x03;
5210 if (!strcmp(argv[0],"soft")) _type = 0x03;
5212 /* Doesn't work with 5110 */
5213 if (!strcmp(argv[0],"hard")) _type = 0x04;
5216 fprintf(stderr, _("What kind of reset do you want (second parameter can be \"soft\" or \"hard\") ?\n"));
5230 /* This is a "convenience" function to allow quick test of new API stuff which
5231 doesn't warrant a "proper" command line function. */
5233 int foogle(char *argv[])
5235 /* Initialise the code for the GSM interface. */
5239 // Fill in what you would like to test here...
5250 /* Initialise the code for the GSM interface. */
5254 if (GSM->PhoneTests()!=GE_NONE) fprintf(stderr,_("Error\n"));
5261 /* pmon allows fbus code to run in a passive state - it doesn't worry about
5262 whether comms are established with the phone. A debugging/development
5269 GSM_ConnectionType connection=GCT_FBUS;
5271 /* Initialise the code for the GSM interface. */
5273 error = GSM_Initialise(model, Port, Initlength, connection, RLP_DisplayF96Frame, SynchronizeTime);
5275 if (error != GE_NONE) {
5276 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
5288 int setringtone(int argc, char *argv[])
5290 GSM_Ringtone ringtone;
5291 GSM_BinRingtone binringtone,binringtone2;
5295 int current=0; //number of packed notes or location
5300 /* If not binary ringtone */
5301 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone2)!=GE_NONE) {
5302 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5304 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5306 ringtone.location=1;
5307 if (argc>1) ringtone.location=atoi(argv[1]);
5309 ringtone.allnotesscale=false;
5311 /* Initialise the GSM interface. */
5314 while (GSM->GetModel(model) != GE_NONE)
5317 /* For Nokia 6110/6130/6150/6210 we use different method of uploading.
5318 Phone will display menu, when received it */
5319 if ( !strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") ||
5320 !strcmp(model,"NSM-1") || !strcmp(model,"NPE-3") ) {
5321 if (argc==1) ringtone.location=255;
5324 error=GSM->SetRingtone(&ringtone,¤t);
5326 if (current!=ringtone.NrNotes) {
5327 if (current>FB61_MAX_RINGTONE_NOTES) {
5328 fprintf(stderr,_("Warning: due to phone limitation"));
5330 fprintf(stderr,_("Warning: ringtone was too long to be saved into frame,"));
5332 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5336 fprintf(stdout, _("Set succeeded!\n"));
5338 fprintf(stdout, _("Setting failed\n"));
5340 } else { /* This IS binary ringtone */
5341 fprintf(stdout,_("Binary ringtone format\n"));
5344 binringtone.frame[current++]=0x00;
5345 binringtone.frame[current++]=0x00;
5346 binringtone.frame[current++]=0x0c;
5347 binringtone.frame[current++]=0x01;
5348 binringtone.frame[current++]=0x2c;
5351 memcpy(binringtone.frame+current,argv[2],strlen(argv[2]));
5352 current=current+strlen(argv[2]);
5356 while(binringtone2.frame[i]!=0x00) {
5357 if (i==binringtone.length) break;
5362 memcpy(binringtone.frame+current,binringtone2.frame+i,binringtone2.length-i);
5363 binringtone.length=binringtone2.length-i+current;
5366 memcpy(binringtone.frame+current,binringtone2.frame,binringtone2.length);
5367 binringtone.length=binringtone2.length;
5370 binringtone.location=1;
5371 if (argc>1) binringtone.location=atoi(argv[1]);
5373 /* Initialise the GSM interface. */
5376 error=GSM->SetBinRingtone(&binringtone);
5380 fprintf(stdout, _("Set succeeded!\n"));
5382 case GE_INVALIDRINGLOCATION:
5383 fprintf(stdout, _("Invalid location %i!\n"),binringtone.location);
5385 case GE_UNKNOWNMODEL:
5386 fprintf(stdout, _("Mygnokii doesn't know format for this model!\n"));
5388 case GE_NOTIMPLEMENTED:
5389 fprintf(stdout, _("Not implemented for this model!\n"));
5392 fprintf(stdout, _("Not supported by this model!\n"));
5402 int ringtoneconvert(int argc, char *argv[])
5404 GSM_Ringtone ringtone;
5406 if (!strcmp(argv[0],argv[1]))
5408 fprintf(stderr, _("Files can't have the same names !\n"));
5412 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5414 ringtone.allnotesscale=false;
5416 GSM_SaveRingtoneFileOnConsole(argv[1], &ringtone);
5421 int playringtone(int argc, char *argv[])
5423 GSM_Ringtone ringtone;
5425 GSM_BinRingtone binringtone;
5431 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
5432 int binary_notes[12] =
5433 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
5435 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone)!=GE_NONE) {
5436 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5438 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5440 /* Initialise the GSM interface. */
5443 fprintf(stdout,_("Playing \"%s\" (%i notes)\n"),ringtone.name,ringtone.NrNotes);
5445 GSM_PlayRingtoneOnConsole(&ringtone);
5449 fprintf(stdout,_("Binary ringtone format\n"));
5451 /* Initialise the GSM interface. */
5455 while (true) { //skipping name
5456 if (binringtone.frame[i]==0) break;
5462 if (binringtone.frame[i]!=j) {
5465 fprintf(stdout,_("Block in binary ringtone %i %i\n"),j,z);
5472 if (!isok && j>=114 && j<=125) {
5473 j=14*3+binary_notes[j-114];
5476 if (!isok && j>=126 && j<=137) {
5477 j=14*1+binary_notes[j-126];
5480 if (!isok && j>=138 && j<=149) {
5481 j=14*2+binary_notes[j-138];
5484 if (!isok && j>=150 && j<=161) {
5485 j=14*4+binary_notes[j-150];
5490 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
5493 Hz=GSM_GetFrequency(j);
5494 if (GSM->PlayTone(Hz,5)!=GE_NONE) fprintf(stdout,_("error during playing\n"));
5498 j=binringtone.frame[i];
5499 z=binringtone.frame[i+1];
5501 z=z+binringtone.frame[i+1];
5504 if (i>=binringtone.length) break;
5515 int composer(int argc, char *argv[])
5517 GSM_Ringtone ringtone;
5520 int oldnoteslen=4,nownoteslen,oldnoteslen2;
5521 int oldnotesscale=1,nownotesscale;
5522 bool firstnote=true;
5523 int DefNoteTempo=63;
5525 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5527 if (ringtone.NrNotes!=0)
5528 DefNoteTempo=ringtone.notes[0].tempo;
5530 fprintf(stdout,_("Ringtone \"%s\" (tempo = %i Beats Per Minute)\n\n"),ringtone.name,GSM_GetTempo(DefNoteTempo));
5532 for (i=0;i<ringtone.NrNotes;i++) {
5533 if (DefNoteTempo!=ringtone.notes[i].tempo) {
5534 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"));
5539 for (i=0;i<ringtone.NrNotes;i++) {
5542 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5552 if ((ringtone.NrNotes-i)>50)
5553 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);
5555 fprintf(stdout,_("This ringtone in Nokia Composer in phone should look: "));
5559 for (i=0;i<ringtone.NrNotes;i++) {
5562 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5568 switch (ringtone.notes[i].duration) {
5569 case 192:fprintf(stdout,_("1."));break; //192=128*1.5
5570 case 128:fprintf(stdout,_("1"));break;
5571 case 96 :fprintf(stdout,_("2."));break; //96=64*1.5
5572 case 64 :fprintf(stdout,_("2"));break;
5573 case 48 :fprintf(stdout,_("4."));break; //48=32*1.5
5574 case 32 :fprintf(stdout,_("4"));break;
5575 case 24 :fprintf(stdout,_("8."));break; //24=16*1.5
5576 case 16 :fprintf(stdout,_("8"));break;
5577 case 12 :fprintf(stdout,_("16."));break; //12=8*1.5
5578 case 8 :fprintf(stdout,_("16"));break;
5579 case 6 :fprintf(stdout,_("32."));break; //6=4*1.5
5580 case 4 :fprintf(stdout,_("32"));break;
5585 /* What note here ? */
5586 switch (GSM_GetNote(ringtone.notes[i].note)) {
5587 case Note_C :fprintf(stdout,_("c"));break;
5588 case Note_Cis:fprintf(stdout,_("#c"));break;
5589 case Note_D :fprintf(stdout,_("d"));break;
5590 case Note_Dis:fprintf(stdout,_("#d"));break;
5591 case Note_E :fprintf(stdout,_("e"));break;
5592 case Note_F :fprintf(stdout,_("f"));break;
5593 case Note_Fis:fprintf(stdout,_("#f"));break;
5594 case Note_G :fprintf(stdout,_("g"));break;
5595 case Note_Gis:fprintf(stdout,_("#g"));break;
5596 case Note_A :fprintf(stdout,_("a"));break;
5597 case Note_Ais:fprintf(stdout,_("#a"));break;
5598 case Note_H :fprintf(stdout,_("h"));break;
5599 default :fprintf(stdout,_("-"));unknown=true;break; //Pause ?
5603 fprintf(stdout,_("%i"),ringtone.notes[i].note/14);
5605 /* And separator before next note */
5606 if (i!=ringtone.NrNotes-1)
5607 fprintf(stdout,_(" "));
5613 fprintf(stdout,_("\n\nTo enter it please press: "));
5617 for (i=0;i<ringtone.NrNotes;i++) {
5620 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5628 /* What note here ? */
5629 switch (GSM_GetNote(ringtone.notes[i].note)) {
5630 case Note_C :fprintf(stdout,_("1"));break;
5631 case Note_Cis:fprintf(stdout,_("1"));break;
5632 case Note_D :fprintf(stdout,_("2"));break;
5633 case Note_Dis:fprintf(stdout,_("2"));break;
5634 case Note_E :fprintf(stdout,_("3"));break;
5635 case Note_F :fprintf(stdout,_("4"));break;
5636 case Note_Fis:fprintf(stdout,_("4"));break;
5637 case Note_G :fprintf(stdout,_("5"));break;
5638 case Note_Gis:fprintf(stdout,_("5"));break;
5639 case Note_A :fprintf(stdout,_("6"));break;
5640 case Note_Ais:fprintf(stdout,_("6"));break;
5641 case Note_H :fprintf(stdout,_("7"));break;
5642 default :fprintf(stdout,_("0"));unknown=true;break;
5645 switch (ringtone.notes[i].duration) {
5646 case 192:fprintf(stdout,_("(longer)"));break; //192=128*1.5
5647 case 96 :fprintf(stdout,_("(longer)"));break; //96=64*1.5
5648 case 48 :fprintf(stdout,_("(longer)"));break; //48=32*1.5
5649 case 24 :fprintf(stdout,_("(longer)"));break; //24=16*1.5
5650 case 12 :fprintf(stdout,_("(longer)"));break; //12=8*1.5
5651 case 6 :fprintf(stdout,_("(longer)"));break; //6=4*1.5
5655 /* What note here ? */
5656 switch (GSM_GetNote(ringtone.notes[i].note)) {
5657 case Note_Cis:fprintf(stdout,_("#"));break;
5658 case Note_Dis:fprintf(stdout,_("#"));break;
5659 case Note_Fis:fprintf(stdout,_("#"));break;
5660 case Note_Gis:fprintf(stdout,_("#"));break;
5661 case Note_Ais:fprintf(stdout,_("#"));break;
5667 nownotesscale=ringtone.notes[i].note/14;
5669 if (nownotesscale!=oldnotesscale) {
5670 switch (nownotesscale) {
5672 switch (oldnotesscale) {
5673 case 2:fprintf(stdout,_("**"));break;
5674 case 3:fprintf(stdout,_("*"));break;
5678 switch (oldnotesscale) {
5679 case 1:fprintf(stdout,_("*"));break;
5680 case 3:fprintf(stdout,_("**"));break;
5684 switch (oldnotesscale) {
5685 case 1:fprintf(stdout,_("**"));break;
5686 case 2:fprintf(stdout,_("*"));break;
5692 oldnotesscale=nownotesscale;
5696 oldnoteslen2=oldnoteslen;
5698 switch (ringtone.notes[i].duration) {
5699 case 192:nownoteslen=1;break; //192=128*1.5
5700 case 128:nownoteslen=1;break;
5701 case 96 :nownoteslen=2;break; //96=64*1.5
5702 case 64 :nownoteslen=2;break;
5703 case 48 :nownoteslen=4;break; //48=32*1.5
5704 case 32 :nownoteslen=4;break;
5705 case 24 :nownoteslen=8;break; //24=16*1.5
5706 case 16 :nownoteslen=8;break;
5707 case 12 :nownoteslen=16;break; //12=8*1.5
5708 case 8 :nownoteslen=16;break;
5709 case 6 :nownoteslen=32;break; //6=4*1.5
5710 case 4 :nownoteslen=32;break;
5713 if (nownoteslen>oldnoteslen) {
5714 while (oldnoteslen!=nownoteslen) {
5715 fprintf(stdout,_("8"));
5716 oldnoteslen=oldnoteslen*2;
5720 if (nownoteslen<oldnoteslen) {
5721 while (oldnoteslen!=nownoteslen) {
5722 fprintf(stdout,_("9"));
5723 oldnoteslen=oldnoteslen/2;
5727 if (GSM_GetNote(ringtone.notes[i].note)==Note_Pause)
5728 oldnoteslen=oldnoteslen2;
5730 /* And separator before next note */
5731 if (i!=ringtone.NrNotes-1)
5732 fprintf(stdout,_(" "));
5737 fprintf(stdout,_("\n"));
5743 int sendringtone(int argc, char *argv[])
5745 GSM_Ringtone ringtone;
5746 GSM_MultiSMSMessage SMS;
5748 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5750 if (GSM_ReadRingtoneFileOnConsole(argv[1], &ringtone)!=GE_NONE) return(-1);
5752 ringtone.allnotesscale=false;
5754 for (i=0;i<argc;i++) {
5755 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5756 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5759 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5761 if (current!=ringtone.NrNotes) {
5762 if (current>FB61_MAX_RINGTONE_NOTES) {
5763 fprintf(stderr,_("Warning: due to phone limitation"));
5765 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5767 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5770 for (i=0;i<SMS.number;i++) {
5771 strcpy(SMS.SMS[i].Destination,argv[0]);
5774 /* Initialise the GSM interface. */
5777 GSM_SendMultiPartSMSOnConsole(&SMS, 2,argc,argv,false,true,true);
5782 int saveringtone(int argc, char *argv[])
5784 GSM_Ringtone ringtone;
5785 GSM_MultiSMSMessage SMS;
5787 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5789 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5791 ringtone.allnotesscale=false;
5793 for (i=0;i<argc;i++) {
5794 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5795 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5798 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5800 if (current!=ringtone.NrNotes) {
5801 if (current>FB61_MAX_RINGTONE_NOTES) {
5802 fprintf(stderr,_("Warning: due to phone limitation"));
5804 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5806 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5809 for (i=0;i<SMS.number;i++) {
5810 /* Only 11 chars could be here */
5811 strncpy(SMS.SMS[i].Destination,ringtone.name,11);
5814 /* Initialise the GSM interface. */
5817 GSM_SaveMultiPartSMSOnConsole(&SMS,1,argc,argv,false,false,true,true);
5822 /* Converts logo files. */
5824 int bitmapconvert(int argc, char *argv[])
5827 GSM_NetworkInfo NetworkInfo;
5831 if (!strcmp(argv[0],argv[1]))
5833 fprintf(stderr, _("Files can't have the same names !\n"));
5837 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
5842 if (!strcmp(argv[2],"op"))
5845 if (argc<4) doit=true;
5846 if (argc<4 && bitmap.type!=GSM_OperatorLogo) doit=true;
5850 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5853 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
5856 strncpy(bitmap.netcode,argv[3],7);
5857 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5859 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5865 if (!strcmp(argv[2],"7110op"))
5868 if (argc<4) doit=true;
5869 if (argc<4 && bitmap.type!=GSM_7110OperatorLogo) doit=true;
5873 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5876 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
5879 strncpy(bitmap.netcode,argv[3],7);
5880 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5882 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5888 if (!strcmp(argv[2],"caller"))
5890 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
5894 if ((num<0)||(num>9)) num=0;
5902 if (!strcmp(argv[2],"startup"))
5904 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
5907 if (!strcmp(argv[2],"7110startup"))
5909 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
5912 if (!strcmp(argv[2],"6210startup"))
5914 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
5917 if (!strcmp(argv[2],"picture"))
5919 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
5924 fprintf(stderr,"Unknown type of logo: %s !\n",argv[2]);
5929 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
5934 int getphoneprofile()
5939 /* Initialise the GSM interface. */
5943 error=GSM->GetProductProfileSetting(&PPS);
5944 if (error!=GE_NONE) {
5945 fprintf(stdout,_("Error!\n"));
5949 fprintf(stdout,_("ALS : "));
5950 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5951 else fprintf(stdout,_("off\n"));
5953 PPS.Name=PPS_VibraMenu;
5954 GSM->GetProductProfileSetting(&PPS);
5955 fprintf(stdout,_("Vibra menu : "));
5956 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5957 else fprintf(stdout,_("off\n"));
5959 PPS.Name=PPS_GamesMenu;
5960 GSM->GetProductProfileSetting(&PPS);
5961 fprintf(stdout,_("Games menu : "));
5962 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5963 else fprintf(stdout,_("off\n"));
5965 PPS.Name=PPS_HRData;
5966 GSM->GetProductProfileSetting(&PPS);
5967 fprintf(stdout,_("HR Data : "));
5968 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5969 else fprintf(stdout,_("off\n"));
5971 PPS.Name=PPS_14400Data;
5972 GSM->GetProductProfileSetting(&PPS);
5973 fprintf(stdout,_("14400 Data : "));
5974 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5975 else fprintf(stdout,_("off\n"));
5977 PPS.Name=PPS_LCDContrast;
5978 GSM->GetProductProfileSetting(&PPS);
5979 fprintf(stdout,_("LCD Contrast : %i%%\n"),PPS.int_value);
5982 GSM->GetProductProfileSetting(&PPS);
5983 fprintf(stdout,_("EFR : "));
5984 switch (PPS.int_value) {
5985 case 0: fprintf(stdout,_("off\n")); break;
5986 case 1: fprintf(stdout,_("last\n")); break;
5987 case 2: fprintf(stdout,_("second\n"));break;
5988 case 3: fprintf(stdout,_("first\n")); break;
5992 GSM->GetProductProfileSetting(&PPS);
5993 fprintf(stdout,_("FR : "));
5994 switch (PPS.int_value) {
5995 case 0: fprintf(stdout,_("off\n")); break;
5996 case 1: fprintf(stdout,_("last\n")); break;
5997 case 2: fprintf(stdout,_("second\n"));break;
5998 case 3: fprintf(stdout,_("first\n")); break;
6002 GSM->GetProductProfileSetting(&PPS);
6003 fprintf(stdout,_("HR : "));
6004 switch (PPS.int_value) {
6005 case 0: fprintf(stdout,_("off\n")); break;
6006 case 1: fprintf(stdout,_("last\n")); break;
6007 case 2: fprintf(stdout,_("second\n"));break;
6008 case 3: fprintf(stdout,_("first\n")); break;
6017 int setphoneprofile(int argc, char *argv[])
6021 bool correct_arg1=false, correct_arg2=false;
6023 if (!strcmp(argv[0],"ALS")) {
6026 if (!strcmp(argv[1],"1")) {
6027 PPS.bool_value=true;
6030 if (!strcmp(argv[1],"0")) {
6031 PPS.bool_value=false;
6034 if (!correct_arg2) {
6035 fprintf(stdout,_("Settings for ALS parameter can be \"0\" or \"1\" !\n"));
6039 if (!strcmp(argv[0],"HRData")) {
6040 PPS.Name=PPS_HRData;
6042 if (!strcmp(argv[1],"1")) {
6043 PPS.bool_value=true;
6046 if (!strcmp(argv[1],"0")) {
6047 PPS.bool_value=false;
6050 if (!correct_arg2) {
6051 fprintf(stdout,_("Settings for HRData parameter can be \"0\" or \"1\" !\n"));
6055 if (!correct_arg1) {
6056 fprintf(stdout,_("First parameter can be \"ALS\" or \"HRData\" only !\n"));
6060 /* Initialise the GSM interface. */
6063 error=GSM->SetProductProfileSetting(&PPS);
6065 if (error!=GE_NONE) {
6066 fprintf(stdout,_("Error!\n"));
6079 int getoperatorname()
6082 GSM_Network network;
6084 /* Initialise the GSM interface. */
6087 if (GSM->GetOperatorName(&network)==GE_NONE)
6089 if (!strcmp(network.Name,"")) {
6090 fprintf(stdout,_("Phone doesn't have downloaded operator name\n"));
6092 fprintf(stdout,_("Phone has downloaded operator name (\"%s\") for \"%s\" (\"%s\") network\n"),
6093 network.Name,network.Code,GSM_GetNetworkName(network.Code));
6103 int setoperatorname(int argc, char *argv[])
6106 GSM_Network network;
6108 /* Initialise the GSM interface. */
6112 strncpy(network.Code,argv[0],7);
6113 strncpy(network.Name,argv[1],50);
6115 strcpy(network.Code,"000 00\0");
6116 strcpy(network.Name,"\0");
6119 if (GSM->SetOperatorName(&network)==GE_NONE) {
6120 if (GSM->GetOperatorName(&network)==GE_NONE) {
6121 if (!strcmp(network.Name,"")) {
6122 fprintf(stdout,_("Downloaded operator name is removed\n"));
6124 fprintf(stdout,_("Downloaded operator name changed for \"%s\" network (\"%s\") to \"%s\"\n"),
6125 network.Code,GSM_GetNetworkName(network.Code),network.Name);
6136 int getvoicemailbox()
6138 GSM_PhonebookEntry entry;
6140 /* Initialise the GSM interface. */
6143 if (GSM->GetVoiceMailbox(&entry)==GE_NONE) {
6144 fprintf(stdout,_("Voice mailbox number is "));
6145 if (!strcmp(entry.Number,""))
6146 fprintf(stdout,_("not set\n"));
6148 fprintf(stdout,_("\"%s\"\n"),entry.Number);
6157 ///////////////////////////////////////////////////////////////////////////////
6158 // flow diagram of netmonitordata():
6159 ///////////////////////////////////////////////////////////////////////////////
6161 // get command line argument
6165 // if specific phone model
6168 // identify-phone: (((((((( TO DO )))))))))))))
6172 // get_mon_param_info() get phone netmonitor parameters name
6173 // specifically to a 'model'
6176 // parse_check() check command line arguments
6177 // | if all OK, go on else stop.
6178 // | because we can have a input file
6179 // v containing multiple
6180 // parse_process() command lines, we process each at once
6181 // so we can exit early on errors.
6183 ///////////////////////////////////////////////////////////////////////////////
6185 // private functions, see netmonitordata()
6186 void free_nm_info(PARAM_INFO_MON *info)
6188 PARAM_INFO_MON *tmp; // pointer, iterator on info
6190 // go to end of list
6192 while (info->next != NULL)
6202 ///////////////////////////////////////////////////////////////////////////////
6203 // this func retrieve parameters info from a file
6204 // and load it in a dynamic array, NULL terminated,
6205 // if 2rd parameter is not NULL, it load also description of screen
6206 // return (PARAM_INFO_MON *start) if all is OK, else NULL
6207 ///////////////////////////////////////////////////////////////////////////////
6208 // start->->next->next->next-> ...->next->NULL
6211 // par0 par1 par2 parN
6212 ///////////////////////////////////////////////////////////////////////////////
6213 // this should be de-allocated from calling function,
6214 // also, screen_name should be deallocated from calling function
6215 ///////////////////////////////////////////////////////////////////////////////
6217 PARAM_INFO_MON *get_mon_param_info(char *f_name, char *screen_name[NM_MAX_SCREEN+1])
6219 PARAM_INFO_MON *start; // pointer to netmonitor parameters info
6220 PARAM_INFO_MON *info; // pointer, iterator on info
6221 PARAM_INFO_MON *check; // pointer, iterator on info, for check usage
6230 char tmp_mname[55]; // very larger, but if netmon bug ...
6231 int x, y, len, s, t; // x & y coord, len, screen nr, type
6234 if (screen_name != NULL)
6235 for (i = 0; i <= NM_MAX_SCREEN; i++)
6236 screen_name[i] = NULL;
6239 if ((f_info = fopen(f_name, "r")) == NULL)
6240 { fprintf(stderr, "Can' t open file parameter info: <%s>\n", f_name);
6244 if ((start = malloc(sizeof(PARAM_INFO_MON))) == NULL)
6245 { fprintf(stderr, "no mem\n");
6249 { start->next = NULL;
6253 while (fgets(buf, 256, f_info) != NULL)
6257 // Truncate from '#' at right of comments
6258 if ((tmp = strchr(param, '#')) != NULL)
6261 // Strip leading, trailing whitespace
6262 while(isspace((int) *param))
6265 while((strlen(param) > 0) && isspace((int) param[strlen(param) - 1]))
6266 param[strlen(param) - 1] = '\0';
6268 // Ignore blank lines
6269 if ((*param == '\n') || (*param == '\0'))
6274 fprintf(stderr, "%s: info line: <%s>\n", f_name, param);
6276 // check for param name
6277 if ((param_name = strtok(param, "=\t\n")) == NULL)
6280 // check if screen name
6281 if (strncmp("SCREEN", param_name, 6) == 0)
6283 // if we do not want screen names ...
6284 if (screen_name == NULL)
6287 // FIXME check for screen nr
6288 if ((tmp = strtok(NULL, ":\n")) == NULL)
6292 // FIXME: check if already defined screen
6294 if ((i <= 0) || (i > NM_MAX_SCREEN))
6296 // check for screen name
6297 if ((tmp = strtok(NULL, ":\n")) == NULL)
6300 screen_name[i] = strdup(tmp);
6306 // FIXME: check for NM_MAX_FIELDS
6308 // check for x coord
6309 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6313 // check for y coord
6314 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6319 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6324 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6328 // check for netmon manual name
6329 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6331 "%s: PARAMETER <%s> in screen <%d>, not have netmon manual reference\n",
6332 f_name, param_name, s);
6333 free_nm_info(start);
6336 strcpy(tmp_mname, tmp);
6338 // check for data type (optional)
6339 if ((tmp = strtok(NULL, ":\t\n")) != NULL)
6344 // check len, here, so we print parameter name
6347 "%s: PARAMETER <%s> in screen <%d>, has invalid data lenght\n",
6348 f_name, param_name, s);
6349 free_nm_info(start);
6353 // check if already defined same param_name
6355 while (check->next != NULL)
6356 { check = check->next;
6357 if (strcmp(param_name, check->name) == 0)
6360 "%s: PARAMETER <%s> in screen <%d> already defined as in screen <%d>\n",
6361 f_name, param_name, s, check->s_nr);
6362 free_nm_info(start);
6367 // make space, and add parameter
6368 if ((info->next = malloc(sizeof(PARAM_INFO_MON))) != NULL)
6371 info->name = strdup(param_name);
6376 info->mname = strdup(tmp_mname);
6379 info->next = NULL; // mark end
6383 fprintf(stderr, "no mem");
6384 free_nm_info(start);
6396 while (info->next != NULL)
6399 fprintf(stderr, "info name %s\n", info->name);
6405 // 2, parse the arguments and check command(s) line
6406 // command line, phone spec input, and output are complex,
6407 // so we exit printing info about error instead of std help
6408 ///////////////////////////////////////////////////////////////////////////////
6410 int parse_check(int argc, char *argv[], PARAM_INFO_MON *start, char *f_name, int line)
6419 PARAM_INFO_MON *info; // iterator on this list
6422 for (i = 0; i < argc; i++)
6423 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6433 { // should be one of the short option
6434 if (strcmp(argv[i], "-fs") == 0)
6435 { // field separator, next arg should be a string
6436 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6438 // arg OK, do nothing
6443 "-fs: Invalid field separator in <%s> at line %d\n",
6446 fprintf(stderr, "-fs: Invalid field separator\n");
6450 else if (strcmp(argv[i], "-ls") == 0)
6451 { // line separator, next arg should be a string
6452 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6454 // arg OK, do nothing
6459 "-ls: Invalid line separator in <%s> at line %d\n",
6462 fprintf(stderr, "-ls: Invalid line separator\n");
6466 else if (strcmp(argv[i], "-tm") == 0)
6467 { // time separator, next arg should be a millisecond (200-10000)
6471 "-tm, -ts, are mutually exclusive in <%s> at line %d\n",
6474 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6478 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6481 // arg OK, do nothing
6486 "-tm: Invalid argument (200-10000 milliseconds), in <%s> at line %d\n",
6489 fprintf(stderr, "-tm: Invalid argument (200-10000 milliseconds)\n");
6493 else if (strcmp(argv[i], "-ts") == 0)
6494 { // time separator, next arg should be a seconds (1-3600)
6498 "-tm, -ts, are mutually exclusive, in <%s> at line %d\n",
6501 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6505 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6508 // arg OK, do nothing
6513 "-ts: Invalid argument (1-3600 seconds) in <%s> at line %d\n",
6516 fprintf(stderr, "-ts: Invalid argument (1-3600 seconds)\n");
6520 else if (strcmp(argv[i], "-n") == 0)
6521 { // nr of data pump, before stop collection,
6522 // next arg should be a int > 0
6523 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6525 // arg OK, do nothing
6530 "-n: Invalid argument (1-99999 times) in <%s> at line %d\n",
6533 fprintf(stderr, "-n: Invalid argument (1-99999 times)\n");
6537 else if (strcmp(argv[i], "-h") == 0)
6538 { // we do NOT want header (default with header)
6539 // arg OK, do nothing
6541 else if (strcmp(argv[i], "-S") == 0)
6542 { // we have used use specs from a file instead of standard info,
6543 // next arg is an existing readable filename
6544 // as already parsed correctly, we skip here.
6547 else if (strcmp(argv[i], "-I") == 0)
6548 { // we have used input from a file instead of command line
6549 // next arg is an existing readable filename
6550 // as already parsed correctly, we skip here.
6556 fprintf(stderr, "Unrecognized option %s in <%s> at line %d\n",
6557 argv[i], f_name, line);
6559 fprintf(stderr, "Unrecognized option %s\n", argv[i]);
6564 { // should be required data
6565 tmp = strdup(argv[i]);
6566 p = strtok(tmp, ":\t\n");
6569 // check if there is an output format specification
6579 // we have 'minus', so, probably forget format ...
6583 "Required data <%s->, without format specifiers in <%s> at line %d\n",
6587 "Required data <%s->, without format specifiers\n", p);
6593 // we check for params
6596 while (info->next != NULL)
6599 if (strcmp(p, info->name) == 0)
6601 if (ctr > NM_MAX_FIELDS)
6605 "too much data field ... in file <%s> at line %d\n",
6608 fprintf(stderr, "too much data field ...\n");
6621 if (found_data == 0)
6625 "Required data <%s>, not found in info-mon specifications in <%s> at line %d\n",
6629 "Required data <%s>, not found in info-mon specifications\n", p);
6633 p = strtok(NULL, ":\t\n");
6635 } // end while strtok
6637 } // end else '-' (short options)
6646 fprintf(stderr, "no required data! in <%s> at line %d\n", f_name, line);
6648 fprintf(stderr, "no required data!\n");
6655 // 2, parse the arguments and process the command line
6656 // no checks are needed here, because already do in parse_check
6657 // it return a pointer to info needed for make output, or NULL if errors
6658 ///////////////////////////////////////////////////////////////////////////////
6659 OUT_INFO_MON *parse_process(int argc, char *argv[], PARAM_INFO_MON *start)
6670 PARAM_INFO_MON *info; // iterator on this list
6671 OUT_INFO_MON *out_param; // iterator on this list
6673 if ((out_param = malloc(sizeof(OUT_INFO_MON))) == NULL)
6674 { fprintf(stderr, "no mem\n");
6679 fprintf(stderr, "parse_process: argc = %d\n", argc);
6680 for (i = 0; i < argc; i++)
6681 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6684 for (i = 0; i < NM_MAX_FIELDS; i++)
6685 out_param->data[i] = NULL;
6687 strcpy(out_param->req_fs, " ");
6689 strcpy(out_param->req_ls, "\n\r");
6691 strcpy(out_param->req_ls, "\n");
6694 out_param->req_n = 0;
6695 out_param->req_header = 1;
6698 req_tm = 200; /* default wait */
6707 { // should be one of the short option
6708 if (strcmp(argv[i], "-fs") == 0)
6709 { // field separator, next arg should be a string
6710 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6712 strcpy(out_param->req_fs, argv[i]);
6715 { fprintf(stderr, "NEVER BE:-fs: Invalid field separator\n");
6719 else if (strcmp(argv[i], "-ls") == 0)
6720 { // line separator, next arg should be a string
6721 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6723 strcpy(out_param->req_ls, argv[i]);
6726 { fprintf(stderr, "NEVER BE:-ls: Invalid line separator\n");
6730 else if (strcmp(argv[i], "-tm") == 0)
6731 { // time separator, next arg should be a millisecond (200-10000)
6733 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6737 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6739 req_tm = atoi(argv[i]);
6743 { fprintf(stderr, "NEVER BE:-tm: Invalid argument (200-10000 milliseconds)\n");
6747 else if (strcmp(argv[i], "-ts") == 0)
6748 { // time separator, next arg should be a seconds (1-3600)
6750 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6754 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6756 req_ts = atoi(argv[i]);
6763 { fprintf(stderr, "NEVER BE:-ts: Invalid argument (1-3600 seconds)\n");
6767 else if (strcmp(argv[i], "-n") == 0)
6768 { // nr of data pump, before stop collection,
6769 // next arg should be a int > 0
6770 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6772 out_param->req_n = atoi(argv[i]);
6775 { fprintf(stderr, "NEVER BE:-n: Invalid argument (1-99999 times)\n");
6779 else if (strcmp(argv[i], "-h") == 0)
6780 { // we do NOT want header (default with header)
6781 out_param->req_header = 0;
6783 else if (strcmp(argv[i], "-S") == 0)
6784 { // we have used use specs from a file instead of standard info,
6785 // next arg is an existing readable filename
6786 // as already parsed correctly, we skip here.
6789 else if (strcmp(argv[i], "-I") == 0)
6790 { // we have used input from a file instead of command line
6791 // next arg is an existing readable filename
6792 // as already parsed correctly, we skip here.
6797 fprintf(stderr, "NEVER BE:Unrecognized option %s\n", argv[i]);
6802 { // should be required data
6803 tmp = strdup(argv[i]);
6804 p = strtok(tmp, ":\t\n");
6807 // check if there is an output format specification
6817 // we have 'minus', so, probably forget format ...
6820 "NEVER BE:Required data <%s->, without format specifiers\n", p);
6826 // we check for params
6829 while (info->next != NULL)
6832 if (strcmp(p, info->name) == 0)
6834 if (ctr > NM_MAX_FIELDS)
6836 fprintf(stderr, "NEVER BE:too much data field ...");
6839 out_param->data[ctr] = info;
6840 out_param->out_f[ctr] = *o;
6847 if (found_data == 0)
6850 "NEVER BE:Required data <%s>, not found in info-mon specifications\n", p);
6855 p = strtok(NULL, ":\t\n");
6857 } // end while strtok
6859 // here, we have an array of pointers to required data
6860 // and an array of output specifiers, from 0 to [ctr-1]
6862 } // end else '-' (short options)
6870 fprintf(stderr, "NEVER BE:no required data!\n");
6874 // now, what netmon screen we need to retrieve ?
6875 // we need somewhat were checking is faster, as our goal is lower cicle time
6877 // we can have NM_MAX_SCREEN=254 screens, so we use an array, of unsigned char,
6878 // each char contain number of needed screen, 255 is list terminator
6880 for (i = 0; i <= NM_MAX_SCREEN; i++)
6881 out_param->req_screen[i] = 255;
6885 fprintf(stderr, "Start Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6887 while (out_param->data[ctr] != NULL)
6890 fprintf(stderr, "Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6892 // check if screen already in
6895 while (out_param->req_screen[i] != 255)
6897 if (out_param->req_screen[i] == out_param->data[ctr]->s_nr)
6898 { // already load, skip
6905 if (found_data == 0)
6908 fprintf(stderr, "i = %d, out_param->req_screen[%d] = %d\n", i, i, out_param->data[ctr]->s_nr);
6910 out_param->req_screen[i] = out_param->data[ctr]->s_nr;
6919 while (out_param->req_screen[i] != 255)
6921 fprintf(stderr, "Required screen %d\n", out_param->req_screen[i]);
6927 out_param->req_wait = req_tm * 1000;
6929 out_param->req_wait = req_ts * 1000000;
6931 out_param->req_wait = req_tm * 1000;
6937 int nmd_output(OUT_INFO_MON *out_param)
6947 char Screen[NM_MAX_SCREEN_WIDTH];
6949 struct tm *date_time;
6951 if (out_param->req_header)
6953 // print phone help header
6955 while (out_param->data[d] != NULL)
6956 { len = out_param->data[d]->len;
6957 if (strlen(out_param->data[d]->name) > len)
6958 len = strlen(out_param->data[d]->name);
6959 if (strlen(out_param->data[d]->mname) > len)
6960 len = strlen(out_param->data[d]->mname);
6961 printf("%*.*s%s", len, len, out_param->data[d]->name, out_param->req_fs);
6964 printf("%s", out_param->req_ls);
6966 // print netmon manual header
6968 while (out_param->data[d] != NULL)
6969 { len = out_param->data[d]->len;
6970 if (strlen(out_param->data[d]->name) > len)
6971 len = strlen(out_param->data[d]->name);
6972 if (strlen(out_param->data[d]->mname) > len)
6973 len = strlen(out_param->data[d]->mname);
6974 printf("%*.*s%s", len, len, out_param->data[d]->mname, out_param->req_fs);
6977 printf("%s", out_param->req_ls);
6978 printf("%s", out_param->req_ls);
6984 // stop after n data punp
6987 if ((out_param->req_n) && (ctr > out_param->req_n))
6990 // datapump: for each screen, for each required data, load data info->value
6993 while(out_param->req_screen[i] != 255)
6995 if (out_param->req_screen[i] == 0)
6998 date_time = localtime(&sec);
6999 sprintf(Screen, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7001 date_time->tm_mon+1,
7002 date_time->tm_year+1900,
7007 fprintf(stderr, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
7009 date_time->tm_mon+1,
7010 date_time->tm_year+1900,
7018 GSM->NetMonitor(out_param->req_screen[i], Screen);
7021 // we have one screen of data, load those required
7024 while (out_param->data[d] != NULL)
7026 if (out_param->data[d]->s_nr == out_param->req_screen[i])
7030 nr_line = out_param->data[d]->y;
7031 while ((*p) && (nr_line))
7039 fprintf(stderr, "\nthis line: %s\n\n", p);
7043 nr_chr = out_param->data[d]->x;
7044 while ((*p) && (nr_chr))
7048 // this the start of data
7050 len = out_param->data[d]->len;
7051 while ((*p) && (len))
7052 { out_param->data[d]->value[n] = *p;
7057 // pad with space if shorter than presumed
7058 while ((*p) && (len))
7059 { out_param->data[d]->value[n] = ' ';
7064 out_param->data[d]->value[n] = '\0';
7073 // print row of data
7075 while (out_param->data[d] != NULL)
7077 len = out_param->data[d]->len;
7078 if (out_param->req_header)
7079 { if (strlen(out_param->data[d]->name) > len)
7080 len = strlen(out_param->data[d]->name);
7081 if (strlen(out_param->data[d]->mname) > len)
7082 len = strlen(out_param->data[d]->mname);
7084 // FIXME check format
7085 printf("%*.*s%s", len, len, out_param->data[d]->value, out_param->req_fs);
7088 printf("%s", out_param->req_ls);
7090 usleep(out_param->req_wait);
7094 printf("%s%s", out_param->req_ls, out_param->req_ls);
7100 ///////////////////////////////////////////////////////////////////////////////
7101 int netmonitordata(int argc, char *argv[])
7103 char *loc_info = NULL; // path to --netmonitordata directory
7104 char *f_name; // absolute path of phone info-file
7105 int flag_phone_spec = 0; // flags, set if used -S option
7107 char model[20] = "phonepar"; // TO DO: PHONE AUTODETECTION
7108 // char phver[20] = "";
7110 PARAM_INFO_MON *start; // pointer to list of parsed phone params
7111 OUT_INFO_MON *out_param; // pointer to struct of output data
7113 char *f_commands = NULL; // file containings input line arguments
7114 FILE *commands; // Handle for this file
7115 char buf[1024]; // buffer
7116 char *f_argv[NM_MAX_FIELDS+30]; // space for parameters and cmdline options
7118 char *p, *tmp; // various counter, flags, tmp area ...
7125 signal(SIGINT, interrupted);
7127 // FIXME model, phone_version
7129 // before parsing phone-info-file, we check for user specified phone-info-file
7134 if (strcmp(argv[i], "-S") == 0)
7138 flag_phone_spec = 1;
7139 loc_info = strdup(argv[i+1]);
7143 { fprintf(stderr, "option -S require an argument ...\n");
7151 if (loc_info != NULL)
7152 { f_name = strdup(loc_info);
7154 else // we use standard file specification
7156 if ((tmp = getenv("INFOMONPATH")) == NULL)
7157 { loc_info = strdup(".");
7160 { loc_info = strdup(tmp);
7163 f_name = malloc(strlen(loc_info)+strlen(model)+10);
7164 sprintf(f_name, "%s/%s", loc_info, model);
7169 // fprintf(stderr, "Loc_info <%s> model <%s> version <%s>\n", loc_info, model, phver);
7170 fprintf(stderr, "Info file: <%s>\n", f_name);
7172 if ((start = get_mon_param_info(f_name, NULL)) == NULL)
7175 // option -I give us the possibility of specify a filename,
7176 // containing a "sequence" of command line args.
7177 // if you specify this option, you can use (on command line) only -S option.
7178 // other options may be specified inside the input-file.
7179 // contents of this file as the same sintax as the command line,
7180 // except it must not contain "--netmonitordata" or "-I" or "-S" options
7181 ///////////////////////////////////////////////////////////////////////
7186 if (strcmp(argv[i], "-I") == 0)
7190 if ((argc == 2) || ((argc == 4) && flag_phone_spec == 1))
7191 { f_commands = strdup(argv[i+1]);
7194 { fprintf(stderr, "option -I accept only additional -S option.\n");
7201 { fprintf(stderr, "option -I require an argument ...\n");
7209 // before all, we check all command line
7211 if (f_commands != NULL)
7214 fprintf(stderr, "netmonitordata(check): commands from <%s>\n", f_commands);
7218 // read line, make array f_argv, and counter f_argc
7219 // parse & check args, so errors are checked before real processing
7220 // (-I option here is ignored)
7221 // (-S option can be here, and it is used)
7224 if ((commands = fopen(f_commands, "r")) == NULL)
7225 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7229 // FIXME line may be be splitted
7231 while (fgets(buf, 1024, commands) != NULL)
7236 // Truncate from '#' at right of comments
7237 if ((tmp = strchr(p, '#')) != NULL)
7240 // Strip leading, trailing whitespace
7241 while(isspace((int) *p))
7244 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7245 p[strlen(p) - 1] = '\0';
7247 // Ignore blank lines
7248 if ((*p == '\n') || (*p == '\0'))
7252 fprintf(stderr, "netmonitordata(check): row <%s>\n", p);
7257 p = strtok(p, " \t");
7259 { f_argv[f_argc++] = strdup(p);
7261 fprintf(stderr, "netmonitordata(check): token <%s>\n", p);
7263 p = strtok(NULL, " \t"); // OK p, (NULL)
7265 while ((p != NULL) && (*p));
7267 // here we have f_argc, f_argv, this line is OK
7269 if (parse_check(f_argc, f_argv, start, f_commands, line) != 0)
7270 { free_nm_info(start);
7277 else // as above, but we have only command line, argv, argc.
7279 if (parse_check(argc, argv, start, NULL, 0) != 0)
7280 { free_nm_info(start);
7285 // here, all commands line are checked, and are correct
7287 if (f_commands != NULL)
7290 fprintf(stderr, "netmonitordata(process): commands from <%s>\n", f_commands);
7295 // read line, make array f_argv, and counter f_argc
7296 // parse_process argument, (-I option here is ignored)
7297 // (-S option can be here, and it is used)
7298 // (make header // these are in nmd_output();
7305 if ((commands = fopen(f_commands, "r")) == NULL)
7306 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7310 // FIXME line may be be splitted
7311 while (fgets(buf, 1024, commands) != NULL)
7315 // Truncate from '#' at right of comments
7316 if ((tmp = strchr(p, '#')) != NULL)
7319 // Strip leading, trailing whitespace
7320 while(isspace((int) *p))
7323 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7324 p[strlen(p) - 1] = '\0';
7326 // Ignore blank lines
7327 if ((*p == '\n') || (*p == '\0'))
7333 p = strtok(p, " \t");
7335 { f_argv[f_argc++] = strdup(p);
7336 p = strtok(NULL, " \t"); // OK p, (NULL)
7338 while ((p != NULL) && (*p));
7340 // here we have f_argc, f_argv, this line is OK
7342 if ((out_param = parse_process(f_argc, f_argv, start)) == NULL)
7343 { free_nm_info(start);
7344 return(-1); /* NEVER BE */
7347 // here, command line has no error ...
7349 nmd_output(out_param);
7356 else // as above, but we have only command line, argv, argc.
7358 if ((out_param = parse_process(argc, argv, start)) == NULL)
7359 { free_nm_info(start);
7360 return(-1); /* NEVER BE */
7362 nmd_output(out_param);
7371 /* I analised this source and this should be done. But when compile with VC6 */
7372 /* I have error. So, commented... MW */
7374 free_nm_info(start);
7381 // used by nm_collect()
7382 ///////////////////////////////////////////////////////////////////////////////
7383 char *rowScreen(char *s)
7387 // make Screen in one row
7399 void printtime(void)
7403 int Year; /* The complete year specification - e.g. 1999. Y2K :-) */
7404 int Month; /* January = 1 */
7409 int Timezone; /* The difference between local time and GMT */
7415 now=localtime(&nowh);
7417 Date.Year = now->tm_year;
7418 Date.Month = now->tm_mon+1;
7419 Date.Day = now->tm_mday;
7420 Date.Hour = now->tm_hour;
7421 Date.Minute = now->tm_min;
7422 Date.Second = now->tm_sec;
7424 /* I have 100 (for 2000) Year now :-) */
7425 if (Date.Year>99 && Date.Year<1900) {
7426 Date.Year=Date.Year+1900;
7429 printf("%d:%d:%d:%d:%d:%d ",Date.Day,Date.Month,Date.Year,Date.Hour,Date.Minute,Date.Second);
7433 // like netmonitor(), but print in one row, 1, 2 or 3 screen, every ~0.3 s
7434 ///////////////////////////////////////////////////////////////////////////////
7435 int nm_collect(int argc, char *argv[])
7437 int mode[MAX_NM_COLLECT];
7438 char Screen[NM_MAX_SCREEN_WIDTH];
7441 for (i=0;i<argc;i++) {
7442 argc > i ? (mode[i] = atoi(argv[i])): (mode[i] = 0);
7445 for (i=0;i<argc;i++) {
7446 if (mode[i]==0 && strcmp(argv[i],"-d")) {
7447 fprintf(stderr, "Wrong %i parameter (not number and not -d)\n",i);
7452 signal(SIGINT, interrupted);
7459 for (i=0;i<argc;i++) {
7460 if (!strcmp(argv[i],"-d")) {
7466 for (i=0;i<argc;i++) {
7469 GSM->NetMonitor(mode[i], Screen);
7470 printf("%s::", rowScreen(Screen));
7485 int sniff(int argc, char *argv[])
7487 /* base model comes from gnokiirc */
7488 strcat(model,"sniff");
7490 if (argc>0) strcpy(Port,argv[0]);
7492 /* Initialise the GSM interface. */
7495 /* Loop here indefinitely - allows you to see messages from GSM code in
7496 response to unknown messages etc. The loops ends after pressing the
7498 while (!bshutdown) {
7508 int decodefile(int argc, char *argv[])
7511 unsigned char in_buffer[255];
7515 /* base model comes from gnokiirc */
7516 strcat(model,"decode");
7518 /* Initialise the GSM interface. */
7521 printf ("open InPutFile: %s\n", argv[0]);
7522 if ( (infile = fopen( argv[0], "rb")) == NULL ) {
7523 printf ("Failed to open InPutFile: %s\n", argv[0]);
7526 while ( (nr_read = fread(in_buffer, 1, 16, infile)) > 0 ) {
7527 for (i=0; i < nr_read; i++)
7528 Protocol->StateMachine(in_buffer[i]);
7536 int getringtone(int argc, char *argv[])
7538 GSM_BinRingtone ringtone;
7540 GSM_Ringtone SMringtone;
7542 ringtone.location=1;
7543 if (argc>1) ringtone.location=atoi(argv[1]);
7545 /* Initialise the GSM interface. */
7548 error=GSM_GetPhoneRingtone(&ringtone,&SMringtone);
7550 fprintf(stdout, _("Downloaded ringtone, location %i: "),ringtone.location);
7554 fprintf(stdout, _("get succeeded!\n"));
7555 /* In 33.. we have normal "Smart Messaging" format */
7556 if (GetModelFeature (FN_RINGTONES)==F_RING_SM) {
7557 fprintf(stdout, _("Name: %s (normal format)\n"),SMringtone.name);
7558 GSM_SaveRingtoneFileOnConsole(argv[0], &SMringtone);
7560 fprintf(stdout, _("Name: %s (binary format)\n"),ringtone.name);
7561 GSM_SaveBinRingtoneFile(argv[0], &ringtone);
7566 case GE_INVALIDRINGLOCATION:
7567 fprintf(stdout, _("invalid location %i!\n"),ringtone.location);
7569 case GE_UNKNOWNMODEL:
7570 fprintf(stdout, _("mygnokii doesn't know format for this model!\n"));
7572 case GE_NOTIMPLEMENTED:
7573 fprintf(stdout, _("not implemented for this model!\n"));
7576 fprintf(stdout, _("not supported by this model!\n"));
7585 int binringtoneconvert(int argc, char *argv[])
7587 GSM_BinRingtone ringtone;
7596 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
7597 int binary_notes[12] =
7598 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
7600 if (GSM_ReadBinRingtoneFile(argv[0],&ringtone)!=GE_NONE) {
7601 fprintf(stdout,_("Failed to read %s file!\n"),argv[0]);
7605 file = fopen(argv[1], "wb");
7608 return(GE_CANTOPENFILE);
7612 if (ringtone.frame[i]==0) break;
7613 fprintf(file,_("%c"),ringtone.frame[i]);
7617 fprintf(file,_(":d=32,o=5,b=300:"));
7621 if (ringtone.frame[i]!=j) {
7628 if (!isok && j>=114 && j<=125) {
7629 j=14*3+binary_notes[j-114];
7632 if (!isok && j>=126 && j<=137) {
7633 j=14*1+binary_notes[j-126];
7636 if (!isok && j>=138 && j<=149) {
7637 j=14*2+binary_notes[j-138];
7640 if (!isok && j>=150 && j<=161) {
7641 j=14*4+binary_notes[j-150];
7646 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
7652 if (w>z && (w/2)<=z) {
7654 case 1:fprintf(file,_("16"));break;
\r
7655 case 2:fprintf(file,_("8"));break;
\r
7656 case 3:fprintf(file,_("4"));break;
\r
7657 case 4:fprintf(file,_("2"));break;
\r
7658 case 5:fprintf(file,_("1"));break;
\r
7663 if (z>w) fprintf(file,_("1"));
7665 switch (GSM_GetNote(j)) {
\r
7666 case Note_C :fprintf(file,_("c"));break;
\r
7667 case Note_Cis:fprintf(file,_("c#"));break;
\r
7668 case Note_D :fprintf(file,_("d"));break;
\r
7669 case Note_Dis:fprintf(file,_("d#"));break;
\r
7670 case Note_E :fprintf(file,_("e"));break;
\r
7671 case Note_F :fprintf(file,_("f"));break;
\r
7672 case Note_Fis:fprintf(file,_("f#"));break;
\r
7673 case Note_G :fprintf(file,_("g"));break;
\r
7674 case Note_Gis:fprintf(file,_("g#"));break;
\r
7675 case Note_A :fprintf(file,_("a"));break;
\r
7676 case Note_Ais:fprintf(file,_("a#"));break;
\r
7677 case Note_H :fprintf(file,_("h"));break;
\r
7678 default :pause=true;fprintf(file,_("p"));break; //Pause ?
\r
7683 if (w>z && (w/2)<=z) {
7684 fprintf(file,_("."));
7688 if ((j/14)!=1 && !pause) fprintf(file,_("%i"),j/14);
7689 fprintf(file,_(","));
7692 j=ringtone.frame[i];
7693 z=ringtone.frame[i+1];
7695 z=z+ringtone.frame[i+1];
7698 if (i>=ringtone.length) break;
7707 int renamesmsc(int argc, char *argv[])
7709 GSM_MessageCenter MessageCenter;
7711 MessageCenter.No=atoi(argv[0]);
7713 /* Initialise the GSM interface. */
7716 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
7717 fprintf(stdout,_("SMSC number %i get OK\n"),MessageCenter.No);
7720 fprintf(stdout,_("Error getting SMSC number %i\n"),MessageCenter.No);
7724 strncpy(MessageCenter.Name,argv[1],10);
7726 if (GSM->SetSMSCenter(&MessageCenter) == GE_NONE) {
7727 fprintf(stdout,_("SMSC number %i set OK (renamed to \"%s\")\n"),MessageCenter.No,MessageCenter.Name);
7730 fprintf(stdout,_("Error setting SMSC number %i\n"),MessageCenter.No);
7740 * Returns number of sostituited characters.
7741 * ... may be useful one day ??
7743 int semicolon_pipe_substitution( GSM_PhonebookEntry *pentry, unsigned int direction )
7744 /* direction = 0 : after reading phone memory (
7745 * 1 : writing phone memory
7749 register int count=0;
7750 char charfrom, charto;
7752 charfrom= (direction==0) ? ';' : '|';
7753 charto = (direction==0) ? '|' : ';';
7755 count+=str_substch(pentry->Name, charfrom, charto );
7756 count+=str_substch(pentry->Number, charfrom, charto );
7758 for( i = 0; i < pentry->SubEntriesCount; i++ )
7760 if( pentry->SubEntries[i].EntryType != GSM_Date )
7761 count+=str_substch(pentry->SubEntries[i].data.Number ,charfrom,charto);
7767 int str_substch( char *str, const char toric, const char sost )
7772 for( ct = 0; ct < strlen(str); ct++ )
7773 if( str[ct] == (unsigned char) toric )
7774 { str[ct] = sost; i_sost++; }
7779 /* Allows to set simlock state.
7780 With older phone (older 51xx, 61xx) can open them, with older
7781 and newer should be able to close them */
7782 /* DO NOT TRY, IF DON'T WANT, WHAT YOU DO !!!!!!!!!! */
7785 GSM_AllSimlocks siml;
7787 unsigned char closebuffer[20]=
7788 { 0x00, 0x01, 0x82, 0x01,
7789 0x00, /* which simlock */
7791 0x00, 0x00, 0x00, /* lock 1 info */
7792 0x00, 0x00, 0x00, 0x00, 0x00, /* lock 4 info */
7793 0x00, 0x00, /* lock 2 info */
7794 0x00, 0x00, /* lock 3 info */
7796 unsigned char openbuffer[10]= { 0x00, 0x01, 0x81, 0x01,
7797 0x00, /* lock number */
7798 0x10, 0x10, 0x10, 0x10, 0x10 };
7799 unsigned char openbuffer0[10]= {0x00, 0x01, 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00 };
7801 unsigned char info[120];
7804 /* Initialise the code for the GSM interface. */
7806 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7808 fprintf(stderr,("Not supported\n"));
7812 N6110_EnableExtendedCommands(0x02);
7814 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7815 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7817 /* Opening all locks (we must check, if we can open them) */
7818 NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7819 openbuffer[4]=1;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7820 openbuffer[4]=2;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7821 openbuffer[4]=4;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7822 openbuffer[4]=8;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7823 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7824 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7827 if (siml.simlocks[i].enabled) {
7828 fprintf(stderr,_("Can not open simlock %i\n"),i+1);GSM->Terminate();return -1;
7831 /* Making frame for closing simlocks */
7832 strcpy(info,"00101");
7834 while (j!=strlen(info)) {
7835 if (j+2<=strlen(info)) {
7836 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7838 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7841 strcpy(info,"0000");j=0;i=15;
7842 while (j!=strlen(info)) {
7843 if (j+2<=strlen(info)) {
7844 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7846 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7849 strcpy(info,"0000");j=0;i=17;
7850 while (j!=strlen(info)) {
7851 if (j+2<=strlen(info)) {
7852 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7854 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7857 strcpy(info,"0000000001");j=0;i=9;
7858 while (j!=strlen(info)) {
7859 if (j+2<=strlen(info)) {
7861 closebuffer[i]=closebuffer[i] | (info[j] & 0x0f);j++;
7863 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7866 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7869 /* Closing simlock with given values */
7870 closebuffer[4]=1+2+4+8;
7871 NULL_SendMessageSequence
\r(50, &CurrentMagicError, 20, 0x40,closebuffer);
7872 /* Opening all locks */
7873 NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7874 openbuffer[4]=1;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7875 openbuffer[4]=2;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7876 openbuffer[4]=4;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7877 openbuffer[4]=8;NULL_SendMessageSequence
\r(50, &CurrentMagicError, 10, 0x40,openbuffer);
7885 GSM_AllSimlocks siml;
7888 /* Initialise the code for the GSM interface. */
7891 if (GSM->SimlockInfo(&siml)!=GE_NONE) fprintf(stderr,_("Error\n"));
7893 fprintf(stdout,_("MCC + MNC : %s ("),siml.simlocks[0].data);
7894 if (siml.simlocks[0].enabled) fprintf(stdout,_("CLOSED"));
7895 else fprintf(stdout,_("opened"));
7896 if (siml.simlocks[0].factory) fprintf(stdout,_(") (factory"));
7897 else fprintf(stdout,_(") (user"));
7898 fprintf(stdout,_(") (counter %i"),siml.simlocks[0].counter);
7900 s[0]=siml.simlocks[0].data[0];
7901 s[1]=siml.simlocks[0].data[1];
7902 s[2]=siml.simlocks[0].data[2];
7904 s[4]=siml.simlocks[0].data[3];
7905 s[5]=siml.simlocks[0].data[4];
7908 if (strcmp(GSM_GetNetworkName(s),"unknown"))
7909 fprintf(stdout,_(") (network \"%s\""),GSM_GetNetworkName(s));
7911 fprintf(stdout,_(")\n"));
7913 fprintf(stdout,_("GID1 : %s ("),siml.simlocks[1].data);
7914 if (siml.simlocks[1].enabled) fprintf(stdout,_("CLOSED"));
7915 else fprintf(stdout,_("opened"));
7916 if (siml.simlocks[1].factory) fprintf(stdout,_(") (factory"));
7917 else fprintf(stdout,_(") (user"));
7918 fprintf(stdout,_(") (counter %i"),siml.simlocks[1].counter);
7919 fprintf(stdout,_(")\n"));
7921 fprintf(stdout,_("GID2 : %s ("),siml.simlocks[2].data);
7922 if (siml.simlocks[2].enabled) fprintf(stdout,_("CLOSED"));
7923 else fprintf(stdout,_("opened"));
7924 if (siml.simlocks[2].factory) fprintf(stdout,_(") (factory"));
7925 else fprintf(stdout,_(") (user"));
7926 fprintf(stdout,_(") (counter %i"),siml.simlocks[2].counter);
7927 fprintf(stdout,_(")\n"));
7929 fprintf(stdout,_("MSIN : %s ("),siml.simlocks[3].data);
7930 if (siml.simlocks[3].enabled) fprintf(stdout,_("CLOSED"));
7931 else fprintf(stdout,_("opened"));
7932 if (siml.simlocks[3].factory) fprintf(stdout,_(") (factory"));
7933 else fprintf(stdout,_(") (user"));
7934 fprintf(stdout,_(") (counter %i"),siml.simlocks[3].counter);
7935 fprintf(stdout,_(")\n"));
7942 /* Getting EEPROM from older phones */
7943 /* Tested with N5110 5.07, 6150 5.22 */
7948 unsigned char buffer[1000]={ 0x00, 0x01, 0xd4, 0x02, 0x00, 0xa0,
7949 0x00, 0x00, /* location Lo and Hi */
7950 0x10 }; /* how many bytes */
7952 strcpy(Connection,"mbus");
7953 fprintf(stderr,_("Switching connection type to MBUS\n"));
7955 strcpy(model,"5110");
7957 /* Initialise the code for the GSM interface. */
7960 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7962 fprintf(stderr,("Not supported\n"));
7967 for (i=0;i<64;i++) {
7968 fprintf(stdout,_("%c"),0xff);
7975 if ((i/256)!=((i-1)/256)) fprintf(stderr,_("."));
7977 if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE)
\r break;
7982 fprintf(stderr,_("\n"));
7991 GSM_SMSFolders folders;
7996 /* Initialise the code for the GSM interface. */
8001 error=GSM->GetSMSFolders(&folders);
8005 if (error!=GE_NONE && !folders.number) {
8006 fprintf(stdout,_("Error!\n"));
8010 for (i=0;i<folders.number;i++) {
8011 fprintf(stdout,_("%i. %s\n"),i+1,folders.Folder[i].Name);
8017 int resetphonesettings()
8019 /* Initialise the code for the GSM interface. */
8022 GSM->ResetPhoneSettings();
8031 /* Checked on 3310 4.02 and doesn't work.
8032 Possible reasons: SMSC has problems (possible), bug in phone firmware
8033 (very possible) or here in code.
8034 I quess, that the second is the most possible - 3310 treat only 3 SMS
8035 as linked (the most often profile needs 4 - 2 and few bytes in 3'th
8036 for screen saver, few bytes for profile name and 1 or 2 sms for ringtone).
8037 When send separate ringtone (see --sendringtone with --profilestyle)
8038 and screen saver (--sendlogo screensaver...), it's received OK.
8039 It's for checking in higher firmware. */
8040 int sendprofile(int argc, char *argv[])
8042 GSM_Ringtone ringtone;
8044 GSM_MultiSMSMessage MultiSMS;
8048 u8 MessageBuffer[140*4];
8049 u16 MessageLength=0;
8051 char profilename[10+1];
8053 if (GSM_ReadRingtoneFileOnConsole(argv[2], &ringtone)!=GE_NONE) return(-1);
8055 ringtone.allnotesscale=false;
8056 for (i=0;i<argc;i++)
8057 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
8059 /* The fourth argument is the bitmap file. */
8060 if (GSM_ReadBitmapFileOnConsole(argv[3], &bitmap)!=GE_NONE) return -1;
8062 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
8064 strncpy(profilename,argv[1],10);
8066 MessageBuffer[MessageLength++]=0x30; //SM version. Here 3.0
8068 MessageBuffer[MessageLength++]=SM30_PROFILENAME; //ID for profile name
8069 MessageBuffer[MessageLength++]=0x00; //length hi
8070 MessageBuffer[MessageLength++]=strlen(profilename);//length lo
8072 EncodeUnicode (MessageBuffer+MessageLength,profilename ,strlen(profilename));
8073 MessageLength=MessageLength+2*strlen(profilename);
8075 MessageBuffer[MessageLength++]=SM30_RINGTONE; //ID for ringtone
8077 MessageBuffer[MessageLength++]=0x01; //length hi
8078 MessageBuffer[MessageLength++]=0x00; //length lo
8080 j=SM30_MAX_RINGTONE_FRAME_LENGTH;
8081 current=GSM_PackRingtone(&ringtone, MessageBuffer+MessageLength, &j);
8082 MessageLength=MessageLength+j;
8084 if (current!=ringtone.NrNotes) {
8085 if (current>FB61_MAX_RINGTONE_NOTES) {
8086 fprintf(stderr,_("Warning: due to phone limitation"));
8088 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
8090 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
8093 MessageBuffer[i]=(j)/256;
8094 MessageBuffer[i+1]=(j)%256;
8096 MessageBuffer[MessageLength++]=SM30_SCREENSAVER; //ID for OTA screen saver
8097 MessageBuffer[MessageLength++]=0x01; //length hi
8098 MessageBuffer[MessageLength++]=0x00; //length lo
8099 MessageBuffer[MessageLength++]=0x00;
8100 MessageBuffer[MessageLength++]=bitmap.width;
8101 MessageBuffer[MessageLength++]=bitmap.height;
8102 MessageBuffer[MessageLength++]=0x01;
8104 memcpy(MessageBuffer+MessageLength,bitmap.bitmap,bitmap.size);
8105 MessageLength=MessageLength+bitmap.size;
8107 GSM_MakeMultiPartSMS2(&MultiSMS,MessageBuffer,MessageLength, GSM_ProfileUDH, GSM_Coding_Default);
8111 /* Initialise the GSM interface. */
8114 for (i=0;i<MultiSMS.number;i++)
8115 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
8117 return GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,false,false,false);
8120 int showbitmap(int argc, char *argv[])
8124 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
8126 GSM_PrintBitmap(&bitmap);
8131 int getwapsettings(int argc, char *argv[])
8133 GSM_WAPSettings settings;
8136 settings.location=atoi(argv[0]);
8138 /* Initialise the GSM interface. */
8141 error=GSM->GetWAPSettings(&settings);
8145 fprintf(stdout,_("%s."),argv[0]);
8146 if (!(strcmp(settings.title,""))) fprintf(stdout,_("Set %s\n"),argv[0]);
8147 else fprintf(stdout,_("%s\n"),settings.title);
8148 fprintf(stdout,_("Homepage: %s\n"),settings.homepage);
8149 if (settings.iscontinuous) fprintf(stdout,_("Connection type: continuous\n"));
8150 else fprintf(stdout,_("Connection type: temporary\n"));
8151 if (settings.issecurity) fprintf(stdout,_("Connection security: on\n"));
8152 else fprintf(stdout,_("Connection security: off\n"));
8153 switch (settings.bearer) {
8154 case WAPSETTINGS_BEARER_SMS:
8155 fprintf(stdout,_("Bearer: SMS\n"));
8156 fprintf(stdout,_("Server number: %s\n"),settings.server);
8157 fprintf(stdout,_("Service number: %s\n"),settings.service);
8159 case WAPSETTINGS_BEARER_DATA:
8160 fprintf(stdout,_("Bearer: Data (CSD)\n"));
8161 fprintf(stdout,_("Dial-up number: %s\n"),settings.dialup);
8162 fprintf(stdout,_("IP address: %s\n"),settings.ipaddress);
8163 if (settings.isnormalauthentication) fprintf(stdout,_("Authentication type: normal\n"));
8164 else fprintf(stdout,_("Authentication type: secure\n"));
8165 if (settings.isISDNcall) fprintf(stdout,_("Data call type: ISDN\n"));
8166 else fprintf(stdout,_("Data call type: analogue\n"));
8167 if (settings.isspeed14400) fprintf(stdout,_("Data call speed: 14400\n"));
8168 else fprintf(stdout,_("Data call speed: 9600\n"));
8169 fprintf(stdout,_("User name: %s\n"),settings.user);
8170 fprintf(stdout,_("Password: %s\n"),settings.password);
8172 case WAPSETTINGS_BEARER_USSD:
8173 fprintf(stdout,_("Bearer: USSD\n"));
8174 fprintf(stdout,_("Service code: %s\n"),settings.code);
8175 if (settings.isIP) fprintf(stdout,_("Address type: IP address\nIPaddress: %s\n"),settings.service);
8176 else fprintf(stdout,_("Address type: service number\nService number: %s\n"),settings.service);
8181 fprintf(stderr,_("%s\n"),print_error(error));
8190 /* Not full done now */
8191 int savewapsettings(int argc, char *argv[])
8193 GSM_WAPSettings settings;
8194 GSM_MultiSMSMessage MultiSMS;
8198 settings.location=atoi(argv[0]);
8200 /* Initialise the GSM interface. */
8203 error=GSM->GetWAPSettings(&settings);
8204 // strcpy(settings.homepage,"http://OtherSites/");
8205 // strcpy(settings.title,"Orange");
8211 /* Put settings into SMS structure */
8212 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8214 for (w=0;w<MultiSMS.number;w++)
8215 strcpy(MultiSMS.SMS[w].Destination,"WAPSettings");
8217 GSM_SaveMultiPartSMSOnConsole(&MultiSMS,1,argc,argv,false,false,false,false);
8222 fprintf(stderr,_("%s\n"),print_error(error));
8230 int sendwapsettings(int argc, char *argv[])
8232 GSM_WAPSettings settings;
8233 GSM_MultiSMSMessage MultiSMS;
8237 settings.location=atoi(argv[0]);
8239 /* Initialise the GSM interface. */
8242 error=GSM->GetWAPSettings(&settings);
8243 // strcpy(settings.homepage,"http://OtherSites/");
8244 // strcpy(settings.title,"Orange");
8250 /* Put settings into SMS structure */
8251 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8253 for (w=0;w<MultiSMS.number;w++)
8254 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8256 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8262 fprintf(stderr,_("%s\n"),print_error(error));
8270 int getwapbookmark(int argc, char *argv[])
8272 GSM_WAPBookmark bookmark;
8275 bookmark.location=atoi(argv[0]);
8277 /* Initialise the GSM interface. */
8280 error=GSM->GetWAPBookmark(&bookmark);
8284 if (bookmark.address[0]==0) {
8285 fprintf(stdout,_("Empty bookmark location\n"));
8287 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
8288 if (bookmark.title[0]==0)
8289 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
8291 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
8295 fprintf(stderr,_("%s\n"),print_error(error));
8304 int setwapbookmark(int argc, char *argv[])
8306 GSM_WAPBookmark bookmark;
8309 if (argc == 3) /* if location given, use it */
8310 bookmark.location=atoi(argv[2]);
8311 else /* else use first empty location */
8312 bookmark.location=0xffff;
8314 strcpy(bookmark.title, argv[0]);
8315 strcpy(bookmark.address, argv[1]);
8317 /* Initialise the GSM interface. */
8320 error=GSM->SetWAPBookmark(&bookmark);
8324 fprintf(stdout,_("No errors\n"));
8327 fprintf(stderr,_("%s\n"),print_error(error));
8336 int savewapbookmark(int argc, char *argv[])
8338 GSM_WAPBookmark bookmark;
8339 GSM_MultiSMSMessage MultiSMS;
8343 bookmark.location=atoi(argv[0]);
8345 /* Initialise the GSM interface. */
8348 error=GSM->GetWAPBookmark(&bookmark);
8350 // strcpy(bookmark.title,"tytulagagagagagagagagagagagagagagagagagagagagagend");
8351 // strcpy(bookmark.address,"http://jajajajajajajajajajajajagagagagagagagagagagagagagagagagagagagagagpapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap¥papapapapapapapapagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdstp");
8357 if (bookmark.address[0]==0) {
8358 fprintf(stdout,_("Empty bookmark location\n"));
8363 /* Put bookmark into SMS structure */
8364 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8366 for (w=0;w<MultiSMS.number;w++)
8367 strcpy(MultiSMS.SMS[w].Destination,"WAPBookmark");
8369 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 1,argc,argv,false,false,false,false);
8374 fprintf(stderr,_("%s\n"),print_error(error));
8383 int sendwapbookmark(int argc, char *argv[])
8385 GSM_WAPBookmark bookmark;
8386 GSM_MultiSMSMessage MultiSMS;
8390 bookmark.location=atoi(argv[0]);
8392 /* Initialise the GSM interface. */
8395 error=GSM->GetWAPBookmark(&bookmark);
8400 if (bookmark.address[0]==0) {
8401 fprintf(stdout,_("Empty bookmark location\n"));
8406 /* Put bookmark into SMS structure */
8407 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8409 for (w=0;w<MultiSMS.number;w++)
8410 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8412 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8417 fprintf(stderr,_("%s\n"),print_error(error));
8426 int savecalendarnote(int argc, char *argv[])
8428 GSM_MultiSMSMessage MultiSMS;
8430 GSM_CalendarNote CalendarNote;
8433 number=atoi(argv[1]);
8436 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8440 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
8443 case GE_CANTOPENFILE:
8444 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
8447 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8450 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
8456 /* Put note into SMS structure */
8457 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8459 for (w=0;w<MultiSMS.number;w++)
8460 strcpy(MultiSMS.SMS[w].Destination,"Calendar");
8462 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8467 int sendcalendarnote(int argc, char *argv[])
8469 GSM_MultiSMSMessage MultiSMS;
8471 GSM_CalendarNote CalendarNote;
8474 number=atoi(argv[2]);
8477 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8481 switch ( GSM_ReadVCalendarFile(argv[1], &CalendarNote, &number) ) {
8484 case GE_CANTOPENFILE:
8485 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[1]);
8488 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8491 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[1]);
8497 /* Put note into SMS structure */
8498 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8500 for (w=0;w<MultiSMS.number;w++)
8501 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8503 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8508 /* Example function for continuous receiving SMS */
8509 /* When phone receives SMS, it's read by mygnokii, ID number is created
8510 and SMS is saved to file. After it it's deleted
8511 Checking many errors is also done */
8512 int receivesms(int argc, char *argv[])
8516 GSM_SMSStatus SMSStatus = {0, 0};
8518 int read, location, number;
8519 unsigned char name[50],filename[400];
8520 char nowdate[12]="", nowtime[12]="";
8523 struct CFG_Header *cfg_info;
8525 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
8528 signal(SIGINT, interrupted);
8530 fprintf (stderr, _("Entering monitor mode (press CTRL+C to break)...\n"));
8532 cfg_info=CFG_FindGnokiirc();
8535 if (cfg_info!=NULL) {
8536 if (CFG_Get(cfg_info, "receivesms", "path")) {
8537 strcpy(Dir,CFG_Get(cfg_info, "receivesms", "path"));
8541 fprintf(stderr,_("Path for sms files is \"%s\"\n"),Dir);
8543 fprintf (stderr, _("Initialising GSM interface..."));
8545 /* Initialise the code for the GSM interface. */
8548 fprintf (stderr, _("done\n"));
8552 /* Loop here indefinitely - allows you to see messages from GSM code in
8553 response to unknown messages etc. The loops ends after pressing the
8555 while (!bshutdown) {
8556 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE) {
8557 if (SMSStatus.Number!=0) {
8559 GetMachineDateTime(nowdate, nowtime );
8560 logfile = fopen("log", "a");
8562 fprintf(logfile, _("%s %s SMS Messages: UnRead %d, Number %d\n"),
8563 nowdate, nowtime, SMSStatus.UnRead, SMSStatus.Number);
8570 while (!bshutdown) {
8572 SMS.Location=location;
8573 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
8574 if (SMS.folder==0 || SMS.folder==0x08) { //GST_7110_INBOX
8576 GetMachineDateTime(nowdate, nowtime );
8577 logfile = fopen("log", "a");
8579 fprintf(logfile,_("%s %s SMS on location %i\n"),
8580 nowdate,nowtime,SMS.MessageNumber);
8584 number= 16*(SMS.MessageText[2] >> 4)+ (SMS.MessageText[2] & 0x0f);
8585 number=number+ 256*16*(SMS.MessageText[1] >> 4)+ 256*(SMS.MessageText[1] & 0x0f);
8586 number=number+65536*16*(SMS.MessageText[0] >> 4)+65536*(SMS.MessageText[0] & 0x0f);
8588 sprintf( name, "%07i_%02d%02d%02d_%02d%02d%02d.sms", number,
8589 SMS.Time.Year, SMS.Time.Month, SMS.Time.Day,
8590 SMS.Time.Hour, SMS.Time.Minute, SMS.Time.Second);
8592 strcpy(filename,Dir);
8593 strcat(filename,name);
8595 logfile = fopen("log", "a");
8597 fprintf(logfile,_("%s %s Name is \"%s\"\n"),nowdate,nowtime,filename);
8601 file = fopen(filename, "rb");
8603 file = fopen(filename, "wb");
8605 GetMachineDateTime(nowdate, nowtime );
8606 fprintf(stderr,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8607 logfile = fopen("log", "a");
8609 fprintf(logfile,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8613 fwrite(SMS.MessageText,1,SMS.Length,file);
8619 GetMachineDateTime(nowdate, nowtime );
8620 fprintf(stderr,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8621 logfile = fopen("log", "a");
8623 fprintf(logfile,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8628 SMS.Location=SMS.MessageNumber;
8629 if (GSM->DeleteSMSMessage(&SMS)!=GE_NONE) {
8630 GetMachineDateTime(nowdate, nowtime );
8631 fprintf(stderr,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8632 logfile = fopen("log", "a");
8634 fprintf(logfile,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8642 if (read==SMSStatus.Number) break;
8646 GetMachineDateTime(nowdate, nowtime );
8647 fprintf(stderr,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8648 logfile = fopen("log", "a");
8650 fprintf(logfile,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8658 fprintf (stderr, _("Leaving monitor mode...\n"));
8665 int divert(int argc, char *argv[])
8670 memset(&cd, 0, sizeof(GSM_CallDivert));
8672 if (!strcmp("register", argv[0])){cd.Operation = GSM_CDV_Register ;}
8673 else if (!strcmp("enable" , argv[0])){cd.Operation = GSM_CDV_Enable ;}
8674 else if (!strcmp("disable" , argv[0])){cd.Operation = GSM_CDV_Disable ;}
8675 else if (!strcmp("erasure" , argv[0])){cd.Operation = GSM_CDV_Erasure ;}
8676 else if (!strcmp("query" , argv[0])){cd.Operation = GSM_CDV_Query ;}
8682 if (!strcmp("all" , argv[1])) {cd.DType = GSM_CDV_AllTypes ;}
8683 else if (!strcmp("busy" , argv[1])) {cd.DType = GSM_CDV_Busy ;}
8684 else if (!strcmp("noans" , argv[1])) {cd.DType = GSM_CDV_NoAnswer ;}
8685 else if (!strcmp("outofreach", argv[1])) {cd.DType = GSM_CDV_OutOfReach;}
8691 if (!strcmp("all" , argv[2])) {cd.CType = GSM_CDV_AllCalls ;}
8692 else if (!strcmp("voice", argv[2])) {cd.CType = GSM_CDV_VoiceCalls;}
8693 else if (!strcmp("fax" , argv[2])) {cd.CType = GSM_CDV_FaxCalls ;}
8694 else if (!strcmp("data" , argv[2])) {cd.CType = GSM_CDV_DataCalls ;}
8700 if (argc>3) strcpy(cd.Number, argv[3]);
8702 if (argc>4) cd.Timeout = atoi(argv[4]);
8704 /* Initialise the code for the GSM interface. */
8707 error=GSM->CallDivert(&cd);
8709 if (error == GE_NONE) {
8710 switch (cd.Operation)
8713 fprintf(stdout, _("Divert type: "));
8715 case GSM_CDV_Busy :fprintf(stdout, _("when busy"));break;
8716 case GSM_CDV_NoAnswer :fprintf(stdout, _("when not answered"));break;
8717 case GSM_CDV_OutOfReach:fprintf(stdout, _("when phone off or no coverage"));break;
8718 case GSM_CDV_AllTypes :fprintf(stdout, _("all call diverts"));break; //?
8719 default: fprintf(stdout, _("unknown %i"),cd.DType);break;
8722 fprintf(stdout, _("\nCalls type : "));
8724 case GSM_CDV_VoiceCalls: fprintf(stdout, _("voice"));break;
8725 case GSM_CDV_FaxCalls : fprintf(stdout, _("fax"));break;
8726 case GSM_CDV_DataCalls : fprintf(stdout, _("data"));break;
8727 case GSM_CDV_AllCalls : fprintf(stdout, _("voice, fax & data"));break;
8728 default: fprintf(stdout, _("unknown %i"),cd.CType);break;
8730 fprintf(stdout, _("\n"));
8733 fprintf(stdout, _("Status : active\n"));
8734 fprintf(stdout, _("Timeout : %i seconds\n"),cd.Timeout);
8735 fprintf(stdout, _("Number : %s\n"),cd.Number);
8737 fprintf(stdout, _("Status : deactivated\n"));
8742 fprintf(stdout,_("Divert done\n"));
8745 fprintf(stderr,_("%s\n"),print_error(error));
8752 int savephonebookentry(int argc, char *argv[])
8754 GSM_MultiSMSMessage MultiSMS;
8755 GSM_PhonebookEntry entry;
8761 /* Handle command line args that set type, start and end locations. */
8762 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
8764 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
8768 entry.Location=atoi(argv[1]);
8772 error=GSM->GetMemoryLocation(&entry);
8777 /* Put entry into SMS structure */
8778 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT) {
8779 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8781 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8784 for (w=0;w<MultiSMS.number;w++)
8785 strcpy(MultiSMS.SMS[w].Destination,"Phonebook");
8787 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8791 fprintf(stdout,_("Error\n"));break;
8797 int sendphonebookentry(int argc, char *argv[])
8799 GSM_MultiSMSMessage MultiSMS;
8800 GSM_PhonebookEntry entry;
8806 /* Handle command line args that set type, start and end locations. */
8807 if (!GetMemoryTypeID(argv[1], &entry.MemoryType))
8809 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
8813 entry.Location=atoi(argv[2]);
8817 error=GSM->GetMemoryLocation(&entry);
8822 /* Put entry into SMS structure */
8823 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71INT) {
8824 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8826 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8829 for (w=0;w<MultiSMS.number;w++)
8830 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8832 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8837 fprintf(stdout,_("Error\n"));break;
8844 int getbinringfromfile(int argc, char *argv[])
8849 GSM_BinRingtone binring,ringtone;
8851 fprintf(stdout,_("Offset %ld\n"),atol(argv[2]));
8853 file = fopen(argv[0], "rb");
8855 if (!file) return(GE_CANTOPENFILE);
8857 fseek(file,atol(argv[2]),0);
8859 ringtone.length=fread(ringtone.frame, 1, 900, file);
8865 if (ringtone.frame[i ]==0x00 && ringtone.frame[i+1]==0x02 &&
8866 ringtone.frame[i+2]==0xFC && ringtone.frame[i+3]==0x09) {
8871 if (i==ringtone.length-3) break;
8875 fprintf(stdout,_("Start not found\n"));
8881 if (ringtone.frame[j]==0x07 && ringtone.frame[j+1]==0x0B) {
8886 if (j==ringtone.length-2) break;
8890 fprintf(stdout,_("End not found\n"));
8895 binring.frame[binring.length++]=0x00;
8896 binring.frame[binring.length++]=0x00;
8897 binring.frame[binring.length++]=0x0C;
8898 binring.frame[binring.length++]=0x01;
8899 binring.frame[binring.length++]=0x2C;
8901 memcpy(binring.frame+binring.length,argv[1],strlen(argv[1]));
8902 binring.length=binring.length+strlen(argv[1]);
8904 binring.frame[binring.length++]=0x00;
8906 memcpy(binring.frame+binring.length,ringtone.frame+i,j-i+2);
8907 binring.length=binring.length+j-i+2;
8909 GSM_SaveBinRingtoneFile(argv[3], &binring);