コード例 #1
0
ファイル: AtxHttp.c プロジェクト: axiomatic-systems/Atomix
/*----------------------------------------------------------------------
|    ATX_HttpMessage_GetBody
+---------------------------------------------------------------------*/
ATX_Result
ATX_HttpMessage_GetBody(const ATX_HttpMessage* self,
                        ATX_InputStream*       stream,
                        ATX_Size*              content_length)
{
    /* return a reference to the stream */
    if (stream) {
        stream = self->body;
        ATX_REFERENCE_OBJECT(stream);
    }

    /* return the content length */
    if (content_length) {
        const ATX_String* length_string = 
            ATX_HttpMessage_GetHeader(self, ATX_HTTP_HEADER_CONTENT_LENGTH);
        if (length_string && self->body) {
            int length = 0;
            if (ATX_SUCCEEDED(ATX_String_ToInteger(length_string, &length, ATX_TRUE))) {
                *content_length = (ATX_Size)length;
            }
        } else {
            *content_length = 0;
        }
    }

    return ATX_SUCCESS;
}
コード例 #2
0
ファイル: BltWaveParser.c プロジェクト: MattLeMay/Bluetune
/*----------------------------------------------------------------------
|   WaveParserOutput_GetStream
+---------------------------------------------------------------------*/
BLT_METHOD
WaveParserOutput_GetStream(BLT_InputStreamProvider* _self,
                           ATX_InputStream**        stream)
{
    WaveParser* self = ATX_SELF_M(output, WaveParser, BLT_InputStreamProvider);

    *stream = self->output.stream;
    ATX_REFERENCE_OBJECT(*stream);

    return BLT_SUCCESS;
}
コード例 #3
0
/*----------------------------------------------------------------------
|    WaveFormatterOutput_SetStream
+---------------------------------------------------------------------*/
BLT_METHOD
WaveFormatterOutput_SetStream(BLT_OutputStreamUser* _self,
                              ATX_OutputStream*     stream)
{
    WaveFormatter* self = ATX_SELF_M(output, WaveFormatter, BLT_OutputStreamUser);

    /* keep a reference to the stream */
    self->output.stream = stream;
    ATX_REFERENCE_OBJECT(stream);

    return BLT_SUCCESS;
}
コード例 #4
0
/*----------------------------------------------------------------------
|    BLT_Decoder_OutputChanged
+---------------------------------------------------------------------*/
static void
BLT_Decoder_OutputChanged(BLT_Decoder* decoder, BLT_MediaNode* node)
{
    ATX_RELEASE_OBJECT(decoder->output);

    if (node) {
        decoder->output = ATX_CAST(node, BLT_OutputNode);
        if (decoder->output) {
            ATX_REFERENCE_OBJECT(decoder->output);
        }
    } else {
        decoder->output = NULL;
    }
}
コード例 #5
0
/*----------------------------------------------------------------------
|   DcfParserOutput_GetStream
+---------------------------------------------------------------------*/
BLT_METHOD
DcfParserOutput_GetStream(BLT_InputStreamProvider* _self,
                          ATX_InputStream**        stream)
{
    DcfParserOutput* self = ATX_SELF(DcfParserOutput, BLT_InputStreamProvider);

    // copy our stream pointer
    *stream = self->stream;
    if (self->stream == NULL) return BLT_ERROR_INVALID_MEDIA_FORMAT;

    // give a reference count to the caller
    ATX_REFERENCE_OBJECT(*stream);
    
    return BLT_SUCCESS;
}
コード例 #6
0
ファイル: AtxHttp.c プロジェクト: axiomatic-systems/Atomix
/*----------------------------------------------------------------------
|    ATX_HttpMessage_SetBody
+---------------------------------------------------------------------*/
ATX_Result
ATX_HttpMessage_SetBody(ATX_HttpMessage* self,
                        ATX_InputStream* stream,
                        ATX_Size         content_length)
{
    ATX_RELEASE_OBJECT(self->body);
    self->body = stream;
    ATX_REFERENCE_OBJECT(stream);

    /* recompute the content length header */
    if (stream) {
        char length_string[32];
        ATX_Http_NumToAscii(length_string, content_length);
        ATX_HttpMessage_SetHeader(self, ATX_HTTP_HEADER_CONTENT_LENGTH, 
                                  length_string);
    }

    return ATX_SUCCESS;
}
コード例 #7
0
/*----------------------------------------------------------------------
|   FileOutput_GetStream
+---------------------------------------------------------------------*/
BLT_METHOD
FileOutput_GetStream(BLT_OutputStreamProvider* _self,
                     ATX_OutputStream**        stream,
                     const BLT_MediaType*      media_type)
{
    FileOutput* self = ATX_SELF(FileOutput, BLT_OutputStreamProvider);

    *stream = self->stream;
    ATX_REFERENCE_OBJECT(*stream);

    /* we're providing the stream, but we *receive* the type */
    if (media_type) {
        if (self->media_type->id == BLT_MEDIA_TYPE_ID_UNKNOWN) {
            BLT_MediaType_Free(self->media_type);
            BLT_MediaType_Clone(media_type, &self->media_type);
        } else if (self->media_type->id != media_type->id) {
            return BLT_ERROR_INVALID_MEDIA_TYPE;
        }
    }
    return BLT_SUCCESS;
}
コード例 #8
0
/*----------------------------------------------------------------------
|   AdtsParserInput_SetStream
+---------------------------------------------------------------------*/
BLT_METHOD
AdtsParserInput_SetStream(BLT_InputStreamUser* _self,
                          ATX_InputStream*     stream,
                          const BLT_MediaType* media_type)
{
    AdtsParserInput* self = ATX_SELF(AdtsParserInput, BLT_InputStreamUser);
	static BLT_UInt32 first_enter = 1;
	BLT_Position where;
	BLT_LargeSize stream_size;
	BLT_StreamInfo info;

	/* check media type */
    if (media_type == NULL || media_type->id != self->media_type.id) {
        return BLT_ERROR_INVALID_MEDIA_TYPE;
    }

    /* if we had a stream, release it */
    ATX_RELEASE_OBJECT(self->stream);
    
    /* keep a reference to the stream */
    self->stream = stream;
    ATX_REFERENCE_OBJECT(stream);

	AdtsParser* pParser   = ATX_SELF_M(input, AdtsParser, BLT_InputStreamUser);
	/*count file size*/
	if(first_enter){
		/* update the stream info */
		ATX_InputStream_GetSize(pParser->input.stream, &stream_size);
		info.size = stream_size;
        if (ATX_BASE(pParser, BLT_BaseMediaNode).context) {
        	info.mask = BLT_STREAM_INFO_MASK_SIZE;
            BLT_Stream_SetInfo(ATX_BASE(pParser, BLT_BaseMediaNode).context, &info);
           }
		first_enter = 0;
	}
    return BLT_SUCCESS;
}
コード例 #9
0
/*----------------------------------------------------------------------
|    WaveFormatterInputPort_GetStream
+---------------------------------------------------------------------*/
BLT_METHOD
WaveFormatterInput_GetStream(BLT_OutputStreamProvider* _self,
                             ATX_OutputStream**        stream,
                             const BLT_MediaType*      media_type)
{
    WaveFormatter* self = ATX_SELF_M(input, WaveFormatter, BLT_OutputStreamProvider);

    /* check that we have a stream */
    if (self->output.stream == NULL) return BLT_ERROR_PORT_HAS_NO_STREAM;

    /* return our output stream */
    *stream = self->output.stream;
    ATX_REFERENCE_OBJECT(*stream);

    /* we're providing the stream, but we *receive* the type */
    if (media_type) {
        if (media_type->id != BLT_MEDIA_TYPE_ID_AUDIO_PCM) {
            return BLT_ERROR_INVALID_MEDIA_TYPE;
        } else {
            /* copy the input type parameters */
            self->input.media_type = *(const BLT_PcmMediaType*)media_type;
        }
    }

    /* write a header unless the output stream already has some data */
    /* (this might be due to the fact that we're writing more than   */
    /*  one input stream into the same output stream                 */
    {
        ATX_Position where = 0;
        ATX_OutputStream_Tell(self->output.stream, &where);
        if (where == 0) { 
            WaveFormatter_WriteWavHeader(self, &self->input.media_type);
        }
    }

    return BLT_SUCCESS;
}
コード例 #10
0
ファイル: AtxHttp.c プロジェクト: axiomatic-systems/Atomix
/*----------------------------------------------------------------------
|    ATX_HttpResponse_Parse
+---------------------------------------------------------------------*/
static ATX_Result 
ATX_HttpResponse_Parse(ATX_HttpResponse* response, ATX_InputStream* stream)
{
    char        buffer[ATX_HTTP_MAX_LINE_SIZE+1];
    char*       line = buffer;
    char*       find;
    ATX_Boolean header_pending = ATX_FALSE;
    ATX_String  header_name = ATX_EMPTY_STRING;
    ATX_String  header_value = ATX_EMPTY_STRING;
    ATX_Result  result;

    /* get the first line from the stream */
    result = ATX_InputStream_ReadLine(stream, line, sizeof(buffer), NULL);
    if (ATX_FAILED(result)) return result;

    /* get the protocol */
    find = (char*)ATX_Http_FindChar(line, ' ');
    if (find == NULL) {
        return ATX_ERROR_INVALID_SYNTAX;
    }
    *find = '\0';
    ATX_String_Assign(&response->base.protocol, line);

    /* get the status code */
    line = (char*)ATX_Http_SkipWhitespace(find+1);
    find = (char*)ATX_Http_FindChar(line, ' ');
    if (find == NULL) {
        return ATX_ERROR_INVALID_SYNTAX;
    }
    *find = '\0';
    if (ATX_StringLength(line) != 3) {
        return ATX_ERROR_INVALID_SYNTAX;
    }
    {
        int i;
        response->status_code = 0;
        for (i=0; i<3; i++) {
            if (line[i] < '0' || line[i] > '9') {
                return ATX_ERROR_INVALID_SYNTAX;
            }
            response->status_code *= 10;
            response->status_code += line[i]-'0';
        }
    }

    /* the rest is the reason phrase */
    line = (char*)ATX_Http_SkipWhitespace(find+1);
    ATX_String_Assign(&response->reason_phrase, line);

    /* parse headers until an empty line or end of stream */
    do {
        /* read a line */
        result = ATX_InputStream_ReadLine(stream, line, sizeof(buffer), NULL);
        if (ATX_FAILED(result)) break;

        /* stop if line is empty */
        if (line[0] == '\0' || line[0] == '\r' || line[0] == '\n') {
            if (header_pending) {
                ATX_String_TrimWhitespace(&header_value);
                ATX_HttpMessage_SetHeader((ATX_HttpMessage*)response, 
                                          ATX_CSTR(header_name), 
                                          ATX_CSTR(header_value));
                ATX_LOG_FINE_2("ATX_HttpResponse::Parse - %s: %s",
                               ATX_CSTR(header_name),
                               ATX_CSTR(header_value));
            }
            break;
        }

        /* process the line */
        if ((line[0] == ' ' || line[0] == '\t') && header_pending) {
            /* this is a line continuation */
            ATX_String_Append(&header_value, line+1);
        } else {
            /* this is a new header */
            const char* name;
            const char* value;

            /* add the pending header to the list */
            if (header_pending) {
                ATX_String_TrimWhitespace(&header_value);
                ATX_HttpMessage_SetHeader((ATX_HttpMessage*)response, 
                                          ATX_CSTR(header_name), 
                                          ATX_CSTR(header_value));
                ATX_LOG_FINE_2("ATX_HttpResponse::Parse - %s: %s",
                               ATX_CSTR(header_name),
                               ATX_CSTR(header_value));
            }

            /* parse header name */
            name = ATX_Http_SkipWhitespace(line);
            value = ATX_Http_FindChar(name, ':');
            ATX_String_AssignN(&header_name, name, (ATX_Size)(value-name));
            value = ATX_Http_SkipWhitespace(value+1);
            ATX_String_Assign(&header_value, value);

            /* don't add the header now, it could be continued */
            header_pending = ATX_TRUE;
        }
    } while(ATX_SUCCEEDED(result));

    /* keep a reference to the stream */
    response->base.body = stream;
    ATX_REFERENCE_OBJECT(stream);

    /* cleanup */
    ATX_String_Destruct(&header_name);
    ATX_String_Destruct(&header_value);

    return ATX_SUCCESS;
}