/* Retrieves the number of strings * Returns 1 if successful or -1 on error */ int libwrc_string_get_number_of_strings( libwrc_resource_t *resource, uint32_t language_identifier, int *number_of_strings, libcerror_error_t **error ) { libwrc_internal_resource_t *internal_resource = NULL; static char *function = "libwrc_string_get_number_of_strings"; if( resource == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource.", function ); return( -1 ); } internal_resource = (libwrc_internal_resource_t *) resource; if( internal_resource->resource_values == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid resource - missing resource values.", function ); return( -1 ); } if( internal_resource->resource_values->identifier != LIBWRC_RESOURCE_IDENTIFIER_STRING ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, "%s: unsupported resource type: 0x%08" PRIx32 ".", function, internal_resource->resource_values->identifier ); return( -1 ); } if( internal_resource->value == NULL ) { if( libwrc_resource_read_value( internal_resource, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read resource value.", function ); return( -1 ); } } if( libwrc_language_table_get_number_of_values( (libwrc_language_table_t *) internal_resource->value, language_identifier, number_of_strings, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve number of values for language identifier: 0x%08" PRIx32 ".", function, language_identifier ); return( -1 ); } return( 1 ); }
/* Retrieves the string index for a specific identifier * Returns 1 if successful, 0 if no such string identifier or -1 on error */ int libwrc_string_get_index_by_identifier( libwrc_resource_t *resource, uint32_t language_identifier, uint32_t string_identifier, int *string_index, libcerror_error_t **error ) { libfvalue_value_t *string_value = NULL; libwrc_internal_resource_t *internal_resource = NULL; libwrc_language_entry_t *language_entry = NULL; uint8_t *string_value_identifier = NULL; static char *function = "libwrc_string_get_index_by_identifier"; size_t string_value_identifier_size = 0; uint32_t identifier = 0; int number_of_strings = 0; if( resource == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource.", function ); return( -1 ); } internal_resource = (libwrc_internal_resource_t *) resource; if( internal_resource->resource_values == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid resource - missing resource values.", function ); return( -1 ); } if( internal_resource->resource_values->identifier != LIBWRC_RESOURCE_IDENTIFIER_STRING ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, "%s: unsupported resource type: 0x%08" PRIx32 ".", function, internal_resource->resource_values->identifier ); return( -1 ); } if( internal_resource->value == NULL ) { if( libwrc_resource_read_value( internal_resource, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read resource value.", function ); return( -1 ); } } if( libwrc_language_table_get_entry_by_identifier( (libwrc_language_table_t *) internal_resource->value, language_identifier, &language_entry, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve language entry for identifier: 0x%08" PRIx32 ".", function, language_identifier ); return( -1 ); } if( libwrc_language_entry_get_number_of_values( language_entry, &number_of_strings, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve number of strings.", function ); return( -1 ); } for( *string_index = 0; *string_index < number_of_strings; *string_index += 1 ) { if( libwrc_language_entry_get_value_by_index( language_entry, *string_index, (intptr_t **) &string_value, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve string value: %d.", function, string_index ); return( -1 ); } if( libfvalue_value_get_identifier( string_value, &string_value_identifier, &string_value_identifier_size, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve string value: %d identifier.", function, string_index ); return( -1 ); } if( string_value_identifier == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: missing string value identifier.", function ); return( -1 ); } if( string_value_identifier_size != 4 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_OUT_OF_BOUNDS, "%s: string size value out of bound.", function ); return( -1 ); } byte_stream_copy_to_uint32_little_endian( string_value_identifier, identifier ); if( identifier == string_identifier ) { return( 1 ); } } return( 0 ); }
/* Reads the resource * Returns 1 if successful or -1 on error */ int libwrc_resource_read( libwrc_resource_t *resource, libcerror_error_t **error ) { libwrc_internal_resource_t *internal_resource = NULL; static char *function = "libwrc_resource_read"; if( resource == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource.", function ); return( -1 ); } internal_resource = (libwrc_internal_resource_t *) resource; if( internal_resource->resource_values == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid resource - missing resource values.", function ); return( -1 ); } if( internal_resource->value == NULL ) { if( libwrc_resource_read_value( internal_resource, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read resource value.", function ); return( -1 ); } /* TODO if( internal_resource->value == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid resource - missing value.", function ); return( -1 ); } */ } return( 1 ); }
/* Retrieves the language specific value * Returns 1 if successful or -1 on error */ int libwrc_resource_get_value_by_language_identifier( libwrc_resource_t *resource, int resource_type, uint32_t language_identifier, int value_index, intptr_t **value, libcerror_error_t **error ) { libwrc_internal_resource_t *internal_resource = NULL; libwrc_language_entry_t *language_entry = NULL; static char *function = "libwrc_resource_get_value_by_language_identifier"; if( resource == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource.", function ); return( -1 ); } internal_resource = (libwrc_internal_resource_t *) resource; if( internal_resource->resource_values == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid resource - missing resource values.", function ); return( -1 ); } if( internal_resource->resource_values->type != resource_type ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, "%s: unsupported resource type: 0x%08" PRIx32 ".", function, internal_resource->resource_values->type ); return( -1 ); } if( internal_resource->value == NULL ) { if( libwrc_resource_read_value( internal_resource, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read resource value.", function ); return( -1 ); } } if( libwrc_language_table_get_entry_by_identifier( (libwrc_language_table_t *) internal_resource->value, language_identifier, &language_entry, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve language entry for identifier: 0x%08" PRIx32 ".", function, language_identifier ); return( -1 ); } if( libwrc_language_entry_get_value_by_index( language_entry, value_index, value, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve value: %d.", function, value_index ); return( -1 ); } return( 1 ); }
/* Retrieves a specific language identifier * Returns 1 if successful or -1 on error */ int libwrc_resource_get_language_identifier( libwrc_resource_t *resource, int language_index, uint32_t *language_identifier, libcerror_error_t **error ) { libwrc_internal_resource_t *internal_resource = NULL; static char *function = "libwrc_resource_get_language_identifier"; if( resource == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource.", function ); return( -1 ); } internal_resource = (libwrc_internal_resource_t *) resource; if( internal_resource->resource_values == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid resource - missing resource values.", function ); return( -1 ); } if( internal_resource->value == NULL ) { if( libwrc_resource_read_value( internal_resource, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read resource value.", function ); return( -1 ); } } if( libwrc_language_table_get_identifier( (libwrc_language_table_t *) internal_resource->value, language_index, language_identifier, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve identifier for language: %d.", function, language_index ); return( -1 ); } return( 1 ); }
/* Retrieves the number of languages * Returns 1 if successful or -1 on error */ int libwrc_resource_get_number_of_languages( libwrc_resource_t *resource, int *number_of_languages, libcerror_error_t **error ) { libwrc_internal_resource_t *internal_resource = NULL; static char *function = "libwrc_resource_get_number_of_languages"; if( resource == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid resource.", function ); return( -1 ); } internal_resource = (libwrc_internal_resource_t *) resource; if( internal_resource->resource_values == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid resource - missing resource values.", function ); return( -1 ); } if( internal_resource->value == NULL ) { if( libwrc_resource_read_value( internal_resource, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read resource value.", function ); return( -1 ); } } if( libwrc_language_table_get_number_of_entries( (libwrc_language_table_t *) internal_resource->value, number_of_languages, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve number of languages.", function ); return( -1 ); } return( 1 ); }