Simple interface for Mbed Cloud Client

Dependents:  

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers fcc_output_info_handler.c Source File

fcc_output_info_handler.c

00001 // ----------------------------------------------------------------------------
00002 // Copyright 2016-2017 ARM Ltd.
00003 //
00004 // Licensed under the Apache License, Version 2.0 (the "License");
00005 // you may not use this file except in compliance with the License.
00006 // You may obtain a copy of the License at
00007 //
00008 //     http://www.apache.org/licenses/LICENSE-2.0
00009 //
00010 // Unless required by applicable law or agreed to in writing, software
00011 // distributed under the License is distributed on an "AS IS" BASIS,
00012 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013 // See the License for the specific language governing permissions and
00014 // limitations under the License.
00015 // ----------------------------------------------------------------------------
00016 
00017 #include <stdlib.h>
00018 #include "pv_error_handling.h"
00019 #include "fcc_status.h"
00020 #include "fcc_output_info_handler.h"
00021 #include "fcc_malloc.h"
00022 
00023 
00024 //General error string
00025 const char g_fcc_general_status_error_str[] = "General error:";
00026 
00027 //fcc error strings
00028 const char g_fcc_ca_error_str[] = "CA error:";
00029 const char g_fcc_rot_error_str[] = "Root of trust error:";
00030 const char g_fcc_entropy_error_str[] = "Entropy error:";
00031 const char g_fcc_disabled_error_str[] = "Factory disabled error:";
00032 const char g_fcc_invalid_certificate_error_str[] = "Certificate invalid:";
00033 const char g_fcc_item_not_exists_error_str[] = "Item does not exist:";
00034 const char g_fcc_meta_data_not_exists_error_str[] = "Meta data does not exist:";
00035 const char g_fcc_meta_data_size_error_str[] = "Meta data does not exist:";
00036 const char g_fcc_wrong_item_size_error_str[] = "Item size is wrong:";
00037 const char g_fcc_empty_item_error_str[] = "Item empty:";
00038 const char g_fcc_uri_wrong_format_error_str[] = "URI format incorrect:";
00039 const char g_fcc_first_to_claim_not_allowed_error_str[] = "first to claim not allowed:";
00040 const char g_fcc_wrong_utc_offset_value_error_str[] = "UTC offset incorrect:";
00041 const char g_fcc_wrong_bootstrap_use_value_error_str[] = "Bootstrap mode value incorrect:";
00042 const char g_fcc_not_permitted_error_str[] = "Operation not permitted:";
00043 const char g_fcc_wrong_ca_certificate_error_str[] = "Validation of CA certificate failed:";
00044 const char g_fcc_invalid_cn_certificate_error_str[] = "Certificate CN attribute invalid:";
00045 const char g_fcc_crypto_public_key_correlation_error_str[] = "Certificate public key validation failed:";
00046 const char g_fcc_internal_storage_error_str[] = "Internal storage error:";
00047 
00048 //kcm crypto error strings
00049 const char g_fcc_kcm_file_error_str[] = "File operation general error:";
00050 const char g_fcc_kcm_invalid_file_version_str[] = "File version invalid:";
00051 const char g_fcc_kcm_file_data_corrupted_str[] = "File data corrupted:";
00052 const char g_fcc_kcm_file_name_corrupted_str[] = "File name corrupted:";
00053 const char g_fcc_kcm_not_initialized_str[] = "KCM not initialized:";
00054 const char g_fcc_kcm_close_incomplete_chain_str[] = "Closing incomplete KCM chain:";
00055 const char g_fcc_kcm_invalid_chain_str[] = "Invalid certificate chain:";
00056 const char g_fcc_kcm_invalid_num_of_cert_in_chain_str[] = "Invalid number of certificate in chain:";
00057 const char g_fcc_kcm_file_exist_error_str[] = "Data already exists:";
00058 const char g_fcc_kcm_file_name_too_long_error_str[] = "File name too long:";
00059 const char g_fcc_crypto_kcm_error_str[] = "KCM crypto error:";
00060 const char g_fcc_crypto_empty_item_error_str[] = "Item data empty:";
00061 const char g_fcc_crypto_unsupported_hash_mode_error_str[] = "Hash mode unsupported:";
00062 const char g_fcc_crypto_parsing_der_pivate_key_error_str[] = "Private key parse failed:";
00063 const char g_fcc_crypto_parsing_der_public_key_error_str[] = "Public key parse failed:";
00064 const char g_fcc_crypto_verify_private_key_error_str[] = "Private key verification failed:";
00065 const char g_fcc_crypto_verify_public_key_error_str[] = "Public key verification failed:";
00066 const char g_fcc_crypto_unsupported_curve_error_str[] = "Curve unsupported:";
00067 const char g_fcc_crypto_parsing_der_cert_error_str[] = "Certificate parse failed:";
00068 const char g_fcc_crypto_cert_expired_error_str[] = "Certificate expired:";
00069 const char g_fcc_crypto_cert_future_error_str[] = "Certificate will be valid in the future:";
00070 const char g_fcc_crypto_cert_md_alg_error_str[] = "Certificate MD algorithm error:";
00071 const char g_fcc_crypto_cert_public_key_type_error_str[] = "Certificate public key type error:";
00072 const char g_fcc_crypto_cert_public_key_error_str[] = "Certificate public key error:";
00073 const char g_fcc_crypto_cert_not_trusted_error_str[] = "Certificate not trusted:";
00074 const char g_fcc_crypto_invalid_x509_attr_error_str[] = "X509 attribute invalid:";
00075 const char g_fcc_crypto_invalid_pk_key_format_error_str[] = "Public key format invalid:";
00076 const char g_fcc_crypto_invalid_public_key_error_str[] = "Public key invalid:";
00077 const char g_fcc_crypto_ecp_invalid_key_error_str[] = "EC key invalid:";
00078 const char g_fcc_crypto_pk_key_invalid_version_error_str[] = "Public key version invalid:";
00079 const char g_fcc_crypto_pk_password_requerd_error_str[] = "Public key password required:";
00080 const char g_fcc_crypto_unknown_pk_algorithm_error_str[] = "Public key algorithm unknown:";
00081 
00082 //warning strings
00083 const char g_fcc_item_not_set_warning_str[] = "Item not set:";
00084 
00085 const char g_fcc_bootstrap_mode_false_warning_str[] = "Bootstrap mode not activated:";
00086 const char g_fcc_self_signed_warning_str[] = "Certificate is self signed:";
00087 const char g_fcc_item_is_empty_warning_str[] = "Item empty:";
00088 const char g_fcc_redundant_item_warning_str[] = "Item redundant:";
00089 const char g_fcc_cert_time_validity_warning_str[] = "Certificate validity cannot be checked:";
00090 const char g_fcc_cert_validity_less_10_years_warning_str[] = "Certificate validity is less than 10 years:";
00091 const char g_fcc_ca_identifier_warning_str[] = "CA identifier wasn't set properly:";
00092 
00093 fcc_output_info_s g_output_info;
00094 
00095 
00096 /**  The function frees all allocated buffers
00097 * @param output_warning_info[in]          The pointer to created fcc_warning_info_s structure
00098 */
00099 static void fcc_free_list_of_warnings(fcc_warning_info_s  *output_warning_info)
00100 {
00101     fcc_warning_info_s *current_node = output_warning_info;
00102     fcc_warning_info_s *next_node = output_warning_info->next;
00103 
00104     while (current_node != NULL) {
00105         if (current_node->warning_info_string != NULL) {
00106             fcc_free(current_node->warning_info_string);
00107         }
00108         fcc_free(current_node);
00109         current_node = next_node;
00110         if (current_node != NULL) {
00111             next_node = current_node->next;
00112         }
00113     }
00114 }
00115 /**  The function combines message string info and failed item, and sets it to passed pointer.
00116 * @param message_string[in]          The message string - error or warning
00117 * @param failed_item_name[in]        The name of item.
00118 * @param failed_item_name_size[in]   The size of item's name.
00119 * @param out_string[in/out]          The output string where the combined message should be copied.
00120 */
00121 static fcc_status_e  fcc_set_output_string_info(const char *message_string, const uint8_t *failed_item_name, size_t failed_item_name_size, char **out_string)
00122 {
00123     fcc_status_e  fcc_status = FCC_STATUS_SUCCESS;
00124 
00125     SA_PV_LOG_TRACE_FUNC_ENTER_NO_ARGS();
00126 
00127     //Allocate memory for error info
00128     *out_string = fcc_malloc(strlen(message_string) + failed_item_name_size + 1); // 1 char for '\0'
00129     SA_PV_ERR_RECOVERABLE_RETURN_IF((out_string == NULL), fcc_status = FCC_STATUS_MEMORY_OUT, "Failed to allocate buffer for output info");
00130 
00131     //Copy to  the global structure error string info
00132     strcpy((*out_string), message_string);
00133 
00134     //Copy to  the global structure the name of failed item if it exists.
00135     if (failed_item_name != NULL) {
00136         memcpy((uint8_t*)(*out_string) + strlen(message_string), failed_item_name, failed_item_name_size);
00137         //Set '\0' in the end of error string info
00138         (*out_string)[strlen(message_string) + failed_item_name_size] = '\0';
00139     }
00140 
00141 
00142     SA_PV_LOG_TRACE_FUNC_EXIT_NO_ARGS();
00143     return fcc_status;
00144 }
00145 
00146 static size_t fcc_get_size_of_all_warning_strings()
00147 {
00148     fcc_warning_info_s *current_node = g_output_info.head_of_warning_list;
00149     size_t size_of_all_warning_strings = 0;
00150 
00151     SA_PV_LOG_INFO_FUNC_ENTER_NO_ARGS();
00152 
00153     while (current_node != NULL) {
00154         size_of_all_warning_strings += strlen(current_node->warning_info_string);
00155         current_node = current_node->next;
00156     }
00157 
00158     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00159     return size_of_all_warning_strings;
00160 }
00161 
00162 static bool copy_all_warning_to_buffer(char *out_warning_string, size_t size_of_out_warning_string)
00163 {
00164     fcc_warning_info_s *current_node = g_output_info.head_of_warning_list;
00165     size_t length_of_iterated_strings = 0;
00166 
00167     memset(out_warning_string, 0, size_of_out_warning_string);
00168 
00169     while (current_node != NULL) {
00170         //Calculate size of current warning
00171         if (length_of_iterated_strings + strlen(current_node->warning_info_string) + 1 > size_of_out_warning_string) {
00172             return false;
00173         }
00174         strcpy(out_warning_string + length_of_iterated_strings, current_node->warning_info_string);
00175         //Set '\n' in the end of warning string info
00176         (out_warning_string)[length_of_iterated_strings + strlen(current_node->warning_info_string)] = '\n';
00177         length_of_iterated_strings += strlen(current_node->warning_info_string) + 1;
00178         current_node = current_node->next;
00179     }
00180     //Increase the size for '\0'
00181     if (length_of_iterated_strings >= size_of_out_warning_string) {
00182         return false;
00183     }
00184     (out_warning_string)[length_of_iterated_strings] = '\0';
00185 
00186     return true;
00187 }
00188 /**  The function returns error string according to passed fcc_status.
00189 * @param fcc_status[in]          The fcc_status
00190 *
00191 */
00192 char* fcc_get_fcc_error_string(fcc_status_e  fcc_status)
00193 {
00194     SA_PV_LOG_TRACE_FUNC_ENTER("fcc_status is %d", fcc_status);
00195     char *fcc_error_string = NULL;
00196 
00197     switch (fcc_status) {
00198         case FCC_STATUS_ERROR:
00199         case FCC_STATUS_MEMORY_OUT:
00200         case FCC_STATUS_INVALID_PARAMETER:
00201         case FCC_STATUS_KCM_ERROR:
00202         case FCC_STATUS_BUNDLE_ERROR:
00203         case FCC_STATUS_BUNDLE_RESPONSE_ERROR:
00204         case FCC_STATUS_BUNDLE_UNSUPPORTED_GROUP:
00205         case FCC_STATUS_BUNDLE_INVALID_SCHEME:
00206         case FCC_STATUS_BUNDLE_INVALID_GROUP:
00207         case FCC_STATUS_KCM_STORAGE_ERROR:
00208         case FCC_STATUS_KCM_FILE_EXIST_ERROR:
00209         case FCC_STATUS_NOT_INITIALIZED:
00210         case FCC_STATUS_OUTPUT_INFO_ERROR:
00211         case FCC_STATUS_WARNING_CREATE_ERROR:
00212         case FCC_STATUS_INVALID_CERT_ATTRIBUTE:
00213         case FCC_STATUS_INTERNAL_ITEM_ALREADY_EXIST:
00214             fcc_error_string = (char*)g_fcc_general_status_error_str;
00215             break;
00216         case FCC_STATUS_CA_ERROR:
00217             fcc_error_string = (char*)g_fcc_ca_error_str;
00218             break;
00219         case FCC_STATUS_ROT_ERROR:
00220             fcc_error_string = (char*)g_fcc_rot_error_str;
00221             break;
00222         case FCC_STATUS_STORE_ERROR:
00223             fcc_error_string = (char*)g_fcc_internal_storage_error_str;
00224             break;
00225         case FCC_STATUS_KCM_CRYPTO_ERROR:
00226             fcc_error_string = (char*)g_fcc_crypto_kcm_error_str;
00227             break;
00228         case FCC_STATUS_INVALID_CERTIFICATE:
00229             fcc_error_string = (char*)g_fcc_invalid_certificate_error_str;
00230             break;
00231         case FCC_STATUS_INVALID_LWM2M_CN_ATTR:
00232             fcc_error_string = (char*)g_fcc_invalid_cn_certificate_error_str;
00233             break;
00234         case FCC_STATUS_ENTROPY_ERROR:
00235             fcc_error_string = (char*)g_fcc_entropy_error_str;
00236             break;
00237         case FCC_STATUS_FACTORY_DISABLED_ERROR:
00238             fcc_error_string = (char*)g_fcc_disabled_error_str;
00239             break;
00240         case FCC_STATUS_ITEM_NOT_EXIST:
00241             fcc_error_string = (char*)g_fcc_item_not_exists_error_str;
00242             break;
00243         case FCC_STATUS_WRONG_ITEM_DATA_SIZE:
00244             fcc_error_string = (char*)g_fcc_wrong_item_size_error_str;
00245             break;
00246         case FCC_STATUS_EMPTY_ITEM:
00247             fcc_error_string = (char*)g_fcc_empty_item_error_str;
00248             break;
00249         case FCC_STATUS_URI_WRONG_FORMAT:
00250             fcc_error_string = (char*)g_fcc_uri_wrong_format_error_str;
00251             break;
00252         case FCC_STATUS_FIRST_TO_CLAIM_NOT_ALLOWED:
00253             fcc_error_string = (char*)g_fcc_first_to_claim_not_allowed_error_str;
00254             break;
00255         case FCC_STATUS_BOOTSTRAP_MODE_ERROR:
00256             fcc_error_string = (char*)g_fcc_wrong_bootstrap_use_value_error_str;
00257             break;
00258         case FCC_STATUS_UTC_OFFSET_WRONG_FORMAT:
00259             fcc_error_string = (char*)g_fcc_wrong_utc_offset_value_error_str;
00260             break;
00261         case FCC_STATUS_INVALID_CA_CERT_SIGNATURE:
00262             fcc_error_string = (char*)g_fcc_wrong_ca_certificate_error_str;
00263             break;
00264         case FCC_STATUS_EXPIRED_CERTIFICATE:
00265             fcc_error_string = (char*)g_fcc_crypto_cert_expired_error_str;
00266             break;
00267         case FCC_STATUS_CERTIFICATE_PUBLIC_KEY_CORRELATION_ERROR:
00268             fcc_error_string = (char*)g_fcc_crypto_public_key_correlation_error_str;
00269             break;
00270         default:
00271             fcc_error_string = (char*)NULL;
00272             break;
00273     }
00274     if (fcc_error_string != NULL) {
00275         SA_PV_LOG_TRACE_FUNC_EXIT("fcc_error_string is %s", fcc_error_string);
00276     }
00277     return fcc_error_string;
00278 }
00279 
00280 /**  The function returns error string according to passed kcm_status.
00281 * @param kcm_status[in]          The kcm_status
00282 *
00283 */
00284 
00285 char* fcc_get_kcm_error_string(kcm_status_e  kcm_status)
00286 {
00287     SA_PV_LOG_TRACE_FUNC_ENTER("kcm_status is %d", kcm_status);
00288 
00289     char *kcm_error_string = NULL;
00290 
00291     switch (kcm_status) {
00292         case KCM_STATUS_ERROR:
00293         case KCM_STATUS_INVALID_PARAMETER:
00294         case KCM_STATUS_INSUFFICIENT_BUFFER:
00295         case KCM_STATUS_OUT_OF_MEMORY:
00296         case KCM_STATUS_INVALID_FILE_ACCESS_MODE:
00297         case KCM_STATUS_UNKNOWN_STORAGE_ERROR:
00298         case KCM_CRYPTO_STATUS_INVALID_MD_TYPE:
00299         case KCM_CRYPTO_STATUS_FAILED_TO_WRITE_SIGNATURE:
00300         case  KCM_CRYPTO_STATUS_VERIFY_SIGNATURE_FAILED:
00301             kcm_error_string = (char*)g_fcc_general_status_error_str;
00302             break;
00303         case KCM_STATUS_STORAGE_ERROR:
00304             kcm_error_string = (char*)g_fcc_kcm_file_error_str;
00305             break;
00306         case KCM_STATUS_INVALID_FILE_VERSION:
00307             kcm_error_string = (char*)g_fcc_kcm_invalid_file_version_str;
00308             break;
00309         case KCM_STATUS_FILE_CORRUPTED:
00310             kcm_error_string = (char*)g_fcc_kcm_file_data_corrupted_str;
00311             break;
00312         case KCM_STATUS_NOT_INITIALIZED:
00313             kcm_error_string = (char*)g_fcc_kcm_not_initialized_str;
00314             break;
00315         case KCM_STATUS_CLOSE_INCOMPLETE_CHAIN:
00316             kcm_error_string = (char*)g_fcc_kcm_close_incomplete_chain_str;
00317             break;
00318         case KCM_STATUS_INVALID_CHAIN:
00319             kcm_error_string = (char*)g_fcc_kcm_invalid_chain_str;
00320             break;
00321         case KCM_STATUS_INVALID_NUM_OF_CERT_IN_CHAIN:
00322             kcm_error_string = (char*)g_fcc_kcm_invalid_num_of_cert_in_chain_str;
00323             break;
00324         case KCM_STATUS_ITEM_NOT_FOUND:
00325             kcm_error_string = (char*)g_fcc_item_not_exists_error_str;
00326             break;
00327         case KCM_STATUS_META_DATA_NOT_FOUND:
00328             kcm_error_string = (char*)g_fcc_meta_data_not_exists_error_str;
00329             break;
00330         case KCM_STATUS_META_DATA_SIZE_ERROR:
00331             kcm_error_string = (char*)g_fcc_meta_data_size_error_str;
00332             break;
00333         case KCM_STATUS_NOT_PERMITTED:
00334             kcm_error_string = (char*)g_fcc_not_permitted_error_str;
00335             break;
00336         case KCM_STATUS_FILE_EXIST:
00337             kcm_error_string = (char*)g_fcc_kcm_file_exist_error_str;
00338             break;
00339         case KCM_STATUS_FILE_NAME_CORRUPTED:
00340             kcm_error_string = (char*)g_fcc_kcm_file_name_corrupted_str;
00341             break;
00342         case KCM_STATUS_ITEM_IS_EMPTY:
00343             kcm_error_string = (char*)g_fcc_crypto_empty_item_error_str;
00344             break;
00345         case KCM_STATUS_FILE_NAME_TOO_LONG:
00346             kcm_error_string = (char*)g_fcc_kcm_file_name_too_long_error_str;
00347             break;
00348         case KCM_CRYPTO_STATUS_UNSUPPORTED_HASH_MODE:
00349             kcm_error_string = (char*)g_fcc_crypto_unsupported_hash_mode_error_str;
00350             break;
00351         case KCM_CRYPTO_STATUS_PARSING_DER_PRIVATE_KEY:
00352             kcm_error_string = (char*)g_fcc_crypto_parsing_der_pivate_key_error_str;
00353             break;
00354         case  KCM_CRYPTO_STATUS_PARSING_DER_PUBLIC_KEY:
00355             kcm_error_string = (char*)g_fcc_crypto_parsing_der_public_key_error_str;
00356             break;
00357         case  KCM_CRYPTO_STATUS_PRIVATE_KEY_VERIFICATION_FAILED:
00358             kcm_error_string = (char*)g_fcc_crypto_verify_private_key_error_str;
00359             break;
00360         case  KCM_CRYPTO_STATUS_PUBLIC_KEY_VERIFICATION_FAILED:
00361             kcm_error_string = (char*)g_fcc_crypto_verify_public_key_error_str;
00362             break;
00363         case  KCM_CRYPTO_STATUS_UNSUPPORTED_CURVE:
00364             kcm_error_string = (char*)g_fcc_crypto_unsupported_curve_error_str;
00365             break;
00366         case  KCM_CRYPTO_STATUS_PARSING_DER_CERT:
00367             kcm_error_string = (char*)g_fcc_crypto_parsing_der_cert_error_str;
00368             break;
00369         case  KCM_CRYPTO_STATUS_CERT_EXPIRED:
00370             kcm_error_string = (char*)g_fcc_crypto_cert_expired_error_str;
00371             break;
00372         case  KCM_CRYPTO_STATUS_CERT_FUTURE:
00373             kcm_error_string = (char*)g_fcc_crypto_cert_future_error_str;
00374             break;
00375         case  KCM_CRYPTO_STATUS_CERT_MD_ALG:
00376             kcm_error_string = (char*)g_fcc_crypto_cert_md_alg_error_str;
00377             break;
00378         case  KCM_CRYPTO_STATUS_CERT_PUB_KEY_TYPE:
00379             kcm_error_string = (char*)g_fcc_crypto_cert_public_key_type_error_str;
00380             break;
00381         case  KCM_CRYPTO_STATUS_CERT_PUB_KEY:
00382             kcm_error_string = (char*)g_fcc_crypto_cert_public_key_error_str;
00383             break;
00384         case  KCM_CRYPTO_STATUS_CERT_NOT_TRUSTED:
00385             kcm_error_string = (char*)g_fcc_crypto_cert_not_trusted_error_str;
00386             break;
00387         case  KCM_CRYPTO_STATUS_INVALID_X509_ATTR:
00388             kcm_error_string = (char*)g_fcc_crypto_invalid_x509_attr_error_str;
00389             break;
00390         case KCM_CRYPTO_STATUS_PK_KEY_INVALID_FORMAT:
00391             kcm_error_string = (char*)g_fcc_crypto_invalid_pk_key_format_error_str;
00392             break;
00393         case KCM_CRYPTO_STATUS_INVALID_PK_PUBKEY:
00394             kcm_error_string = (char*)g_fcc_crypto_invalid_public_key_error_str;
00395             break;
00396         case KCM_CRYPTO_STATUS_ECP_INVALID_KEY:
00397             kcm_error_string = (char*)g_fcc_crypto_ecp_invalid_key_error_str;
00398             break;
00399         case KCM_CRYPTO_STATUS_PK_KEY_INVALID_VERSION:
00400             kcm_error_string = (char*)g_fcc_crypto_pk_key_invalid_version_error_str;
00401             break;
00402         case KCM_CRYPTO_STATUS_PK_PASSWORD_REQUIRED:
00403             kcm_error_string = (char*)g_fcc_crypto_pk_password_requerd_error_str;
00404             break;
00405         case KCM_CRYPTO_STATUS_PK_UNKNOWN_PK_ALG:
00406             kcm_error_string = (char*)g_fcc_crypto_unknown_pk_algorithm_error_str;
00407             break;
00408         default:
00409             kcm_error_string = (char*)NULL;
00410             break;
00411     }
00412 
00413     if (kcm_error_string != NULL) {
00414         SA_PV_LOG_TRACE_FUNC_EXIT("kcm_error_string is %s", kcm_error_string);
00415     }
00416     return kcm_error_string;
00417 }
00418 
00419 fcc_output_info_s* get_output_info(void)
00420 {
00421     return &g_output_info;
00422 }
00423 
00424 void  fcc_init_output_info_handler()
00425 {
00426     SA_PV_LOG_INFO_FUNC_ENTER_NO_ARGS();
00427 
00428     g_output_info.error_string_info = NULL;
00429     g_output_info.head_of_warning_list = NULL;
00430     g_output_info.tail_of_warning_list = NULL;
00431     g_output_info.size_of_warning_info_list = 0;
00432 
00433     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00434 }
00435 
00436 void  fcc_clean_output_info_handler()
00437 {
00438     SA_PV_LOG_INFO_FUNC_ENTER_NO_ARGS();
00439 
00440     fcc_free(g_output_info.error_string_info);
00441     g_output_info.error_string_info = NULL;
00442 
00443     if (g_output_info.head_of_warning_list != NULL) {
00444         fcc_free_list_of_warnings(g_output_info.head_of_warning_list);
00445     }
00446     g_output_info.size_of_warning_info_list = 0;
00447     g_output_info.tail_of_warning_list = NULL;
00448     g_output_info.head_of_warning_list = NULL;
00449 
00450     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00451 }
00452 
00453 fcc_status_e  fcc_store_warning_info(const uint8_t *failed_item_name, size_t failed_item_name_size, const char *warning_string)
00454 {
00455     fcc_status_e  fcc_status = FCC_STATUS_SUCCESS;
00456     fcc_warning_info_s *new_node = NULL;
00457 
00458     SA_PV_ERR_RECOVERABLE_RETURN_IF((warning_string == NULL), fcc_status = FCC_STATUS_INVALID_PARAMETER, "Warning string is empty");
00459     SA_PV_LOG_INFO_FUNC_ENTER("warning_string is %s", warning_string);
00460     //Check parameters (failed_item_name can be NULL)
00461     SA_PV_ERR_RECOVERABLE_RETURN_IF((failed_item_name != NULL && failed_item_name_size == 0), fcc_status = FCC_STATUS_INVALID_PARAMETER, "Wrong failed item name parameters");
00462 
00463     //Allocate new node
00464     new_node = (fcc_warning_info_s*)fcc_malloc(sizeof(fcc_warning_info_s));
00465     SA_PV_ERR_RECOVERABLE_RETURN_IF((new_node == NULL), fcc_status = FCC_STATUS_MEMORY_OUT, "Failed to allocate memory for new warning list");
00466 
00467     //Set the new node with warning info (message and item name)
00468     fcc_status = fcc_set_output_string_info(warning_string, failed_item_name, failed_item_name_size, &(new_node->warning_info_string));
00469     SA_PV_ERR_RECOVERABLE_GOTO_IF((fcc_status != FCC_STATUS_SUCCESS), fcc_status = FCC_STATUS_ERROR, exit_with_error, "Failed to set warning string info\n");
00470 
00471     //Update the list
00472     if (g_output_info.head_of_warning_list == NULL) {
00473         //In case this is the first node
00474         g_output_info.head_of_warning_list = g_output_info.tail_of_warning_list = new_node;
00475     } else {
00476         //In case this is an additional node
00477         g_output_info.tail_of_warning_list->next = new_node;
00478         g_output_info.tail_of_warning_list = new_node;
00479     }
00480     g_output_info.tail_of_warning_list->next = NULL;
00481     g_output_info.size_of_warning_info_list++;
00482 
00483     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00484     return fcc_status;
00485 
00486 exit_with_error:
00487     fcc_free(new_node);
00488     return fcc_status;
00489 }
00490 
00491 fcc_status_e  fcc_bundle_store_error_info(const uint8_t *failed_item_name, size_t failed_item_name_size, kcm_status_e  kcm_status)
00492 {
00493     fcc_status_e  fcc_status = FCC_STATUS_SUCCESS;
00494     char *error_string_info = NULL;
00495 
00496     SA_PV_LOG_INFO_FUNC_ENTER("kcm_status is %d", kcm_status);
00497 
00498     //Check parameters (failed_item_name can be NULL)
00499     SA_PV_ERR_RECOVERABLE_RETURN_IF((kcm_status == KCM_STATUS_SUCCESS), fcc_status = FCC_STATUS_INVALID_PARAMETER, "The fcc_bundle_store_error_info should not be called with success status");
00500     SA_PV_ERR_RECOVERABLE_RETURN_IF((failed_item_name != NULL && failed_item_name_size == 0), fcc_status = FCC_STATUS_INVALID_PARAMETER, "Wrong failed item name parameters");
00501 
00502     //Get kcm error string
00503     error_string_info = fcc_get_kcm_error_string(kcm_status);
00504     SA_PV_ERR_RECOVERABLE_RETURN_IF((error_string_info == NULL), fcc_status = FCC_STATUS_ERROR, "Failed to get kcm error string");
00505 
00506     //Store kcm error string with item name
00507     fcc_status = fcc_set_output_string_info(error_string_info, failed_item_name, failed_item_name_size, &(g_output_info.error_string_info));
00508     SA_PV_ERR_RECOVERABLE_RETURN_IF((fcc_status != FCC_STATUS_SUCCESS), fcc_status = FCC_STATUS_ERROR, "Failed to set error string info ");
00509 
00510     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00511     return fcc_status;
00512 }
00513 
00514 fcc_status_e  fcc_store_error_info(const uint8_t *failed_item_name, size_t failed_item_name_size, fcc_status_e  fcc_status)
00515 {
00516     fcc_status_e  fcc_result = FCC_STATUS_SUCCESS;
00517     char *error_string_info = NULL;
00518 
00519     SA_PV_LOG_INFO_FUNC_ENTER("fcc_status is %d", fcc_status);
00520     //Check parameters (failed_item_name can be NULL)
00521     SA_PV_ERR_RECOVERABLE_RETURN_IF((fcc_status == FCC_STATUS_SUCCESS), FCC_STATUS_INVALID_PARAMETER, "The fcc_store_error_info should not be called with success status");
00522     SA_PV_ERR_RECOVERABLE_RETURN_IF((failed_item_name != NULL && failed_item_name_size == 0), FCC_STATUS_INVALID_PARAMETER, "Wrong failed item name parameters");
00523 
00524     //Get fcc error string
00525     error_string_info = fcc_get_fcc_error_string(fcc_status);
00526     SA_PV_ERR_RECOVERABLE_RETURN_IF((error_string_info == NULL), FCC_STATUS_ERROR, "Failed to get fcc error string");
00527 
00528     if (g_output_info.error_string_info == NULL) {
00529         //Store fcc error string with item name
00530         fcc_result = fcc_set_output_string_info(error_string_info, failed_item_name, failed_item_name_size, &(g_output_info.error_string_info));
00531         SA_PV_ERR_RECOVERABLE_RETURN_IF((fcc_result != FCC_STATUS_SUCCESS), FCC_STATUS_ERROR, "Failed to set error string info ");
00532     }
00533 
00534     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00535     return fcc_result;
00536 }
00537 
00538 char* fcc_get_output_error_info()
00539 {
00540     char *error_info = NULL;
00541 
00542     SA_PV_LOG_INFO_FUNC_ENTER_NO_ARGS();
00543 
00544     if (g_output_info.error_string_info != NULL) {
00545         error_info = g_output_info.error_string_info;
00546     }
00547 
00548     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00549     return error_info;
00550 }
00551 
00552 
00553 char*  fcc_get_output_warning_info()
00554 {
00555     char *warrning_string_collection = NULL;
00556     size_t size_of_warning_string_collection = 0;
00557     size_t total_size_of_strings_with_delimeters = 0;
00558     bool status = false;
00559 
00560     SA_PV_LOG_INFO_FUNC_ENTER_NO_ARGS();
00561 
00562     if (g_output_info.head_of_warning_list == NULL || g_output_info.size_of_warning_info_list == 0) {
00563         return NULL;
00564     } else {
00565         //Get size of all warning
00566         size_of_warning_string_collection = fcc_get_size_of_all_warning_strings();
00567 
00568         //total_size_of_strings_with_delimeters -size_of_warning_string_collection +add '\n'  - as delimiter between the warnings and '\0' in the end
00569         total_size_of_strings_with_delimeters = size_of_warning_string_collection + g_output_info.size_of_warning_info_list + 1;
00570 
00571         //Allocate memory  buffer for all warnings
00572         warrning_string_collection = fcc_malloc(total_size_of_strings_with_delimeters);
00573         if (warrning_string_collection == NULL) {
00574             SA_PV_LOG_INFO("Failed to allocate memory for warning strings");
00575             return warrning_string_collection;
00576         }
00577         status = copy_all_warning_to_buffer(warrning_string_collection, total_size_of_strings_with_delimeters);
00578         if (status != true) {
00579             fcc_free(warrning_string_collection);
00580             return NULL;
00581         }
00582     }
00583 
00584     SA_PV_LOG_INFO_FUNC_EXIT_NO_ARGS();
00585     return warrning_string_collection;
00586 }
00587 
00588 bool fcc_get_warning_status()
00589 {
00590     if (g_output_info.head_of_warning_list != NULL) {
00591         return true;
00592     } else {
00593         return false;
00594     }
00595 }