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