summaryrefslogtreecommitdiffstats
path: root/src/MobileSync.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/MobileSync.c')
-rw-r--r--src/MobileSync.c179
1 files changed, 136 insertions, 43 deletions
diff --git a/src/MobileSync.c b/src/MobileSync.c
index 2e574d2..ae22f4b 100644
--- a/src/MobileSync.c
+++ b/src/MobileSync.c
@@ -23,6 +23,7 @@
23#include <plist/plist.h> 23#include <plist/plist.h>
24#include <string.h> 24#include <string.h>
25 25
26
26#define MSYNC_VERSION_INT1 100 27#define MSYNC_VERSION_INT1 100
27#define MSYNC_VERSION_INT2 100 28#define MSYNC_VERSION_INT2 100
28 29
@@ -44,19 +45,10 @@ iphone_error_t iphone_msync_new_client(iphone_device_t device, int src_port, int
44 return ret; 45 return ret;
45 } 46 }
46 //perform handshake 47 //perform handshake
47 int bytes = 0;
48 char *content = NULL;
49 uint32_t length = 0;
50 plist_t array = NULL; 48 plist_t array = NULL;
51 49
52 //first receive version 50 //first receive version
53 ret = iphone_msync_recv(client_loc, &content, &bytes); 51 ret = iphone_msync_recv(client_loc, &array);
54 log_debug_msg("Receive msg :\nsize : %i\nbuffer :\n", bytes);
55 log_debug_buffer(content, bytes);
56 plist_from_bin(content, bytes, &array);
57
58 free(content);
59 content = NULL;
60 52
61 plist_t msg_node = 53 plist_t msg_node =
62 plist_find_node(array, PLIST_STRING, "DLMessageVersionExchange", strlen("DLMessageVersionExchange")); 54 plist_find_node(array, PLIST_STRING, "DLMessageVersionExchange", strlen("DLMessageVersionExchange"));
@@ -84,24 +76,12 @@ iphone_error_t iphone_msync_new_client(iphone_device_t device, int src_port, int
84 plist_add_sub_string_el(array, "DLMessageVersionExchange"); 76 plist_add_sub_string_el(array, "DLMessageVersionExchange");
85 plist_add_sub_string_el(array, "DLVersionsOk"); 77 plist_add_sub_string_el(array, "DLVersionsOk");
86 78
87 plist_to_bin(array, &content, &length); 79 ret = iphone_msync_send(client_loc, array);
88 log_debug_msg("Send msg :\nsize : %i\nbuffer :\n", length);
89 log_debug_buffer(content, length);
90 ret = iphone_msync_send(client_loc, content, length, &bytes);
91 80
92 free(content);
93 content = NULL;
94 plist_free(array); 81 plist_free(array);
95 array = NULL; 82 array = NULL;
96 83
97 ret = iphone_msync_recv(client_loc, &content, &bytes); 84 ret = iphone_msync_recv(client_loc, &array);
98 log_debug_msg("Receive msg :\nsize : %i\nbuffer :\n", bytes);
99 log_debug_buffer(content, bytes);
100 plist_from_bin(content, bytes, &array);
101
102 free(content);
103 content = NULL;
104
105 plist_t rep_node = 85 plist_t rep_node =
106 plist_find_node(array, PLIST_STRING, "DLMessageDeviceReady", strlen("DLMessageDeviceReady")); 86 plist_find_node(array, PLIST_STRING, "DLMessageDeviceReady", strlen("DLMessageDeviceReady"));
107 87
@@ -109,6 +89,9 @@ iphone_error_t iphone_msync_new_client(iphone_device_t device, int src_port, int
109 ret = IPHONE_E_SUCCESS; 89 ret = IPHONE_E_SUCCESS;
110 *client = client_loc; 90 *client = client_loc;
111 } 91 }
92 plist_free(array);
93 array = NULL;
94
112 } 95 }
113 } 96 }
114 97
@@ -123,21 +106,11 @@ static void iphone_msync_stop_session(iphone_msync_client_t client)
123 if (!client) 106 if (!client)
124 return; 107 return;
125 108
126 int bytes = 0;
127 char *content = NULL;
128 uint32_t length = 0;
129
130 plist_t array = plist_new_array(); 109 plist_t array = plist_new_array();
131 plist_add_sub_string_el(array, "DLMessageDisconnect"); 110 plist_add_sub_string_el(array, "DLMessageDisconnect");
132 plist_add_sub_string_el(array, "All done, thanks for the memories"); 111 plist_add_sub_string_el(array, "All done, thanks for the memories");
133 112
134 plist_to_bin(array, &content, &length); 113 iphone_msync_send(client, array);
135 log_debug_msg("Send msg :\nsize : %i\nbuffer :\n", length);
136 log_debug_buffer(content, length);
137 iphone_msync_send(client, content, length, &bytes);
138
139 free(content);
140 content = NULL;
141 plist_free(array); 114 plist_free(array);
142 array = NULL; 115 array = NULL;
143} 116}
@@ -158,9 +131,9 @@ void iphone_msync_free_client(iphone_msync_client_t client)
158 * 131 *
159 * @return an error code 132 * @return an error code
160 */ 133 */
161iphone_error_t iphone_msync_recv(iphone_msync_client_t client, char **dump_data, uint32_t * recv_bytes) 134iphone_error_t iphone_msync_recv(iphone_msync_client_t client, plist_t * plist)
162{ 135{
163 if (!client || !dump_data || !recv_bytes) 136 if (!client || !plist || (plist && *plist))
164 return IPHONE_E_INVALID_ARG; 137 return IPHONE_E_INVALID_ARG;
165 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; 138 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;
166 char *receive; 139 char *receive;
@@ -172,8 +145,14 @@ iphone_error_t iphone_msync_recv(iphone_msync_client_t client, char **dump_data,
172 receive = (char *) malloc(sizeof(char) * datalen); 145 receive = (char *) malloc(sizeof(char) * datalen);
173 ret = iphone_mux_recv(client->connection, receive, datalen, &bytes); 146 ret = iphone_mux_recv(client->connection, receive, datalen, &bytes);
174 147
175 *dump_data = receive; 148 plist_from_bin(receive, bytes, plist);
176 *recv_bytes = bytes; 149
150 char *XMLContent = NULL;
151 uint32_t length = 0;
152 plist_to_xml(*plist, &XMLContent, &length);
153 log_dbg_msg(DBGMASK_MOBILESYNC, "Recv msg :\nsize : %i\nbuffer :\n%s\n", length, XMLContent);
154 free(XMLContent);
155
177 return ret; 156 return ret;
178} 157}
179 158
@@ -189,10 +168,22 @@ iphone_error_t iphone_msync_recv(iphone_msync_client_t client, char **dump_data,
189 * 168 *
190 * @return an error code 169 * @return an error code
191 */ 170 */
192iphone_error_t iphone_msync_send(iphone_msync_client_t client, char *raw_data, uint32_t length, uint32_t * sent_bytes) 171iphone_error_t iphone_msync_send(iphone_msync_client_t client, plist_t plist)
193{ 172{
194 if (!client || !raw_data || length == 0 || !sent_bytes) 173 if (!client || !plist)
195 return IPHONE_E_INVALID_ARG; 174 return IPHONE_E_INVALID_ARG;
175
176 char *XMLContent = NULL;
177 uint32_t length = 0;
178 plist_to_xml(plist, &XMLContent, &length);
179 log_dbg_msg(DBGMASK_MOBILESYNC, "Send msg :\nsize : %i\nbuffer :\n%s\n", length, XMLContent);
180 free(XMLContent);
181
182 char *content = NULL;
183 length = 0;
184
185 plist_to_bin(plist, &content, &length);
186
196 char *real_query; 187 char *real_query;
197 int bytes; 188 int bytes;
198 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR; 189 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;
@@ -200,11 +191,113 @@ iphone_error_t iphone_msync_send(iphone_msync_client_t client, char *raw_data, u
200 real_query = (char *) malloc(sizeof(char) * (length + 4)); 191 real_query = (char *) malloc(sizeof(char) * (length + 4));
201 length = htonl(length); 192 length = htonl(length);
202 memcpy(real_query, &length, sizeof(length)); 193 memcpy(real_query, &length, sizeof(length));
203 memcpy(real_query + 4, raw_data, ntohl(length)); 194 memcpy(real_query + 4, content, ntohl(length));
204 195
205 ret = iphone_mux_send(client->connection, real_query, ntohl(length) + sizeof(length), &bytes); 196 ret = iphone_mux_send(client->connection, real_query, ntohl(length) + sizeof(length), &bytes);
206 free(real_query); 197 free(real_query);
207 *sent_bytes = bytes;
208 return ret; 198 return ret;
209} 199}
210 200
201iphone_error_t iphone_msync_get_all_contacts(iphone_msync_client_t client)
202{
203 if (!client)
204 return IPHONE_E_INVALID_ARG;
205
206 iphone_error_t ret = IPHONE_E_UNKNOWN_ERROR;
207 plist_t array = NULL;
208
209 array = plist_new_array();
210 plist_add_sub_string_el(array, "SDMessageSyncDataClassWithDevice");
211 plist_add_sub_string_el(array, "com.apple.Contacts");
212 plist_add_sub_string_el(array, "---");
213 plist_add_sub_string_el(array, "2009-01-09 18:03:58 +0100");
214 plist_add_sub_uint_el(array, 106);
215 plist_add_sub_string_el(array, "___EmptyParameterString___");
216
217 ret = iphone_msync_send(client, array);
218 plist_free(array);
219 array = NULL;
220
221 ret = iphone_msync_recv(client, &array);
222
223 plist_t rep_node = plist_find_node(array, PLIST_STRING, "SDSyncTypeSlow", strlen("SDSyncTypeSlow"));
224
225 if (!rep_node)
226 return ret;
227
228 plist_free(array);
229 array = NULL;
230
231 array = plist_new_array();
232 plist_add_sub_string_el(array, "SDMessageGetAllRecordsFromDevice");
233 plist_add_sub_string_el(array, "com.apple.Contacts");
234
235
236 ret = iphone_msync_send(client, array);
237 plist_free(array);
238 array = NULL;
239
240 ret = iphone_msync_recv(client, &array);
241
242 plist_t contact_node;
243 plist_t switch_node;
244
245 contact_node = plist_find_node(array, PLIST_STRING, "com.apple.Contacts", strlen("com.apple.Contacts"));
246 switch_node =
247 plist_find_node(array, PLIST_STRING, "SDMessageDeviceReadyToReceiveChanges",
248 strlen("SDMessageDeviceReadyToReceiveChanges"));
249
250 while (NULL == switch_node) {
251
252 plist_free(array);
253 array = NULL;
254
255 array = plist_new_array();
256 plist_add_sub_string_el(array, "SDMessageAcknowledgeChangesFromDevice");
257 plist_add_sub_string_el(array, "com.apple.Contacts");
258
259 ret = iphone_msync_send(client, array);
260 plist_free(array);
261 array = NULL;
262
263 ret = iphone_msync_recv(client, &array);
264
265 contact_node = plist_find_node(array, PLIST_STRING, "com.apple.Contacts", strlen("com.apple.Contacts"));
266 switch_node =
267 plist_find_node(array, PLIST_STRING, "SDMessageDeviceReadyToReceiveChanges",
268 strlen("SDMessageDeviceReadyToReceiveChanges"));
269 }
270
271 array = plist_new_array();
272 plist_add_sub_string_el(array, "DLMessagePing");
273 plist_add_sub_string_el(array, "Preparing to get changes for device");
274
275 ret = iphone_msync_send(client, array);
276 plist_free(array);
277 array = NULL;
278
279 array = plist_new_array();
280 plist_add_sub_string_el(array, "SDMessageProcessChanges");
281 plist_add_sub_string_el(array, "com.apple.Contacts");
282 plist_add_sub_node(array, plist_new_dict());
283 plist_add_sub_bool_el(array, 0);
284 plist_t dict = plist_new_dict();
285 plist_add_sub_node(array, dict);
286 plist_add_sub_key_el(dict, "SyncDeviceLinkEntityNamesKey");
287 plist_t array2 = plist_new_array();
288 plist_add_sub_string_el(array2, "com.apple.contacts.Contact");
289 plist_add_sub_string_el(array2, "com.apple.contacts.Group");
290 plist_add_sub_key_el(dict, "SyncDeviceLinkAllRecordsOfPulledEntityTypeSentKey");
291 plist_add_sub_bool_el(dict, 0);
292
293 ret = iphone_msync_send(client, array);
294 plist_free(array);
295 array = NULL;
296
297 ret = iphone_msync_recv(client, &array);
298 plist_free(array);
299 array = NULL;
300
301
302 return ret;
303}