CONSTBUFFER_HANDLE constbuffer_array_get_buffer(CONSTBUFFER_ARRAY_HANDLE constbuffer_array_handle, uint32_t buffer_index)
{
    CONSTBUFFER_HANDLE result;

    if (
        /* Codes_SRS_CONSTBUFFER_ARRAY_01_007: [ If `constbuffer_array_handle` is NULL, `constbuffer_array_get_buffer` shall fail and return NULL. ]*/
        (constbuffer_array_handle == NULL) ||
        (buffer_index >= constbuffer_array_handle->nBuffers)
        )
    {
        LogError("Invalid arguments: CONSTBUFFER_ARRAY_HANDLE constbuffer_array_handle=%p, uint32_t buffer_index=%" PRIu32,
            constbuffer_array_handle, buffer_index);
    }
    else
    {
        /* Codes_SRS_CONSTBUFFER_ARRAY_01_006: [ The returned handle shall have its reference count incremented. ]*/
        result = CONSTBUFFER_Clone(constbuffer_array_handle->buffers[buffer_index]);
        if (result == NULL)
        {
            /* Codes_SRS_CONSTBUFFER_ARRAY_01_015: [ If any error occurs, `constbuffer_array_get_buffer` shall fail and return NULL. ]*/
            LogError("Cloning CONST buffer failed");
        }
        else
        {
            /* Codes_SRS_CONSTBUFFER_ARRAY_01_005: [ On success, `constbuffer_array_get_buffer` shall return a non-NULL handle to the `buffer_index`-th const buffer in the array. ]*/
            goto all_ok;
        }
    }

    result = NULL;

all_ok:
    return result;
}
Example #2
0
CONSTBUFFER_HANDLE Message_GetContentHandle(MESSAGE_HANDLE message) 
{
	CONSTBUFFER_HANDLE result;
	if (message == NULL)
	{
		/*Codes_SRS_MESSAGE_17_006: [If message is NULL then Message_GetContentHandle shall return NULL.] */
		LogError("invalid argument, message is NULL");
		result = NULL;
	}
	else
	{
		/*Codes_SRS_MESSAGE_17_007: [Otherwise, Message_GetContentHandle shall shall clone and return the CONSTBUFFER_HANDLE representing the message content.]*/
		result = CONSTBUFFER_Clone(((MESSAGE_HANDLE_DATA*)message)->content);
	}
	return result;
}
Example #3
0
MESSAGE_HANDLE Message_Clone(MESSAGE_HANDLE message)
{
    
    if (message == NULL)
    {
        LogError("invalid arg: message is NULL");
        /*Codes_SRS_MESSAGE_02_007: [If messageHandle is NULL then Message_Clone shall return NULL.] */
    }
    else
    {
        /*Codes_SRS_MESSAGE_02_008: [Otherwise, Message_Clone shall increment the internal ref count.] */
        INC_REF(MESSAGE_HANDLE_DATA, message);
        MESSAGE_HANDLE_DATA* messageData = (MESSAGE_HANDLE_DATA*)message;
		/*Codes_SRS_MESSAGE_17_001: [Message_Clone shall clone the CONSTMAP handle.]*/
		(void)ConstMap_Clone(messageData->properties);
		/*Codes_SRS_MESSAGE_17_004: [Message_Clone shall clone the CONSTBUFFER handle]*/
		(void)CONSTBUFFER_Clone(messageData->content);
    }
    /*Codes_SRS_MESSAGE_02_010: [Message_Clone shall return messageHandle.]*/
    return message;
}
CONSTBUFFER_ARRAY_HANDLE constbuffer_array_create(const CONSTBUFFER_HANDLE* buffers, uint32_t buffer_count)
{
    CONSTBUFFER_ARRAY_HANDLE result;

    if (
        /* Codes_SRS_CONSTBUFFER_ARRAY_01_012: [ If `buffers` is NULL and `buffer_count` is not 0, `constbuffer_array_create` shall fail and return NULL. ]*/
        (buffers == NULL) && (buffer_count != 0)
        )
    {
        LogError("Invalid arguments: const CONSTBUFFER_HANDLE* buffers=%p, uint32_t buffer_count=%" PRIu32,
            buffers, buffer_count);
    }
    else
    {
        /* Codes_SRS_CONSTBUFFER_ARRAY_01_009: [ `constbuffer_array_create` shall allocate memory for a new `CONSTBUFFER_ARRAY_HANDLE` that can hold `buffer_count` buffers. ]*/
        result = REFCOUNT_TYPE_CREATE_WITH_EXTRA_SIZE(CONSTBUFFER_ARRAY_HANDLE_DATA, buffer_count * sizeof(CONSTBUFFER_HANDLE));
        if (result == NULL)
        {
            /* Codes_SRS_CONSTBUFFER_ARRAY_01_014: [ If any error occurs, `constbuffer_array_create` shall fail and return NULL. ]*/
            LogError("failure in allocating const buffer array");
        }
        else
        {
            uint32_t i;
            for (i = 0; i < buffer_count; i++)
            {
                /* Codes_SRS_CONSTBUFFER_ARRAY_01_010: [ `constbuffer_array_create` shall clone the buffers in `buffers` and store them. ]*/
                result->buffers[i] = CONSTBUFFER_Clone(buffers[i]);
                if (result->buffers[i] == NULL)
                {
                    /* Codes_SRS_CONSTBUFFER_ARRAY_01_014: [ If any error occurs, `constbuffer_array_create` shall fail and return NULL. ]*/
                    LogError("Failed cloning buffer at index %" PRIu32, i);
                    break;
                }
            }

            if (i < buffer_count)
            {
                uint32_t j;
                LogError("Failed creating const buffer array");

                for (j = 0; j < i; j++)
                {
                    CONSTBUFFER_Destroy(result->buffers[j]);
                }
            }
            else
            {
                result->nBuffers = buffer_count;

                /* Codes_SRS_CONSTBUFFER_ARRAY_01_011: [ On success `constbuffer_array_create` shall return a non-NULL handle. ]*/
                goto all_ok;
            }

            REFCOUNT_TYPE_DESTROY(CONSTBUFFER_ARRAY_HANDLE_DATA, result);
        }
    }

    result = NULL;

all_ok:
    return result;
}
CONSTBUFFER_ARRAY_HANDLE constbuffer_array_remove_front(CONSTBUFFER_ARRAY_HANDLE constbuffer_array_handle, CONSTBUFFER_HANDLE* constbuffer_handle)
{
    CONSTBUFFER_ARRAY_HANDLE result;
    if (
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_012: [ If constbuffer_array_handle is NULL then constbuffer_array_remove_front shall fail and return NULL. ]*/
        (constbuffer_array_handle == NULL) || 
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_045: [ If constbuffer_handle is NULL then constbuffer_array_remove_front shall fail and return NULL. ]*/
        (constbuffer_handle == NULL)
        )
    {
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_036: [ If there are any failures then constbuffer_array_remove_front shall fail and return NULL. ]*/
        LogError("invalid arguments CONSTBUFFER_ARRAY_HANDLE constbuffer_array_handle=%p, CONSTBUFFER_HANDLE* constbuffer_handle=%p", constbuffer_array_handle, constbuffer_handle);
    }
    else
    {
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_002: [ constbuffer_array_remove_front shall fail when called on a newly constructed CONSTBUFFER_ARRAY_HANDLE. ]*/
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_013: [ If there is no front CONSTBUFFER_HANDLE then constbuffer_array_remove_front shall fail and return NULL. ]*/
        if (constbuffer_array_handle->nBuffers == 0)
        {
            /*Codes_SRS_CONSTBUFFER_ARRAY_02_036: [ If there are any failures then constbuffer_array_remove_front shall fail and return NULL. ]*/
            LogError("cannot remove from that which does not have");
        }
        else
        {
            /*Codes_SRS_CONSTBUFFER_ARRAY_02_046: [ constbuffer_array_remove_front shall allocate memory to hold all of constbuffer_array_handle CONSTBUFFER_HANDLEs except the front one. ]*/
            result = REFCOUNT_TYPE_CREATE_WITH_EXTRA_SIZE(CONSTBUFFER_ARRAY_HANDLE_DATA, (constbuffer_array_handle->nBuffers - 1) * sizeof(CONSTBUFFER_HANDLE));
            if (result == NULL)
            {
                /*Codes_SRS_CONSTBUFFER_ARRAY_02_036: [ If there are any failures then constbuffer_array_remove_front shall fail and return NULL. ]*/
                LogError("failure in malloc");
                /*return as is*/
            }
            else
            {
                /* Codes_SRS_CONSTBUFFER_ARRAY_01_001: [ `constbuffer_array_remove_front` shall inc_ref the removed buffer. ]*/
                CONSTBUFFER_HANDLE clonedFrontBuffer = CONSTBUFFER_Clone(constbuffer_array_handle->buffers[0]);
                if (clonedFrontBuffer == NULL)
                {
                    /*Codes_SRS_CONSTBUFFER_ARRAY_02_036: [ If there are any failures then constbuffer_array_remove_front shall fail and return NULL. ]*/
                    LogError("failure in CONSTBUFFER_Clone");
                }
                else
                {
                    uint32_t i;
                    result->nBuffers = constbuffer_array_handle->nBuffers - 1;

                    /*Codes_SRS_CONSTBUFFER_ARRAY_02_047: [ constbuffer_array_remove_front shall copy all of constbuffer_array_handle CONSTBUFFER_HANDLEs except the front one. ]*/
                    /*Codes_SRS_CONSTBUFFER_ARRAY_02_048: [ constbuffer_array_remove_front shall inc_ref all the copied CONSTBUFFER_HANDLEs. ]*/
                    for (i = 1; i < constbuffer_array_handle->nBuffers; i++)
                    {
                        if ((result->buffers[i - 1] = CONSTBUFFER_Clone(constbuffer_array_handle->buffers[i])) == NULL)
                        {
                            /*Codes_SRS_CONSTBUFFER_ARRAY_02_036: [ If there are any failures then constbuffer_array_remove_front shall fail and return NULL. ]*/
                            LogError("failure in CONSTBUFFER_Clone");
                            break;
                        }
                    }

                    if (i != constbuffer_array_handle->nBuffers)
                    {
                        uint32_t j;

                        for (j = 1; j < i; j++)
                        {
                            CONSTBUFFER_Destroy(result->buffers[j - 1]);
                        }
                    }
                    else
                    {
                        /*Codes_SRS_CONSTBUFFER_ARRAY_02_049: [ constbuffer_array_remove_front shall succeed, write in constbuffer_handle the front handle and return a non-NULL value. ]*/
                        *constbuffer_handle = clonedFrontBuffer;
                        goto allOk;
                    }

                    CONSTBUFFER_Destroy(clonedFrontBuffer);
                }

                REFCOUNT_TYPE_DESTROY(CONSTBUFFER_ARRAY_HANDLE_DATA, result);
            }
        }
    }
    /*Codes_SRS_CONSTBUFFER_ARRAY_02_036: [ If there are any failures then constbuffer_array_remove_front shall fail and return NULL. ]*/
    result = NULL;
allOk:;
    return result;
}
CONSTBUFFER_ARRAY_HANDLE constbuffer_array_add_front(CONSTBUFFER_ARRAY_HANDLE constbuffer_array_handle, CONSTBUFFER_HANDLE constbuffer_handle)
{
    CONSTBUFFER_ARRAY_HANDLE result;
    if (
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_006: [ If constbuffer_array_handle is NULL then constbuffer_array_add_front shall fail and return NULL ]*/
        (constbuffer_array_handle == NULL) ||
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_007: [ If constbuffer_handle is NULL then constbuffer_array_add_front shall fail and return NULL ]*/
        (constbuffer_handle == NULL)
        )
    {
        LogError("invalid arguments CONSTBUFFER_ARRAY_HANDLE constbuffer_array_handle=%p, CONSTBUFFER_HANDLE constbuffer_handle=%p", constbuffer_array_handle, constbuffer_handle);
    }
    else
    {
        /*Codes_SRS_CONSTBUFFER_ARRAY_02_042: [ constbuffer_array_add_front shall allocate enough memory to hold all of constbuffer_array_handle existing CONSTBUFFER_HANDLE and constbuffer_handle. ]*/
        result = REFCOUNT_TYPE_CREATE_WITH_EXTRA_SIZE(CONSTBUFFER_ARRAY_HANDLE_DATA, (constbuffer_array_handle->nBuffers + 1) * sizeof(CONSTBUFFER_HANDLE));
        if (result == NULL)
        {
            /*Codes_SRS_CONSTBUFFER_ARRAY_02_011: [ If there any failures constbuffer_array_add_front shall fail and return NULL. ]*/
            LogError("failure in malloc");
            /*return as is*/
        }
        else
        {
            /*Codes_SRS_CONSTBUFFER_ARRAY_02_043: [ constbuffer_array_add_front shall copy constbuffer_handle and all of constbuffer_array_handle existing CONSTBUFFER_HANDLE. ]*/
            /*Codes_SRS_CONSTBUFFER_ARRAY_02_044: [ constbuffer_array_add_front shall inc_ref all the CONSTBUFFER_HANDLE it had copied. ]*/
            result->nBuffers = constbuffer_array_handle->nBuffers + 1;
            if ((result->buffers[0] = CONSTBUFFER_Clone(constbuffer_handle)) == NULL)
            {
                /*Codes_SRS_CONSTBUFFER_ARRAY_02_011: [ If there any failures constbuffer_array_add_front shall fail and return NULL. ]*/
                LogError("failure in CONSTBUFFER_Clone");
            }
            else
            {
                uint32_t i;
                for (i = 1; i < result->nBuffers; i++)
                {
                    result->buffers[i] = CONSTBUFFER_Clone(constbuffer_array_handle->buffers[i - 1]);
                    if (result->buffers[i] == NULL)
                    {
                        /*Codes_SRS_CONSTBUFFER_ARRAY_02_011: [ If there any failures constbuffer_array_add_front shall fail and return NULL. ]*/
                        LogError("failure in CONSTBUFFER_Clone");
                        break;
                    }
                }

                if (i != result->nBuffers)
                {
                    uint32_t j;
                    for (j = 1; j < i; j++)
                    {
                        CONSTBUFFER_Destroy(result->buffers[j]);
                    }
                }
                else
                {
                    /*Codes_SRS_CONSTBUFFER_ARRAY_02_010: [ constbuffer_array_add_front shall succeed and return a non-NULL value. ]*/
                    goto allOk;
                }
                CONSTBUFFER_Destroy(result->buffers[0]);
            }

            REFCOUNT_TYPE_DESTROY(CONSTBUFFER_ARRAY_HANDLE_DATA, result);
        }
    }
    /*Codes_SRS_CONSTBUFFER_ARRAY_02_011: [ If there any failures constbuffer_array_add_front shall fail and return NULL. ]*/
    result = NULL;
allOk:;
    return result;
}
Example #7
0
MESSAGE_HANDLE Message_CreateFromBuffer(const MESSAGE_BUFFER_CONFIG* cfg)
{
	MESSAGE_HANDLE_DATA* result;
	/*Codes_SRS_MESSAGE_17_008: [ If cfg is NULL then Message_CreateFromBuffer shall return NULL.] */
	if (cfg == NULL)
	{
		result = NULL;
		LogError("invalid parameter (NULL).");
	}
	/* Codes_SRS_MESSAGE_17_009: [If field sourceContent of cfg is NULL, then Message_CreateFromBuffer shall fail and return NULL.]*/
	else if (cfg->sourceContent == NULL)
	{
		result = NULL;
		LogError("invalid CONSTBUFFER (NULL)");
	}
	/*Codes_SRS_MESSAGE_17_010: [If field sourceProperties of cfg is NULL, then Message_CreateFromBuffer shall fail and return NULL.]*/
	else if (cfg->sourceProperties == NULL)
	{
		result = NULL;
		LogError("invalid properties (NULL)");
	}
	else
	{
		/*Codes_SRS_MESSAGE_17_011: [If Message_CreateFromBuffer encounters an error while building the internal structures of the message, then it shall return NULL.]*/
		/*Codes_SRS_MESSAGE_17_014: [On success, Message_CreateFromBuffer shall return a non-NULL handle and set the internal ref count to "1".]*/
		result = REFCOUNT_TYPE_CREATE(MESSAGE_HANDLE_DATA);
		if (result == NULL)
		{
			LogError("malloc returned NULL");
			/*return as is*/
		}
		else
		{
			/*Codes_SRS_MESSAGE_17_013: [Message_CreateFromBuffer shall clone the CONSTBUFFER sourceBuffer.]*/
			result->content = CONSTBUFFER_Clone(cfg->sourceContent);
			if (result->content == NULL)
			{
				LogError("CONSBUFFER Clone failed");
				free(result);
				result = NULL;
			}
			else
			{
				/*Codes_SRS_MESSAGE_17_012: [Message_CreateFromBuffer shall copy the sourceProperties to a readonly CONSTMAP.]*/
				result->properties = ConstMap_Create(cfg->sourceProperties);
				if (result->properties == NULL)
				{
					LogError("ConstMap_Create failed");
					CONSTBUFFER_Destroy(result->content);
					free(result);
					result = NULL;
				}
				else
				{
					/*all is fine, return as is.*/
				}
			}
		}
	}
	return (MESSAGE_HANDLE)result;
}