Translation update done using Pootle.
[gammu.git] / helper / message-display.c
blob5e102c467cc1524d0605c483cfdbd9c119abec73
1 #define _GNU_SOURCE /* For strcasestr */
2 #include <string.h>
3 #include <stdarg.h>
4 #include <signal.h>
5 #include <stdlib.h>
6 #include <ctype.h>
7 #ifdef WIN32
8 # include <io.h>
9 #else
10 # include <unistd.h>
11 #endif
13 #include "../helper/locales.h"
15 #include "message-display.h"
16 #include "memory-display.h"
17 #include "formats.h"
19 #include <gammu.h>
21 /**
22 * Prints location information about message.
24 void PrintSMSLocation(const GSM_SMSMessage *sms, const GSM_SMSFolders *folders)
26 printf(_("Location %i, folder \"%s\""),
27 sms->Location,
28 DecodeUnicodeConsole(folders->Folder[sms->Folder - 1].Name)
31 switch (sms->Memory) {
32 case MEM_SM:
33 printf(", %s", _("SIM memory"));
34 break;
35 case MEM_ME:
36 printf(", %s", _("phone memory"));
37 break;
38 case MEM_MT:
39 printf(", %s", _("phone or SIM memory"));
40 break;
41 default:
42 break;
45 if (sms->InboxFolder) {
46 printf(", %s", _("Inbox folder"));
49 printf("\n");
52 /**
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)
57 int i;
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:
63 case PBK_Number_Fax:
64 case PBK_Number_Pager:
65 case PBK_Number_Other:
66 if (mywstrncmp(List[i]->Entries[*pos].Text,number,-1)) {
67 return List[i];
69 default:
70 break;
74 return NULL;
77 /**
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)
82 #else
83 void PrintPhoneNumber(const unsigned char *number, const void *Info)
84 #endif
86 #ifdef GSM_ENABLE_BACKUP
87 const GSM_MemoryEntry *pbk;
88 int pos;
89 #endif
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);
98 if (pbk == NULL) {
99 /* Fall back to SIM */
100 pbk = SearchPhoneNumber(number, (const GSM_MemoryEntry **)Info->SIMPhonebook, &pos);
103 /* Nothing found */
104 if (pbk == NULL) return;
106 /* Print name */
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"));
113 break;
114 case PBK_Number_Fax:
115 printf(" (%s)", _("fax"));
116 break;
117 case PBK_Number_Pager:
118 printf(" (%s)", _("pager"));
119 break;
120 case PBK_Number_General:
121 printf(" (%s)", _("general"));
122 break;
123 default:
124 break;
126 switch (pbk->Entries[pos].Location) {
127 case PBK_Location_Home:
128 printf(" [%s]", _("home"));
129 break;
130 case PBK_Location_Work:
131 printf(" [%s]", _("work"));
132 break;
133 case PBK_Location_Unknown:
134 break;
136 #endif
139 #ifdef GSM_ENABLE_BACKUP
140 void DisplaySingleSMSInfo(GSM_SMSMessage sms, gboolean displaytext, gboolean displayudh, const GSM_Backup *Info)
141 #else
142 void DisplaySingleSMSInfo(GSM_SMSMessage sms, gboolean displaytext, gboolean displayudh, const void *Info)
143 #endif
145 GSM_SiemensOTASMSInfo SiemensOTA;
146 int i;
148 switch (sms.PDU) {
149 case SMS_Status_Report:
150 printf("%s\n", _("SMS status report"));
152 printf(LISTFORMAT, _("Status"));
153 switch (sms.State) {
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;
159 printf("\n");
161 printf(LISTFORMAT, _("Remote number"));
162 PrintPhoneNumber(sms.Number, Info);
163 printf("\n");
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, "));
174 } else {
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;
208 printf("\n");
209 break;
210 case SMS_Deliver:
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));
214 } else {
215 printf(LISTFORMAT "\"%s\"", _("SMSC number"), DecodeUnicodeConsole(sms.SMSC.Number));
216 if (sms.ReplyViaSameSMSC) printf("%s", _(" (set for reply)"));
217 printf("\n");
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
224 case 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)"));
246 break;
247 case SMS_Coding_Unicode_Compression :
248 printf("%s", _("Unicode (compression)"));
249 break;
250 case SMS_Coding_Default_No_Compression :
251 printf("%s", _("Default GSM alphabet (no compression)"));
252 break;
253 case SMS_Coding_Default_Compression :
254 printf("%s", _("Default GSM alphabet (compression)"));
255 break;
256 case SMS_Coding_8bit :
257 /* l10n: 8-bit message coding */
258 printf("%s", _("8-bit"));
259 break;
261 printf("\n");
262 if (sms.State==SMS_UnSent && sms.Memory==MEM_ME) {
263 } else {
264 printf(LISTFORMAT, ngettext("Remote number", "Remote numbers", sms.OtherNumbersNum + 1));
265 PrintPhoneNumber(sms.Number, Info);
266 for (i=0;i<sms.OtherNumbersNum;i++) {
267 printf(", ");
268 PrintPhoneNumber(sms.OtherNumbers[i], Info);
270 printf("\n");
272 printf(LISTFORMAT, _("Status"));
273 switch (sms.State) {
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;
279 printf("\n");
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) {
310 if (displayudh) {
311 printf(_(", part %i of %i"),sms.UDH.PartNumber,sms.UDH.AllParts);
312 } else {
313 printf(_(", %i parts"),sms.UDH.AllParts);
317 printf("\n");
319 if (displaytext) {
320 printf("\n");
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"));
325 } else {
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);
333 break;
334 #ifndef CHECK_CASES
335 default:
336 printf(_("Unknown PDU type: 0x%x\n"), sms.PDU);
337 break;
338 #endif
340 fflush(stdout);
343 #ifdef GSM_ENABLE_BACKUP
344 void DisplayMultiSMSInfo (GSM_MultiSMSMessage *sms, gboolean eachsms, gboolean ems, const GSM_Backup *Info, GSM_StateMachine *sm)
345 #else
346 void DisplayMultiSMSInfo (GSM_MultiSMSMessage *sms, gboolean eachsms, gboolean ems, const void *Info, GSM_StateMachine *sm)
347 #endif
349 GSM_SiemensOTASMSInfo SiemensOTA;
350 GSM_MultiPartSMSInfo SMSInfo;
351 gboolean RetVal,udhinfo=TRUE;
352 int j,i;
353 size_t Pos;
354 GSM_MemoryEntry pbk;
355 GSM_Error error;
357 /* GSM_DecodeMultiPartSMS returns if decoded SMS content correctly */
358 RetVal = GSM_DecodeMultiPartSMS(GSM_GetGlobalDebug(), &SMSInfo,sms,ems);
360 if (eachsms) {
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);
365 printf("\n");
366 } else {
367 for (j=0;j<sms->Number;j++) {
368 DisplaySingleSMSInfo(sms->SMS[j],!RetVal,udhinfo,Info);
369 printf("\n");
372 } else {
373 for (j=0;j<sms->Number;j++) {
374 DisplaySingleSMSInfo(sms->SMS[j],!RetVal,TRUE,Info);
375 printf("\n");
378 if (!RetVal) {
379 GSM_FreeMultiPartSMSInfo(&SMSInfo);
380 return;
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;
394 Pos = 0;
395 error = GSM_DecodeVCARD(GSM_GetGlobalDebug(), SMSInfo.Entries[i].File->Buffer, &Pos, &pbk, Nokia_VCard21);
396 if (error == ERR_NONE) {
397 PrintMemoryEntry(&pbk, sm);
399 } else {
400 printf("\n");
402 break;
403 case SMS_NokiaRingtone:
404 printf(_("Ringtone \"%s\"\n"),DecodeUnicodeConsole(SMSInfo.Entries[i].Ringtone->Name));
405 GSM_SaveRingtoneRttl(stdout,SMSInfo.Entries[i].Ringtone);
406 printf("\n");
407 #if 0
408 /* Disabled for now */
409 if (answer_yes("%s", _("Do you want to play it?")))
410 GSM_PlayRingtone(*SMSInfo.Entries[i].Ringtone);
411 #endif
412 break;
413 case SMS_NokiaCallerLogo:
414 printf("%s\n\n", _("Caller logo"));
415 GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
416 break;
417 case SMS_NokiaOperatorLogo:
418 printf(_("Operator logo for %s network"),
419 SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode);
420 printf(" (%s",
421 DecodeUnicodeConsole(GSM_GetNetworkName(SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode)));
422 printf(", %s)",
423 DecodeUnicodeConsole(GSM_GetCountryName(SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode)));
424 printf("\n\n");
425 GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
426 break;
427 case SMS_NokiaScreenSaverLong:
428 printf("%s\n", _("Screen saver"));
429 GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
430 break;
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]);
436 break;
437 case SMS_NokiaProfileLong:
438 printf("%s\n", _("Profile"));
439 GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
440 break;
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));
449 break;
450 case SMS_EMSFixedBitmap:
451 case SMS_EMSVariableBitmap:
452 GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
453 break;
454 case SMS_EMSAnimation:
455 /* Can't show animation, we show first frame */
456 GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
457 break;
458 case SMS_EMSPredefinedSound:
459 printf("\n" LISTFORMAT "%i\n", _("EMS sound ID"),SMSInfo.Entries[i].Number);
460 break;
461 case SMS_EMSPredefinedAnimation:
462 printf("\n" LISTFORMAT "%i\n", _("EMS animation ID"),SMSInfo.Entries[i].Number);
463 break;
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);
469 break;
470 case SMS_Text:
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:
481 case SMS_DisableFax:
482 case SMS_DisableEmail:
483 case SMS_EnableVoice:
484 case SMS_EnableFax:
485 case SMS_EnableEmail:
486 case SMS_VoidSMS:
487 case SMS_EMSSound10:
488 case SMS_EMSSound12:
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:
498 #ifndef CHECK_CASES
499 default:
500 #endif
501 printf("%s\n", _("Error"));
502 break;
505 printf("\n");
506 fflush(stdout);
507 GSM_FreeMultiPartSMSInfo(&SMSInfo);
511 GSM_Error DisplaySMSFrame(GSM_SMSMessage *SMS, GSM_StateMachine *sm)
513 GSM_Error error;
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) {
520 return error;
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);
554 printf("\n");
555 fflush(stdout);
556 return ERR_NONE;
559 /* How should editor hadle tabs in this file? Add editor commands here.
560 * vim: noexpandtab sw=8 ts=8 sts=8: