summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common/service/backup/backldif.c
Unidiff
Diffstat (limited to 'gammu/emb/common/service/backup/backldif.c') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/service/backup/backldif.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/gammu/emb/common/service/backup/backldif.c b/gammu/emb/common/service/backup/backldif.c
new file mode 100644
index 0000000..ab16160
--- a/dev/null
+++ b/gammu/emb/common/service/backup/backldif.c
@@ -0,0 +1,297 @@
1/* (c) 2003-2004 by Marcin Wiacek */
2
3#include <string.h>
4#include <ctype.h>
5
6#include "../../phone/nokia/nfunc.h"
7#include "../../phone/nokia/dct3/n7110.h"
8#include "../../misc/coding/coding.h"
9#include "../gsmlogo.h"
10#include "../gsmmisc.h"
11#include "backldif.h"
12
13#ifdef GSM_ENABLE_BACKUP
14
15static void SaveLDIFText(FILE *file, unsigned char *Name, unsigned char *Value)
16{
17 unsigned char Buffer[1000],Buffer2[1000];
18
19 if (EncodeUTF8(Buffer, Value)) {
20 // dbgprintf("%s\n",Buffer);
21 EncodeBASE64(Buffer, Buffer2, strlen(Buffer));
22 fprintf(file,"%s:: %s%c%c",Name,Buffer2,13,10);
23 } else {
24 fprintf(file,"%s: %s%c%c",Name,DecodeUnicodeString(Value),13,10);
25 }
26}
27
28GSM_Error SaveLDIF(char *FileName, GSM_Backup *backup)
29{
30 int i, j;
31 FILE *file;
32
33 file = fopen(FileName, "wb");
34 if (file == NULL) return ERR_CANTOPENFILE;
35
36 i=0;
37 while (backup->PhonePhonebook[i]!=NULL) {
38 for (j=0;j<backup->PhonePhonebook[i]->EntriesNum;j++) {
39 switch (backup->PhonePhonebook[i]->Entries[j].EntryType) {
40 case PBK_Text_Name:
41 SaveLDIFText(file, "dn", backup->PhonePhonebook[i]->Entries[j].Text);
42 break;
43 default:
44 break;
45 }
46 }
47 fprintf(file, "objectclass: top%c%c",13,10);
48 fprintf(file, "objectclass: person%c%c",13,10);
49 fprintf(file, "objectclass: organizationalPerson%c%c",13,10);
50 fprintf(file, "objectclass: inetOrgPerson%c%c",13,10);
51 fprintf(file, "objectclass: mozillaAbPersonObsolete%c%c",13,10);
52 for (j=0;j<backup->PhonePhonebook[i]->EntriesNum;j++) {
53 switch (backup->PhonePhonebook[i]->Entries[j].EntryType) {
54 case PBK_Text_Postal:
55 SaveLDIFText(file, "HomePostalAddress", backup->PhonePhonebook[i]->Entries[j].Text);
56 break;
57 case PBK_Text_URL:
58 SaveLDIFText(file, "homeurl", backup->PhonePhonebook[i]->Entries[j].Text);
59 break;
60 case PBK_Text_Name:
61 SaveLDIFText(file, "givenName", backup->PhonePhonebook[i]->Entries[j].Text);
62 SaveLDIFText(file, "cn", backup->PhonePhonebook[i]->Entries[j].Text);
63 break;
64 case PBK_Text_Note:
65 SaveLDIFText(file, "Description", backup->PhonePhonebook[i]->Entries[j].Text);
66 break;
67 case PBK_Number_Work:
68 SaveLDIFText(file, "workPhone", backup->PhonePhonebook[i]->Entries[j].Text);//not exist in Mozilla 1.4 win32
69 break;
70 case PBK_Number_Mobile:
71 SaveLDIFText(file, "mobile", backup->PhonePhonebook[i]->Entries[j].Text);
72 break;
73 case PBK_Number_Pager:
74 SaveLDIFText(file, "pager", backup->PhonePhonebook[i]->Entries[j].Text);
75 break;
76 case PBK_Number_Fax:
77 SaveLDIFText(file, "fax", backup->PhonePhonebook[i]->Entries[j].Text);//facsimileTelephoneNumber
78 break;
79 case PBK_Number_Home:
80 SaveLDIFText(file, "homePhone", backup->PhonePhonebook[i]->Entries[j].Text);
81 break;
82 case PBK_Number_General:
83 SaveLDIFText(file, "telephoneNumber", backup->PhonePhonebook[i]->Entries[j].Text);//work in Mozilla 1.4 win32
84 break;
85 case PBK_Text_Email:
86 SaveLDIFText(file, "mail", backup->PhonePhonebook[i]->Entries[j].Text);
87 break;
88 case PBK_Text_Email2:
89 SaveLDIFText(file, "mozillaSecondEmail", backup->PhonePhonebook[i]->Entries[j].Text);
90 break;
91 case PBK_Text_Custom1:
92 SaveLDIFText(file, "custom1", backup->PhonePhonebook[i]->Entries[j].Text);
93 break;
94 case PBK_Text_Custom2:
95 SaveLDIFText(file, "custom2", backup->PhonePhonebook[i]->Entries[j].Text);
96 break;
97 case PBK_Text_Custom3:
98 SaveLDIFText(file, "custom3", backup->PhonePhonebook[i]->Entries[j].Text);
99 break;
100 case PBK_Text_Custom4:
101 SaveLDIFText(file, "custom4", backup->PhonePhonebook[i]->Entries[j].Text);
102 break;
103 case PBK_Text_Company:
104 SaveLDIFText(file, "o", backup->PhonePhonebook[i]->Entries[j].Text);
105 break;
106 case PBK_Text_JobTitle:
107 SaveLDIFText(file, "title", backup->PhonePhonebook[i]->Entries[j].Text);
108 break;
109 case PBK_Text_StreetAddress:
110 SaveLDIFText(file, "homePostalAddress", backup->PhonePhonebook[i]->Entries[j].Text);
111 break;
112 case PBK_Text_City:
113 SaveLDIFText(file, "mozillaHomeLocalityName", backup->PhonePhonebook[i]->Entries[j].Text);
114 break;
115 case PBK_Text_State:
116 SaveLDIFText(file, "mozillaHomeState", backup->PhonePhonebook[i]->Entries[j].Text);
117 break;
118 case PBK_Text_Zip:
119 SaveLDIFText(file, "mozillaHomePostalCode", backup->PhonePhonebook[i]->Entries[j].Text);
120 break;
121 case PBK_Text_Country:
122 SaveLDIFText(file, "mozillaHomeCountryName", backup->PhonePhonebook[i]->Entries[j].Text);
123 break;
124 case PBK_Number_Other:
125 case PBK_Caller_Group:
126 case PBK_RingtoneID:
127 case PBK_PictureID:
128 case PBK_Date:
129 case PBK_RingtoneFileSystemID:
130 case PBK_Text_UserID:
131 case PBK_SMSListID:
132 case PBK_Category:
133 case PBK_Private:
134 case PBK_Text_LastName:
135 case PBK_Text_FirstName:
136 dbgprintf("Feature missed\n");
137 break;
138 }
139 }
140 fprintf(file, "%c%c",13,10);
141 i++;
142 }
143 fclose(file);
144 return ERR_NONE;
145}
146
147static bool ReadLDIFText(char *Buffer, char *Start, char *Value)
148{
149 unsigned char Buffer2[1000],buff[200];
150 int i;
151
152 Value[0] = 0x00;
153
154 strcpy(buff,Start);
155 strcat(buff,":: ");
156 if (!strncmp(Buffer,buff,strlen(buff))) {
157 i = DecodeBASE64(Buffer+strlen(Start)+3, Buffer2, strlen(Buffer)-(strlen(Start)+3));
158 dbgprintf("Text after DecodeBASE64 is \"%s\"\n",Buffer2);
159 DecodeUTF8(Value, Buffer2, i);
160 dbgprintf("Text after DecodeUTF8 is \"%s\"\n",DecodeUnicodeString(Value));
161 return true;
162 }
163 strcpy(buff,Start);
164 strcat(buff,": ");
165 if (!strncmp(Buffer,buff,strlen(buff))) {
166 EncodeUnicode(Value,Buffer+strlen(Start)+2,strlen(Buffer)-(strlen(Start)+2));
167 dbgprintf("Text after EncodeUnicode is \"%s\"\n",DecodeUnicodeString(Value));
168 return true;
169 }
170 return false;
171}
172
173static GSM_Error GSM_DecodeLDIFEntry(unsigned char *Buffer, int *Pos, GSM_MemoryEntry *Pbk)
174{
175 unsigned char Line[2000],Buff[2000],Buff2[2000];
176 int Level = 0;
177
178 Buff[0] = 0;
179 Pbk->EntriesNum = 0;
180
181 while (1) {
182 MyGetLine(Buffer, Pos, Line, strlen(Buffer));
183 if (strlen(Line) == 0) break;
184 switch (Level) {
185 case 0:
186 if (ReadLDIFText(Line, "objectclass", Buff)) {
187 sprintf(Buff2,"%s",DecodeUnicodeString(Buff));
188 if (!strcmp("mozillaAbPersonObsolete",Buff2)) {
189 dbgprintf("level1\n");
190 Level = 1;
191 }
192 }
193 break;
194 case 1:
195 if (ReadLDIFText(Line, "dn", Buff)) {
196 dbgprintf("entries num is %i\n",Pbk->EntriesNum);
197 if (Pbk->EntriesNum == 0) return ERR_EMPTY;
198 return ERR_NONE;
199 }
200 if (ReadLDIFText(Line, "givenName", Buff)) {
201 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
202 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Name;
203 Pbk->EntriesNum++;
204 }
205 if (ReadLDIFText(Line, "telephoneNumber", Buff)) {
206 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
207 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
208 Pbk->EntriesNum++;
209 }
210 if (ReadLDIFText(Line, "mobile", Buff)) {
211 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
212 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile;
213 Pbk->EntriesNum++;
214 }
215 if (ReadLDIFText(Line, "workPhone", Buff)) {
216 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
217 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Work;
218 Pbk->EntriesNum++;
219 }
220 if (ReadLDIFText(Line, "fax", Buff)) {
221 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
222 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Fax;
223 Pbk->EntriesNum++;
224 }
225 if (ReadLDIFText(Line, "homePhone",Buff)) {
226 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
227 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Home;
228 Pbk->EntriesNum++;
229 }
230 if (ReadLDIFText(Line, "Description", Buff)) {
231 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
232 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Note;
233 Pbk->EntriesNum++;
234 }
235 if (ReadLDIFText(Line, "HomePostalAddress", Buff)) {
236 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
237 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal;
238 Pbk->EntriesNum++;
239 }
240 if (ReadLDIFText(Line, "mail", Buff)) {
241 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
242 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email;
243 Pbk->EntriesNum++;
244 }
245 if (ReadLDIFText(Line, "homeurl", Buff)) {
246 CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
247 Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_URL;
248 Pbk->EntriesNum++;
249 }
250 /* FIXME: add rest */
251 break;
252 }
253 }
254
255 dbgprintf("entries num is %i\n",Pbk->EntriesNum);
256 if (Pbk->EntriesNum == 0) return ERR_EMPTY;
257 return ERR_NONE;
258}
259
260GSM_Error LoadLDIF(char *FileName, GSM_Backup *backup)
261{
262 GSM_File File;
263 GSM_Error error;
264 GSM_MemoryEntryPbk;
265 int numPbk = 0, Pos;
266
267 File.Buffer = NULL;
268 error = GSM_ReadFile(FileName, &File);
269 if (error != ERR_NONE) return error;
270
271 Pos = 0;
272 while (1) {
273 error = GSM_DecodeLDIFEntry(File.Buffer, &Pos, &Pbk);
274 if (error == ERR_EMPTY) break;
275 if (error != ERR_NONE) return error;
276 if (numPbk < GSM_BACKUP_MAX_PHONEPHONEBOOK) {
277 backup->PhonePhonebook[numPbk] = malloc(sizeof(GSM_MemoryEntry));
278 if (backup->PhonePhonebook[numPbk] == NULL) return ERR_MOREMEMORY;
279 backup->PhonePhonebook[numPbk + 1] = NULL;
280 } else {
281 dbgprintf("Increase GSM_BACKUP_MAX_PHONEPHONEBOOK\n");
282 return ERR_MOREMEMORY;
283 }
284 memcpy(backup->PhonePhonebook[numPbk],&Pbk,sizeof(GSM_MemoryEntry));
285 backup->PhonePhonebook[numPbk]->Location = numPbk + 1;
286 backup->PhonePhonebook[numPbk]->MemoryType = MEM_ME;
287 numPbk++;
288 }
289
290 return ERR_NONE;
291}
292
293#endif
294
295/* How should editor hadle tabs in this file? Add editor commands here.
296 * vim: noexpandtab sw=8 ts=8 sts=8:
297 */