blob: a1e35d76df8d15cbe49350a4ae5b01baac519ca4 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* 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.
*/
package com.android.ims.rcs.uce.util;
import android.telephony.ims.RcsUceAdapter;
import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.RequestType;
/**
* Define the network sip code and the reason.
*/
public class NetworkSipCode {
public static final int SIP_CODE_OK = 200;
public static final int SIP_CODE_ACCEPTED = 202;
public static final int SIP_CODE_BAD_REQUEST = 400;
public static final int SIP_CODE_FORBIDDEN = 403;
public static final int SIP_CODE_NOT_FOUND = 404;
public static final int SIP_CODE_METHOD_NOT_ALLOWED = 405;
public static final int SIP_CODE_REQUEST_TIMEOUT = 408;
public static final int SIP_CODE_INTERVAL_TOO_BRIEF = 423;
public static final int SIP_CODE_TEMPORARILY_UNAVAILABLE = 480;
public static final int SIP_CODE_BAD_EVENT = 489;
public static final int SIP_CODE_BUSY = 486;
public static final int SIP_CODE_SERVER_INTERNAL_ERROR = 500;
public static final int SIP_CODE_SERVICE_UNAVAILABLE = 503;
public static final int SIP_CODE_SERVER_TIMEOUT = 504;
public static final int SIP_CODE_BUSY_EVERYWHERE = 600;
public static final int SIP_CODE_DECLINE = 603;
public static final int SIP_CODE_DOES_NOT_EXIST_ANYWHERE = 604;
public static final String SIP_OK = "OK";
public static final String SIP_ACCEPTED = "Accepted";
public static final String SIP_BAD_REQUEST = "Bad Request";
public static final String SIP_SERVICE_UNAVAILABLE = "Service Unavailable";
public static final String SIP_INTERNAL_SERVER_ERROR = "Internal Server Error";
public static final String SIP_NOT_REGISTERED = "User not registered";
public static final String SIP_NOT_AUTHORIZED_FOR_PRESENCE = "not authorized for presence";
/**
* Convert the given SIP CODE to the Contact uce capabilities error.
* @param sipCode The SIP code of the request response.
* @param reason The reason of the request response.
* @param requestType The type of this request.
* @return The RCS contact UCE capabilities error which is defined in RcsUceAdapter.
*/
public static int getCapabilityErrorFromSipCode(int sipCode, String reason,
@RequestType int requestType) {
int uceError;
switch (sipCode) {
case NetworkSipCode.SIP_CODE_FORBIDDEN: // 403
if(requestType == UceController.REQUEST_TYPE_PUBLISH) {
// Not provisioned for PUBLISH request.
uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
} else {
// Check the reason for CAPABILITY request
if (NetworkSipCode.SIP_NOT_REGISTERED.equalsIgnoreCase(reason)) {
// Not registered with IMS. Device shall register to IMS.
uceError = RcsUceAdapter.ERROR_NOT_REGISTERED;
} else if (NetworkSipCode.SIP_NOT_AUTHORIZED_FOR_PRESENCE.equalsIgnoreCase(
reason)) {
// Not provisioned for EAB. Device shall not retry.
uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
} else {
// The network has responded SIP 403 error with no reason.
uceError = RcsUceAdapter.ERROR_FORBIDDEN;
}
}
break;
case NetworkSipCode.SIP_CODE_NOT_FOUND: // 404
if(requestType == UceController.REQUEST_TYPE_PUBLISH) {
// Not provisioned for PUBLISH request.
uceError = RcsUceAdapter.ERROR_NOT_AUTHORIZED;
} else {
uceError = RcsUceAdapter.ERROR_NOT_FOUND;
}
break;
case NetworkSipCode.SIP_CODE_REQUEST_TIMEOUT: // 408
uceError = RcsUceAdapter.ERROR_REQUEST_TIMEOUT;
break;
case NetworkSipCode.SIP_CODE_INTERVAL_TOO_BRIEF: // 423
// Rejected by the network because the requested expiry interval is too short.
uceError = RcsUceAdapter.ERROR_GENERIC_FAILURE;
break;
case NetworkSipCode.SIP_CODE_BAD_EVENT:
uceError = RcsUceAdapter.ERROR_FORBIDDEN; // 489
break;
case NetworkSipCode.SIP_CODE_SERVER_INTERNAL_ERROR: // 500
case NetworkSipCode.SIP_CODE_SERVICE_UNAVAILABLE: // 503
// The network is temporarily unavailable or busy.
uceError = RcsUceAdapter.ERROR_SERVER_UNAVAILABLE;
break;
default:
uceError = RcsUceAdapter.ERROR_GENERIC_FAILURE;
break;
}
return uceError;
}
}