8
class People.Client.Friend {
10
private Backend.ContactSourceFactory factory;
11
private Backend.ContactSource ab;
13
private static Gee.Map<string, string> ns_to_desc;
16
ns_to_desc = new HashMap<string, string> (str_hash, str_equal, str_equal);
17
ns_to_desc.set ("identity.name.first", "First name");
18
ns_to_desc.set ("identity.name.middle", "Middle name");
19
ns_to_desc.set ("identity.name.last", "Last name");
20
ns_to_desc.set ("communication.phone.home", "Home phone");
21
ns_to_desc.set ("communication.phone.work", "Work phone");
22
ns_to_desc.set ("communication.phone.mobile", "Mobile phone");
23
ns_to_desc.set ("communication.email.home", "Home email");
24
ns_to_desc.set ("communication.email.work", "Work email");
26
factory = new Backend.Sqlite.ContactSourceFactory ();
28
Map<string, string> parameters =
29
new HashMap<string, string> (str_hash, str_equal, str_equal);
30
parameters.set ("db-path", "/tmp/people-sqlite.db");
33
ab = factory.request_contact_source (parameters);
34
} catch (Backend.ContactSourceFactoryError e) {
35
stdout.printf ("failed to open the Address Book");
41
AsyncSearch<Backend.Contact> search = ((Backend.DumpableContactSource) ab).dump ();
42
search.hit_found += list_hit_found_callback;
43
search.done += list_done_callback;
47
private static void list_hit_found_callback (AsyncSearch<Backend.Contact> search, Backend.Contact contact) {
48
var fields = new Gee.HashSet<string> (str_hash, str_equal);
49
fields.add ("identity.name.first");
50
contact.get_fields (fields).add_callback (list_first_name_callback, contact);
53
private static void list_done_callback (AsyncSearch search) {
57
private static void list_first_name_callback (AsyncOperation<Gee.Map<string, string> >op, void* data) {
58
var contact = (Backend.Contact) data;
59
stdout.printf ("- [%s]\t%s\n", contact.id, op.get_result ().get ("identity.name.first"));
64
public void display (string id) {
65
ab.request_contact (id).add_callback (display_request_contact_callback);
68
private void display_request_contact_callback (AsyncOperation<Backend.Contact>op) {
69
var contact = op.get_result ();
70
contact.get_fields (ns_to_desc.get_keys ()).add_callback (display_get_fields_callback, contact);
73
private void display_get_fields_callback (AsyncOperation<Gee.Map<string, string> >op, void* data) {
74
var contact = (Backend.Contact) data;
76
var fields = op.get_result ();
77
stdout.printf ("%s\t[%s]\n", contact.id, fields.get ("identity.name.first"));
78
foreach (string field in fields.get_keys ()) {
79
stdout.printf ("%s: %s\n", ns_to_desc.get (field), fields.get (field));
82
warning ("%s", e.message);
85
/* end of --display */
88
public void create() {
89
ab.request_contact (null).add_callback(create_request_contact_callback);
92
private void create_request_contact_callback(AsyncOperation<Backend.Contact>op) {
93
var contact = op.get_result ();
94
contact.get_definable_fields ().add_callback (create_get_definable_fields_callback, contact);
97
private void create_get_definable_fields_callback(AsyncOperation<Gee.Set<string> > op, void* data) {
98
var contact = (Backend.Contact) data;
100
var definable = op.get_result ();
101
contact.set_data ("definable", definable);
102
do_create_contact (contact);
104
warning ("%s", e.message);
108
private void do_create_contact (Backend.Contact contact) {
109
Gee.Map<string, string> fields = new HashMap<string, string> (str_hash, str_equal, str_equal);
110
var definable = (Gee.Set<string>) contact.get_data ("definable");
112
foreach(string field in definable) {
113
var value = get_entry ("%s: ".printf (ns_to_desc.get (field)));
116
fields.set (field, value);
119
contact.set_fields (fields).add_callback (create_contact_callback, contact);
122
private static void create_contact_callback(AsyncOperation<Gee.Set<string> > op, void* data) {
123
var contact = (Backend.Contact) data;
124
stdout.printf ("Contact created with %s.\n", contact.id);
126
/* end of --create */
129
public void @delete (string id) {
130
ab.request_contact (id).add_callback (delete_request_contact_callback);
133
private void delete_request_contact_callback (AsyncOperation<Backend.Contact> op) {
134
var contact = op.get_result ();
135
contact.delete ().add_callback (delete_contact_callback, contact.id);
138
private void delete_contact_callback (AsyncOperation<bool> op, void* data) {
139
var id = (string) data;
140
stdout.printf ("Contact %s deleted.\n", id);
142
/* end of --delete */
145
public void modify (string id) {
146
ab.request_contact (id).add_callback (modify_request_contact_callback);
149
private void modify_request_contact_callback(AsyncOperation<Backend.Contact> op) {
150
var contact = op.get_result ();
151
contact.get_definable_fields ().add_callback (modify_get_definable_fields_callback, contact);
154
private void modify_get_definable_fields_callback (AsyncOperation<Gee.Set<string> > op, void* data) {
155
var contact = (Backend.Contact) data;
156
contact.set_data ("definable", op.get_result());
157
contact.get_defined_fields ().add_callback (modify_get_defined_fields_callback, contact);
160
private void modify_get_defined_fields_callback (AsyncOperation<Gee.Set<string> > op, void* data) {
161
var contact = (Backend.Contact) data;
162
contact.get_fields (op.get_result ()).add_callback (modify_get_fields_callback, contact);
165
private void modify_get_fields_callback (AsyncOperation<Gee.Map<string, string> > op, void* data) {
166
var contact = (Backend.Contact) data;
167
do_modify_contact (contact, op.get_result ());
170
private void do_modify_contact(Backend.Contact contact, Gee.Map<string, string> defined_fields) {
171
Gee.Map<string, string> fields = new HashMap<string, string> (str_hash, str_equal, str_equal);
172
var definable = (Gee.Set<string>) contact.get_data("definable");
174
foreach (string field in definable) {
175
string current = defined_fields.get (field);
176
if (current == null) current = "undefined";
178
var value = get_entry ("%s [%s]: ".printf (ns_to_desc.get (field), current));
181
if (value == "*") value = null;
182
fields.set (field, value);
186
contact.set_fields (fields).add_callback (modify_contact_callback, contact.id);
189
private void modify_contact_callback(AsyncOperation<Gee.Map<string, string> > op, void* data) {
190
var id = (string) data;
191
stdout.printf ("Contact %s was modified.\n", id);
193
/* end of --modify */
196
* Gets a text entry from the user.
198
* @param prompt the message prompted to the user
199
* @return a string containing the user entry or <code>null</code> if
200
* no entry was specified by the user
202
private static string? get_entry(string? prompt=null) {
203
var s = new GLib.StringBuilder ();
206
stdout.printf (prompt);
209
var c = (char) stdin.getc();
220
public static int main (string[] args) {
221
var friend = new Friend();
223
foreach (string arg in args) {
224
if (arg == "--list") {
227
} else if (arg == "--create") {
230
} else if (arg == "--delete") {
231
var id = get_entry ("Contact id: ");
236
} else if (arg == "--modify") {
237
var id = get_entry ("Contact id: ");
242
} else if (arg == "--display") {
243
var id = get_entry ("Contact id: ");
252
stdout.printf("Available options are:\n\n");
253
stdout.printf("\t--list lists the contacts\n");
254
stdout.printf("\t--display displays informations for a contact\n");
256
stdout.printf("\v\t--create creates a new contact\n");
257
stdout.printf("\t--delete deletes a contact\n");
258
stdout.printf("\t--modify modifies a contact (enter * to delete a field)\n");
260
stdout.printf("\v\t--help displays that help\n\n");