stackcheck: Fixed caller function detection
[gnokii.git] / common / gsm-phonebook.c
1 /*
2
3   G N O K I I
4
5   A Linux/Unix toolset and driver for Nokia mobile phones.
6
7   Released under the terms of the GNU GPL, see file COPYING for more details.
8         
9   Functions for manipulating phonebook
10   
11 */
12
13 #include "config.h"
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <ctype.h>
19 #include <sys/stat.h>
20
21 #ifdef WIN32
22   #include "misc_win32.h"
23 #endif
24
25 #include "gsm-api.h"
26 #include "gsm-coding.h"
27
28 char *GSM_GetVCARD(GSM_PhonebookEntry *entry, int version) {
29
30   static char Buffer[1000]="";
31
32   u8 buffer[50*3];
33
34   int len=0,i;
35
36   bool pref=false;
37
38   char memory_type_string[20];
39   
40   GetMemoryTypeString(memory_type_string, &entry->MemoryType);
41                                         
42   switch (version) {
43     case 10:
44       len+=sprintf(Buffer+len,_("BEGIN:VCARD%c%c"),13,10);
45       len+=sprintf(Buffer+len,_("N:%s%c%c"),entry->Name,13,10);
46       if (*entry->Number)
47         len+=sprintf(Buffer+len,_("TEL:%s%c%c"),entry->Number,13,10);
48       len+=sprintf(Buffer+len,_("END:VCARD%c%c"),13,10);
49       break;
50     case 21:
51       len+=sprintf(Buffer+len,_("BEGIN:VCARD%c%cVERSION:2.1%c%c"),13,10,13,10);
52
53       EncodeUTF8(buffer,entry->Name,strlen(entry->Name));
54       if (strlen(entry->Name)==strlen(buffer)) {
55         len+=sprintf(Buffer+len,_("N:%s%c%c"),entry->Name,13,10);
56       } else {
57         len+=sprintf(Buffer+len,_("N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c"),buffer,13,10);
58       }
59
60       if (*entry->Number) {
61         len+=sprintf(Buffer+len,_("TEL;PREF:%s%c%c"),entry->Number,13,10);
62         pref=true;
63       }
64                 
65       /* Rest of the subentries */
66       for (i = 0; i < entry->SubEntriesCount; i++) {
67         switch( entry->SubEntries[i].EntryType ) {
68           case GSM_Number:
69             switch( entry->SubEntries[i].NumberType ) {
70               case GSM_General :len+=sprintf(Buffer+len,_("TEL"));break;
71               case GSM_Home    :len+=sprintf(Buffer+len,_("TEL;HOME;VOICE"));break;
72               case GSM_Mobile  :len+=sprintf(Buffer+len,_("TEL;CELL"));break;
73               case GSM_Work    :len+=sprintf(Buffer+len,_("TEL;WORK;VOICE"));break;
74               case GSM_Fax     :len+=sprintf(Buffer+len,_("TEL;FAX"));break;
75               default          :break;
76             }
77             if (!pref) {
78               len+=sprintf(Buffer+len,_(";PREF"));
79               pref=true;
80             }
81             break;
82           case GSM_Note  :len+=sprintf(Buffer+len,_("NOTE"));break;
83           case GSM_Postal:
84             len+=sprintf(Buffer+len,_("LABEL"));
85             EncodeUTF8(buffer,entry->SubEntries[i].data.Number,strlen(entry->SubEntries[i].data.Number));
86             if (strlen(entry->SubEntries[i].data.Number)==strlen(buffer)) {
87               len+=sprintf(Buffer+len,_(":%s%c%c"),entry->SubEntries[i].data.Number,13,10);
88             } else {
89               len+=sprintf(Buffer+len,_(";CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c"),buffer,13,10);
90             }
91             len+=sprintf(Buffer+len,_("ADR"));
92             break;
93           case GSM_Email :len+=sprintf(Buffer+len,_("EMAIL"));break;
94           default        :break;
95         }
96
97         EncodeUTF8(buffer,entry->SubEntries[i].data.Number,strlen(entry->SubEntries[i].data.Number));
98         if (strlen(entry->SubEntries[i].data.Number)==strlen(buffer)) {
99           len+=sprintf(Buffer+len,_(":%s%c%c"),entry->SubEntries[i].data.Number,13,10);
100         } else {
101           len+=sprintf(Buffer+len,_(";CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c"),buffer,13,10);
102         }
103       } 
104       len+=sprintf(Buffer+len,_("END:VCARD%c%c"),13,10);
105       break;
106     case 30:
107       len+=sprintf(Buffer+len,_("BEGIN:VCARD\nVERSION:3.0\n"));
108       len+=sprintf(Buffer+len,_("FN:%s\n"),entry->Name);
109       len+=sprintf(Buffer+len,_("TEL;PREF:%s\n"),entry->Number);
110       len+=sprintf(Buffer+len,_("X_GSM_STORE_AT:%s%i\n"),memory_type_string,entry->Location);
111       len+=sprintf(Buffer+len,_("X_GSM_CALLERGROUP:%i\n"),entry->Group);
112       for( i = 0; i <  entry->SubEntriesCount; i++ )
113       {
114         if( entry->SubEntries[i].EntryType == GSM_Number ) {
115             len+=sprintf(Buffer+len,_("TEL;UNKNOWN_%d:%s\n"),
116               entry->SubEntries[i].NumberType,
117               entry->SubEntries[i].data.Number );
118         }
119       }
120       len+=sprintf(Buffer+len,_("END:VCARD\n\n"));
121       break;
122   }
123
124   return Buffer;
125 }
126
127 int GSM_SavePhonebookEntryToSMS(GSM_MultiSMSMessage *SMS,
128                                 GSM_PhonebookEntry *entry, int version)
129 {
130   char Buffer[1000]="";
131   int length;
132   GSM_UDH UDH=GSM_NoUDH;
133   GSM_Coding_Type Coding=GSM_Coding_Default;
134
135   sprintf(Buffer,GSM_GetVCARD(entry,version));  
136
137   switch (version) {
138     case 10:
139       /* 1 SMS: no UDH */
140       if (strlen(Buffer)<=160-8) { //8==length of ..SCKE2.
141         sprintf(Buffer,"//SCKE2 ");  
142         sprintf(Buffer,GSM_GetVCARD(entry,version));  
143       } else {
144         UDH=GSM_PhonebookUDH; //FIXME:is this true ?
145 //        Coding=GSM_Coding_8bit; //FIXME:is this true ?
146       }
147       break;
148     case 21:
149       /* 1 SMS: no UDH */
150       if (strlen(Buffer)<=160-12) { //12==length of ..SCKL...
151         sprintf(Buffer,_("//SCKL23F4%c%c"),13,10);  
152         sprintf(Buffer,GSM_GetVCARD(entry,version));  
153       } else {
154         UDH=GSM_PhonebookUDH;
155 //        Coding=GSM_Coding_8bit; //can be 8 bit, but no abligatory
156       }
157       break;
158   }
159
160   length=strlen(Buffer);
161   GSM_MakeMultiPartSMS2(SMS,Buffer,length, UDH, Coding);
162
163   return 0;
164 }