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"
876 /* fbusinit is the generic function which waits for the FBUS link. The limit
877 is 10 seconds. After 10 seconds we quit. */
879 void fbusinit(void (*rlp_handler)(RLP_F96Frame *frame))
886 if (strcmp(GetMygnokiiVersion(),VERSION)!=0)
887 fprintf(stderr,_("WARNING: version of installed libmygnokii.so (%s) is different to version of gnokii (%s)\n"),GetMygnokiiVersion(),VERSION);
890 /* Initialise the code for the GSM interface. */
891 error = GSM_Initialise(model, Port, Initlength, GetConnectionTypeFromString(Connection), rlp_handler, SynchronizeTime);
893 if (error != GE_NONE) {
894 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
898 /* First (and important!) wait for GSM link to be active. We allow 10
900 while (count++ < 200 && *GSM_LinkOK == false)
903 if (*GSM_LinkOK == false) {
904 fprintf (stderr, _("Hmmm... GSM_LinkOK never went true. Quitting.\n"));
909 /* This function checks that the argument count for a given options is withing
912 int checkargs(int opt, struct gnokii_arg_len gals[], int argc)
917 /* Walk through the whole array with options requiring arguments. */
919 for(i = 0;!(gals[i].gal_min == 0 && gals[i].gal_max == 0); i++) {
921 /* Current option. */
923 if(gals[i].gal_opt == opt) {
925 /* Argument count checking. */
927 if(gals[i].gal_flags == GAL_XOR) {
928 if(gals[i].gal_min == argc || gals[i].gal_max == argc) return 0;
931 if(gals[i].gal_min <= argc && gals[i].gal_max >= argc) return 0;
940 /* We do not have options without arguments in the array, so check them. */
942 if (argc==0) return 0;
946 /* Main function - handles command line arguments, passes them to separate
947 functions accordingly. */
949 int main(int argc, char *argv[])
956 /* Every option should be in this array. */
958 static struct option long_options[] =
961 { "help", no_argument, NULL, OPT_HELP },// Display usage.
962 { "version", no_argument, NULL, OPT_VERSION },// Display version and build information.
963 { "getsmsfolders", no_argument, NULL, OPT_GETSMSFOLDERS },// Gets SMS folders
964 { "getsmsstatus", no_argument, NULL, OPT_GETSMSSTATUS },// Get SMS Folder Status
965 { "identify", no_argument, NULL, OPT_IDENTIFY },// Identify
966 { "pmon", no_argument, NULL, OPT_PMON },// For development purposes: run in passive monitoring mode
967 { "foogle", no_argument, NULL, OPT_FOOGLE },// For development purposes: insert you function calls here
968 { "getdatetime", no_argument, NULL, OPT_GETDATETIME },// Get date and time mode
969 { "getalarm", no_argument, NULL, OPT_GETALARM },// Get alarm
970 { "cancelcall", no_argument, NULL, OPT_CANCELCALL },// Cancel Call
971 { "getdisplaystatus", no_argument, NULL, OPT_GETDISPLAYSTATUS },// Get display status mode
972 { "allringtones", no_argument, NULL, OPT_ALLRINGTONES },/* Displays names of available ringtones */
973 { "displayoutput", no_argument, NULL, OPT_DISPLAYOUTPUT },/* Show texts from phone's display */
974 { "getphoneprofile", no_argument, NULL, OPT_GETPHONEPROFILE },/* Get/Set phone profile settings */
975 { "getoperatorname", no_argument, NULL, OPT_GETOPERATORNAME },/* Get downloaded operator name */
976 { "getvoicemailbox", no_argument, NULL, OPT_GETVOICEMAILBOX },/* Gets voice mailbox number */
977 { "phonetests", no_argument, NULL, OPT_PHONETESTS },
978 { "simlockinfo", no_argument, NULL, OPT_SIMLOCKINFO },
979 { "receivesms", no_argument, NULL, OPT_RECEIVESMS },
980 { "setoperatorname", optional_argument, NULL, OPT_SETOPERATORNAME },/* Set downloaded operator name */
981 { "setdatetime", optional_argument, NULL, OPT_SETDATETIME },// Set date and time
982 { "writephonebook", optional_argument, NULL, OPT_WRITEPHONEBOOK },// Write phonebook (memory) mode
983 { "reset", optional_argument, NULL, OPT_RESET },// Resets the phone
984 { "monitor", optional_argument, NULL, OPT_MONITOR },// Monitor mode
985 { "setlogo", optional_argument, NULL, OPT_SETLOGO },// Set logo
986 { "getprofile", optional_argument, NULL, OPT_GETPROFILE },// Show profile
987 { "setalarm", required_argument, NULL, OPT_SETALARM },// Set alarm
988 { "dialvoice", required_argument, NULL, OPT_DIALVOICE },// Voice call mode
989 { "getcalendarnote", required_argument, NULL, OPT_GETCALENDARNOTE },// Get calendar note mode
990 { "writecalendarnote", required_argument, NULL, OPT_WRITECALENDARNOTE},// Write calendar note mode
991 { "sendcalendarnote", required_argument, NULL, OPT_SENDCALENDARNOTE },
992 { "savecalendarnote", required_argument, NULL, OPT_SAVECALENDARNOTE },
993 { "sendphonebookentry", required_argument, NULL, OPT_SENDPHONEBOOKENTRY},
994 { "savephonebookentry", required_argument, NULL, OPT_SAVEPHONEBOOKENTRY},
995 { "deletecalendarnote", required_argument, NULL, OPT_DELCALENDARNOTE },// Delete calendar note mode
996 { "getmemory", required_argument, NULL, OPT_GETMEMORY },// Get memory mode
997 { "getspeeddial", required_argument, NULL, OPT_GETSPEEDDIAL },// Get speed dial mode
998 { "setspeeddial", required_argument, NULL, OPT_SETSPEEDDIAL },// Set speed dial mode
999 { "getsms", required_argument, NULL, OPT_GETSMS },// Get SMS message mode
1000 { "deletesms", required_argument, NULL, OPT_DELETESMS },// Delete SMS message mode
1001 { "sendsms", required_argument, NULL, OPT_SENDSMS },// Send SMS message mode
1002 { "savesms", required_argument, NULL, OPT_SAVESMS },// Save SMS message mode
1003 { "sendlogo", required_argument, NULL, OPT_SENDLOGO },// Send logo as SMS message mode
1004 { "savelogo", required_argument, NULL, OPT_SAVELOGO },// Save logo on SIM
1005 { "sendringtone", required_argument, NULL, OPT_SENDRINGTONE },// Send ringtone as SMS message
1006 { "saveringtone", required_argument, NULL, OPT_SAVERINGTONE },// Saves ringtone on SIM
1007 { "setringtone", required_argument, NULL, OPT_SETRINGTONE },// Set ringtone
1008 { "getringtone", required_argument, NULL, OPT_GETRINGTONE },// Get bin/normal ringtone
1009 { "presskeysequence", required_argument, NULL, OPT_PRESSKEYSEQUENCE },/* Presses keys in phone's display */
1010 { "getsmsc", required_argument, NULL, OPT_GETSMSC },// Get SMS center number mode
1011 { "renamesmsc", required_argument, NULL, OPT_RENAMESMSC },// Rename SMSC
1012 { "netmonitor", required_argument, NULL, OPT_NETMONITOR },// NetMonitor mode
1013 { "senddtmf", required_argument, NULL, OPT_SENDDTMF },// Send DTMF sequence
1014 { "getlogo", required_argument, NULL, OPT_GETLOGO },// Get logo
1015 { "setprofile", required_argument, NULL, OPT_SETPROFILE },// Set profile feature
1016 { "sendprofile", required_argument, NULL, OPT_SENDPROFILE },// Send profile via SMS
1017 { "setphoneprofile", required_argument, NULL, OPT_SETPHONEPROFILE },/* Get/Set phone profile settings */
1018 { "restoresettings", required_argument, NULL, OPT_RESTORESETTINGS },//Restore various settings from one file
1019 { "backupsettings", required_argument, NULL, OPT_BACKUPSETTINGS },//Backup various settings to one file
1020 { "playringtone", required_argument, NULL, OPT_PLAYRINGTONE },/* Plays ringtones */
1021 { "composer", required_argument, NULL, OPT_COMPOSER },/* Shows ringtone like in Nokia Composer */
1022 { "ringtoneconvert", required_argument, NULL, OPT_RINGTONECONVERT },/* Convert ringtone files */
1023 { "binringtoneconvert", required_argument, NULL, OPT_BINRINGTONECONVERT},/* Convert binary ringtone files */
1024 { "bitmapconvert", required_argument, NULL, OPT_BITMAPCONVERT },/* Convert bitmap files */
1025 { "showbitmap", required_argument, NULL, OPT_SHOWBITMAP },
1026 { "nm_collect", required_argument, NULL, OPT_NM_COLLECT },// NetMonitor periodical data collection mode (newbiee)
1027 { "netmonitordata", required_argument, NULL, OPT_NETMONITORDATA },// NetMonitor periodical data collection mode (advanced)
1028 { "getwapbookmark", required_argument, NULL, OPT_GETWAPBOOKMARK },
1029 { "setwapbookmark", required_argument, NULL, OPT_SETWAPBOOKMARK },
1030 { "savewapbookmark", required_argument, NULL, OPT_SAVEWAPBOOKMARK },
1031 { "savewapsettings", required_argument, NULL, OPT_SAVEWAPSETTINGS },
1032 { "sendwapsettings", required_argument, NULL, OPT_SENDWAPSETTINGS },
1033 { "sendwapbookmark", required_argument, NULL, OPT_SENDWAPBOOKMARK },
1034 { "getwapsettings", required_argument, NULL, OPT_GETWAPSETTINGS },
1035 { "divert", required_argument, NULL, OPT_DIVERT },
1038 { "entersecuritycode", required_argument, NULL, OPT_ENTERSECURITYCODE },// Enter Security Code mode
1039 { "getsecuritycode", required_argument, NULL, OPT_GETSECURITYCODE },// Get Security Code
1040 { "getsecuritycodestatus",no_argument, NULL, OPT_GETSECURITYCODESTATUS},// Get Security Code status
1041 { "geteeprom", no_argument, NULL, OPT_GETEEPROM },// Gets EEPROM
1042 { "resetphonesettings", no_argument, NULL, OPT_RESETPHONESETTINGS },// Reset phone settings
1043 { "setsimlock", no_argument, NULL, OPT_SETSIMLOCK },// Sets simlock
1047 { "sniff", optional_argument, NULL, OPT_SNIFFER },// Will show datas from port
1048 { "decodefile", required_argument, NULL, OPT_DECODEFILE },//decode input file
1054 /* Every command which requires arguments should have an appropriate entry
1057 struct gnokii_arg_len gals[] =
1060 { OPT_MONITOR, 0, 1, 0 },
1063 { OPT_ENTERSECURITYCODE, 1, 1, 0 },
1064 { OPT_GETSECURITYCODE, 1, 1, 0 },
1068 { OPT_SNIFFER, 0, 1, 0 },
1069 { OPT_DECODEFILE, 1, 1, 0 },
1072 { OPT_SETDATETIME, 0, 5, 0 },
1073 { OPT_BACKUPSETTINGS, 1, 1, 0 },
1074 { OPT_RESTORESETTINGS, 1, 1, 0 },
1075 { OPT_SETALARM, 2, 2, 0 },
1076 { OPT_DIALVOICE, 1, 1, 0 },
1077 { OPT_GETCALENDARNOTE, 1, 3, 0 },
1078 { OPT_WRITECALENDARNOTE, 2, 2, 0 },
1079 { OPT_SAVECALENDARNOTE, 2, 9, 0 },
1080 { OPT_SENDCALENDARNOTE, 3, 9, 0 },
1081 { OPT_SAVEPHONEBOOKENTRY,2, 9, 0 },
1082 { OPT_SENDPHONEBOOKENTRY,3, 9, 0 },
1083 { OPT_DELCALENDARNOTE, 1, 1, 0 },
1084 { OPT_GETMEMORY, 2, 4, 0 },
1085 { OPT_GETSPEEDDIAL, 1, 1, 0 },
1086 { OPT_SETSPEEDDIAL, 3, 3, 0 },
1087 { OPT_GETSMS, 2, 5, 0 },
1088 { OPT_DELETESMS, 2, 3, 0 },
1089 { OPT_SENDSMS, 1,10, 0 },
1090 { OPT_SAVESMS, 1,11, 0 },
1091 { OPT_SENDLOGO, 3, 9, 0 },
1092 { OPT_SAVELOGO, 2,10, 0 },
1093 { OPT_SENDRINGTONE, 2, 7, 0 },
1094 { OPT_SAVERINGTONE, 1, 9, 0 },
1095 { OPT_GETSMSC, 1, 1, 0 },
1096 { OPT_RENAMESMSC, 2, 2, 0 },
1097 { OPT_NETMONITOR, 1, 1, 0 },
1098 { OPT_SENDDTMF, 1, 1, 0 },
1099 { OPT_SETLOGO, 1, 5, 0 },
1100 { OPT_GETLOGO, 1, 4, 0 },
1101 { OPT_SETRINGTONE, 1, 3, 0 },
1102 { OPT_GETRINGTONE, 1, 2, 0 },
1103 { OPT_PRESSKEYSEQUENCE, 1, 1, 0 },
1104 { OPT_RESET, 0, 1, 0 },
1105 { OPT_GETPROFILE, 0, 1, 0 },
1106 { OPT_SETPROFILE, 3, 3, 0 },
1107 { OPT_SENDPROFILE, 4,10, 0 },
1108 { OPT_WRITEPHONEBOOK, 0, 1, 0 },
1109 { OPT_PLAYRINGTONE, 1, 1, 0 },
1110 { OPT_COMPOSER, 1, 1, 0 },
1111 { OPT_RINGTONECONVERT, 2, 2, 0 },
1112 { OPT_BINRINGTONECONVERT,2, 2, 0 },
1113 { OPT_BITMAPCONVERT, 2, 4, 0 },
1114 { OPT_SHOWBITMAP, 1, 1, 0 },
1115 { OPT_SETOPERATORNAME, 0, 2, 0 },
1116 { OPT_SETPHONEPROFILE, 2, 2, 0 },
1117 { OPT_NM_COLLECT, 1, MAX_NM_COLLECT, 0 },
1118 { OPT_NETMONITORDATA, 0,99, 0 },
1119 { OPT_GETWAPBOOKMARK, 1, 1, 0 },
1120 { OPT_SETWAPBOOKMARK, 2, 3, 0 },
1121 { OPT_SAVEWAPBOOKMARK, 1, 9, 0 },
1122 { OPT_SENDWAPBOOKMARK, 2, 9, 0 },
1123 { OPT_GETWAPSETTINGS, 1, 1, 0 },
1124 { OPT_SAVEWAPSETTINGS, 1, 9, 0 },
1125 { OPT_SENDWAPSETTINGS, 2, 9, 0 },
1126 { OPT_DIVERT, 3, 5, 0 },
1133 /* For GNU gettext */
1137 textdomain("gnokii");
1138 setlocale(LC_ALL, "pl_PL"); //here is string for Polish localisation
1140 setlocale(LC_ALL, ".852"); //Polish codepage for console, not "real" WIN CP
1145 /* Read config file */
1146 if (CFG_ReadConfig(&model, &Port, &Initlength, &Connection, &BinDir, &SynchronizeTime,false) < 0) {
1150 /* Handle command line arguments. */
1152 c = getopt_long(argc, argv, "", long_options, NULL);
1156 /* No argument given - we should display usage. */
1161 /* We have to build an array of the arguments which will be passed to the
1162 functions. Please note that every text after the --command will be
1163 passed as arguments. A syntax like gnokii --cmd1 args --cmd2 args will
1164 not work as expected; instead args --cmd2 args is passed as a
1167 if((nargv = malloc(sizeof(char *) * argc)) != NULL) {
1169 for(i = 2; i < argc; i++)
1170 nargv[i-2] = argv[i];
1172 if(checkargs(c, gals, nargc)) {
1176 /* Wrong number of arguments - we should display usage. */
1182 #if defined(__svr4__)
1183 /* have to ignore SIGALARM */
1190 // First, error conditions
1192 fprintf(stderr, _("Use '%s --help' for usage informations.\n"), argv[0]);
1195 // Then, options with no arguments
1196 case OPT_HELP: rc = usage(); break;
1197 case OPT_VERSION: rc = version(); break;
1198 case OPT_MONITOR: rc = monitormode(nargc, nargv); break;
1199 case OPT_GETSMSFOLDERS: rc = getsmsfolders(); break;
1200 case OPT_GETDATETIME: rc = getdatetime(); break;
1201 case OPT_GETALARM: rc = getalarm(); break;
1202 case OPT_GETDISPLAYSTATUS: rc = getdisplaystatus(); break;
1203 case OPT_PMON: rc = pmon(); break;
1204 case OPT_WRITEPHONEBOOK: rc = writephonebook(nargc, nargv);break;
1207 case OPT_ENTERSECURITYCODE: rc = entersecuritycode(optarg); break;
1208 case OPT_GETSECURITYCODESTATUS: rc = getsecuritycodestatus(); break;
1209 case OPT_GETSECURITYCODE: rc = getsecuritycode(optarg); break;
1210 case OPT_GETEEPROM: rc = geteeprom(); break;
1211 case OPT_RESETPHONESETTINGS: rc = resetphonesettings(); break;
1212 case OPT_SETSIMLOCK: rc = setsimlock(); break;
1216 case OPT_SNIFFER: rc = sniff(nargc, nargv); break;
1217 case OPT_DECODEFILE: rc = decodefile(nargc, nargv); break;
1220 // Now, options with arguments
1221 case OPT_SETDATETIME: rc = setdatetime(nargc, nargv); break;
1222 case OPT_SETALARM: rc = setalarm(nargv); break;
1223 case OPT_DIALVOICE: rc = dialvoice(optarg); break;
1224 case OPT_CANCELCALL: rc = cancelcall(); break;
1225 case OPT_GETCALENDARNOTE: rc = getcalendarnote(nargc, nargv);break;
1226 case OPT_DELCALENDARNOTE: rc = deletecalendarnote(optarg);break;
1227 case OPT_SAVECALENDARNOTE: rc = savecalendarnote(nargc, nargv);break;
1228 case OPT_SENDCALENDARNOTE: rc = sendcalendarnote(nargc, nargv);break;
1229 case OPT_SAVEPHONEBOOKENTRY: rc = savephonebookentry(nargc, nargv);break;
1230 case OPT_SENDPHONEBOOKENTRY: rc = sendphonebookentry(nargc, nargv);break;
1231 case OPT_WRITECALENDARNOTE: rc = writecalendarnote(nargv); break;
1232 case OPT_GETMEMORY: rc = getmemory(nargc, nargv); break;
1233 case OPT_GETSPEEDDIAL: rc = getspeeddial(optarg); break;
1234 case OPT_SETSPEEDDIAL: rc = setspeeddial(nargv); break;
1235 case OPT_GETSMS: rc = getsms(argc, argv); break;
1236 case OPT_GETSMSSTATUS: rc = getsmsstatus(argc, argv); break;
1237 case OPT_DELETESMS: rc = deletesms(nargc, nargv); break;
1238 case OPT_SENDSMS: rc = sendsms(nargc, nargv); break;
1239 case OPT_SAVESMS: rc = savesms(nargc, nargv); break;
1240 case OPT_DIVERT: rc = divert(nargc, nargv); break;
1241 case OPT_SENDLOGO: rc = sendlogo(nargc, nargv); break;
1242 case OPT_SAVELOGO: rc = savelogo(nargc, nargv); break;
1243 case OPT_GETSMSC: rc = getsmsc(optarg); break;
1244 case OPT_RENAMESMSC: rc = renamesmsc(nargc,nargv); break;
1245 case OPT_NETMONITOR: rc = netmonitor(optarg); break;
1246 case OPT_IDENTIFY: rc = identify(); break;
1247 case OPT_SETLOGO: rc = setlogo(nargc, nargv); break;
1248 case OPT_GETLOGO: rc = getlogo(nargc, nargv); break;
1249 case OPT_RECEIVESMS: rc = receivesms(nargc, nargv); break;
1250 case OPT_SETRINGTONE: rc = setringtone(nargc, nargv); break;
1251 case OPT_GETRINGTONE: rc = getringtone(nargc, nargv); break;
1252 case OPT_PRESSKEYSEQUENCE: rc = presskeysequence(nargv); break;
1253 case OPT_SENDRINGTONE: rc = sendringtone(nargc, nargv);break;
1254 case OPT_SAVERINGTONE: rc = saveringtone(nargc, nargv);break;
1255 case OPT_GETPROFILE: rc = getprofile(nargc, nargv); break;
1256 case OPT_SETPROFILE: rc = setprofile(nargc, nargv); break;
1257 case OPT_SENDPROFILE: rc = sendprofile(nargc, nargv); break;
1258 case OPT_DISPLAYOUTPUT: rc = displayoutput(); break;
1259 case OPT_RESTORESETTINGS: rc = restoresettings(nargv); break;
1260 case OPT_BACKUPSETTINGS: rc = backupsettings(nargv); break;
1261 case OPT_RINGTONECONVERT: rc = ringtoneconvert(nargc, nargv);break;
1262 case OPT_BINRINGTONECONVERT: rc = binringtoneconvert(nargc, nargv);break;
1263 case OPT_BITMAPCONVERT: rc = bitmapconvert(nargc, nargv);break;
1264 case OPT_SHOWBITMAP: rc = showbitmap(nargc, nargv); break;
1265 case OPT_PLAYRINGTONE: rc = playringtone(nargc, nargv);break;
1266 case OPT_COMPOSER: rc = composer(nargc, nargv); break;
1267 case OPT_FOOGLE: rc = foogle(nargv); break;
1268 case OPT_PHONETESTS: rc = phonetests(); break;
1269 case OPT_SIMLOCKINFO: rc = simlockinfo(); break;
1270 case OPT_SENDDTMF: rc = senddtmf(optarg); break;
1271 case OPT_RESET: rc = reset(nargc,nargv); break;
1272 case OPT_GETOPERATORNAME: rc = getoperatorname(); break;
1273 case OPT_SETOPERATORNAME: rc = setoperatorname(nargc,nargv);break;
1274 case OPT_GETWAPBOOKMARK: rc = getwapbookmark(nargc,nargv);break;
1275 case OPT_SETWAPBOOKMARK: rc = setwapbookmark(nargc,nargv);break;
1276 case OPT_SAVEWAPBOOKMARK: rc = savewapbookmark(nargc,nargv);break;
1277 case OPT_SENDWAPBOOKMARK: rc = sendwapbookmark(nargc,nargv);break;
1278 case OPT_GETWAPSETTINGS: rc = getwapsettings(nargc,nargv);break;
1279 case OPT_SAVEWAPSETTINGS: rc = savewapsettings(nargc,nargv);break;
1280 case OPT_SENDWAPSETTINGS: rc = sendwapsettings(nargc,nargv);break;
1281 case OPT_ALLRINGTONES: rc = allringtones(); break;
1282 case OPT_GETPHONEPROFILE: rc = getphoneprofile(); break;
1283 case OPT_SETPHONEPROFILE: rc = setphoneprofile(nargc,nargv);break;
1284 case OPT_GETVOICEMAILBOX: rc = getvoicemailbox(); break;
1285 case OPT_NM_COLLECT: rc = nm_collect(nargc, nargv); break;
1286 case OPT_NETMONITORDATA: rc = netmonitordata(nargc, nargv);break;
1288 default: fprintf(stderr, _("Unknown option: %d\n"), c); break;
1297 fprintf(stderr, _("Wrong number of arguments\n"));
1302 /* Restores various phone settings from one file */
1303 int restoresettings(char *argv[])
1305 fprintf(stdout,_("Work in progress. Not usefull now. Sorry\n"));
1309 /* Backup various phone settings from one file */
1310 int backupsettings(char *argv[])
1312 GSM_PhonebookEntry PbkEntry;
1317 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
1318 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
1322 fprintf(stderr,_("Backup phonebook from SIM..."));
1323 Backup.SIMPhonebookUsed=0;
1324 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE) {//FIXME
1325 Backup.SIMPhonebookSize=SIMMemoryStatus.Used+SIMMemoryStatus.Free;
1327 PbkEntry.MemoryType=GMT_SM;
1329 for (i=0;i<Backup.SIMPhonebookSize;i++)
1331 if (SIMMemoryStatus.Used==Backup.SIMPhonebookUsed) break;
1333 PbkEntry.Location=i;
1335 error=GSM->GetMemoryLocation(&PbkEntry);
1338 Backup.SIMPhonebook[Backup.SIMPhonebookUsed]=PbkEntry;
1339 Backup.SIMPhonebookUsed++;
1340 fprintf(stderr,_("."));
1346 fprintf(stderr,_("Done\n"));
1347 } else fprintf(stderr,_("ERROR\n"));
1349 fprintf(stderr,_("Backup phonebook from phone..."));
1350 Backup.PhonePhonebookUsed=0;
1351 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE) {
1352 Backup.PhonePhonebookSize=PhoneMemoryStatus.Used+PhoneMemoryStatus.Free;
1354 PbkEntry.MemoryType=GMT_ME;
1356 for (i=0;i<Backup.PhonePhonebookSize;i++)
1358 if (PhoneMemoryStatus.Used==Backup.PhonePhonebookUsed) break;
1360 PbkEntry.Location=i;
1362 error=GSM->GetMemoryLocation(&PbkEntry);
1365 Backup.PhonePhonebook[Backup.PhonePhonebookUsed]=PbkEntry;
1366 Backup.PhonePhonebookUsed++;
1367 fprintf(stderr,_("."));
1373 fprintf(stderr,_("Done\n"));
1374 } else fprintf(stderr,_("ERROR\n"));
1376 if( GetModelFeature (FN_CALLERGROUPS)!=0) {
1377 fprintf(stderr,_("Backup caller logos..."));
1378 Backup.CallerAvailable=true;
1380 Backup.CallerGroups[i].number=i;
1381 Backup.CallerGroups[i].type=GSM_CallerLogo;
1382 if (GSM->GetBitmap(&Backup.CallerGroups[i])!=GE_NONE) return 1;
1384 fprintf(stderr,_("Done\n"));
1385 } else Backup.CallerAvailable=false;
1387 // fprintf(stderr,_("Backup speed dials..."));
1388 Backup.SpeedAvailable=false;
1389 // for (i=0;i<8;i++) {
1390 // Backup.SpeedDials[i].Number=i+1;
1391 // if (GSM->GetSpeedDial(&Backup.SpeedDials[i])!=GE_NONE) return 1;
1393 // fprintf(stderr,_("Done\n"));
1395 fprintf(stderr,_("Backup operator logo..."));
1396 Backup.OperatorLogoAvailable=true;
1397 Backup.OperatorLogo.type=GSM_7110OperatorLogo;
1398 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1399 Backup.OperatorLogoAvailable=true;
1400 Backup.OperatorLogo.type=GSM_OperatorLogo;
1401 if (GSM->GetBitmap(&Backup.OperatorLogo)!=GE_NONE) {
1402 Backup.OperatorLogoAvailable=false;
1403 fprintf(stderr,_("Error\n"));
1404 } else fprintf(stderr,_("Done\n"));
1405 } else fprintf(stderr,_("Done\n"));
1407 Backup.StartupLogoAvailable=false;
1408 if( GetModelFeature (FN_STARTUP)!=0) {
1409 fprintf(stderr,_("Backup startup logo..."));
1410 Backup.StartupLogoAvailable=true;
1411 switch (GetModelFeature (FN_STARTUP)) {
1412 case F_STA62: Backup.StartupLogo.type=GSM_6210StartupLogo;break;
1413 case F_STA71: Backup.StartupLogo.type=GSM_7110StartupLogo;break;
1414 default : Backup.StartupLogo.type=GSM_StartupLogo;break;
1416 if (GSM->GetBitmap(&Backup.StartupLogo)!=GE_NONE) {
1417 Backup.StartupLogoAvailable=false;
1418 fprintf(stderr,_("Error\n"));
1419 } else fprintf(stderr,_("Done\n"));
1422 fprintf(stderr,_("Backup welcome note..."));
1423 Backup.StartupText.type=GSM_WelcomeNoteText;
1424 if (GSM->GetBitmap(&Backup.StartupText)!=GE_NONE) {
1425 fprintf(stderr,_("Error\n"));
1426 } else fprintf(stderr,_("Done\n"));
1430 GSM_SaveBackupFile(argv[0], &Backup);
1435 /* Presses keys on phone's keyboard */
1437 int presskeysequence(char *argv[])
1445 /* We need to make sure that the init is finished to avoid interrupted */
1446 /* multiframe packets... */
1450 for (i=0;i<strlen(argv[0]);i++)
1456 if (key!='w' && key!='W')
1458 while (Keys[j].whatchar!=' ') {
1459 if (Keys[j].whatchar==key) {
1460 keycode=Keys[j].whatcode;
1467 fprintf(stderr,_("Unknown key: %c !\n"),key);
1472 if (GSM->PressKey(keycode,PRESSPHONEKEY)!=GE_NONE)
1474 fprintf(stderr,_("Can't press key !\n"));
1478 if (GSM->PressKey(keycode,RELEASEPHONEKEY)!=GE_NONE)
1480 fprintf(stderr,_("Can't release key !\n"));
1495 /* Send SMS messages. */
1496 int sendsms(int argc, char *argv[])
1498 GSM_MultiSMSMessage MultiSMS;
1499 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1500 int input_len, chars_read,i,msgnum;
1502 GSM_SMSMessageType SMSType=GST_SMS;
1503 int SMSValidity= 4320; /* 4320 minutes == 72 hours */
1504 bool SMSReply=false;
1505 int SMSClass=-1,SMSCenter=1;
1506 char SMSCNumber[100];
1507 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1508 GSM_UDH SMSUDHType=GSM_NoUDH;
1510 struct option options[] = {
1511 { "smscno", required_argument, NULL, '1'},
1512 { "smsc", required_argument, NULL, '2'},
1513 { "long", required_argument, NULL, '3'},
1514 { "enablevoice", no_argument, NULL, '4'},
1515 { "disablevoice", no_argument, NULL, '5'},
1516 { "enableemail", no_argument, NULL, '6'},
1517 { "disableemail", no_argument, NULL, '7'},
1518 { "enablefax", no_argument, NULL, '8'},
1519 { "disablefax", no_argument, NULL, '9'},
1520 { "unicode", no_argument, NULL, '-'},
1521 { "void", no_argument, NULL, '+'},
1522 { "hang", no_argument, NULL, '('},
1523 { "bug", no_argument, NULL, ')'},
1527 input_len = GSM_MAX_SMS_LENGTH;
1534 while ((i = getopt_long(argc, argv, "v:dsC:", options, NULL)) != -1) {
1537 case '1': /* SMSC number */
1539 strcpy(SMSCNumber,optarg);
1542 case '2': /* SMSC number index in phone memory */
1543 SMSCenter = atoi(optarg);
1545 if (SMSCenter < 1 || SMSCenter > 5) {
1546 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1552 case '3': /* we send long message */
1553 SMSUDHType=GSM_ConcatenatedMessages;
1554 input_len = atoi(optarg);
1555 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1556 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1561 case '4': /* SMS enables voice indicator */
1562 SMSUDHType=GSM_EnableVoice; break;
1564 case '5': /* SMS disables voice indicator */
1565 SMSUDHType=GSM_DisableVoice; break;
1567 case '6': /* SMS enables email indicator */
1568 SMSUDHType=GSM_EnableEmail; break;
1570 case '7': /* SMS disables email indicator */
1571 SMSUDHType=GSM_DisableEmail; break;
1573 case '8': /* SMS enables fax indicator */
1574 SMSUDHType=GSM_EnableFax; break;
1576 case '9': /* SMS disables fax indicator */
1577 SMSUDHType=GSM_DisableFax; break;
1579 case '-': /* SMS coding type */
1580 SMSCoding=GSM_Coding_Unicode; break;
1582 case '+': /* SMS ghost */
1583 SMSUDHType=GSM_VoidSMS; break;
1585 case '(': /* SMS hanging phone, when saved to Outbox */
1586 SMSUDHType=GSM_HangSMS; break;
1588 case ')': /* SMS showed incorrectly in phone */
1589 SMSUDHType=GSM_BugSMS; break;
1591 case 'v': /* Set validaty of SMS */
1592 SMSValidity = atoi(optarg); break;
1594 case 'd': /* delivery report */
1595 SMSType=GST_DR; break;
1597 case 's': /* Set replying via the same SMSC */
1598 SMSReply = true; break;
1600 case 'C': /* class Message */
1602 if (SMSUDHType!=GSM_NoUDH) {
1603 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1608 case '0': SMSClass = 0; break;
1609 case '1': SMSClass = 1; break;
1610 case '2': SMSClass = 2; break;
1611 case '3': SMSClass = 3; break;
1613 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1619 fprintf(stderr,_("Unknown option number %i\n"),argc);
1625 /* Get message text from stdin. */
1626 chars_read = fread(message_buffer, 1, input_len, stdin);
1628 if (chars_read == 0) {
1629 fprintf(stderr, _("Couldn't read from stdin!\n"));
1632 if (chars_read > input_len) {
1633 fprintf(stderr, _("Input too long!\n"));
1637 /* Null terminate. */
1638 message_buffer[chars_read] = 0x00;
1640 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1641 msgnum=MultiSMS.number;
1643 switch (SMSUDHType) {
1648 case GSM_EnableVoice:
1649 case GSM_DisableVoice:
1651 case GSM_DisableFax:
1652 case GSM_EnableEmail:
1653 case GSM_DisableEmail:
1654 fprintf(stdout,_("Warning: saving %i chars\n"),strlen(MultiSMS.SMS[0].MessageText));
1661 for (i=0;i<msgnum;i++) {
1662 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1664 MultiSMS.SMS[i].Class=SMSClass;
1665 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
1666 MultiSMS.SMS[i].Type=SMSType;
1667 MultiSMS.SMS[i].Validity=SMSValidity;
1670 /* Initialise the GSM interface. */
1673 MultiSMS.number=msgnum;
1674 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,false,false,false);
1679 int savesms(int argc, char *argv[])
1681 GSM_MultiSMSMessage MultiSMS;
1682 char message_buffer[GSM_MAX_CONCATENATED_SMS_LENGTH];
1683 int input_len, chars_read,i,msgnum;
1685 int SMSClass=-1,SMSCenter=1;
1687 char SMSCNumber[100];
1688 GSM_Coding_Type SMSCoding=GSM_Coding_Default;
1689 GSM_UDH SMSUDHType=GSM_NoUDH;
1690 GSM_SMSMessageStatus SMSStatus;
1692 bool SMSReply=false;
1694 bool interactive=false;
1696 struct option options[] = {
1697 { "smscno", required_argument, NULL, '1'},
1698 { "smsc", required_argument, NULL, '2'},
1699 { "long", required_argument, NULL, '3'},
1700 { "enablevoice", no_argument, NULL, '4'},
1701 { "disablevoice", no_argument, NULL, '5'},
1702 { "enableemail", no_argument, NULL, '6'},
1703 { "disableemail", no_argument, NULL, '7'},
1704 { "enablefax", no_argument, NULL, '8'},
1705 { "disablefax", no_argument, NULL, '9'},
1706 { "unicode", no_argument, NULL, '-'},
1707 { "void", no_argument, NULL, '+'},
1708 { "hang", no_argument, NULL, '('},
1709 { "bug", no_argument, NULL, ')'},
1710 { "smsname", required_argument, NULL, '/'},
1716 SMSStatus=GSS_NOTSENTREAD;
1717 SMSFolder=GST_OUTBOX;
1719 input_len = GSM_MAX_SMS_LENGTH;
1726 while ((i = getopt_long(argc, argv, "risal:C:F:", options, NULL)) != -1) {
1729 case '1': /* SMSC number */
1731 strcpy(SMSCNumber,optarg);
1734 case '2': /* SMSC number index in phone memory */
1735 SMSCenter = atoi(optarg);
1737 if (SMSCenter < 1 || SMSCenter > 5) {
1738 fprintf(stderr, _("Incorrect SMSC number with \"smscno\" option (can't be <1 and >5) !\n"));
1744 case '3': /* we send long message */
1745 SMSUDHType=GSM_ConcatenatedMessages;
1746 input_len = atoi(optarg);
1747 if (input_len > GSM_MAX_CONCATENATED_SMS_LENGTH) {
1748 fprintf(stderr, _("Input too long, max %i!\n"),GSM_MAX_CONCATENATED_SMS_LENGTH);
1753 case '4': /* SMS enables voice indicator */
1754 SMSUDHType=GSM_EnableVoice; break;
1756 case '5': /* SMS disables voice indicator */
1757 SMSUDHType=GSM_DisableVoice; break;
1759 case '6': /* SMS enables email indicator */
1760 SMSUDHType=GSM_EnableEmail; break;
1762 case '7': /* SMS disables email indicator */
1763 SMSUDHType=GSM_DisableEmail; break;
1765 case '8': /* SMS enables fax indicator */
1766 SMSUDHType=GSM_EnableFax; break;
1768 case '9': /* SMS disables fax indicator */
1769 SMSUDHType=GSM_DisableFax; break;
1771 case '-': /* SMS coding type */
1772 SMSCoding=GSM_Coding_Unicode; break;
1774 case '+': /* SMS ghost */
1775 SMSUDHType=GSM_VoidSMS; break;
1777 case '(': /* SMS hanging phone, when saved to Outbox */
1778 SMSUDHType=GSM_HangSMS; break;
1780 case ')': /* SMS showed incorrectly in phone */
1781 SMSUDHType=GSM_BugSMS; break;
1783 case 'r': /* mark as read */
1784 SMSStatus = GSS_SENTREAD; break;
1786 case 'i': /* Save into Inbox */
1787 SMSFolder = GST_INBOX; break;
1789 case 's': /* Set replying via the same SMSC */
1790 SMSReply = true; break;
1792 case 'a': /* Ask before overwriting */
1793 interactive=true;break;
1795 case 'l': /* Specify location */
1796 SMSLocation = atoi(optarg); break;
1798 case '/': /* Name */
1799 strncpy(SMSName,optarg,25);break;
1801 case 'C': /* class Message */
1803 if (SMSUDHType!=GSM_NoUDH) {
1804 fprintf(stderr, _("Can't specify SMS Class with --enablevoice, --disablevoice, --enableemail, --disableemail, --enablefax, --disablefax options !\n"));
1809 case '0': SMSClass = 0; break;
1810 case '1': SMSClass = 1; break;
1811 case '2': SMSClass = 2; break;
1812 case '3': SMSClass = 3; break;
1814 fprintf(stderr, _("SMS Class (\"C\" option) can be 0, 1, 2 or 3 only !\n"));
1819 case 'F': /* save into folder n */
1820 SMSFolder = atoi(optarg);
1824 fprintf(stderr,_("Unknown option number %i\n"),argc);
1830 /* Get message text from stdin. */
1831 chars_read = fread(message_buffer, 1, input_len, stdin);
1833 if (chars_read == 0) {
1834 fprintf(stderr, _("Couldn't read from stdin!\n"));
1837 if (chars_read > input_len) {
1838 fprintf(stderr, _("Input too long!\n"));
1842 /* Null terminate. */
1843 message_buffer[chars_read] = 0x00;
1845 GSM_MakeMultiPartSMS2(&MultiSMS,message_buffer,chars_read,SMSUDHType,SMSCoding);
1846 msgnum=MultiSMS.number;
1848 switch (SMSUDHType) {
1853 case GSM_EnableVoice:
1854 case GSM_DisableVoice:
1856 case GSM_DisableFax:
1857 case GSM_EnableEmail:
1858 case GSM_DisableEmail:
1859 fprintf(stdout,_("Warning: saving %i chars\n"),strlen(MultiSMS.SMS[0].MessageText));
1866 for (i=0;i<msgnum;i++) {
1867 MultiSMS.SMS[i].Destination[0]=0;
1868 if (argc!=0) strcpy(MultiSMS.SMS[i].Destination,argv[0]);
1870 MultiSMS.SMS[i].Location=0;
1871 MultiSMS.SMS[i].Class=SMSClass;
1872 MultiSMS.SMS[i].MessageCenter.No=SMSCenter;
1873 strcpy(MultiSMS.SMS[i].MessageCenter.Number,SMSCNumber);
1874 MultiSMS.SMS[i].Status=SMSStatus;
1875 strcpy(MultiSMS.SMS[i].Name,SMSName);
1876 MultiSMS.SMS[i].folder=SMSFolder;
1877 MultiSMS.SMS[i].ReplyViaSameSMSC=SMSReply;
1880 MultiSMS.SMS[0].Location=SMSLocation;
1882 /* Initialise the GSM interface. */
1885 MultiSMS.number=msgnum;
1886 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 0,0,NULL,interactive,false,false,false);
1891 /* Get SMSC number */
1893 int getsmsc(char *MessageCenterNumber)
1896 GSM_MessageCenter MessageCenter;
1898 MessageCenter.No=atoi(MessageCenterNumber);
1902 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
1904 fprintf(stdout, _("%d. SMS center ("),MessageCenter.No);
1906 if (!strcmp(MessageCenter.Name,""))
1907 fprintf(stdout,_("Set %d"),MessageCenter.No);
1908 else fprintf(stdout,_("%s"),MessageCenter.Name);
1910 fprintf(stdout,_(") number is "));
1912 if (!strcmp(MessageCenter.Number,"")) fprintf(stdout,_("not set\n"));
1913 else fprintf(stdout,_("%s\n"),MessageCenter.Number);
1915 fprintf(stdout,_("Default recipient number is "));
1917 if (!strcmp(MessageCenter.DefaultRecipient,""))
1918 fprintf(stdout,_("not set\n"));
1919 else fprintf(stdout,_("%s\n"),MessageCenter.DefaultRecipient);
1921 fprintf(stdout, _("Messages sent as "));
1923 switch (MessageCenter.Format) {
1924 case GSMF_Text :fprintf(stdout, _("Text"));break;
1925 case GSMF_Paging:fprintf(stdout, _("Paging"));break;
1926 case GSMF_Fax :fprintf(stdout, _("Fax"));break;
1928 case GSMF_UCI :fprintf(stdout, _("Email"));break;
1929 case GSMF_ERMES :fprintf(stdout, _("ERMES"));break;
1930 case GSMF_X400 :fprintf(stdout, _("X.400"));break;
1931 default :fprintf(stdout, _("Unknown"));
1936 fprintf(stdout, _("Message validity is "));
1938 switch (MessageCenter.Validity) {
1939 case GSMV_1_Hour :fprintf(stdout, _("1 hour"));break;
1940 case GSMV_6_Hours :fprintf(stdout, _("6 hours"));break;
1941 case GSMV_24_Hours:fprintf(stdout, _("24 hours"));break;
1942 case GSMV_72_Hours:fprintf(stdout, _("72 hours"));break;
1943 case GSMV_1_Week :fprintf(stdout, _("1 week"));break;
1944 case GSMV_Max_Time:fprintf(stdout, _("Maximum time"));break;
1945 default :fprintf(stdout, _("Unknown"));
1948 fprintf(stdout, "\n");
1952 fprintf(stdout, _("SMS center can not be found :-(\n"));
1959 /* Get SMS messages. */
1960 int getsms(int argc, char *argv[])
1963 GSM_SMSMessage message;
1964 GSM_WAPBookmark bookmark;
1965 char memory_type_string[20];
1966 int start_message, end_message, count, mode = 1;
1970 GSM_Ringtone ringtone;
1971 GSM_SMSFolders folders;
1973 int confirm = -1, i;
1976 /* Handle command line args that set type, start and end locations. */
1977 if (!GetMemoryTypeID(argv[2], &message.MemoryType))
1979 fprintf(stderr, _("Unknown memory type %s!\n"), argv[2]);
1982 GetMemoryTypeString(memory_type_string, &message.MemoryType);
1984 for (i=0;i<64;i++) filename[i]=0;
1986 start_message = atoi(argv[3]);
1990 /* [end] can be only argv[4] */
1991 if (argv[4][0] == '-') {
1992 end_message = start_message;
1994 end_message = atoi(argv[4]);
1997 /* parse all options (beginning with '-' */
1998 while ((i = getopt(argc, argv, "f:")) != -1) {
2003 fprintf(stderr, _("Saving into file \"%s\"\n"), optarg);
2005 strncpy(filename, optarg, 64);
2006 if (strlen(optarg) > 63) {
2007 fprintf(stderr, _("Filename too long - will be truncated to 63 characters.\n"));
2010 filename[strlen(optarg)] = 0;
2023 end_message = start_message;
2026 /* Initialise the code for the GSM interface. */
2030 GSM->GetSMSFolders(&folders);
2033 /* Now retrieve the requested entries. */
2035 for (count = start_message; count <= end_message; count ++) {
2037 message.Location = count;
2039 error = GSM->GetSMSMessage(&message);
2045 switch (message.Type) {
2049 /* RTH FIXME: Test that out ! */
2050 fprintf(stdout, _("%d. Delivery Report "), message.MessageNumber);
2051 switch (message.Status)
2054 if (message.folder==0) //GST_INBOX
2055 fprintf(stdout, _("(read)\n"));
2057 fprintf(stdout, _("(sent)\n"));
2059 case GSS_NOTSENTREAD:
2060 if (message.folder==0) //GST_INBOX
2061 fprintf(stdout, _("(unread)\n"));
2063 fprintf(stdout, _("(not sent)\n"));
2066 fprintf(stdout, _("(not known :-()\n"));
2069 fprintf(stdout, _("(template)\n"));
2072 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2076 fprintf(stdout, _("Sending date/time : %s %02d/%02d/%02d %d:%02d:%02d "), \
2077 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2078 message.Time.Day, message.Time.Month, message.Time.Year, \
2079 message.Time.Hour, message.Time.Minute, message.Time.Second);
2081 if (message.Time.Timezone) {
2082 if (message.Time.Timezone > 0)
2083 fprintf(stdout,_("+%02d00"), message.Time.Timezone);
2085 fprintf(stdout,_("%02d00"), message.Time.Timezone);
2088 fprintf(stdout, "\n");
2090 fprintf(stdout, _("Response date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2091 DayOfWeek(message.SMSCTime.Year, message.SMSCTime.Month, message.SMSCTime.Day), \
2092 message.SMSCTime.Day, message.SMSCTime.Month, message.SMSCTime.Year, \
2093 message.SMSCTime.Hour, message.SMSCTime.Minute, message.SMSCTime.Second);
2095 if (message.SMSCTime.Timezone) {
2096 if (message.SMSCTime.Timezone > 0)
2097 fprintf(stdout,_("+%02d00"),message.SMSCTime.Timezone);
2099 fprintf(stdout,_("%02d00"),message.SMSCTime.Timezone);
2102 fprintf(stdout, "\n");
2104 fprintf(stdout, _("Receiver: %s Msg Center: %s\n"), message.Sender, message.MessageCenter.Number);
2105 fprintf(stdout, _("Text: %s\n\n"), message.MessageText);
2110 fprintf(stdout, _("%d. %s Message "), message.MessageNumber,
2111 folders.Folder[message.folder].Name);
2113 switch (message.Status)
2116 if (message.folder==0) //GST_INBOX
2117 fprintf(stdout, _("(read)\n"));
2119 fprintf(stdout, _("(sent)\n"));
2121 case GSS_NOTSENTREAD:
2122 if (message.folder==0) //GST_INBOX
2123 fprintf(stdout, _("(unread)\n"));
2125 fprintf(stdout, _("(not sent)\n"));
2128 fprintf(stdout, _("(not known :-()\n"));
2131 fprintf(stdout, _("(template)\n"));
2134 fprintf(stdout, _("(unknown: %d)\n"),message.Status);
2138 /* RTH FIXME: date for other status ok ? */
2139 if (message.SMSData) {
2141 fprintf(stdout, _("Date/time: %s %02d/%02d/%02d %d:%02d:%02d "), \
2142 DayOfWeek(message.Time.Year, message.Time.Month, message.Time.Day), \
2143 message.Time.Day, message.Time.Month, message.Time.Year, \
2144 message.Time.Hour, message.Time.Minute, message.Time.Second);
2146 if (message.Time.Timezone) {
2147 if (message.Time.Timezone > 0)
2148 fprintf(stdout,_("+%02d00"),message.Time.Timezone);
2150 fprintf(stdout,_("%02d00"),message.Time.Timezone);
2153 fprintf(stdout, "\n");
2155 fprintf(stdout, _("Msg Center: %s "), message.MessageCenter.Number);
2157 if (message.ReplyViaSameSMSC)
2158 fprintf(stdout, _("(centre set for reply) "));
2161 if (strcmp(message.Sender,"")) {
2162 if (message.folder==1) { //GST_OUTBOX
2163 fprintf(stdout, _("Recipient: %s"),message.Sender);
2165 fprintf(stdout, _("Sender: %s"),message.Sender);
2169 if (strcmp(message.Sender,"") || message.folder==0)
2170 fprintf(stdout, "\n");
2172 switch (message.UDHType) {
2176 /* put bitmap into bitmap structure */
2177 switch (GSM_ReadBitmap(&message, &bitmap)) {
2178 case GE_INVALIDIMAGESIZE:
2179 fprintf(stdout,_("Image size not supported\n"));
2182 fprintf(stdout, _("GSM operator logo for %s (%s) network.\n"), bitmap.netcode, GSM_GetNetworkName(bitmap.netcode));
2184 GSM_PrintBitmap(&bitmap);
2186 if (filename[0]!=0) {
2187 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2192 fprintf(stdout,_("Error reading image\n"));
2197 if (message.folder==0) { //GST_INBOX
2198 if (!strcmp(message.Sender, "+998000005") &&
2199 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2200 message.Time.Day==27 &&
2201 message.Time.Month==7 &&
2202 message.Time.Year==99 &&
2203 message.Time.Hour==0 &&
2204 message.Time.Minute==10 &&
2205 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2207 /* Is it changed in next versions ? Or what ? */
2208 if (!strcmp(message.Sender, "+998000002") ||
2209 !strcmp(message.Sender, "+998000003") ||
2210 !strcmp(message.Sender, "+998000004")) fprintf(stdout, _("Saved by Operator Logo Uploader by Thomas Kessler\n"));
2212 if (!strcmp(message.Sender, "+8861234567890") &&
2213 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2215 if (!strncmp(message.Sender, "OpLogo",6) &&
2216 strlen(message.Sender)==11)
2217 fprintf(stdout, _("Saved by gnokii\n"));
2222 case GSM_WAPBookmarkUDH:
2224 /* put bookmark into bookmark structure */
2225 switch (GSM_ReadWAPBookmark(&message, &bookmark)) {
2227 fprintf(stdout, ("WAP Bookmark\n"));
2229 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
2231 if (bookmark.title[0]==0)
2232 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
2234 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
2238 fprintf(stdout,_("Error reading WAP Bookmark\n"));
2243 if (!strcmp(message.Sender, "WAPBookmark"))
2244 fprintf(stdout, _("Saved by gnokii\n"));
2249 case GSM_CallerIDLogo:
2251 /* put bitmap into bitmap structure */
2252 switch (GSM_ReadBitmap(&message, &bitmap)) {
2253 case GE_INVALIDIMAGESIZE:
2254 fprintf(stdout,_("Image size not supported\n"));
2257 fprintf(stdout, ("Caller Logo\n"));
2259 GSM_PrintBitmap(&bitmap);
2261 if (filename[0]!=0) {
2262 GSM_SaveBitmapFileOnConsole(filename, &bitmap);
2267 fprintf(stdout,_("Error reading image\n"));
2272 if (message.folder==0) { //GST_INBOX
2273 if (!strcmp(message.Sender, "+998000005") &&
2274 !strcmp(message.MessageCenter.Number, "+886935074443") &&
2275 message.Time.Day==27 &&
2276 message.Time.Month==7 &&
2277 message.Time.Year==99 &&
2278 message.Time.Hour==0 &&
2279 message.Time.Minute==10 &&
2280 message.Time.Second==48) fprintf(stdout, _("Saved by Logo Express\n"));
2282 if (!strcmp(message.Sender, "+8861234567890") &&
2283 !strcmp(message.MessageCenter.Number, "+886935074443")) fprintf(stdout, _("Saved by Logo Express\n"));
2285 if (!strcmp(message.Sender, "GroupLogo"))
2286 fprintf(stdout, _("Saved by gnokii\n"));
2291 case GSM_ProfileUDH:
2292 fprintf(stdout, ("Profile SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2295 case GSM_WAPBookmarkUDHLong:
2296 fprintf(stdout, ("WAP Bookmark, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2299 case GSM_WAPSettingsUDH:
2300 fprintf(stdout, ("WAP Settings, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2303 case GSM_RingtoneUDH:
2305 /* put ringtone into ringtone structure */
2306 switch (GSM_ReadRingtone(&message, &ringtone)) {
2309 fprintf(stdout, ("Ringtone \"%s\"\n"),ringtone.name);
2311 while (confirm < 0) {
2312 fprintf(stderr, _("Do you want to play it ? (yes/no) "));
2313 GetLine(stdin, ans, 7);
2314 if (!strcmp(ans, "yes")) confirm = 1;
2315 if (!strcmp(ans, "no")) confirm = 0;
2318 if (confirm==1) GSM_PlayRingtoneOnConsole(&ringtone);
2320 if (filename[0]!=0) GSM_SaveRingtoneFileOnConsole(filename, &ringtone);
2325 fprintf(stdout,_("Gnokii can't read this ringtone - there is probably error inside\n"));
2331 case GSM_CalendarNoteUDH:
2332 fprintf(stdout, ("Calendar note SMS, part %i/%i\n"),message.UDH[11],message.UDH[10]);
2333 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2334 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2337 case GSM_ConcatenatedMessages:
2338 fprintf(stdout, _("Linked (%d/%d)\nText:\n%s\n\n"),message.UDH[5],message.UDH[4], message.MessageText);
2339 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2342 case GSM_EnableVoice:
2343 fprintf(stdout, _("Enables voice indicator\nText:\n%s\n\n"), message.MessageText);
2344 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2347 case GSM_DisableVoice:
2348 fprintf(stdout, _("Disables voice indicator\nText:\n%s\n\n"), message.MessageText);
2349 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2353 fprintf(stdout, _("Enables fax indicator\nText:\n%s\n\n"), message.MessageText);
2354 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2357 case GSM_DisableFax:
2358 fprintf(stdout, _("Disables fax indicator\nText:\n%s\n\n"), message.MessageText);
2359 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2362 case GSM_EnableEmail:
2363 fprintf(stdout, _("Enables email indicator\nText:\n%s\n\n"), message.MessageText);
2364 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2367 case GSM_DisableEmail:
2368 fprintf(stdout, _("Disables email indicator\nText:\n%s\n\n"), message.MessageText);
2369 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2373 fprintf(stdout, _("Void SMS\nText:\n%s\n\n"), message.MessageText);
2374 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2378 if (message.Coding!=GSM_Coding_8bit) {
2379 fprintf(stdout, _("Text:\n%s\n\n"), message.MessageText);
2380 if (filename[0]!=0 && mode != -1) mode = GSM_SaveTextFileOnConsole(filename, message.MessageText, mode);
2382 fprintf(stdout, _("Message cannot be displayed here\n")); // like in phone :-)
2386 default: //GSM_UnknownUDH and other
2387 fprintf(stderr, _("Unknown\n"));
2393 fprintf(stdout,_("Unknown SMS type. Report it\n"));
2399 case GE_NOTIMPLEMENTED:
2401 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2405 case GE_INVALIDSMSLOCATION:
2407 fprintf(stderr, _("Invalid location: %s %d\n"), memory_type_string, count);
2411 case GE_EMPTYSMSLOCATION:
2413 fprintf(stderr, _("SMS location %s %d empty.\n"), memory_type_string, count);
2419 fprintf(stderr, _("No access to %s memory.\n"), memory_type_string);
2425 fprintf(stderr, _("GetSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2434 int getsmsstatus(int argc, char *argv[])
2436 GSM_SMSStatus SMSStatus;
2437 GSM_SMSFolders folders;
2443 /* Initialise the code for the GSM interface. */
2446 error = GSM->GetSMSStatus(&SMSStatus);
2447 if (error!=GE_NONE) return error;
2449 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"),SMSStatus.UnRead, SMSStatus.Number);
2451 error=GSM->GetSMSFolders(&folders);
2452 if (error!=GE_NONE) return error;
2454 /* For not 7110 compatible phones we have to read all SMS and prepare sms table */
2455 if( GetModelFeature (FN_SMS)!=F_SMS71 )
2459 if (j==SMSStatus.Number) break;
2461 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
2462 SMSStatus.foldertable[j].smsnum=i;
2464 /* We set such folders ID like in 7110 compatible phones */
2465 if (SMS.Status==GSS_NOTSENTREAD && SMS.folder==0) //GST_INBOX
2466 SMSStatus.foldertable[j].folder=0;
2468 switch (SMS.folder) {
2470 SMSStatus.foldertable[j].folder=GST_7110_INBOX;
2473 SMSStatus.foldertable[j].folder=GST_7110_OUTBOX;
2483 printf("0.Unread : ");
2484 for(j=0; j<SMSStatus.Number; j++)
2486 if (SMSStatus.foldertable[j].folder == 0)
2487 printf("%d ",SMSStatus.foldertable[j].smsnum);
2491 for (i=0;i<folders.number;i++) {
2492 fprintf(stdout,_("%d.%-15s: "),i+1,folders.Folder[i].Name);
2493 for(j=0; j<SMSStatus.Number; j++)
2495 if ( SMSStatus.foldertable[j].folder / 8 == i+1)
2496 printf("%d ",SMSStatus.foldertable[j].smsnum);
2506 /* Delete SMS messages. */
2507 int deletesms(int argc, char *argv[])
2510 GSM_SMSMessage message;
2511 char memory_type_string[20];
2512 int start_message, end_message, count;
2515 /* Handle command line args that set type, start and end locations. */
2516 if (!GetMemoryTypeID(argv[0], &message.MemoryType))
2518 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
2521 GetMemoryTypeString(memory_type_string, &message.MemoryType);
2523 start_message = atoi (argv[1]);
2524 if (argc > 2) end_message = atoi (argv[2]);
2525 else end_message = start_message;
2527 /* Initialise the code for the GSM interface. */
2531 /* Now delete the requested entries. */
2533 for (count = start_message; count <= end_message; count ++) {
2535 message.Location = count;
2537 error = GSM->DeleteSMSMessage(&message);
2539 if (error == GE_NONE)
2540 fprintf(stdout, _("Deleted SMS %s %d\n"), memory_type_string, count);
2542 if (error == GE_NOTIMPLEMENTED) {
2543 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
2547 fprintf(stdout, _("DeleteSMS %s %d failed!(%d)\n\n"), memory_type_string, count, error);
2556 static volatile bool bshutdown = false;
2558 /* SIGINT signal handler. */
2560 static void interrupted(int sig)
2563 signal(sig, SIG_IGN);
2570 /* In this mode we get the code from the keyboard and send it to the mobile
2573 int entersecuritycode(char *type)
2576 GSM_SecurityCode SecurityCode;
2578 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2579 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2580 else if (!strcmp(type,"PIN2"))SecurityCode.Type=GSCT_Pin2;
2581 else if (!strcmp(type,"PUK2"))SecurityCode.Type=GSCT_Puk2;
2583 // FIXME: Entering of SecurityCode does not work :-(
2584 // else if (!strcmp(type,"SecurityCode"))
2585 // SecurityCode.Type=GSCT_SecurityCode;
2588 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2593 printf("Enter your code: ");
2594 gets(SecurityCode.Code);
2596 strcpy(SecurityCode.Code,getpass(_("Enter your code: ")));
2601 test = GSM->EnterSecurityCode(SecurityCode);
2603 fprintf(stdout,_("Code OK !\n"));
2605 fprintf(stderr,_("%s\n"),print_error(test));
2612 int getsecuritycodestatus(void)
2619 if (GSM->GetSecurityCodeStatus(&Status) == GE_NONE) {
2621 fprintf(stdout, _("Security code status: "));
2624 case GSCT_SecurityCode:fprintf(stdout, _("waiting for Security Code.\n"));break;
2625 case GSCT_Pin: fprintf(stdout, _("waiting for PIN.\n")); break;
2626 case GSCT_Pin2: fprintf(stdout, _("waiting for PIN2.\n")); break;
2627 case GSCT_Puk: fprintf(stdout, _("waiting for PUK.\n")); break;
2628 case GSCT_Puk2: fprintf(stdout, _("waiting for PUK2.\n")); break;
2629 case GSCT_None: fprintf(stdout, _("nothing to enter.\n")); break;
2630 default: fprintf(stdout, _("Unknown!\n"));
2639 int getsecuritycode(char *type)
2642 GSM_SecurityCode SecurityCode;
2645 if (!strcmp(type,"PIN")) SecurityCode.Type=GSCT_Pin;
2646 else if (!strcmp(type,"PUK")) SecurityCode.Type=GSCT_Puk;
2647 else if (!strcmp(type,"PIN2")) SecurityCode.Type=GSCT_Pin2;
2648 else if (!strcmp(type,"PUK2")) SecurityCode.Type=GSCT_Puk2;
2649 else if (!strcmp(type,"SecurityCode"))SecurityCode.Type=GSCT_SecurityCode;
2651 fprintf(stdout, _("Wrong code in second parameter (allowed: PIN,PUK,PIN2,PUK2,SecurityCode)\n"));
2657 error=GSM->GetSecurityCode(&SecurityCode);
2660 case GE_INVALIDSECURITYCODE:
2661 fprintf(stdout, _("Error: getting "));
2662 switch (SecurityCode.Type) {
2663 case GSCT_SecurityCode:fprintf(stdout, _("security code"));break;
2664 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2665 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2666 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2667 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2670 fprintf(stdout, _(" not allowed\n"));
2673 switch (SecurityCode.Type) {
2674 case GSCT_SecurityCode:fprintf(stdout, _("Security code"));break;
2675 case GSCT_Pin :fprintf(stdout, _("PIN"));break;
2676 case GSCT_Pin2:fprintf(stdout, _("PIN2"));break;
2677 case GSCT_Puk :fprintf(stdout, _("PUK"));break;
2678 case GSCT_Puk2:fprintf(stdout, _("PUK2"));break;
2681 fprintf(stdout, _(" is %s\n"),SecurityCode.Code);
2684 fprintf(stderr, _("%s\n"),print_error(error));
2695 /* Voice dialing mode. */
2697 int dialvoice(char *Number)
2701 if (GSM->DialVoice(Number)!=GE_NONE) fprintf(stdout,_("Error!\n"));
2709 int cancelcall(void)
2713 if (GSM->CancelCall()!=GE_NONE) fprintf(stdout,_("Error!\n"));
2720 int savelogo(int argc, char *argv[])
2723 GSM_NetworkInfo NetworkInfo;
2724 GSM_MultiSMSMessage MultiSMS;
2726 /* Operator logos will be saved with this number */
2727 char oplogonumber[]={'O','p','L','o','g','o',
2728 '0','0','0','0','0', /* MMC+MNC */
2732 bool UnicodeText=false;
2734 /* The first argument is the type of the logo. */
2735 if (!strcmp(argv[0], "op")) {
2736 fprintf(stdout, _("Saving operator logo.\n"));
2737 } else if (!strcmp(argv[0], "caller")) {
2738 fprintf(stdout, _("Saving caller line identification logo.\n"));
2739 } else if (!strcmp(argv[0], "startup")) {
2740 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2742 } else if (!strcmp(argv[0], "7110startup")) {
2743 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2745 } else if (!strcmp(argv[0], "6210startup")) {
2746 fprintf(stderr, _("It isn't possible to save startup logo!\n"));
2748 } else if (!strcmp(argv[0], "7110op")) {
2749 fprintf(stderr, _("It isn't possible to save big operator logos!\n"));
2751 } else if (!strcmp(argv[0], "picture")) {
2752 fprintf(stderr, _("Saving picture image.\n"));
2753 } else if (!strcmp(argv[0], "screensaver")) {
2754 fprintf(stderr, _("Saving screen saver.\n"));
2756 fprintf(stderr, _("You should specify what kind of logo to save!\n"));
2760 /* The second argument is the bitmap file. */
2761 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return -1;
2763 /* Initialise the GSM interface. */
2766 /* We check optional parameters from 2'rd */
2769 if (!strcmp(argv[0], "op")) {
2770 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2772 /* The third argument, if present, is the Network code of the operator.
2773 * Network code is in this format: "xxx yy" */
2775 strcpy(bitmap.netcode, argv[2]);
2777 fprintf(stdout, _("Operator code: %s\n"), argv[2]);
2779 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
2780 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
2787 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
2789 bitmap.type=GSM_OperatorLogo;
2791 /* Put bitmap into SMS structure */
2792 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2794 oplogonumber[6]=bitmap.netcode[0];
2795 oplogonumber[7]=bitmap.netcode[1];
2796 oplogonumber[8]=bitmap.netcode[2];
2797 oplogonumber[9]=bitmap.netcode[4];
2798 oplogonumber[10]=bitmap.netcode[5];
2799 for(i=0;i<MultiSMS.number;i++)
2800 strcpy(MultiSMS.SMS[i].Destination,oplogonumber);
2802 if (!strcmp(argv[0], "caller")) {
2803 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2805 bitmap.type=GSM_CallerLogo;
2807 /* Put bitmap into SMS structure */
2808 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,false);
2810 for(i=0;i<MultiSMS.number;i++)
2811 strcpy(MultiSMS.SMS[i].Destination,"GroupLogo");
2813 if (!strcmp(argv[0], "screensaver")) {
2814 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2819 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2821 /* Put bitmap into SMS structure */
2822 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,true,UnicodeText);
2824 for(i=0;i<MultiSMS.number;i++)
2825 strcpy(MultiSMS.SMS[i].Destination,"ScreenSaver");
2827 if (!strcmp(argv[0], "picture")) {
2828 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2831 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2836 if (strlen(argv[2])>121) {
2837 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[2]);
2840 strcpy(bitmap.text,argv[2]);
2843 /* Put bitmap into SMS structure */
2844 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,false,UnicodeText);
2846 for(i=0;i<MultiSMS.number;i++)
2847 strcpy(MultiSMS.SMS[i].Destination,"Picture");
2850 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,true,false,false);
2855 /* The following function allows to send logos using SMS */
2856 int sendlogo(int argc, char *argv[])
2859 GSM_NetworkInfo NetworkInfo;
2860 GSM_MultiSMSMessage MultiSMS;
2864 bool UnicodeText=false;
2865 bool ScreenSaver=false;
2867 /* The first argument is the type of the logo. */
2868 if (!strcmp(argv[0], "op")) {
2869 fprintf(stdout, _("Sending operator logo.\n"));
2870 } else if (!strcmp(argv[0], "caller")) {
2871 fprintf(stdout, _("Sending caller line identification logo.\n"));
2872 } else if (!strcmp(argv[0], "picture")) {
2873 fprintf(stdout, _("Sending picture image.\n"));
2874 } else if (!strcmp(argv[0], "screensaver")) {
2875 fprintf(stdout, _("Sending screen saver.\n"));
2876 } else if (!strcmp(argv[0], "startup")) {
2877 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
2879 } else if (!strcmp(argv[0], "7110startup")) {
2880 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
2882 } else if (!strcmp(argv[0], "6210startup")) {
2883 fprintf(stderr, _("It isn't possible to send startup logo!\n"));
2885 } else if (!strcmp(argv[0], "7110op")) {
2886 fprintf(stderr, _("It isn't possible to send big operator logos!\n"));
2889 fprintf(stderr, _("You should specify what kind of logo to send!\n"));
2893 /* The third argument is the bitmap file. */
2894 if (GSM_ReadBitmapFileOnConsole(argv[2], &bitmap)!=GE_NONE) return -1;
2896 /* Initialise the GSM interface. */
2901 if (!strcmp(argv[0], "op")) {
2902 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2904 /* The third argument, if present, is the Network code of the operator.
2905 * Network code is in this format: "xxx yy" */
2907 strcpy(bitmap.netcode, argv[3]);
2909 fprintf(stdout, _("Operator code: %s\n"), argv[3]);
2911 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown")) {
2912 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
2919 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
2921 bitmap.type=GSM_OperatorLogo;
2923 if (!strcmp(argv[0], "caller")) {
2924 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
2926 bitmap.type=GSM_CallerLogo;
2928 if (!strcmp(argv[0], "screensaver")) {
2929 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2934 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2938 if (!strcmp(argv[0], "picture")) {
2939 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
2942 if (!strcmp(argv[i],"--unicode")) UnicodeText=true;
2947 if (strlen(argv[3])>121) {
2948 fprintf(stdout,_("Sorry: length of text (parameter \"%s\") can be 121 chars or shorter only !\n"),argv[3]);
2951 strcpy(bitmap.text,argv[3]);
2955 /* Put bitmap into SMS structure */
2956 GSM_SaveBitmapToSMS(&MultiSMS,&bitmap,ScreenSaver,UnicodeText);
2958 /* The second argument is the destination, ie the phone number of recipient. */
2959 for(i=0;i<MultiSMS.number;i++)
2960 strcpy(MultiSMS.SMS[i].Destination,argv[1]);
2962 GSM_SendMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,true,false,false);
2967 /* Getting logos. */
2969 int getlogo(int argc, char *argv[])
2975 bitmap.type=GSM_None;
2977 if (!strcmp(argv[0],"7110op"))
2978 bitmap.type=GSM_7110OperatorLogo;
2980 if (!strcmp(argv[0],"op"))
2981 bitmap.type=GSM_OperatorLogo;
2983 if (!strcmp(argv[0],"caller")) {
2984 /* There is caller group number missing in argument list. */
2987 if ((num<1)||(num>9)) num=1;
2994 bitmap.type=GSM_CallerLogo;
2997 if (!strcmp(argv[0],"picture")) {
2998 /* There is a number missing in argument list. */
3000 if (strlen(argv[2])==2) {
3001 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3012 bitmap.type=GSM_PictureImage;
3015 if (!strcmp(argv[0],"startup"))
3016 bitmap.type=GSM_StartupLogo;
3018 if (!strcmp(argv[0],"7110startup"))
3019 bitmap.type=GSM_7110StartupLogo;
3021 if (!strcmp(argv[0],"6210startup"))
3022 bitmap.type=GSM_6210StartupLogo;
3024 if (!strcmp(argv[0],"dealer"))
3025 bitmap.type=GSM_DealerNoteText;
3027 if (!strcmp(argv[0],"text"))
3028 bitmap.type=GSM_WelcomeNoteText;
3030 if (bitmap.type!=GSM_None) {
3034 fprintf(stdout, _("Getting Logo\n"));
3036 error=GSM->GetBitmap(&bitmap);
3043 if (bitmap.type==GSM_DealerNoteText) fprintf(stdout, _("Dealer welcome note "));
3044 if (bitmap.type==GSM_WelcomeNoteText) fprintf(stdout, _("Welcome note "));
3045 if (bitmap.type==GSM_DealerNoteText || bitmap.type==GSM_WelcomeNoteText)
3047 if (bitmap.text[0]!=0)
3049 fprintf(stdout, _("currently set to \"%s\"\n"), bitmap.text);
3051 fprintf(stdout, _("currently empty\n"));
3055 if (bitmap.width!=0)
3057 if (bitmap.type==GSM_OperatorLogo || bitmap.type==GSM_7110OperatorLogo)
3059 fprintf(stdout,"Operator logo for %s (%s) network got succesfully\n",bitmap.netcode,GSM_GetNetworkName(bitmap.netcode));
3061 if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_7110StartupLogo || bitmap.type==GSM_6210StartupLogo)
3063 fprintf(stdout,"Startup logo got successfully\n");
3065 if (bitmap.type==GSM_CallerLogo)
3067 fprintf(stdout,"Caller logo got successfully\n");
3069 if (bitmap.type==GSM_PictureImage)
3071 fprintf(stdout,"Picture Image got successfully");
3072 if (strcmp(bitmap.text,""))
3073 fprintf(stdout,_(", text \"%s\""),bitmap.text);
3074 if (strcmp(bitmap.Sender,""))
3075 fprintf(stdout,_(", sender \"%s\""),bitmap.Sender);
3076 fprintf(stdout,"\n");
3080 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
3084 fprintf(stdout,"Your phone doesn't have logo uploaded !\n");
3089 case GE_NOTIMPLEMENTED:
3090 fprintf(stderr, _("Function not implemented !\n"));
3092 case GE_NOTSUPPORTED:
3093 fprintf(stderr, _("This kind of logo is not supported !\n"));
3096 fprintf(stderr, _("Error getting logo (wrong location ?) !\n"));
3101 fprintf(stderr, _("What kind of logo do you want to get ?\n"));
3108 /* Setting logos. */
3110 int setlogo(int argc, char *argv[])
3113 GSM_Bitmap bitmap,oldbit;
3114 GSM_NetworkInfo NetworkInfo;
3125 if (!strcmp(argv[0],"text") || !strcmp(argv[0],"dealer"))
3127 if (!strcmp(argv[0],"text")) bitmap.type=GSM_WelcomeNoteText;
3128 else bitmap.type=GSM_DealerNoteText;
3129 bitmap.text[0]=0x00;
3130 if (argc>1) strncpy(bitmap.text,argv[1],255);
3133 if (!strcmp(argv[0],"op") || !strcmp(argv[0],"startup") || !strcmp(argv[0],"caller") ||
3134 !strcmp(argv[0],"7110op") || !strcmp(argv[0],"6210startup") || !strcmp(argv[0],"7110startup") ||
3135 !strcmp(argv[0],"picture"))
3139 if (!strcmp(argv[0],"startup"))
3141 bitmap.type=GSM_StartupLogo;
3144 bitmap.size=bitmap.width*bitmap.height/8;
3146 if (num>=1 && num<=3) {
3149 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3154 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
3157 if (GSM_ReadBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) {
3162 if (!strcmp(argv[0],"op"))
3164 if (bitmap.type!=GSM_OperatorLogo || argc<3)
3166 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3168 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
3171 strncpy(bitmap.netcode,argv[2],7);
3172 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3174 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3179 if (!strcmp(argv[0],"7110op"))
3181 if (bitmap.type!=GSM_7110OperatorLogo || argc<3)
3183 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
3185 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
3188 strncpy(bitmap.netcode,argv[2],7);
3189 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
3191 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
3196 if (!strcmp(argv[0],"picture"))
3198 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
3202 if (strlen(argv[2])==2) {
3203 num=(argv[2][0]-'0')*10+(argv[2][1]-'0');
3213 strncpy(bitmap.text,argv[3],121);
3214 strcpy(bitmap.Sender,"\0");
3216 strncpy(bitmap.Sender,argv[4],GSM_MAX_SENDER_LENGTH);
3218 if (!strcmp(argv[0],"7110startup"))
3220 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
3222 if (!strcmp(argv[0],"6210startup"))
3224 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
3226 if (!strcmp(argv[0],"caller"))
3228 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
3232 if ((num<0)||(num>9)) num=0;
3238 oldbit.type=GSM_CallerLogo;
3239 oldbit.number=bitmap.number;
3240 if (GSM->GetBitmap(&oldbit)==GE_NONE)
3242 /* We have to get the old name and ringtone!! */
3243 bitmap.ringtone=oldbit.ringtone;
3244 strncpy(bitmap.text,oldbit.text,255);
3246 if (argc>3) strncpy(bitmap.text,argv[3],255);
3248 fprintf(stdout, _("Setting Logo.\n"));
3251 /* FIX ME: is it possible to permanently remove op logo ? */
3252 if (!strcmp(argv[0],"op"))
3254 bitmap.type=GSM_OperatorLogo;
3255 strncpy(bitmap.netcode,"000 00",7);
3258 bitmap.size=bitmap.width*bitmap.height/8;
3259 GSM_ClearBitmap(&bitmap);
3261 if (!strcmp(argv[0],"7110op"))
3263 bitmap.type=GSM_7110OperatorLogo;
3264 strncpy(bitmap.netcode,"000 00",7);
3267 bitmap.size=(bitmap.width*bitmap.height + 7)/8;
3268 GSM_ClearBitmap(&bitmap);
3270 /* FIX ME: how to remove startup and group logos ? */
3271 fprintf(stdout, _("Removing Logo.\n"));
3275 fprintf(stderr, _("What kind of logo do you want to set ?\n"));
3281 while (GSM->GetModel(model) != GE_NONE)
3284 /* For Nokia 6110/6130/6150 we use different method of uploading.
3285 Phone will display menu, when received it */
3286 if (!strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") || !strcmp(model,"NSM-1"))
3288 if (!strcmp(argv[0],"caller") && argc<3)
3290 if (!strcmp(argv[0],"op") && argc<3)
3294 error=GSM->SetBitmap(&bitmap);
3298 case GE_NONE: oldbit.type=bitmap.type;
3299 oldbit.number=bitmap.number;
3300 if (GSM->GetBitmap(&oldbit)==GE_NONE) {
3301 if (bitmap.type==GSM_WelcomeNoteText ||
3302 bitmap.type==GSM_DealerNoteText) {
3303 if (strcmp(bitmap.text,oldbit.text)) {
3304 fprintf(stderr, _("Error setting"));
3305 if (bitmap.type==GSM_DealerNoteText) fprintf(stderr, _(" dealer"));
3306 fprintf(stderr, _(" welcome note - "));
3308 /* I know, it looks horrible, but... */
3309 /* I set it to the short string - if it won't be set */
3310 /* it means, PIN is required. If it will be correct, previous */
3311 /* (user) text was too long */
3313 /* Without it, I could have such thing: */
3314 /* user set text to very short string (for example, "Marcin") */
3315 /* then enable phone without PIN and try to set it to the very long (too long for phone) */
3316 /* string (which start with "Marcin"). If we compare them as only length different, we could think, */
3317 /* that phone accepts strings 6 chars length only (length of "Marcin") */
3318 /* When we make it correct, we don't have this mistake */
3320 strcpy(oldbit.text,"!\0");
3321 GSM->SetBitmap(&oldbit);
3322 GSM->GetBitmap(&oldbit);
3323 if (oldbit.text[0]!='!') {
3324 fprintf(stderr, _("SIM card and PIN is required\n"));
3326 GSM->SetBitmap(&bitmap);
3327 GSM->GetBitmap(&oldbit);
3328 fprintf(stderr, _("too long, truncated to \"%s\" (length %i)\n"),oldbit.text,strlen(oldbit.text));
3333 if (bitmap.type==GSM_StartupLogo) {
3334 for (i=0;i<oldbit.size;i++) {
3335 if (oldbit.bitmap[i]!=bitmap.bitmap[i]) {
3336 fprintf(stderr, _("Error setting startup logo - SIM card and PIN is required\n"));
3344 if (ok) fprintf(stdout, _("Done.\n"));
3346 case GE_NOTIMPLEMENTED:fprintf(stderr, _("Function not implemented.\n"));
3348 case GE_NOTSUPPORTED:fprintf(stderr, _("This kind of logo is not supported.\n"));
3350 default:fprintf(stderr, _("Error (wrong location ?) !\n"));
3359 /* Calendar notes receiving. */
3361 int getcalendarnote(int argc, char *argv[])
3363 GSM_CalendarNote CalendarNote;
3364 GSM_NotesInfo NotesInfo;
3370 bool was_note=false;
3371 char z_text[MAX_CALENDAR_TEXT_LENGTH+11];
3373 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
3381 now=localtime(&nowh);
3383 Date.Year = now->tm_year;
3385 /* I have 100 (for 2000) Year now :-) */
3386 if (Date.Year>99 && Date.Year<1900) {
3387 Date.Year=Date.Year+1900;
3390 start=atoi(argv[0]);
3395 if (!strcmp(argv[argc-1],"-v10")) {
3398 if (!strcmp(argv[argc-1],"-v30")) {
3407 if (!strcmp(argv[argc-1],"-v10")) {
3410 if (!strcmp(argv[argc-1],"-v30")) {
3422 while (GSM->GetModel(model) != GE_NONE)
3425 if (!strcmp(argv[0],"-s") || !strcmp(argv[0],"--short"))
3427 else if (!isdigit(argv[0][0])) {
3432 error=GSM->GetCalendarNotesInfo(&NotesInfo);
3433 if ( error == GE_NONE ) {
3434 if( NotesInfo.HowMany == 0 ) {
3435 fprintf(stderr, _("Sorry! No Calendar Notes present on phone.\n"));
3436 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3439 fprintf(stdout, _(" CALENDAR NOTES INFO \n"));
3440 fprintf(stdout, _("---------------------\n"));
3441 fprintf(stdout, _("How Many Locations :%d\n"), NotesInfo.HowMany);
3443 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3444 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3445 fprintf(stdout, _("Locations are :\n"));
3446 for(i=0;i<NotesInfo.HowMany;i++)
3447 fprintf(stdout, _("%4d) %4d\n"), i+1, NotesInfo.Location[i]);
3451 /* For 6210 (NPE-3) and 7110 (NSE-5), Locations have a different behaviour */
3452 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 ) {
3453 fprintf(stderr, _("Can't read Notes Infos from phone.\n"));
3454 start=0; stop=(-1); /* This for skipping next 'for' loop ;-> */
3458 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) {
3460 NotesInfo.HowMany=200;
3461 for (i=0;i<200;i++) {
3462 NotesInfo.Location[i]=i+1;
3466 if( vInfo && stop!=(-1) && error==GE_NONE )
3468 /* Info datas (for 7110 and comp.) */
3469 fprintf(stdout, _(" CALENDAR NOTES SUMMARY INFORMATION \n"));
3470 fprintf(stdout, _(" ==================================\n"));
3471 if (GetModelFeature (FN_CALENDAR)==F_CAL71) {
3472 fprintf(stdout, _("Calendar notes present on phone: %d\n"), NotesInfo.HowMany);
3473 fprintf(stdout, _("Locations are :\n"));
3475 fprintf(stdout, "----------------------------------------------------------------------------\n");
3476 fprintf(stdout,_(" Loc Phys Type Summary description Dt start Alarm Recurs\n") );
3477 fprintf(stdout, "----------------------------------------------------------------------------\n");
3479 for(i=0;i<NotesInfo.HowMany;i++)
3481 /* very short format ... */
3483 fprintf(stdout, _("%4d) %4d\n"), i, NotesInfo.Location[i]);
3485 CalendarNote.Location=i+1;
3486 CalendarNote.ReadNotesInfo=false;
3488 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3491 switch (CalendarNote.Type) {
3492 case GCN_REMINDER:strcpy(z_type, "REMIND"); break;
3493 case GCN_CALL: strcpy(z_type, "CALL"); break;
3494 case GCN_MEETING: strcpy(z_type, "MEETING"); break;
3495 case GCN_BIRTHDAY:strcpy(z_type, "BDAY"); break;
3496 default: strcpy(z_type, "UNKNOWN"); break;
3499 if( CalendarNote.Recurrance ) {
3500 sprintf( z_recur,"%d ", CalendarNote.Recurrance/24 );
3501 strcat( z_recur, CalendarNote.Recurrance == 1 ? "day" : "days" );
3504 strcpy( z_recur, "No" );
3508 if( CalendarNote.Type == GCN_CALL )
3509 sprintf(z_text, "\"%s\"", CalendarNote.Phone );
3511 if (CalendarNote.Text[0]!=0)
3512 sprintf(z_text, "\"%s\"", CalendarNote.Text );
3514 if(CalendarNote.Type == GCN_BIRTHDAY) {
3516 i_age = Date.Year - CalendarNote.Time.Year;
3517 sprintf(z_text, "\"%s (%d %s)\"", CalendarNote.Text,
3518 i_age, (i_age==1)?"year":"years");
3519 strcpy( z_recur, "-" );
3520 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3522 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3523 i+1,NotesInfo.Location[i], z_type, z_text,
3524 CalendarNote.Time.Year,
3525 CalendarNote.Time.Month,
3526 CalendarNote.Time.Day,
3527 (CalendarNote.AlarmType==0x00) ? "Tone " : "Silent",
3531 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3532 i+1,NotesInfo.Location[i], z_type, z_text,
3533 CalendarNote.Time.Year,
3534 CalendarNote.Time.Month,
3535 CalendarNote.Time.Day,
3536 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3539 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
3541 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s %s\n"),
3542 i+1,NotesInfo.Location[i], z_type, z_text,
3543 CalendarNote.Time.Year,
3544 CalendarNote.Time.Month,
3545 CalendarNote.Time.Day,
3546 (CalendarNote.Alarm.Year) ? "Yes" : "No ",
3550 _("%4d %4d %-7.7s %-32.32s %04d-%02d-%02d %s\n"),
3551 i+1,NotesInfo.Location[i], z_type, z_text,
3552 CalendarNote.Time.Year,
3553 CalendarNote.Time.Month,
3554 CalendarNote.Time.Day,
3555 (CalendarNote.Alarm.Year) ? "Yes" : "No ");
3557 if (GetModelFeature (FN_CALENDAR)!=F_CAL71) break;
3562 for (i=start;i<=stop;i++) {
3563 if (error==GE_NONE) {
3564 if( i>NotesInfo.HowMany ) {
3565 fprintf(stderr, _("Only %d Calendar Notes present on phone!\n"),NotesInfo.HowMany);
3569 fprintf(stderr, _("Calendar Notes location can't be zero... skipping.\n"));
3574 CalendarNote.Location=i;
3575 CalendarNote.ReadNotesInfo=false;
3577 if (GSM->GetCalendarNote(&CalendarNote) == GE_NONE) {
3581 fprintf(stdout, GSM_GetVCALENDARStart(vCalVer));
3585 fprintf(stdout, GSM_GetVCALENDARNote(&CalendarNote,vCalVer));
3587 } else { /* not vCal */
3590 fprintf(stdout, "\n");
3595 fprintf(stdout, _(" Type of the note: "));
3597 switch (CalendarNote.Type) {
3599 case GCN_REMINDER:fprintf(stdout, _("Reminder\n"));break;
3600 case GCN_CALL :fprintf(stdout, _("Call\n")); break;
3601 case GCN_MEETING :fprintf(stdout, _("Meeting\n")); break;
3602 case GCN_BIRTHDAY:fprintf(stdout, _("Birthday\n"));break;
3603 default: fprintf(stdout, _("Unknown\n"));
3607 /* For 3310: set date to 2090! */
3608 if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
3609 fprintf(stdout, _(" Date: xxxx-%02d-%02d\n"), CalendarNote.Time.Month,
3610 CalendarNote.Time.Day);
3612 fprintf(stdout, _(" Date: %s %d-%02d-%02d\n"),
3613 DayOfWeek(CalendarNote.Time.Year, CalendarNote.Time.Month, CalendarNote.Time.Day),
3614 CalendarNote.Time.Year,
3615 CalendarNote.Time.Month,
3616 CalendarNote.Time.Day);
3619 fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CalendarNote.Time.Hour,
3620 CalendarNote.Time.Minute,
3621 CalendarNote.Time.Second);
3623 if (CalendarNote.Alarm.Year!=0) {
3624 fprintf(stdout, _(" Alarm date: %s %d-%02d-%02d\n"),
3625 DayOfWeek(CalendarNote.Alarm.Year, CalendarNote.Alarm.Month, CalendarNote.Alarm.Day),
3626 CalendarNote.Alarm.Year,
3627 CalendarNote.Alarm.Month,
3628 CalendarNote.Alarm.Day);
3630 fprintf(stdout, _(" Alarm time: %02d:%02d:%02d\n"), CalendarNote.Alarm.Hour,
3631 CalendarNote.Alarm.Minute,
3632 CalendarNote.Alarm.Second);
3633 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 )
3634 fprintf(stdout, _(" Alarm type: %s\n"), (CalendarNote.AlarmType==0x00) ?
3635 "With Tone" : "Silent" );
3638 if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && CalendarNote.Recurrance!= 0 )
3639 fprintf(stdout, " It repeat every %d day%s\n", CalendarNote.Recurrance/24,
3640 ((CalendarNote.Recurrance/24)>1) ? "s":"" );
3642 if (CalendarNote.Type == GCN_BIRTHDAY)
3645 i_age = Date.Year - CalendarNote.Time.Year;
3646 fprintf(stdout, _(" Text: %s (%d %s)\n"), CalendarNote.Text,
3647 i_age, (i_age==1)?"year":"years");
3649 if (CalendarNote.Text[0]!=0)
3650 fprintf(stdout, _(" Text: %s\n"), CalendarNote.Text);
3653 if (CalendarNote.Type == GCN_CALL)
3654 fprintf(stdout, _(" Phone: %s\n"), CalendarNote.Phone);
3657 fprintf(stderr, _("The calendar note %i can not be read\n"),i);
3661 if (was_note && vCalVer!=0) {
3662 fprintf(stdout, GSM_GetVCALENDAREnd(vCalVer));
3670 /* Writing calendar notes. */
3672 int writecalendarnote(char *argv[])
3674 GSM_CalendarNote CalendarNote;
3678 number=atoi(argv[1]);
3681 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
3685 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
3688 case GE_CANTOPENFILE:
3689 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
3692 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
3695 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
3701 /* Error 22=Calendar full ;-) */
3703 error=GSM->WriteCalendarNote(&CalendarNote);
3706 fprintf(stdout, _("Succesfully written!\n"));break;
3708 fprintf(stdout, _("Too long text in calendar note!\n"));break;
3710 fprintf(stdout, _("Failed to write calendar note!\n"));break;
3718 /* Calendar note deleting. */
3720 int deletecalendarnote(char *Index)
3723 GSM_CalendarNote CalendarNote;
3725 CalendarNote.Location=atoi(Index);
3729 if (GSM->DeleteCalendarNote(&CalendarNote) == GE_NONE) {
3730 fprintf(stdout, _(" Calendar note deleted.\n"));
3733 fprintf(stderr, _("The calendar note can not be deleted\n"));
3744 /* Setting the date and time. */
3746 int setdatetime(int argc, char *argv[])
3755 now=localtime(&nowh);
3757 Date.Year = now->tm_year;
3758 Date.Month = now->tm_mon+1;
3759 Date.Day = now->tm_mday;
3760 Date.Hour = now->tm_hour;
3761 Date.Minute = now->tm_min;
3762 Date.Second = now->tm_sec;
3764 if (argc>0) Date.Year = atoi (argv[0]);
3765 if (argc>1) Date.Month = atoi (argv[1]);
3766 if (argc>2) Date.Day = atoi (argv[2]);
3767 if (argc>3) Date.Hour = atoi (argv[3]);
3768 if (argc>4) Date.Minute = atoi (argv[4]);
3773 /* Well, this thing is copyrighted in U.S. This technique is known as
3774 Windowing and you can read something about it in LinuxWeekly News:
3775 http://lwn.net/1999/features/Windowing.phtml. This thing is beeing
3776 written in Czech republic and Poland where algorithms are not allowed
3780 Date.Year = Date.Year+1900;
3782 Date.Year = Date.Year+2000;
3785 /* FIXME: Error checking should be here. */
3786 GSM->SetDateTime(&Date);
3793 /* In this mode we receive the date and time from mobile phone. */
3795 int getdatetime(void) {
3797 GSM_DateTime date_time;
3801 if (GSM->GetDateTime(&date_time)==GE_NONE) {
3802 if (date_time.IsSet) {
3803 fprintf(stdout, _("Date: %s %4d/%02d/%02d\n"),
3804 DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
3805 date_time.Year, date_time.Month, date_time.Day);
3806 fprintf(stdout, _("Time: %02d:%02d:%02d\n"), date_time.Hour, date_time.Minute, date_time.Second);
3808 fprintf(stdout, _("Date and time not set in phone\n"));
3811 fprintf(stdout,_("Error!\n"));
3819 /* Setting the alarm. */
3821 int setalarm(char *argv[])
3828 Date.Hour = atoi(argv[0]);
3829 Date.Minute = atoi(argv[1]);
3831 GSM->SetAlarm(1, &Date);
3838 /* Getting the alarm. */
3840 int getalarm(void) {
3842 GSM_DateTime date_time;
3846 if (GSM->GetAlarm(0, &date_time)==GE_NONE) {
3847 fprintf(stdout, _("Alarm: %s\n"), (date_time.IsSet)?"on":"off");
3848 fprintf(stdout, _("Time: %02d:%02d\n"), date_time.Hour, date_time.Minute);
3850 fprintf(stdout,_("Error!\n"));
3858 /* In monitor mode we don't do much, we just initialise the fbus code.
3859 Note that the fbus code no longer has an internal monitor mode switch,
3860 instead compile with DEBUG enabled to get all the gumpf. */
3862 int monitormode(int argc, char *argv[])
3865 float rflevel=-1, batterylevel=-1;
3866 unsigned char loop=1;
3868 GSM_PowerSource powersource=-1;
3869 GSM_RFUnits rf_units = GRF_Arbitrary;
3870 GSM_BatteryUnits batt_units = GBU_Arbitrary;
3872 GSM_NetworkInfo NetworkInfo;
3873 GSM_CBMessage CBMessage;
3875 GSM_MemoryStatus SIMMemoryStatus = {GMT_SM, 0, 0};
3876 GSM_MemoryStatus PhoneMemoryStatus = {GMT_ME, 0, 0};
3877 GSM_MemoryStatus DC_MemoryStatus = {GMT_DC, 0, 0};
3878 GSM_MemoryStatus EN_MemoryStatus = {GMT_EN, 0, 0};
3879 GSM_MemoryStatus FD_MemoryStatus = {GMT_FD, 0, 0};
3880 GSM_MemoryStatus LD_MemoryStatus = {GMT_LD, 0, 0};
3881 GSM_MemoryStatus MC_MemoryStatus = {GMT_MC, 0, 0};
3882 GSM_MemoryStatus ON_MemoryStatus = {GMT_ON, 0, 0};
3883 GSM_MemoryStatus RC_MemoryStatus = {GMT_RC, 0, 0};
3885 GSM_SMSStatus SMSStatus = {0, 0};
3889 /* evaluate for presence of "-noloop" argument in parameter */
3892 if( strcmp(argv[0],"-noloop" ) && strcmp(argv[0],"-nl" ))
3901 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
3904 signal(SIGINT, interrupted);
3906 fprintf (stderr, _("Entering monitor mode...\n"));
3907 fprintf (stderr, _("Initialising GSM interface...\n"));
3909 /* Initialise the code for the GSM interface. */
3914 GSM->EnableCellBroadcast();
3916 /* Loop here indefinitely - allows you to see messages from GSM code in
3917 response to unknown messages etc. The loops ends after pressing the
3919 while (!bshutdown) {
3920 if (GSM->GetRFLevel(&rf_units, &rflevel) == GE_NONE)
3921 fprintf(stdout, _("RFLevel: %d\n"), (int)rflevel);
3923 if (GSM->GetBatteryLevel(&batt_units, &batterylevel) == GE_NONE)
3924 fprintf(stdout, _("Battery: %d\n"), (int)batterylevel);
3926 if (GSM->GetPowerSource(&powersource) == GE_NONE)
3927 fprintf(stdout, _("Power Source: %s\n"), (powersource==GPS_ACDC)?_("AC/DC"):_("battery"));
3929 if (GSM->GetMemoryStatus(&SIMMemoryStatus) == GE_NONE)
3930 fprintf(stdout, _("SIM: Used %d, Free %d\n"), SIMMemoryStatus.Used, SIMMemoryStatus.Free);
3932 if (GSM->GetMemoryStatus(&PhoneMemoryStatus) == GE_NONE)
3933 fprintf(stdout, _("Phone: Used %d, Free %d\n"), PhoneMemoryStatus.Used, PhoneMemoryStatus.Free);
3935 if (GSM->GetMemoryStatus(&DC_MemoryStatus) == GE_NONE)
3936 fprintf(stdout, _("DC: Used %d, Free %d\n"), DC_MemoryStatus.Used, DC_MemoryStatus.Free);
3938 if (GSM->GetMemoryStatus(&EN_MemoryStatus) == GE_NONE)
3939 fprintf(stdout, _("EN: Used %d, Free %d\n"), EN_MemoryStatus.Used, EN_MemoryStatus.Free);
3941 if (GSM->GetMemoryStatus(&FD_MemoryStatus) == GE_NONE)
3942 fprintf(stdout, _("FD: Used %d, Free %d\n"), FD_MemoryStatus.Used, FD_MemoryStatus.Free);
3944 if (GSM->GetMemoryStatus(&LD_MemoryStatus) == GE_NONE)
3945 fprintf(stdout, _("LD: Used %d, Free %d\n"), LD_MemoryStatus.Used, LD_MemoryStatus.Free);
3947 if (GSM->GetMemoryStatus(&MC_MemoryStatus) == GE_NONE)
3948 fprintf(stdout, _("MC: Used %d, Free %d\n"), MC_MemoryStatus.Used, MC_MemoryStatus.Free);
3950 if (GSM->GetMemoryStatus(&ON_MemoryStatus) == GE_NONE)
3951 fprintf(stdout, _("ON: Used %d, Free %d\n"), ON_MemoryStatus.Used, ON_MemoryStatus.Free);
3953 if (GSM->GetMemoryStatus(&RC_MemoryStatus) == GE_NONE)
3954 fprintf(stdout, _("RC: Used %d, Free %d\n"), RC_MemoryStatus.Used, RC_MemoryStatus.Free);
3956 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE)
3957 fprintf(stdout, _("SMS Messages: UnRead %d, Number %d\n"), SMSStatus.UnRead, SMSStatus.Number);
3959 if (GSM->GetIncomingCallNr(Number) == GE_NONE)
3960 fprintf(stdout, _("Incoming call: %s\n"), Number);
3962 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE)
3963 fprintf(stdout, _("Network: %s (%s), LAC: %s, CellID: %s\n"), GSM_GetNetworkName (NetworkInfo.NetworkCode), GSM_GetCountryName(NetworkInfo.NetworkCode), NetworkInfo.LAC, NetworkInfo.CellID);
3965 if (GSM->ReadCellBroadcast(&CBMessage) == GE_NONE)
3966 fprintf(stdout, _("Cell broadcast received on channel %d: %s\n"), CBMessage.Channel, CBMessage.Message);
3973 if( loop ) fprintf (stderr, _("Leaving monitor mode...\n"));
3980 /* Shows texts from phone's display */
3989 error=GSM->EnableDisplayOutput();
3991 if (error == GE_NONE)
3994 /* We do not want to see texts forever - press Ctrl+C to stop. */
3996 signal(SIGINT, interrupted);
3998 fprintf (stderr, _("Entering display monitoring mode...\n"));
4000 /* Loop here indefinitely - allows you to read texts from phone's
4001 display. The loops ends after pressing the Ctrl+C. */
4006 fprintf (stderr, _("Leaving display monitor mode...\n"));
4008 error=GSM->DisableDisplayOutput();
4010 fprintf (stderr, _("Error!\n"));
4012 fprintf (stderr, _("Error!\n"));
4019 /* Displays names of available ringtones */
4022 char model[64], rev[64];
4027 while (GSM->GetRevision(rev) != GE_NONE)
4030 while (GSM->GetModel(model) != GE_NONE)
4033 strncpy(rev,rev+2,5);
4035 PrepareRingingTones(model,rev);
4037 for (i=1;i<=NumberOfRingtones();i++)
4039 fprintf(stdout,_("%i. %s\n"),i,RingingToneName(0,i));
4048 /* Reads profile from phone and displays its' settings */
4050 int getprofile(int argc, char *argv[])
4055 GSM_Profile profile;
4058 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4059 char model[64], rev[64];
4061 /* Initialise the code for the GSM interface. */
4066 error=GSM->GetProfile(&profile);
4068 if (error == GE_NONE)
4071 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4073 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4075 strncpy(rev,rev+2,5);
4077 PrepareRingingTones(model,rev);
4079 switch(GetModelFeature (FN_PROFILES)) {
4080 case F_PROF33:max_profiles=6;break;
4081 case F_PROF51:max_profiles=3;break;
4082 default :max_profiles=7;break;
4087 profile.Number=atoi(argv[0])-1;
4088 start=profile.Number;
4091 if (profile.Number < 0)
4093 fprintf(stderr, _("Profile number must be value from 1 to %d!\n"), max_profiles);
4098 if (profile.Number >= max_profiles)
4100 fprintf(stderr, _("This phone supports only %d profiles!\n"), max_profiles);
4114 if (profile.Number!=0) GSM->GetProfile(&profile);
4116 printf("%d. \"%s\"", (profile.Number+1), profile.Name);
4117 if (profile.DefaultName==-1) printf(" (name defined)");
4121 printf("Incoming call alert: %d\n", profile.CallAlert);
4122 printf("Ringtone ID: %d\n", profile.Ringtone);
4123 printf("Ringing volume: %d\n", profile.Volume);
4124 printf("Message alert tone: %d\n", profile.MessageTone);
4125 printf("Keypad tones: %d\n", profile.KeypadTone);
4126 printf("Warning and game tones: %d\n", profile.WarningTone);
4127 printf("Lights: %d\n", profile.Lights);
4128 printf("Vibration: %d\n", profile.Vibration);
4129 printf("Caller groups: 0x%02x\n", profile.CallerGroups);
4130 printf("Automatic answer: %d\n", profile.AutomaticAnswer);
4131 printf("Screen saver: %d\n", profile.ScreenSaver);
4135 printf("Incoming call alert: %s\n", GetProfileCallAlertString(profile.CallAlert));
4137 /* For different phones different ringtones names */
4138 if (strcmp(RingingToneName(profile.Ringtone,0),""))
4139 printf(_("Ringing tone: %s (number %d in phone menu)\n"),
4140 RingingToneName(profile.Ringtone,0), RingingToneMenu(profile.Ringtone));
4142 printf(_("Ringtone number: %d\n"), profile.Ringtone);
4144 printf(_("Ringing volume: %s\n"), GetProfileVolumeString(profile.Volume));
4146 printf(_("Message alert tone: %s\n"), GetProfileMessageToneString(profile.MessageTone));
4148 printf(_("Keypad tones: %s\n"), GetProfileKeypadToneString(profile.KeypadTone));
4150 printf(_("Warning and game tones: %s\n"), GetProfileWarningToneString(profile.WarningTone));
4152 if (GetModelFeature (FN_SCREENSAVER)!=0)
4153 printf(_("Screen saver: %s\n"), GetProfileOnOffString(profile.ScreenSaver));
4155 printf(_("Vibration: %s\n"), GetProfileVibrationString(profile.Vibration));
4157 /* It has been nice to add here reading caller group name. ;^) */
4158 if (GetModelFeature (FN_CALENDAR)==F_CAL71)
4159 printf(_("Caller groups: %s\n"),
4160 GetProfileCallerGroups(profile.CallerGroups) );
4162 /* FIXME: need make investigation for 3310 for these features. For now unknown */
4163 if (GetModelFeature (FN_PROFILES)!=F_PROF33) {
4164 /* FIXME: Light settings is only used for Car */
4165 if (profile.Number==(max_profiles-2)) printf(_("Lights: %s\n"), profile.Lights ? _("On") : _("Automatic"));
4167 /* FIXME: Automatic answer is only used for Car and Headset. */
4168 if (profile.Number>=(max_profiles-2)) printf(_("Automatic answer: %s\n"), GetProfileOnOffString(profile.AutomaticAnswer));
4176 if (error == GE_NOTIMPLEMENTED) {
4177 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4182 fprintf(stderr, _("Unspecified error\n"));
4194 /* Sets profile feature */
4196 int setprofile(int argc, char *argv[])
4199 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
4200 char model[64], rev[64];
4203 GSM_Profile profile;
4204 GSM_Profile profile2, profile3;
4209 /* Initialise the code for the GSM interface. */
4215 error = GSM->GetProfile(&profile);
4217 if (error == GE_NONE)
4220 while (GSM->GetModel(model) != GE_NONE) sleep(1);
4222 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
4224 strncpy(rev,rev+2,5);
4226 PrepareRingingTones(model,rev);
4228 switch(GetModelFeature (FN_PROFILES)) {
4229 case F_PROF33:max_profiles=6;break;
4230 case F_PROF51:max_profiles=3;break;
4231 default :max_profiles=7;break;
4234 profile.Number=atoi (argv[0]);
4235 profile.Number=profile.Number-1;
4237 if (profile.Number < 0)
4239 fprintf(stderr, _("Profile number must be value from 1 to %i!\n"), max_profiles);
4244 if (profile.Number >= max_profiles)
4246 fprintf(stderr, _("This phone supports only %i profiles!\n"), max_profiles);
4251 if (profile.Number!=0) GSM->GetProfile(&profile);
4256 if (strcmp(argv[1], "callalert")==0)
4258 if (strcmp(argv[2], "ringing")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGING;correct_arg2=true;}
4259 if (strcmp(argv[2], "ascending")==0) {profile.CallAlert=PROFILE_CALLALERT_ASCENDING;correct_arg2=true;}
4260 if (strcmp(argv[2], "ringonce")==0) {profile.CallAlert=PROFILE_CALLALERT_RINGONCE;correct_arg2=true;}
4261 if (strcmp(argv[2], "beeponce")==0) {profile.CallAlert=PROFILE_CALLALERT_BEEPONCE;correct_arg2=true;}
4262 if (strcmp(argv[2], "groups")==0)
4264 profile.CallAlert=PROFILE_CALLALERT_CALLERGROUPS;
4266 /*Ignored by N5110*/
4267 /*FIX ME: it's ignored by N5130 and 3210 too*/
4268 if (max_profiles==3) fprintf(stdout, _("Warning: value \"groups\" for profile feature \"callalert\" will be ignored in this phone model !\n"));
4270 if (strcmp(argv[2], "off")==0 || strcmp(argv[2], "0")==0) {profile.CallAlert=PROFILE_CALLALERT_OFF;correct_arg2=true;}
4273 fprintf(stderr, _("Correct parameters for profile feature \"callalert\" are ringing|ascending|ringonce|beeponce|groups|off|0 !\n"));
4279 if (strcmp(argv[1], "volume")==0)
4281 if (strcmp(argv[2], "1")==0) {profile.Volume=PROFILE_VOLUME_LEVEL1;correct_arg2=true;}
4282 if (strcmp(argv[2], "2")==0) {profile.Volume=PROFILE_VOLUME_LEVEL2;correct_arg2=true;}
4283 if (strcmp(argv[2], "3")==0) {profile.Volume=PROFILE_VOLUME_LEVEL3;correct_arg2=true;}
4284 if (strcmp(argv[2], "4")==0) {profile.Volume=PROFILE_VOLUME_LEVEL4;correct_arg2=true;}
4285 if (strcmp(argv[2], "5")==0) {profile.Volume=PROFILE_VOLUME_LEVEL5;correct_arg2=true;}
4288 fprintf(stderr, _("Correct parameters for profile feature \"volume\" are 0|1|2|3|4|5 !\n"));
4294 if (strcmp(argv[1], "keypad")==0 || strcmp(argv[1], "keypadtone")==0)
4296 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.KeypadTone=PROFILE_KEYPAD_OFF;correct_arg2=true;}
4297 if (strcmp(argv[2], "1")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL1;correct_arg2=true;}
4298 if (strcmp(argv[2], "2")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL2;correct_arg2=true;}
4299 if (strcmp(argv[2], "3")==0) {profile.KeypadTone=PROFILE_KEYPAD_LEVEL3;correct_arg2=true;}
4302 fprintf(stderr, _("Correct parameters for profile feature \"keypad|keypadtone\" are off|0|1|2|3 !\n"));
4308 if (strcmp(argv[1], "messagetone")==0 || strcmp(argv[1], "smstone")==0 || strcmp(argv[1], "sms")==0 || strcmp(argv[1], "message")==0)
4310 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.MessageTone=PROFILE_MESSAGE_NOTONE;correct_arg2=true;}
4311 if (strcmp(argv[2], "standard")==0) {profile.MessageTone=PROFILE_MESSAGE_STANDARD;correct_arg2=true;}
4312 if (strcmp(argv[2], "special")==0) {profile.MessageTone=PROFILE_MESSAGE_SPECIAL;correct_arg2=true;}
4313 if (strcmp(argv[2], "beeponce")==0 || strcmp(argv[2], "once")==0) {profile.MessageTone=PROFILE_MESSAGE_BEEPONCE;correct_arg2=true;}
4314 if (strcmp(argv[2], "ascending")==0) {profile.MessageTone=PROFILE_MESSAGE_ASCENDING;correct_arg2=true;}
4317 fprintf(stderr, _("Correct parameters for profile feature \"messagetone|smstone|message|sms\" are 0|off|standard|special|beeponce|once|ascending !\n"));
4323 if (strcmp(argv[1], "warningtone")==0 || strcmp(argv[1], "warning")==0)
4325 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.WarningTone=PROFILE_WARNING_OFF;correct_arg2=true;}
4326 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.WarningTone=PROFILE_WARNING_ON;correct_arg2=true;}
4329 fprintf(stderr, _("Correct parameters for profile feature \"warningtone|warning\" are 0|off|1|on !\n"));
4335 if (strcmp(argv[1], "vibra")==0 || strcmp(argv[1], "vibration")==0)
4337 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Vibration=PROFILE_VIBRATION_OFF;correct_arg2=true;}
4338 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Vibration=PROFILE_VIBRATION_ON;correct_arg2=true;}
4341 fprintf(stderr, _("Correct parameters for profile feature \"vibration|vibra\" are 0|off|1|on !\n"));
4347 if (strcmp(argv[1], "lights")==0)
4349 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.Lights=-1;correct_arg2=true;}
4350 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.Lights=0;correct_arg2=true;}
4353 fprintf(stderr, _("Correct parameters for profile feature \"lights\" are 0|off|1|on !\n"));
4357 if (profile.Number!=(max_profiles-2))
4359 profile2.Number=max_profiles-2;
4360 if (GSM->GetProfile(&profile2)==GE_NONE)
4362 fprintf(stdout, _("Warning: \"Lights\" feature is ignored in this profile (only setting it for \"%s\" profile get some results) !\n"), profile2.Name);
4367 if (strcmp(argv[1], "answer")==0)
4369 if (strcmp(argv[2], "0")==0 || strcmp(argv[2], "off")==0) {profile.AutomaticAnswer=-1;correct_arg2=true;}
4370 if (strcmp(argv[2], "1")==0 || strcmp(argv[2], "on")==0) {profile.AutomaticAnswer=0;correct_arg2=true;}
4373 fprintf(stderr, _("Correct parameters for profile feature \"answer\" are 0|off|1|on !\n"));
4377 if (profile.Number<(max_profiles-2))
4379 profile2.Number=max_profiles-2;
4380 if (GSM->GetProfile(&profile2)==GE_NONE)
4382 profile3.Number=max_profiles-1;
4383 if (GSM->GetProfile(&profile3)==GE_NONE)
4385 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);
4391 if (strcmp(argv[1], "name")==0)
4393 strcpy(profile.Name,argv[2]);
4394 /*Ignored by N5110*/
4395 /*FIX ME: it's ignored by N5130 and 3210 too*/
4396 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change profile name !\n"));
4399 if (strcmp(argv[1], "ringtone")==0)
4401 profile.Ringtone=atoi(argv[2]);
4402 if (profile.Ringtone<1)
4404 /*With value 0 results are interesting in N5110, but can't be used for anything*/
4405 fprintf(stderr, _("Ringtone number must be higher than 0 !\n"));
4410 if (profile.Ringtone>NumberOfRingtones())
4412 fprintf(stderr, _("Ringtone number too high (max %i) !\n"),NumberOfRingtones());
4416 profile.Ringtone=RingingToneCode(profile.Ringtone);
4417 if (profile.Ringtone==0)
4419 fprintf(stderr, _("Warning: we don't know ringtones codes for this model ! Can you contact with gnokii authors to add it into source ?\n"));
4423 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"));
4427 if (strcmp(argv[1], "groups")==0)
4429 /*Ignored by N5110*/
4430 /*FIX ME: it's ignored by N5130 and 3210 too*/
4431 if (max_profiles==3) fprintf(stdout, _("Warning: this phone model doesn't allow to change caller group name !\n"));
4432 profile.CallerGroups=atoi(argv[2]);
4438 fprintf(stderr, _("Correct profile feature names are callalert|volume|keypad|keypadtone|messagetone|smstone|message|sms|warningtone|warning|vibra|vibration|lights|answer|name|groups !\n"));
4443 GSM->SetProfile(&profile);
4446 if (error == GE_NOTIMPLEMENTED) {
4447 fprintf(stderr, _("Function not implemented in %s model!\n"), model);
4452 fprintf(stderr, _("Unspecified error\n"));
4464 /* Get requested range of memory storage entries and output to stdout in
4465 easy-to-parse format */
4467 int getmemory(int argc, char *argv[])
4470 GSM_PhonebookEntry entry;
4475 char memory_type_string[20];
4478 int i_used = 0, n_used=0;
4480 char *output_opt = NULL;
4482 char az_group_name[5][MAX_BITMAP_TEXT_LENGTH];
4483 bool formatdone=false;
4486 /* group names init */
4487 for(i=0;i<5;i++) az_group_name[i][0]='\0';
4489 /* Handle command line args that set type, start and end locations. */
4490 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
4492 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
4495 GetMemoryTypeString(memory_type_string, &entry.MemoryType);
4497 if (argv[argc-1][0] == '-')
4498 output_opt = argv[--argc];
4500 /* Do generic initialisation routine */
4504 while ((error = GSM->GetModel(buf)) != GE_NONE && i++ < 15)
4509 start_entry = atoi (argv[1]);
4510 end_entry = argc > 2 ? atoi( argv[2]) : start_entry;
4512 GSM_MemoryStatus stats = {entry.MemoryType, 0, 0};
4516 if (GSM->GetMemoryStatus( &stats) != GE_NONE) {
4517 fprintf( stderr, _("Error reading memory status.\n"));
4521 n_used = stats.Used;
4522 end_entry = stats.Used + stats.Free;
4526 /* Now retrieve the requested entries. */
4528 for (count = start_entry;
4529 count <= end_entry && (!do_all || i_used < n_used);
4532 entry.Location=count;
4534 error=GSM->GetMemoryLocation(&entry);
4538 if (entry.SubEntriesCount || strcmp( entry.Number, ""))
4542 if (output_opt && !strcmp( output_opt,"-v30")) {
4543 semicolon_pipe_substitution( &entry, 0 );
4544 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,30));
4547 if (output_opt && !strcmp(output_opt,"-v21")) {
4548 semicolon_pipe_substitution( &entry, 0 );
4549 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,21));
4552 if (output_opt && !strcmp(output_opt,"-v")) {
4553 semicolon_pipe_substitution( &entry, 0 );
4554 fprintf(stdout,_("%s"),GSM_GetVCARD(&entry,10));
4557 if (output_opt && !strcmp(output_opt,"-short")) {
4558 semicolon_pipe_substitution( &entry, 0 );
4559 fprintf(stdout, "%s;%s;%s;%d;%d;", entry.Name, entry.Number, memory_type_string, entry.Location, entry.Group);
4560 for( i = 0; i < entry.SubEntriesCount; i++ )
4562 if( entry.SubEntries[i].EntryType == GSM_Date )
4563 fprintf(stdout,_("%u;%u;%u;%02u.%02u.%04u;%02u:%02u:%02u;"),
4564 entry.SubEntries[i].EntryType,
4565 entry.SubEntries[i].NumberType,
4566 entry.SubEntries[i].BlockNumber,
4567 entry.SubEntries[i].data.Date.Day,
4568 entry.SubEntries[i].data.Date.Month,
4569 entry.SubEntries[i].data.Date.Year,
4570 entry.SubEntries[i].data.Date.Hour,
4571 entry.SubEntries[i].data.Date.Minute,
4572 entry.SubEntries[i].data.Date.Second );
4574 fprintf(stdout,_("%u;%u;%u;%s;"),
4575 entry.SubEntries[i].EntryType,
4576 entry.SubEntries[i].NumberType,
4577 entry.SubEntries[i].BlockNumber,
4578 entry.SubEntries[i].data.Number );
4580 fprintf(stdout,_("\n"));
4586 fprintf(stdout, "Memory %s, location %d\n",memory_type_string, entry.Location);
4588 // check if some info in subentries
4589 for( i = 0; i < entry.SubEntriesCount; i++ )
4590 if( entry.SubEntries[i].EntryType != GSM_Date &&
4591 strcmp(entry.SubEntries[i].data.Number,"") )
4594 if (strcmp(entry.Number,"") || i < entry.SubEntriesCount) {
4595 if (strcmp(entry.Name,"")) fprintf(stdout,_(" Name: %s\n"),entry.Name);
4596 if (strcmp(entry.Number,"")) fprintf(stdout,_(" Number: %s\n"),entry.Number);
4597 bitmap.type=GSM_CallerLogo;
4598 bitmap.number=entry.Group;
4599 strcpy(z_gtype,"unknown");
4600 if (entry.Group==5) strcpy(z_gtype,"No group");
4601 if (entry.Group<5 && entry.Group>=0) {
4602 if (!strcmp(az_group_name[entry.Group],"")) {
4603 if (GetModelFeature (FN_CALLERGROUPS)!=0) {
4604 if (GSM->GetBitmap(&bitmap)==GE_NONE)
4605 strcpy( az_group_name[entry.Group], bitmap.text );
4607 if ((!strcmp(az_group_name[entry.Group],""))) {
4608 switch(entry.Group) {
4609 case 0:strcpy(az_group_name[entry.Group],"Family");break;
4610 case 1:strcpy(az_group_name[entry.Group],"VIP");break;
4611 case 2:strcpy(az_group_name[entry.Group],"Friends");break;
4612 case 3:strcpy(az_group_name[entry.Group],"Colleagues");break;
4613 case 4:strcpy(az_group_name[entry.Group],"Other");break;
4618 strcpy(z_gtype,az_group_name[entry.Group]);
4620 fprintf(stdout,_(" Group: %d (%s)\n"),entry.Group+1,z_gtype);
4621 for( i = 0; i < entry.SubEntriesCount; i++ )
4623 if( entry.SubEntries[i].EntryType == GSM_Date ) {
4624 fprintf(stdout, " Date and time: %s %02u.%02u.%04u %02u:%02u:%02u\n",
4625 DayOfWeek(entry.SubEntries[i].data.Date.Year,
4626 entry.SubEntries[i].data.Date.Month,
4627 entry.SubEntries[i].data.Date.Day),
4628 entry.SubEntries[i].data.Date.Day,
4629 entry.SubEntries[i].data.Date.Month,
4630 entry.SubEntries[i].data.Date.Year,
4631 entry.SubEntries[i].data.Date.Hour,
4632 entry.SubEntries[i].data.Date.Minute,
4633 entry.SubEntries[i].data.Date.Second);
4636 if( strcmp(entry.SubEntries[i].data.Number,"") ) {
4638 switch( entry.SubEntries[i].EntryType ) {
4640 switch( entry.SubEntries[i].NumberType ) {
4641 case GSM_General: strcpy(z_etype,"General "); break;
4642 case GSM_Home: strcpy(z_etype,"Home "); break;
4643 case GSM_Mobile: strcpy(z_etype,"Mobile "); break;
4644 case GSM_Work: strcpy(z_etype,"Work "); break;
4645 case GSM_Fax: strcpy(z_etype,"Fax "); break;
4646 default: strcpy(z_etype,""); break;
4648 strcat(z_etype,"Number"); break;
4650 strcpy(z_etype,"Note"); break;
4652 strcpy(z_etype,"Postal"); break;
4654 strcpy(z_etype,"E-Mail"); break;
4656 strcpy(z_etype,"unknown data"); break;
4659 fprintf(stdout,_(" ---> Subentry: %u\n"),i+1);
4660 fprintf(stdout,_(" Entry type: %u (%s)\n"),entry.SubEntries[i].EntryType,z_etype);
4661 fprintf(stdout,_(" Number type: %u\n"),entry.SubEntries[i].NumberType);
4662 fprintf(stdout,_(" Block Number: %u\n"),entry.SubEntries[i].BlockNumber);
4664 fprintf(stdout,_(" %s: %s\n"),z_etype,entry.SubEntries[i].data.Number);
4668 if ((entry.MemoryType==GMT_DC ||
4669 entry.MemoryType==GMT_RC ||
4670 entry.MemoryType==GMT_MC) && !wasdate)
4671 fprintf(stdout,_(" Date and time not available\n"));
4673 fprintf(stdout,_(" Location empty\n"));
4676 case GE_NOTIMPLEMENTED:
4677 fprintf( stderr, _("Function not implemented in %s model!\n"), model);
4680 case GE_INVALIDMEMORYTYPE:
4681 fprintf( stderr, _("Memory type %s not supported!\n"),
4682 memory_type_string);
4686 fprintf(stdout, _("%s|%d|Bad location or other error!(%d)\n"),
4687 memory_type_string, count, error);
4696 /* Read data from stdin, parse and write to phone. The parsing is relatively
4697 crude and doesn't allow for much variation from the stipulated format. */
4699 int writephonebook(int argc, char *args[])
4702 GSM_PhonebookEntry entry;
4704 char *memory_type_string;
4705 int line_count=0,current,i;
4708 char *Line, OLine[1024], BackLine[1024];
4711 /* Check argument */
4713 if (strcmp("-i", args[0])) {
4718 /* Initialise fbus code */
4724 /* Go through data from stdin. */
4726 while (GetLine(stdin, Line, sizeof(OLine))!=-1) {
4728 current=0;BackLine[current++]=Line[0];
4729 for (i=1;i<strlen(Line);i++) {
4730 if (Line[i-1]==';' && Line[i]==';') BackLine[current++]=' ';
4731 BackLine[current++]=Line[i];
4733 BackLine[current++]=0;
4735 strcpy(Line,BackLine);
4739 #if defined(__svr4__) || defined(__FreeBSD__)
4740 ptr=strtok(Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4743 ptr=strtok(NULL, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4745 ptr=strtok(NULL, ";");
4747 ptr=strsep(&Line, ";"); if (ptr) strcpy(entry.Name, ptr);
4750 ptr=strsep(&Line, ";"); if (ptr && ptr[0]!=' ') strcpy(entry.Number, ptr);
4752 ptr=strsep(&Line, ";");
4756 fprintf(stderr, _("Format problem on line %d [%s] 1\n"), line_count, BackLine);
4761 if (!strncmp(ptr,"ME", 2))
4763 memory_type_string = "int";
4764 entry.MemoryType = GMT_ME;
4766 else if (!strncmp(ptr,"SM", 2))
4768 memory_type_string = "sim";
4769 entry.MemoryType = GMT_SM;
4773 fprintf(stderr, _("Format problem on line %d [%s] 2: %s\n"),
4774 line_count, BackLine,ptr);
4778 #if defined(__svr4__) || defined(__FreeBSD__)
4779 ptr=strtok(NULL, ";"); if (ptr) entry.Location=atoi(ptr);
4781 ptr=strtok(NULL, ";"); if (ptr) entry.Group=atoi(ptr);
4783 ptr=strsep(&Line, ";"); if (ptr) entry.Location=atoi(ptr);
4785 ptr=strsep(&Line, ";"); if (ptr) entry.Group=atoi(ptr);
4789 fprintf(stderr, _("Format problem on line %d [%s] 3\n"),
4790 line_count, BackLine);
4794 for( subentry = 0; ; subentry++ )
4796 #if defined(__svr4__) || defined(__FreeBSD__)
4797 ptr=strtok(NULL, ";");
4799 ptr=strsep(&Line, ";");
4801 if( ptr && *ptr != 0 )
4802 entry.SubEntries[subentry].EntryType=atoi(ptr);
4806 #if defined(__svr4__) || defined(__FreeBSD__)
4807 ptr=strtok(NULL, ";");
4809 ptr=strsep(&Line, ";");
4812 entry.SubEntries[subentry].NumberType=atoi(ptr);
4813 // Phone Numbers need to have a number type.
4814 if(!ptr && entry.SubEntries[subentry].EntryType == GSM_Number)
4816 fprintf(stderr, _("Missing phone number type on line %d"
4817 " entry %d [%s]\n"), line_count, subentry, BackLine);
4822 #if defined(__svr4__) || defined(__FreeBSD__)
4823 ptr=strtok(NULL, ";");
4825 ptr=strsep(&Line, ";");
4828 entry.SubEntries[subentry].BlockNumber=atoi(ptr);
4830 #if defined(__svr4__) || defined(__FreeBSD__)
4831 ptr=strtok(NULL, ";");
4833 ptr=strsep(&Line, ";");
4835 // 0x13 Date Type; it is only for Dailed Numbers, etc.
4836 // we don't store to this memories so it's an error to use it.
4837 if(!ptr || entry.SubEntries[subentry].EntryType == GSM_Date)
4839 fprintf(stderr, _("Is not a phone number on line %d entry %d [%s]\n"),
4840 line_count, subentry, BackLine);
4845 strcpy( entry.SubEntries[subentry].data.Number, ptr );
4848 entry.SubEntriesCount = subentry;
4851 /* This is to send other exports (like from 6110) to 7110 */
4852 if (!entry.SubEntriesCount) {
4853 entry.SubEntriesCount = 1;
4854 entry.SubEntries[subentry].EntryType = GSM_Number;
4855 entry.SubEntries[subentry].NumberType = GSM_General;
4856 entry.SubEntries[subentry].BlockNumber = 2;
4857 strcpy(entry.SubEntries[subentry].data.Number, entry.Number);
4863 GSM_PhonebookEntry tmp_entry;
4865 memcpy(&tmp_entry, &entry, sizeof(GSM_PhonebookEntry) );
4866 error = GSM->GetMemoryLocation(&tmp_entry);
4867 if (error == GE_NONE) {
4868 if (!tmp_entry.Empty) {
4871 FILE *input_flow; //for reading from console, even when input redir.
4873 input_flow = fopen(DEV_CONSOLE, "r");
4876 fprintf(stderr, _("Can't open \"%s\" for input !\n"),DEV_CONSOLE);
4880 fprintf(stderr, _("Location busy. "));
4881 while (confirm < 0) {
4882 fprintf(stderr, _("Overwrite? (yes/no) "));
4883 GetLine(input_flow, ans, 7);
4884 if (!strcmp(ans, "yes")) confirm = 1;
4885 else if (!strcmp(ans, "no")) confirm = 0;
4887 if (!confirm) continue;
4890 fprintf(stderr, _("Unknown error (%d)\n"), error);
4896 /* Do write and report success/failure. */
4897 semicolon_pipe_substitution( &entry, 1 );
4899 error = GSM->WritePhonebookLocation(&entry);
4901 if (error == GE_NONE)
4902 fprintf (stdout, _("Write Succeeded: memory type: %s, loc: %d, name: %s, number: %s\n"), memory_type_string, entry.Location, entry.Name, entry.Number);
4904 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);
4913 /* Getting speed dials. */
4915 int getspeeddial(char *Number) {
4917 GSM_SpeedDial entry;
4919 GSM_PhonebookEntry pbentry;
4921 entry.Number = atoi(Number);
4925 if (GSM->GetSpeedDial(&entry)==GE_NONE) {
4926 pbentry.Location=entry.Location;
4927 if (pbentry.Location==0) pbentry.Location=entry.Number;
4928 pbentry.MemoryType=entry.MemoryType;
4930 error=GSM->GetMemoryLocation(&pbentry);
4932 if (error == GE_NONE)
4934 fprintf(stdout, _("SpeedDial nr. %d: %d:%d (%s)\n"), entry.Number, entry.MemoryType, entry.Location,pbentry.Name);
4936 fprintf(stdout, _("Error\n"));
4938 fprintf(stdout, _("Error\n"));
4946 /* Setting speed dials. */
4948 int setspeeddial(char *argv[]) {
4950 GSM_SpeedDial entry;
4952 char *memory_type_string;
4954 /* Handle command line args that set type, start and end locations. */
4956 if (strcmp(argv[1], "ME") == 0) {
4957 entry.MemoryType = GMT_ME;
4958 memory_type_string = "ME";
4960 else if (strcmp(argv[1], "SM") == 0) {
4961 entry.MemoryType = GMT_SM;
4962 memory_type_string = "SM";
4965 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
4970 entry.Number = atoi(argv[0]);
4971 entry.Location = atoi(argv[2]);
4975 if (GSM->SetSpeedDial(&entry) == GE_NONE) {
4976 fprintf(stdout, _("Succesfully written!\n"));
4984 /* Getting the status of the display. */
4986 int getdisplaystatus()
4991 /* Initialise the code for the GSM interface. */
4995 if (GSM->GetDisplayStatus(&Status)==GE_NONE) {
4997 printf(_("Call in progress: %s\n"), Status & (1<<DS_Call_In_Progress)?_("on"):_("off"));
4998 printf(_("Unknown: %s\n"), Status & (1<<DS_Unknown)?_("on"):_("off"));
4999 printf(_("Unread SMS: %s\n"), Status & (1<<DS_Unread_SMS)?_("on"):_("off"));
5000 printf(_("Voice call: %s\n"), Status & (1<<DS_Voice_Call)?_("on"):_("off"));
5001 printf(_("Fax call active: %s\n"), Status & (1<<DS_Fax_Call)?_("on"):_("off"));
5002 printf(_("Data call active: %s\n"), Status & (1<<DS_Data_Call)?_("on"):_("off"));
5003 printf(_("Keyboard lock: %s\n"), Status & (1<<DS_Keyboard_Lock)?_("on"):_("off"));
5004 printf(_("SMS storage full: %s\n"), Status & (1<<DS_SMS_Storage_Full)?_("on"):_("off"));
5007 printf(_("Error\n"));
5015 int netmonitor(char *Mode)
5018 unsigned char mode=atoi(Mode);
5019 char Screen[NM_MAX_SCREEN_WIDTH];
5024 if (!strcmp(Mode,"reset")) mode=0xf0;
5025 else if (!strcmp(Mode,"off")) mode=0xf1;
5026 else if (!strcmp(Mode,"field"))mode=0xf2;
5027 else if (!strcmp(Mode,"devel"))mode=0xf3;
5028 else if (!strcmp(Mode,"next")) mode=0x00;
5031 for (i=0;i<NM_MAX_SCREEN_WIDTH;i++) Screen[i]=0;
5033 GSM->NetMonitor(mode, Screen);
5036 printf("%s\n", Screen);
5043 int identify( void )
5045 /* Hopefully is 64 larger as FB38_MAX* / FB61_MAX* */
5046 char imei[64], model[64], rev[64], manufacturer[64];
5050 while (GSM->GetIMEI(imei) != GE_NONE) sleep(1);
5051 while (GSM->GetRevision(rev) != GE_NONE) sleep(1);
5052 while (GSM->GetModel(model) != GE_NONE) sleep(1);
5054 strcpy(manufacturer, "(unknown)");
5055 GSM->GetManufacturer(manufacturer);
5057 fprintf(stdout, _("IMEI: %s\n"), imei);
5058 fprintf(stdout, _("Model: %s %s (%s)\n"), manufacturer, GetModelName (model), model);
5059 fprintf(stdout, _("Revision: %s\n"), rev);
5066 int senddtmf(char *String)
5071 if (GSM->SendDTMF(String)!=GE_NONE) fprintf(stdout,_("Error!\n"));
5078 /* Resets the phone */
5079 int reset(int argc, char *argv[])
5082 unsigned char _type=0x03;
5087 if (!strcmp(argv[0],"soft")) _type = 0x03;
5089 /* Doesn't work with 5110 */
5090 if (!strcmp(argv[0],"hard")) _type = 0x04;
5093 fprintf(stderr, _("What kind of reset do you want (second parameter can be \"soft\" or \"hard\") ?\n"));
5107 /* This is a "convenience" function to allow quick test of new API stuff which
5108 doesn't warrant a "proper" command line function. */
5110 int foogle(char *argv[])
5112 /* Initialise the code for the GSM interface. */
5116 // Fill in what you would like to test here...
5127 /* Initialise the code for the GSM interface. */
5131 if (GSM->PhoneTests()!=GE_NONE) fprintf(stderr,_("Error\n"));
5138 /* pmon allows fbus code to run in a passive state - it doesn't worry about
5139 whether comms are established with the phone. A debugging/development
5146 GSM_ConnectionType connection=GCT_FBUS;
5148 /* Initialise the code for the GSM interface. */
5150 error = GSM_Initialise(model, Port, Initlength, connection, RLP_DisplayF96Frame, SynchronizeTime);
5152 if (error != GE_NONE) {
5153 fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
5165 int setringtone(int argc, char *argv[])
5167 GSM_Ringtone ringtone;
5168 GSM_BinRingtone binringtone,binringtone2;
5172 int current=0; //number of packed notes or location
5177 /* If not binary ringtone */
5178 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone2)!=GE_NONE) {
5179 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5181 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5183 ringtone.location=1;
5184 if (argc>1) ringtone.location=atoi(argv[1]);
5186 ringtone.allnotesscale=false;
5188 /* Initialise the GSM interface. */
5191 while (GSM->GetModel(model) != GE_NONE)
5194 /* For Nokia 6110/6130/6150/6210 we use different method of uploading.
5195 Phone will display menu, when received it */
5196 if ( !strcmp(model,"NSE-3") || !strcmp(model,"NSK-3") ||
5197 !strcmp(model,"NSM-1") || !strcmp(model,"NPE-3") ) {
5198 if (argc==1) ringtone.location=255;
5201 error=GSM->SetRingtone(&ringtone,¤t);
5203 if (current!=ringtone.NrNotes) {
5204 if (current>FB61_MAX_RINGTONE_NOTES) {
5205 fprintf(stderr,_("Warning: due to phone limitation"));
5207 fprintf(stderr,_("Warning: ringtone was too long to be saved into frame,"));
5209 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5213 fprintf(stdout, _("Set succeeded!\n"));
5215 fprintf(stdout, _("Setting failed\n"));
5217 } else { /* This IS binary ringtone */
5218 fprintf(stdout,_("Binary ringtone format\n"));
5221 binringtone.frame[current++]=0x00;
5222 binringtone.frame[current++]=0x00;
5223 binringtone.frame[current++]=0x0c;
5224 binringtone.frame[current++]=0x01;
5225 binringtone.frame[current++]=0x2c;
5228 memcpy(binringtone.frame+current,argv[2],strlen(argv[2]));
5229 current=current+strlen(argv[2]);
5233 while(binringtone2.frame[i]!=0x00) {
5234 if (i==binringtone.length) break;
5239 memcpy(binringtone.frame+current,binringtone2.frame+i,binringtone2.length-i);
5240 binringtone.length=binringtone2.length-i+current;
5243 memcpy(binringtone.frame+current,binringtone2.frame,binringtone2.length);
5244 binringtone.length=binringtone2.length;
5247 binringtone.location=1;
5248 if (argc>1) binringtone.location=atoi(argv[1]);
5250 /* Initialise the GSM interface. */
5253 error=GSM->SetBinRingtone(&binringtone);
5257 fprintf(stdout, _("Set succeeded!\n"));
5259 case GE_INVALIDRINGLOCATION:
5260 fprintf(stdout, _("Invalid location %i!\n"),binringtone.location);
5262 case GE_UNKNOWNMODEL:
5263 fprintf(stdout, _("Mygnokii doesn't know format for this model!\n"));
5265 case GE_NOTIMPLEMENTED:
5266 fprintf(stdout, _("Not implemented for this model!\n"));
5269 fprintf(stdout, _("Not supported by this model!\n"));
5279 int ringtoneconvert(int argc, char *argv[])
5281 GSM_Ringtone ringtone;
5283 if (!strcmp(argv[0],argv[1]))
5285 fprintf(stderr, _("Files can't have the same names !\n"));
5289 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5291 ringtone.allnotesscale=false;
5293 GSM_SaveRingtoneFileOnConsole(argv[1], &ringtone);
5298 int playringtone(int argc, char *argv[])
5300 GSM_Ringtone ringtone;
5302 GSM_BinRingtone binringtone;
5308 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
5309 int binary_notes[12] =
5310 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
5312 if (GSM_ReadBinRingtoneFile(argv[0],&binringtone)!=GE_NONE) {
5313 fprintf(stdout,_("Not binary ringtone, trying RTTL\n"));
5315 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5317 /* Initialise the GSM interface. */
5320 fprintf(stdout,_("Playing \"%s\" (%i notes)\n"),ringtone.name,ringtone.NrNotes);
5322 GSM_PlayRingtoneOnConsole(&ringtone);
5326 fprintf(stdout,_("Binary ringtone format\n"));
5328 /* Initialise the GSM interface. */
5332 while (true) { //skipping name
5333 if (binringtone.frame[i]==0) break;
5339 if (binringtone.frame[i]!=j) {
5342 fprintf(stdout,_("Block in binary ringtone %i %i\n"),j,z);
5349 if (!isok && j>=114 && j<=125) {
5350 j=14*3+binary_notes[j-114];
5353 if (!isok && j>=126 && j<=137) {
5354 j=14*1+binary_notes[j-126];
5357 if (!isok && j>=138 && j<=149) {
5358 j=14*2+binary_notes[j-138];
5361 if (!isok && j>=150 && j<=161) {
5362 j=14*4+binary_notes[j-150];
5367 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
5370 Hz=GSM_GetFrequency(j);
5371 if (GSM->PlayTone(Hz,5)!=GE_NONE) fprintf(stdout,_("error during playing\n"));
5375 j=binringtone.frame[i];
5376 z=binringtone.frame[i+1];
5378 z=z+binringtone.frame[i+1];
5381 if (i>=binringtone.length) break;
5392 int composer(int argc, char *argv[])
5394 GSM_Ringtone ringtone;
5397 int oldnoteslen=4,nownoteslen,oldnoteslen2;
5398 int oldnotesscale=1,nownotesscale;
5399 bool firstnote=true;
5400 int DefNoteTempo=63;
5402 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5404 if (ringtone.NrNotes!=0)
5405 DefNoteTempo=ringtone.notes[0].tempo;
5407 fprintf(stdout,_("Ringtone \"%s\" (tempo = %i Beats Per Minute)\n\n"),ringtone.name,GSM_GetTempo(DefNoteTempo));
5409 for (i=0;i<ringtone.NrNotes;i++) {
5410 if (DefNoteTempo!=ringtone.notes[i].tempo) {
5411 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"));
5416 for (i=0;i<ringtone.NrNotes;i++) {
5419 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5429 if ((ringtone.NrNotes-i)>50)
5430 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);
5432 fprintf(stdout,_("This ringtone in Nokia Composer in phone should look: "));
5436 for (i=0;i<ringtone.NrNotes;i++) {
5439 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5445 switch (ringtone.notes[i].duration) {
5446 case 192:fprintf(stdout,_("1."));break; //192=128*1.5
5447 case 128:fprintf(stdout,_("1"));break;
5448 case 96 :fprintf(stdout,_("2."));break; //96=64*1.5
5449 case 64 :fprintf(stdout,_("2"));break;
5450 case 48 :fprintf(stdout,_("4."));break; //48=32*1.5
5451 case 32 :fprintf(stdout,_("4"));break;
5452 case 24 :fprintf(stdout,_("8."));break; //24=16*1.5
5453 case 16 :fprintf(stdout,_("8"));break;
5454 case 12 :fprintf(stdout,_("16."));break; //12=8*1.5
5455 case 8 :fprintf(stdout,_("16"));break;
5456 case 6 :fprintf(stdout,_("32."));break; //6=4*1.5
5457 case 4 :fprintf(stdout,_("32"));break;
5462 /* What note here ? */
5463 switch (GSM_GetNote(ringtone.notes[i].note)) {
5464 case Note_C :fprintf(stdout,_("c"));break;
5465 case Note_Cis:fprintf(stdout,_("#c"));break;
5466 case Note_D :fprintf(stdout,_("d"));break;
5467 case Note_Dis:fprintf(stdout,_("#d"));break;
5468 case Note_E :fprintf(stdout,_("e"));break;
5469 case Note_F :fprintf(stdout,_("f"));break;
5470 case Note_Fis:fprintf(stdout,_("#f"));break;
5471 case Note_G :fprintf(stdout,_("g"));break;
5472 case Note_Gis:fprintf(stdout,_("#g"));break;
5473 case Note_A :fprintf(stdout,_("a"));break;
5474 case Note_Ais:fprintf(stdout,_("#a"));break;
5475 case Note_H :fprintf(stdout,_("h"));break;
5476 default :fprintf(stdout,_("-"));unknown=true;break; //Pause ?
5480 fprintf(stdout,_("%i"),ringtone.notes[i].note/14);
5482 /* And separator before next note */
5483 if (i!=ringtone.NrNotes-1)
5484 fprintf(stdout,_(" "));
5490 fprintf(stdout,_("\n\nTo enter it please press: "));
5494 for (i=0;i<ringtone.NrNotes;i++) {
5497 if (GSM_GetNote(ringtone.notes[i].note)!=Note_Pause)
5505 /* What note here ? */
5506 switch (GSM_GetNote(ringtone.notes[i].note)) {
5507 case Note_C :fprintf(stdout,_("1"));break;
5508 case Note_Cis:fprintf(stdout,_("1"));break;
5509 case Note_D :fprintf(stdout,_("2"));break;
5510 case Note_Dis:fprintf(stdout,_("2"));break;
5511 case Note_E :fprintf(stdout,_("3"));break;
5512 case Note_F :fprintf(stdout,_("4"));break;
5513 case Note_Fis:fprintf(stdout,_("4"));break;
5514 case Note_G :fprintf(stdout,_("5"));break;
5515 case Note_Gis:fprintf(stdout,_("5"));break;
5516 case Note_A :fprintf(stdout,_("6"));break;
5517 case Note_Ais:fprintf(stdout,_("6"));break;
5518 case Note_H :fprintf(stdout,_("7"));break;
5519 default :fprintf(stdout,_("0"));unknown=true;break;
5522 switch (ringtone.notes[i].duration) {
5523 case 192:fprintf(stdout,_("(longer)"));break; //192=128*1.5
5524 case 96 :fprintf(stdout,_("(longer)"));break; //96=64*1.5
5525 case 48 :fprintf(stdout,_("(longer)"));break; //48=32*1.5
5526 case 24 :fprintf(stdout,_("(longer)"));break; //24=16*1.5
5527 case 12 :fprintf(stdout,_("(longer)"));break; //12=8*1.5
5528 case 6 :fprintf(stdout,_("(longer)"));break; //6=4*1.5
5532 /* What note here ? */
5533 switch (GSM_GetNote(ringtone.notes[i].note)) {
5534 case Note_Cis:fprintf(stdout,_("#"));break;
5535 case Note_Dis:fprintf(stdout,_("#"));break;
5536 case Note_Fis:fprintf(stdout,_("#"));break;
5537 case Note_Gis:fprintf(stdout,_("#"));break;
5538 case Note_Ais:fprintf(stdout,_("#"));break;
5544 nownotesscale=ringtone.notes[i].note/14;
5546 if (nownotesscale!=oldnotesscale) {
5547 switch (nownotesscale) {
5549 switch (oldnotesscale) {
5550 case 2:fprintf(stdout,_("**"));break;
5551 case 3:fprintf(stdout,_("*"));break;
5555 switch (oldnotesscale) {
5556 case 1:fprintf(stdout,_("*"));break;
5557 case 3:fprintf(stdout,_("**"));break;
5561 switch (oldnotesscale) {
5562 case 1:fprintf(stdout,_("**"));break;
5563 case 2:fprintf(stdout,_("*"));break;
5569 oldnotesscale=nownotesscale;
5573 oldnoteslen2=oldnoteslen;
5575 switch (ringtone.notes[i].duration) {
5576 case 192:nownoteslen=1;break; //192=128*1.5
5577 case 128:nownoteslen=1;break;
5578 case 96 :nownoteslen=2;break; //96=64*1.5
5579 case 64 :nownoteslen=2;break;
5580 case 48 :nownoteslen=4;break; //48=32*1.5
5581 case 32 :nownoteslen=4;break;
5582 case 24 :nownoteslen=8;break; //24=16*1.5
5583 case 16 :nownoteslen=8;break;
5584 case 12 :nownoteslen=16;break; //12=8*1.5
5585 case 8 :nownoteslen=16;break;
5586 case 6 :nownoteslen=32;break; //6=4*1.5
5587 case 4 :nownoteslen=32;break;
5590 if (nownoteslen>oldnoteslen) {
5591 while (oldnoteslen!=nownoteslen) {
5592 fprintf(stdout,_("8"));
5593 oldnoteslen=oldnoteslen*2;
5597 if (nownoteslen<oldnoteslen) {
5598 while (oldnoteslen!=nownoteslen) {
5599 fprintf(stdout,_("9"));
5600 oldnoteslen=oldnoteslen/2;
5604 if (GSM_GetNote(ringtone.notes[i].note)==Note_Pause)
5605 oldnoteslen=oldnoteslen2;
5607 /* And separator before next note */
5608 if (i!=ringtone.NrNotes-1)
5609 fprintf(stdout,_(" "));
5614 fprintf(stdout,_("\n"));
5620 int sendringtone(int argc, char *argv[])
5622 GSM_Ringtone ringtone;
5623 GSM_MultiSMSMessage SMS;
5625 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5627 if (GSM_ReadRingtoneFileOnConsole(argv[1], &ringtone)!=GE_NONE) return(-1);
5629 ringtone.allnotesscale=false;
5631 for (i=0;i<argc;i++) {
5632 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5633 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5636 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5638 if (current!=ringtone.NrNotes) {
5639 if (current>FB61_MAX_RINGTONE_NOTES) {
5640 fprintf(stderr,_("Warning: due to phone limitation"));
5642 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5644 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5647 for (i=0;i<SMS.number;i++) {
5648 strcpy(SMS.SMS[i].Destination,argv[0]);
5651 /* Initialise the GSM interface. */
5654 GSM_SendMultiPartSMSOnConsole(&SMS, 2,argc,argv,false,true,true);
5659 int saveringtone(int argc, char *argv[])
5661 GSM_Ringtone ringtone;
5662 GSM_MultiSMSMessage SMS;
5664 bool ProfileStyle=false; /* If we use profile style available in new Nokia models */
5666 if (GSM_ReadRingtoneFileOnConsole(argv[0], &ringtone)!=GE_NONE) return(-1);
5668 ringtone.allnotesscale=false;
5670 for (i=0;i<argc;i++) {
5671 if (!strcmp(argv[i],"--profilestyle")) ProfileStyle=true;
5672 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
5675 current=GSM_SaveRingtoneToSMS(&SMS,&ringtone,ProfileStyle);
5677 if (current!=ringtone.NrNotes) {
5678 if (current>FB61_MAX_RINGTONE_NOTES) {
5679 fprintf(stderr,_("Warning: due to phone limitation"));
5681 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
5683 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
5686 for (i=0;i<SMS.number;i++) {
5687 /* Only 11 chars could be here */
5688 strncpy(SMS.SMS[i].Destination,ringtone.name,11);
5691 /* Initialise the GSM interface. */
5694 GSM_SaveMultiPartSMSOnConsole(&SMS,1,argc,argv,false,false,true,true);
5699 /* Converts logo files. */
5701 int bitmapconvert(int argc, char *argv[])
5704 GSM_NetworkInfo NetworkInfo;
5708 if (!strcmp(argv[0],argv[1]))
5710 fprintf(stderr, _("Files can't have the same names !\n"));
5714 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
5719 if (!strcmp(argv[2],"op"))
5722 if (argc<4) doit=true;
5723 if (argc<4 && bitmap.type!=GSM_OperatorLogo) doit=true;
5727 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5730 GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
5733 strncpy(bitmap.netcode,argv[3],7);
5734 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5736 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5742 if (!strcmp(argv[2],"7110op"))
5745 if (argc<4) doit=true;
5746 if (argc<4 && bitmap.type!=GSM_7110OperatorLogo) doit=true;
5750 if (GSM->GetNetworkInfo(&NetworkInfo) == GE_NONE) strncpy(bitmap.netcode,NetworkInfo.NetworkCode,7);
5753 GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
5756 strncpy(bitmap.netcode,argv[3],7);
5757 if (!strcmp(GSM_GetNetworkName(bitmap.netcode),"unknown"))
5759 fprintf(stderr,"Sorry, gnokii doesn't know \"%s\" network !\n",bitmap.netcode);
5765 if (!strcmp(argv[2],"caller"))
5767 GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
5771 if ((num<0)||(num>9)) num=0;
5779 if (!strcmp(argv[2],"startup"))
5781 GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
5784 if (!strcmp(argv[2],"7110startup"))
5786 GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
5789 if (!strcmp(argv[2],"6210startup"))
5791 GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
5794 if (!strcmp(argv[2],"picture"))
5796 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
5801 fprintf(stderr,"Unknown type of logo: %s !\n",argv[2]);
5806 if (GSM_SaveBitmapFileOnConsole(argv[1], &bitmap)!=GE_NONE) return(-1);
5811 int getphoneprofile()
5816 /* Initialise the GSM interface. */
5820 error=GSM->GetProductProfileSetting(&PPS);
5821 if (error!=GE_NONE) {
5822 fprintf(stdout,_("Error!\n"));
5826 fprintf(stdout,_("ALS : "));
5827 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5828 else fprintf(stdout,_("off\n"));
5830 PPS.Name=PPS_VibraMenu;
5831 GSM->GetProductProfileSetting(&PPS);
5832 fprintf(stdout,_("Vibra menu : "));
5833 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5834 else fprintf(stdout,_("off\n"));
5836 PPS.Name=PPS_GamesMenu;
5837 GSM->GetProductProfileSetting(&PPS);
5838 fprintf(stdout,_("Games menu : "));
5839 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5840 else fprintf(stdout,_("off\n"));
5842 PPS.Name=PPS_HRData;
5843 GSM->GetProductProfileSetting(&PPS);
5844 fprintf(stdout,_("HR Data : "));
5845 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5846 else fprintf(stdout,_("off\n"));
5848 PPS.Name=PPS_14400Data;
5849 GSM->GetProductProfileSetting(&PPS);
5850 fprintf(stdout,_("14400 Data : "));
5851 if (PPS.bool_value) fprintf(stdout,_("on\n"));
5852 else fprintf(stdout,_("off\n"));
5854 PPS.Name=PPS_LCDContrast;
5855 GSM->GetProductProfileSetting(&PPS);
5856 fprintf(stdout,_("LCD Contrast : %i%%\n"),PPS.int_value);
5859 GSM->GetProductProfileSetting(&PPS);
5860 fprintf(stdout,_("EFR : "));
5861 switch (PPS.int_value) {
5862 case 0: fprintf(stdout,_("off\n")); break;
5863 case 1: fprintf(stdout,_("last\n")); break;
5864 case 2: fprintf(stdout,_("second\n"));break;
5865 case 3: fprintf(stdout,_("first\n")); break;
5869 GSM->GetProductProfileSetting(&PPS);
5870 fprintf(stdout,_("FR : "));
5871 switch (PPS.int_value) {
5872 case 0: fprintf(stdout,_("off\n")); break;
5873 case 1: fprintf(stdout,_("last\n")); break;
5874 case 2: fprintf(stdout,_("second\n"));break;
5875 case 3: fprintf(stdout,_("first\n")); break;
5879 GSM->GetProductProfileSetting(&PPS);
5880 fprintf(stdout,_("HR : "));
5881 switch (PPS.int_value) {
5882 case 0: fprintf(stdout,_("off\n")); break;
5883 case 1: fprintf(stdout,_("last\n")); break;
5884 case 2: fprintf(stdout,_("second\n"));break;
5885 case 3: fprintf(stdout,_("first\n")); break;
5894 int setphoneprofile(int argc, char *argv[])
5898 bool correct_arg1=false, correct_arg2=false;
5900 if (!strcmp(argv[0],"ALS")) {
5903 if (!strcmp(argv[1],"1")) {
5904 PPS.bool_value=true;
5907 if (!strcmp(argv[1],"0")) {
5908 PPS.bool_value=false;
5911 if (!correct_arg2) {
5912 fprintf(stdout,_("Settings for ALS parameter can be \"0\" or \"1\" !\n"));
5916 if (!strcmp(argv[0],"HRData")) {
5917 PPS.Name=PPS_HRData;
5919 if (!strcmp(argv[1],"1")) {
5920 PPS.bool_value=true;
5923 if (!strcmp(argv[1],"0")) {
5924 PPS.bool_value=false;
5927 if (!correct_arg2) {
5928 fprintf(stdout,_("Settings for HRData parameter can be \"0\" or \"1\" !\n"));
5932 if (!correct_arg1) {
5933 fprintf(stdout,_("First parameter can be \"ALS\" or \"HRData\" only !\n"));
5937 /* Initialise the GSM interface. */
5940 error=GSM->SetProductProfileSetting(&PPS);
5942 if (error!=GE_NONE) {
5943 fprintf(stdout,_("Error!\n"));
5956 int getoperatorname()
5959 GSM_Network network;
5961 /* Initialise the GSM interface. */
5964 if (GSM->GetOperatorName(&network)==GE_NONE)
5966 if (!strcmp(network.Name,"")) {
5967 fprintf(stdout,_("Phone doesn't have downloaded operator name\n"));
5969 fprintf(stdout,_("Phone has downloaded operator name (\"%s\") for \"%s\" (\"%s\") network\n"),
5970 network.Name,network.Code,GSM_GetNetworkName(network.Code));
5980 int setoperatorname(int argc, char *argv[])
5983 GSM_Network network;
5985 /* Initialise the GSM interface. */
5989 strncpy(network.Code,argv[0],7);
5990 strncpy(network.Name,argv[1],50);
5992 strcpy(network.Code,"000 00\0");
5993 strcpy(network.Name,"\0");
5996 if (GSM->SetOperatorName(&network)==GE_NONE) {
5997 if (GSM->GetOperatorName(&network)==GE_NONE) {
5998 if (!strcmp(network.Name,"")) {
5999 fprintf(stdout,_("Downloaded operator name is removed\n"));
6001 fprintf(stdout,_("Downloaded operator name changed for \"%s\" network (\"%s\") to \"%s\"\n"),
6002 network.Code,GSM_GetNetworkName(network.Code),network.Name);
6013 int getvoicemailbox()
6015 GSM_PhonebookEntry entry;
6017 /* Initialise the GSM interface. */
6020 if (GSM->GetVoiceMailbox(&entry)==GE_NONE) {
6021 fprintf(stdout,_("Voice mailbox number is "));
6022 if (!strcmp(entry.Number,""))
6023 fprintf(stdout,_("not set\n"));
6025 fprintf(stdout,_("\"%s\"\n"),entry.Number);
6034 ///////////////////////////////////////////////////////////////////////////////
6035 // flow diagram of netmonitordata():
6036 ///////////////////////////////////////////////////////////////////////////////
6038 // get command line argument
6042 // if specific phone model
6045 // identify-phone: (((((((( TO DO )))))))))))))
6049 // get_mon_param_info() get phone netmonitor parameters name
6050 // specifically to a 'model'
6053 // parse_check() check command line arguments
6054 // | if all OK, go on else stop.
6055 // | because we can have a input file
6056 // v containing multiple
6057 // parse_process() command lines, we process each at once
6058 // so we can exit early on errors.
6060 ///////////////////////////////////////////////////////////////////////////////
6062 // private functions, see netmonitordata()
6063 void free_nm_info(PARAM_INFO_MON *info)
6065 PARAM_INFO_MON *tmp; // pointer, iterator on info
6067 // go to end of list
6069 while (info->next != NULL)
6079 ///////////////////////////////////////////////////////////////////////////////
6080 // this func retrieve parameters info from a file
6081 // and load it in a dynamic array, NULL terminated,
6082 // if 2rd parameter is not NULL, it load also description of screen
6083 // return (PARAM_INFO_MON *start) if all is OK, else NULL
6084 ///////////////////////////////////////////////////////////////////////////////
6085 // start->->next->next->next-> ...->next->NULL
6088 // par0 par1 par2 parN
6089 ///////////////////////////////////////////////////////////////////////////////
6090 // this should be de-allocated from calling function,
6091 // also, screen_name should be deallocated from calling function
6092 ///////////////////////////////////////////////////////////////////////////////
6094 PARAM_INFO_MON *get_mon_param_info(char *f_name, char *screen_name[NM_MAX_SCREEN+1])
6096 PARAM_INFO_MON *start; // pointer to netmonitor parameters info
6097 PARAM_INFO_MON *info; // pointer, iterator on info
6098 PARAM_INFO_MON *check; // pointer, iterator on info, for check usage
6107 char tmp_mname[55]; // very larger, but if netmon bug ...
6108 int x, y, len, s, t; // x & y coord, len, screen nr, type
6111 if (screen_name != NULL)
6112 for (i = 0; i <= NM_MAX_SCREEN; i++)
6113 screen_name[i] = NULL;
6116 if ((f_info = fopen(f_name, "r")) == NULL)
6117 { fprintf(stderr, "Can' t open file parameter info: <%s>\n", f_name);
6121 if ((start = malloc(sizeof(PARAM_INFO_MON))) == NULL)
6122 { fprintf(stderr, "no mem\n");
6126 { start->next = NULL;
6130 while (fgets(buf, 256, f_info) != NULL)
6134 // Truncate from '#' at right of comments
6135 if ((tmp = strchr(param, '#')) != NULL)
6138 // Strip leading, trailing whitespace
6139 while(isspace((int) *param))
6142 while((strlen(param) > 0) && isspace((int) param[strlen(param) - 1]))
6143 param[strlen(param) - 1] = '\0';
6145 // Ignore blank lines
6146 if ((*param == '\n') || (*param == '\0'))
6151 fprintf(stderr, "%s: info line: <%s>\n", f_name, param);
6153 // check for param name
6154 if ((param_name = strtok(param, "=\t\n")) == NULL)
6157 // check if screen name
6158 if (strncmp("SCREEN", param_name, 6) == 0)
6160 // if we do not want screen names ...
6161 if (screen_name == NULL)
6164 // FIXME check for screen nr
6165 if ((tmp = strtok(NULL, ":\n")) == NULL)
6169 // FIXME: check if already defined screen
6171 if ((i <= 0) || (i > NM_MAX_SCREEN))
6173 // check for screen name
6174 if ((tmp = strtok(NULL, ":\n")) == NULL)
6177 screen_name[i] = strdup(tmp);
6183 // FIXME: check for NM_MAX_FIELDS
6185 // check for x coord
6186 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6190 // check for y coord
6191 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6196 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6201 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6205 // check for netmon manual name
6206 if ((tmp = strtok(NULL, ":\t\n")) == NULL)
6208 "%s: PARAMETER <%s> in screen <%d>, not have netmon manual reference\n",
6209 f_name, param_name, s);
6210 free_nm_info(start);
6213 strcpy(tmp_mname, tmp);
6215 // check for data type (optional)
6216 if ((tmp = strtok(NULL, ":\t\n")) != NULL)
6221 // check len, here, so we print parameter name
6224 "%s: PARAMETER <%s> in screen <%d>, has invalid data lenght\n",
6225 f_name, param_name, s);
6226 free_nm_info(start);
6230 // check if already defined same param_name
6232 while (check->next != NULL)
6233 { check = check->next;
6234 if (strcmp(param_name, check->name) == 0)
6237 "%s: PARAMETER <%s> in screen <%d> already defined as in screen <%d>\n",
6238 f_name, param_name, s, check->s_nr);
6239 free_nm_info(start);
6244 // make space, and add parameter
6245 if ((info->next = malloc(sizeof(PARAM_INFO_MON))) != NULL)
6248 info->name = strdup(param_name);
6253 info->mname = strdup(tmp_mname);
6256 info->next = NULL; // mark end
6260 fprintf(stderr, "no mem");
6261 free_nm_info(start);
6273 while (info->next != NULL)
6276 fprintf(stderr, "info name %s\n", info->name);
6282 // 2, parse the arguments and check command(s) line
6283 // command line, phone spec input, and output are complex,
6284 // so we exit printing info about error instead of std help
6285 ///////////////////////////////////////////////////////////////////////////////
6287 int parse_check(int argc, char *argv[], PARAM_INFO_MON *start, char *f_name, int line)
6296 PARAM_INFO_MON *info; // iterator on this list
6299 for (i = 0; i < argc; i++)
6300 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6310 { // should be one of the short option
6311 if (strcmp(argv[i], "-fs") == 0)
6312 { // field separator, next arg should be a string
6313 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6315 // arg OK, do nothing
6320 "-fs: Invalid field separator in <%s> at line %d\n",
6323 fprintf(stderr, "-fs: Invalid field separator\n");
6327 else if (strcmp(argv[i], "-ls") == 0)
6328 { // line separator, next arg should be a string
6329 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6331 // arg OK, do nothing
6336 "-ls: Invalid line separator in <%s> at line %d\n",
6339 fprintf(stderr, "-ls: Invalid line separator\n");
6343 else if (strcmp(argv[i], "-tm") == 0)
6344 { // time separator, next arg should be a millisecond (200-10000)
6348 "-tm, -ts, are mutually exclusive in <%s> at line %d\n",
6351 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6355 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6358 // arg OK, do nothing
6363 "-tm: Invalid argument (200-10000 milliseconds), in <%s> at line %d\n",
6366 fprintf(stderr, "-tm: Invalid argument (200-10000 milliseconds)\n");
6370 else if (strcmp(argv[i], "-ts") == 0)
6371 { // time separator, next arg should be a seconds (1-3600)
6375 "-tm, -ts, are mutually exclusive, in <%s> at line %d\n",
6378 fprintf(stderr, "-tm, -ts, are mutually exclusive\n");
6382 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6385 // arg OK, do nothing
6390 "-ts: Invalid argument (1-3600 seconds) in <%s> at line %d\n",
6393 fprintf(stderr, "-ts: Invalid argument (1-3600 seconds)\n");
6397 else if (strcmp(argv[i], "-n") == 0)
6398 { // nr of data pump, before stop collection,
6399 // next arg should be a int > 0
6400 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6402 // arg OK, do nothing
6407 "-n: Invalid argument (1-99999 times) in <%s> at line %d\n",
6410 fprintf(stderr, "-n: Invalid argument (1-99999 times)\n");
6414 else if (strcmp(argv[i], "-h") == 0)
6415 { // we do NOT want header (default with header)
6416 // arg OK, do nothing
6418 else if (strcmp(argv[i], "-S") == 0)
6419 { // we have used use specs from a file instead of standard info,
6420 // next arg is an existing readable filename
6421 // as already parsed correctly, we skip here.
6424 else if (strcmp(argv[i], "-I") == 0)
6425 { // we have used input from a file instead of command line
6426 // next arg is an existing readable filename
6427 // as already parsed correctly, we skip here.
6433 fprintf(stderr, "Unrecognized option %s in <%s> at line %d\n",
6434 argv[i], f_name, line);
6436 fprintf(stderr, "Unrecognized option %s\n", argv[i]);
6441 { // should be required data
6442 tmp = strdup(argv[i]);
6443 p = strtok(tmp, ":\t\n");
6446 // check if there is an output format specification
6456 // we have 'minus', so, probably forget format ...
6460 "Required data <%s->, without format specifiers in <%s> at line %d\n",
6464 "Required data <%s->, without format specifiers\n", p);
6470 // we check for params
6473 while (info->next != NULL)
6476 if (strcmp(p, info->name) == 0)
6478 if (ctr > NM_MAX_FIELDS)
6482 "too much data field ... in file <%s> at line %d\n",
6485 fprintf(stderr, "too much data field ...\n");
6498 if (found_data == 0)
6502 "Required data <%s>, not found in info-mon specifications in <%s> at line %d\n",
6506 "Required data <%s>, not found in info-mon specifications\n", p);
6510 p = strtok(NULL, ":\t\n");
6512 } // end while strtok
6514 } // end else '-' (short options)
6523 fprintf(stderr, "no required data! in <%s> at line %d\n", f_name, line);
6525 fprintf(stderr, "no required data!\n");
6532 // 2, parse the arguments and process the command line
6533 // no checks are needed here, because already do in parse_check
6534 // it return a pointer to info needed for make output, or NULL if errors
6535 ///////////////////////////////////////////////////////////////////////////////
6536 OUT_INFO_MON *parse_process(int argc, char *argv[], PARAM_INFO_MON *start)
6547 PARAM_INFO_MON *info; // iterator on this list
6548 OUT_INFO_MON *out_param; // iterator on this list
6550 if ((out_param = malloc(sizeof(OUT_INFO_MON))) == NULL)
6551 { fprintf(stderr, "no mem\n");
6556 fprintf(stderr, "parse_process: argc = %d\n", argc);
6557 for (i = 0; i < argc; i++)
6558 fprintf(stderr, "argv[%d] = <%s>\n",i, argv[i]);
6561 for (i = 0; i < NM_MAX_FIELDS; i++)
6562 out_param->data[i] = NULL;
6564 strcpy(out_param->req_fs, " ");
6566 strcpy(out_param->req_ls, "\n\r");
6568 strcpy(out_param->req_ls, "\n");
6571 out_param->req_n = 0;
6572 out_param->req_header = 1;
6575 req_tm = 200; /* default wait */
6584 { // should be one of the short option
6585 if (strcmp(argv[i], "-fs") == 0)
6586 { // field separator, next arg should be a string
6587 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6589 strcpy(out_param->req_fs, argv[i]);
6592 { fprintf(stderr, "NEVER BE:-fs: Invalid field separator\n");
6596 else if (strcmp(argv[i], "-ls") == 0)
6597 { // line separator, next arg should be a string
6598 if (((i+1) < argc) && (strlen(argv[i+1]) < 10))
6600 strcpy(out_param->req_ls, argv[i]);
6603 { fprintf(stderr, "NEVER BE:-ls: Invalid line separator\n");
6607 else if (strcmp(argv[i], "-tm") == 0)
6608 { // time separator, next arg should be a millisecond (200-10000)
6610 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6614 if (((i+1) < argc) && (atoi(argv[i+1]) >= 200) && (atoi(argv[i+1]) <= 10000))
6616 req_tm = atoi(argv[i]);
6620 { fprintf(stderr, "NEVER BE:-tm: Invalid argument (200-10000 milliseconds)\n");
6624 else if (strcmp(argv[i], "-ts") == 0)
6625 { // time separator, next arg should be a seconds (1-3600)
6627 { fprintf(stderr, "NEVER BE:-tm, -ts, are mutually exclusive");
6631 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 3600))
6633 req_ts = atoi(argv[i]);
6640 { fprintf(stderr, "NEVER BE:-ts: Invalid argument (1-3600 seconds)\n");
6644 else if (strcmp(argv[i], "-n") == 0)
6645 { // nr of data pump, before stop collection,
6646 // next arg should be a int > 0
6647 if (((i+1) < argc) && (atoi(argv[i+1]) >= 1) && (atoi(argv[i+1]) <= 99999))
6649 out_param->req_n = atoi(argv[i]);
6652 { fprintf(stderr, "NEVER BE:-n: Invalid argument (1-99999 times)\n");
6656 else if (strcmp(argv[i], "-h") == 0)
6657 { // we do NOT want header (default with header)
6658 out_param->req_header = 0;
6660 else if (strcmp(argv[i], "-S") == 0)
6661 { // we have used use specs from a file instead of standard info,
6662 // next arg is an existing readable filename
6663 // as already parsed correctly, we skip here.
6666 else if (strcmp(argv[i], "-I") == 0)
6667 { // we have used input from a file instead of command line
6668 // next arg is an existing readable filename
6669 // as already parsed correctly, we skip here.
6674 fprintf(stderr, "NEVER BE:Unrecognized option %s\n", argv[i]);
6679 { // should be required data
6680 tmp = strdup(argv[i]);
6681 p = strtok(tmp, ":\t\n");
6684 // check if there is an output format specification
6694 // we have 'minus', so, probably forget format ...
6697 "NEVER BE:Required data <%s->, without format specifiers\n", p);
6703 // we check for params
6706 while (info->next != NULL)
6709 if (strcmp(p, info->name) == 0)
6711 if (ctr > NM_MAX_FIELDS)
6713 fprintf(stderr, "NEVER BE:too much data field ...");
6716 out_param->data[ctr] = info;
6717 out_param->out_f[ctr] = *o;
6724 if (found_data == 0)
6727 "NEVER BE:Required data <%s>, not found in info-mon specifications\n", p);
6732 p = strtok(NULL, ":\t\n");
6734 } // end while strtok
6736 // here, we have an array of pointers to required data
6737 // and an array of output specifiers, from 0 to [ctr-1]
6739 } // end else '-' (short options)
6747 fprintf(stderr, "NEVER BE:no required data!\n");
6751 // now, what netmon screen we need to retrieve ?
6752 // we need somewhat were checking is faster, as our goal is lower cicle time
6754 // we can have NM_MAX_SCREEN=254 screens, so we use an array, of unsigned char,
6755 // each char contain number of needed screen, 255 is list terminator
6757 for (i = 0; i <= NM_MAX_SCREEN; i++)
6758 out_param->req_screen[i] = 255;
6762 fprintf(stderr, "Start Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6764 while (out_param->data[ctr] != NULL)
6767 fprintf(stderr, "Required data %s screen %d\n", out_param->data[ctr]->name, out_param->data[ctr]->s_nr);
6769 // check if screen already in
6772 while (out_param->req_screen[i] != 255)
6774 if (out_param->req_screen[i] == out_param->data[ctr]->s_nr)
6775 { // already load, skip
6782 if (found_data == 0)
6785 fprintf(stderr, "i = %d, out_param->req_screen[%d] = %d\n", i, i, out_param->data[ctr]->s_nr);
6787 out_param->req_screen[i] = out_param->data[ctr]->s_nr;
6796 while (out_param->req_screen[i] != 255)
6798 fprintf(stderr, "Required screen %d\n", out_param->req_screen[i]);
6804 out_param->req_wait = req_tm * 1000;
6806 out_param->req_wait = req_ts * 1000000;
6808 out_param->req_wait = req_tm * 1000;
6814 int nmd_output(OUT_INFO_MON *out_param)
6824 char Screen[NM_MAX_SCREEN_WIDTH];
6826 struct tm *date_time;
6828 if (out_param->req_header)
6830 // print phone help header
6832 while (out_param->data[d] != NULL)
6833 { len = out_param->data[d]->len;
6834 if (strlen(out_param->data[d]->name) > len)
6835 len = strlen(out_param->data[d]->name);
6836 if (strlen(out_param->data[d]->mname) > len)
6837 len = strlen(out_param->data[d]->mname);
6838 printf("%*.*s%s", len, len, out_param->data[d]->name, out_param->req_fs);
6841 printf("%s", out_param->req_ls);
6843 // print netmon manual header
6845 while (out_param->data[d] != NULL)
6846 { len = out_param->data[d]->len;
6847 if (strlen(out_param->data[d]->name) > len)
6848 len = strlen(out_param->data[d]->name);
6849 if (strlen(out_param->data[d]->mname) > len)
6850 len = strlen(out_param->data[d]->mname);
6851 printf("%*.*s%s", len, len, out_param->data[d]->mname, out_param->req_fs);
6854 printf("%s", out_param->req_ls);
6855 printf("%s", out_param->req_ls);
6861 // stop after n data punp
6864 if ((out_param->req_n) && (ctr > out_param->req_n))
6867 // datapump: for each screen, for each required data, load data info->value
6870 while(out_param->req_screen[i] != 255)
6872 if (out_param->req_screen[i] == 0)
6875 date_time = localtime(&sec);
6876 sprintf(Screen, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
6878 date_time->tm_mon+1,
6879 date_time->tm_year+1900,
6884 fprintf(stderr, "%02d-%02d-%04d\n%02d:%02d:%02d\n",
6886 date_time->tm_mon+1,
6887 date_time->tm_year+1900,
6895 GSM->NetMonitor(out_param->req_screen[i], Screen);
6898 // we have one screen of data, load those required
6901 while (out_param->data[d] != NULL)
6903 if (out_param->data[d]->s_nr == out_param->req_screen[i])
6907 nr_line = out_param->data[d]->y;
6908 while ((*p) && (nr_line))
6916 fprintf(stderr, "\nthis line: %s\n\n", p);
6920 nr_chr = out_param->data[d]->x;
6921 while ((*p) && (nr_chr))
6925 // this the start of data
6927 len = out_param->data[d]->len;
6928 while ((*p) && (len))
6929 { out_param->data[d]->value[n] = *p;
6934 // pad with space if shorter than presumed
6935 while ((*p) && (len))
6936 { out_param->data[d]->value[n] = ' ';
6941 out_param->data[d]->value[n] = '\0';
6950 // print row of data
6952 while (out_param->data[d] != NULL)
6954 len = out_param->data[d]->len;
6955 if (out_param->req_header)
6956 { if (strlen(out_param->data[d]->name) > len)
6957 len = strlen(out_param->data[d]->name);
6958 if (strlen(out_param->data[d]->mname) > len)
6959 len = strlen(out_param->data[d]->mname);
6961 // FIXME check format
6962 printf("%*.*s%s", len, len, out_param->data[d]->value, out_param->req_fs);
6965 printf("%s", out_param->req_ls);
6967 usleep(out_param->req_wait);
6971 printf("%s%s", out_param->req_ls, out_param->req_ls);
6977 ///////////////////////////////////////////////////////////////////////////////
6978 int netmonitordata(int argc, char *argv[])
6980 char *loc_info = NULL; // path to --netmonitordata directory
6981 char *f_name; // absolute path of phone info-file
6982 int flag_phone_spec = 0; // flags, set if used -S option
6984 char model[20] = "phonepar"; // TO DO: PHONE AUTODETECTION
6985 // char phver[20] = "";
6987 PARAM_INFO_MON *start; // pointer to list of parsed phone params
6988 OUT_INFO_MON *out_param; // pointer to struct of output data
6990 char *f_commands = NULL; // file containings input line arguments
6991 FILE *commands; // Handle for this file
6992 char buf[1024]; // buffer
6993 char *f_argv[NM_MAX_FIELDS+30]; // space for parameters and cmdline options
6995 char *p, *tmp; // various counter, flags, tmp area ...
7002 signal(SIGINT, interrupted);
7004 // FIXME model, phone_version
7006 // before parsing phone-info-file, we check for user specified phone-info-file
7011 if (strcmp(argv[i], "-S") == 0)
7015 flag_phone_spec = 1;
7016 loc_info = strdup(argv[i+1]);
7020 { fprintf(stderr, "option -S require an argument ...\n");
7028 if (loc_info != NULL)
7029 { f_name = strdup(loc_info);
7031 else // we use standard file specification
7033 if ((tmp = getenv("INFOMONPATH")) == NULL)
7034 { loc_info = strdup(".");
7037 { loc_info = strdup(tmp);
7040 f_name = malloc(strlen(loc_info)+strlen(model)+10);
7041 sprintf(f_name, "%s/%s", loc_info, model);
7046 // fprintf(stderr, "Loc_info <%s> model <%s> version <%s>\n", loc_info, model, phver);
7047 fprintf(stderr, "Info file: <%s>\n", f_name);
7049 if ((start = get_mon_param_info(f_name, NULL)) == NULL)
7052 // option -I give us the possibility of specify a filename,
7053 // containing a "sequence" of command line args.
7054 // if you specify this option, you can use (on command line) only -S option.
7055 // other options may be specified inside the input-file.
7056 // contents of this file as the same sintax as the command line,
7057 // except it must not contain "--netmonitordata" or "-I" or "-S" options
7058 ///////////////////////////////////////////////////////////////////////
7063 if (strcmp(argv[i], "-I") == 0)
7067 if ((argc == 2) || ((argc == 4) && flag_phone_spec == 1))
7068 { f_commands = strdup(argv[i+1]);
7071 { fprintf(stderr, "option -I accept only additional -S option.\n");
7078 { fprintf(stderr, "option -I require an argument ...\n");
7086 // before all, we check all command line
7088 if (f_commands != NULL)
7091 fprintf(stderr, "netmonitordata(check): commands from <%s>\n", f_commands);
7095 // read line, make array f_argv, and counter f_argc
7096 // parse & check args, so errors are checked before real processing
7097 // (-I option here is ignored)
7098 // (-S option can be here, and it is used)
7101 if ((commands = fopen(f_commands, "r")) == NULL)
7102 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7106 // FIXME line may be be splitted
7108 while (fgets(buf, 1024, commands) != NULL)
7113 // Truncate from '#' at right of comments
7114 if ((tmp = strchr(p, '#')) != NULL)
7117 // Strip leading, trailing whitespace
7118 while(isspace((int) *p))
7121 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7122 p[strlen(p) - 1] = '\0';
7124 // Ignore blank lines
7125 if ((*p == '\n') || (*p == '\0'))
7129 fprintf(stderr, "netmonitordata(check): row <%s>\n", p);
7134 p = strtok(p, " \t");
7136 { f_argv[f_argc++] = strdup(p);
7138 fprintf(stderr, "netmonitordata(check): token <%s>\n", p);
7140 p = strtok(NULL, " \t"); // OK p, (NULL)
7142 while ((p != NULL) && (*p));
7144 // here we have f_argc, f_argv, this line is OK
7146 if (parse_check(f_argc, f_argv, start, f_commands, line) != 0)
7147 { free_nm_info(start);
7154 else // as above, but we have only command line, argv, argc.
7156 if (parse_check(argc, argv, start, NULL, 0) != 0)
7157 { free_nm_info(start);
7162 // here, all commands line are checked, and are correct
7164 if (f_commands != NULL)
7167 fprintf(stderr, "netmonitordata(process): commands from <%s>\n", f_commands);
7172 // read line, make array f_argv, and counter f_argc
7173 // parse_process argument, (-I option here is ignored)
7174 // (-S option can be here, and it is used)
7175 // (make header // these are in nmd_output();
7182 if ((commands = fopen(f_commands, "r")) == NULL)
7183 { fprintf(stderr, "Can' t open file commands input :<%s>n", f_commands);
7187 // FIXME line may be be splitted
7188 while (fgets(buf, 1024, commands) != NULL)
7192 // Truncate from '#' at right of comments
7193 if ((tmp = strchr(p, '#')) != NULL)
7196 // Strip leading, trailing whitespace
7197 while(isspace((int) *p))
7200 while((strlen(p) > 0) && isspace((int) p[strlen(p) - 1]))
7201 p[strlen(p) - 1] = '\0';
7203 // Ignore blank lines
7204 if ((*p == '\n') || (*p == '\0'))
7210 p = strtok(p, " \t");
7212 { f_argv[f_argc++] = strdup(p);
7213 p = strtok(NULL, " \t"); // OK p, (NULL)
7215 while ((p != NULL) && (*p));
7217 // here we have f_argc, f_argv, this line is OK
7219 if ((out_param = parse_process(f_argc, f_argv, start)) == NULL)
7220 { free_nm_info(start);
7221 return(-1); /* NEVER BE */
7224 // here, command line has no error ...
7226 nmd_output(out_param);
7233 else // as above, but we have only command line, argv, argc.
7235 if ((out_param = parse_process(argc, argv, start)) == NULL)
7236 { free_nm_info(start);
7237 return(-1); /* NEVER BE */
7239 nmd_output(out_param);
7248 /* I analised this source and this should be done. But when compile with VC6 */
7249 /* I have error. So, commented... MW */
7251 free_nm_info(start);
7258 // used by nm_collect()
7259 ///////////////////////////////////////////////////////////////////////////////
7260 char *rowScreen(char *s)
7264 // make Screen in one row
7276 void printtime(void)
7280 int Year; /* The complete year specification - e.g. 1999. Y2K :-) */
7281 int Month; /* January = 1 */
7286 int Timezone; /* The difference between local time and GMT */
7292 now=localtime(&nowh);
7294 Date.Year = now->tm_year;
7295 Date.Month = now->tm_mon+1;
7296 Date.Day = now->tm_mday;
7297 Date.Hour = now->tm_hour;
7298 Date.Minute = now->tm_min;
7299 Date.Second = now->tm_sec;
7301 /* I have 100 (for 2000) Year now :-) */
7302 if (Date.Year>99 && Date.Year<1900) {
7303 Date.Year=Date.Year+1900;
7306 printf("%d:%d:%d:%d:%d:%d ",Date.Day,Date.Month,Date.Year,Date.Hour,Date.Minute,Date.Second);
7310 // like netmonitor(), but print in one row, 1, 2 or 3 screen, every ~0.3 s
7311 ///////////////////////////////////////////////////////////////////////////////
7312 int nm_collect(int argc, char *argv[])
7314 int mode[MAX_NM_COLLECT];
7315 char Screen[NM_MAX_SCREEN_WIDTH];
7318 for (i=0;i<argc;i++) {
7319 argc > i ? (mode[i] = atoi(argv[i])): (mode[i] = 0);
7322 for (i=0;i<argc;i++) {
7323 if (mode[i]==0 && strcmp(argv[i],"-d")) {
7324 fprintf(stderr, "Wrong %i parameter (not number and not -d)\n",i);
7329 signal(SIGINT, interrupted);
7336 for (i=0;i<argc;i++) {
7337 if (!strcmp(argv[i],"-d")) {
7343 for (i=0;i<argc;i++) {
7346 GSM->NetMonitor(mode[i], Screen);
7347 printf("%s::", rowScreen(Screen));
7362 int sniff(int argc, char *argv[])
7364 /* base model comes from gnokiirc */
7365 strcat(model,"sniff");
7367 if (argc>0) strcpy(Port,argv[0]);
7369 /* Initialise the GSM interface. */
7372 /* Loop here indefinitely - allows you to see messages from GSM code in
7373 response to unknown messages etc. The loops ends after pressing the
7375 while (!bshutdown) {
7385 int decodefile(int argc, char *argv[])
7388 unsigned char in_buffer[255];
7392 /* base model comes from gnokiirc */
7393 strcat(model,"decode");
7395 /* Initialise the GSM interface. */
7398 printf ("open InPutFile: %s\n", argv[0]);
7399 if ( (infile = fopen( argv[0], "rb")) == NULL ) {
7400 printf ("Failed to open InPutFile: %s\n", argv[0]);
7403 while ( (nr_read = fread(in_buffer, 1, 16, infile)) > 0 ) {
7404 for (i=0; i < nr_read; i++)
7405 Protocol->StateMachine(in_buffer[i]);
7413 int getringtone(int argc, char *argv[])
7415 GSM_BinRingtone ringtone;
7417 GSM_Ringtone SMringtone;
7425 ringtone.location=1;
7426 if (argc>1) ringtone.location=atoi(argv[1]);
7428 /* Initialise the GSM interface. */
7431 error=GSM->GetBinRingtone(&ringtone);
7433 while (GSM->GetModel(model) != GE_NONE)
7438 fprintf(stdout, _("Downloaded ringtone, location %i: "),ringtone.location);
7442 fprintf(stdout, _("get succeeded!\n"));
7443 fprintf(stdout, _("Name: %s (binary format)\n"),ringtone.name);
7445 case GE_INVALIDRINGLOCATION:
7446 fprintf(stdout, _("invalid location %i!\n"),ringtone.location);
7448 case GE_UNKNOWNMODEL:
7450 /* In 3310 we have normal "Smart Messaging" format */
7451 if (GetModelFeature (FN_RINGTONES)==F_RING_SM) {
7454 if (ringtone.frame[9]==0x4a && ringtone.frame[10]==0x3a) i=8;
7455 ringtone.frame[i]=0x02;
7457 GSM_UnPackRingtone(&SMringtone, ringtone.frame+i, ringtone.length-i);
7459 fprintf(stdout, _("Name: %s (normal format)\n"),SMringtone.name);
7461 GSM_SaveRingtoneFileOnConsole(argv[0], &SMringtone);
7466 fprintf(stdout, _("mygnokii doesn't know format for this model!\n"));
7468 case GE_NOTIMPLEMENTED:
7469 fprintf(stdout, _("not implemented for this model!\n"));
7472 fprintf(stdout, _("not supported by this model!\n"));
7479 file = fopen(argv[0], "wb");
7482 return(GE_CANTOPENFILE);
7484 fwrite(ringtone.frame, 1, ringtone.length, file);
7492 int binringtoneconvert(int argc, char *argv[])
7494 GSM_BinRingtone ringtone;
7503 //{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
7504 int binary_notes[12] =
7505 { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12};
7507 if (GSM_ReadBinRingtoneFile(argv[0],&ringtone)!=GE_NONE) {
7508 fprintf(stdout,_("Failed to read %s file!\n"),argv[0]);
7512 file = fopen(argv[1], "wb");
7515 return(GE_CANTOPENFILE);
7519 if (ringtone.frame[i]==0) break;
7520 fprintf(file,_("%c"),ringtone.frame[i]);
7524 fprintf(file,_(":d=32,o=5,b=300:"));
7528 if (ringtone.frame[i]!=j) {
7535 if (!isok && j>=114 && j<=125) {
7536 j=14*3+binary_notes[j-114];
7539 if (!isok && j>=126 && j<=137) {
7540 j=14*1+binary_notes[j-126];
7543 if (!isok && j>=138 && j<=149) {
7544 j=14*2+binary_notes[j-138];
7547 if (!isok && j>=150 && j<=161) {
7548 j=14*4+binary_notes[j-150];
7553 fprintf(stdout,_("Unknown block in binary ringtone %i %i\n"),j,z);
7559 if (w>z && (w/2)<=z) {
7561 case 1:fprintf(file,_("16"));break;
7562 case 2:fprintf(file,_("8"));break;
7563 case 3:fprintf(file,_("4"));break;
7564 case 4:fprintf(file,_("2"));break;
7565 case 5:fprintf(file,_("1"));break;
7570 if (z>w) fprintf(file,_("1"));
7572 switch (GSM_GetNote(j)) {
7573 case Note_C :fprintf(file,_("c"));break;
7574 case Note_Cis:fprintf(file,_("c#"));break;
7575 case Note_D :fprintf(file,_("d"));break;
7576 case Note_Dis:fprintf(file,_("d#"));break;
7577 case Note_E :fprintf(file,_("e"));break;
7578 case Note_F :fprintf(file,_("f"));break;
7579 case Note_Fis:fprintf(file,_("f#"));break;
7580 case Note_G :fprintf(file,_("g"));break;
7581 case Note_Gis:fprintf(file,_("g#"));break;
7582 case Note_A :fprintf(file,_("a"));break;
7583 case Note_Ais:fprintf(file,_("a#"));break;
7584 case Note_H :fprintf(file,_("h"));break;
7585 default :pause=true;fprintf(file,_("p"));break; //Pause ?
7590 if (w>z && (w/2)<=z) {
7591 fprintf(file,_("."));
7595 if ((j/14)!=1 && !pause) fprintf(file,_("%i"),j/14);
7596 fprintf(file,_(","));
7599 j=ringtone.frame[i];
7600 z=ringtone.frame[i+1];
7602 z=z+ringtone.frame[i+1];
7605 if (i>=ringtone.length) break;
7614 int renamesmsc(int argc, char *argv[])
7616 GSM_MessageCenter MessageCenter;
7618 MessageCenter.No=atoi(argv[0]);
7620 /* Initialise the GSM interface. */
7623 if (GSM->GetSMSCenter(&MessageCenter) == GE_NONE) {
7624 fprintf(stdout,_("SMSC number %i get OK\n"),MessageCenter.No);
7627 fprintf(stdout,_("Error getting SMSC number %i\n"),MessageCenter.No);
7631 strncpy(MessageCenter.Name,argv[1],10);
7633 if (GSM->SetSMSCenter(&MessageCenter) == GE_NONE) {
7634 fprintf(stdout,_("SMSC number %i set OK (renamed to \"%s\")\n"),MessageCenter.No,MessageCenter.Name);
7637 fprintf(stdout,_("Error setting SMSC number %i\n"),MessageCenter.No);
7647 * Returns number of sostituited characters.
7648 * ... may be useful one day ??
7650 int semicolon_pipe_substitution( GSM_PhonebookEntry *pentry, unsigned int direction )
7651 /* direction = 0 : after reading phone memory (
7652 * 1 : writing phone memory
7656 register int count=0;
7657 char charfrom, charto;
7659 charfrom= (direction==0) ? ';' : '|';
7660 charto = (direction==0) ? '|' : ';';
7662 count+=str_substch(pentry->Name, charfrom, charto );
7663 count+=str_substch(pentry->Number, charfrom, charto );
7665 for( i = 0; i < pentry->SubEntriesCount; i++ )
7667 if( pentry->SubEntries[i].EntryType != GSM_Date )
7668 count+=str_substch(pentry->SubEntries[i].data.Number ,charfrom,charto);
7674 int str_substch( char *str, const char toric, const char sost )
7679 for( ct = 0; ct < strlen(str); ct++ )
7680 if( str[ct] == (unsigned char) toric )
7681 { str[ct] = sost; i_sost++; }
7686 /* Allows to set simlock state.
7687 With older phone (older 51xx, 61xx) can open them, with older
7688 and newer should be able to close them */
7689 /* DO NOT TRY, IF DON'T WANT, WHAT YOU DO !!!!!!!!!! */
7692 GSM_AllSimlocks siml;
7694 unsigned char closebuffer[20]=
7695 { 0x00, 0x01, 0x82, 0x01,
7696 0x00, /* which simlock */
7698 0x00, 0x00, 0x00, /* lock 1 info */
7699 0x00, 0x00, 0x00, 0x00, 0x00, /* lock 4 info */
7700 0x00, 0x00, /* lock 2 info */
7701 0x00, 0x00, /* lock 3 info */
7703 unsigned char openbuffer[10]= { 0x00, 0x01, 0x81, 0x01,
7704 0x00, /* lock number */
7705 0x10, 0x10, 0x10, 0x10, 0x10 };
7706 unsigned char openbuffer0[10]= {0x00, 0x01, 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00 };
7708 unsigned char info[120];
7711 /* Initialise the code for the GSM interface. */
7713 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7715 fprintf(stderr,("Not supported\n"));
7719 N6110_EnableExtendedCommands(0x02);
7721 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7722 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7724 /* Opening all locks (we must check, if we can open them) */
7725 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7726 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7727 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7728 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7729 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7730 if (GSM->SimlockInfo(&siml)!=GE_NONE) {
7731 fprintf(stderr,_("Error getting simlock info\n"));GSM->Terminate();return -1;
7734 if (siml.simlocks[i].enabled) {
7735 fprintf(stderr,_("Can not open simlock %i\n"),i+1);GSM->Terminate();return -1;
7738 /* Making frame for closing simlocks */
7739 strcpy(info,"00101");
7741 while (j!=strlen(info)) {
7742 if (j+2<=strlen(info)) {
7743 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7745 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7748 strcpy(info,"0000");j=0;i=15;
7749 while (j!=strlen(info)) {
7750 if (j+2<=strlen(info)) {
7751 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7753 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7756 strcpy(info,"0000");j=0;i=17;
7757 while (j!=strlen(info)) {
7758 if (j+2<=strlen(info)) {
7759 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7761 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7764 strcpy(info,"0000000001");j=0;i=9;
7765 while (j!=strlen(info)) {
7766 if (j+2<=strlen(info)) {
7768 closebuffer[i]=closebuffer[i] | (info[j] & 0x0f);j++;
7770 closebuffer[i]=((info[j] & 0x0f)<<4) | (info[j+1] & 0x0f);j=j+2;
7773 closebuffer[i]=(info[j] & 0x0f) << 4;j++;
7776 /* Closing simlock with given values */
7777 closebuffer[4]=1+2+4+8;
7778 NULL_SendMessageSequence(50, &CurrentMagicError, 20, 0x40,closebuffer);
7779 /* Opening all locks */
7780 NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer0);
7781 openbuffer[4]=1;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7782 openbuffer[4]=2;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7783 openbuffer[4]=4;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7784 openbuffer[4]=8;NULL_SendMessageSequence(50, &CurrentMagicError, 10, 0x40,openbuffer);
7792 GSM_AllSimlocks siml;
7795 /* Initialise the code for the GSM interface. */
7798 if (GSM->SimlockInfo(&siml)!=GE_NONE) fprintf(stderr,_("Error\n"));
7800 fprintf(stdout,_("MCC + MNC : %s ("),siml.simlocks[0].data);
7801 if (siml.simlocks[0].enabled) fprintf(stdout,_("CLOSED"));
7802 else fprintf(stdout,_("opened"));
7803 if (siml.simlocks[0].factory) fprintf(stdout,_(") (factory"));
7804 else fprintf(stdout,_(") (user"));
7805 fprintf(stdout,_(") (counter %i"),siml.simlocks[0].counter);
7807 s[0]=siml.simlocks[0].data[0];
7808 s[1]=siml.simlocks[0].data[1];
7809 s[2]=siml.simlocks[0].data[2];
7811 s[4]=siml.simlocks[0].data[3];
7812 s[5]=siml.simlocks[0].data[4];
7815 if (strcmp(GSM_GetNetworkName(s),"unknown"))
7816 fprintf(stdout,_(") (network \"%s\""),GSM_GetNetworkName(s));
7818 fprintf(stdout,_(")\n"));
7820 fprintf(stdout,_("GID1 : %s ("),siml.simlocks[1].data);
7821 if (siml.simlocks[1].enabled) fprintf(stdout,_("CLOSED"));
7822 else fprintf(stdout,_("opened"));
7823 if (siml.simlocks[1].factory) fprintf(stdout,_(") (factory"));
7824 else fprintf(stdout,_(") (user"));
7825 fprintf(stdout,_(") (counter %i"),siml.simlocks[1].counter);
7826 fprintf(stdout,_(")\n"));
7828 fprintf(stdout,_("GID2 : %s ("),siml.simlocks[2].data);
7829 if (siml.simlocks[2].enabled) fprintf(stdout,_("CLOSED"));
7830 else fprintf(stdout,_("opened"));
7831 if (siml.simlocks[2].factory) fprintf(stdout,_(") (factory"));
7832 else fprintf(stdout,_(") (user"));
7833 fprintf(stdout,_(") (counter %i"),siml.simlocks[2].counter);
7834 fprintf(stdout,_(")\n"));
7836 fprintf(stdout,_("MSIN : %s ("),siml.simlocks[3].data);
7837 if (siml.simlocks[3].enabled) fprintf(stdout,_("CLOSED"));
7838 else fprintf(stdout,_("opened"));
7839 if (siml.simlocks[3].factory) fprintf(stdout,_(") (factory"));
7840 else fprintf(stdout,_(") (user"));
7841 fprintf(stdout,_(") (counter %i"),siml.simlocks[3].counter);
7842 fprintf(stdout,_(")\n"));
7849 /* Getting EEPROM from older phones */
7850 /* Tested with N5110 5.07, 6150 5.22 */
7855 unsigned char buffer[1000]={ 0x00, 0x01, 0xd4, 0x02, 0x00, 0xa0,
7856 0x00, 0x00, /* location Lo and Hi */
7857 0x10 }; /* how many bytes */
7859 strcpy(Connection,"mbus");
7860 fprintf(stderr,_("Switching connection type to MBUS\n"));
7862 strcpy(model,"5110");
7864 /* Initialise the code for the GSM interface. */
7867 if (strstr(GSM_Info->FBUSModels, "3310") == NULL)
7869 fprintf(stderr,("Not supported\n"));
7874 for (i=0;i<64;i++) {
7875 fprintf(stdout,_("%c"),0xff);
7882 if ((i/256)!=((i-1)/256)) fprintf(stderr,_("."));
7884 if (NULL_SendMessageSequence(50, &CurrentMagicError, 9, 0x40,buffer)!=GE_NONE) break;
7889 fprintf(stderr,_("\n"));
7898 GSM_SMSFolders folders;
7903 /* Initialise the code for the GSM interface. */
7908 error=GSM->GetSMSFolders(&folders);
7912 if (error!=GE_NONE && !folders.number) {
7913 fprintf(stdout,_("Error!\n"));
7917 for (i=0;i<folders.number;i++) {
7918 fprintf(stdout,_("%i. %s\n"),i+1,folders.Folder[i].Name);
7924 int resetphonesettings()
7926 /* Initialise the code for the GSM interface. */
7929 GSM->ResetPhoneSettings();
7938 /* Checked on 3310 4.02 and doesn't work.
7939 Possible reasons: SMSC has problems (possible), bug in phone firmware
7940 (very possible) or here in code.
7941 I quess, that the second is the most possible - 3310 treat only 3 SMS
7942 as linked (the most often profile needs 4 - 2 and few bytes in 3'th
7943 for screen saver, few bytes for profile name and 1 or 2 sms for ringtone).
7944 When send separate ringtone (see --sendringtone with --profilestyle)
7945 and screen saver (--sendlogo screensaver...), it's received OK.
7946 It's for checking in higher firmware. */
7947 int sendprofile(int argc, char *argv[])
7949 GSM_Ringtone ringtone;
7951 GSM_MultiSMSMessage MultiSMS;
7955 u8 MessageBuffer[140*4];
7956 u16 MessageLength=0;
7958 char profilename[10+1];
7960 if (GSM_ReadRingtoneFileOnConsole(argv[2], &ringtone)!=GE_NONE) return(-1);
7962 ringtone.allnotesscale=false;
7963 for (i=0;i<argc;i++)
7964 if (!strcmp(argv[i],"--scale")) ringtone.allnotesscale=true;
7966 /* The fourth argument is the bitmap file. */
7967 if (GSM_ReadBitmapFileOnConsole(argv[3], &bitmap)!=GE_NONE) return -1;
7969 GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
7971 strncpy(profilename,argv[1],10);
7973 MessageBuffer[MessageLength++]=0x30; //SM version. Here 3.0
7975 MessageBuffer[MessageLength++]=SM30_PROFILENAME; //ID for profile name
7976 MessageBuffer[MessageLength++]=0x00; //length hi
7977 MessageBuffer[MessageLength++]=strlen(profilename);//length lo
7979 EncodeUnicode (MessageBuffer+MessageLength,profilename ,strlen(profilename));
7980 MessageLength=MessageLength+2*strlen(profilename);
7982 MessageBuffer[MessageLength++]=SM30_RINGTONE; //ID for ringtone
7984 MessageBuffer[MessageLength++]=0x01; //length hi
7985 MessageBuffer[MessageLength++]=0x00; //length lo
7987 j=SM30_MAX_RINGTONE_FRAME_LENGTH;
7988 current=GSM_PackRingtone(&ringtone, MessageBuffer+MessageLength, &j);
7989 MessageLength=MessageLength+j;
7991 if (current!=ringtone.NrNotes) {
7992 if (current>FB61_MAX_RINGTONE_NOTES) {
7993 fprintf(stderr,_("Warning: due to phone limitation"));
7995 fprintf(stderr,_("Warning: ringtone was too long to be saved into SMS,"));
7997 fprintf(stderr, _(" only %i first notes were packed (%i cut)\n"),current,ringtone.NrNotes-current);
8000 MessageBuffer[i]=(j)/256;
8001 MessageBuffer[i+1]=(j)%256;
8003 MessageBuffer[MessageLength++]=SM30_SCREENSAVER; //ID for OTA screen saver
8004 MessageBuffer[MessageLength++]=0x01; //length hi
8005 MessageBuffer[MessageLength++]=0x00; //length lo
8006 MessageBuffer[MessageLength++]=0x00;
8007 MessageBuffer[MessageLength++]=bitmap.width;
8008 MessageBuffer[MessageLength++]=bitmap.height;
8009 MessageBuffer[MessageLength++]=0x01;
8011 memcpy(MessageBuffer+MessageLength,bitmap.bitmap,bitmap.size);
8012 MessageLength=MessageLength+bitmap.size;
8014 GSM_MakeMultiPartSMS2(&MultiSMS,MessageBuffer,MessageLength, GSM_ProfileUDH, GSM_Coding_Default);
8018 /* Initialise the GSM interface. */
8021 for (i=0;i<MultiSMS.number;i++)
8022 strcpy(MultiSMS.SMS[i].Destination,argv[0]);
8024 return GSM_SaveMultiPartSMSOnConsole(&MultiSMS, optind,argc,argv,false,false,false,false);
8027 int showbitmap(int argc, char *argv[])
8031 if (GSM_ReadBitmapFileOnConsole(argv[0], &bitmap)!=GE_NONE) return(-1);
8033 GSM_PrintBitmap(&bitmap);
8038 int getwapsettings(int argc, char *argv[])
8040 GSM_WAPSettings settings;
8043 settings.location=atoi(argv[0]);
8045 /* Initialise the GSM interface. */
8048 error=GSM->GetWAPSettings(&settings);
8052 fprintf(stdout,_("%s."),argv[0]);
8053 if (!(strcmp(settings.title,""))) fprintf(stdout,_("Set %s\n"),argv[0]);
8054 else fprintf(stdout,_("%s\n"),settings.title);
8055 fprintf(stdout,_("Homepage: %s\n"),settings.homepage);
8056 if (settings.iscontinuous) fprintf(stdout,_("Connection type: continuous\n"));
8057 else fprintf(stdout,_("Connection type: temporary\n"));
8058 if (settings.issecurity) fprintf(stdout,_("Connection security: on\n"));
8059 else fprintf(stdout,_("Connection security: off\n"));
8060 switch (settings.bearer) {
8061 case WAPSETTINGS_BEARER_SMS:
8062 fprintf(stdout,_("Bearer: SMS\n"));
8063 fprintf(stdout,_("Server number: %s\n"),settings.server);
8064 fprintf(stdout,_("Service number: %s\n"),settings.service);
8066 case WAPSETTINGS_BEARER_DATA:
8067 fprintf(stdout,_("Bearer: Data (CSD)\n"));
8068 fprintf(stdout,_("Dial-up number: %s\n"),settings.dialup);
8069 fprintf(stdout,_("IP address: %s\n"),settings.ipaddress);
8070 if (settings.isnormalauthentication) fprintf(stdout,_("Authentication type: normal\n"));
8071 else fprintf(stdout,_("Authentication type: secure\n"));
8072 if (settings.isISDNcall) fprintf(stdout,_("Data call type: ISDN\n"));
8073 else fprintf(stdout,_("Data call type: analogue\n"));
8074 if (settings.isspeed14400) fprintf(stdout,_("Data call speed: 14400\n"));
8075 else fprintf(stdout,_("Data call speed: 9600\n"));
8076 fprintf(stdout,_("User name: %s\n"),settings.user);
8077 fprintf(stdout,_("Password: %s\n"),settings.password);
8079 case WAPSETTINGS_BEARER_USSD:
8080 fprintf(stdout,_("Bearer: USSD\n"));
8081 fprintf(stdout,_("Service code: %s\n"),settings.code);
8082 if (settings.isIP) fprintf(stdout,_("Address type: IP address\nIPaddress: %s\n"),settings.service);
8083 else fprintf(stdout,_("Address type: service number\nService number: %s\n"),settings.service);
8088 fprintf(stderr,_("%s\n"),print_error(error));
8097 /* Not full done now */
8098 int savewapsettings(int argc, char *argv[])
8100 GSM_WAPSettings settings;
8101 GSM_MultiSMSMessage MultiSMS;
8105 settings.location=atoi(argv[0]);
8107 /* Initialise the GSM interface. */
8110 error=GSM->GetWAPSettings(&settings);
8111 // strcpy(settings.homepage,"http://OtherSites/");
8112 // strcpy(settings.title,"Orange");
8118 /* Put settings into SMS structure */
8119 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8121 for (w=0;w<MultiSMS.number;w++)
8122 strcpy(MultiSMS.SMS[w].Destination,"WAPSettings");
8124 GSM_SaveMultiPartSMSOnConsole(&MultiSMS,1,argc,argv,false,false,false,false);
8129 fprintf(stderr,_("%s\n"),print_error(error));
8137 int sendwapsettings(int argc, char *argv[])
8139 GSM_WAPSettings settings;
8140 GSM_MultiSMSMessage MultiSMS;
8144 settings.location=atoi(argv[0]);
8146 /* Initialise the GSM interface. */
8149 error=GSM->GetWAPSettings(&settings);
8150 // strcpy(settings.homepage,"http://OtherSites/");
8151 // strcpy(settings.title,"Orange");
8157 /* Put settings into SMS structure */
8158 GSM_SaveWAPSettingsToSMS(&MultiSMS,&settings);
8160 for (w=0;w<MultiSMS.number;w++)
8161 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8163 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8169 fprintf(stderr,_("%s\n"),print_error(error));
8177 int getwapbookmark(int argc, char *argv[])
8179 GSM_WAPBookmark bookmark;
8182 bookmark.location=atoi(argv[0]);
8184 /* Initialise the GSM interface. */
8187 error=GSM->GetWAPBookmark(&bookmark);
8191 if (bookmark.address[0]==0) {
8192 fprintf(stdout,_("Empty bookmark location\n"));
8194 fprintf(stdout,_("Address: \"%s\"\n"),bookmark.address);
8195 if (bookmark.title[0]==0)
8196 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.address);
8198 fprintf(stdout,_("Title: \"%s\"\n"),bookmark.title);
8202 fprintf(stderr,_("%s\n"),print_error(error));
8211 int setwapbookmark(int argc, char *argv[])
8213 GSM_WAPBookmark bookmark;
8216 if (argc == 3) /* if location given, use it */
8217 bookmark.location=atoi(argv[2]);
8218 else /* else use first empty location */
8219 bookmark.location=0xffff;
8221 strcpy(bookmark.title, argv[0]);
8222 strcpy(bookmark.address, argv[1]);
8224 /* Initialise the GSM interface. */
8227 error=GSM->SetWAPBookmark(&bookmark);
8231 fprintf(stdout,_("No errors\n"));
8234 fprintf(stderr,_("%s\n"),print_error(error));
8243 int savewapbookmark(int argc, char *argv[])
8245 GSM_WAPBookmark bookmark;
8246 GSM_MultiSMSMessage MultiSMS;
8250 bookmark.location=atoi(argv[0]);
8252 /* Initialise the GSM interface. */
8255 error=GSM->GetWAPBookmark(&bookmark);
8257 // strcpy(bookmark.title,"tytulagagagagagagagagagagagagagagagagagagagagagend");
8258 // strcpy(bookmark.address,"http://jajajajajajajajajajajajagagagagagagagagagagagagagagagagagagagagagpapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap¥papapapapapapapapagagagagagagagagagagagagagagagagagagagagagagagagagadadadadadadadajdjdjdjdjdjdjdjdjdjdjdjdjdjdjdjdstp");
8264 if (bookmark.address[0]==0) {
8265 fprintf(stdout,_("Empty bookmark location\n"));
8270 /* Put bookmark into SMS structure */
8271 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8273 for (w=0;w<MultiSMS.number;w++)
8274 strcpy(MultiSMS.SMS[w].Destination,"WAPBookmark");
8276 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 1,argc,argv,false,false,false,false);
8281 fprintf(stderr,_("%s\n"),print_error(error));
8290 int sendwapbookmark(int argc, char *argv[])
8292 GSM_WAPBookmark bookmark;
8293 GSM_MultiSMSMessage MultiSMS;
8297 bookmark.location=atoi(argv[0]);
8299 /* Initialise the GSM interface. */
8302 error=GSM->GetWAPBookmark(&bookmark);
8307 if (bookmark.address[0]==0) {
8308 fprintf(stdout,_("Empty bookmark location\n"));
8313 /* Put bookmark into SMS structure */
8314 GSM_SaveWAPBookmarkToSMS(&MultiSMS,&bookmark);
8316 for (w=0;w<MultiSMS.number;w++)
8317 strcpy(MultiSMS.SMS[w].Destination,argv[1]);
8319 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false);
8324 fprintf(stderr,_("%s\n"),print_error(error));
8333 int savecalendarnote(int argc, char *argv[])
8335 GSM_MultiSMSMessage MultiSMS;
8337 GSM_CalendarNote CalendarNote;
8340 number=atoi(argv[1]);
8343 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8347 switch ( GSM_ReadVCalendarFile(argv[0], &CalendarNote, &number) ) {
8350 case GE_CANTOPENFILE:
8351 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[0]);
8354 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8357 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[0]);
8363 /* Put note into SMS structure */
8364 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8366 for (w=0;w<MultiSMS.number;w++)
8367 strcpy(MultiSMS.SMS[w].Destination,"Calendar");
8369 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8374 int sendcalendarnote(int argc, char *argv[])
8376 GSM_MultiSMSMessage MultiSMS;
8378 GSM_CalendarNote CalendarNote;
8381 number=atoi(argv[2]);
8384 fprintf(stdout, _("Number of calendar note must be 1 or higher\n"));
8388 switch ( GSM_ReadVCalendarFile(argv[1], &CalendarNote, &number) ) {
8391 case GE_CANTOPENFILE:
8392 fprintf(stdout, _("Failed to open vCalendar file \"%s\"\n"),argv[1]);
8395 fprintf(stdout, _("Number of given calendar note is too high (max=%i)\n"),number);
8398 fprintf(stdout, _("Failed to parse vCalendar file \"%s\"\n"),argv[1]);
8404 /* Put note into SMS structure */
8405 GSM_SaveCalendarNoteToSMS(&MultiSMS,&CalendarNote);
8407 for (w=0;w<MultiSMS.number;w++)
8408 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8410 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8415 /* Example function for continuous receiving SMS */
8416 /* When phone receives SMS, it's read by mygnokii, ID number is created
8417 and SMS is saved to file. After it it's deleted
8418 Checking many errors is also done */
8419 int receivesms(int argc, char *argv[])
8423 GSM_SMSStatus SMSStatus = {0, 0};
8425 int read, location, number;
8426 unsigned char name[50],filename[400];
8427 char nowdate[12]="", nowtime[12]="";
8430 struct CFG_Header *cfg_info;
8432 /* We do not want to monitor serial line forever - press Ctrl+C to stop the
8435 signal(SIGINT, interrupted);
8437 fprintf (stderr, _("Entering monitor mode (press CTRL+C to break)...\n"));
8439 cfg_info=CFG_FindGnokiirc();
8442 if (cfg_info!=NULL) {
8443 if (CFG_Get(cfg_info, "receivesms", "path")) {
8444 strcpy(Dir,CFG_Get(cfg_info, "receivesms", "path"));
8448 fprintf(stderr,_("Path for sms files is \"%s\"\n"),Dir);
8450 fprintf (stderr, _("Initialising GSM interface..."));
8452 /* Initialise the code for the GSM interface. */
8455 fprintf (stderr, _("done\n"));
8459 /* Loop here indefinitely - allows you to see messages from GSM code in
8460 response to unknown messages etc. The loops ends after pressing the
8462 while (!bshutdown) {
8463 if (GSM->GetSMSStatus(&SMSStatus) == GE_NONE) {
8464 if (SMSStatus.Number!=0) {
8466 GetMachineDateTime(nowdate, nowtime );
8467 logfile = fopen("log", "a");
8469 fprintf(logfile, _("%s %s SMS Messages: UnRead %d, Number %d\n"),
8470 nowdate, nowtime, SMSStatus.UnRead, SMSStatus.Number);
8477 while (!bshutdown) {
8479 SMS.Location=location;
8480 if (GSM->GetSMSMessage(&SMS)==GE_NONE) {
8481 if (SMS.folder==0 || SMS.folder==0x08) { //GST_7110_INBOX
8483 GetMachineDateTime(nowdate, nowtime );
8484 logfile = fopen("log", "a");
8486 fprintf(logfile,_("%s %s SMS on location %i\n"),
8487 nowdate,nowtime,SMS.MessageNumber);
8491 number= 16*(SMS.MessageText[2] >> 4)+ (SMS.MessageText[2] & 0x0f);
8492 number=number+ 256*16*(SMS.MessageText[1] >> 4)+ 256*(SMS.MessageText[1] & 0x0f);
8493 number=number+65536*16*(SMS.MessageText[0] >> 4)+65536*(SMS.MessageText[0] & 0x0f);
8495 sprintf( name, "%07i_%02d%02d%02d_%02d%02d%02d.sms", number,
8496 SMS.Time.Year, SMS.Time.Month, SMS.Time.Day,
8497 SMS.Time.Hour, SMS.Time.Minute, SMS.Time.Second);
8499 strcpy(filename,Dir);
8500 strcat(filename,name);
8502 logfile = fopen("log", "a");
8504 fprintf(logfile,_("%s %s Name is \"%s\"\n"),nowdate,nowtime,filename);
8508 file = fopen(filename, "rb");
8510 file = fopen(filename, "wb");
8512 GetMachineDateTime(nowdate, nowtime );
8513 fprintf(stderr,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8514 logfile = fopen("log", "a");
8516 fprintf(logfile,_("%s %s ERROR: opening file \"%s\" failed !\n"),nowdate,nowtime,filename);
8520 fwrite(SMS.MessageText,1,SMS.Length,file);
8526 GetMachineDateTime(nowdate, nowtime );
8527 fprintf(stderr,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8528 logfile = fopen("log", "a");
8530 fprintf(logfile,_("%s %s ERROR: file \"%s\" already exist !\n"),nowdate,nowtime,filename);
8535 SMS.Location=SMS.MessageNumber;
8536 if (GSM->DeleteSMSMessage(&SMS)!=GE_NONE) {
8537 GetMachineDateTime(nowdate, nowtime );
8538 fprintf(stderr,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8539 logfile = fopen("log", "a");
8541 fprintf(logfile,_("%s %s ERROR: Deleting SMS location %i failed !\n"),nowdate,nowtime,SMS.MessageNumber);
8549 if (read==SMSStatus.Number) break;
8553 GetMachineDateTime(nowdate, nowtime );
8554 fprintf(stderr,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8555 logfile = fopen("log", "a");
8557 fprintf(logfile,_("%s %s ERROR: Can't get SMS status !\n"),nowdate,nowtime);
8565 fprintf (stderr, _("Leaving monitor mode...\n"));
8572 int divert(int argc, char *argv[])
8577 memset(&cd, 0, sizeof(GSM_CallDivert));
8579 if (!strcmp("register", argv[0])){cd.Operation = GSM_CDV_Register ;}
8580 else if (!strcmp("enable" , argv[0])){cd.Operation = GSM_CDV_Enable ;}
8581 else if (!strcmp("disable" , argv[0])){cd.Operation = GSM_CDV_Disable ;}
8582 else if (!strcmp("erasure" , argv[0])){cd.Operation = GSM_CDV_Erasure ;}
8583 else if (!strcmp("query" , argv[0])){cd.Operation = GSM_CDV_Query ;}
8589 if (!strcmp("all" , argv[1])) {cd.DType = GSM_CDV_AllTypes ;}
8590 else if (!strcmp("busy" , argv[1])) {cd.DType = GSM_CDV_Busy ;}
8591 else if (!strcmp("noans" , argv[1])) {cd.DType = GSM_CDV_NoAnswer ;}
8592 else if (!strcmp("outofreach", argv[1])) {cd.DType = GSM_CDV_OutOfReach;}
8598 if (!strcmp("all" , argv[2])) {cd.CType = GSM_CDV_AllCalls ;}
8599 else if (!strcmp("voice", argv[2])) {cd.CType = GSM_CDV_VoiceCalls;}
8600 else if (!strcmp("fax" , argv[2])) {cd.CType = GSM_CDV_FaxCalls ;}
8601 else if (!strcmp("data" , argv[2])) {cd.CType = GSM_CDV_DataCalls ;}
8607 if (argc>3) strcpy(cd.Number, argv[3]);
8609 if (argc>4) cd.Timeout = atoi(argv[4]);
8611 /* Initialise the code for the GSM interface. */
8614 error=GSM->CallDivert(&cd);
8616 if (error == GE_NONE) {
8617 switch (cd.Operation)
8620 fprintf(stdout, _("Divert type: "));
8622 case GSM_CDV_Busy :fprintf(stdout, _("when busy"));break;
8623 case GSM_CDV_NoAnswer :fprintf(stdout, _("when not answered"));break;
8624 case GSM_CDV_OutOfReach:fprintf(stdout, _("when phone off or no coverage"));break;
8625 case GSM_CDV_AllTypes :fprintf(stdout, _("all call diverts"));break; //?
8626 default: fprintf(stdout, _("unknown %i"),cd.DType);break;
8629 fprintf(stdout, _("\nCalls type : "));
8631 case GSM_CDV_VoiceCalls: fprintf(stdout, _("voice"));break;
8632 case GSM_CDV_FaxCalls : fprintf(stdout, _("fax"));break;
8633 case GSM_CDV_DataCalls : fprintf(stdout, _("data"));break;
8634 case GSM_CDV_AllCalls : fprintf(stdout, _("voice, fax & data"));break;
8635 default: fprintf(stdout, _("unknown %i"),cd.CType);break;
8637 fprintf(stdout, _("\n"));
8640 fprintf(stdout, _("Status : active\n"));
8641 fprintf(stdout, _("Timeout : %i seconds\n"),cd.Timeout);
8642 fprintf(stdout, _("Number : %s\n"),cd.Number);
8644 fprintf(stdout, _("Status : deactivated\n"));
8649 fprintf(stdout,_("Divert done\n"));
8652 fprintf(stderr,_("%s\n"),print_error(error));
8659 int savephonebookentry(int argc, char *argv[])
8661 GSM_MultiSMSMessage MultiSMS;
8662 GSM_PhonebookEntry entry;
8668 /* Handle command line args that set type, start and end locations. */
8669 if (!GetMemoryTypeID(argv[0], &entry.MemoryType))
8671 fprintf(stderr, _("Unknown memory type %s!\n"), argv[0]);
8675 entry.Location=atoi(argv[1]);
8679 error=GSM->GetMemoryLocation(&entry);
8684 /* Put entry into SMS structure */
8685 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71) {
8686 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8688 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8691 for (w=0;w<MultiSMS.number;w++)
8692 strcpy(MultiSMS.SMS[w].Destination,"Phonebook");
8694 GSM_SaveMultiPartSMSOnConsole(&MultiSMS, 2,argc,argv,false,false,false,false);
8698 fprintf(stdout,_("Error\n"));break;
8704 int sendphonebookentry(int argc, char *argv[])
8706 GSM_MultiSMSMessage MultiSMS;
8707 GSM_PhonebookEntry entry;
8713 /* Handle command line args that set type, start and end locations. */
8714 if (!GetMemoryTypeID(argv[1], &entry.MemoryType))
8716 fprintf(stderr, _("Unknown memory type %s!\n"), argv[1]);
8720 entry.Location=atoi(argv[2]);
8724 error=GSM->GetMemoryLocation(&entry);
8729 /* Put entry into SMS structure */
8730 if (GetModelFeature(FN_PHONEBOOK)==F_PBK71) {
8731 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,21);
8733 GSM_SavePhonebookEntryToSMS(&MultiSMS,&entry,10);
8736 for (w=0;w<MultiSMS.number;w++)
8737 strcpy(MultiSMS.SMS[w].Destination,argv[0]);
8739 GSM_SendMultiPartSMSOnConsole(&MultiSMS, 3,argc,argv,false,false,false);
8744 fprintf(stdout,_("Error\n"));break;