blob: 820ddafe83d372915053f2a21505e8bfbb14826c [file] [log] [blame]
/*
*
* Copyright (c) 2013-2017 Nest Labs, Inc.
* 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.
*/
/**
* @file
* Objective-C representation of a Status Report from the common profile.
*
*/
// Note that the choice of namespace alias must be made up front for each and every compile unit
// This is because many include paths could set the default alias to unintended target.
#include <Weave/Profiles/data-management/Legacy/WdmManagedNamespace.h>
#import "NLProfileStatusError.h"
#import "NLWeaveDeviceManager.h"
#include <Weave/Core/WeaveCore.h>
#include <Weave/Profiles/WeaveProfiles.h>
#include <Weave/Profiles/common/CommonProfile.h>
#include <Weave/Profiles/bulk-data-transfer/BulkDataTransfer.h>
#include <Weave/Profiles/service-directory/ServiceDirectory.h>
#include <Weave/Profiles/data-management/DataManagement.h>
#include <Weave/Profiles/device-control/DeviceControl.h>
#include <Weave/Profiles/fabric-provisioning/FabricProvisioning.h>
#include <Weave/Profiles/network-provisioning/NetworkProvisioning.h>
#include <Weave/Profiles/security/WeaveSecurity.h>
#include <Weave/Profiles/software-update/SoftwareUpdateProfile.h>
#include <Weave/Profiles/service-provisioning/ServiceProvisioning.h>
using namespace nl::Weave::Profiles;
@interface NLProfileStatusError () {
NSString * _statusReport;
}
@end
@implementation NLProfileStatusError
- (id)initWithProfileId:(uint32_t)profileId
statusCode:(uint16_t)statusCode
errorCode:(uint32_t)errorCode
statusReport:(NSString *)statusReport
{
if (self = [super init]) {
_profileId = profileId;
_statusCode = statusCode;
_errorCode = errorCode;
_statusReport = statusReport;
}
return self;
}
- (NSInteger)translateErrorCode
{
switch (self.profileId) {
case nl::Weave::Profiles::kWeaveProfile_BDX:
switch (self.statusCode) {
case BulkDataTransfer::kStatus_Overflow:
return kNLStatus_Overflow;
case BulkDataTransfer::kStatus_LengthTooShort:
return kNLStatus_LengthTooShort;
case BulkDataTransfer::kStatus_XferFailedUnknownErr:
return kNLStatus_XferFailedUnknownErr;
case BulkDataTransfer::kStatus_XferMethodNotSupported:
return kNLStatus_XferMethodNotSupported;
case BulkDataTransfer::kStatus_UnknownFile:
return kNLStatus_UnknownFile;
case BulkDataTransfer::kStatus_StartOffsetNotSupported:
return kNLStatus_StartOffsetNotSupported;
case BulkDataTransfer::kStatus_Unknown:
return kNLStatus_Unknown;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_Common:
switch (self.statusCode) {
case nl::Weave::Profiles::Common::kStatus_Success:
return kNLStatus_Success;
case nl::Weave::Profiles::Common::kStatus_BadRequest:
return kNLStatus_BadRequest;
case nl::Weave::Profiles::Common::kStatus_UnsupportedMessage:
return kNLStatus_UnsupportedMessage;
case nl::Weave::Profiles::Common::kStatus_UnexpectedMessage:
return kNLStatus_UnexpectedMessage;
case nl::Weave::Profiles::Common::kStatus_OutOfMemory:
return kNLStatus_OutOfMemory;
case nl::Weave::Profiles::Common::kStatus_Relocated:
return kNLStatus_Relocated;
case nl::Weave::Profiles::Common::kStatus_Busy:
return kNLStatus_Busy;
case nl::Weave::Profiles::Common::kStatus_Timeout:
return kNLStatus_Timeout;
case nl::Weave::Profiles::Common::kStatus_InternalError:
return kNLStatus_InternalError;
case nl::Weave::Profiles::Common::kStatus_Continue:
return kNLStatus_Continue;
case nl::Weave::Profiles::Common::kStatus_AccessDenied:
return kNLStatus_AccessDenied;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_WDM:
switch (self.statusCode) {
case DataManagement_Legacy::kStatus_InvalidPath:
return kNLStatus_InvalidPath;
case DataManagement_Legacy::kStatus_UnknownTopic:
return kNLStatus_UnknownTopic;
case DataManagement_Legacy::kStatus_IllegalReadRequest:
return kNLStatus_IllegalReadRequest;
case DataManagement_Legacy::kStatus_IllegalWriteRequest:
return kNLStatus_IllegalWriteRequest;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_DeviceControl:
switch (self.statusCode) {
case DeviceControl::kStatusCode_FailSafeAlreadyActive:
return kNLStatusCode_FailSafeAlreadyActive;
case DeviceControl::kStatusCode_NoFailSafeActive:
return kNLStatusCode_NoFailSafeActive;
case DeviceControl::kStatusCode_NoMatchingFailSafeActive:
return kNLStatusCode_NoMatchingFailSafeActive;
case DeviceControl::kStatusCode_UnsupportedFailSafeMode:
return kNLStatusCode_UnsupportedFailSafeMode;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_DeviceDescription:
switch (self.statusCode) {
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_Echo:
switch (self.statusCode) {
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_FabricProvisioning:
switch (self.statusCode) {
case FabricProvisioning::kStatusCode_AlreadyMemberOfFabric:
return kNLStatusCode_AlreadyMemberOfFabric;
case FabricProvisioning::kStatusCode_NotMemberOfFabric:
return kNLStatusCode_NotMemberOfFabric;
case FabricProvisioning::kStatusCode_InvalidFabricConfig:
return kNLStatusCode_InvalidFabricConfig;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_NetworkProvisioning:
switch (self.statusCode) {
case NetworkProvisioning::kStatusCode_UnknownNetwork:
return kNLStatusCode_UnknownNetwork;
case NetworkProvisioning::kStatusCode_TooManyNetworks:
return kNLStatusCode_TooManyNetworks;
case NetworkProvisioning::kStatusCode_InvalidNetworkConfiguration:
return kNLStatusCode_InvalidNetworkConfiguration;
case NetworkProvisioning::kStatusCode_UnsupportedNetworkType:
return kNLStatusCode_UnsupportedNetworkType;
case NetworkProvisioning::kStatusCode_UnsupportedWiFiMode:
return kNLStatusCode_UnsupportedWiFiMode;
case NetworkProvisioning::kStatusCode_UnsupportedWiFiRole:
return kNLStatusCode_UnsupportedWiFiRole;
case NetworkProvisioning::kStatusCode_UnsupportedWiFiSecurityType:
return kNLStatusCode_UnsupportedWiFiSecurityType;
case NetworkProvisioning::kStatusCode_InvalidState:
return kNLStatusCode_InvalidState;
case NetworkProvisioning::kStatusCode_TestNetworkFailed:
return kNLStatusCode_TestNetworkFailed;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_Security:
switch (self.statusCode) {
case Security::kStatusCode_SessionAborted:
return kNLStatusCode_SessionAborted;
case Security::kStatusCode_PASESupportsOnlyConfig1:
return kNLStatusCode_PASESupportsOnlyConfig1;
case Security::kStatusCode_NoCommonPASEConfigurations:
return kNLStatusCode_NoCommonPASEConfigurations;
case Security::kStatusCode_UnsupportedEncryptionType:
return kNLStatusCode_UnsupportedEncryptionType;
case Security::kStatusCode_InvalidKeyId:
return kNLStatusCode_InvalidKeyId;
case Security::kStatusCode_DuplicateKeyId:
return kNLStatusCode_DuplicateKeyId;
case Security::kStatusCode_KeyConfirmationFailed:
return kNLStatusCode_KeyConfirmationFailed;
case Security::kStatusCode_InternalError:
return kNLStatusCode_InternalError;
default:
return self.statusCode;
}
break;
#if WEAVE_CONFIG_ENABLE_SERVICE_DIRECTORY
case nl::Weave::Profiles::kWeaveProfile_ServiceDirectory:
switch (self.statusCode) {
case ServiceDirectory::kStatus_DirectoryUnavailable:
return kNLStatus_DirectoryUnavailable;
default:
return self.statusCode;
}
break;
#endif
case nl::Weave::Profiles::kWeaveProfile_ServiceProvisioning:
switch (self.statusCode) {
case ServiceProvisioning::kStatusCode_TooManyServices:
return kNLStatusCode_TooManyServices;
case ServiceProvisioning::kStatusCode_ServiceAlreadyRegistered:
return kNLStatusCode_ServiceAlreadyRegistered;
case ServiceProvisioning::kStatusCode_InvalidServiceConfig:
return kNLStatusCode_InvalidServiceConfig;
case ServiceProvisioning::kStatusCode_NoSuchService:
return kNLStatusCode_NoSuchService;
case ServiceProvisioning::kStatusCode_PairingServerError:
return kNLStatusCode_PairingServerError;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_SWU:
switch (self.statusCode) {
case SoftwareUpdate::kStatus_NoUpdateAvailable:
return kNLStatus_NoUpdateAvailable;
case SoftwareUpdate::kStatus_UpdateFailed:
return kNLStatus_UpdateFailed;
case SoftwareUpdate::kStatus_InvalidInstructions:
return kNLStatus_InvalidInstructions;
case SoftwareUpdate::kStatus_DownloadFailed:
return kNLStatus_DownloadFailed;
case SoftwareUpdate::kStatus_IntegrityCheckFailed:
return kNLStatus_IntegrityCheckFailed;
case SoftwareUpdate::kStatus_Abort:
return kNLStatus_Abort;
case SoftwareUpdate::kStatus_Retry:
return kNLStatus_Retry;
default:
return self.statusCode;
}
break;
case nl::Weave::Profiles::kWeaveProfile_StatusReport_Deprecated:
switch (self.statusCode) {
default:
return self.statusCode;
}
break;
default:
return self.statusCode;
}
}
- (NSString *)description
{
NSString * emptyStatusReport =
[NSString stringWithFormat:@"No StatusReport available. profileId = %ld, statusCode = %ld, SysErrorCode = %ld",
(long) self.profileId, (long) self.statusCode, (long) self.errorCode];
return _statusReport ? ([NSString stringWithFormat:@"%@, SysErrorCode = %ld", _statusReport, (long) self.errorCode])
: emptyStatusReport;
}
@end