From 1277000a58679e1f26725836dd9a5e8df18ea1c3 Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Thu, 1 Dec 2022 15:23:42 +1300 Subject: [PATCH] Darwin: Improve os_log integration (#23528) * Prefer locally installed restyle-path script if it exists * Simplify GetModuleName * Remove unused / unimplemented GetMessageWithPrefix and related unused constants * Remove duplicate defaults for CHIP_*_LOGGING and move CHIP_LOG_FILTERING to CHIPConfig.h * Remove duplicate CHIP_SYSTEM_CONFIG_NO_LOCKING section * Rename support:enforce_format to attributes and include DLLUtil.h in it * Darwin: Integrate CHIP logging with os_log at the log macro level Introduce CHIP_SYSTEM_CONFIG_PLATFORM_LOG that enables integrating with CHIP logging at the log macro level. Note: ChipLog* macros are now statements (not expressions), so a few of usages of VerifyOr... macros required adjustments. * Fix (unrelated?) clang-tidy error * Add logging:force_stdio target that takes preference over the platform logging backend and use it for unit tests and cli tools (chip-tool etc) * Darwin: Implement MTR_LOG_* via ChipLog* and rename MTRLogging.h to MTRLogging_Internal.h. Also compile all ObjC files as ObjC++. * Darwin: Replace NSLog usages in Matter.framework with MTR_LOG_* * Darwin: Re-add MTRLogging.h as a public header and expose MTRSetLogCallback() * Darwin: Use log redirection in darwin-framework-tool to log to stdout. * Review: Document `...` parameters that take statements in CodeUtils.h * Review: some comments and tweaks * Darwin: Add logging preferences plist --- build/chip/chip_test_suite.gni | 10 +- examples/chip-tool/BUILD.gn | 5 +- .../interactive/InteractiveCommands.cpp | 2 + .../interactive/InteractiveCommands.mm | 3 +- examples/darwin-framework-tool/main.mm | 6 + examples/platform/linux/BUILD.gn | 1 + scripts/helpers/restyle-diff.sh | 9 +- src/access/AccessControl.cpp | 10 +- .../CHIP/MTRAsyncCallbackWorkQueue.mm | 2 +- ...ttestationInfo.m => MTRAttestationInfo.mm} | 0 src/darwin/Framework/CHIP/MTRBaseDevice.mm | 2 +- .../CHIP/{MTRCSRInfo.m => MTRCSRInfo.mm} | 0 src/darwin/Framework/CHIP/MTRCertificates.mm | 52 ++-- .../CHIP/MTRClusterStateCacheContainer.mm | 2 +- ...meters.m => MTRCommissioningParameters.mm} | 0 .../CHIP/{MTRMemory.mm => MTRDefines.h} | 22 +- src/darwin/Framework/CHIP/MTRDevice.mm | 2 +- .../MTRDeviceAttestationDelegateBridge.mm | 4 +- ...oller+XPC.m => MTRDeviceController+XPC.mm} | 0 .../Framework/CHIP/MTRDeviceController.mm | 2 +- .../CHIP/MTRDeviceControllerDelegateBridge.mm | 9 +- .../CHIP/MTRDeviceControllerFactory.mm | 13 +- ...verXPC.m => MTRDeviceControllerOverXPC.mm} | 2 +- .../CHIP/MTRDeviceControllerStartupParams.mm | 2 +- ....m => MTRDeviceControllerXPCConnection.mm} | 2 +- ...MTRDeviceOverXPC.m => MTRDeviceOverXPC.mm} | 2 +- .../CHIP/{MTRMemory.h => MTRFramework.h} | 24 +- src/darwin/Framework/CHIP/MTRFramework.mm | 38 +++ src/darwin/Framework/CHIP/MTRLogging.h | 32 ++- src/darwin/Framework/CHIP/MTRLogging.mm | 70 ++++++ .../Framework/CHIP/MTRLogging_Internal.h | 26 ++ .../CHIP/MTRManualSetupPayloadParser.mm | 10 +- ...Parser.m => MTROnboardingPayloadParser.mm} | 0 .../CHIP/MTROperationalCredentialsDelegate.mm | 16 +- .../Framework/CHIP/MTRP256KeypairBridge.mm | 6 +- .../MTRPersistentStorageDelegateBridge.mm | 8 +- .../CHIP/MTRQRCodeSetupPayloadParser.mm | 10 +- .../CHIP/MTRThreadOperationalDataset.mm | 2 +- src/darwin/Framework/CHIP/Matter.h | 2 + .../Resources/Logging/com.csa.matter.plist | 18 ++ .../CHIP/templates/MTRClusters-src.zapt | 2 +- .../CHIP/zap-generated/MTRClusters.mm | 2 +- .../Matter.xcodeproj/project.pbxproj | 160 ++++++++----- src/lib/core/CHIPConfig.h | 10 + src/lib/support/BUILD.gn | 13 +- src/lib/support/CodeUtils.h | 19 +- src/lib/support/logging/CHIPLogging.cpp | 150 +++++------- src/lib/support/logging/CHIPLogging.h | 226 ++++++++---------- src/platform/Darwin/BUILD.gn | 22 +- src/platform/Darwin/Logging.cpp | 78 ------ src/platform/Darwin/Logging.h | 85 +++++++ src/platform/Darwin/Logging.mm | 68 ++++++ src/platform/Darwin/LoggingImpl.cpp | 34 +++ src/platform/Darwin/SystemPlatformConfig.h | 2 + src/platform/Linux/PlatformManagerImpl.cpp | 4 +- src/platform/Linux/bluez/Helper.cpp | 21 +- src/platform/Tizen/DnssdImpl.cpp | 47 ++-- src/platform/Tizen/ThreadStackManagerImpl.cpp | 9 +- src/platform/logging/BUILD.gn | 28 ++- src/system/SystemConfig.h | 24 +- 60 files changed, 888 insertions(+), 542 deletions(-) rename src/darwin/Framework/CHIP/{MTRAttestationInfo.m => MTRAttestationInfo.mm} (100%) rename src/darwin/Framework/CHIP/{MTRCSRInfo.m => MTRCSRInfo.mm} (100%) rename src/darwin/Framework/CHIP/{MTRCommissioningParameters.m => MTRCommissioningParameters.mm} (100%) rename src/darwin/Framework/CHIP/{MTRMemory.mm => MTRDefines.h} (69%) rename src/darwin/Framework/CHIP/{MTRDeviceController+XPC.m => MTRDeviceController+XPC.mm} (100%) rename src/darwin/Framework/CHIP/{MTRDeviceControllerOverXPC.m => MTRDeviceControllerOverXPC.mm} (99%) rename src/darwin/Framework/CHIP/{MTRDeviceControllerXPCConnection.m => MTRDeviceControllerXPCConnection.mm} (99%) rename src/darwin/Framework/CHIP/{MTRDeviceOverXPC.m => MTRDeviceOverXPC.mm} (99%) rename src/darwin/Framework/CHIP/{MTRMemory.h => MTRFramework.h} (53%) create mode 100644 src/darwin/Framework/CHIP/MTRFramework.mm create mode 100644 src/darwin/Framework/CHIP/MTRLogging.mm create mode 100644 src/darwin/Framework/CHIP/MTRLogging_Internal.h rename src/darwin/Framework/CHIP/{MTROnboardingPayloadParser.m => MTROnboardingPayloadParser.mm} (100%) create mode 100644 src/darwin/Framework/CHIP/Resources/Logging/com.csa.matter.plist delete mode 100644 src/platform/Darwin/Logging.cpp create mode 100644 src/platform/Darwin/Logging.h create mode 100644 src/platform/Darwin/Logging.mm create mode 100644 src/platform/Darwin/LoggingImpl.cpp diff --git a/build/chip/chip_test_suite.gni b/build/chip/chip_test_suite.gni index caaf06f5028f2b..336450ca459487 100644 --- a/build/chip/chip_test_suite.gni +++ b/build/chip/chip_test_suite.gni @@ -94,15 +94,9 @@ template("chip_test_suite") { public_deps = [] } - # TODO: figure out a way to auto-define dependency on stdio logging. - # This dep is required since libSupportLayer now does not include - # a default implementation. - # - # Tests such as TestInetEndPoint need to exercise the system event - # loop however they do not seem to include a logging binding so this - # is forcefully added here. if (current_os != "zephyr" && current_os != "mbed") { - public_deps += [ "${chip_root}/src/platform/logging:stdio" ] + # Depend on stdio logging, and have it take precedence over the default platform backend + public_deps += [ "${chip_root}/src/platform/logging:force_stdio" ] } } diff --git a/examples/chip-tool/BUILD.gn b/examples/chip-tool/BUILD.gn index a4e87b7bacfc1c..d870c1d5cf92f2 100644 --- a/examples/chip-tool/BUILD.gn +++ b/examples/chip-tool/BUILD.gn @@ -120,7 +120,10 @@ static_library("chip-tool-utils") { executable("chip-tool") { sources = [ "main.cpp" ] - deps = [ ":chip-tool-utils" ] + deps = [ + ":chip-tool-utils", + "${chip_root}/src/platform/logging:force_stdio", + ] output_dir = root_out_dir } diff --git a/examples/chip-tool/commands/interactive/InteractiveCommands.cpp b/examples/chip-tool/commands/interactive/InteractiveCommands.cpp index 380a6e34c6ab6c..de82f205803070 100644 --- a/examples/chip-tool/commands/interactive/InteractiveCommands.cpp +++ b/examples/chip-tool/commands/interactive/InteractiveCommands.cpp @@ -18,6 +18,8 @@ #include "InteractiveCommands.h" +#include + #include #include #include diff --git a/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm b/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm index 7fe2d7d236d933..a251d517e6b83e 100644 --- a/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm +++ b/examples/darwin-framework-tool/commands/interactive/InteractiveCommands.mm @@ -17,7 +17,8 @@ */ #include "InteractiveCommands.h" -#import + +#include #include #include diff --git a/examples/darwin-framework-tool/main.mm b/examples/darwin-framework-tool/main.mm index f0aeab45f78342..58a37ebb2ce42b 100644 --- a/examples/darwin-framework-tool/main.mm +++ b/examples/darwin-framework-tool/main.mm @@ -28,9 +28,15 @@ #include #include +#include + int main(int argc, const char * argv[]) { @autoreleasepool { + MTRSetLogCallback(MTRLogTypeDetail, ^(MTRLogType type, NSString * component, NSString * message) { + fprintf(stdout, "CHIP:%s: %s\n", component.UTF8String, message.UTF8String); + }); + Commands commands; registerCommandsPairing(commands); registerCommandsInteractive(commands); diff --git a/examples/platform/linux/BUILD.gn b/examples/platform/linux/BUILD.gn index 605c19860db9b1..08580aad33c1f5 100644 --- a/examples/platform/linux/BUILD.gn +++ b/examples/platform/linux/BUILD.gn @@ -70,6 +70,7 @@ source_set("app-main") { "${chip_root}/src/lib", "${chip_root}/src/lib/shell", "${chip_root}/src/lib/shell:shell_core", + "${chip_root}/src/platform/logging:force_stdio", ] if (chip_enable_transport_trace) { diff --git a/scripts/helpers/restyle-diff.sh b/scripts/helpers/restyle-diff.sh index 4701b0a7e7710a..bf428dc1ea7a17 100755 --- a/scripts/helpers/restyle-diff.sh +++ b/scripts/helpers/restyle-diff.sh @@ -33,9 +33,12 @@ set -e CHIP_ROOT=$(cd "$here/../.." && pwd) restyle-paths() { - url=https://github.com/restyled-io/restyler/raw/main/bin/restyle-path - - sh <(curl --location --proto "=https" --tlsv1.2 "$url" -sSf) "$@" + if hash restyle-path 2>/dev/null; then + command restyle-path "$@" + else + url=https://github.com/restyled-io/restyler/raw/main/bin/restyle-path + sh <(curl --location --proto "=https" --tlsv1.2 "$url" -sSf) "$@" + fi } cd "$CHIP_ROOT" diff --git a/src/access/AccessControl.cpp b/src/access/AccessControl.cpp index 0f6c80c9f38e21..20b58ee0be39f3 100644 --- a/src/access/AccessControl.cpp +++ b/src/access/AccessControl.cpp @@ -549,11 +549,11 @@ bool AccessControl::IsValid(const Entry & entry) const char * log = "unexpected error"; IgnoreUnusedVariable(log); // logging may be disabled - AuthMode authMode; - FabricIndex fabricIndex; - Privilege privilege; - size_t subjectCount = 0; - size_t targetCount = 0; + AuthMode authMode = AuthMode::kNone; + FabricIndex fabricIndex = kUndefinedFabricIndex; + Privilege privilege = static_cast(0); + size_t subjectCount = 0; + size_t targetCount = 0; SuccessOrExit(entry.GetAuthMode(authMode)); SuccessOrExit(entry.GetFabricIndex(fabricIndex)); diff --git a/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm b/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm index 65b8424e69a9a0..edb2265dfc5db7 100644 --- a/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm +++ b/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm @@ -19,7 +19,7 @@ #import #import "MTRAsyncCallbackWorkQueue.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #pragma mark - Class extensions diff --git a/src/darwin/Framework/CHIP/MTRAttestationInfo.m b/src/darwin/Framework/CHIP/MTRAttestationInfo.mm similarity index 100% rename from src/darwin/Framework/CHIP/MTRAttestationInfo.m rename to src/darwin/Framework/CHIP/MTRAttestationInfo.mm diff --git a/src/darwin/Framework/CHIP/MTRBaseDevice.mm b/src/darwin/Framework/CHIP/MTRBaseDevice.mm index a2996d7bcbc603..c5cbd062975dce 100644 --- a/src/darwin/Framework/CHIP/MTRBaseDevice.mm +++ b/src/darwin/Framework/CHIP/MTRBaseDevice.mm @@ -24,7 +24,7 @@ #import "MTRCluster_internal.h" #import "MTRError_Internal.h" #import "MTREventTLVValueDecoder_Internal.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #import "MTRSetupPayload_Internal.h" #include "app/ConcreteAttributePath.h" diff --git a/src/darwin/Framework/CHIP/MTRCSRInfo.m b/src/darwin/Framework/CHIP/MTRCSRInfo.mm similarity index 100% rename from src/darwin/Framework/CHIP/MTRCSRInfo.m rename to src/darwin/Framework/CHIP/MTRCSRInfo.mm diff --git a/src/darwin/Framework/CHIP/MTRCertificates.mm b/src/darwin/Framework/CHIP/MTRCertificates.mm index 39735bd79d3771..c1699d616c3706 100644 --- a/src/darwin/Framework/CHIP/MTRCertificates.mm +++ b/src/darwin/Framework/CHIP/MTRCertificates.mm @@ -16,8 +16,8 @@ #import "MTRCertificates.h" #import "MTRError_Internal.h" -#import "MTRLogging.h" -#import "MTRMemory.h" +#import "MTRFramework.h" +#import "MTRLogging_Internal.h" #import "MTROperationalCredentialsDelegate.h" #import "MTRP256KeypairBridge.h" #import "NSDataSpanConversion.h" @@ -31,15 +31,17 @@ @implementation MTRCertificates ++ (void)initialize +{ + MTRFrameworkInit(); +} + + (MTRCertificateDERBytes _Nullable)createRootCertificate:(id)keypair issuerID:(NSNumber * _Nullable)issuerID fabricID:(NSNumber * _Nullable)fabricID error:(NSError * __autoreleasing *)error { - NSLog(@"Generating root certificate"); - - [MTRMemory ensureInit]; - + MTR_LOG_DEFAULT("Generating root certificate"); NSData * rootCert = nil; CHIP_ERROR err = MTROperationalCredentialsDelegate::GenerateRootCertificate(keypair, issuerID, fabricID, &rootCert); if (error) { @@ -47,7 +49,7 @@ + (MTRCertificateDERBytes _Nullable)createRootCertificate:(id)keypai } if (err != CHIP_NO_ERROR) { - NSLog(@"Generating root certificate failed: %s", ErrorStr(err)); + MTR_LOG_ERROR("Generating root certificate failed: %s", ErrorStr(err)); } return rootCert; @@ -60,10 +62,7 @@ + (MTRCertificateDERBytes _Nullable)createIntermediateCertificate:(id caseAuthenticatedTags:(NSArray * _Nullable)caseAuthenticatedTags error:(NSError * __autoreleasing _Nullable * _Nullable)error { - NSLog(@"Generating operational certificate"); - - [MTRMemory ensureInit]; - + MTR_LOG_DEFAULT("Generating operational certificate"); NSData * opcert = nil; CHIP_ERROR err = MTROperationalCredentialsDelegate::GenerateOperationalCertificate( signingKeypair, signingCertificate, operationalPublicKey, fabricID, nodeID, caseAuthenticatedTags, &opcert); @@ -98,7 +94,7 @@ + (MTRCertificateDERBytes _Nullable)createOperationalCertificate:(id } if (err != CHIP_NO_ERROR) { - NSLog(@"Generating operational certificate failed: %s", ErrorStr(err)); + MTR_LOG_ERROR("Generating operational certificate failed: %s", ErrorStr(err)); } return opcert; @@ -106,12 +102,10 @@ + (MTRCertificateDERBytes _Nullable)createOperationalCertificate:(id + (BOOL)keypair:(id)keypair matchesCertificate:(NSData *)certificate { - [MTRMemory ensureInit]; - P256PublicKey keypairPubKey; CHIP_ERROR err = MTRP256KeypairBridge::MatterPubKeyFromSecKeyRef(keypair.publicKey, &keypairPubKey); if (err != CHIP_NO_ERROR) { - NSLog(@"Can't extract public key from keypair: %s", ErrorStr(err)); + MTR_LOG_ERROR("Can't extract public key from keypair: %s", ErrorStr(err)); return NO; } P256PublicKeySpan keypairKeySpan(keypairPubKey.ConstBytes()); @@ -119,7 +113,7 @@ + (BOOL)keypair:(id)keypair matchesCertificate:(NSData *)certificate P256PublicKey certPubKey; err = ExtractPubkeyFromX509Cert(AsByteSpan(certificate), certPubKey); if (err != CHIP_NO_ERROR) { - NSLog(@"Can't extract public key from certificate: %s", ErrorStr(err)); + MTR_LOG_ERROR("Can't extract public key from certificate: %s", ErrorStr(err)); return NO; } P256PublicKeySpan certKeySpan(certPubKey.ConstBytes()); @@ -129,12 +123,10 @@ + (BOOL)keypair:(id)keypair matchesCertificate:(NSData *)certificate + (BOOL)isCertificate:(MTRCertificateDERBytes)certificate1 equalTo:(MTRCertificateDERBytes)certificate2 { - [MTRMemory ensureInit]; - P256PublicKey pubKey1; CHIP_ERROR err = ExtractPubkeyFromX509Cert(AsByteSpan(certificate1), pubKey1); if (err != CHIP_NO_ERROR) { - NSLog(@"Can't extract public key from first certificate: %s", ErrorStr(err)); + MTR_LOG_ERROR("Can't extract public key from first certificate: %s", ErrorStr(err)); return NO; } P256PublicKeySpan keySpan1(pubKey1.ConstBytes()); @@ -142,7 +134,7 @@ + (BOOL)isCertificate:(MTRCertificateDERBytes)certificate1 equalTo:(MTRCertifica P256PublicKey pubKey2; err = ExtractPubkeyFromX509Cert(AsByteSpan(certificate2), pubKey2); if (err != CHIP_NO_ERROR) { - NSLog(@"Can't extract public key from second certificate: %s", ErrorStr(err)); + MTR_LOG_ERROR("Can't extract public key from second certificate: %s", ErrorStr(err)); return NO; } P256PublicKeySpan keySpan2(pubKey1.ConstBytes()); @@ -154,14 +146,14 @@ + (BOOL)isCertificate:(MTRCertificateDERBytes)certificate1 equalTo:(MTRCertifica ChipDN subject1; err = ExtractSubjectDNFromX509Cert(AsByteSpan(certificate1), subject1); if (err != CHIP_NO_ERROR) { - NSLog(@"Can't extract subject DN from first certificate: %s", ErrorStr(err)); + MTR_LOG_ERROR("Can't extract subject DN from first certificate: %s", ErrorStr(err)); return NO; } ChipDN subject2; err = ExtractSubjectDNFromX509Cert(AsByteSpan(certificate2), subject2); if (err != CHIP_NO_ERROR) { - NSLog(@"Can't extract subject DN from second certificate: %s", ErrorStr(err)); + MTR_LOG_ERROR("Can't extract subject DN from second certificate: %s", ErrorStr(err)); return NO; } @@ -171,8 +163,6 @@ + (BOOL)isCertificate:(MTRCertificateDERBytes)certificate1 equalTo:(MTRCertifica + (NSData * _Nullable)createCertificateSigningRequest:(id)keypair error:(NSError * __autoreleasing _Nullable * _Nullable)error { - [MTRMemory ensureInit]; - MTRP256KeypairBridge keypairBridge; CHIP_ERROR err = CHIP_NO_ERROR; do { @@ -206,7 +196,7 @@ + (MTRCertificateTLVBytes _Nullable)convertX509Certificate:(MTRCertificateDERByt chip::MutableByteSpan chipCertBytes(chipCertBuffer); CHIP_ERROR errorCode = chip::Credentials::ConvertX509CertToChipCert(x509CertBytes, chipCertBytes); - MTR_LOG_ERROR("ConvertX509CertToChipCert: %{public}s", chip::ErrorStr(errorCode)); + MTR_LOG_ERROR("ConvertX509CertToChipCert: %s", chip::ErrorStr(errorCode)); if (errorCode != CHIP_NO_ERROR) return nil; @@ -224,7 +214,7 @@ + (MTRCertificateDERBytes _Nullable)convertMatterCertificate:(MTRCertificateTLVB CHIP_ERROR errorCode = chip::Credentials::ConvertChipCertToX509Cert(tlvCertBytes, derCertBytes); if (errorCode != CHIP_NO_ERROR) { - MTR_LOG_ERROR("ConvertChipCertToX509Cert: %{public}s", chip::ErrorStr(errorCode)); + MTR_LOG_ERROR("ConvertChipCertToX509Cert: %s", chip::ErrorStr(errorCode)); return nil; } diff --git a/src/darwin/Framework/CHIP/MTRClusterStateCacheContainer.mm b/src/darwin/Framework/CHIP/MTRClusterStateCacheContainer.mm index 81eb66239b596b..72c5517d28f13e 100644 --- a/src/darwin/Framework/CHIP/MTRClusterStateCacheContainer.mm +++ b/src/darwin/Framework/CHIP/MTRClusterStateCacheContainer.mm @@ -23,7 +23,7 @@ #import "MTRDeviceControllerXPCConnection.h" #import "MTRError.h" #import "MTRError_Internal.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #include #include diff --git a/src/darwin/Framework/CHIP/MTRCommissioningParameters.m b/src/darwin/Framework/CHIP/MTRCommissioningParameters.mm similarity index 100% rename from src/darwin/Framework/CHIP/MTRCommissioningParameters.m rename to src/darwin/Framework/CHIP/MTRCommissioningParameters.mm diff --git a/src/darwin/Framework/CHIP/MTRMemory.mm b/src/darwin/Framework/CHIP/MTRDefines.h similarity index 69% rename from src/darwin/Framework/CHIP/MTRMemory.mm rename to src/darwin/Framework/CHIP/MTRDefines.h index f6c94bf4682b18..0751dda4011c77 100644 --- a/src/darwin/Framework/CHIP/MTRMemory.mm +++ b/src/darwin/Framework/CHIP/MTRDefines.h @@ -1,4 +1,5 @@ /** + * * Copyright (c) 2022 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,19 +15,12 @@ * limitations under the License. */ -#import "MTRMemory.h" - -#include - -@implementation MTRMemory +#import -+ (void)ensureInit -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - // The malloc version of MemoryInit never fails. - chip::Platform::MemoryInit(); - }); -} +#define MTR_EXPORT __attribute__((visibility("default"))) -@end +#ifdef __cplusplus +#define MTR_EXTERN extern "C" MTR_EXPORT +#else +#define MTR_EXTERN extern MTR_EXPORT +#endif diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 16537378ff82d4..a145394afd7871 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -25,7 +25,7 @@ #import "MTRDevice_Internal.h" #import "MTRError_Internal.h" #import "MTREventTLVValueDecoder_Internal.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #include "lib/core/CHIPError.h" #include "lib/core/DataModelTypes.h" diff --git a/src/darwin/Framework/CHIP/MTRDeviceAttestationDelegateBridge.mm b/src/darwin/Framework/CHIP/MTRDeviceAttestationDelegateBridge.mm index 4a489aa8ddef7b..2f0c7f9373e913 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceAttestationDelegateBridge.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceAttestationDelegateBridge.mm @@ -18,6 +18,7 @@ #import "MTRDeviceAttestationDelegateBridge.h" #import "MTRDeviceAttestationDelegate_Internal.h" #import "MTRError_Internal.h" +#import "MTRLogging_Internal.h" #import "NSDataSpanConversion.h" void MTRDeviceAttestationDelegateBridge::OnDeviceAttestationCompleted(chip::Controller::DeviceCommissioner * deviceCommissioner, @@ -25,7 +26,8 @@ chip::Credentials::AttestationVerificationResult attestationResult) { dispatch_async(mQueue, ^{ - NSLog(@"MTRDeviceAttestationDelegateBridge::OnDeviceAttestationFailed completed with result: %hu", attestationResult); + MTR_LOG_DEFAULT( + "MTRDeviceAttestationDelegateBridge::OnDeviceAttestationFailed completed with result: %hu", attestationResult); mResult = attestationResult; diff --git a/src/darwin/Framework/CHIP/MTRDeviceController+XPC.m b/src/darwin/Framework/CHIP/MTRDeviceController+XPC.mm similarity index 100% rename from src/darwin/Framework/CHIP/MTRDeviceController+XPC.m rename to src/darwin/Framework/CHIP/MTRDeviceController+XPC.mm diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index c8722212a0d765..c3e1c710e8f861 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -27,7 +27,7 @@ #import "MTRDevice_Internal.h" #import "MTRError_Internal.h" #import "MTRKeypair.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #import "MTROperationalCredentialsDelegate.h" #import "MTRP256KeypairBridge.h" #import "MTRPersistentStorageDelegateBridge.h" diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm index 3ac0883dc61815..bc7865a0594e06 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm @@ -18,6 +18,7 @@ #import "MTRDeviceControllerDelegateBridge.h" #import "MTRDeviceController.h" #import "MTRError_Internal.h" +#import "MTRLogging_Internal.h" MTRDeviceControllerDelegateBridge::MTRDeviceControllerDelegateBridge(void) : mDelegate(nil) @@ -59,7 +60,7 @@ void MTRDeviceControllerDelegateBridge::OnStatusUpdate(chip::Controller::DevicePairingDelegate::Status status) { - NSLog(@"DeviceControllerDelegate status updated: %d", status); + MTR_LOG_DEFAULT("DeviceControllerDelegate status updated: %d", status); id strongDelegate = mDelegate; MTRDeviceController * strongController = mController; @@ -75,7 +76,7 @@ void MTRDeviceControllerDelegateBridge::OnPairingComplete(CHIP_ERROR error) { - NSLog(@"DeviceControllerDelegate Pairing complete. Status %s", chip::ErrorStr(error)); + MTR_LOG_DEFAULT("DeviceControllerDelegate Pairing complete. Status %s", chip::ErrorStr(error)); id strongDelegate = mDelegate; MTRDeviceController * strongController = mController; @@ -91,14 +92,14 @@ void MTRDeviceControllerDelegateBridge::OnPairingDeleted(CHIP_ERROR error) { - NSLog(@"DeviceControllerDelegate Pairing deleted. Status %s", chip::ErrorStr(error)); + MTR_LOG_DEFAULT("DeviceControllerDelegate Pairing deleted. Status %s", chip::ErrorStr(error)); // This is never actually called; just do nothing. } void MTRDeviceControllerDelegateBridge::OnCommissioningComplete(chip::NodeId nodeId, CHIP_ERROR error) { - NSLog(@"DeviceControllerDelegate Commissioning complete. NodeId %llu Status %s", nodeId, chip::ErrorStr(error)); + MTR_LOG_DEFAULT("DeviceControllerDelegate Commissioning complete. NodeId %llu Status %s", nodeId, chip::ErrorStr(error)); id strongDelegate = mDelegate; MTRDeviceController * strongController = mController; diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm index 9167cd047c1209..81f53c4f45d74c 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm @@ -25,8 +25,8 @@ #import "MTRDeviceControllerStartupParams_Internal.h" #import "MTRDeviceController_Internal.h" #import "MTRError_Internal.h" -#import "MTRLogging.h" -#import "MTRMemory.h" +#import "MTRFramework.h" +#import "MTRLogging_Internal.h" #import "MTROTAProviderDelegateBridge.h" #import "MTRP256KeypairBridge.h" #import "MTRPersistentStorageDelegateBridge.h" @@ -50,7 +50,6 @@ static NSString * const kErrorPersistentStorageInit = @"Init failure while creating a persistent storage delegate"; static NSString * const kErrorAttestationTrustStoreInit = @"Init failure while creating the attestation trust store"; static NSString * const kErrorDACVerifierInit = @"Init failure while creating the device attestation verifier"; -static NSString * const kInfoFactoryShutdown = @"Shutting down the Matter controller factory"; static NSString * const kErrorGroupProviderInit = @"Init failure while initializing group data provider"; static NSString * const kErrorControllersInit = @"Init controllers array failure"; static NSString * const kErrorControllerFactoryInit = @"Init failure while initializing controller factory"; @@ -85,6 +84,11 @@ - (MTRDeviceController * _Nullable)maybeInitializeOTAProvider:(MTRDeviceControll @implementation MTRDeviceControllerFactory ++ (void)initialize +{ + MTRFrameworkInit(); +} + + (instancetype)sharedInstance { static MTRDeviceControllerFactory * factory = nil; @@ -105,7 +109,6 @@ - (instancetype)init _running = NO; _chipWorkQueue = DeviceLayer::PlatformMgrImpl().GetWorkQueue(); _controllerFactory = &DeviceControllerFactory::GetInstance(); - [MTRMemory ensureInit]; _groupStorageDelegate = new chip::TestPersistentStorageDelegate(); if ([self checkForInitError:(_groupStorageDelegate != nullptr) logMsg:kErrorGroupProviderInit]) { @@ -414,7 +417,7 @@ - (void)stopControllerFactory [_controllers[0] shutdown]; } - MTR_LOG_DEBUG("%@", kInfoFactoryShutdown); + MTR_LOG_DEBUG("Shutting down the Matter controller factory"); _controllerFactory->Shutdown(); [self cleanupStartupObjects]; diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerOverXPC.m b/src/darwin/Framework/CHIP/MTRDeviceControllerOverXPC.mm similarity index 99% rename from src/darwin/Framework/CHIP/MTRDeviceControllerOverXPC.m rename to src/darwin/Framework/CHIP/MTRDeviceControllerOverXPC.mm index 929e4792535baf..b78f498b2fbb82 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerOverXPC.m +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerOverXPC.mm @@ -21,7 +21,7 @@ #import "MTRDeviceControllerXPCConnection.h" #import "MTRDeviceOverXPC.h" #import "MTRError.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #import diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerStartupParams.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerStartupParams.mm index c2f0242d6ffc20..557864bc28e60b 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerStartupParams.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerStartupParams.mm @@ -17,7 +17,7 @@ #import "MTRDeviceControllerStartupParams.h" #import "MTRCertificates.h" #import "MTRDeviceControllerStartupParams_Internal.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #import "MTRP256KeypairBridge.h" #import "NSDataSpanConversion.h" diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerXPCConnection.m b/src/darwin/Framework/CHIP/MTRDeviceControllerXPCConnection.mm similarity index 99% rename from src/darwin/Framework/CHIP/MTRDeviceControllerXPCConnection.m rename to src/darwin/Framework/CHIP/MTRDeviceControllerXPCConnection.mm index a5513da513a0d1..dc5cec1081dbf7 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerXPCConnection.m +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerXPCConnection.mm @@ -17,7 +17,7 @@ #import "MTRDeviceControllerXPCConnection.h" #import "MTRDeviceControllerOverXPC.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #import diff --git a/src/darwin/Framework/CHIP/MTRDeviceOverXPC.m b/src/darwin/Framework/CHIP/MTRDeviceOverXPC.mm similarity index 99% rename from src/darwin/Framework/CHIP/MTRDeviceOverXPC.m rename to src/darwin/Framework/CHIP/MTRDeviceOverXPC.mm index a746d0aabe4c0a..cea5e0308e595a 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceOverXPC.m +++ b/src/darwin/Framework/CHIP/MTRDeviceOverXPC.mm @@ -23,7 +23,7 @@ #import "MTRDeviceControllerOverXPC_Internal.h" #import "MTRDeviceControllerXPCConnection.h" #import "MTRError.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" NS_ASSUME_NONNULL_BEGIN diff --git a/src/darwin/Framework/CHIP/MTRMemory.h b/src/darwin/Framework/CHIP/MTRFramework.h similarity index 53% rename from src/darwin/Framework/CHIP/MTRMemory.h rename to src/darwin/Framework/CHIP/MTRFramework.h index 124e47e92fcecc..0017081b318d8f 100644 --- a/src/darwin/Framework/CHIP/MTRMemory.h +++ b/src/darwin/Framework/CHIP/MTRFramework.h @@ -14,27 +14,7 @@ * limitations under the License. */ -#pragma once - -/** - * Utility to initialize the Matter memory subsystem. Not a public framework - * header. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface MTRMemory : NSObject /** - * Ensure Matter Platform::Memory is initialized. This only needs to happen - * once per process, because in practice we just use malloc/free so there is - * nothing to initialize, so this just needs to happen to avoid debug - * assertions. This class handles ensuring the initialization only happens - * once. + * Performs per-process initialization of the Matter stack. */ -+ (void)ensureInit; - -@end - -NS_ASSUME_NONNULL_END +void MTRFrameworkInit(); diff --git a/src/darwin/Framework/CHIP/MTRFramework.mm b/src/darwin/Framework/CHIP/MTRFramework.mm new file mode 100644 index 00000000000000..e6a0e672955be3 --- /dev/null +++ b/src/darwin/Framework/CHIP/MTRFramework.mm @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MTRFramework.h" + +#include +#include +#include + +void MTRFrameworkInit() +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // Ensure Matter Platform::Memory is initialized. This only needs + // to happen once per process, because in practice we just use + // malloc/free so there is nothing to initialize, so this just needs + // to happen to avoid debug assertions. The malloc version of + // MemoryInit() never fails. + chip::Platform::MemoryInit(); + + // Suppress CHIP logging until we actually need it for redirection + // (see MTRSetLogCallback()). Logging to os_log is always enabled. + chip::Logging::SetLogFilter(chip::Logging::kLogCategory_None); + }); +} diff --git a/src/darwin/Framework/CHIP/MTRLogging.h b/src/darwin/Framework/CHIP/MTRLogging.h index f2bcb33f12d555..104c7987a9090e 100644 --- a/src/darwin/Framework/CHIP/MTRLogging.h +++ b/src/darwin/Framework/CHIP/MTRLogging.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2020 Project CHIP Authors + * Copyright (c) 2022 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,28 @@ * limitations under the License. */ -#import +#import -#define MTR_LOG_FAULT(format, ...) os_log_fault(OS_LOG_DEFAULT, format, ##__VA_ARGS__) -#define MTR_LOG_ERROR(format, ...) os_log_error(OS_LOG_DEFAULT, format, ##__VA_ARGS__) -#define MTR_LOG_INFO(format, ...) os_log_info(OS_LOG_DEFAULT, format, ##__VA_ARGS__) -#define MTR_LOG_DEBUG(format, ...) os_log_debug(OS_LOG_DEFAULT, format, ##__VA_ARGS__) +NS_ASSUME_NONNULL_BEGIN -#define MTR_LOG_METHOD_ENTRY() \ - ({ os_log_debug(OS_LOG_DEFAULT, "[<%@: %p> %@]", NSStringFromClass([self class]), self, NSStringFromSelector(_cmd)); }) +typedef NS_ENUM(NSInteger, MTRLogType) { + MTRLogTypeError = 1, + MTRLogTypeProgress = 2, + MTRLogTypeDetail = 3, +}; + +typedef void (^MTRLogCallback)(MTRLogType type, NSString * moduleName, NSString * message); + +/** + * Arranges for log messages from the Matter stack to be delivered to a callback block. + * + * @param logTypeThreshold only messages up to (and including) the specified log type will be delivered + * @param callback the block to call, or nil to disable the log callback. + * + * The callback block may be called concurrently and/or from arbitrary threads. + * It SHALL NOT call back directly or indirectly into any Matter APIs, + * nor block the calling thread for a non-trivial amount of time. + */ +MTR_EXTERN MTR_NEWLY_AVAILABLE void MTRSetLogCallback(MTRLogType logTypeThreshold, MTRLogCallback _Nullable callback); + +NS_ASSUME_NONNULL_END diff --git a/src/darwin/Framework/CHIP/MTRLogging.mm b/src/darwin/Framework/CHIP/MTRLogging.mm new file mode 100644 index 00000000000000..23b310a37a05fa --- /dev/null +++ b/src/darwin/Framework/CHIP/MTRLogging.mm @@ -0,0 +1,70 @@ +/* + * + * Copyright (c) 2022 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MTRLogging_Internal.h" + +#import "MTRFramework.h" + +#import +#import +#import + +using namespace chip::Logging; + +static_assert(MTRLogTypeError == (NSInteger) kLogCategory_Error, "MTRLogType* != kLogCategory_*"); +static_assert(MTRLogTypeProgress == (NSInteger) kLogCategory_Progress, "MTRLogType* != kLogCategory_*"); +static_assert(MTRLogTypeDetail == (NSInteger) kLogCategory_Detail, "MTRLogType* != kLogCategory_*"); + +static os_unfair_lock logCallbackLock = OS_UNFAIR_LOCK_INIT; +static MTRLogCallback logCallback = nil; + +static void MTRLogCallbackTrampoline(const char * moduleName, uint8_t category, const char * format, va_list args) +{ + os_unfair_lock_lock(&logCallbackLock); + MTRLogCallback callback = logCallback; + os_unfair_lock_unlock(&logCallbackLock); + if (!callback) { + return; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wformat-nonliteral" + // Note: Format using NSString so that '%@' placeholders are supported + NSString * message = [[NSString alloc] initWithFormat:@(format) arguments:args]; +#pragma clang diagnostic pop + + auto type = std::min(static_cast(category), MTRLogTypeDetail); // hide kLogCategory_Automation + callback(type, @(moduleName), message); +} + +void MTRSetLogCallback(MTRLogType logTypeThreshold, MTRLogCallback _Nullable callback) +{ + MTRFrameworkInit(); + + os_unfair_lock_lock(&logCallbackLock); + if (callback) { + SetLogRedirectCallback(&MTRLogCallbackTrampoline); + SetLogFilter(static_cast(std::min(std::max(logTypeThreshold, MTRLogTypeError), MTRLogTypeDetail))); + logCallback = callback; + } else { + logCallback = nil; + SetLogFilter(kLogCategory_None); + SetLogRedirectCallback(nullptr); + } + os_unfair_lock_unlock(&logCallbackLock); +} diff --git a/src/darwin/Framework/CHIP/MTRLogging_Internal.h b/src/darwin/Framework/CHIP/MTRLogging_Internal.h new file mode 100644 index 00000000000000..9b2d2fce418822 --- /dev/null +++ b/src/darwin/Framework/CHIP/MTRLogging_Internal.h @@ -0,0 +1,26 @@ +/* + * + * Copyright (c) 2020 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#include + +#define MTR_LOG_ERROR(msg, ...) ChipLogError(NotSpecified, msg, ##__VA_ARGS__) +#define MTR_LOG_DEFAULT(msg, ...) ChipLogProgress(NotSpecified, msg, ##__VA_ARGS__) +#define MTR_LOG_INFO(msg, ...) ChipLogDetail(NotSpecified, msg, ##__VA_ARGS__) +#define MTR_LOG_DEBUG(msg, ...) ChipLogDetail(NotSpecified, msg, ##__VA_ARGS__) // same as INFO diff --git a/src/darwin/Framework/CHIP/MTRManualSetupPayloadParser.mm b/src/darwin/Framework/CHIP/MTRManualSetupPayloadParser.mm index fc493afb507c91..3a0435de6dc99d 100644 --- a/src/darwin/Framework/CHIP/MTRManualSetupPayloadParser.mm +++ b/src/darwin/Framework/CHIP/MTRManualSetupPayloadParser.mm @@ -17,8 +17,8 @@ #import "MTRManualSetupPayloadParser.h" #import "MTRError_Internal.h" -#import "MTRLogging.h" -#import "MTRMemory.h" +#import "MTRFramework.h" +#import "MTRLogging_Internal.h" #import "MTRSetupPayload_Internal.h" #import @@ -29,10 +29,14 @@ @implementation MTRManualSetupPayloadParser { chip::ManualSetupPayloadParser * _chipManualSetupPayloadParser; } ++ (void)initialize +{ + MTRFrameworkInit(); +} + - (id)initWithDecimalStringRepresentation:(NSString *)decimalStringRepresentation { if (self = [super init]) { - [MTRMemory ensureInit]; _decimalStringRepresentation = decimalStringRepresentation; _chipManualSetupPayloadParser = new chip::ManualSetupPayloadParser(std::string([decimalStringRepresentation UTF8String])); } diff --git a/src/darwin/Framework/CHIP/MTROnboardingPayloadParser.m b/src/darwin/Framework/CHIP/MTROnboardingPayloadParser.mm similarity index 100% rename from src/darwin/Framework/CHIP/MTROnboardingPayloadParser.m rename to src/darwin/Framework/CHIP/MTROnboardingPayloadParser.mm diff --git a/src/darwin/Framework/CHIP/MTROperationalCredentialsDelegate.mm b/src/darwin/Framework/CHIP/MTROperationalCredentialsDelegate.mm index 0703f4c065e76b..ba11b3c947a479 100644 --- a/src/darwin/Framework/CHIP/MTROperationalCredentialsDelegate.mm +++ b/src/darwin/Framework/CHIP/MTROperationalCredentialsDelegate.mm @@ -21,10 +21,8 @@ #import -#include - #import "MTRCertificates.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #import "NSDataSpanConversion.h" #include @@ -94,12 +92,12 @@ uint32_t validityStart, validityEnd; if (!ToChipEpochTime(0, validityStart)) { - NSLog(@"Failed in computing certificate validity start date"); + MTR_LOG_ERROR("Failed in computing certificate validity start date"); return CHIP_ERROR_INTERNAL; } if (!ToChipEpochTime(kCertificateValiditySecs, validityEnd)) { - NSLog(@"Failed in computing certificate validity end date"); + MTR_LOG_ERROR("Failed in computing certificate validity end date"); return CHIP_ERROR_INTERNAL; } @@ -378,12 +376,12 @@ uint64_t GetIssuerId(NSNumber * _Nullable providedIssuerId) uint32_t validityStart, validityEnd; if (!ToChipEpochTime(0, validityStart)) { - NSLog(@"Failed in computing certificate validity start date"); + MTR_LOG_ERROR("Failed in computing certificate validity start date"); return CHIP_ERROR_INTERNAL; } if (!ToChipEpochTime(kCertificateValiditySecs, validityEnd)) { - NSLog(@"Failed in computing certificate validity end date"); + MTR_LOG_ERROR("Failed in computing certificate validity end date"); return CHIP_ERROR_INTERNAL; } @@ -428,12 +426,12 @@ uint64_t GetIssuerId(NSNumber * _Nullable providedIssuerId) uint32_t validityStart, validityEnd; if (!ToChipEpochTime(0, validityStart)) { - NSLog(@"Failed in computing certificate validity start date"); + MTR_LOG_ERROR("Failed in computing certificate validity start date"); return CHIP_ERROR_INTERNAL; } if (!ToChipEpochTime(kCertificateValiditySecs, validityEnd)) { - NSLog(@"Failed in computing certificate validity end date"); + MTR_LOG_ERROR("Failed in computing certificate validity end date"); return CHIP_ERROR_INTERNAL; } diff --git a/src/darwin/Framework/CHIP/MTRP256KeypairBridge.mm b/src/darwin/Framework/CHIP/MTRP256KeypairBridge.mm index c1045a428eb3f7..d253baa8dbf95c 100644 --- a/src/darwin/Framework/CHIP/MTRP256KeypairBridge.mm +++ b/src/darwin/Framework/CHIP/MTRP256KeypairBridge.mm @@ -18,11 +18,11 @@ #import "MTRP256KeypairBridge.h" #import "NSDataSpanConversion.h" -#import +#import #include #import "MTRKeypair.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" using namespace chip::Crypto; @@ -31,7 +31,7 @@ if (![keypair respondsToSelector:@selector(signMessageECDSA_DER:)] && ![keypair respondsToSelector:@selector(signMessageECDSA_RAW:)]) { // Not a valid MTRKeypair implementation. - NSLog(@"Keypair does not support message signing"); + MTR_LOG_ERROR("Keypair does not support message signing"); return CHIP_ERROR_INVALID_ARGUMENT; } diff --git a/src/darwin/Framework/CHIP/MTRPersistentStorageDelegateBridge.mm b/src/darwin/Framework/CHIP/MTRPersistentStorageDelegateBridge.mm index fdcde68d6799cc..69e4103645d4ea 100644 --- a/src/darwin/Framework/CHIP/MTRPersistentStorageDelegateBridge.mm +++ b/src/darwin/Framework/CHIP/MTRPersistentStorageDelegateBridge.mm @@ -17,6 +17,8 @@ #import "MTRPersistentStorageDelegateBridge.h" +#import "MTRLogging_Internal.h" + #define LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE 0 MTRPersistentStorageDelegateBridge::MTRPersistentStorageDelegateBridge(id delegate) @@ -38,7 +40,7 @@ dispatch_sync(mWorkQueue, ^{ #if LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE - NSLog(@"PersistentStorageDelegate Sync Get Value for Key: %@", keyString); + MTR_LOG_DEBUG("PersistentStorageDelegate Sync Get Value for Key: %@", keyString); #endif NSData * value = [mDelegate storageDataForKey:keyString]; @@ -81,7 +83,7 @@ __block CHIP_ERROR error = CHIP_NO_ERROR; dispatch_sync(mWorkQueue, ^{ #if LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE - NSLog(@"PersistentStorageDelegate Set Key %@", keyString); + MTR_LOG_DEBUG("PersistentStorageDelegate Set Key %@", keyString); #endif if ([mDelegate setStorageData:valueData forKey:keyString] == NO) { @@ -99,7 +101,7 @@ __block CHIP_ERROR error = CHIP_NO_ERROR; dispatch_sync(mWorkQueue, ^{ #if LOG_DEBUG_PERSISTENT_STORAGE_DELEGATE - NSLog(@"PersistentStorageDelegate Delete Key: %@", keyString); + MTR_LOG_DEBUG("PersistentStorageDelegate Delete Key: %@", keyString); #endif if ([mDelegate removeStorageDataForKey:keyString] == NO) { diff --git a/src/darwin/Framework/CHIP/MTRQRCodeSetupPayloadParser.mm b/src/darwin/Framework/CHIP/MTRQRCodeSetupPayloadParser.mm index 8d0354c0cef147..bbb8042bb65e6e 100644 --- a/src/darwin/Framework/CHIP/MTRQRCodeSetupPayloadParser.mm +++ b/src/darwin/Framework/CHIP/MTRQRCodeSetupPayloadParser.mm @@ -17,8 +17,8 @@ #import "MTRQRCodeSetupPayloadParser.h" #import "MTRError_Internal.h" -#import "MTRLogging.h" -#import "MTRMemory.h" +#import "MTRFramework.h" +#import "MTRLogging_Internal.h" #import "MTRSetupPayload_Internal.h" #import @@ -29,10 +29,14 @@ @implementation MTRQRCodeSetupPayloadParser { chip::QRCodeSetupPayloadParser * _chipQRCodeSetupPayloadParser; } ++ (void)initialize +{ + MTRFrameworkInit(); +} + - (id)initWithBase38Representation:(NSString *)base38Representation { if (self = [super init]) { - [MTRMemory ensureInit]; _base38Representation = base38Representation; _chipQRCodeSetupPayloadParser = new chip::QRCodeSetupPayloadParser(std::string([base38Representation UTF8String])); } diff --git a/src/darwin/Framework/CHIP/MTRThreadOperationalDataset.mm b/src/darwin/Framework/CHIP/MTRThreadOperationalDataset.mm index fb50d87981b845..dc8876b870f425 100644 --- a/src/darwin/Framework/CHIP/MTRThreadOperationalDataset.mm +++ b/src/darwin/Framework/CHIP/MTRThreadOperationalDataset.mm @@ -17,7 +17,7 @@ #import "MTRThreadOperationalDataset.h" -#include "MTRLogging.h" +#include "MTRLogging_Internal.h" #include #include diff --git a/src/darwin/Framework/CHIP/Matter.h b/src/darwin/Framework/CHIP/Matter.h index 5fd4b1483cc007..179c28424581ba 100644 --- a/src/darwin/Framework/CHIP/Matter.h +++ b/src/darwin/Framework/CHIP/Matter.h @@ -37,6 +37,7 @@ #import #import #import +#import #import #import #import @@ -46,6 +47,7 @@ #import #import #import +#import #import #import #import diff --git a/src/darwin/Framework/CHIP/Resources/Logging/com.csa.matter.plist b/src/darwin/Framework/CHIP/Resources/Logging/com.csa.matter.plist new file mode 100644 index 00000000000000..68261053076d7c --- /dev/null +++ b/src/darwin/Framework/CHIP/Resources/Logging/com.csa.matter.plist @@ -0,0 +1,18 @@ + + + + + DEFAULT-OPTIONS + + Default-Privacy-Setting + public + Level + + Enable + info + Persist + default + + + + diff --git a/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt b/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt index b37dd1674d7bf1..dcb06b5321854f 100644 --- a/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt +++ b/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt @@ -12,7 +12,7 @@ #import "MTRCluster_internal.h" #import "MTRStructsObjc.h" #import "MTRCommandPayloadsObjc.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #include #include diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm index f0d5060132cdd7..46da7e4c81f63c 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm @@ -26,7 +26,7 @@ #import "MTRCommandPayloadsObjc.h" #import "MTRDevice.h" #import "MTRDevice_Internal.h" -#import "MTRLogging.h" +#import "MTRLogging_Internal.h" #import "MTRStructsObjc.h" #include diff --git a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj index a8394387ea941f..af1f6c339433e5 100644 --- a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj +++ b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj @@ -33,10 +33,15 @@ 2CB7163F252F731E0026E2BB /* MTRDeviceControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CB7163E252F731E0026E2BB /* MTRDeviceControllerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2FD775552695557E00FF4B12 /* error-mapping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2FD775542695557E00FF4B12 /* error-mapping.cpp */; }; 3CF134A7289D8ADA0017A19E /* MTRCSRInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CF134A6289D8AD90017A19E /* MTRCSRInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3CF134A9289D8D800017A19E /* MTRCSRInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF134A8289D8D800017A19E /* MTRCSRInfo.m */; }; + 3CF134A9289D8D800017A19E /* MTRCSRInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3CF134A8289D8D800017A19E /* MTRCSRInfo.mm */; }; 3CF134AB289D8DF70017A19E /* MTRAttestationInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CF134AA289D8DF70017A19E /* MTRAttestationInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3CF134AD289D8E570017A19E /* MTRAttestationInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF134AC289D8E570017A19E /* MTRAttestationInfo.m */; }; + 3CF134AD289D8E570017A19E /* MTRAttestationInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3CF134AC289D8E570017A19E /* MTRAttestationInfo.mm */; }; 3CF134AF289D90FF0017A19E /* MTRNOCChainIssuer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CF134AE289D90FF0017A19E /* MTRNOCChainIssuer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D69868529383096007314E7 /* com.csa.matter.plist in Copy Logging Preferences */ = {isa = PBXBuildFile; fileRef = 3D69868029382EF4007314E7 /* com.csa.matter.plist */; }; + 3DECCB6E29347D2D00585AEC /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DECCB6D29347D2C00585AEC /* Security.framework */; }; + 3DECCB702934AECD00585AEC /* MTRLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DECCB6F2934AC1C00585AEC /* MTRLogging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3DECCB722934AFE200585AEC /* MTRLogging.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DECCB712934AFE200585AEC /* MTRLogging.mm */; }; + 3DECCB742934C21B00585AEC /* MTRDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DECCB732934C21B00585AEC /* MTRDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5112F606287CD2C100B827E7 /* privilege-storage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5112F605287CD2C100B827E7 /* privilege-storage.cpp */; }; 511913FB28C100EF009235E9 /* MTRBaseSubscriptionCallback.mm in Sources */ = {isa = PBXBuildFile; fileRef = 511913F928C100EF009235E9 /* MTRBaseSubscriptionCallback.mm */; }; 511913FC28C100EF009235E9 /* MTRBaseSubscriptionCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 511913FA28C100EF009235E9 /* MTRBaseSubscriptionCallback.h */; }; @@ -50,8 +55,8 @@ 514304202914CED9004DC7FE /* generic-callback-stubs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5143041F2914CED9004DC7FE /* generic-callback-stubs.cpp */; }; 51431AF927D2973E008A7943 /* MTRIMDispatch.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51431AF827D2973E008A7943 /* MTRIMDispatch.mm */; }; 51431AFB27D29CA4008A7943 /* ota-provider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51431AFA27D29CA4008A7943 /* ota-provider.cpp */; }; - 515C1C6F284F9FFB00A48F0C /* MTRMemory.mm in Sources */ = {isa = PBXBuildFile; fileRef = 515C1C6D284F9FFB00A48F0C /* MTRMemory.mm */; }; - 515C1C70284F9FFB00A48F0C /* MTRMemory.h in Headers */ = {isa = PBXBuildFile; fileRef = 515C1C6E284F9FFB00A48F0C /* MTRMemory.h */; }; + 515C1C6F284F9FFB00A48F0C /* MTRFramework.mm in Sources */ = {isa = PBXBuildFile; fileRef = 515C1C6D284F9FFB00A48F0C /* MTRFramework.mm */; }; + 515C1C70284F9FFB00A48F0C /* MTRFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 515C1C6E284F9FFB00A48F0C /* MTRFramework.h */; }; 51669AF02913204400F4AA36 /* MTRBackwardsCompatTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 51669AEF2913204400F4AA36 /* MTRBackwardsCompatTests.m */; }; 517BF3F0282B62B800A8B7DB /* MTRCertificates.h in Headers */ = {isa = PBXBuildFile; fileRef = 517BF3EE282B62B800A8B7DB /* MTRCertificates.h */; settings = {ATTRIBUTES = (Public, ); }; }; 517BF3F1282B62B800A8B7DB /* MTRCertificates.mm in Sources */ = {isa = PBXBuildFile; fileRef = 517BF3EF282B62B800A8B7DB /* MTRCertificates.mm */; }; @@ -70,15 +75,15 @@ 51E51FC0282AD37A00FC978D /* MTRDeviceControllerStartupParams_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E51FBD282AD37A00FC978D /* MTRDeviceControllerStartupParams_Internal.h */; }; 51E51FC1282AD37A00FC978D /* MTRDeviceControllerStartupParams.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51E51FBE282AD37A00FC978D /* MTRDeviceControllerStartupParams.mm */; }; 5A60370827EA1FF60020DB79 /* MTRClusterStateCacheContainer+XPC.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A60370727EA1FF60020DB79 /* MTRClusterStateCacheContainer+XPC.h */; }; - 5A6FEC9027B563D900F25F42 /* MTRDeviceControllerOverXPC.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A6FEC8F27B563D900F25F42 /* MTRDeviceControllerOverXPC.m */; }; + 5A6FEC9027B563D900F25F42 /* MTRDeviceControllerOverXPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5A6FEC8F27B563D900F25F42 /* MTRDeviceControllerOverXPC.mm */; }; 5A6FEC9227B5669C00F25F42 /* MTRDeviceControllerOverXPC.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A6FEC8D27B5624E00F25F42 /* MTRDeviceControllerOverXPC.h */; }; - 5A6FEC9627B5983000F25F42 /* MTRDeviceControllerXPCConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A6FEC9527B5983000F25F42 /* MTRDeviceControllerXPCConnection.m */; }; - 5A6FEC9827B5C6AF00F25F42 /* MTRDeviceOverXPC.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A6FEC9727B5C6AF00F25F42 /* MTRDeviceOverXPC.m */; }; + 5A6FEC9627B5983000F25F42 /* MTRDeviceControllerXPCConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5A6FEC9527B5983000F25F42 /* MTRDeviceControllerXPCConnection.mm */; }; + 5A6FEC9827B5C6AF00F25F42 /* MTRDeviceOverXPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5A6FEC9727B5C6AF00F25F42 /* MTRDeviceOverXPC.mm */; }; 5A6FEC9927B5C88900F25F42 /* MTRDeviceOverXPC.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A6FEC8B27B5609C00F25F42 /* MTRDeviceOverXPC.h */; }; 5A6FEC9A27B5C89300F25F42 /* MTRDeviceControllerXPCConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A6FEC9427B5976200F25F42 /* MTRDeviceControllerXPCConnection.h */; }; 5A6FEC9D27B5E48900F25F42 /* MTRXPCProtocolTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A6FEC9C27B5E48800F25F42 /* MTRXPCProtocolTests.m */; }; 5A7947DE27BEC3F500434CF2 /* MTRXPCListenerSampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A7947DD27BEC3F500434CF2 /* MTRXPCListenerSampleTests.m */; }; - 5A7947E427C0129600434CF2 /* MTRDeviceController+XPC.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A7947E327C0129500434CF2 /* MTRDeviceController+XPC.m */; }; + 5A7947E427C0129600434CF2 /* MTRDeviceController+XPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5A7947E327C0129500434CF2 /* MTRDeviceController+XPC.mm */; }; 5A7947E527C0129F00434CF2 /* MTRDeviceController+XPC.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A7947E227C0101200434CF2 /* MTRDeviceController+XPC.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5A830D6C27CFCF590053B85D /* MTRDeviceControllerOverXPC_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A830D6B27CFCF590053B85D /* MTRDeviceControllerOverXPC_Internal.h */; }; 5ACDDD7A27CD129700EFD68A /* MTRClusterStateCacheContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ACDDD7927CD129700EFD68A /* MTRClusterStateCacheContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -105,7 +110,7 @@ 88EBF8D027FABDD500686BC1 /* MTRDeviceAttestationDelegateBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 88EBF8CD27FABDD500686BC1 /* MTRDeviceAttestationDelegateBridge.h */; }; 991DC0842475F45400C13860 /* MTRDeviceController.h in Headers */ = {isa = PBXBuildFile; fileRef = 991DC0822475F45400C13860 /* MTRDeviceController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 991DC0892475F47D00C13860 /* MTRDeviceController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 991DC0872475F47D00C13860 /* MTRDeviceController.mm */; }; - 991DC08B247704DC00C13860 /* MTRLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 991DC08A247704DC00C13860 /* MTRLogging.h */; }; + 991DC08B247704DC00C13860 /* MTRLogging_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 991DC08A247704DC00C13860 /* MTRLogging_Internal.h */; }; 9956064426420367000C28DE /* MTRSetupPayload_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9956064326420367000C28DE /* MTRSetupPayload_Internal.h */; }; 997DED162695343400975E97 /* MTRThreadOperationalDataset.mm in Sources */ = {isa = PBXBuildFile; fileRef = 997DED152695343400975E97 /* MTRThreadOperationalDataset.mm */; }; 997DED182695344800975E97 /* MTRThreadOperationalDataset.h in Headers */ = {isa = PBXBuildFile; fileRef = 997DED172695344800975E97 /* MTRThreadOperationalDataset.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -113,7 +118,7 @@ 998F286D26D55E10001846C6 /* MTRKeypair.h in Headers */ = {isa = PBXBuildFile; fileRef = 998F286C26D55E10001846C6 /* MTRKeypair.h */; settings = {ATTRIBUTES = (Public, ); }; }; 998F286F26D55EC5001846C6 /* MTRP256KeypairBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 998F286E26D55EC5001846C6 /* MTRP256KeypairBridge.h */; }; 998F287126D56940001846C6 /* MTRP256KeypairBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 998F287026D56940001846C6 /* MTRP256KeypairBridge.mm */; }; - 99AECC802798A57F00B6355B /* MTRCommissioningParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 99AECC7F2798A57E00B6355B /* MTRCommissioningParameters.m */; }; + 99AECC802798A57F00B6355B /* MTRCommissioningParameters.mm in Sources */ = {isa = PBXBuildFile; fileRef = 99AECC7F2798A57E00B6355B /* MTRCommissioningParameters.mm */; }; 99C65E10267282F1003402F6 /* MTRControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 99C65E0F267282F1003402F6 /* MTRControllerTests.m */; }; 99D466E12798936D0089A18F /* MTRCommissioningParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 99D466E02798936D0089A18F /* MTRCommissioningParameters.h */; settings = {ATTRIBUTES = (Public, ); }; }; AF1CB86E2874B03B00865A96 /* MTROTAProviderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = AF1CB86D2874B03B00865A96 /* MTROTAProviderDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -121,7 +126,7 @@ AF5F90FF2878D351005503FA /* MTROTAProviderDelegateBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = AF5F90FE2878D351005503FA /* MTROTAProviderDelegateBridge.mm */; }; B20252972459E34F00F97062 /* Matter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B202528D2459E34F00F97062 /* Matter.framework */; }; B289D4212639C0D300D4E314 /* MTROnboardingPayloadParser.h in Headers */ = {isa = PBXBuildFile; fileRef = B289D41F2639C0D300D4E314 /* MTROnboardingPayloadParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B289D4222639C0D300D4E314 /* MTROnboardingPayloadParser.m in Sources */ = {isa = PBXBuildFile; fileRef = B289D4202639C0D300D4E314 /* MTROnboardingPayloadParser.m */; }; + B289D4222639C0D300D4E314 /* MTROnboardingPayloadParser.mm in Sources */ = {isa = PBXBuildFile; fileRef = B289D4202639C0D300D4E314 /* MTROnboardingPayloadParser.mm */; }; B2E0D7B1245B0B5C003C5B48 /* Matter.h in Headers */ = {isa = PBXBuildFile; fileRef = B2E0D7A8245B0B5C003C5B48 /* Matter.h */; settings = {ATTRIBUTES = (Public, ); }; }; B2E0D7B2245B0B5C003C5B48 /* MTRManualSetupPayloadParser.h in Headers */ = {isa = PBXBuildFile; fileRef = B2E0D7A9245B0B5C003C5B48 /* MTRManualSetupPayloadParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; B2E0D7B3245B0B5C003C5B48 /* MTRError.mm in Sources */ = {isa = PBXBuildFile; fileRef = B2E0D7AA245B0B5C003C5B48 /* MTRError.mm */; }; @@ -146,6 +151,20 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 3D69868429383083007314E7 /* Copy Logging Preferences */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = "$(SYSTEM_LIBRARY_DIR)/Preferences/Logging/Subsystems"; + dstSubfolderSpec = 0; + files = ( + 3D69868529383096007314E7 /* com.csa.matter.plist in Copy Logging Preferences */, + ); + name = "Copy Logging Preferences"; + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1E748B3828941A44008A1BE8 /* MTRTestOTAProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRTestOTAProvider.m; sourceTree = ""; }; 1E748B3928941A45008A1BE8 /* MTRTestOTAProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRTestOTAProvider.h; sourceTree = ""; }; @@ -174,10 +193,15 @@ 2CB7163E252F731E0026E2BB /* MTRDeviceControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRDeviceControllerDelegate.h; sourceTree = ""; }; 2FD775542695557E00FF4B12 /* error-mapping.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "error-mapping.cpp"; path = "../../../app/util/error-mapping.cpp"; sourceTree = ""; }; 3CF134A6289D8AD90017A19E /* MTRCSRInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRCSRInfo.h; sourceTree = ""; }; - 3CF134A8289D8D800017A19E /* MTRCSRInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRCSRInfo.m; sourceTree = ""; }; + 3CF134A8289D8D800017A19E /* MTRCSRInfo.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRCSRInfo.mm; sourceTree = ""; }; 3CF134AA289D8DF70017A19E /* MTRAttestationInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRAttestationInfo.h; sourceTree = ""; }; - 3CF134AC289D8E570017A19E /* MTRAttestationInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRAttestationInfo.m; sourceTree = ""; }; + 3CF134AC289D8E570017A19E /* MTRAttestationInfo.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRAttestationInfo.mm; sourceTree = ""; }; 3CF134AE289D90FF0017A19E /* MTRNOCChainIssuer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRNOCChainIssuer.h; sourceTree = ""; }; + 3D69868029382EF4007314E7 /* com.csa.matter.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = com.csa.matter.plist; sourceTree = ""; }; + 3DECCB6D29347D2C00585AEC /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 3DECCB6F2934AC1C00585AEC /* MTRLogging.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRLogging.h; sourceTree = ""; }; + 3DECCB712934AFE200585AEC /* MTRLogging.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRLogging.mm; sourceTree = ""; }; + 3DECCB732934C21B00585AEC /* MTRDefines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDefines.h; sourceTree = ""; }; 5112F605287CD2C100B827E7 /* privilege-storage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "privilege-storage.cpp"; path = "../../../app/util/privilege-storage.cpp"; sourceTree = ""; }; 511913F928C100EF009235E9 /* MTRBaseSubscriptionCallback.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRBaseSubscriptionCallback.mm; sourceTree = ""; }; 511913FA28C100EF009235E9 /* MTRBaseSubscriptionCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRBaseSubscriptionCallback.h; sourceTree = ""; }; @@ -191,8 +215,8 @@ 5143041F2914CED9004DC7FE /* generic-callback-stubs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "generic-callback-stubs.cpp"; path = "../../../app/util/generic-callback-stubs.cpp"; sourceTree = ""; }; 51431AF827D2973E008A7943 /* MTRIMDispatch.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRIMDispatch.mm; sourceTree = ""; }; 51431AFA27D29CA4008A7943 /* ota-provider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ota-provider.cpp"; path = "../../../app/clusters/ota-provider/ota-provider.cpp"; sourceTree = ""; }; - 515C1C6D284F9FFB00A48F0C /* MTRMemory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRMemory.mm; sourceTree = ""; }; - 515C1C6E284F9FFB00A48F0C /* MTRMemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRMemory.h; sourceTree = ""; }; + 515C1C6D284F9FFB00A48F0C /* MTRFramework.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRFramework.mm; sourceTree = ""; }; + 515C1C6E284F9FFB00A48F0C /* MTRFramework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRFramework.h; sourceTree = ""; }; 51669AEF2913204400F4AA36 /* MTRBackwardsCompatTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRBackwardsCompatTests.m; sourceTree = ""; }; 517BF3EE282B62B800A8B7DB /* MTRCertificates.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRCertificates.h; sourceTree = ""; }; 517BF3EF282B62B800A8B7DB /* MTRCertificates.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRCertificates.mm; sourceTree = ""; }; @@ -213,14 +237,14 @@ 5A60370727EA1FF60020DB79 /* MTRClusterStateCacheContainer+XPC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MTRClusterStateCacheContainer+XPC.h"; sourceTree = ""; }; 5A6FEC8B27B5609C00F25F42 /* MTRDeviceOverXPC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDeviceOverXPC.h; sourceTree = ""; }; 5A6FEC8D27B5624E00F25F42 /* MTRDeviceControllerOverXPC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDeviceControllerOverXPC.h; sourceTree = ""; }; - 5A6FEC8F27B563D900F25F42 /* MTRDeviceControllerOverXPC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRDeviceControllerOverXPC.m; sourceTree = ""; }; + 5A6FEC8F27B563D900F25F42 /* MTRDeviceControllerOverXPC.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRDeviceControllerOverXPC.mm; sourceTree = ""; }; 5A6FEC9427B5976200F25F42 /* MTRDeviceControllerXPCConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDeviceControllerXPCConnection.h; sourceTree = ""; }; - 5A6FEC9527B5983000F25F42 /* MTRDeviceControllerXPCConnection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRDeviceControllerXPCConnection.m; sourceTree = ""; }; - 5A6FEC9727B5C6AF00F25F42 /* MTRDeviceOverXPC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRDeviceOverXPC.m; sourceTree = ""; }; + 5A6FEC9527B5983000F25F42 /* MTRDeviceControllerXPCConnection.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRDeviceControllerXPCConnection.mm; sourceTree = ""; }; + 5A6FEC9727B5C6AF00F25F42 /* MTRDeviceOverXPC.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRDeviceOverXPC.mm; sourceTree = ""; }; 5A6FEC9C27B5E48800F25F42 /* MTRXPCProtocolTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRXPCProtocolTests.m; sourceTree = ""; }; 5A7947DD27BEC3F500434CF2 /* MTRXPCListenerSampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRXPCListenerSampleTests.m; sourceTree = ""; }; 5A7947E227C0101200434CF2 /* MTRDeviceController+XPC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MTRDeviceController+XPC.h"; sourceTree = ""; }; - 5A7947E327C0129500434CF2 /* MTRDeviceController+XPC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "MTRDeviceController+XPC.m"; sourceTree = ""; }; + 5A7947E327C0129500434CF2 /* MTRDeviceController+XPC.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "MTRDeviceController+XPC.mm"; sourceTree = ""; }; 5A830D6B27CFCF590053B85D /* MTRDeviceControllerOverXPC_Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDeviceControllerOverXPC_Internal.h; sourceTree = ""; }; 5ACDDD7927CD129700EFD68A /* MTRClusterStateCacheContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRClusterStateCacheContainer.h; sourceTree = ""; }; 5ACDDD7B27CD14AF00EFD68A /* MTRClusterStateCacheContainer_Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRClusterStateCacheContainer_Internal.h; sourceTree = ""; }; @@ -246,7 +270,7 @@ 88EBF8CD27FABDD500686BC1 /* MTRDeviceAttestationDelegateBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRDeviceAttestationDelegateBridge.h; sourceTree = ""; }; 991DC0822475F45400C13860 /* MTRDeviceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDeviceController.h; sourceTree = ""; }; 991DC0872475F47D00C13860 /* MTRDeviceController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRDeviceController.mm; sourceTree = ""; }; - 991DC08A247704DC00C13860 /* MTRLogging.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRLogging.h; sourceTree = ""; }; + 991DC08A247704DC00C13860 /* MTRLogging_Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRLogging_Internal.h; sourceTree = ""; }; 9956064326420367000C28DE /* MTRSetupPayload_Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRSetupPayload_Internal.h; sourceTree = ""; }; 997DED152695343400975E97 /* MTRThreadOperationalDataset.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRThreadOperationalDataset.mm; sourceTree = ""; }; 997DED172695344800975E97 /* MTRThreadOperationalDataset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRThreadOperationalDataset.h; sourceTree = ""; }; @@ -254,7 +278,7 @@ 998F286C26D55E10001846C6 /* MTRKeypair.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRKeypair.h; sourceTree = ""; }; 998F286E26D55EC5001846C6 /* MTRP256KeypairBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRP256KeypairBridge.h; sourceTree = ""; }; 998F287026D56940001846C6 /* MTRP256KeypairBridge.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRP256KeypairBridge.mm; sourceTree = ""; }; - 99AECC7F2798A57E00B6355B /* MTRCommissioningParameters.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRCommissioningParameters.m; sourceTree = ""; }; + 99AECC7F2798A57E00B6355B /* MTRCommissioningParameters.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRCommissioningParameters.mm; sourceTree = ""; }; 99C65E0F267282F1003402F6 /* MTRControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRControllerTests.m; sourceTree = ""; }; 99D466E02798936D0089A18F /* MTRCommissioningParameters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRCommissioningParameters.h; sourceTree = ""; }; AF1CB86D2874B03B00865A96 /* MTROTAProviderDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTROTAProviderDelegate.h; sourceTree = ""; }; @@ -265,7 +289,7 @@ B20252962459E34F00F97062 /* MatterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MatterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; B202529D2459E34F00F97062 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B289D41F2639C0D300D4E314 /* MTROnboardingPayloadParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTROnboardingPayloadParser.h; sourceTree = ""; }; - B289D4202639C0D300D4E314 /* MTROnboardingPayloadParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTROnboardingPayloadParser.m; sourceTree = ""; }; + B289D4202639C0D300D4E314 /* MTROnboardingPayloadParser.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTROnboardingPayloadParser.mm; sourceTree = ""; }; B2E0D7A8245B0B5C003C5B48 /* Matter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Matter.h; sourceTree = ""; }; B2E0D7A9245B0B5C003C5B48 /* MTRManualSetupPayloadParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRManualSetupPayloadParser.h; sourceTree = ""; }; B2E0D7AA245B0B5C003C5B48 /* MTRError.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRError.mm; sourceTree = ""; }; @@ -289,6 +313,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3DECCB6E29347D2D00585AEC /* Security.framework in Frameworks */, BA09EB43247477BA00605257 /* libCHIP.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -336,6 +361,22 @@ name = CHIPGeneratedFiles; sourceTree = ""; }; + 3D69867E29382E58007314E7 /* Resources */ = { + isa = PBXGroup; + children = ( + 3D69867F29382EAD007314E7 /* Logging */, + ); + path = Resources; + sourceTree = ""; + }; + 3D69867F29382EAD007314E7 /* Logging */ = { + isa = PBXGroup; + children = ( + 3D69868029382EF4007314E7 /* com.csa.matter.plist */, + ); + path = Logging; + sourceTree = ""; + }; B20252832459E34F00F97062 = { isa = PBXGroup; children = ( @@ -359,6 +400,7 @@ B202528F2459E34F00F97062 /* CHIP */ = { isa = PBXGroup; children = ( + 3D69867E29382E58007314E7 /* Resources */, 1EDCE543289049A100E41EC9 /* MTROTAHeader.h */, 1EDCE544289049A100E41EC9 /* MTROTAHeader.mm */, 27A53C1527FBC6920053F131 /* MTRAttestationTrustStoreBridge.h */, @@ -385,6 +427,7 @@ 2C222ADE255C811800E446B9 /* MTRBaseDevice_Internal.h */, 2C222ACE255C620600E446B9 /* MTRBaseDevice.h */, 2C222ACF255C620600E446B9 /* MTRBaseDevice.mm */, + 3DECCB732934C21B00585AEC /* MTRDefines.h */, 7596A84A287636C1004DAE0E /* MTRDevice_Internal.h */, 7596A84228762729004DAE0E /* MTRDevice.h */, 7596A84328762729004DAE0E /* MTRDevice.mm */, @@ -401,7 +444,7 @@ 2C8C8FBD253E0C2100797F05 /* MTRPersistentStorageDelegateBridge.h */, 2C8C8FBF253E0C2100797F05 /* MTRPersistentStorageDelegateBridge.mm */, 99D466E02798936D0089A18F /* MTRCommissioningParameters.h */, - 99AECC7F2798A57E00B6355B /* MTRCommissioningParameters.m */, + 99AECC7F2798A57E00B6355B /* MTRCommissioningParameters.mm */, 2CB7163E252F731E0026E2BB /* MTRDeviceControllerDelegate.h */, 2CB71638252E8A7B0026E2BB /* MTRDeviceControllerDelegateBridge.h */, 2CB71639252E8A7B0026E2BB /* MTRDeviceControllerDelegateBridge.mm */, @@ -412,9 +455,11 @@ B2E0D7AB245B0B5C003C5B48 /* MTRError_Internal.h */, 5129BCFC26A9EE3300122DDF /* MTRError.h */, B2E0D7AA245B0B5C003C5B48 /* MTRError.mm */, - 991DC08A247704DC00C13860 /* MTRLogging.h */, + 3DECCB6F2934AC1C00585AEC /* MTRLogging.h */, + 991DC08A247704DC00C13860 /* MTRLogging_Internal.h */, + 3DECCB712934AFE200585AEC /* MTRLogging.mm */, B289D41F2639C0D300D4E314 /* MTROnboardingPayloadParser.h */, - B289D4202639C0D300D4E314 /* MTROnboardingPayloadParser.m */, + B289D4202639C0D300D4E314 /* MTROnboardingPayloadParser.mm */, B2E0D7A9245B0B5C003C5B48 /* MTRManualSetupPayloadParser.h */, B2E0D7AD245B0B5C003C5B48 /* MTRManualSetupPayloadParser.mm */, B2E0D7AC245B0B5C003C5B48 /* MTRQRCodeSetupPayloadParser.h */, @@ -434,24 +479,24 @@ 5A7947E227C0101200434CF2 /* MTRDeviceController+XPC.h */, 517BF3EE282B62B800A8B7DB /* MTRCertificates.h */, 517BF3EF282B62B800A8B7DB /* MTRCertificates.mm */, - 515C1C6E284F9FFB00A48F0C /* MTRMemory.h */, - 515C1C6D284F9FFB00A48F0C /* MTRMemory.mm */, - 5A7947E327C0129500434CF2 /* MTRDeviceController+XPC.m */, + 515C1C6E284F9FFB00A48F0C /* MTRFramework.h */, + 515C1C6D284F9FFB00A48F0C /* MTRFramework.mm */, + 5A7947E327C0129500434CF2 /* MTRDeviceController+XPC.mm */, B20252912459E34F00F97062 /* Info.plist */, 998F286C26D55E10001846C6 /* MTRKeypair.h */, 998F286E26D55EC5001846C6 /* MTRP256KeypairBridge.h */, 998F287026D56940001846C6 /* MTRP256KeypairBridge.mm */, 5A6FEC8B27B5609C00F25F42 /* MTRDeviceOverXPC.h */, - 5A6FEC9727B5C6AF00F25F42 /* MTRDeviceOverXPC.m */, + 5A6FEC9727B5C6AF00F25F42 /* MTRDeviceOverXPC.mm */, 5A6FEC8D27B5624E00F25F42 /* MTRDeviceControllerOverXPC.h */, 5A830D6B27CFCF590053B85D /* MTRDeviceControllerOverXPC_Internal.h */, - 5A6FEC8F27B563D900F25F42 /* MTRDeviceControllerOverXPC.m */, + 5A6FEC8F27B563D900F25F42 /* MTRDeviceControllerOverXPC.mm */, 5A6FEC9427B5976200F25F42 /* MTRDeviceControllerXPCConnection.h */, - 5A6FEC9527B5983000F25F42 /* MTRDeviceControllerXPCConnection.m */, + 5A6FEC9527B5983000F25F42 /* MTRDeviceControllerXPCConnection.mm */, 3CF134A6289D8AD90017A19E /* MTRCSRInfo.h */, - 3CF134A8289D8D800017A19E /* MTRCSRInfo.m */, + 3CF134A8289D8D800017A19E /* MTRCSRInfo.mm */, 3CF134AA289D8DF70017A19E /* MTRAttestationInfo.h */, - 3CF134AC289D8E570017A19E /* MTRAttestationInfo.m */, + 3CF134AC289D8E570017A19E /* MTRAttestationInfo.mm */, 3CF134AE289D90FF0017A19E /* MTRNOCChainIssuer.h */, 511913FA28C100EF009235E9 /* MTRBaseSubscriptionCallback.h */, 511913F928C100EF009235E9 /* MTRBaseSubscriptionCallback.mm */, @@ -488,6 +533,7 @@ BA09EB3E2474762900605257 /* Frameworks */ = { isa = PBXGroup; children = ( + 3DECCB6D29347D2C00585AEC /* Security.framework */, BA09EB3F2474762900605257 /* libCHIP.a */, ); name = Frameworks; @@ -514,7 +560,7 @@ 7596A85728788557004DAE0E /* MTRClusters.h in Headers */, 99D466E12798936D0089A18F /* MTRCommissioningParameters.h in Headers */, 5136661528067D550025EDAE /* MTRDeviceControllerFactory_Internal.h in Headers */, - 515C1C70284F9FFB00A48F0C /* MTRMemory.h in Headers */, + 515C1C70284F9FFB00A48F0C /* MTRFramework.h in Headers */, 7534F12928BFF20300390851 /* MTRDeviceAttestationDelegate_Internal.h in Headers */, D4772A46285AE98400383630 /* MTRClusterConstants.h in Headers */, B289D4212639C0D300D4E314 /* MTROnboardingPayloadParser.h in Headers */, @@ -551,15 +597,17 @@ AF1CB8702874B04C00865A96 /* MTROTAProviderDelegateBridge.h in Headers */, B2E0D7B5245B0B5C003C5B48 /* MTRQRCodeSetupPayloadParser.h in Headers */, 1EC4CE6425CC276600D7304F /* MTRBaseClusters.h in Headers */, + 3DECCB742934C21B00585AEC /* MTRDefines.h in Headers */, 2C5EEEF6268A85C400CAE3D3 /* MTRDeviceConnectionBridge.h in Headers */, 2C8C8FC0253E0C2100797F05 /* MTRPersistentStorageDelegateBridge.h in Headers */, 51E4D121291D0EB400C8C535 /* MTRBaseClustersCpp_Internal.h in Headers */, 51E51FC0282AD37A00FC978D /* MTRDeviceControllerStartupParams_Internal.h in Headers */, + 3DECCB702934AECD00585AEC /* MTRLogging.h in Headers */, 998F286F26D55EC5001846C6 /* MTRP256KeypairBridge.h in Headers */, 2C222ADF255C811800E446B9 /* MTRBaseDevice_Internal.h in Headers */, 511913FC28C100EF009235E9 /* MTRBaseSubscriptionCallback.h in Headers */, 51E0310027EA20D20083DC9C /* MTRControllerAccessControl.h in Headers */, - 991DC08B247704DC00C13860 /* MTRLogging.h in Headers */, + 991DC08B247704DC00C13860 /* MTRLogging_Internal.h in Headers */, 7596A84828762783004DAE0E /* MTRAsyncCallbackWorkQueue.h in Headers */, 5A7947E527C0129F00434CF2 /* MTRDeviceController+XPC.h in Headers */, B2E0D7B4245B0B5C003C5B48 /* MTRError_Internal.h in Headers */, @@ -579,6 +627,7 @@ B20252892459E34F00F97062 /* Sources */, B202528A2459E34F00F97062 /* Frameworks */, B202528B2459E34F00F97062 /* Resources */, + 3D69868429383083007314E7 /* Copy Logging Preferences */, ); buildRules = ( ); @@ -689,10 +738,10 @@ buildActionMask = 2147483647; files = ( 2C8C8FC2253E0C2100797F05 /* MTRPersistentStorageDelegateBridge.mm in Sources */, - 99AECC802798A57F00B6355B /* MTRCommissioningParameters.m in Sources */, + 99AECC802798A57F00B6355B /* MTRCommissioningParameters.mm in Sources */, 2CB7163C252E8A7C0026E2BB /* MTRDeviceControllerDelegateBridge.mm in Sources */, 997DED162695343400975E97 /* MTRThreadOperationalDataset.mm in Sources */, - 515C1C6F284F9FFB00A48F0C /* MTRMemory.mm in Sources */, + 515C1C6F284F9FFB00A48F0C /* MTRFramework.mm in Sources */, 27A53C1827FBC6920053F131 /* MTRAttestationTrustStoreBridge.mm in Sources */, 998F287126D56940001846C6 /* MTRP256KeypairBridge.mm in Sources */, 5136661428067D550025EDAE /* MTRDeviceControllerFactory.mm in Sources */, @@ -703,7 +752,7 @@ 51B22C262740CB32008D5055 /* MTRStructsObjc.mm in Sources */, 2C222AD1255C620600E446B9 /* MTRBaseDevice.mm in Sources */, 1EC3238D271999E2002A8BF0 /* cluster-objects.cpp in Sources */, - 3CF134A9289D8D800017A19E /* MTRCSRInfo.m in Sources */, + 3CF134A9289D8D800017A19E /* MTRCSRInfo.mm in Sources */, 991DC0892475F47D00C13860 /* MTRDeviceController.mm in Sources */, B2E0D7B7245B0B5C003C5B48 /* MTRQRCodeSetupPayloadParser.mm in Sources */, 514304202914CED9004DC7FE /* generic-callback-stubs.cpp in Sources */, @@ -715,16 +764,16 @@ 51E51FC1282AD37A00FC978D /* MTRDeviceControllerStartupParams.mm in Sources */, 1ED276E026C57CF000547A89 /* MTRCallbackBridge.mm in Sources */, 517BF3F1282B62B800A8B7DB /* MTRCertificates.mm in Sources */, - 5A6FEC9627B5983000F25F42 /* MTRDeviceControllerXPCConnection.m in Sources */, + 5A6FEC9627B5983000F25F42 /* MTRDeviceControllerXPCConnection.mm in Sources */, 511913FB28C100EF009235E9 /* MTRBaseSubscriptionCallback.mm in Sources */, 5ACDDD7D27CD16D200EFD68A /* MTRClusterStateCacheContainer.mm in Sources */, 513DDB8A2761F6F900DAA01A /* MTRAttributeTLVValueDecoder.mm in Sources */, 2FD775552695557E00FF4B12 /* error-mapping.cpp in Sources */, - 5A7947E427C0129600434CF2 /* MTRDeviceController+XPC.m in Sources */, - 5A6FEC9027B563D900F25F42 /* MTRDeviceControllerOverXPC.m in Sources */, - B289D4222639C0D300D4E314 /* MTROnboardingPayloadParser.m in Sources */, + 5A7947E427C0129600434CF2 /* MTRDeviceController+XPC.mm in Sources */, + 5A6FEC9027B563D900F25F42 /* MTRDeviceControllerOverXPC.mm in Sources */, + B289D4222639C0D300D4E314 /* MTROnboardingPayloadParser.mm in Sources */, 5112F606287CD2C100B827E7 /* privilege-storage.cpp in Sources */, - 3CF134AD289D8E570017A19E /* MTRAttestationInfo.m in Sources */, + 3CF134AD289D8E570017A19E /* MTRAttestationInfo.mm in Sources */, 2C1B027A2641DB4E00780EF1 /* MTROperationalCredentialsDelegate.mm in Sources */, 7560FD1C27FBBD3F005E85B3 /* MTREventTLVValueDecoder.mm in Sources */, 7596A84928762783004DAE0E /* MTRAsyncCallbackWorkQueue.mm in Sources */, @@ -732,9 +781,10 @@ B2E0D7B6245B0B5C003C5B48 /* MTRManualSetupPayloadParser.mm in Sources */, 7596A85528788557004DAE0E /* MTRClusters.mm in Sources */, 88EBF8CF27FABDD500686BC1 /* MTRDeviceAttestationDelegateBridge.mm in Sources */, - 5A6FEC9827B5C6AF00F25F42 /* MTRDeviceOverXPC.m in Sources */, + 5A6FEC9827B5C6AF00F25F42 /* MTRDeviceOverXPC.mm in Sources */, 51431AF927D2973E008A7943 /* MTRIMDispatch.mm in Sources */, 51431AFB27D29CA4008A7943 /* ota-provider.cpp in Sources */, + 3DECCB722934AFE200585AEC /* MTRLogging.mm in Sources */, 7596A84528762729004DAE0E /* MTRDevice.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -826,6 +876,12 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-Wformat", + "-Wformat-nonliteral", + "-Wformat-security", + "-Wconversion", + ); OTHER_LDFLAGS = "-Wl,-unexported_symbol,\"__Z*\""; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvos appletvsimulator watchos watchsimulator"; @@ -872,11 +928,6 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LIBRARY_SEARCH_PATHS = "$(TEMP_DIR)/out/lib"; - OTHER_CFLAGS = ( - "-Wformat", - "-Wformat-nonliteral", - "-Wformat-security", - ); OTHER_LDFLAGS = ""; "OTHER_LDFLAGS[sdk=*]" = ( "-framework", @@ -975,6 +1026,12 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-Wformat", + "-Wformat-nonliteral", + "-Wformat-security", + "-Wconversion", + ); OTHER_LDFLAGS = "-Wl,-unexported_symbol,\"__Z*\""; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvos appletvsimulator watchos watchsimulator"; @@ -1022,11 +1079,6 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.4; LIBRARY_SEARCH_PATHS = "$(TEMP_DIR)/out/lib"; - OTHER_CFLAGS = ( - "-Wformat", - "-Wformat-nonliteral", - "-Wformat-security", - ); OTHER_LDFLAGS = ""; "OTHER_LDFLAGS[sdk=*]" = ( "-framework", diff --git a/src/lib/core/CHIPConfig.h b/src/lib/core/CHIPConfig.h index b84fa02e091904..aaa28d079441ab 100644 --- a/src/lib/core/CHIPConfig.h +++ b/src/lib/core/CHIPConfig.h @@ -374,6 +374,16 @@ #define CHIP_AUTOMATION_LOGGING 1 #endif // CHIP_AUTOMATION_LOGGING +/** + * @def CHIP_LOG_FILTERING + * + * @brief + * If asserted (1), enable runtime log level configuration. + */ +#ifndef CHIP_LOG_FILTERING +#define CHIP_LOG_FILTERING 1 +#endif + /** * CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE * diff --git a/src/lib/support/BUILD.gn b/src/lib/support/BUILD.gn index 2f86189862e683..d006b42bf1b38e 100644 --- a/src/lib/support/BUILD.gn +++ b/src/lib/support/BUILD.gn @@ -66,8 +66,11 @@ source_set("logging_constants") { sources = [ "logging/Constants.h" ] } -source_set("enforce_format") { - sources = [ "EnforceFormat.h" ] +source_set("attributes") { + sources = [ + "DLLUtil.h", + "EnforceFormat.h", + ] } source_set("chip_version_header") { @@ -165,8 +168,8 @@ static_library("support") { cflags = [ "-Wconversion" ] public_deps = [ + ":attributes", ":chip_version_header", - ":enforce_format", ":logging_constants", "${chip_root}/src/lib/core:chip_config_header", "${chip_root}/src/platform:platform_buildconfig", @@ -188,6 +191,10 @@ static_library("support") { public_deps += [ "${chip_root}/src/platform/logging:android" ] } + if (current_os == "mac" || current_os == "ios") { + public_deps += [ "${chip_root}/src/platform/Darwin:logging" ] + } + public_configs = [ "${chip_root}/src:includes", "${chip_root}/src/system:system_config", diff --git a/src/lib/support/CodeUtils.h b/src/lib/support/CodeUtils.h index ae61f5211aae4b..3b754e0b9e5e12 100644 --- a/src/lib/support/CodeUtils.h +++ b/src/lib/support/CodeUtils.h @@ -254,11 +254,12 @@ constexpr inline const _T & max(const _T & a, const _T & b) * * Example usage: * - * @code + * @code * VerifyOrReturn(param != nullptr, LogError("param is nullptr")); * @endcode * * @param[in] expr A Boolean expression to be evaluated. + * @param[in] ... Statements to execute before returning. Optional. */ #define VerifyOrReturn(expr, ...) \ do \ @@ -271,7 +272,7 @@ constexpr inline const _T & max(const _T & a, const _T & b) } while (false) /** - * @def VerifyOrReturnError(expr, code) + * @def VerifyOrReturnError(expr, code, ...) * * @brief * Returns a specified error code if expression evaluates to false @@ -284,11 +285,12 @@ constexpr inline const _T & max(const _T & a, const _T & b) * * @param[in] expr A Boolean expression to be evaluated. * @param[in] code A value to return if @a expr is false. + * @param[in] ... Statements to execute before returning. Optional. */ -#define VerifyOrReturnError(expr, code) VerifyOrReturnValue(expr, code) +#define VerifyOrReturnError(expr, code, ...) VerifyOrReturnValue(expr, code, ##__VA_ARGS__) /** - * @def VerifyOrReturnValue(expr, value) + * @def VerifyOrReturnValue(expr, value, ...) * * @brief * Returns a specified value if expression evaluates to false @@ -301,12 +303,14 @@ constexpr inline const _T & max(const _T & a, const _T & b) * * @param[in] expr A Boolean expression to be evaluated. * @param[in] value A value to return if @a expr is false. + * @param[in] ... Statements to execute before returning. Optional. */ -#define VerifyOrReturnValue(expr, value) \ +#define VerifyOrReturnValue(expr, value, ...) \ do \ { \ if (!(expr)) \ { \ + __VA_ARGS__; \ return (value); \ } \ } while (false) @@ -468,9 +472,7 @@ constexpr inline const _T & max(const _T & a, const _T & b) * } * @endcode * - * @param[in] ... An optional expression or block to execute - * when the assertion fails. - * + * @param[in] ... Statements to execute. Optional. */ // clang-format off #define ExitNow(...) \ @@ -622,6 +624,7 @@ inline void chipDie(void) * @endcode * * @param[in] expr A Boolean expression to be evaluated. + * @param[in] ... Statements to execute. */ #define VerifyOrDo(expr, ...) \ do \ diff --git a/src/lib/support/logging/CHIPLogging.cpp b/src/lib/support/logging/CHIPLogging.cpp index a374893d9197ed..ca04f60388d6b8 100644 --- a/src/lib/support/logging/CHIPLogging.cpp +++ b/src/lib/support/logging/CHIPLogging.cpp @@ -28,9 +28,10 @@ #include #include #include -#include #include +#include + #include #include #include @@ -69,70 +70,56 @@ namespace { std::atomic sLogRedirectCallback{ nullptr }; /* - * Array of strings containing the names for each of the chip log - * modules. - * - * NOTE: The names must be in the order defined in the LogModule - * enumeration. Each name must be a fixed number of characters - * long (chip::Logging::kMaxModuleNameLen) padded with nulls as - * necessary. + * Array of strings containing the names for each of the chip log modules. * + * NOTE: The names must be in the order defined in the LogModule enumeration. */ -const char ModuleNames[] = "-\0\0" // None - "IN\0" // Inet - "BLE" // BLE - "ML\0" // MessageLayer - "SM\0" // SecurityManager - "EM\0" // ExchangeManager - "TLV" // TLV - "ASN" // ASN1 - "CR\0" // Crypto - "CTL" // Controller - "AL\0" // Alarm - "SC\0" // SecureChannel - "BDX" // BulkDataTransfer - "DMG" // DataManagement - "DC\0" // DeviceControl - "DD\0" // DeviceDescription - "ECH" // Echo - "FP\0" // FabricProvisioning - "NP\0" // NetworkProvisioning - "SD\0" // ServiceDirectory - "SP\0" // ServiceProvisioning - "SWU" // SoftwareUpdate - "FS\0" // FailSafe - "TS\0" // TimeService - "HB\0" // Heartbeat - "CSL" // chipSystemLayer - "EVL" // Event Logging - "SPT" // Support - "TOO" // chipTool - "ZCL" // Zcl - "SH\0" // Shell - "DL\0" // DeviceLayer - "SPL" // SetupPayload - "SVR" // AppServer - "DIS" // Discovery - "IM\0" // InteractionModel - "TST" // Test - "OSS" // OperationalSessionSetup - "ATM" // Automation - "CSM" // CASESessionManager - ; - -#define ModuleNamesCount ((sizeof(ModuleNames) - 1) / chip::Logging::kMaxModuleNameLen) - -void GetModuleName(char (&buf)[chip::Logging::kMaxModuleNameLen + 1], uint8_t module) +static const char ModuleNames[kLogModule_Max][kMaxModuleNameLen + 1] = { + "-", // None + "IN", // Inet + "BLE", // BLE + "ML", // MessageLayer + "SM", // SecurityManager + "EM", // ExchangeManager + "TLV", // TLV + "ASN", // ASN1 + "CR", // Crypto + "CTL", // Controller + "AL", // Alarm + "SC", // SecureChannel + "BDX", // BulkDataTransfer + "DMG", // DataManagement + "DC", // DeviceControl + "DD", // DeviceDescription + "ECH", // Echo + "FP", // FabricProvisioning + "NP", // NetworkProvisioning + "SD", // ServiceDirectory + "SP", // ServiceProvisioning + "SWU", // SoftwareUpdate + "FS", // FailSafe + "TS", // TimeService + "HB", // Heartbeat + "CSL", // chipSystemLayer + "EVL", // Event Logging + "SPT", // Support + "TOO", // chipTool + "ZCL", // Zcl + "SH", // Shell + "DL", // DeviceLayer + "SPL", // SetupPayload + "SVR", // AppServer + "DIS", // Discovery + "IM", // InteractionModel + "TST", // Test + "OSS", // OperationalSessionSetup + "ATM", // Automation + "CSM", // CASESessionManager +}; + +static char const * GetModuleName(LogModule module) { - - const char * module_name = ModuleNames; - if (module < ModuleNamesCount) - { - module_name += module * chip::Logging::kMaxModuleNameLen; - } - - memcpy(buf, module_name, chip::Logging::kMaxModuleNameLen); - buf[chip::Logging::kMaxModuleNameLen] = 0; // ensure null termination + return ModuleNames[(module < kLogModule_Max) ? module : kLogModule_NotSpecified]; } } // namespace @@ -164,7 +151,7 @@ void SetLogRedirectCallback(LogRedirectCallback_t callback) * correspond to the format specifiers in @a msg. * */ -DLL_EXPORT void Log(uint8_t module, uint8_t category, const char * msg, ...) +void Log(uint8_t module, uint8_t category, const char * msg, ...) { va_list v; @@ -173,7 +160,7 @@ DLL_EXPORT void Log(uint8_t module, uint8_t category, const char * msg, ...) va_end(v); } -DLL_EXPORT void LogByteSpan(uint8_t module, uint8_t category, const chip::ByteSpan & span) +void LogByteSpan(uint8_t module, uint8_t category, const chip::ByteSpan & span) { // Maximum number of characters needed to print 8 byte buffer including formatting (0x) // 8 bytes * (2 nibbles per byte + 4 character for ", 0x") + null termination. @@ -206,16 +193,8 @@ DLL_EXPORT void LogByteSpan(uint8_t module, uint8_t category, const chip::ByteSp void LogV(uint8_t module, uint8_t category, const char * msg, va_list args) { - if (!IsCategoryEnabled(category)) - { - return; - } - - char moduleName[chip::Logging::kMaxModuleNameLen + 1]; - GetModuleName(moduleName, module); - + const char * moduleName = GetModuleName(static_cast(module)); LogRedirectCallback_t redirect = sLogRedirectCallback.load(); - if (redirect != nullptr) { redirect(moduleName, category, msg, args); @@ -228,41 +207,38 @@ void LogV(uint8_t module, uint8_t category, const char * msg, va_list args) #if CHIP_LOG_FILTERING uint8_t gLogFilter = kLogCategory_Max; -DLL_EXPORT bool IsCategoryEnabled(uint8_t category) -{ - return (category <= gLogFilter); -} -DLL_EXPORT uint8_t GetLogFilter() +uint8_t GetLogFilter() { return gLogFilter; } -DLL_EXPORT void SetLogFilter(uint8_t category) +void SetLogFilter(uint8_t category) { gLogFilter = category; } #else // CHIP_LOG_FILTERING -DLL_EXPORT bool IsCategoryEnabled(uint8_t category) +uint8_t GetLogFilter() { - (void) category; - return true; + return kLogCategory_Max; } -DLL_EXPORT uint8_t GetLogFilter() +void SetLogFilter(uint8_t category) { - return kLogCategory_Max; + IgnoreUnusedVariable(category); } +#endif // CHIP_LOG_FILTERING -DLL_EXPORT void SetLogFilter(uint8_t category) +#if CHIP_LOG_FILTERING +bool IsCategoryEnabled(uint8_t category) { - (void) category; + return (category <= gLogFilter); } #endif // CHIP_LOG_FILTERING -#endif /* _CHIP_USE_LOGGING */ +#endif // _CHIP_USE_LOGGING } // namespace Logging } // namespace chip diff --git a/src/lib/support/logging/CHIPLogging.h b/src/lib/support/logging/CHIPLogging.h index 9e6dc5c15d0744..28bdeb59c34a9b 100644 --- a/src/lib/support/logging/CHIPLogging.h +++ b/src/lib/support/logging/CHIPLogging.h @@ -37,8 +37,7 @@ #include -#include - +#include #include #include @@ -46,6 +45,10 @@ #include #include +#if CHIP_SYSTEM_CONFIG_PLATFORM_LOG && defined(CHIP_SYSTEM_CONFIG_PLATFORM_LOG_INCLUDE) +#include CHIP_SYSTEM_CONFIG_PLATFORM_LOG_INCLUDE +#endif + #if CHIP_PW_TOKENIZER_LOGGING #include "pw_tokenizer/tokenize_to_global_handler_with_payload.h" #endif @@ -68,7 +71,7 @@ * - #CHIP_ERROR_LOGGING * - #CHIP_PROGRESS_LOGGING * - #CHIP_DETAIL_LOGGING - * - #CHIP_AUTOMATION_LOGGING + * - #CHIP_AUTOMATION_LOGGING * */ @@ -80,25 +83,13 @@ using ByteSpan = Span; namespace Logging { +// Log redirection using LogRedirectCallback_t = void (*)(const char * module, uint8_t category, const char * msg, va_list args); +DLL_EXPORT void SetLogRedirectCallback(LogRedirectCallback_t callback); -void SetLogRedirectCallback(LogRedirectCallback_t callback); - -void LogV(uint8_t module, uint8_t category, const char * msg, va_list args) ENFORCE_FORMAT(3, 0); -void Log(uint8_t module, uint8_t category, const char * msg, ...) ENFORCE_FORMAT(3, 4); - -void LogByteSpan(uint8_t module, uint8_t category, const ByteSpan & span); - -uint8_t GetLogFilter(); -void SetLogFilter(uint8_t category); - -#ifndef CHIP_ERROR_LOGGING -#define CHIP_ERROR_LOGGING 1 -#endif - -#ifndef CHIP_LOG_FILTERING -#define CHIP_LOG_FILTERING 1 -#endif +// Log filtering (no-op unless CHIP_LOG_FILTERING is enabled) +DLL_EXPORT uint8_t GetLogFilter(); +DLL_EXPORT void SetLogFilter(uint8_t category); #if CHIP_ERROR_LOGGING /** @@ -109,23 +100,10 @@ void SetLogFilter(uint8_t category); * category. * */ -#ifndef ChipLogError -#if CHIP_PW_TOKENIZER_LOGGING -#define ChipLogError(MOD, MSG, ...) \ - PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD( \ - (pw_tokenizer_Payload)((chip::Logging::kLogCategory_Error << 8) | chip::Logging::kLogModule_##MOD), MSG, __VA_ARGS__) -#else -#define ChipLogError(MOD, MSG, ...) \ - chip::Logging::Log(chip::Logging::kLogModule_##MOD, chip::Logging::kLogCategory_Error, MSG, ##__VA_ARGS__) -#endif -#endif -#else +#define ChipLogError(MOD, MSG, ...) ChipInternalLog(MOD, Error, MSG, ##__VA_ARGS__) +#else // CHIP_ERROR_LOGGING #define ChipLogError(MOD, MSG, ...) ((void) 0) -#endif - -#ifndef CHIP_PROGRESS_LOGGING -#define CHIP_PROGRESS_LOGGING 1 -#endif +#endif // CHIP_ERROR_LOGGING #if CHIP_PROGRESS_LOGGING /** @@ -136,23 +114,10 @@ void SetLogFilter(uint8_t category); * category. * */ -#ifndef ChipLogProgress -#if CHIP_PW_TOKENIZER_LOGGING -#define ChipLogProgress(MOD, MSG, ...) \ - PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD( \ - (pw_tokenizer_Payload)((chip::Logging::kLogCategory_Progress << 8) | chip::Logging::kLogModule_##MOD), MSG, __VA_ARGS__) -#else -#define ChipLogProgress(MOD, MSG, ...) \ - chip::Logging::Log(chip::Logging::kLogModule_##MOD, chip::Logging::kLogCategory_Progress, MSG, ##__VA_ARGS__) -#endif -#endif -#else +#define ChipLogProgress(MOD, MSG, ...) ChipInternalLog(MOD, Progress, MSG, ##__VA_ARGS__) +#else // CHIP_PROGRESS_LOGGING #define ChipLogProgress(MOD, MSG, ...) ((void) 0) -#endif - -#ifndef CHIP_DETAIL_LOGGING -#define CHIP_DETAIL_LOGGING 1 -#endif +#endif // CHIP_PROGRESS_LOGGING #if CHIP_DETAIL_LOGGING /** @@ -163,32 +128,20 @@ void SetLogFilter(uint8_t category); * category. * */ -#ifndef ChipLogDetail -#if CHIP_PW_TOKENIZER_LOGGING -#define ChipLogDetail(MOD, MSG, ...) \ - PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD( \ - (pw_tokenizer_Payload)((chip::Logging::kLogCategory_Detail << 8) | chip::Logging::kLogModule_##MOD), MSG, __VA_ARGS__) -#else -#define ChipLogDetail(MOD, MSG, ...) \ - chip::Logging::Log(chip::Logging::kLogModule_##MOD, chip::Logging::kLogCategory_Detail, MSG, ##__VA_ARGS__) -#endif -#endif -#else -#define ChipLogDetail(MOD, MSG, ...) ((void) 0) -#endif +#define ChipLogDetail(MOD, MSG, ...) ChipInternalLog(MOD, Detail, MSG, ##__VA_ARGS__) -#if CHIP_DETAIL_LOGGING -#ifndef ChipLogByteSpan -#define ChipLogByteSpan(MOD, DATA) \ - chip::Logging::LogByteSpan(chip::Logging::kLogModule_##MOD, chip::Logging::kLogCategory_Detail, DATA) -#endif -#else +/** + * @def ChipLogByteSpan(MOD, DATA) + * + * @brief + * Log a byte span for the specified module in the 'Detail' category. + * + */ +#define ChipLogByteSpan(MOD, DATA) ChipInternalLogByteSpan(MOD, Detail, DATA) +#else // CHP_DETAIL_LOGGING +#define ChipLogDetail(MOD, MSG, ...) ((void) 0) #define ChipLogByteSpan(MOD, DATA) ((void) 0) -#endif - -#ifndef CHIP_AUTOMATION_LOGGING -#define CHIP_AUTOMATION_LOGGING 1 -#endif +#endif // CHIP_DETAIL_LOGGING #if CHIP_AUTOMATION_LOGGING /** @@ -199,51 +152,10 @@ void SetLogFilter(uint8_t category); * category. * */ -#ifndef ChipLogAutomation -#if CHIP_PW_TOKENIZER_LOGGING -#define ChipLogAutomation(MSG, ...) \ - PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD( \ - (pw_tokenizer_Payload)((chip::Logging::kLogModule_Automation << 8) | chip::Logging::kLogModule_Automation), MSG, \ - __VA_ARGS__) -#else -#define ChipLogAutomation(MSG, ...) \ - chip::Logging::Log(chip::Logging::kLogModule_Automation, chip::Logging::kLogCategory_Automation, MSG, ##__VA_ARGS__) -#endif -#endif -#else +#define ChipLogAutomation(MSG, ...) ChipInternalLog(Automation, Automation, MSG, ##__VA_ARGS__) +#else // CHIP_AUTOMATION_LOGGING #define ChipLogAutomation(MOD, MSG, ...) ((void) 0) -#endif - -#if CHIP_ERROR_LOGGING || CHIP_PROGRESS_LOGGING || CHIP_DETAIL_LOGGING || CHIP_AUTOMATION_LOGGING -#define _CHIP_USE_LOGGING 1 -#else -#define _CHIP_USE_LOGGING 0 -#endif /* CHIP_ERROR_LOGGING || CHIP_PROGRESS_LOGGING || CHIP_DETAIL_LOGGING || CHIP_AUTOMATION_LOGGING */ - -#if _CHIP_USE_LOGGING - -/** - * CHIP logging length constants - */ -static constexpr uint16_t kMaxModuleNameLen = 3; -static constexpr uint16_t kMaxPrefixLen = 3; -static constexpr uint16_t kMaxSeparatorLen = 2; -static constexpr uint16_t kMaxTrailerLen = 2; -static constexpr uint16_t kMaxMessagePadding = (chip::Logging::kMaxPrefixLen + chip::Logging::kMaxModuleNameLen + - chip::Logging::kMaxSeparatorLen + chip::Logging::kMaxTrailerLen); - -void GetMessageWithPrefix(char * buf, uint8_t bufSize, uint8_t module, const char * msg); - -#else - -static inline void GetMessageWithPrefix(char * buf, uint8_t bufSize, uint8_t module, const char * msg) -{ - return; -} - -#endif // _CHIP_USE_LOGGING - -bool IsCategoryEnabled(uint8_t category); +#endif // CHIP_AUTOMATION_LOGGING /** * @def ChipLogIfFalse(aCondition) @@ -411,5 +323,79 @@ bool IsCategoryEnabled(uint8_t category); #define ChipLogFormatScopedNodeId "<" ChipLogFormatX64 ", %d>" #define ChipLogValueScopedNodeId(id) ChipLogValueX64((id).GetNodeId()), (id).GetFabricIndex() +/** + * CHIP Logging Implementation internals. + */ + +#if CHIP_ERROR_LOGGING || CHIP_PROGRESS_LOGGING || CHIP_DETAIL_LOGGING || CHIP_AUTOMATION_LOGGING +#define _CHIP_USE_LOGGING 1 +#else +#define _CHIP_USE_LOGGING 0 +#endif // CHIP_ERROR_LOGGING || CHIP_PROGRESS_LOGGING || CHIP_DETAIL_LOGGING || CHIP_AUTOMATION_LOGGING + +#if _CHIP_USE_LOGGING + +static constexpr uint16_t kMaxModuleNameLen = 3; + +#if CHIP_LOG_FILTERING +DLL_LOCAL bool IsCategoryEnabled(uint8_t category); +#else // CHIP_LOG_FILTERING +DLL_LOCAL inline bool IsCategoryEnabled(uint8_t category) +{ + return true; +} +#endif // CHIP_LOG_FILTERING + +DLL_LOCAL void Log(uint8_t module, uint8_t category, const char * msg, ...) ENFORCE_FORMAT(3, 4); +DLL_LOCAL void LogByteSpan(uint8_t module, uint8_t category, const ByteSpan & span); +DLL_LOCAL void LogV(uint8_t module, uint8_t category, const char * msg, va_list args) ENFORCE_FORMAT(3, 0); + +#if CHIP_SYSTEM_CONFIG_PLATFORM_LOG +#ifndef ChipPlatformLog +#error "CHIP_SYSTEM_CONFIG_PLATFORM_LOG is enabled but ChipPlatformLog() is not defined" +#endif +#ifndef ChipPlatformLogByteSpan +#error "CHIP_SYSTEM_CONFIG_PLATFORM_LOG is enabled but ChipPlatformLogByteSpan() is not defined" +#endif +#define ChipInternalLog(...) ChipPlatformLog(__VA_ARGS__) +#define ChipInternalLogByteSpan(...) ChipPlatformLogByteSpan(__VA_ARGS__) +#else // CHIP_SYSTEM_CONFIG_PLATFORM_LOG +#define ChipInternalLog(MOD, CAT, MSG, ...) ChipInternalLogImpl(MOD, CAT, MSG, ##__VA_ARGS__) +#define ChipInternalLogByteSpan(MOD, CAT, DATA) ChipInternalLogByteSpanImpl(MOD, CAT, DATA) +#endif // CHIP_SYSTEM_CONFIG_PLATFORM_LOG + +#if CHIP_PW_TOKENIZER_LOGGING +#define ChipInternalLogImpl(MOD, CAT, MSG, ...) \ + do \ + { \ + if (chip::Logging::IsCategoryEnabled(chip::Logging::kLogCategory_##CAT)) \ + { \ + PW_TOKENIZE_TO_GLOBAL_HANDLER_WITH_PAYLOAD( \ + (pw_tokenizer_Payload)((chip::Logging::kLogCategory_##CAT << 8) | chip::Logging::kLogModule_##MOD), MSG, \ + __VA_ARGS__); \ + } \ + } while (0) +#else // CHIP_PW_TOKENIZER_LOGGING +#define ChipInternalLogImpl(MOD, CAT, MSG, ...) \ + do \ + { \ + if (chip::Logging::IsCategoryEnabled(chip::Logging::kLogCategory_##CAT)) \ + { \ + chip::Logging::Log(chip::Logging::kLogModule_##MOD, chip::Logging::kLogCategory_##CAT, MSG, ##__VA_ARGS__); \ + } \ + } while (0) +#endif // CHIP_PW_TOKENIZER_LOGGING + +#define ChipInternalLogByteSpanImpl(MOD, CAT, DATA) \ + do \ + { \ + if (chip::Logging::IsCategoryEnabled(chip::Logging::kLogCategory_##CAT)) \ + { \ + chip::Logging::LogByteSpan(chip::Logging::kLogModule_##MOD, chip::Logging::kLogCategory_##CAT, DATA); \ + } \ + } while (0) + +#endif // _CHIP_USE_LOGGING + } // namespace Logging } // namespace chip diff --git a/src/platform/Darwin/BUILD.gn b/src/platform/Darwin/BUILD.gn index 5544ce476ff1d9..1a23fc1d1ea991 100644 --- a/src/platform/Darwin/BUILD.gn +++ b/src/platform/Darwin/BUILD.gn @@ -13,6 +13,7 @@ # limitations under the License. import("//build_overrides/chip.gni") +import("//build_overrides/nlassert.gni") import("${chip_root}/src/platform/device.gni") @@ -60,7 +61,7 @@ static_library("Darwin") { "DnssdImpl.cpp", "DnssdImpl.h", "InetPlatformConfig.h", - "Logging.cpp", + "LoggingImpl.cpp", "MdnsError.cpp", "MdnsError.h", "NetworkCommissioningDriver.h", @@ -91,6 +92,7 @@ static_library("Darwin") { } deps = [ + ":logging", "${chip_root}/src/lib/dnssd:platform_header", "${chip_root}/src/setup_payload", ] @@ -123,3 +125,21 @@ static_library("Darwin") { ] } } + +static_library("logging") { + sources = [ + "Logging.h", + "Logging.mm", + ] + + deps = [ + "${chip_root}/src/lib/core:chip_config_header", # for lib/support/Span.h + "${chip_root}/src/lib/support:attributes", + "${chip_root}/src/lib/support:logging_constants", + "${nlassert_root}:nlassert", # for lib/support/Span.h + ] + + configs += [ "${chip_root}/src:includes" ] + cflags = [ "-fobjc-arc" ] + frameworks = [ "Foundation.framework" ] +} diff --git a/src/platform/Darwin/Logging.cpp b/src/platform/Darwin/Logging.cpp deleted file mode 100644 index 5124ed427a69e5..00000000000000 --- a/src/platform/Darwin/Logging.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* See Project chip LICENSE file for licensing information. */ - -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace chip { -namespace Logging { -namespace Platform { - -void ENFORCE_FORMAT(3, 0) LogV(const char * module, uint8_t category, const char * msg, va_list v) -{ - timeval time; - gettimeofday(&time, nullptr); - long ms = (time.tv_sec * 1000) + (time.tv_usec / 1000); - - uint64_t ktid; - pthread_threadid_np(nullptr, &ktid); - - char formattedMsg[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE]; - int32_t prefixLen = snprintf(formattedMsg, sizeof(formattedMsg), "[%ld] [%lld:%lld] CHIP: [%s] ", ms, (long long) getpid(), - (long long) ktid, module); - static os_log_t log = os_log_create("com.csa.matter", "all"); - if (prefixLen < 0) - { - // This should not happen - return; - } - - if (static_cast(prefixLen) >= sizeof(formattedMsg)) - { - prefixLen = sizeof(formattedMsg) - 1; - } - - vsnprintf(formattedMsg + prefixLen, sizeof(formattedMsg) - static_cast(prefixLen), msg, v); - - switch (category) - { - case kLogCategory_Error: - os_log_with_type(log, OS_LOG_TYPE_ERROR, "🔴 %{public}s", formattedMsg); -#if TARGET_OS_MAC && TARGET_OS_IPHONE == 0 - fprintf(stdout, "\033[1;31m"); -#endif - break; - - case kLogCategory_Progress: - os_log_with_type(log, OS_LOG_TYPE_DEFAULT, "🔵 %{public}s", formattedMsg); -#if TARGET_OS_MAC && TARGET_OS_IPHONE == 0 - fprintf(stdout, "\033[0;32m"); -#endif - break; - - case kLogCategory_Detail: - os_log_with_type(log, OS_LOG_TYPE_DEFAULT, "🟢 %{public}s", formattedMsg); -#if TARGET_OS_MAC && TARGET_OS_IPHONE == 0 - fprintf(stdout, "\033[0;34m"); -#endif - break; - } -#if TARGET_OS_MAC && TARGET_OS_IPHONE == 0 - fprintf(stdout, "%s\033[0m\n", formattedMsg); -#endif -} - -} // namespace Platform -} // namespace Logging -} // namespace chip diff --git a/src/platform/Darwin/Logging.h b/src/platform/Darwin/Logging.h new file mode 100644 index 00000000000000..7fcb82a99f663a --- /dev/null +++ b/src/platform/Darwin/Logging.h @@ -0,0 +1,85 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +#include + +#ifdef __OBJC__ +@class NSString; +#endif // __OBJC__ + +#define ChipPlatformLog(MOD, CAT, MSG, ...) \ + do \ + { \ + ChipPlatformValidateLogFormat(MSG, ##__VA_ARGS__); /* validate once and ignore warnings from os_log() / Log() */ \ + _Pragma("clang diagnostic push"); \ + _Pragma("clang diagnostic ignored \"-Wformat\""); \ + os_log_with_type(chip::Logging::Platform::LoggerForModule(chip::Logging::kLogModule_##MOD, #MOD), \ + static_cast(chip::Logging::Platform::kOSLogCategory_##CAT), MSG, ##__VA_ARGS__); \ + ChipInternalLogImpl(MOD, CAT, MSG, ##__VA_ARGS__); \ + _Pragma("clang diagnostic pop"); \ + } while (0) + +#define ChipPlatformLogByteSpan(MOD, CAT, DATA) \ + do \ + { \ + chip::Logging::Platform::LogByteSpan(chip::Logging::kLogModule_##MOD, #MOD, \ + static_cast(chip::Logging::Platform::kOSLogCategory_##CAT), DATA); \ + ChipInternalLogByteSpanImpl(MOD, CAT, DATA); \ + } while (0) + +namespace chip { + +// Avoid includes cycle: Span.h indirectly includes CHIPLogging.h +template +class Span; +using ByteSpan = Span; + +namespace Logging { +namespace Platform { + +// Names align with chip::Logging::LogCategory +enum OSLogCategory +{ + kOSLogCategory_Error = OS_LOG_TYPE_ERROR, + kOSLogCategory_Progress = OS_LOG_TYPE_DEFAULT, + kOSLogCategory_Detail = OS_LOG_TYPE_INFO, + kOSLogCategory_Automation = OS_LOG_TYPE_DEFAULT, +}; + +DLL_LOCAL os_log_t LoggerForModule(chip::Logging::LogModule moduleId, char const * moduleName); +DLL_LOCAL void LogByteSpan(chip::Logging::LogModule moduleId, char const * moduleName, os_log_type_t type, + const chip::ByteSpan & span); + +// Helper constructs for compile-time validation of format strings for C++ / ObjC++ contexts. +// Note that ObjC++ contexts are restricted to NSString style specifiers. Supporting os_log() +// specifiers would require these to be emulated or stripped when log redirection is used. +#ifdef __OBJC__ +DLL_LOCAL bool ValidateLogFormat(NSString * format, ...) __attribute__((format(__NSString__, 1, 0))); // not implemented +#define ChipPlatformValidateLogFormat(F, ...) ((void) sizeof(chip::Logging::Platform::ValidateLogFormat(@F, ##__VA_ARGS__))) +#else // __OBJC__ +DLL_LOCAL bool ValidateLogFormat(char const * format, ...) __attribute__((format(printf, 1, 0))); // not implemented +#define ChipPlatformValidateLogFormat(F, ...) ((void) sizeof(chip::Logging::Platform::ValidateLogFormat(F, ##__VA_ARGS__))) +#endif // __OBJC__ + +} // namespace Platform +} // namespace Logging +} // namespace chip diff --git a/src/platform/Darwin/Logging.mm b/src/platform/Darwin/Logging.mm new file mode 100644 index 00000000000000..5bb751597c8281 --- /dev/null +++ b/src/platform/Darwin/Logging.mm @@ -0,0 +1,68 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if !__has_feature(objc_arc) +#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + +#include "Logging.h" + +#include + +#import +#import + +namespace chip { +namespace Logging { + namespace Platform { + + os_log_t LoggerForModule(chip::Logging::LogModule moduleID, char const * moduleName) + { + if (moduleID <= kLogModule_NotSpecified || kLogModule_Max <= moduleID) { + moduleID = kLogModule_NotSpecified; + moduleName = "Default"; + } + + static struct { + dispatch_once_t onceToken; + os_log_t logger; + } cache[kLogModule_Max]; + auto & entry = cache[moduleID]; + dispatch_once(&entry.onceToken, ^{ + entry.logger = os_log_create("com.csa.matter", moduleName); + }); + return entry.logger; + } + + void LogByteSpan( + chip::Logging::LogModule moduleId, char const * moduleName, os_log_type_t type, const chip::ByteSpan & span) + { + os_log_t logger = LoggerForModule(moduleId, moduleName); + if (os_log_type_enabled(logger, type)) { + auto size = span.size(); + auto data = span.data(); + NSMutableString * string = [[NSMutableString alloc] initWithCapacity:(size * 6)]; // 6 characters per byte + for (size_t i = 0; i < size; i++) { + [string appendFormat:((i % 8 != 7) ? @"0x%02x, " : @"0x%02x,\n"), data[i]]; + } + os_log_with_type(logger, type, "%@", string); + } + } + + } // namespace Platform +} // namespace Logging +} // namespace chip diff --git a/src/platform/Darwin/LoggingImpl.cpp b/src/platform/Darwin/LoggingImpl.cpp new file mode 100644 index 00000000000000..2d6c1b3b744294 --- /dev/null +++ b/src/platform/Darwin/LoggingImpl.cpp @@ -0,0 +1,34 @@ +/* + * + * Copyright (c) 2021 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace chip { +namespace Logging { +namespace Platform { + +void LogV(const char * module, uint8_t category, const char * msg, va_list v) +{ + // ChipPlatformLog expands to an os_log call directly (see Logging.h), so + // we don't need to do anything further here. However his function and the + // call to it still exist because of scenarios where a different logging + // backend (usually stdio) is swapped in at link time, e.g. for unit tests. +} + +} // namespace Platform +} // namespace Logging +} // namespace chip diff --git a/src/platform/Darwin/SystemPlatformConfig.h b/src/platform/Darwin/SystemPlatformConfig.h index 48613ba75db9b2..19df50055af2ac 100644 --- a/src/platform/Darwin/SystemPlatformConfig.h +++ b/src/platform/Darwin/SystemPlatformConfig.h @@ -40,5 +40,7 @@ struct ChipDeviceEvent; #define CHIP_SYSTEM_CONFIG_PLATFORM_PROVIDES_TIME 1 #define CHIP_SYSTEM_CONFIG_USE_POSIX_TIME_FUNCTS 1 #define CHIP_SYSTEM_CONFIG_POOL_USE_HEAP 1 +#define CHIP_SYSTEM_CONFIG_PLATFORM_LOG 1 +#define CHIP_SYSTEM_CONFIG_PLATFORM_LOG_INCLUDE // ========== Platform-specific Configuration Overrides ========= diff --git a/src/platform/Linux/PlatformManagerImpl.cpp b/src/platform/Linux/PlatformManagerImpl.cpp index e29f04bd1d0383..ff753e40fab6ba 100644 --- a/src/platform/Linux/PlatformManagerImpl.cpp +++ b/src/platform/Linux/PlatformManagerImpl.cpp @@ -285,8 +285,8 @@ CHIP_ERROR PlatformManagerImpl::RunOnGLibMainLoopThread(GSourceFunc callback, vo { GMainContext * context = g_main_loop_get_context(mGLibMainLoop); - VerifyOrReturnError(context != nullptr, - (ChipLogDetail(DeviceLayer, "Failed to get GLib main loop context"), CHIP_ERROR_INTERNAL)); + VerifyOrReturnError(context != nullptr, CHIP_ERROR_INTERNAL, + ChipLogDetail(DeviceLayer, "Failed to get GLib main loop context")); // If we've been called from the GLib main loop thread itself, there is no reason to wait // for the callback, as it will be executed immediately by the g_main_context_invoke() call diff --git a/src/platform/Linux/bluez/Helper.cpp b/src/platform/Linux/bluez/Helper.cpp index b00ca750aadac9..ff0c73d1214c8c 100644 --- a/src/platform/Linux/bluez/Helper.cpp +++ b/src/platform/Linux/bluez/Helper.cpp @@ -1438,7 +1438,7 @@ static ConnectionDataBundle * MakeConnectionDataBundle(BLE_CONNECTION_OBJECT apC CHIP_ERROR SendBluezIndication(BLE_CONNECTION_OBJECT apConn, chip::System::PacketBufferHandle apBuf) { - VerifyOrReturnError(!apBuf.IsNull(), (ChipLogError(DeviceLayer, "apBuf is NULL in %s", __func__), CHIP_ERROR_INVALID_ARGUMENT)); + VerifyOrReturnError(!apBuf.IsNull(), CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(DeviceLayer, "apBuf is NULL in %s", __func__)); return PlatformMgrImpl().ScheduleOnGLibMainLoopThread(BluezC2Indicate, MakeConnectionDataBundle(apConn, apBuf)); } @@ -1476,33 +1476,32 @@ CHIP_ERROR CloseBluezConnection(BLE_CONNECTION_OBJECT apConn) CHIP_ERROR StartBluezAdv(BluezEndpoint * apEndpoint) { CHIP_ERROR err = PlatformMgrImpl().ScheduleOnGLibMainLoopThread(BluezAdvStart, apEndpoint); - VerifyOrReturnError(err == CHIP_NO_ERROR, - (ChipLogError(Ble, "Failed to schedule BluezAdvStart() on CHIPoBluez thread"), CHIP_ERROR_INCORRECT_STATE)); + VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_ERROR_INCORRECT_STATE, + ChipLogError(Ble, "Failed to schedule BluezAdvStart() on CHIPoBluez thread")); return err; } CHIP_ERROR StopBluezAdv(BluezEndpoint * apEndpoint) { CHIP_ERROR err = PlatformMgrImpl().ScheduleOnGLibMainLoopThread(BluezAdvStop, apEndpoint); - VerifyOrReturnError(err == CHIP_NO_ERROR, - (ChipLogError(Ble, "Failed to schedule BluezAdvStop() on CHIPoBluez thread"), CHIP_ERROR_INCORRECT_STATE)); + VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_ERROR_INCORRECT_STATE, + ChipLogError(Ble, "Failed to schedule BluezAdvStop() on CHIPoBluez thread")); return err; } CHIP_ERROR BluezAdvertisementSetup(BluezEndpoint * apEndpoint) { CHIP_ERROR err = PlatformMgrImpl().ScheduleOnGLibMainLoopThread(BluezAdvSetup, apEndpoint); - VerifyOrReturnError(err == CHIP_NO_ERROR, - (ChipLogError(Ble, "Failed to schedule BluezAdvSetup() on CHIPoBluez thread"), CHIP_ERROR_INCORRECT_STATE)); + VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_ERROR_INCORRECT_STATE, + ChipLogError(Ble, "Failed to schedule BluezAdvSetup() on CHIPoBluez thread")); return err; } CHIP_ERROR BluezGattsAppRegister(BluezEndpoint * apEndpoint) { CHIP_ERROR err = PlatformMgrImpl().ScheduleOnGLibMainLoopThread(BluezPeripheralRegisterApp, apEndpoint); - VerifyOrReturnError( - err == CHIP_NO_ERROR, - (ChipLogError(Ble, "Failed to schedule BluezPeripheralRegisterApp() on CHIPoBluez thread"), CHIP_ERROR_INCORRECT_STATE)); + VerifyOrReturnError(err == CHIP_NO_ERROR, CHIP_ERROR_INCORRECT_STATE, + ChipLogError(Ble, "Failed to schedule BluezPeripheralRegisterApp() on CHIPoBluez thread")); return err; } @@ -1631,7 +1630,7 @@ static gboolean SendWriteRequestImpl(ConnectionDataBundle * data) CHIP_ERROR BluezSendWriteRequest(BLE_CONNECTION_OBJECT apConn, chip::System::PacketBufferHandle apBuf) { - VerifyOrReturnError(!apBuf.IsNull(), (ChipLogError(DeviceLayer, "apBuf is NULL in %s", __func__), CHIP_ERROR_INVALID_ARGUMENT)); + VerifyOrReturnError(!apBuf.IsNull(), CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(DeviceLayer, "apBuf is NULL in %s", __func__)); return PlatformMgrImpl().ScheduleOnGLibMainLoopThread(SendWriteRequestImpl, MakeConnectionDataBundle(apConn, apBuf)); } diff --git a/src/platform/Tizen/DnssdImpl.cpp b/src/platform/Tizen/DnssdImpl.cpp index e2ab151e948edf..2bd1ed282863da 100644 --- a/src/platform/Tizen/DnssdImpl.cpp +++ b/src/platform/Tizen/DnssdImpl.cpp @@ -120,8 +120,8 @@ gboolean RegisterAsync(GMainLoop * mainLoop, gpointer userData) rCtx->mMainLoop = mainLoop; int ret = dnssd_register_local_service(rCtx->mServiceHandle, OnRegister, rCtx); - VerifyOrReturnError(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_register_local_service() failed. ret: %d", ret), false)); + VerifyOrReturnValue(ret == DNSSD_ERROR_NONE, false, + ChipLogError(DeviceLayer, "dnssd_register_local_service() failed. ret: %d", ret)); rCtx->mIsRegistered = true; return true; @@ -209,8 +209,8 @@ void OnBrowse(dnssd_service_state_e state, dnssd_service_h service, void * data) VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_service_get_interface() failed. ret: %d", ret)); interfaceId = if_nametoindex(ifaceName); - VerifyOrExit(interfaceId > 0, - (ChipLogError(DeviceLayer, "if_nametoindex() failed. errno: %d", errno), ret = DNSSD_ERROR_OPERATION_FAILED)); + VerifyOrExit(interfaceId > 0, ChipLogError(DeviceLayer, "if_nametoindex() failed. errno: %d", errno); + ret = DNSSD_ERROR_OPERATION_FAILED); if (state == DNSSD_SERVICE_STATE_AVAILABLE) { @@ -253,8 +253,8 @@ gboolean BrowseAsync(GMainLoop * mainLoop, gpointer userData) else { char iface[IF_NAMESIZE + 1] = ""; - VerifyOrReturnError(if_indextoname(interfaceId, iface) != nullptr, - (ChipLogError(DeviceLayer, "if_indextoname() failed. errno: %d", errno), false)); + VerifyOrReturnValue(if_indextoname(interfaceId, iface) != nullptr, false, + ChipLogError(DeviceLayer, "if_indextoname() failed. errno: %d", errno)); ret = dnssd_browse_service(bCtx->mType, iface, &bCtx->mBrowserHandle, OnBrowse, bCtx); } @@ -407,8 +407,7 @@ gboolean ResolveAsync(GMainLoop * mainLoop, gpointer userData) rCtx->mMainLoop = mainLoop; int ret = dnssd_resolve_service(rCtx->mServiceHandle, OnResolve, rCtx); - VerifyOrReturnError(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_resolve_service() failed. ret: %d", ret), false)); + VerifyOrReturnValue(ret == DNSSD_ERROR_NONE, false, ChipLogError(DeviceLayer, "dnssd_resolve_service() failed. ret: %d", ret)); rCtx->mIsResolving = true; return true; @@ -520,7 +519,7 @@ CHIP_ERROR DnssdTizen::RegisterService(const DnssdService & service, DnssdPublis std::lock_guard lock(mMutex); auto iServiceCtx = std::find_if(mContexts.begin(), mContexts.end(), [fullType, service, interfaceId](const auto & ctx) { - VerifyOrReturnError(ctx->mContextType == ContextType::Register, false); + VerifyOrReturnValue(ctx->mContextType == ContextType::Register, false); auto * rCtx = static_cast(ctx.get()); return strcmp(rCtx->mName, service.mName) == 0 && strcmp(rCtx->mType, fullType.c_str()) == 0 && rCtx->mPort == service.mPort && rCtx->mInterfaceId == interfaceId; @@ -552,25 +551,26 @@ CHIP_ERROR DnssdTizen::RegisterService(const DnssdService & service, DnssdPublis // Local service will be freed by the RegisterContext destructor int ret = dnssd_create_local_service(fullType.c_str(), &serviceCtx->mServiceHandle); auto serviceHandle = serviceCtx->mServiceHandle; - VerifyOrExit(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_create_local_service() failed. ret: %d", ret), err = GetChipError(ret))); + VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_create_local_service() failed. ret: %d", ret); + err = GetChipError(ret)); ret = dnssd_service_set_name(serviceHandle, service.mName); - VerifyOrExit(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_service_set_name() failed. ret: %d", ret), err = GetChipError(ret))); + VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_service_set_name() failed. ret: %d", ret); + err = GetChipError(ret)); ret = dnssd_service_set_port(serviceHandle, service.mPort); - VerifyOrExit(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_service_set_port() failed. ret: %d", ret), err = GetChipError(ret))); + VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_service_set_port() failed. ret: %d", ret); + err = GetChipError(ret)); if (interfaceId > 0) { char iface[IF_NAMESIZE + 1] = ""; VerifyOrExit(if_indextoname(interfaceId, iface) != nullptr, - (ChipLogError(DeviceLayer, "if_indextoname() failed. errno: %d", errno), err = CHIP_ERROR_INTERNAL)); + ChipLogError(DeviceLayer, "if_indextoname() failed. errno: %d", errno); + err = CHIP_ERROR_INTERNAL); ret = dnssd_service_set_interface(serviceHandle, iface); - VerifyOrExit(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_service_set_interface() failed. ret: %d", ret), err = GetChipError(ret))); + VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_service_set_interface() failed. ret: %d", ret); + err = GetChipError(ret)); } for (size_t i = 0; i < service.mTextEntrySize; ++i) @@ -578,8 +578,8 @@ CHIP_ERROR DnssdTizen::RegisterService(const DnssdService & service, DnssdPublis TextEntry entry = service.mTextEntries[i]; VerifyOrReturnError(chip::CanCastTo(entry.mDataSize), CHIP_ERROR_INVALID_ARGUMENT); ret = dnssd_service_add_txt_record(serviceHandle, entry.mKey, static_cast(entry.mDataSize), entry.mData); - VerifyOrExit(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_service_add_txt_record() failed. ret: %d", ret), err = GetChipError(ret))); + VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_service_add_txt_record() failed. ret: %d", ret); + err = GetChipError(ret)); } ok = DeviceLayer::Internal::MainLoop::Instance().AsyncRequest(RegisterAsync, serviceCtx); @@ -655,12 +655,13 @@ CHIP_ERROR DnssdTizen::Resolve(const DnssdService & browseResult, chip::Inet::In { char iface[IF_NAMESIZE + 1] = ""; VerifyOrExit(if_indextoname(interfaceId, iface) != nullptr, - (ChipLogError(DeviceLayer, "if_indextoname() failed. errno: %d", errno), err = CHIP_ERROR_INTERNAL)); + ChipLogError(DeviceLayer, "if_indextoname() failed. errno: %d", errno); + err = CHIP_ERROR_INTERNAL); ret = dnssd_create_remote_service(fullType.c_str(), browseResult.mName, iface, &resolveCtx->mServiceHandle); } - VerifyOrExit(ret == DNSSD_ERROR_NONE, - (ChipLogError(DeviceLayer, "dnssd_create_remote_service() failed. ret: %d", ret), err = GetChipError(ret))); + VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_create_remote_service() failed. ret: %d", ret); + err = GetChipError(ret)); ok = DeviceLayer::Internal::MainLoop::Instance().AsyncRequest(ResolveAsync, resolveCtx); VerifyOrExit(ok, err = CHIP_ERROR_INTERNAL); diff --git a/src/platform/Tizen/ThreadStackManagerImpl.cpp b/src/platform/Tizen/ThreadStackManagerImpl.cpp index c7cca4463a606a..75c2dec4c0aa1b 100644 --- a/src/platform/Tizen/ThreadStackManagerImpl.cpp +++ b/src/platform/Tizen/ThreadStackManagerImpl.cpp @@ -444,9 +444,8 @@ CHIP_ERROR ThreadStackManagerImpl::_GetPrimary802154MACAddress(uint8_t * buf) int threadErr; threadErr = thread_get_extended_address(mThreadInstance, &extAddr); - VerifyOrReturnError( - threadErr == THREAD_ERROR_NONE, - (ChipLogError(DeviceLayer, "thread_get_extended_address() failed. ret: %d", threadErr), CHIP_ERROR_INTERNAL)); + VerifyOrReturnError(threadErr == THREAD_ERROR_NONE, CHIP_ERROR_INTERNAL, + ChipLogError(DeviceLayer, "thread_get_extended_address() failed. ret: %d", threadErr)); extAddr = htobe64(extAddr); memcpy(buf, &extAddr, sizeof(extAddr)); @@ -592,8 +591,8 @@ CHIP_ERROR ThreadStackManagerImpl::_SetupSrpHost(const char * aHostName) /* Get external ip address */ threadErr = thread_get_ipaddr(mThreadInstance, _ThreadIpAddressCb, THREAD_IPADDR_TYPE_MLEID, nullptr); - VerifyOrReturnError(threadErr == THREAD_ERROR_NONE, - (ChipLogError(DeviceLayer, "thread_get_ipaddr() failed. ret: %d", threadErr), CHIP_ERROR_INTERNAL)); + VerifyOrReturnError(threadErr == THREAD_ERROR_NONE, CHIP_ERROR_INTERNAL, + ChipLogError(DeviceLayer, "thread_get_ipaddr() failed. ret: %d", threadErr)); return CHIP_NO_ERROR; } diff --git a/src/platform/logging/BUILD.gn b/src/platform/logging/BUILD.gn index 038f9421d819b2..402528315d5b81 100644 --- a/src/platform/logging/BUILD.gn +++ b/src/platform/logging/BUILD.gn @@ -16,7 +16,7 @@ if (current_os == "android") { deps = [ ":headers", "${chip_root}/src/lib/core:chip_config_header", - "${chip_root}/src/lib/support:enforce_format", + "${chip_root}/src/lib/support:attributes", "${chip_root}/src/lib/support:logging_constants", "${chip_root}/src/platform:platform_buildconfig", ] @@ -25,14 +25,38 @@ if (current_os == "android") { } } +# We need to reference the output file of ":stdio" at build time, +# but get_target_outputs() does not work for binary targets. As a +# workaround, define a reasonable path and make the target use it. +stdio_archive = "$root_out_dir/liblogging-stdio.a" + static_library("stdio") { sources = [ "impl/stdio/Logging.cpp" ] deps = [ ":headers", "${chip_root}/src/lib/core:chip_config_header", - "${chip_root}/src/lib/support:enforce_format", + "${chip_root}/src/lib/support:attributes", "${chip_root}/src/lib/support:logging_constants", "${chip_root}/src/platform:platform_buildconfig", ] + + # Ensure we end up with the expected output file name + output_dir = get_path_info(stdio_archive, "dir") + output_name = get_path_info(stdio_archive, "name") + output_extension = get_path_info(stdio_archive, "extension") + output_prefix_override = true +} + +# Depending on this target (via public_deps) pulls in the stdio +# logger and ensures it takes precendce over the platform backend. +group("force_stdio") { + deps = [ ":stdio" ] + public_configs = [ ":force_stdio_config" ] +} + +config("force_stdio_config") { + # Ensure the linker sees the stdio implementation first. This + # works because ldflags come before inputs on the command line. + ldflags = [ rebase_path(stdio_archive, root_build_dir) ] } diff --git a/src/system/SystemConfig.h b/src/system/SystemConfig.h index 87171af3352059..11ba2a0157ad0e 100644 --- a/src/system/SystemConfig.h +++ b/src/system/SystemConfig.h @@ -174,18 +174,6 @@ /* Configuration option variables defined below */ -/** - * @def CHIP_SYSTEM_CONFIG_NO_LOCKING - * - * @brief - * Disable the use of locking within the system layer. - * - * Unless you are simulating an LwIP-based system on a Unix-style host, this value should be left at its default. - */ -#ifndef CHIP_SYSTEM_CONFIG_NO_LOCKING -#define CHIP_SYSTEM_CONFIG_NO_LOCKING 0 -#endif /* CHIP_SYSTEM_CONFIG_NO_LOCKING */ - /** * @def CHIP_SYSTEM_CONFIG_POSIX_LOCKING * @@ -505,6 +493,18 @@ struct LwIPEvent; #endif /* !CHIP_SYSTEM_CONFIG_USE_LWIP */ #endif /* CHIP_SYSTEM_CONFIG_HEADER_RESERVE_SIZE */ +/** + * @def CHIP_SYSTEM_CONFIG_PLATFORM_LOG + * + * @brief + * Defines whether (1) or not (0) the system uses a platform-specific logging implementation. + * + * See CHIPLogging.h for details. + */ +#ifndef CHIP_SYSTEM_CONFIG_PLATFORM_LOG +#define CHIP_SYSTEM_CONFIG_PLATFORM_LOG 0 +#endif // CHIP_SYSTEM_CONFIG_PLATFORM_LOG + /** * @def CHIP_SYSTEM_CONFIG_PLATFORM_PROVIDES_TIME *