Skip to content

Commit

Permalink
Sync the Arduino Library azure-iot-arduino-utility with the latest az…
Browse files Browse the repository at this point in the history
…ure-iot-sdks version
  • Loading branch information
mamokarz committed Jan 9, 2017
1 parent 7a3be06 commit 6e61fb9
Show file tree
Hide file tree
Showing 7 changed files with 415 additions and 9 deletions.
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=AzureIoTUtility
version=1.0.17
version=1.0.21
author=Microsoft
maintainer=Microsoft <[email protected]>
sentence=Azure C shared utility library for Arduino. For the Arduino MKR1000 or Zero and WiFi Shield 101, Adafruit Huzzah and Feather M0, or SparkFun Thing.
Expand Down
2 changes: 1 addition & 1 deletion src/AzureIoTUtility.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
#include "azure_c_shared_utility/lock.h"
#include "azure_c_shared_utility/threadapi.h"

#define AzureIoTUtilityVersion "1.0.17"
#define AzureIoTUtilityVersion "1.0.21"

#endif //AZUREIOTUTILITY_H
250 changes: 250 additions & 0 deletions src/azure_c_shared_utility/aziotsharedutil.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
LIBRARY aziotsharedutil
EXPORTS
x509_schannel_create
x509_schannel_destroy
x509_schannel_get_certificate_context
tlsio_schannel_create
tlsio_schannel_destroy
tlsio_schannel_open
tlsio_schannel_close
tlsio_schannel_send
tlsio_schannel_dowork
tlsio_schannel_setoption
tlsio_schannel_get_interface_description
HTTPAPI_RESULTStringStorage
HTTPAPI_RESULTStrings
HTTPAPI_RESULT_FromString
HTTPAPI_Init
HTTPAPI_Deinit
HTTPAPI_CreateConnection
HTTPAPI_CloseConnection
HTTPAPI_ExecuteRequest
HTTPAPI_SetOption
HTTPAPI_CloneOption
HTTP_HEADERS_RESULTStringStorage
HTTP_HEADERS_RESULTStrings
HTTP_HEADERS_RESULT_FromString
HTTPHeaders_Alloc
HTTPHeaders_Free
HTTPHeaders_AddHeaderNameValuePair
HTTPHeaders_ReplaceHeaderNameValuePair
HTTPHeaders_FindHeaderValue
HTTPHeaders_GetHeaderCount
HTTPHeaders_GetHeader
HTTPHeaders_Clone
HTTPAPIEX_SAS_Create
HTTPAPIEX_SAS_Destroy
HTTPAPIEX_SAS_ExecuteRequest
HTTPAPIEX_RESULTStringStorage
HTTPAPIEX_RESULTStrings
HTTPAPIEX_RESULT_FromString
HTTPAPIEX_Create
HTTPAPIEX_ExecuteRequest
HTTPAPIEX_Destroy
HTTPAPIEX_SetOption
UNIQUEID_RESULTStringStorage
UNIQUEID_RESULTStrings
UNIQUEID_RESULT_FromString
UniqueId_Generate
THREADAPI_RESULTStringStorage
THREADAPI_RESULTStrings
THREADAPI_RESULT_FromString
ThreadAPI_Create
ThreadAPI_Join
ThreadAPI_Exit
ThreadAPI_Sleep
tickcounter_create
tickcounter_destroy
tickcounter_get_current_ms
socketio_create
socketio_destroy
socketio_open
socketio_close
socketio_send
socketio_dowork
socketio_setoption
socketio_get_interface_description
platform_init
platform_deinit
platform_get_default_tlsio
LOCK_RESULTStringStorage
LOCK_RESULTStrings
LOCK_RESULT_FromString
Lock_Init
Lock
Unlock
Lock_Deinit
COND_RESULTStringStorage
COND_RESULTStrings
COND_RESULT_FromString
Condition_Init
Condition_Post
Condition_Wait
Condition_Deinit
get_time
get_gmtime
get_mktime
get_ctime
get_difftime
OptionHandler_Create
OptionHandler_AddOption
OptionHandler_FeedOptions
OptionHandler_Destroy
global_log_function
xlogging_set_log_function
xlogging_get_log_function
xlogging_dump_buffer
VECTOR_create
VECTOR_destroy
VECTOR_push_back
VECTOR_erase
VECTOR_clear
VECTOR_element
VECTOR_front
VECTOR_back
VECTOR_find_if
VECTOR_size
USHAReset
USHAInput
USHAFinalBits
USHAResult
USHABlockSize
USHAHashSize
USHAHashSizeBits
URL_EncodeString
URL_Encode
STRING_TOKENIZER_create
STRING_TOKENIZER_create_from_char
STRING_TOKENIZER_get_next_token
STRING_TOKENIZER_destroy
STRING_new
STRING_clone
STRING_construct
STRING_construct_n
STRING_new_with_memory
STRING_new_quoted
STRING_new_JSON
STRING_from_byte_array
STRING_delete
STRING_concat
STRING_concat_with_STRING
STRING_quote
STRING_copy
STRING_copy_n
STRING_c_str
STRING_empty
STRING_length
STRING_compare
STRING_construct_sprintf
STRING_sprintf
SHA384Reset
SHA384Input
SHA384FinalBits
SHA384Result
SHA512Reset
SHA512Input
SHA512FinalBits
SHA512Result
SHA224Reset
SHA224Input
SHA224FinalBits
SHA224Result
SHA256Reset
SHA256Input
SHA256FinalBits
SHA256Result
SHA1Reset
SHA1Input
SHA1FinalBits
SHA1Result
SASToken_Validate
SASToken_Create
MAP_RESULTStringStorage
MAP_RESULTStrings
MAP_RESULT_FromString
Map_Create
Map_Destroy
Map_Clone
Map_Add
Map_AddOrUpdate
Map_Delete
Map_ContainsKey
Map_ContainsValue
Map_GetValueFromKey
Map_GetInternals
Map_ToJSON
singlylinkedlist_create
singlylinkedlist_destroy
singlylinkedlist_add
singlylinkedlist_remove
singlylinkedlist_get_head_item
singlylinkedlist_get_next_item
singlylinkedlist_find
singlylinkedlist_item_get_value
xio_create
xio_destroy
xio_open
xio_close
xio_send
xio_dowork
xio_setoption
xio_retrieveoptions
HMACSHA256_ComputeHash
hmac
hmacReset
hmacInput
hmacFinalBits
hmacResult
gballoc_init
gballoc_deinit
gballoc_malloc
gballoc_calloc
gballoc_realloc
gballoc_free
gballoc_getMaximumMemoryUsed
gballoc_getCurrentMemoryUsed
DList_InitializeListHead
DList_IsListEmpty
DList_InsertTailList
DList_InsertHeadList
DList_AppendTailList
DList_RemoveEntryList
DList_RemoveHeadList
CONSTMAP_RESULTStringStorage
CONSTMAP_RESULTStrings
CONSTMAP_RESULT_FromString
ConstMap_Create
ConstMap_Destroy
ConstMap_Clone
ConstMap_CloneWriteable
ConstMap_ContainsKey
ConstMap_ContainsValue
ConstMap_GetValue
ConstMap_GetInternals
mallocAndStrcpy_s
unsignedIntToString
size_tToString
consolelogger_log
CONSTBUFFER_Create
CONSTBUFFER_CreateFromBuffer
CONSTBUFFER_Clone
CONSTBUFFER_GetContent
CONSTBUFFER_Destroy
connectionstringparser_parse
BUFFER_new
BUFFER_create
BUFFER_delete
BUFFER_pre_build
BUFFER_build
BUFFER_unbuild
BUFFER_enlarge
BUFFER_content
BUFFER_size
BUFFER_append
BUFFER_prepend
BUFFER_u_char
BUFFER_length
BUFFER_clone
Base64_Encode
Base64_Encode_Bytes
Base64_Decoder
133 changes: 133 additions & 0 deletions src/azure_c_shared_utility/connection_string_parser.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#include "azure_c_shared_utility/connection_string_parser.h"
#include "azure_c_shared_utility/map.h"
#include "azure_c_shared_utility/strings.h"
#include "azure_c_shared_utility/string_tokenizer.h"
#include <stdbool.h>
#include "azure_c_shared_utility/xlogging.h"

