Fixing exception with calling into a dead XPC object (#35908)
* Fixing exception with calling into a dead XPC object
* Fixing white space
* Restyled by whitespace
* Restyled by clang-format
---------
Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/src/darwin/Framework/CHIP/MTRDefines_Internal.h b/src/darwin/Framework/CHIP/MTRDefines_Internal.h
index 5a450ec..71a03aa 100644
--- a/src/darwin/Framework/CHIP/MTRDefines_Internal.h
+++ b/src/darwin/Framework/CHIP/MTRDefines_Internal.h
@@ -67,22 +67,26 @@
#pragma mark - XPC Defines
-#define MTR_SIMPLE_REMOTE_XPC_GETTER(XPC_CONNECTION, NAME, TYPE, DEFAULT_VALUE, GETTER_NAME, PREFIX) \
- \
- -(TYPE) NAME \
- { \
- __block TYPE outValue = DEFAULT_VALUE; \
- \
- NSXPCConnection * xpcConnection = XPC_CONNECTION; \
- \
- [[xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \
- MTR_LOG_ERROR("Error: %@", error); \
- }] PREFIX \
- GETTER_NAME:^(TYPE returnValue) { \
- outValue = returnValue; \
- }]; \
- \
- return outValue; \
+#define MTR_SIMPLE_REMOTE_XPC_GETTER(XPC_CONNECTION, NAME, TYPE, DEFAULT_VALUE, GETTER_NAME, PREFIX) \
+ \
+ -(TYPE) NAME \
+ { \
+ __block TYPE outValue = DEFAULT_VALUE; \
+ \
+ NSXPCConnection * xpcConnection = XPC_CONNECTION; \
+ \
+ @try { \
+ [[xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \
+ MTR_LOG_ERROR("Error: %@", error); \
+ }] PREFIX \
+ GETTER_NAME:^(TYPE returnValue) { \
+ outValue = returnValue; \
+ }]; \
+ } @catch (NSException * exception) { \
+ MTR_LOG_ERROR("Exception sending XPC messsage: %@", exception); \
+ outValue = DEFAULT_VALUE; \
+ } \
+ return outValue; \
}
#define MTR_SIMPLE_REMOTE_XPC_COMMAND(XPC_CONNECTION, METHOD_SIGNATURE, ADDITIONAL_ARGUMENTS, PREFIX) \
@@ -91,9 +95,13 @@
{ \
NSXPCConnection * xpcConnection = XPC_CONNECTION; \
\
- [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \
- MTR_LOG_ERROR("Error: %@", error); \
- }] PREFIX ADDITIONAL_ARGUMENTS]; \
+ @try { \
+ [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \
+ MTR_LOG_ERROR("Error: %@", error); \
+ }] PREFIX ADDITIONAL_ARGUMENTS]; \
+ } @catch (NSException * exception) { \
+ MTR_LOG_ERROR("Exception sending XPC messsage: %@", exception); \
+ } \
}
#define MTR_COMPLEX_REMOTE_XPC_GETTER(XPC_CONNECTION, SIGNATURE, TYPE, DEFAULT_VALUE, ADDITIONAL_ARGUMENTS, PREFIX) \
@@ -103,11 +111,16 @@
\
NSXPCConnection * xpcConnection = XPC_CONNECTION; \
\
- [[xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \
- MTR_LOG_ERROR("Error: %@", error); \
- }] PREFIX ADDITIONAL_ARGUMENTS:^(TYPE returnValue) { \
- outValue = returnValue; \
- }]; \
+ @try { \
+ [[xpcConnection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { \
+ MTR_LOG_ERROR("Error: %@", error); \
+ }] PREFIX ADDITIONAL_ARGUMENTS:^(TYPE returnValue) { \
+ outValue = returnValue; \
+ }]; \
+ } @catch (NSException * exception) { \
+ MTR_LOG_ERROR("Exception sending XPC messsage: %@", exception); \
+ outValue = DEFAULT_VALUE; \
+ } \
\
return outValue; \
}
diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm
index 6d45de6..45c6751 100644
--- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm
+++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm
@@ -44,6 +44,45 @@
@implementation MTRDeviceController_XPC
+#pragma mark - Device Node ID Commands
+
+- (void)_registerNodeID:(NSNumber *)nodeID
+{
+ @try {
+ [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
+ MTR_LOG_ERROR("Register node error: %@ nodeID: %@", error, nodeID);
+ }] deviceController:self.uniqueIdentifier registerNodeID:nodeID];
+ } @catch (NSException * exception) {
+ MTR_LOG_ERROR("Exception registering nodeID: %@", exception);
+ }
+}
+
+- (void)_unregisterNodeID:(NSNumber *)nodeID
+{
+ @try {
+ [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
+ MTR_LOG_ERROR("Unregister node error: %@ nodeID: %@", error, nodeID);
+ }] deviceController:self.uniqueIdentifier unregisterNodeID:nodeID];
+ } @catch (NSException * exception) {
+ MTR_LOG_ERROR("Exception registering nodeID: %@", exception);
+ }
+}
+
+- (void)_checkinWithContext:(NSDictionary *)context
+{
+ @try {
+ if (!context)
+ context = [NSDictionary dictionary];
+
+ [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
+ MTR_LOG_ERROR("Checkin error: %@", error);
+ }] deviceController:self.uniqueIdentifier checkInWithContext:context];
+ } @catch (NSException * exception) {
+ MTR_LOG_ERROR("Exception registering nodeID: %@", exception);
+ }
+}
+
+#pragma mark - XPC
+ (NSMutableSet *)_allowedClasses
{
static NSArray * sBaseAllowedClasses = @[
@@ -202,9 +241,7 @@
MTR_LOG("%@ Activating new XPC connection", self);
[self.xpcConnection activate];
- [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
- MTR_LOG_ERROR("Checkin error: %@", error);
- }] deviceController:self.uniqueIdentifier checkInWithContext:[NSDictionary dictionary]];
+ [self _checkinWithContext:[NSDictionary dictionary]];
// FIXME: Trying to kick all the MTRDevices attached to this controller to re-establish connections
// This state needs to be stored properly and re-established at connnection time
@@ -212,12 +249,7 @@
MTR_LOG("%@ Starting existing NodeID Registration", self);
for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) {
MTR_LOG("%@ => Registering nodeID: %@", self, nodeID);
- mtr_weakify(self);
-
- [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
- mtr_strongify(self);
- MTR_LOG_ERROR("%@ Registration error for device nodeID: %@ : %@", self, nodeID, error);
- }] deviceController:self.uniqueIdentifier registerNodeID:nodeID];
+ [self _registerNodeID:nodeID];
}
MTR_LOG("%@ Done existing NodeID Registration", self);
@@ -308,11 +340,7 @@
[self.nodeIDToDeviceMap setObject:deviceToReturn forKey:nodeID];
MTR_LOG("%s: returning XPC device for node id %@", __PRETTY_FUNCTION__, nodeID);
- mtr_weakify(self);
- [[self.xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
- mtr_strongify(self);
- MTR_LOG_ERROR("%@ Registration error for device nodeID: %@ : %@", self, nodeID, error);
- }] deviceController:self.uniqueIdentifier registerNodeID:nodeID];
+ [self _registerNodeID:nodeID];
return deviceToReturn;
}
diff --git a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm
index 7806546..d7a4574 100644
--- a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm
+++ b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm
@@ -249,19 +249,23 @@
{
NSXPCConnection * xpcConnection = [(MTRDeviceController_XPC *) [self deviceController] xpcConnection];
- [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
- MTR_LOG_ERROR("Error: %@", error);
- }] deviceController:[[self deviceController] uniqueIdentifier]
- nodeID:[self nodeID]
- invokeCommandWithEndpointID:endpointID
- clusterID:clusterID
- commandID:commandID
- commandFields:commandFields
- expectedValues:expectedValues
- expectedValueInterval:expectedValueInterval
- timedInvokeTimeout:timeout
- serverSideProcessingTimeout:serverSideProcessingTimeout
- completion:completion];
+ @try {
+ [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
+ MTR_LOG_ERROR("Error: %@", error);
+ }] deviceController:[[self deviceController] uniqueIdentifier]
+ nodeID:[self nodeID]
+ invokeCommandWithEndpointID:endpointID
+ clusterID:clusterID
+ commandID:commandID
+ commandFields:commandFields
+ expectedValues:expectedValues
+ expectedValueInterval:expectedValueInterval
+ timedInvokeTimeout:timeout
+ serverSideProcessingTimeout:serverSideProcessingTimeout
+ completion:completion];
+ } @catch (NSException * exception) {
+ MTR_LOG_ERROR("Exception sending XPC messsage: %@", exception);
+ }
}
// Not Supported via XPC