From 88b0d33b8b0b1f6ae320cfc863ca6a47fa8fec22 Mon Sep 17 00:00:00 2001 From: zautrix Date: Sat, 07 Aug 2004 17:24:40 +0000 Subject: Initial revision --- (limited to 'gammu/emb/common/service/backup/backldif.c') 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 @@ +/* (c) 2003-2004 by Marcin Wiacek */ + +#include +#include + +#include "../../phone/nokia/nfunc.h" +#include "../../phone/nokia/dct3/n7110.h" +#include "../../misc/coding/coding.h" +#include "../gsmlogo.h" +#include "../gsmmisc.h" +#include "backldif.h" + +#ifdef GSM_ENABLE_BACKUP + +static void SaveLDIFText(FILE *file, unsigned char *Name, unsigned char *Value) +{ + unsigned char Buffer[1000],Buffer2[1000]; + + if (EncodeUTF8(Buffer, Value)) { +// dbgprintf("%s\n",Buffer); + EncodeBASE64(Buffer, Buffer2, strlen(Buffer)); + fprintf(file,"%s:: %s%c%c",Name,Buffer2,13,10); + } else { + fprintf(file,"%s: %s%c%c",Name,DecodeUnicodeString(Value),13,10); + } +} + +GSM_Error SaveLDIF(char *FileName, GSM_Backup *backup) +{ + int i, j; + FILE *file; + + file = fopen(FileName, "wb"); + if (file == NULL) return ERR_CANTOPENFILE; + + i=0; + while (backup->PhonePhonebook[i]!=NULL) { + for (j=0;jPhonePhonebook[i]->EntriesNum;j++) { + switch (backup->PhonePhonebook[i]->Entries[j].EntryType) { + case PBK_Text_Name: + SaveLDIFText(file, "dn", backup->PhonePhonebook[i]->Entries[j].Text); + break; + default: + break; + } + } + fprintf(file, "objectclass: top%c%c",13,10); + fprintf(file, "objectclass: person%c%c",13,10); + fprintf(file, "objectclass: organizationalPerson%c%c",13,10); + fprintf(file, "objectclass: inetOrgPerson%c%c",13,10); + fprintf(file, "objectclass: mozillaAbPersonObsolete%c%c",13,10); + for (j=0;jPhonePhonebook[i]->EntriesNum;j++) { + switch (backup->PhonePhonebook[i]->Entries[j].EntryType) { + case PBK_Text_Postal: + SaveLDIFText(file, "HomePostalAddress", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_URL: + SaveLDIFText(file, "homeurl", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Name: + SaveLDIFText(file, "givenName", backup->PhonePhonebook[i]->Entries[j].Text); + SaveLDIFText(file, "cn", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Note: + SaveLDIFText(file, "Description", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Number_Work: + SaveLDIFText(file, "workPhone", backup->PhonePhonebook[i]->Entries[j].Text);//not exist in Mozilla 1.4 win32 + break; + case PBK_Number_Mobile: + SaveLDIFText(file, "mobile", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Number_Pager: + SaveLDIFText(file, "pager", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Number_Fax: + SaveLDIFText(file, "fax", backup->PhonePhonebook[i]->Entries[j].Text);//facsimileTelephoneNumber + break; + case PBK_Number_Home: + SaveLDIFText(file, "homePhone", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Number_General: + SaveLDIFText(file, "telephoneNumber", backup->PhonePhonebook[i]->Entries[j].Text);//work in Mozilla 1.4 win32 + break; + case PBK_Text_Email: + SaveLDIFText(file, "mail", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Email2: + SaveLDIFText(file, "mozillaSecondEmail", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Custom1: + SaveLDIFText(file, "custom1", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Custom2: + SaveLDIFText(file, "custom2", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Custom3: + SaveLDIFText(file, "custom3", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Custom4: + SaveLDIFText(file, "custom4", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Company: + SaveLDIFText(file, "o", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_JobTitle: + SaveLDIFText(file, "title", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_StreetAddress: + SaveLDIFText(file, "homePostalAddress", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_City: + SaveLDIFText(file, "mozillaHomeLocalityName", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_State: + SaveLDIFText(file, "mozillaHomeState", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Zip: + SaveLDIFText(file, "mozillaHomePostalCode", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Text_Country: + SaveLDIFText(file, "mozillaHomeCountryName", backup->PhonePhonebook[i]->Entries[j].Text); + break; + case PBK_Number_Other: + case PBK_Caller_Group: + case PBK_RingtoneID: + case PBK_PictureID: + case PBK_Date: + case PBK_RingtoneFileSystemID: + case PBK_Text_UserID: + case PBK_SMSListID: + case PBK_Category: + case PBK_Private: + case PBK_Text_LastName: + case PBK_Text_FirstName: + dbgprintf("Feature missed\n"); + break; + } + } + fprintf(file, "%c%c",13,10); + i++; + } + fclose(file); + return ERR_NONE; +} + +static bool ReadLDIFText(char *Buffer, char *Start, char *Value) +{ + unsigned char Buffer2[1000],buff[200]; + int i; + + Value[0] = 0x00; + + strcpy(buff,Start); + strcat(buff,":: "); + if (!strncmp(Buffer,buff,strlen(buff))) { + i = DecodeBASE64(Buffer+strlen(Start)+3, Buffer2, strlen(Buffer)-(strlen(Start)+3)); + dbgprintf("Text after DecodeBASE64 is \"%s\"\n",Buffer2); + DecodeUTF8(Value, Buffer2, i); + dbgprintf("Text after DecodeUTF8 is \"%s\"\n",DecodeUnicodeString(Value)); + return true; + } + strcpy(buff,Start); + strcat(buff,": "); + if (!strncmp(Buffer,buff,strlen(buff))) { + EncodeUnicode(Value,Buffer+strlen(Start)+2,strlen(Buffer)-(strlen(Start)+2)); + dbgprintf("Text after EncodeUnicode is \"%s\"\n",DecodeUnicodeString(Value)); + return true; + } + return false; +} + +static GSM_Error GSM_DecodeLDIFEntry(unsigned char *Buffer, int *Pos, GSM_MemoryEntry *Pbk) +{ + unsigned char Line[2000],Buff[2000],Buff2[2000]; + int Level = 0; + + Buff[0] = 0; + Pbk->EntriesNum = 0; + + while (1) { + MyGetLine(Buffer, Pos, Line, strlen(Buffer)); + if (strlen(Line) == 0) break; + switch (Level) { + case 0: + if (ReadLDIFText(Line, "objectclass", Buff)) { + sprintf(Buff2,"%s",DecodeUnicodeString(Buff)); + if (!strcmp("mozillaAbPersonObsolete",Buff2)) { + dbgprintf("level1\n"); + Level = 1; + } + } + break; + case 1: + if (ReadLDIFText(Line, "dn", Buff)) { + dbgprintf("entries num is %i\n",Pbk->EntriesNum); + if (Pbk->EntriesNum == 0) return ERR_EMPTY; + return ERR_NONE; + } + if (ReadLDIFText(Line, "givenName", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Name; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "telephoneNumber", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "mobile", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "workPhone", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Work; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "fax", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Fax; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "homePhone",Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Home; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "Description", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Note; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "HomePostalAddress", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "mail", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email; + Pbk->EntriesNum++; + } + if (ReadLDIFText(Line, "homeurl", Buff)) { + CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff); + Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_URL; + Pbk->EntriesNum++; + } + /* FIXME: add rest */ + break; + } + } + + dbgprintf("entries num is %i\n",Pbk->EntriesNum); + if (Pbk->EntriesNum == 0) return ERR_EMPTY; + return ERR_NONE; +} + +GSM_Error LoadLDIF(char *FileName, GSM_Backup *backup) +{ + GSM_File File; + GSM_Error error; + GSM_MemoryEntry Pbk; + int numPbk = 0, Pos; + + File.Buffer = NULL; + error = GSM_ReadFile(FileName, &File); + if (error != ERR_NONE) return error; + + Pos = 0; + while (1) { + error = GSM_DecodeLDIFEntry(File.Buffer, &Pos, &Pbk); + if (error == ERR_EMPTY) break; + if (error != ERR_NONE) return error; + if (numPbk < GSM_BACKUP_MAX_PHONEPHONEBOOK) { + backup->PhonePhonebook[numPbk] = malloc(sizeof(GSM_MemoryEntry)); + if (backup->PhonePhonebook[numPbk] == NULL) return ERR_MOREMEMORY; + backup->PhonePhonebook[numPbk + 1] = NULL; + } else { + dbgprintf("Increase GSM_BACKUP_MAX_PHONEPHONEBOOK\n"); + return ERR_MOREMEMORY; + } + memcpy(backup->PhonePhonebook[numPbk],&Pbk,sizeof(GSM_MemoryEntry)); + backup->PhonePhonebook[numPbk]->Location = numPbk + 1; + backup->PhonePhonebook[numPbk]->MemoryType = MEM_ME; + numPbk++; + } + + return ERR_NONE; +} + +#endif + +/* How should editor hadle tabs in this file? Add editor commands here. + * vim: noexpandtab sw=8 ts=8 sts=8: + */ -- cgit v0.9.0.2