/* * MobileSync.c * Contains functions for the built-in MobileSync client. * * 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 #include #include #include #include "MobileSync.h" #include "device_link_service.h" #include "utils.h" #define MSYNC_VERSION_INT1 100 #define MSYNC_VERSION_INT2 100 /** * Convert an device_link_service_error_t value to an mobilesync_error_t value. * Used internally to get correct error codes when using device_link_service stuff. * * @param err An device_link_service_error_t error code * * @return A matching mobilesync_error_t error code, * MOBILESYNC_E_UNKNOWN_ERROR otherwise. */ static mobilesync_error_t mobilesync_error(device_link_service_error_t err) { switch (err) { case DEVICE_LINK_SERVICE_E_SUCCESS: return MOBILESYNC_E_SUCCESS; case DEVICE_LINK_SERVICE_E_INVALID_ARG: return MOBILESYNC_E_INVALID_ARG; case DEVICE_LINK_SERVICE_E_PLIST_ERROR: return MOBILESYNC_E_PLIST_ERROR; case DEVICE_LINK_SERVICE_E_MUX_ERROR: return MOBILESYNC_E_MUX_ERROR; case DEVICE_LINK_SERVICE_E_BAD_VERSION: return MOBILESYNC_E_BAD_VERSION; default: break; } return MOBILESYNC_E_UNKNOWN_ERROR; } mobilesync_error_t mobilesync_client_new(iphone_device_t device, int dst_port, mobilesync_client_t * client) { if (!device || dst_port == 0 || !client || *client) return MOBILESYNC_E_INVALID_ARG; device_link_service_client_t dlclient = NULL; mobilesync_error_t ret = mobilesync_error(device_link_service_client_new(device, dst_port, &dlclient)); if (ret != MOBILESYNC_E_SUCCESS) { return ret; } mobilesync_client_t client_loc = (mobilesync_client_t) malloc(sizeof(struct mobilesync_client_int)); client_loc->parent = dlclient; /* perform handshake */ ret = mobilesync_error(device_link_service_version_exchange(dlclient, MSYNC_VERSION_INT1, MSYNC_VERSION_INT2)); if (ret != MOBILESYNC_E_SUCCESS) { log_dbg_msg(DBGMASK_MOBILESYNC, "%s: version exchange failed, error %d\n", __func__, ret); mobilesync_client_free(client_loc); return ret; } *client = client_loc; return ret; } mobilesync_error_t mobilesync_client_free(mobilesync_client_t client) { if (!client) return MOBILESYNC_E_INVALID_ARG; device_link_service_disconnect(client->parent); mobilesync_error_t err = mobilesync_error(device_link_service_client_free(client->parent)); free(client); return err; } /** Polls the iPhone for MobileSync data. * * @param client The MobileSync client * @param plist A pointer to the location where the plist should be stored * * @return an error code */ mobilesync_error_t mobilesync_recv(mobilesync_client_t client, plist_t * plist) { if (!client) return MOBILESYNC_E_INVALID_ARG; mobilesync_error_t ret = mobilesync_error(device_link_service_receive(client->parent, plist)); #ifndef STRIP_DEBUG_CODE if (ret != MOBILESYNC_E_SUCCESS) { return ret; } char *XMLContent = NULL; uint32_t length = 0; plist_to_xml(*plist, &XMLContent, &length); log_dbg_msg(DBGMASK_MOBILESYNC, "%s: plist size: %i\nbuffer :\n%s\n", __func__, length, XMLContent); free(XMLContent); #endif return ret; } /** Sends MobileSync data to the iPhone * * @note This function is low-level and should only be used if you need to send * a new type of message. * * @param client The MobileSync client * @param plist The location of the plist to send * * @return an error code */ mobilesync_error_t mobilesync_send(mobilesync_client_t client, plist_t plist) { if (!client || !plist) return MOBILESYNC_E_INVALID_ARG; #ifndef STRIP_DEBUG_CODE char *XMLContent = NULL; uint32_t length = 0; plist_to_xml(plist, &XMLContent, &length); log_dbg_msg(DBGMASK_MOBILESYNC, "%s: plist size: %i\nbuffer :\n%s\n", __func__, length, XMLContent); free(XMLContent); #endif return mobilesync_error(device_link_service_send(client->parent, plist)); }