/** * Creates an AFC client using the given house_arrest client's connection * allowing file access to a specific application directory requested by * functions like house_arrest_request_vendor_documents(). * * @param client The house_arrest client to use. * @param afc_client Pointer that will be set to a newly allocated afc_client_t * upon successful return. * * @note After calling this function the house_arrest client will go in an * AFC mode that will only allow calling house_arrest_client_free(). * Only call house_arrest_client_free() if all AFC operations have * completed since it will close the connection. * * @return AFC_E_SUCCESS if the afc client was successfully created, * AFC_E_INVALID_ARG if client is invalid or was already used to create * an afc client, or an AFC_E_* error code returned by * afc_client_new_from_connection(). */ afc_error_t afc_client_new_from_house_arrest_client(house_arrest_client_t client, afc_client_t *afc_client) { if (!client || !client->parent || (client->mode == HOUSE_ARREST_CLIENT_MODE_AFC)) { return AFC_E_INVALID_ARG; } afc_error_t err = afc_client_new_from_connection(client->parent->connection, afc_client); if (err == AFC_E_SUCCESS) { client->mode = HOUSE_ARREST_CLIENT_MODE_AFC; } return err; }
/** * Makes a connection to the AFC service on the device. * This function calls afc_client_new_from_connection() after creating * a connection to the specified device and port. * * @see afc_client_new_from_connection * * @param device The device to connect to. * @param port The destination port. * @param client Pointer that will be set to a newly allocated afc_client_t * upon successful return. * * @return AFC_E_SUCCESS on success, AFC_E_INVALID_ARG if device or port is * invalid, AFC_E_MUX_ERROR if the connection cannot be established, * or AFC_E_NO_MEM if there is a memory allocation problem. */ afc_error_t afc_client_new(idevice_t device, uint16_t port, afc_client_t * client) { if (!device || port==0) return AFC_E_INVALID_ARG; /* attempt connection */ idevice_connection_t connection = NULL; if (idevice_connect(device, port, &connection) != IDEVICE_E_SUCCESS) { return AFC_E_MUX_ERROR; } afc_error_t err = afc_client_new_from_connection(connection, client); if (err != AFC_E_SUCCESS) { idevice_disconnect(connection); } else { (*client)->own_connection = 1; } return err; }