/* Sets the node value of the node * * If the flag LIBFDATA_TREE_NODE_VALUE_FLAG_MANAGED is set the tree * takes over management of the value and the value is freed when * no longer needed. * * Returns 1 if successful or -1 on error */ int libfdata_tree_set_node_value( libfdata_tree_t *tree, libfcache_cache_t *cache, libfdata_tree_node_t *node, intptr_t *node_value, int (*free_node_value)( intptr_t **node_value, libcerror_error_t **error ), uint8_t flags, libcerror_error_t **error ) { static char *function = "libfdata_tree_set_node_value"; off64_t node_offset = 0; size64_t node_size = 0; time_t node_timestamp = 0; uint32_t node_flags = 0; int cache_entry_index = -1; int node_file_index = -1; int number_of_cache_entries = 0; if( tree == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid tree.", function ); return( -1 ); } if( libfdata_tree_node_get_data_range( node, &node_file_index, &node_offset, &node_size, &node_flags, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve data range from tree node.", function ); return( -1 ); } if( libfdata_tree_node_get_timestamp( node, &node_timestamp, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve timestamp from tree node.", function ); return( -1 ); } if( libfcache_cache_get_number_of_entries( cache, &number_of_cache_entries, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve number of cache entries.", function ); return( -1 ); } if( number_of_cache_entries <= 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, "%s: invalid number of cache entries value out of bounds.", function ); return( -1 ); } if( ( ( ( (libfdata_internal_tree_node_t *) node )->flags & LIBFDATA_TREE_NODE_FLAG_IS_VIRTUAL ) == 0 ) && ( ( ( (libfdata_internal_tree_node_t *) node )->flags & LIBFDATA_TREE_NODE_FLAG_IS_LEAF ) != 0 ) ) { cache_entry_index = libfdata_tree_node_calculate_leaf_node_cache_entry_index( node_offset, number_of_cache_entries ); } else { cache_entry_index = libfdata_tree_node_calculate_branch_node_cache_entry_index( node_offset, number_of_cache_entries ); } if( libfcache_cache_set_value_by_index( cache, cache_entry_index, node_file_index, node_offset, node_timestamp, node_value, free_node_value, flags, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set value in cache entry: %d.", function, cache_entry_index ); return( -1 ); } return( 1 ); }
/* Retrieves a specific message string * Returns 1 if successful, 0 if no such message string or -1 error */ int resource_file_get_message_string( resource_file_t *resource_file, uint32_t message_string_identifier, message_string_t **message_string, libcerror_error_t **error ) { static char *function = "resource_file_get_message_string"; uint32_t language_identifier = 0; time_t timestamp = 0; int result = 0; if( resource_file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource file.", function ); return( -1 ); } if( message_string == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid message string.", function ); return( -1 ); } if( resource_file->message_table_resource == NULL ) { result = libwrc_stream_get_resource_by_type( resource_file->resource_stream, LIBWRC_RESOURCE_TYPE_MESSAGE_TABLE, &( resource_file->message_table_resource ), error ); if( result == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve message table resource.", function ); return( -1 ); } else if( result == 0 ) { return( 0 ); } } result = resource_file_get_message_string_from_cache( resource_file, message_string_identifier, message_string, error ); if( result == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve message string from cache.", function ); return( -1 ); } else if( result == 0 ) { if( resource_file_get_resource_available_languague_identifier( resource_file, resource_file->message_table_resource, &language_identifier, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve an available language identifier.", function ); return( -1 ); } *message_string = NULL; if( message_string_initialize( message_string, message_string_identifier, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create message string.", function ); return( -1 ); } result = message_string_get_from_message_table_resource( *message_string, resource_file->message_table_resource, language_identifier, error ); if( result == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve message string: 0x%08" PRIx32 ".", function, message_string_identifier ); message_string_free( message_string, NULL ); return( -1 ); } else if( result != 0 ) { if( libfcache_date_time_get_timestamp( ×tamp, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve cache timestamp.", function ); message_string_free( message_string, NULL ); return( -1 ); } if( libfcache_cache_set_value_by_index( resource_file->message_string_cache, resource_file->next_message_string_cache_index, 0, resource_file->next_message_string_cache_index, timestamp, (intptr_t *) *message_string, (int (*)(intptr_t **, libcerror_error_t **)) &message_string_free, LIBFCACHE_CACHE_VALUE_FLAG_MANAGED, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set message string in cache entry: %d.", function, resource_file->next_message_string_cache_index ); message_string_free( message_string, NULL ); return( -1 ); } resource_file->next_message_string_cache_index++; if( resource_file->next_message_string_cache_index == 16 ) { resource_file->next_message_string_cache_index = 0; } message_string = NULL; } if( message_string != NULL ) { if( message_string_free( message_string, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free message string.", function ); return( -1 ); } } } return( result ); }