file.c
Go to the documentation of this file.
1 /*!**********************************************************************
2 *
3 * @copyright Copyright (C) 2016 Siemens Aktiengesellschaft.\n
4 * All rights reserved.
5 *
6 *************************************************************************
7 *
8 * @file file.c
9 * @date Jul 27, 2016
10 * @brief This source file implements the functions in file.h.
11 *
12 ************************************************************************/
13 
14 #include "file.h"
15 #include "definitions.h"
16 #include "memory.h"
17 #include "log_util.h"
18 #include "file_util.h"
19 #include "time_util.h"
20 // TODO: #include "mcl/mcl_file.h"
21 
22 E_MCL_ERROR_CODE file_initialize(const char *version, const char *file_path, const char *file_name, const char *file_type, const char *routing, file_t **file)
23 {
24  DEBUG_ENTRY("const char *version = <%p>, const char *file_path = <%p>, const char *file_name = <%p>, const char *file_type = <%p>, const char *routing = <%p>, file_t **file = <%p>",
25  version, file_path, file_name, file_type, routing, file)
26 
27  // Allocate memory for a new file item.
28  MCL_NEW(*file);
29  ASSERT_CODE_MESSAGE(MCL_NULL != *file, MCL_OUT_OF_MEMORY, "Memory couldn't be allocated for file item.");
30 
31  // Set all fields to MCL_NULL first.
32  (*file)->meta.content_id = MCL_NULL;
33  (*file)->meta.type = MCL_NULL;
34  (*file)->meta.version = MCL_NULL;
35  (*file)->meta.details.routing = MCL_NULL;
36  (*file)->meta.payload.type = MCL_NULL;
37  (*file)->meta.payload.version = MCL_NULL;
38  (*file)->meta.payload.details.file_details.file_name = MCL_NULL;
39  (*file)->meta.payload.details.file_details.creation_date = MCL_NULL;
40  (*file)->meta.payload.details.file_details.file_type = MCL_NULL;
41  (*file)->payload.buffer = MCL_NULL;
42  (*file)->descriptor = MCL_NULL;
43 
44  // If file name is null then this is a type of file of which the content and details will not be read from file system.
45  // Instead, this type of file will have it's buffer inside it's payload.
46  if (MCL_NULL != file_path)
47  {
48  E_MCL_ERROR_CODE code;
49  mcl_stat_t file_attributes;
50  mcl_bool_t is_regular_file;
51 
52  // Set meta.type.
54  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.type.");
55 
56  // Set meta.version.
58  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.version.");
59 
60  // Set meta.details.routing which is optional.
61  if (MCL_NULL != routing)
62  {
63  code = string_initialize_new(routing, 0, &(*file)->meta.details.routing);
64  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.details.routing.");
65  }
66 
67  // Set meta.payload.type.
69  &((*file)->meta.payload.type));
70  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.payload.type.");
71 
72  // Set meta.payload.version.
73  code = string_initialize_new(version, 0, &(*file)->meta.payload.version);
74  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.payload.version.");
75 
76  // Open file if file_name is not null.
77  code = file_util_fopen(file_path, "rb", &(*file)->descriptor);
78  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), MCL_FILE_CANNOT_BE_OPENED, "File can not be opened for reading.");
79 
80  // Set file name.
81  code = string_initialize_new(file_name, 0, &(*file)->meta.payload.details.file_details.file_name);
82  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.payload.details.file_details.file_name.");
83 
84  // Set file type which is optional.
85  if (MCL_NULL != file_type)
86  {
87  code = string_initialize_new(file_type, 0, &(*file)->meta.payload.details.file_details.file_type);
88  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.payload.details.file_details.file_type.");
89  }
90 
91  // Get file attributes.
92  code = file_util_fstat((*file)->descriptor, &file_attributes);
93  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "File attributes can not be accessed.");
94 
95  // Check if regular file.
96  is_regular_file = file_util_check_if_regular_file(&file_attributes);
97  ASSERT_STATEMENT_CODE_MESSAGE(MCL_TRUE == is_regular_file, file_destroy(file), MCL_FILE_CANNOT_BE_OPENED, "File is not a regular file.");
98 
99  // Set file size.
100  (*file)->payload.size = file_attributes.st_size;
101 
102  // Set file creation date.
103  code = time_util_convert_to_iso_8601_format(&file_attributes.st_ctime, &(*file)->meta.payload.details.file_details.creation_date);
104  ASSERT_STATEMENT_CODE_MESSAGE(MCL_OK == code, file_destroy(file), code, "String initialization failed for meta.payload.details.file_details.creation_date.");
105  }
106 
107  DEBUG_LEAVE("retVal = <%d>", MCL_OK);
108  return MCL_OK;
109 }
110 
111 #if MCL_FILE_DOWNLOAD_ENABLED
112 
113 E_MCL_ERROR_CODE mcl_file_get_name(mcl_file_t *file, char **file_name)
114 {
115  DEBUG_ENTRY("mcl_file_t *file = <%p>, char **file_name = <%p>", file, file_name)
116 
117  ASSERT_NOT_NULL(file);
118  ASSERT_NOT_NULL(file_name);
119 
120  *file_name = file->meta.payload.details.file_details.file_name->buffer;
121 
122  DEBUG_LEAVE("retVal = <%d>", MCL_OK);
123  return MCL_OK;
124 }
125 
126 E_MCL_ERROR_CODE mcl_file_get_size(mcl_file_t *file, mcl_size_t *file_size)
127 {
128  DEBUG_ENTRY("mcl_file_t *file = <%p>, mcl_size_t *file_size = <%p>", file, file_size)
129 
130  ASSERT_NOT_NULL(file);
131  ASSERT_NOT_NULL(file_size);
132 
133  *file_size = file->payload.size;
134 
135  DEBUG_LEAVE("retVal = <%d>", MCL_OK);
136  return MCL_OK;
137 }
138 
139 E_MCL_ERROR_CODE mcl_file_get_buffer(mcl_file_t *file, mcl_uint8_t **buffer)
140 {
141  DEBUG_ENTRY("mcl_file_t *file = <%p>, mcl_uint8_t **buffer = <%p>", file, buffer)
142 
143  ASSERT_NOT_NULL(file);
144  ASSERT_NOT_NULL(buffer);
145 
146  *buffer = file->payload.buffer;
147 
148  DEBUG_LEAVE("retVal = <%d>", MCL_OK);
149  return MCL_OK;
150 }
151 
152 void mcl_file_destroy(mcl_file_t **file)
153 {
154  DEBUG_ENTRY("mcl_file_t **file = <%p>", file)
155 
156  file_destroy(file);
157 
158  DEBUG_LEAVE("retVal = void");
159 }
160 
161 #endif
162 
163 void file_destroy(file_t **file)
164 {
165  DEBUG_ENTRY("file_t **file = <%p>", file)
166 
167  if (MCL_NULL != *file)
168  {
169  file_util_fclose((*file)->descriptor);
170  string_destroy(&((*file)->meta.content_id));
171  string_destroy(&((*file)->meta.type));
172  string_destroy(&((*file)->meta.version));
173  string_destroy(&((*file)->meta.details.routing));
174  string_destroy(&((*file)->meta.payload.type));
175  string_destroy(&((*file)->meta.payload.version));
176  string_destroy(&((*file)->meta.payload.details.file_details.file_name));
177  string_destroy(&((*file)->meta.payload.details.file_details.creation_date));
178  string_destroy(&((*file)->meta.payload.details.file_details.file_type));
179  MCL_FREE(*file);
180  }
181 
182  DEBUG_LEAVE("retVal = void");
183 }
void string_destroy(string_t **string)
Destroys the allocated resources of the string.
Definition: string_type.c:326
Memory module header file.
void file_destroy(file_t **file)
Definition: file.c:163
#define DEBUG_LEAVE(...)
Definition: log_util.h:81
#define DEBUG_ENTRY(...)
Definition: log_util.h:80
File type of meta field payload.
Definition: data_types.h:288
#define MCL_NEW(p)
Definition: memory.h:121
E_MCL_ERROR_CODE string_initialize_new(const char *value, mcl_size_t value_length, string_t **string)
Initializes a new string_t object with the given value and length.
Definition: string_type.c:46
#define MCL_TRUE
Definition: mcl_common.h:54
struct stat mcl_stat_t
Definition: file_util.h:25
#define ASSERT_NOT_NULL(argument)
Definition: definitions.h:129
E_MCL_ERROR_CODE file_initialize(const char *version, const char *file_path, const char *file_name, const char *file_type, const char *routing, file_t **file)
Definition: file.c:22
File module header file.
Log utility module header file.
Current version of meta field.
Definition: data_types.h:284
E_MCL_ERROR_CODE
MCL Error code definitions. Every function returning an error code uses this enum values...
Definition: mcl_common.h:137
E_MCL_ERROR_CODE file_util_fopen(const char *file_name, const char *mode, void **file_descriptor)
Definition: file_util.c:22
E_MCL_STRING_TYPE type
Type of copy and destroy.
Definition: string_type.h:47
#define MCL_FREE(p)
Definition: memory.h:125
#define ASSERT_STATEMENT_CODE_MESSAGE(condition, statement, return_code,...)
Definition: definitions.h:121
This struct is used for building the complete message of file.
Definition: file.h:24
E_MCL_ERROR_CODE time_util_convert_to_iso_8601_format(const time_t *time_value, string_t **iso8601_formatted_time)
Definition: time_util.c:19
uint8_t mcl_uint8_t
Definition: mcl_common.h:43
#define ASSERT_CODE_MESSAGE(condition, return_code,...)
Definition: definitions.h:105
Definitions module header file.
File utility module header file.
Item type of meta field.
Definition: data_types.h:283
File can not be opened.
Definition: mcl_common.h:149
E_MCL_ERROR_CODE file_util_fclose(void *file_descriptor)
Definition: file_util.c:52
string_t meta_field_values[META_FIELD_VALUES_END]
Definition: data_types.c:36
size_t mcl_size_t
Definition: mcl_common.h:38
mcl_uint8_t mcl_bool_t
Definition: mcl_common.h:47
Success.
Definition: mcl_common.h:140
E_MCL_ERROR_CODE file_util_fstat(void *file_descriptor, struct stat *file_attributes)
Definition: file_util.c:155
E_MCL_ERROR_CODE string_initialize_static(const char *value, mcl_size_t value_length, string_t **string)
Initializes a static string_t object with the given value and length.
Definition: string_type.c:90
mcl_bool_t file_util_check_if_regular_file(const mcl_stat_t *file_attributes)
Definition: file_util.c:216
Memory allocation fail.
Definition: mcl_common.h:143
struct mcl_file_t mcl_file_t
This struct is used for building the complete message of file.
Definition: mcl_store.h:39
#define MCL_NULL
Definition: definitions.h:24
Time utility module header file.