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