/* SynCE plugin -- SynCE Support for Claws Mail
*
* Copyright (C) 2005-2007 Holger Berndt
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include "contact_ids.h"
#include "synce_rapi.h"
#include "synce_comp.h"
static gboolean process_database(HANDLE, DWORD);
static gboolean process_record(PCEPROPVAL, DWORD);
static gboolean process_property(PCEPROPVAL);
static void free_SynCERecord(void);
static void clear_record(void);
static SynCERecord *record = NULL;
gboolean query_wince(int synce_log_level)
{
CEDB_FIND_DATA *find_data = NULL;
WORD db_count = 0;
WORD iword;
HANDLE db;
record = g_new0(SynCERecord,1);
record->first_name = NULL;
record->last_name = NULL;
record->email_addresses = NULL;
synce_log_set_level(synce_log_level);
if(CeRapiInit() != S_OK) {
g_warning("SynCE Plugin: CeRapiInit failed");
return FALSE;
}
if(CeFindAllDatabases(0, 0xffff, &db_count, &find_data) == FALSE) {
g_warning("SynCE Plugin: CeFindAllDatabases failed");
return FALSE;
}
for(iword = 0; iword < db_count; iword++) {
if((db = CeOpenDatabase(&find_data[iword].OidDb, NULL,
0, CEDB_AUTOINCREMENT, 0)) == INVALID_HANDLE_VALUE) {
g_warning("SynCE Plugin: CeOpenDatabase failed");
continue;
}
if(process_database(db, find_data[iword].DbInfo.wNumRecords) == FALSE)
g_warning("SynCE Plugin: process_database failed");
if(CeCloseHandle(db) == FALSE)
g_warning("SynCE Plugin: CeCloseHandle failed");
}
if(CeRapiFreeBuffer(find_data) != S_OK)
g_warning("SynCE Plugin: CeRapiFreeBuffer failed");
if(CeRapiUninit() != S_OK)
g_warning("SynCE Plugin: CeRapiUninit failed");
free_SynCERecord();
return TRUE;
}
static gboolean process_database(HANDLE db, DWORD num_records)
{
LPBYTE values = NULL;
DWORD buffer_size = 0;
unsigned int ui;
WORD property_count;
CEOID oid;
for(ui = 0; ui < num_records; ui++) {
if((oid = CeReadRecordProps(db, CEDB_ALLOWREALLOC, &property_count, NULL,
(LPBYTE*)&values, &buffer_size)) == 0) {
g_warning("SynCE Plugin: CeReadRecordProps failed");
return FALSE;
}
if((process_record((PCEPROPVAL)values, property_count)) == FALSE) {
g_warning("SynCE Plugin: process_record failed");
return FALSE;
}
}
return TRUE;
}
static gboolean process_record(PCEPROPVAL value, DWORD property_count)
{
DWORD idword;
for(idword = 0; idword < property_count; idword++) {
if((process_property(value+idword)) == FALSE) {
g_warning("SynCE Plugin: process_properties failed");
return FALSE;
}
}
if(collect_record(record) == FALSE)
g_warning("SynCE Plugin: collect_record failed");
clear_record();
return TRUE;
}
static gboolean process_property(PCEPROPVAL value)
{
unsigned int id;
unsigned int type;
id = value->propid >> 16;
type = value->propid & 0xffff;
if(type == CEVT_LPWSTR) {
switch(id) {
case ID_FIRST_NAME:
record->first_name = wstr_to_ascii(value->val.lpwstr);
break;
case ID_LAST_NAME:
record->last_name = wstr_to_ascii(value->val.lpwstr);
break;
case ID_EMAIL:
case ID_EMAIL2:
case ID_EMAIL3:
record->email_addresses = g_slist_prepend(record->email_addresses,
wstr_to_ascii(value->val.lpwstr));
break;
}
}
return TRUE;
}
static void free_SynCERecord(void)
{
clear_record();
g_free(record);
record = NULL;
}
static void clear_record(void)
{
if(record->first_name != NULL) {
free(record->first_name);
record->first_name = NULL;
}
if(record->last_name != NULL) {
free(record->last_name);
record->last_name = NULL;
}
if(record->email_addresses != NULL) {
GSList *walk;
gchar *address;
walk = record->email_addresses;
for(; walk != NULL; walk = g_slist_next(walk)) {
address = (gchar*) walk->data;
if(address != NULL) {
free(address);
address = NULL;
}
}
g_slist_free(record->email_addresses);
record->email_addresses = NULL;
}
}