/* Codes_SRS_CONNECTIONSTRINGPARSER_01_001: [connectionstringparser_parse shall parse all key value pairs from the connection_string passed in as argument and return a new map that holds the key/value pairs.] */
MAP_HANDLE connectionstringparser_parse(STRING_HANDLE connection_string)
{
MAP_HANDLE result;

if (connection_string == NULL)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_002: [If connection_string is NULL then connectionstringparser_parse shall fail and return NULL.] */
result = NULL;
LogError("NULL connection string passed to tokenizer.\r\n");
}
else
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_003: [connectionstringparser_parse shall create a STRING tokenizer to be used for parsing the connection string, by calling STRING_TOKENIZER_create.] */
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_004: [connectionstringparser_parse shall start scanning at the beginning of the connection string.] */
STRING_TOKENIZER_HANDLE tokenizer = STRING_TOKENIZER_create(connection_string);
if (tokenizer == NULL)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_015: [If STRING_TOKENIZER_create fails, connectionstringparser_parse shall fail and return NULL.] */
result = NULL;
LogError("Error creating STRING tokenizer.\r\n");
}
else
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_016: [2 STRINGs shall be allocated in order to hold the to be parsed key and value tokens.] */
STRING_HANDLE token_key_string = STRING_new();
if (token_key_string == NULL)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_017: [If allocating the STRINGs fails connectionstringparser_parse shall fail and return NULL.] */
result = NULL;
LogError("Error creating key token STRING.\r\n");
}
else
{
STRING_HANDLE token_value_string = STRING_new();
if (token_value_string == NULL)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_017: [If allocating the STRINGs fails connectionstringparser_parse shall fail and return NULL.] */
result = NULL;
LogError("Error creating value token STRING.\r\n");
}
else
{
result = Map_Create(NULL);
if (result == NULL)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_018: [If creating the result map fails, then connectionstringparser_parse shall return NULL.] */
LogError("Error creating Map\r\n");
}
else
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_005: [The following actions shall be repeated until parsing is complete:] */
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_006: [connectionstringparser_parse shall find a token (the key of the key/value pair) delimited by the `=` character, by calling STRING_TOKENIZER_get_next_token.] */
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_007: [If STRING_TOKENIZER_get_next_token fails, parsing shall be considered complete.] */
while (STRING_TOKENIZER_get_next_token(tokenizer, token_key_string, "=") == 0)
{
bool is_error = false;

/* Codes_SRS_CONNECTIONSTRINGPARSER_01_008: [connectionstringparser_parse shall find a token (the value of the key/value pair) delimited by the `;` character, by calling STRING_TOKENIZER_get_next_token.] */
if (STRING_TOKENIZER_get_next_token(tokenizer, token_value_string, ";") != 0)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_009: [If STRING_TOKENIZER_get_next_token fails, connectionstringparser_parse shall fail and return NULL (freeing the allocated result map).] */
is_error = true;
LogError("Error reading value token from the connection string.\r\n");
}
else
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_011: [The C strings for the key and value shall be extracted from the previously parsed STRINGs by using STRING_c_str.] */
const char* token = STRING_c_str(token_key_string);
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_013: [If STRING_c_str fails then connectionstringparser_parse shall fail and return NULL (freeing the allocated result map).] */
if ((token == NULL) ||
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_019: [If the key length is zero then connectionstringparser_parse shall fail and return NULL (freeing the allocated result map).] */
(strlen(token) == 0))
{
is_error = true;
LogError("The key token is NULL or empty.\r\n");
}
else
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_011: [The C strings for the key and value shall be extracted from the previously parsed STRINGs by using STRING_c_str.] */
const char* value = STRING_c_str(token_value_string);
if (value == NULL)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_013: [If STRING_c_str fails then connectionstringparser_parse shall fail and return NULL (freeing the allocated result map).] */
is_error = true;
LogError("Could not get C string for value token.\r\n");
}
else
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_010: [The key and value shall be added to the result map by using Map_Add.] */
if (Map_Add(result, token, value) != 0)
{
/* Codes_SRS_CONNECTIONSTRINGPARSER_01_012: [If Map_Add fails connectionstringparser_parse shall fail and return NULL (freeing the allocated result map).] */
is_error = true;
LogError("Could not add the key/value pair to the result map.\r\n");
}
}
}
}

if (is_error)
{
LogError("Error parsing connection string.\r\n");
Map_Destroy(result);
result = NULL;
break;
}
}
}

STRING_delete(token_value_string);
}

STRING_delete(token_key_string);
}

/* Codes_SRS_CONNECTIONSTRINGPARSER_01_014: [After the parsing is complete the previously allocated STRINGs and STRING tokenizer shall be freed by calling STRING_TOKENIZER_destroy.] */
STRING_TOKENIZER_destroy(tokenizer);
}
}

return result;
}
Loading

0 comments on commit 6e61fb9

Please sign in to comment.