Skip to content

Commit a5bf072

Browse files
authored
Merge pull request #463 from RachelTucker/4-1-c
SA-228: 4.1 generation for C module
2 parents fb8d115 + 2675a6a commit a5bf072

File tree

7 files changed

+106
-8
lines changed

7 files changed

+106
-8
lines changed

ds3-autogen-c/src/main/resources/templates/header-templates/ds3_h.ftl

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
#include <stdint.h>
1111
#include <string.h>
1212
#include <curl/curl.h>
13+
#include "ds3_bool.h"
1314
#include "ds3_string.h"
1415
#include "ds3_string_multimap.h"
16+
#include "ds3_uint64_string_map.h"
1517

1618
#ifdef __cplusplus
1719
extern "C" {
@@ -53,10 +55,6 @@ typedef struct {
5355

5456
typedef struct _ds3_metadata ds3_metadata;
5557

56-
typedef enum {
57-
False, True
58-
}ds3_bool;
59-
6058
typedef enum {
6159
HTTP_GET,
6260
HTTP_PUT,
@@ -115,6 +113,12 @@ typedef struct {
115113
</#list>
116114
<#-- **************************************** -->
117115

116+
typedef struct {
117+
ds3_metadata* metadata;
118+
ds3_checksum_type *blob_checksum_type;
119+
ds3_uint64_string_map* blob_checksums;
120+
}ds3_head_object_response;
121+
118122
<#-- **************************************** -->
119123
<#-- Generate all Structs -->
120124
<#list getStructs() as structEntry>
@@ -153,6 +157,7 @@ typedef struct _ds3_client {
153157

154158
LIBRARY_API void ds3_request_free(ds3_request* request);
155159
LIBRARY_API void ds3_error_free(ds3_error* error);
160+
LIBRARY_API void ds3_head_object_response_free(ds3_head_object_response* response);
156161
LIBRARY_API void ds3_multipart_upload_part_response_free(ds3_multipart_upload_part_response* response);
157162
LIBRARY_API void ds3_complete_multipart_upload_response_free(ds3_complete_multipart_upload_response* response);
158163
LIBRARY_API void ds3_delete_objects_response_free(ds3_delete_objects_response* response);
@@ -214,7 +219,7 @@ LIBRARY_API ds3_request* ds3_init_head_bucket_request(const char *const bucket_n
214219
LIBRARY_API ds3_error* ds3_head_bucket_request(const ds3_client* client, const ds3_request* request);
215220
<#elseif requestEntry.getName() == "ds3_head_object_request">
216221
LIBRARY_API ds3_request* ds3_init_head_object_request(const char* bucket_name, const char *const object_name);
217-
LIBRARY_API ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_metadata** _metadata);
222+
LIBRARY_API ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_head_object_response** response);
218223
<#else>
219224
<#include "RequestCommentDocumentation.ftl">
220225
<#include "InitRequestPrototype.ftl">

ds3-autogen-c/src/main/resources/templates/request-templates/HeadObjectRequest.ftl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_metadata** _metadata) {
1+
ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_head_object_response** response) {
22
ds3_error* error;
33
ds3_string_multimap* return_headers;
44
ds3_metadata* metadata;
@@ -13,8 +13,11 @@ ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request*
1313
error = _internal_request_dispatcher(client, request, NULL, NULL, NULL, NULL, &return_headers);
1414

1515
if (error == NULL) {
16-
metadata = _init_metadata(return_headers);
17-
*_metadata = metadata;
16+
ds3_head_object_response* response_ptr = g_new0(ds3_head_object_response, 1);
17+
response_ptr->metadata = _init_metadata(return_headers);
18+
response_ptr->blob_checksum_type = get_blob_checksum_type(client->log, return_headers);
19+
response_ptr->blob_checksums = get_blob_checksums(client->log, return_headers);
20+
*response = response_ptr;
1821
ds3_string_multimap_free(return_headers);
1922
}
2023

ds3-autogen-c/src/main/resources/templates/source-templates/ds3_c.ftl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "ds3_connection.h"
1313
#include "ds3_request.h"
1414
#include "ds3_string_multimap_impl.h"
15+
#include "ds3_uint64_string_map.h"
1516
#include "ds3_utils.h"
1617

1718
#ifdef _WIN32

ds3-autogen-c/src/main/resources/templates/source-templates/ds3_requests.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
#include "ds3.h"
99
#include "ds3_net.h"
1010
#include "ds3_request.h"
11+
#include "ds3_response_header_utils.h"
1112
#include "ds3_string_multimap_impl.h"
13+
#include "ds3_uint64_string_map.h"
1214
#include "ds3_utils.h"
1315

1416
#ifdef _WIN32

ds3-autogen-c/src/main/resources/templates/source-templates/free_custom_types.ftl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,23 @@ void ds3_delete_objects_response_free(ds3_delete_objects_response* response) {
3434
g_free(response);
3535
}
3636

37+
void ds3_head_object_response_free(ds3_head_object_response* response) {
38+
if (response == NULL) {
39+
return;
40+
}
41+
if (response->blob_checksum_type != NULL) {
42+
g_free(response->blob_checksum_type);
43+
}
44+
if (response->metadata != NULL) {
45+
ds3_metadata_free(response->metadata);
46+
}
47+
if (response->blob_checksums != NULL) {
48+
ds3_uint64_string_map_free(response->blob_checksums);
49+
}
50+
51+
g_free(response);
52+
}
53+
3754
void ds3_paging_free(ds3_paging* paging) {
3855
g_free(paging);
3956
}

ds3-autogen-c/src/test/java/com/spectralogic/ds3autogen/c/CCodeGeneratorSpectraS3Requests_Test.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,47 @@ public void testGenerateSpectraS3GetBucketRequestPrototype() throws IOException,
194194
final String expectedOutput = "LIBRARY_API ds3_error* ds3_get_bucket_request(const ds3_client* client, const ds3_request* request, ds3_list_bucket_result_response** response);";
195195
assertEquals(expectedOutput, output);
196196
}
197+
198+
@Test
199+
public void testHeadObjectRequest() throws IOException, ParseException, TemplateModelException {
200+
final String inputSpecFile = "/input/HeadObjectRequest.xml";
201+
final TestFileUtilsImpl fileUtils = new TestFileUtilsImpl();
202+
final Ds3SpecParser parser = new Ds3SpecParserImpl();
203+
final Ds3ApiSpec spec = parser.getSpec(CCodeGenerator_Test.class.getResourceAsStream(inputSpecFile));
204+
205+
final Source source = SourceConverter.toSource(CCodeGenerator.getAllEnums(spec),
206+
CCodeGenerator.getAllStructs(spec, ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of()),
207+
CCodeGenerator.getAllRequests(spec, new Ds3DocSpecEmptyImpl()));
208+
final CCodeGenerator codeGenerator = new CCodeGenerator();
209+
codeGenerator.processTemplate(source, "source-templates/ds3_requests.ftl", fileUtils.getOutputStream());
210+
211+
final ByteArrayOutputStream bstream = (ByteArrayOutputStream) fileUtils.getOutputStream();
212+
final String output = new String(bstream.toByteArray());
213+
214+
assertTrue(output.contains("ds3_error* ds3_head_object_request(const ds3_client* client, const ds3_request* request, ds3_head_object_response** response) {\n" +
215+
" ds3_error* error;\n" +
216+
" ds3_string_multimap* return_headers;\n" +
217+
" ds3_metadata* metadata;\n" +
218+
"\n" +
219+
" int num_slashes = num_chars_in_ds3_str(request->path, '/');\n" +
220+
" if (num_slashes < 2 || ((num_slashes == 2) && ('/' == request->path->value[request->path->size-1]))) {\n" +
221+
" return ds3_create_error(DS3_ERROR_MISSING_ARGS, \"The object name parameter is required.\");\n" +
222+
" } else if (g_ascii_strncasecmp(request->path->value, \"//\", 2) == 0) {\n" +
223+
" return ds3_create_error(DS3_ERROR_MISSING_ARGS, \"The bucket name parameter is required.\");\n" +
224+
" }\n" +
225+
"\n" +
226+
" error = _internal_request_dispatcher(client, request, NULL, NULL, NULL, NULL, &return_headers);\n" +
227+
"\n" +
228+
" if (error == NULL) {\n" +
229+
" ds3_head_object_response* response_ptr = g_new0(ds3_head_object_response, 1);\n" +
230+
" response_ptr->metadata = _init_metadata(return_headers);\n" +
231+
" response_ptr->blob_checksum_type = get_blob_checksum_type(client->log, return_headers);\n" +
232+
" response_ptr->blob_checksums = get_blob_checksums(client->log, return_headers);\n" +
233+
" *response = response_ptr;\n" +
234+
" ds3_string_multimap_free(return_headers);\n" +
235+
" }\n" +
236+
"\n" +
237+
" return error;\n" +
238+
"}"));
239+
}
197240
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<Data>
2+
<Contract>
3+
<RequestHandlers>
4+
<RequestHandler Classification="amazons3" Name="com.spectralogic.s3.server.handler.reqhandler.amazons3.HeadObjectRequestHandler">
5+
<Request BucketRequirement="REQUIRED" HttpVerb="HEAD" IncludeIdInPath="false" ObjectRequirement="REQUIRED">
6+
<OptionalQueryParams/>
7+
<RequiredQueryParams/>
8+
</Request>
9+
<ResponseCodes>
10+
<ResponseCode>
11+
<Code>200</Code>
12+
<ResponseTypes>
13+
<ResponseType Type="null"/>
14+
</ResponseTypes>
15+
</ResponseCode>
16+
<ResponseCode>
17+
<Code>404</Code>
18+
<ResponseTypes>
19+
<ResponseType Type="com.spectralogic.s3.server.domain.HttpErrorResultApiBean"/>
20+
</ResponseTypes>
21+
</ResponseCode>
22+
</ResponseCodes>
23+
<Version>1.CF182CD57551902A475553F26582BC78</Version>
24+
</RequestHandler>
25+
</RequestHandlers>
26+
</Contract>
27+
</Data>

0 commit comments

Comments
 (0)