blob: b9e39e6fed8576b22177b1d72b7d49a121092222 [file] [log] [blame]
/*
* msyncclient.c
* Rudimentary interface to the MobileSync service.
*
* Copyright (c) 2009 Jonathan Beck All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <libimobiledevice/libimobiledevice.h>
#include <libimobiledevice/lockdown.h>
#include <libimobiledevice/mobilesync.h>
static char check_string(plist_t node, char* string)
{
char ret = 1;
char* msg = NULL;
plist_type type = plist_get_node_type(node);
if (PLIST_STRING == type) {
plist_get_string_val(node, &msg);
}
if (PLIST_STRING != type || strcmp(msg, string)) {
printf("%s: ERROR: MobileSync client did not find %s !\n", __func__, string);
ret = 0;
}
free(msg);
msg = NULL;
return ret;
}
static mobilesync_error_t mobilesync_get_all_contacts(mobilesync_client_t client)
{
if (!client)
return MOBILESYNC_E_INVALID_ARG;
mobilesync_error_t ret = MOBILESYNC_E_UNKNOWN_ERROR;
plist_t array = NULL;
array = plist_new_array();
plist_array_append_item(array, plist_new_string("SDMessageSyncDataClassWithDevice"));
plist_array_append_item(array, plist_new_string("com.apple.Contacts"));
plist_array_append_item(array, plist_new_string("---"));
plist_array_append_item(array, plist_new_string("2009-01-09 18:03:58 +0100"));
plist_array_append_item(array, plist_new_uint(106));
plist_array_append_item(array, plist_new_string("___EmptyParameterString___"));
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_receive(client, &array);
plist_free(array);
array = NULL;
array = plist_new_array();
plist_array_append_item(array, plist_new_string("SDMessageGetAllRecordsFromDevice"));
plist_array_append_item(array, plist_new_string("com.apple.Contacts"));
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_receive(client, &array);
plist_t contact_node;
plist_t switch_node;
contact_node = plist_array_get_item(array, 0);
switch_node = plist_array_get_item(array, 0);
while (NULL == switch_node
&& check_string(contact_node, "com.apple.Contacts")
&& check_string(switch_node, "SDMessageDeviceReadyToReceiveChanges")) {
plist_free(array);
array = NULL;
array = plist_new_array();
plist_array_append_item(array, plist_new_string("SDMessageAcknowledgeChangesFromDevice"));
plist_array_append_item(array, plist_new_string("com.apple.Contacts"));
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_receive(client, &array);
contact_node = plist_array_get_item(array, 0);
switch_node = plist_array_get_item(array, 0);
}
array = plist_new_array();
plist_array_append_item(array, plist_new_string("DLMessagePing"));
plist_array_append_item(array, plist_new_string("Preparing to get changes for device"));
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
array = plist_new_array();
plist_array_append_item(array, plist_new_string("SDMessageProcessChanges"));
plist_array_append_item(array, plist_new_string("com.apple.Contacts"));
plist_array_append_item(array, plist_new_dict());
plist_array_append_item(array, plist_new_bool(0));
plist_t dict = plist_new_dict();
plist_array_append_item(array, dict);
plist_t array2 = plist_new_array();
plist_dict_insert_item(dict, "SyncDeviceLinkEntityNamesKey", array2);
plist_array_append_item(array2, plist_new_string("com.apple.contacts.Contact"));
plist_array_append_item(array2, plist_new_string("com.apple.contacts.Group"));
plist_dict_insert_item(dict, "SyncDeviceLinkAllRecordsOfPulledEntityTypeSentKey", plist_new_bool(0));
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_receive(client, &array);
plist_free(array);
array = NULL;
return ret;
}
int main(int argc, char *argv[])
{
uint16_t port = 0;
lockdownd_client_t client = NULL;
idevice_t phone = NULL;
if (argc > 1 && !strcasecmp(argv[1], "--debug"))
idevice_set_debug_level(1);
if (IDEVICE_E_SUCCESS != idevice_new(&phone, NULL)) {
printf("No device found, is it plugged in?\n");
return -1;
}
if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(phone, &client, "msyncclient")) {
idevice_free(phone);
return -1;
}
lockdownd_start_service(client, "com.apple.mobilesync", &port);
if (port) {
mobilesync_client_t msync = NULL;
mobilesync_client_new(phone, port, &msync);
if (msync) {
mobilesync_get_all_contacts(msync);
mobilesync_client_free(msync);
}
} else {
printf("Start service failure.\n");
}
printf("All done.\n");
lockdownd_client_free(client);
idevice_free(phone);
return 0;
}