diff --git a/include/rpc.h b/include/rpc.h
index 3e176b89..780778a1 100644
--- a/include/rpc.h
+++ b/include/rpc.h
@@ -107,6 +107,9 @@ struct rpc_struct {
const char *app_id, const char *dest_id,
const char *data, size_t length);
+ rpc_status (*on_applicationUpdated)(rpc_t self,
+ const char *app_id, const char *dest_id);
+
// For internal use only:
rpc_status (*on_error)(rpc_t self, const char *format, ...);
};
diff --git a/src/ios_webkit_debug_proxy.c b/src/ios_webkit_debug_proxy.c
index 3eca9dbd..b4d119bc 100644
--- a/src/ios_webkit_debug_proxy.c
+++ b/src/ios_webkit_debug_proxy.c
@@ -1271,6 +1271,9 @@ rpc_status iwdp_on_applicationDisconnected(rpc_t rpc, const rpc_app_t app) {
rpc_status iwdp_on_reportConnectedApplicationList(rpc_t rpc, const rpc_app_t *apps) {
iwdp_iwi_t iwi = (iwdp_iwi_t)rpc->state;
ht_t app_id_ht = iwi->app_id_to_true;
+ if (*apps == NULL) {
+ return RPC_SUCCESS;
+ }
// remove old apps
char **old_app_ids = (char **)ht_keys(app_id_ht);
@@ -1381,6 +1384,16 @@ rpc_status iwdp_on_applicationSentData(rpc_t rpc,
data, length);
}
+rpc_status iwdp_on_applicationUpdated(rpc_t rpc,
+ const char *app_id, const char *dest_id) {
+ rpc_status result = iwdp_remove_app_id(rpc, app_id);
+ if (result) {
+ // Error removing app_id
+ return result;
+ }
+ return iwdp_add_app_id(rpc, dest_id);
+}
+
//
// STRUCTS
//
@@ -1600,6 +1613,7 @@ iwdp_iwi_t iwdp_iwi_new(bool is_sim, bool *is_debug) {
rpc->on_applicationDisconnected = iwdp_on_applicationDisconnected;
rpc->on_applicationSentListing = iwdp_on_applicationSentListing;
rpc->on_applicationSentData = iwdp_on_applicationSentData;
+ rpc->on_applicationUpdated = iwdp_on_applicationUpdated;
rpc->send_plist = iwdp_send_plist;
rpc->state = iwi;
iwi->rpc = rpc;
diff --git a/src/rpc.c b/src/rpc.c
index 827d0321..12c89102 100644
--- a/src/rpc.c
+++ b/src/rpc.c
@@ -421,6 +421,58 @@ rpc_status rpc_recv_applicationSentData(rpc_t self, const plist_t args) {
return ret;
}
+/*
+_rpc_applicationUpdated:
+WIRApplicationBundleIdentifierKey
+com.apple.WebKit.WebContent
+WIRHostApplicationIdentifierKey
+PID:409
+WIRApplicationNameKey
+
+WIRIsApplicationProxyKey
+
+WIRIsApplicationActiveKey
+0
+WIRApplicationIdentifierKey
+PID:536
+
+
+OR
+
+WIRApplicationBundleIdentifierKey
+com.apple.mobilesafari
+WIRApplicationNameKey
+Safari
+WIRIsApplicationProxyKey
+
+WIRIsApplicationActiveKey
+0
+WIRApplicationIdentifierKey
+PID:730
+*/
+rpc_status rpc_recv_applicationUpdated(rpc_t self, const plist_t args) {
+ char *app_id = NULL;
+ char *dest_id = NULL;
+ rpc_status ret;
+ if (!rpc_dict_get_required_string(args, "WIRHostApplicationIdentifierKey", &app_id)) {
+ if (!rpc_dict_get_required_string(args, "WIRApplicationIdentifierKey", &dest_id) &&
+ !self->on_applicationUpdated(self, app_id, dest_id)) {
+ ret = RPC_SUCCESS;
+ } else {
+ ret = RPC_ERROR;
+ }
+ } else if (!rpc_dict_get_required_string(args, "WIRApplicationNameKey", &app_id) &&
+ !rpc_dict_get_required_string(args, "WIRApplicationIdentifierKey", &dest_id) &&
+ !self->on_applicationUpdated(self, app_id, dest_id)) {
+ ret = RPC_SUCCESS;
+ } else {
+ ret = RPC_ERROR;
+ }
+ free(app_id);
+ free(dest_id);
+ return ret;
+}
+
rpc_status rpc_recv_msg(rpc_t self, const char *selector, const plist_t args) {
if (!selector) {
return RPC_ERROR;
@@ -449,6 +501,10 @@ rpc_status rpc_recv_msg(rpc_t self, const char *selector, const plist_t args) {
if (!rpc_recv_applicationSentData(self, args)) {
return RPC_SUCCESS;
}
+ } else if (!strcmp(selector, "_rpc_applicationUpdated:")) {
+ if (!rpc_recv_applicationUpdated(self, args)) {
+ return RPC_SUCCESS;
+ }
}
// invalid msg