1 #define _GNU_SOURCE /* For strcasestr */
13 #include "../helper/locales.h"
15 #include "message-display.h"
16 #include "memory-display.h"
22 * Prints location information about message.
24 void PrintSMSLocation(const GSM_SMSMessage
*sms
, const GSM_SMSFolders
*folders
)
26 printf(_("Location %i, folder \"%s\""),
28 DecodeUnicodeConsole(folders
->Folder
[sms
->Folder
- 1].Name
)
31 switch (sms
->Memory
) {
33 printf(", %s", _("SIM memory"));
36 printf(", %s", _("phone memory"));
39 printf(", %s", _("phone or SIM memory"));
45 if (sms
->InboxFolder
) {
46 printf(", %s", _("Inbox folder"));
53 * Searches for memory entry in NULL terminated entries list.
55 const GSM_MemoryEntry
*SearchPhoneNumber(const unsigned char *number
, const GSM_MemoryEntry
**List
, int *pos
)
58 for (i
= 0; List
[i
] != NULL
; i
++) {
59 for (*pos
= 0; *pos
< List
[i
]->EntriesNum
; (*pos
)++) {
60 switch (List
[i
]->Entries
[*pos
].EntryType
) {
61 case PBK_Number_General
:
62 case PBK_Number_Mobile
:
64 case PBK_Number_Pager
:
65 case PBK_Number_Other
:
66 if (mywstrncmp(List
[i
]->Entries
[*pos
].Text
,number
,-1)) {
78 * Prints single phone number optionally showing name of contact from backup data.
80 #ifdef GSM_ENABLE_BACKUP
81 void PrintPhoneNumber(const unsigned char *number
, const GSM_Backup
*Info
)
83 void PrintPhoneNumber(const unsigned char *number
, const void *Info
)
86 #ifdef GSM_ENABLE_BACKUP
87 const GSM_MemoryEntry
*pbk
;
91 printf("\"%s\"", DecodeUnicodeConsole(number
));
93 if (Info
== NULL
) return;
95 #ifdef GSM_ENABLE_BACKUP
96 /* First try phone phonebook */
97 pbk
= SearchPhoneNumber(number
, (const GSM_MemoryEntry
**)Info
->PhonePhonebook
, &pos
);
99 /* Fall back to SIM */
100 pbk
= SearchPhoneNumber(number
, (const GSM_MemoryEntry
**)Info
->SIMPhonebook
, &pos
);
104 if (pbk
== NULL
) return;
107 printf("%s", DecodeUnicodeConsole(GSM_PhonebookGetEntryName(pbk
)));
109 /* Print phone type */
110 switch (pbk
->Entries
[pos
].EntryType
) {
111 case PBK_Number_Mobile
:
112 printf(" (%s)", _("mobile"));
115 printf(" (%s)", _("fax"));
117 case PBK_Number_Pager
:
118 printf(" (%s)", _("pager"));
120 case PBK_Number_General
:
121 printf(" (%s)", _("general"));
126 switch (pbk
->Entries
[pos
].Location
) {
127 case PBK_Location_Home
:
128 printf(" [%s]", _("home"));
130 case PBK_Location_Work
:
131 printf(" [%s]", _("work"));
133 case PBK_Location_Unknown
:
139 #ifdef GSM_ENABLE_BACKUP
140 void DisplaySingleSMSInfo(GSM_SMSMessage sms
, gboolean displaytext
, gboolean displayudh
, const GSM_Backup
*Info
)
142 void DisplaySingleSMSInfo(GSM_SMSMessage sms
, gboolean displaytext
, gboolean displayudh
, const void *Info
)
145 GSM_SiemensOTASMSInfo SiemensOTA
;
149 case SMS_Status_Report
:
150 printf("%s\n", _("SMS status report"));
152 printf(LISTFORMAT
, _("Status"));
154 case SMS_Sent
: printf("%s", _("Sent")); break;
155 case SMS_Read
: printf("%s", _("Read")); break;
156 case SMS_UnRead
: printf("%s", _("UnRead")); break;
157 case SMS_UnSent
: printf("%s", _("UnSent")); break;
161 printf(LISTFORMAT
, _("Remote number"));
162 PrintPhoneNumber(sms
.Number
, Info
);
165 printf(LISTFORMAT
"%d\n", _("Reference number"),sms
.MessageReference
);
166 printf(LISTFORMAT
"%s\n", _("Sent"),OSDateTime(sms
.DateTime
,TRUE
));
167 printf(LISTFORMAT
"\"%s\"\n", _("SMSC number"),DecodeUnicodeConsole(sms
.SMSC
.Number
));
168 printf(LISTFORMAT
"%s\n", _("SMSC response"),OSDateTime(sms
.SMSCTime
,TRUE
));
169 printf(LISTFORMAT
"%s\n", _("Delivery status"),DecodeUnicodeConsole(sms
.Text
));
170 printf(LISTFORMAT
, _("Details"));
171 if (sms
.DeliveryStatus
& 0x40) {
172 if (sms
.DeliveryStatus
& 0x20) {
173 printf("%s", _("Temporary error, "));
175 printf("%s", _("Permanent error, "));
177 } else if (sms
.DeliveryStatus
& 0x20) {
178 printf("%s", _("Temporary error, "));
180 switch (sms
.DeliveryStatus
) {
181 case 0x00: printf("%s", _("SM received by the SME")); break;
182 case 0x01: printf("%s", _("SM forwarded by the SC to the SME but the SC is unable to confirm delivery"));break;
183 case 0x02: printf("%s", _("SM replaced by the SC")); break;
184 case 0x20: printf("%s", _("Congestion")); break;
185 case 0x21: printf("%s", _("SME busy")); break;
186 case 0x22: printf("%s", _("No response from SME")); break;
187 case 0x23: printf("%s", _("Service rejected")); break;
188 case 0x24: printf("%s", _("Quality of service not available")); break;
189 case 0x25: printf("%s", _("Error in SME")); break;
190 case 0x40: printf("%s", _("Remote procedure error")); break;
191 case 0x41: printf("%s", _("Incompatibile destination")); break;
192 case 0x42: printf("%s", _("Connection rejected by SME")); break;
193 case 0x43: printf("%s", _("Not obtainable")); break;
194 case 0x44: printf("%s", _("Quality of service not available")); break;
195 case 0x45: printf("%s", _("No internetworking available")); break;
196 case 0x46: printf("%s", _("SM Validity Period Expired")); break;
197 case 0x47: printf("%s", _("SM deleted by originating SME")); break;
198 case 0x48: printf("%s", _("SM Deleted by SC Administration")); break;
199 case 0x49: printf("%s", _("SM does not exist")); break;
200 case 0x60: printf("%s", _("Congestion")); break;
201 case 0x61: printf("%s", _("SME busy")); break;
202 case 0x62: printf("%s", _("No response from SME")); break;
203 case 0x63: printf("%s", _("Service rejected")); break;
204 case 0x64: printf("%s", _("Quality of service not available")); break;
205 case 0x65: printf("%s", _("Error in SME")); break;
206 default : printf(_("Reserved/Specific to SC: %x"),sms
.DeliveryStatus
); break;
211 printf("%s\n", _("SMS message"));
212 if (sms
.State
==SMS_UnSent
&& sms
.Memory
==MEM_ME
) {
213 printf(LISTFORMAT
"%s\n", _("Saved"), OSDateTime(sms
.DateTime
,TRUE
));
215 printf(LISTFORMAT
"\"%s\"", _("SMSC number"), DecodeUnicodeConsole(sms
.SMSC
.Number
));
216 if (sms
.ReplyViaSameSMSC
) printf("%s", _(" (set for reply)"));
218 printf(LISTFORMAT
"%s\n", _("Sent"), OSDateTime(sms
.DateTime
,TRUE
));
220 /* No break. The only difference for SMS_Deliver and SMS_Submit is,
221 * that SMS_Deliver contains additional data. We wrote them and then go
222 * for data shared with SMS_Submit
225 if (sms
.ReplaceMessage
!= 0) printf(LISTFORMAT
"%i\n", _("SMS replacing ID"),sms
.ReplaceMessage
);
226 /* If we went here from "case SMS_Deliver", we don't write "SMS Message" */
227 if (sms
.PDU
==SMS_Submit
) {
228 printf("%s\n", _("SMS message"));
229 if (sms
.State
== SMS_Sent
) {
230 printf(LISTFORMAT
"%d\n", _("Reference number"),sms
.MessageReference
);
232 if (CheckDate(&(sms
.DateTime
)) && CheckTime(&(sms
.DateTime
))) {
233 printf(LISTFORMAT
"%s\n", _("Sent"), OSDateTime(sms
.DateTime
,TRUE
));
236 if (sms
.Name
[0] != 0x00 || sms
.Name
[1] != 0x00) {
237 printf(LISTFORMAT
"\"%s\"\n", _("Name"),DecodeUnicodeConsole(sms
.Name
));
239 if (sms
.Class
!= -1) {
240 printf(LISTFORMAT
"%i\n", _("Class"),sms
.Class
);
242 printf(LISTFORMAT
, _("Coding"));
243 switch (sms
.Coding
) {
244 case SMS_Coding_Unicode_No_Compression
:
245 printf("%s", _("Unicode (no compression)"));
247 case SMS_Coding_Unicode_Compression
:
248 printf("%s", _("Unicode (compression)"));
250 case SMS_Coding_Default_No_Compression
:
251 printf("%s", _("Default GSM alphabet (no compression)"));
253 case SMS_Coding_Default_Compression
:
254 printf("%s", _("Default GSM alphabet (compression)"));
256 case SMS_Coding_8bit
:
257 /* l10n: 8-bit message coding */
258 printf("%s", _("8-bit"));
262 if (sms
.State
==SMS_UnSent
&& sms
.Memory
==MEM_ME
) {
264 printf(LISTFORMAT
, ngettext("Remote number", "Remote numbers", sms
.OtherNumbersNum
+ 1));
265 PrintPhoneNumber(sms
.Number
, Info
);
266 for (i
=0;i
<sms
.OtherNumbersNum
;i
++) {
268 PrintPhoneNumber(sms
.OtherNumbers
[i
], Info
);
272 printf(LISTFORMAT
, _("Status"));
274 case SMS_Sent
: printf("%s", _("Sent")); break;
275 case SMS_Read
: printf("%s", _("Read")); break;
276 case SMS_UnRead
: printf("%s", _("UnRead")); break;
277 case SMS_UnSent
: printf("%s", _("UnSent")); break;
280 if (sms
.UDH
.Type
!= UDH_NoUDH
) {
281 printf(LISTFORMAT
, _("User Data Header"));
282 switch (sms
.UDH
.Type
) {
283 case UDH_ConcatenatedMessages
: printf("%s", _("Concatenated (linked) message")); break;
284 case UDH_ConcatenatedMessages16bit
: printf("%s", _("Concatenated (linked) message")); break;
285 case UDH_DisableVoice
: printf("%s", _("Disables voice indicator")); break;
286 case UDH_EnableVoice
: printf("%s", _("Enables voice indicator")); break;
287 case UDH_DisableFax
: printf("%s", _("Disables fax indicator")); break;
288 case UDH_EnableFax
: printf("%s", _("Enables fax indicator")); break;
289 case UDH_DisableEmail
: printf("%s", _("Disables email indicator")); break;
290 case UDH_EnableEmail
: printf("%s", _("Enables email indicator")); break;
291 case UDH_VoidSMS
: printf("%s", _("Void SMS")); break;
292 case UDH_NokiaWAP
: printf("%s", _("Nokia WAP bookmark")); break;
293 case UDH_NokiaOperatorLogoLong
: printf("%s", _("Nokia operator logo")); break;
294 case UDH_NokiaWAPLong
: printf("%s", _("Nokia WAP bookmark or WAP/MMS settings")); break;
295 case UDH_NokiaRingtone
: printf("%s", _("Nokia ringtone")); break;
296 case UDH_NokiaRingtoneLong
: printf("%s", _("Nokia ringtone")); break;
297 case UDH_NokiaOperatorLogo
: printf("%s", _("Nokia GSM operator logo")); break;
298 case UDH_NokiaCallerLogo
: printf("%s", _("Nokia caller logo")); break;
299 case UDH_NokiaProfileLong
: printf("%s", _("Nokia profile")); break;
300 case UDH_NokiaCalendarLong
: printf("%s", _("Nokia calendar note")); break;
301 case UDH_NokiaPhonebookLong
: printf("%s", _("Nokia phonebook entry")); break;
302 case UDH_UserUDH
: printf("%s", _("User UDH")); break;
303 case UDH_MMSIndicatorLong
: printf("%s", _("MMS indicator")); break;
304 case UDH_NoUDH
: break;
306 if (sms
.UDH
.Type
!= UDH_NoUDH
) {
307 if (sms
.UDH
.ID8bit
!= -1) printf(_(", ID (8 bit) %i"),sms
.UDH
.ID8bit
);
308 if (sms
.UDH
.ID16bit
!= -1) printf(_(", ID (16 bit) %i"),sms
.UDH
.ID16bit
);
309 if (sms
.UDH
.PartNumber
!= -1 && sms
.UDH
.AllParts
!= -1) {
311 printf(_(", part %i of %i"),sms
.UDH
.PartNumber
,sms
.UDH
.AllParts
);
313 printf(_(", %i parts"),sms
.UDH
.AllParts
);
321 if (sms
.Coding
!= SMS_Coding_8bit
) {
322 printf("%s\n", DecodeUnicodeConsole(sms
.Text
));
323 } else if (GSM_DecodeSiemensOTASMS(GSM_GetGlobalDebug(), &SiemensOTA
,&sms
)) {
324 printf("%s\n", _("Siemens file"));
326 size_t len
= strlen(sms
.Text
);
327 char hexbuf
[len
* 2 + 1];
328 EncodeHexBin (hexbuf
, sms
.Text
, len
);
329 printf("%s\n", _("8 bit SMS, cannot be displayed here"));
330 printf("(hex: %s)\n", hexbuf
);
336 printf(_("Unknown PDU type: 0x%x\n"), sms
.PDU
);
343 #ifdef GSM_ENABLE_BACKUP
344 void DisplayMultiSMSInfo (GSM_MultiSMSMessage
*sms
, gboolean eachsms
, gboolean ems
, const GSM_Backup
*Info
, GSM_StateMachine
*sm
)
346 void DisplayMultiSMSInfo (GSM_MultiSMSMessage
*sms
, gboolean eachsms
, gboolean ems
, const void *Info
, GSM_StateMachine
*sm
)
349 GSM_SiemensOTASMSInfo SiemensOTA
;
350 GSM_MultiPartSMSInfo SMSInfo
;
351 gboolean RetVal
,udhinfo
=TRUE
;
357 /* GSM_DecodeMultiPartSMS returns if decoded SMS content correctly */
358 RetVal
= GSM_DecodeMultiPartSMS(GSM_GetGlobalDebug(), &SMSInfo
,sms
,ems
);
361 if (GSM_DecodeSiemensOTASMS(GSM_GetGlobalDebug(), &SiemensOTA
,&sms
->SMS
[0])) udhinfo
= FALSE
;
362 if (sms
->SMS
[0].UDH
.Type
!= UDH_NoUDH
&& sms
->SMS
[0].UDH
.AllParts
== sms
->Number
) udhinfo
= FALSE
;
363 if (RetVal
&& !udhinfo
) {
364 DisplaySingleSMSInfo(sms
->SMS
[0],FALSE
,FALSE
,Info
);
367 for (j
=0;j
<sms
->Number
;j
++) {
368 DisplaySingleSMSInfo(sms
->SMS
[j
],!RetVal
,udhinfo
,Info
);
373 for (j
=0;j
<sms
->Number
;j
++) {
374 DisplaySingleSMSInfo(sms
->SMS
[j
],!RetVal
,TRUE
,Info
);
379 GSM_FreeMultiPartSMSInfo(&SMSInfo
);
383 if (SMSInfo
.Unknown
) printf("%s\n\n", _("Some details were ignored (unknown or not implemented in decoding functions)"));
385 for (i
=0;i
<SMSInfo
.EntriesNum
;i
++) {
386 switch (SMSInfo
.Entries
[i
].ID
) {
387 case SMS_SiemensFile
:
388 printf("%s", _("Siemens OTA file"));
389 if (strstr(DecodeUnicodeString(SMSInfo
.Entries
[i
].File
->Name
),".vcf")) {
390 printf("%s\n", _(" - VCARD"));
391 SMSInfo
.Entries
[i
].File
->Buffer
= realloc(SMSInfo
.Entries
[i
].File
->Buffer
,1+SMSInfo
.Entries
[i
].File
->Used
);
392 SMSInfo
.Entries
[i
].File
->Buffer
[SMSInfo
.Entries
[i
].File
->Used
] = 0;
393 SMSInfo
.Entries
[i
].File
->Used
+= 1;
395 error
= GSM_DecodeVCARD(GSM_GetGlobalDebug(), SMSInfo
.Entries
[i
].File
->Buffer
, &Pos
, &pbk
, Nokia_VCard21
);
396 if (error
== ERR_NONE
) {
397 PrintMemoryEntry(&pbk
, sm
);
403 case SMS_NokiaRingtone
:
404 printf(_("Ringtone \"%s\"\n"),DecodeUnicodeConsole(SMSInfo
.Entries
[i
].Ringtone
->Name
));
405 GSM_SaveRingtoneRttl(stdout
,SMSInfo
.Entries
[i
].Ringtone
);
408 /* Disabled for now */
409 if (answer_yes("%s", _("Do you want to play it?")))
410 GSM_PlayRingtone(*SMSInfo
.Entries
[i
].Ringtone
);
413 case SMS_NokiaCallerLogo
:
414 printf("%s\n\n", _("Caller logo"));
415 GSM_PrintBitmap(stdout
,&SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0]);
417 case SMS_NokiaOperatorLogo
:
418 printf(_("Operator logo for %s network"),
419 SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0].NetworkCode
);
421 DecodeUnicodeConsole(GSM_GetNetworkName(SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0].NetworkCode
)));
423 DecodeUnicodeConsole(GSM_GetCountryName(SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0].NetworkCode
)));
425 GSM_PrintBitmap(stdout
,&SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0]);
427 case SMS_NokiaScreenSaverLong
:
428 printf("%s\n", _("Screen saver"));
429 GSM_PrintBitmap(stdout
,&SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0]);
431 case SMS_NokiaPictureImageLong
:
432 printf("%s\n", _("Picture"));
433 if (UnicodeLength(SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0].Text
) != 0)
434 printf(LISTFORMAT
"\"%s\"\n\n", _("Text"),DecodeUnicodeConsole(SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0].Text
));
435 GSM_PrintBitmap(stdout
,&SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0]);
437 case SMS_NokiaProfileLong
:
438 printf("%s\n", _("Profile"));
439 GSM_PrintBitmap(stdout
,&SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0]);
441 case SMS_ConcatenatedTextLong
:
442 case SMS_ConcatenatedAutoTextLong
:
443 case SMS_ConcatenatedTextLong16bit
:
444 case SMS_ConcatenatedAutoTextLong16bit
:
445 case SMS_NokiaVCARD21Long
:
446 case SMS_NokiaVCALENDAR10Long
:
447 if (SMSInfo
.Entries
[i
].Buffer
== NULL
) printf("\n");
448 else printf("%s\n",DecodeUnicodeConsole(SMSInfo
.Entries
[i
].Buffer
));
450 case SMS_EMSFixedBitmap
:
451 case SMS_EMSVariableBitmap
:
452 GSM_PrintBitmap(stdout
,&SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0]);
454 case SMS_EMSAnimation
:
455 /* Can't show animation, we show first frame */
456 GSM_PrintBitmap(stdout
,&SMSInfo
.Entries
[i
].Bitmap
->Bitmap
[0]);
458 case SMS_EMSPredefinedSound
:
459 printf("\n" LISTFORMAT
"%i\n", _("EMS sound ID"),SMSInfo
.Entries
[i
].Number
);
461 case SMS_EMSPredefinedAnimation
:
462 printf("\n" LISTFORMAT
"%i\n", _("EMS animation ID"),SMSInfo
.Entries
[i
].Number
);
464 case SMS_MMSIndicatorLong
:
465 printf(LISTFORMAT
"%s\n", _("Sender"),SMSInfo
.Entries
[i
].MMSIndicator
->Sender
);
466 printf(LISTFORMAT
"%s\n", _("Subject"),SMSInfo
.Entries
[i
].MMSIndicator
->Title
);
467 printf(LISTFORMAT
"%s\n", _("Address"),SMSInfo
.Entries
[i
].MMSIndicator
->Address
);
468 printf(LISTFORMAT
"%li\n", _("Message size"), (long)SMSInfo
.Entries
[i
].MMSIndicator
->MessageSize
);
471 case SMS_NokiaRingtoneLong
:
472 case SMS_NokiaOperatorLogoLong
:
473 case SMS_NokiaWAPBookmarkLong
:
474 case SMS_NokiaWAPSettingsLong
:
475 case SMS_NokiaMMSSettingsLong
:
476 case SMS_NokiaVCARD10Long
:
477 case SMS_NokiaVTODOLong
:
478 case SMS_VCARD10Long
:
479 case SMS_VCARD21Long
:
480 case SMS_DisableVoice
:
482 case SMS_DisableEmail
:
483 case SMS_EnableVoice
:
485 case SMS_EnableEmail
:
489 case SMS_EMSSonyEricssonSound
:
490 case SMS_EMSSound10Long
:
491 case SMS_EMSSound12Long
:
492 case SMS_EMSSonyEricssonSoundLong
:
493 case SMS_EMSVariableBitmapLong
:
494 case SMS_WAPIndicatorLong
:
495 case SMS_AlcatelMonoBitmapLong
:
496 case SMS_AlcatelMonoAnimationLong
:
497 case SMS_AlcatelSMSTemplateName
:
501 printf("%s\n", _("Error"));
507 GSM_FreeMultiPartSMSInfo(&SMSInfo
);
511 GSM_Error
DisplaySMSFrame(GSM_SMSMessage
*SMS
, GSM_StateMachine
*sm
)
514 int i
, length
, current
= 0;
515 unsigned char req
[1000], buffer
[1000], hexreq
[1000];
516 unsigned char hexmsg
[1000], hexudh
[1000];
518 error
=PHONE_EncodeSMSFrame(sm
,SMS
,buffer
,PHONE_SMSSubmit
,&length
,TRUE
);
519 if (error
!= ERR_NONE
) {
522 length
= length
- PHONE_SMSSubmit
.Text
;
524 for(i
=SMS
->UDH
.Length
;i
<length
;i
++) {
525 req
[i
-SMS
->UDH
.Length
]=buffer
[PHONE_SMSSubmit
.Text
+i
];
527 EncodeHexBin(hexmsg
, req
, MAX(0, length
-SMS
->UDH
.Length
));
529 for(i
=0;i
<SMS
->UDH
.Length
;i
++) {
530 req
[i
]=buffer
[PHONE_SMSSubmit
.Text
+i
];
532 EncodeHexBin(hexudh
, req
, SMS
->UDH
.Length
);
534 printf(LISTFORMAT
"%s\n", _("Data PDU"), hexmsg
);
535 printf(LISTFORMAT
"%d\n", _("Number of bits"),
536 (buffer
[PHONE_SMSSubmit
.TPUDL
]-SMS
->UDH
.Length
)*8);
537 printf(LISTFORMAT
"%s\n", _("UDH"), hexudh
);
539 for (i
=0;i
<buffer
[PHONE_SMSSubmit
.SMSCNumber
]+1;i
++) {
540 req
[current
++]=buffer
[PHONE_SMSSubmit
.SMSCNumber
+i
];
542 req
[current
++]=buffer
[PHONE_SMSSubmit
.firstbyte
];
543 req
[current
++]=buffer
[PHONE_SMSSubmit
.TPMR
];
544 for (i
=0;i
<((buffer
[PHONE_SMSSubmit
.Number
]+1)/2+1)+1;i
++) {
545 req
[current
++]=buffer
[PHONE_SMSSubmit
.Number
+i
];
547 req
[current
++]=buffer
[PHONE_SMSSubmit
.TPPID
];
548 req
[current
++]=buffer
[PHONE_SMSSubmit
.TPDCS
];
549 req
[current
++]=buffer
[PHONE_SMSSubmit
.TPVP
];
550 req
[current
++]=buffer
[PHONE_SMSSubmit
.TPUDL
];
551 for(i
=0;i
<length
;i
++) req
[current
++]=buffer
[PHONE_SMSSubmit
.Text
+i
];
552 EncodeHexBin(hexreq
, req
, current
);
553 printf(LISTFORMAT
"%s\n", _("Whole PDU"), hexreq
);
559 /* How should editor hadle tabs in this file? Add editor commands here.
560 * vim: noexpandtab sw=8 ts=8 sts=8: