blob: 5fffe7ae124dd59988e4d80bddafd349255cf1fa [file] [log] [blame]
/*
* msyncclient.c
* Rudimentary interface to the MobileSync iPhone
*
* 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 <usb.h>
#include <libiphone/libiphone.h>
#include <libiphone/lockdown.h>
#include <libiphone/mobilesync.h>
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_add_sub_string_el(array, "SDMessageSyncDataClassWithDevice");
plist_add_sub_string_el(array, "com.apple.Contacts");
plist_add_sub_string_el(array, "---");
plist_add_sub_string_el(array, "2009-01-09 18:03:58 +0100");
plist_add_sub_uint_el(array, 106);
plist_add_sub_string_el(array, "___EmptyParameterString___");
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_recv(client, &array);
plist_t rep_node = plist_find_node_by_string(array, "SDSyncTypeSlow");
if (!rep_node)
return ret;
plist_free(array);
array = NULL;
array = plist_new_array();
plist_add_sub_string_el(array, "SDMessageGetAllRecordsFromDevice");
plist_add_sub_string_el(array, "com.apple.Contacts");
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_recv(client, &array);
plist_t contact_node;
plist_t switch_node;
contact_node = plist_find_node_by_string(array, "com.apple.Contacts");
switch_node = plist_find_node_by_string(array, "SDMessageDeviceReadyToReceiveChanges");
while (NULL == switch_node) {
plist_free(array);
array = NULL;
array = plist_new_array();
plist_add_sub_string_el(array, "SDMessageAcknowledgeChangesFromDevice");
plist_add_sub_string_el(array, "com.apple.Contacts");
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_recv(client, &array);
contact_node = plist_find_node_by_string(array, "com.apple.Contacts");
switch_node = plist_find_node_by_string(array, "SDMessageDeviceReadyToReceiveChanges");
}
array = plist_new_array();
plist_add_sub_string_el(array, "DLMessagePing");
plist_add_sub_string_el(array, "Preparing to get changes for device");
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
array = plist_new_array();
plist_add_sub_string_el(array, "SDMessageProcessChanges");
plist_add_sub_string_el(array, "com.apple.Contacts");
plist_add_sub_node(array, plist_new_dict());
plist_add_sub_bool_el(array, 0);
plist_t dict = plist_new_dict();
plist_add_sub_node(array, dict);
plist_add_sub_key_el(dict, "SyncDeviceLinkEntityNamesKey");
plist_t array2 = plist_new_array();
plist_add_sub_string_el(array2, "com.apple.contacts.Contact");
plist_add_sub_string_el(array2, "com.apple.contacts.Group");
plist_add_sub_key_el(dict, "SyncDeviceLinkAllRecordsOfPulledEntityTypeSentKey");
plist_add_sub_bool_el(dict, 0);
ret = mobilesync_send(client, array);
plist_free(array);
array = NULL;
ret = mobilesync_recv(client, &array);
plist_free(array);
array = NULL;
return ret;
}
int main(int argc, char *argv[])
{
int port = 0;
lockdownd_client_t client = NULL;
iphone_device_t phone = NULL;
if (argc > 1 && !strcasecmp(argv[1], "--debug"))
iphone_set_debug_mask(DBGMASK_MOBILESYNC);
if (IPHONE_E_SUCCESS != iphone_get_device(&phone)) {
printf("No iPhone found, is it plugged in?\n");
return -1;
}
if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(phone, &client)) {
iphone_device_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);
iphone_device_free(phone);
return 0;
}