diff options
-rw-r--r-- | src/iphoneinstaller.c | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/src/iphoneinstaller.c b/src/iphoneinstaller.c index 8787a24..04ac341 100644 --- a/src/iphoneinstaller.c +++ b/src/iphoneinstaller.c @@ -379,7 +379,8 @@ run_again: if (list_apps_mode) { int xml_mode = 0; - instproxy_apptype_t apptype = INSTPROXY_APPTYPE_USER; + plist_t client_opts = instproxy_client_options_new(); + instproxy_client_options_add(client_opts, "ApplicationType", "User", NULL); instproxy_error_t err; plist_t apps = NULL; @@ -389,11 +390,15 @@ run_again: char *elem = strtok(opts, ","); while (elem) { if (!strcmp(elem, "list_system")) { - apptype = INSTPROXY_APPTYPE_SYSTEM; + if (!client_opts) { + client_opts = instproxy_client_options_new(); + } + instproxy_client_options_add(client_opts, "ApplicationType", "System", NULL); } else if (!strcmp(elem, "list_all")) { - apptype = INSTPROXY_APPTYPE_ALL; + instproxy_client_options_free(client_opts); + client_opts = NULL; } else if (!strcmp(elem, "list_user")) { - apptype = INSTPROXY_APPTYPE_USER; + /* do nothing, we're already set */ } else if (!strcmp(elem, "xml")) { xml_mode = 1; } @@ -401,7 +406,8 @@ run_again: } } - err = instproxy_browse(ipc, apptype, &apps); + err = instproxy_browse(ipc, client_opts, &apps); + instproxy_client_options_free(client_opts); if (err != INSTPROXY_E_SUCCESS) { fprintf(stderr, "ERROR: instproxy_browse returned %d\n", err); goto leave_cleanup; @@ -641,18 +647,26 @@ run_again: printf("done.\n"); /* perform installation or upgrade */ + plist_t client_opts = instproxy_client_options_new(); + if (sinf) { + instproxy_client_options_add(client_opts, "ApplicationSINF", sinf, NULL); + } + if (meta) { + instproxy_client_options_add(client_opts, "iTunesMetadata", meta, NULL); + } if (install_mode) { printf("Installing '%s'\n", pkgname); - instproxy_install(ipc, pkgname, sinf, meta, status_cb); + instproxy_install(ipc, pkgname, client_opts, status_cb); } else { printf("Upgrading '%s'\n", pkgname); - instproxy_upgrade(ipc, pkgname, sinf, meta, status_cb); + instproxy_upgrade(ipc, pkgname, client_opts, status_cb); } + instproxy_client_options_free(client_opts); free(pkgname); wait_for_op_complete = 1; notification_expected = 1; } else if (uninstall_mode) { - instproxy_uninstall(ipc, appid, status_cb); + instproxy_uninstall(ipc, appid, NULL, status_cb); wait_for_op_complete = 1; notification_expected = 1; } else if (list_archives_mode) { @@ -673,7 +687,7 @@ run_again: } } - err = instproxy_lookup_archives(ipc, &dict); + err = instproxy_lookup_archives(ipc, NULL, &dict); if (err != INSTPROXY_E_SUCCESS) { fprintf(stderr, "ERROR: lookup_archives returned %d\n", err); goto leave_cleanup; @@ -747,18 +761,21 @@ run_again: while (node); plist_free(dict); } else if (archive_mode) { - uint32_t opt = INSTPROXY_ARCHIVE_SKIP_UNINSTALL; char *copy_path = NULL; int remove_after_copy = 0; + int skip_uninstall = 1; + int app_only = 0; + plist_t client_opts = NULL; + /* look for options */ if (options) { char *opts = strdup(options); char *elem = strtok(opts, ","); while (elem) { if (!strcmp(elem, "uninstall")) { - opt &= ~INSTPROXY_ARCHIVE_SKIP_UNINSTALL; + skip_uninstall = 0; } else if (!strcmp(elem, "app_only")) { - opt |= INSTPROXY_ARCHIVE_APP_ONLY; + app_only = 1; } else if ((strlen(elem) > 5) && !strncmp(elem, "copy=", 5)) { copy_path = strdup(elem+5); } else if (!strcmp(elem, "remove")) { @@ -768,6 +785,16 @@ run_again: } } + if (skip_uninstall || app_only) { + client_opts = instproxy_client_options_new(); + if (skip_uninstall) { + instproxy_client_options_add(client_opts, "SkipUninstall", 1, NULL); + } + if (app_only) { + instproxy_client_options_add(client_opts, "ArchiveType", "ApplicationOnly", NULL); + } + } + if (copy_path) { struct stat fst; if (stat(copy_path, &fst) != 0) { @@ -798,9 +825,10 @@ run_again: } } - instproxy_archive(ipc, appid, opt, status_cb); + instproxy_archive(ipc, appid, client_opts, status_cb); + instproxy_client_options_free(client_opts); wait_for_op_complete = 1; - if (opt & INSTPROXY_ARCHIVE_SKIP_UNINSTALL) { + if (skip_uninstall) { notification_expected = 0; } else { notification_expected = 1; @@ -931,11 +959,11 @@ run_again: } goto leave_cleanup; } else if (restore_mode) { - instproxy_restore(ipc, appid, status_cb); + instproxy_restore(ipc, appid, NULL, status_cb); wait_for_op_complete = 1; notification_expected = 1; } else if (remove_archive_mode) { - instproxy_remove_archive(ipc, appid, status_cb); + instproxy_remove_archive(ipc, appid, NULL, status_cb); wait_for_op_complete = 1; } else { printf |