/** Gets information about a specific file. * * @param client The client to use to get the information of the file. * @param path The fully-qualified path to the file. * @param infolist Pointer to a buffer that will be filled with a NULL-terminated * list of strings with the file information. * Set to NULL before calling this function. * * @return AFC_E_SUCCESS on success or an AFC_E_* error value * when something went wrong. */ afc_error_t afc_get_file_info(afc_client_t client, const char *path, char ***infolist) { char *received = NULL; int bytes; afc_error_t ret = AFC_E_UNKNOWN_ERROR; if (!client || !path || !infolist) return AFC_E_INVALID_ARGUMENT; afc_lock(client); // Send command client->afc_packet->operation = AFC_OP_GET_FILE_INFO; client->afc_packet->entire_length = client->afc_packet->this_length = 0; afc_dispatch_packet(client, path, strlen(path)+1); // Receive data ret = afc_receive_data(client, &received, &bytes); if (received) { *infolist = make_strings_list(received, bytes); free(received); } afc_unlock(client); return ret; }
/** * Gets information about a specific file. * * @param client The client to use to get the information of the file. * @param path The fully-qualified path to the file. * @param infolist Pointer to a buffer that will be filled with a NULL-terminated * list of strings with the file information. * Set to NULL before calling this function. * * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ afc_error_t afc_get_file_info(afc_client_t client, const char *path, char ***infolist) { char *received = NULL; uint32_t bytes = 0; afc_error_t ret = AFC_E_UNKNOWN_ERROR; if (!client || !path || !infolist) return AFC_E_INVALID_ARG; afc_lock(client); /* Send command */ client->afc_packet->operation = AFC_OP_GET_FILE_INFO; client->afc_packet->entire_length = client->afc_packet->this_length = 0; ret = afc_dispatch_packet(client, path, strlen(path)+1, &bytes); if (ret != AFC_E_SUCCESS) { afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } /* Receive data */ ret = afc_receive_data(client, &received, &bytes); if (received) { *infolist = make_strings_list(received, bytes); free(received); } afc_unlock(client); return ret; }
afc_error_t afc_read_directory(afc_client_t client, const char *dir, char ***list) { uint32_t bytes = 0; char *data = NULL, **list_loc = NULL; afc_error_t ret = AFC_E_UNKNOWN_ERROR; if (!client || !dir || !list || (list && *list)) return AFC_E_INVALID_ARG; afc_lock(client); /* Send the command */ ret = afc_dispatch_packet(client, AFC_OP_READ_DIR, dir, strlen(dir)+1, NULL, 0, &bytes); if (ret != AFC_E_SUCCESS) { afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } /* Receive the data */ ret = afc_receive_data(client, &data, &bytes); if (ret != AFC_E_SUCCESS) { if (data) free(data); afc_unlock(client); return ret; } /* Parse the data */ list_loc = make_strings_list(data, bytes); if (data) free(data); afc_unlock(client); *list = list_loc; return ret; }
/** Get device info for a client connection to phone. (free space on disk, etc.) * * @param client The client to get device info for. * * @return A char ** list of parameters as given by AFC or NULL if there was an * error. */ afc_error_t afc_get_device_info(afc_client_t client, char ***infos) { int bytes = 0; char *data = NULL, **list = NULL; afc_error_t ret = AFC_E_UNKNOWN_ERROR; if (!client || !infos) return AFC_E_INVALID_ARGUMENT; afc_lock(client); // Send the command client->afc_packet->operation = AFC_OP_GET_DEVINFO; client->afc_packet->entire_length = client->afc_packet->this_length = 0; bytes = afc_dispatch_packet(client, NULL, 0); if (bytes < 0) { afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } // Receive the data ret = afc_receive_data(client, &data, &bytes); if (ret != AFC_E_SUCCESS) { afc_unlock(client); return ret; } // Parse the data list = make_strings_list(data, bytes); if (data) free(data); afc_unlock(client); *infos = list; return ret; }
/** Gets a directory listing of the directory requested. * * @param client The client to get a directory listing from. * @param dir The directory to list. (must be a fully-qualified path) * * @return A char ** list of files in that directory, terminated by an empty * string for now or NULL if there was an error. */ afc_error_t afc_read_directory(afc_client_t client, const char *dir, char ***list) { int bytes = 0; char *data = NULL, **list_loc = NULL; afc_error_t ret = AFC_E_UNKNOWN_ERROR; if (!client || !dir || !list || (list && *list)) return AFC_E_INVALID_ARGUMENT; afc_lock(client); // Send the command client->afc_packet->operation = AFC_OP_READ_DIR; client->afc_packet->entire_length = 0; client->afc_packet->this_length = 0; bytes = afc_dispatch_packet(client, dir, strlen(dir)+1); if (bytes <= 0) { afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } // Receive the data ret = afc_receive_data(client, &data, &bytes); if (ret != AFC_E_SUCCESS) { afc_unlock(client); return ret; } // Parse the data list_loc = make_strings_list(data, bytes); if (data) free(data); afc_unlock(client); *list = list_loc; return ret; }
afc_error_t afc_get_device_info(afc_client_t client, char ***infos) { uint32_t bytes = 0; char *data = NULL, **list = NULL; afc_error_t ret = AFC_E_UNKNOWN_ERROR; if (!client || !infos) return AFC_E_INVALID_ARG; afc_lock(client); /* Send the command */ ret = afc_dispatch_packet(client, AFC_OP_GET_DEVINFO, NULL, 0, NULL, 0, &bytes); if (ret != AFC_E_SUCCESS) { afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } /* Receive the data */ ret = afc_receive_data(client, &data, &bytes); if (ret != AFC_E_SUCCESS) { if (data) free(data); afc_unlock(client); return ret; } /* Parse the data */ list = make_strings_list(data, bytes); if (data) free(data); afc_unlock(client); *infos = list; return ret; }