diff options
author | Martin Szulecki | 2010-01-13 15:08:14 +0100 |
---|---|---|
committer | Martin Szulecki | 2010-01-13 15:08:14 +0100 |
commit | c9e2217059f561f87cf8b6af5067505f827c7297 (patch) | |
tree | b3e46b6ed89035f9ad0ee696cf46c57445cabbf7 /src/mobilesync.c | |
parent | 0ea52d01b817e35e4d4fceb57c9267124e60dab3 (diff) | |
download | libimobiledevice-c9e2217059f561f87cf8b6af5067505f827c7297.tar.gz libimobiledevice-c9e2217059f561f87cf8b6af5067505f827c7297.tar.bz2 |
Rename service implementation sources to lowercase for consistency
Diffstat (limited to 'src/mobilesync.c')
-rw-r--r-- | src/mobilesync.c | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/mobilesync.c b/src/mobilesync.c new file mode 100644 index 0000000..64c06d5 --- /dev/null +++ b/src/mobilesync.c @@ -0,0 +1,148 @@ +/* + * 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 <plist/plist.h> +#include <string.h> +#include <stdlib.h> +#include <arpa/inet.h> + +#include "mobilesync.h" +#include "device_link_service.h" +#include "debug.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, uint16_t port, + mobilesync_client_t * client) +{ + if (!device || 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, 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) { + debug_info("version exchange failed, error %d", 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); + debug_info("plist size: %i\nbuffer :\n%s", 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); + debug_info("plist size: %i\nbuffer :\n%s", length, XMLContent); + free(XMLContent); +#endif + return mobilesync_error(device_link_service_send(client->parent, plist)); +} |