mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-18 09:25:49 +00:00
RTSP code style cleanup - comments
This commit is contained in:
parent
21ec3f0270
commit
baa8106dd8
@ -18,48 +18,46 @@
|
||||
#define FLAG_ALLOCATED_OPTION_ITEMS 0x4
|
||||
#define FLAG_ALLOCATED_PAYLOAD 0x8
|
||||
|
||||
/* Linked List to store the options */
|
||||
typedef struct _OPTION_ITEM {
|
||||
char flags;
|
||||
char *option;
|
||||
char *content;
|
||||
char* option;
|
||||
char* content;
|
||||
struct _OPTION_ITEM *next;
|
||||
} OPTION_ITEM, *POPTION_ITEM;
|
||||
|
||||
/* RTSP Message *
|
||||
* In this implementation, a flag indicates the message type:
|
||||
* TYPE_REQUEST = 0
|
||||
* TYPE_RESPONSE = 1 */
|
||||
// In this implementation, a flag indicates the message type:
|
||||
// TYPE_REQUEST = 0
|
||||
// TYPE_RESPONSE = 1
|
||||
typedef struct _RTSP_MESSAGE {
|
||||
char type;
|
||||
char flags;
|
||||
int sequenceNumber;
|
||||
char *protocol;
|
||||
char* protocol;
|
||||
POPTION_ITEM options;
|
||||
char *payload;
|
||||
char* payload;
|
||||
int payloadLength;
|
||||
|
||||
char* messageBuffer;
|
||||
|
||||
union {
|
||||
struct {
|
||||
/* Request fields */
|
||||
char *command;
|
||||
char *target;
|
||||
// Request fields
|
||||
char* command;
|
||||
char* target;
|
||||
} request;
|
||||
struct {
|
||||
/* Response fields */
|
||||
char *statusString;
|
||||
// Response fields
|
||||
char* statusString;
|
||||
int statusCode;
|
||||
} response;
|
||||
} message;
|
||||
} RTSP_MESSAGE, *PRTSP_MESSAGE;
|
||||
|
||||
int parseRtspMessage(PRTSP_MESSAGE msg, char *rtspMessage, int length);
|
||||
int parseRtspMessage(PRTSP_MESSAGE msg, char* rtspMessage, int length);
|
||||
void freeMessage(PRTSP_MESSAGE msg);
|
||||
void createRtspResponse(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char *protocol, int statusCode, char *statusString, int sequenceNumber, POPTION_ITEM optionsHead, char *payload, int payloadLength);
|
||||
void createRtspRequest(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char *command, char *target, char *protocol, int sequenceNumber, POPTION_ITEM optionsHead, char *payload, int payloadLength);
|
||||
char *getOptionContent(POPTION_ITEM optionsHead, char *option);
|
||||
void insertOption(POPTION_ITEM *optionsHead, POPTION_ITEM opt);
|
||||
void createRtspResponse(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char* protocol, int statusCode, char* statusString, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength);
|
||||
void createRtspRequest(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char* command, char* target, char* protocol, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength);
|
||||
char* getOptionContent(POPTION_ITEM optionsHead, char* option);
|
||||
void insertOption(POPTION_ITEM* optionsHead, POPTION_ITEM opt);
|
||||
void freeOptionList(POPTION_ITEM optionsHead);
|
||||
char *serializeRtspMessage(PRTSP_MESSAGE msg, int *serializedLength);
|
||||
char* serializeRtspMessage(PRTSP_MESSAGE msg, int *serializedLength);
|
@ -11,7 +11,7 @@ static int hasSessionId;
|
||||
static char responseBuffer[RTSP_MAX_RESP_SIZE];
|
||||
static int rtspClientVersion;
|
||||
|
||||
/* Create RTSP Option */
|
||||
// Create RTSP Option
|
||||
static POPTION_ITEM createOptionItem(char* option, char* content)
|
||||
{
|
||||
POPTION_ITEM item = malloc(sizeof(*item));
|
||||
@ -42,7 +42,7 @@ static POPTION_ITEM createOptionItem(char* option, char* content)
|
||||
return item;
|
||||
}
|
||||
|
||||
/* Add an option to the RTSP Message */
|
||||
// Add an option to the RTSP Message
|
||||
static int addOption(PRTSP_MESSAGE msg, char* option, char* content)
|
||||
{
|
||||
POPTION_ITEM item = createOptionItem(option, content);
|
||||
@ -56,7 +56,7 @@ static int addOption(PRTSP_MESSAGE msg, char* option, char* content)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Create an RTSP Request */
|
||||
// Create an RTSP Request
|
||||
static int initializeRtspRequest(PRTSP_MESSAGE msg, char* command, char* target)
|
||||
{
|
||||
char sequenceNumberStr[16];
|
||||
@ -77,7 +77,7 @@ static int initializeRtspRequest(PRTSP_MESSAGE msg, char* command, char* target)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Send RTSP message and get response */
|
||||
// Send RTSP message and get response
|
||||
static int transactRtspMessage(PRTSP_MESSAGE request, PRTSP_MESSAGE response, int* error) {
|
||||
SOCK_RET err;
|
||||
int ret = 0;
|
||||
@ -144,7 +144,7 @@ Exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Terminate the RTSP Handshake process by closing the socket */
|
||||
// Terminate the RTSP Handshake process by closing the socket
|
||||
void terminateRtspHandshake(void) {
|
||||
if (sock != INVALID_SOCKET) {
|
||||
closesocket(sock);
|
||||
@ -152,7 +152,7 @@ void terminateRtspHandshake(void) {
|
||||
}
|
||||
}
|
||||
|
||||
/* Send RTSP OPTIONS request */
|
||||
// Send RTSP OPTIONS request
|
||||
static int requestOptions(PRTSP_MESSAGE response, int* error) {
|
||||
RTSP_MESSAGE request;
|
||||
int ret;
|
||||
@ -168,7 +168,7 @@ static int requestOptions(PRTSP_MESSAGE response, int* error) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Send RTSP DESCRIBE request */
|
||||
// Send RTSP DESCRIBE request
|
||||
static int requestDescribe(PRTSP_MESSAGE response, int* error) {
|
||||
RTSP_MESSAGE request;
|
||||
int ret;
|
||||
@ -192,7 +192,7 @@ static int requestDescribe(PRTSP_MESSAGE response, int* error) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Send RTSP SETUP request */
|
||||
// Send RTSP SETUP request
|
||||
static int setupStream(PRTSP_MESSAGE response, char* target, int* error) {
|
||||
RTSP_MESSAGE request;
|
||||
int ret;
|
||||
@ -224,7 +224,7 @@ static int setupStream(PRTSP_MESSAGE response, char* target, int* error) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Send RTSP PLAY request*/
|
||||
// Send RTSP PLAY request
|
||||
static int playStream(PRTSP_MESSAGE response, char* target, int* error) {
|
||||
RTSP_MESSAGE request;
|
||||
int ret;
|
||||
@ -245,7 +245,7 @@ static int playStream(PRTSP_MESSAGE response, char* target, int* error) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Send RTSP ANNOUNCE message */
|
||||
// Send RTSP ANNOUNCE message
|
||||
static int sendVideoAnnounce(PRTSP_MESSAGE response, int* error) {
|
||||
RTSP_MESSAGE request;
|
||||
int ret;
|
||||
@ -284,7 +284,7 @@ static int sendVideoAnnounce(PRTSP_MESSAGE response, int* error) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Perform RTSP Handshake with the streaming server machine as part of the connection process */
|
||||
// Perform RTSP Handshake with the streaming server machine as part of the connection process
|
||||
int performRtspHandshake(void) {
|
||||
char urlAddr[URLSAFESTRING_LEN];
|
||||
|
||||
|
@ -1,8 +1,9 @@
|
||||
#include "Rtsp.h"
|
||||
|
||||
/* Check if String s begins with the given prefix */
|
||||
static int startsWith(const char *s, const char *prefix) {
|
||||
if (strncmp(s, prefix, strlen(prefix)) == 0){
|
||||
// Check if String s begins with the given prefix
|
||||
static int startsWith(const char* s, const char* prefix) {
|
||||
|
||||
if (strncmp(s, prefix, strlen(prefix)) == 0) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
@ -10,65 +11,67 @@ static int startsWith(const char *s, const char *prefix) {
|
||||
}
|
||||
}
|
||||
|
||||
/* Gets the length of the message */
|
||||
static int getMessageLength(PRTSP_MESSAGE msg){
|
||||
// Gets the length of the message
|
||||
static int getMessageLength(PRTSP_MESSAGE msg) {
|
||||
POPTION_ITEM current;
|
||||
|
||||
/* Initialize to 1 for null terminator */
|
||||
// Initialize to 1 for null terminator
|
||||
size_t count = 1;
|
||||
/* Add the length of the protocol */
|
||||
|
||||
// Add the length of the protocol
|
||||
count += strlen(msg->protocol);
|
||||
|
||||
/* Add length of request-specific strings */
|
||||
if (msg->type == TYPE_REQUEST){
|
||||
// Add length of request-specific strings
|
||||
if (msg->type == TYPE_REQUEST) {
|
||||
count += strlen(msg->message.request.command);
|
||||
count += strlen(msg->message.request.target);
|
||||
/* Add 4 for the two spaces and \r\n*/
|
||||
|
||||
// Add 4 for the two spaces and \r\n
|
||||
count += 4;
|
||||
}
|
||||
/* Add length of response-specific strings */
|
||||
// Add length of response-specific strings
|
||||
else {
|
||||
char statusCodeStr[16];
|
||||
sprintf(statusCodeStr, "%d", msg->message.response.statusCode);
|
||||
count += strlen(statusCodeStr);
|
||||
count += strlen(msg->message.response.statusString);
|
||||
/* Add 4 for two spaces and \r\n */
|
||||
// Add 4 for two spaces and \r\n
|
||||
count += 4;
|
||||
}
|
||||
/* Count the size of the options */
|
||||
// Count the size of the options
|
||||
current = msg->options;
|
||||
while (current != NULL){
|
||||
|
||||
while (current != NULL) {
|
||||
count += strlen(current->option);
|
||||
count += strlen(current->content);
|
||||
/* Add 4 because of :[space] and \r\n */
|
||||
// Add 4 because of :[space] and \r\n
|
||||
count += 4;
|
||||
current = current->next;
|
||||
}
|
||||
/* Add 2 more for extra /r/n ending */
|
||||
// Add 2 more for extra /r/n ending
|
||||
count += 2;
|
||||
|
||||
/* Add the length of the payload, if any */
|
||||
count += msg->payloadLength;
|
||||
|
||||
return (int)count;
|
||||
}
|
||||
|
||||
/* Given an RTSP message string rtspMessage, parse it into an RTSP_MESSAGE struct msg */
|
||||
int parseRtspMessage(PRTSP_MESSAGE msg, char *rtspMessage, int length) {
|
||||
char *token, *protocol, *endCheck, *target, *statusStr, *command, *sequence, flag;
|
||||
// Given an RTSP message string rtspMessage, parse it into an RTSP_MESSAGE struct msg
|
||||
int parseRtspMessage(PRTSP_MESSAGE msg, char* rtspMessage, int length) {
|
||||
char* token, *protocol, *endCheck, *target, *statusStr, *command, *sequence, flag;
|
||||
char messageEnded = 0, *payload = NULL, *opt = NULL;
|
||||
int statusCode = 0, sequenceNum, exitCode;
|
||||
POPTION_ITEM options = NULL;
|
||||
POPTION_ITEM newOpt;
|
||||
|
||||
/* Delimeter sets for strtok() */
|
||||
char *delim = " \r\n";
|
||||
char *end = "\r\n";
|
||||
char *optDelim = " :\r\n";
|
||||
// Delimeter sets for strtok()
|
||||
char* delim = " \r\n";
|
||||
char* end = "\r\n";
|
||||
char* optDelim = " :\r\n";
|
||||
char typeFlag = TOKEN_OPTION;
|
||||
|
||||
/* Put the raw message into a string we can use */
|
||||
char *messageBuffer = malloc(length + 1);
|
||||
// Put the raw message into a string we can use
|
||||
char* messageBuffer = malloc(length + 1);
|
||||
if (messageBuffer == NULL) {
|
||||
exitCode = RTSP_ERROR_NO_MEMORY;
|
||||
goto ExitFailure;
|
||||
@ -78,77 +81,74 @@ int parseRtspMessage(PRTSP_MESSAGE msg, char *rtspMessage, int length) {
|
||||
// The payload logic depends on a null-terminator at the end
|
||||
messageBuffer[length] = 0;
|
||||
|
||||
/* Get the first token of the message*/
|
||||
// Get the first token of the message
|
||||
token = strtok(messageBuffer, delim);
|
||||
if (token == NULL){
|
||||
if (token == NULL) {
|
||||
exitCode = RTSP_ERROR_MALFORMED;
|
||||
goto ExitFailure;
|
||||
}
|
||||
|
||||
/* The message is a response */
|
||||
if (startsWith(token, "RTSP")){
|
||||
// The message is a response
|
||||
if (startsWith(token, "RTSP")) {
|
||||
flag = TYPE_RESPONSE;
|
||||
/* The current token is the protocol */
|
||||
// The current token is the protocol
|
||||
protocol = token;
|
||||
|
||||
/* Get the status code */
|
||||
// Get the status code
|
||||
token = strtok(NULL, delim);
|
||||
statusCode = atoi(token);
|
||||
if (token == NULL){
|
||||
if (token == NULL) {
|
||||
exitCode = RTSP_ERROR_MALFORMED;
|
||||
goto ExitFailure;
|
||||
}
|
||||
|
||||
/* Get the status string */
|
||||
// Get the status string
|
||||
statusStr = strtok(NULL, end);
|
||||
if (statusStr == NULL){
|
||||
if (statusStr == NULL) {
|
||||
exitCode = RTSP_ERROR_MALFORMED;
|
||||
goto ExitFailure;
|
||||
}
|
||||
|
||||
/* Request fields - we don't care about them here */
|
||||
// Request fields - we don't care about them here
|
||||
target = NULL;
|
||||
command = NULL;
|
||||
}
|
||||
/* The message is a request */
|
||||
|
||||
// The message is a request
|
||||
else {
|
||||
flag = TYPE_REQUEST;
|
||||
/* The current token is the command */
|
||||
command = token;
|
||||
/* Get the target */
|
||||
target = strtok(NULL, delim);
|
||||
if (target == NULL){
|
||||
if (target == NULL) {
|
||||
exitCode = RTSP_ERROR_MALFORMED;
|
||||
goto ExitFailure;
|
||||
}
|
||||
/* Get the protocol */
|
||||
protocol = strtok(NULL, delim);
|
||||
if (protocol == NULL){
|
||||
if (protocol == NULL) {
|
||||
exitCode = RTSP_ERROR_MALFORMED;
|
||||
goto ExitFailure;
|
||||
}
|
||||
/* Response field - we don't care about it here */
|
||||
// Response field - we don't care about it here
|
||||
statusStr = NULL;
|
||||
}
|
||||
/* Check that the protocol is valid */
|
||||
if (strcmp(protocol, "RTSP/1.0")){
|
||||
if (strcmp(protocol, "RTSP/1.0")) {
|
||||
exitCode = RTSP_ERROR_MALFORMED;
|
||||
goto ExitFailure;
|
||||
}
|
||||
/* Parse remaining options */
|
||||
while (token != NULL){
|
||||
// Parse remaining options
|
||||
while (token != NULL)
|
||||
{
|
||||
token = strtok(NULL, typeFlag == TOKEN_OPTION ? optDelim : end);
|
||||
if (token != NULL){
|
||||
if (token != NULL) {
|
||||
|
||||
/* The token is an option */
|
||||
if (typeFlag == TOKEN_OPTION){
|
||||
if (typeFlag == TOKEN_OPTION) {
|
||||
opt = token;
|
||||
}
|
||||
/* The token is content */
|
||||
// The token is content
|
||||
else {
|
||||
/* Create a new node containing the option and content */
|
||||
// Create a new node containing the option and content
|
||||
newOpt = (POPTION_ITEM)malloc(sizeof(OPTION_ITEM));
|
||||
if (newOpt == NULL){
|
||||
if (newOpt == NULL) {
|
||||
freeOptionList(options);
|
||||
exitCode = RTSP_ERROR_NO_MEMORY;
|
||||
goto ExitFailure;
|
||||
@ -159,17 +159,17 @@ int parseRtspMessage(PRTSP_MESSAGE msg, char *rtspMessage, int length) {
|
||||
newOpt->next = NULL;
|
||||
insertOption(&options, newOpt);
|
||||
|
||||
/* Check if we're at the end of the message portion marked by \r\n\r\n
|
||||
* endCheck points to the remainder of messageBuffer after the token */
|
||||
// Check if we're at the end of the message portion marked by \r\n\r\n
|
||||
//endCheck points to the remainder of messageBuffer after the token
|
||||
endCheck = &token[0] + strlen(token) + 1;
|
||||
|
||||
/* See if we've hit the end of the message. The first \r is missing because it's been tokenized */
|
||||
if (startsWith(endCheck, "\n\r\n")){
|
||||
// See if we've hit the end of the message. The first \r is missing because it's been tokenized
|
||||
if (startsWith(endCheck, "\n\r\n")) {
|
||||
|
||||
/* We've encountered the end of the message - mark it thus */
|
||||
// We've encountered the end of the message - mark it thus
|
||||
messageEnded = 1;
|
||||
|
||||
/* The payload is the remainder of messageBuffer. If none, then payload = null */
|
||||
// The payload is the remainder of messageBuffer. If none, then payload = null
|
||||
if (endCheck[3] != '\0')
|
||||
payload = &endCheck[3];
|
||||
|
||||
@ -179,13 +179,13 @@ int parseRtspMessage(PRTSP_MESSAGE msg, char *rtspMessage, int length) {
|
||||
}
|
||||
typeFlag ^= 1; // flip the flag
|
||||
}
|
||||
/* If we never encountered the double CRLF, then the message is malformed! */
|
||||
if (!messageEnded){
|
||||
// If we never encountered the double CRLF, then the message is malformed!
|
||||
if (!messageEnded) {
|
||||
exitCode = RTSP_ERROR_MALFORMED;
|
||||
goto ExitFailure;
|
||||
}
|
||||
|
||||
/* Get sequence number as an integer */
|
||||
// Get sequence number as an integer
|
||||
sequence = getOptionContent(options, "CSeq");
|
||||
if (sequence != NULL) {
|
||||
sequenceNum = atoi(sequence);
|
||||
@ -193,8 +193,8 @@ int parseRtspMessage(PRTSP_MESSAGE msg, char *rtspMessage, int length) {
|
||||
else {
|
||||
sequenceNum = SEQ_INVALID;
|
||||
}
|
||||
/* Package the new parsed message into the struct */
|
||||
if (flag == TYPE_REQUEST){
|
||||
// Package the new parsed message into the struct
|
||||
if (flag == TYPE_REQUEST) {
|
||||
createRtspRequest(msg, messageBuffer, FLAG_ALLOCATED_MESSAGE_BUFFER | FLAG_ALLOCATED_OPTION_ITEMS, command, target,
|
||||
protocol, sequenceNum, options, payload, payload ? length - (int)(messageBuffer - payload) : 0);
|
||||
}
|
||||
@ -204,7 +204,6 @@ int parseRtspMessage(PRTSP_MESSAGE msg, char *rtspMessage, int length) {
|
||||
}
|
||||
return RTSP_ERROR_SUCCESS;
|
||||
|
||||
/* Cleanup in failure condition */
|
||||
ExitFailure:
|
||||
if (options) {
|
||||
free(options);
|
||||
@ -215,9 +214,9 @@ ExitFailure:
|
||||
return exitCode;
|
||||
}
|
||||
|
||||
/* Create new RTSP message struct with response data */
|
||||
void createRtspResponse(PRTSP_MESSAGE msg, char *message, int flags, char *protocol,
|
||||
int statusCode, char *statusString, int sequenceNumber, POPTION_ITEM optionsHead, char *payload, int payloadLength) {
|
||||
// Create new RTSP message struct with response data
|
||||
void createRtspResponse(PRTSP_MESSAGE msg, char* message, int flags, char* protocol,
|
||||
int statusCode, char* statusString, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength) {
|
||||
msg->type = TYPE_RESPONSE;
|
||||
msg->flags = flags;
|
||||
msg->messageBuffer = message;
|
||||
@ -230,9 +229,9 @@ void createRtspResponse(PRTSP_MESSAGE msg, char *message, int flags, char *proto
|
||||
msg->message.response.statusCode = statusCode;
|
||||
}
|
||||
|
||||
/* Create new RTSP message struct with request data */
|
||||
void createRtspRequest(PRTSP_MESSAGE msg, char *message, int flags,
|
||||
char *command, char *target, char *protocol, int sequenceNumber, POPTION_ITEM optionsHead, char *payload, int payloadLength) {
|
||||
// Create new RTSP message struct with request data
|
||||
void createRtspRequest(PRTSP_MESSAGE msg, char* message, int flags,
|
||||
char* command, char* target, char* protocol, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength) {
|
||||
msg->type = TYPE_REQUEST;
|
||||
msg->flags = flags;
|
||||
msg->protocol = protocol;
|
||||
@ -245,38 +244,39 @@ void createRtspRequest(PRTSP_MESSAGE msg, char *message, int flags,
|
||||
msg->message.request.target = target;
|
||||
}
|
||||
|
||||
/* Retrieves option content from the linked list given the option title */
|
||||
char *getOptionContent(POPTION_ITEM optionsHead, char *option){
|
||||
// Retrieves option content from the linked list given the option title
|
||||
char* getOptionContent(POPTION_ITEM optionsHead, char* option) {
|
||||
OPTION_ITEM *current = optionsHead;
|
||||
while (current != NULL){
|
||||
/* Check if current node is what we're looking for */
|
||||
if (!strcmp(current->option, option)){
|
||||
while (current != NULL) {
|
||||
// Check if current node is what we're looking for
|
||||
if (!strcmp(current->option, option)) {
|
||||
return current->content;
|
||||
}
|
||||
current = current->next;
|
||||
}
|
||||
/* Not found */
|
||||
// Not found
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Adds new option opt to the struct's option list */
|
||||
void insertOption(POPTION_ITEM *optionsHead, POPTION_ITEM opt){
|
||||
// Adds new option opt to the struct's option list
|
||||
void insertOption(POPTION_ITEM *optionsHead, POPTION_ITEM opt) {
|
||||
OPTION_ITEM *current = *optionsHead;
|
||||
opt->next = NULL;
|
||||
|
||||
/* Empty options list */
|
||||
if (*optionsHead == NULL){
|
||||
// Empty options list
|
||||
if (*optionsHead == NULL) {
|
||||
*optionsHead = opt;
|
||||
return;
|
||||
}
|
||||
/* Traverse the list and insert the new option at the end */
|
||||
while (current != NULL){
|
||||
/* Check for duplicate option; if so, replace the option currently there */
|
||||
if (!strcmp(current->option, opt->option)){
|
||||
|
||||
// Traverse the list and insert the new option at the end
|
||||
while (current != NULL) {
|
||||
// Check for duplicate option; if so, replace the option currently there
|
||||
if (!strcmp(current->option, opt->option)) {
|
||||
current->content = opt->content;
|
||||
return;
|
||||
}
|
||||
if (current->next == NULL){
|
||||
if (current->next == NULL) {
|
||||
current->next = opt;
|
||||
return;
|
||||
}
|
||||
@ -284,14 +284,14 @@ void insertOption(POPTION_ITEM *optionsHead, POPTION_ITEM opt){
|
||||
}
|
||||
}
|
||||
|
||||
/* Free every node in the message's option list */
|
||||
void freeOptionList(POPTION_ITEM optionsHead){
|
||||
// Free every node in the message's option list
|
||||
void freeOptionList(POPTION_ITEM optionsHead) {
|
||||
POPTION_ITEM current = optionsHead;
|
||||
POPTION_ITEM temp;
|
||||
while (current != NULL){
|
||||
while (current != NULL) {
|
||||
temp = current;
|
||||
current = current->next;
|
||||
if (temp->flags & FLAG_ALLOCATED_OPTION_FIELDS){
|
||||
if (temp->flags & FLAG_ALLOCATED_OPTION_FIELDS) {
|
||||
free(temp->option);
|
||||
free(temp->content);
|
||||
}
|
||||
@ -299,10 +299,10 @@ void freeOptionList(POPTION_ITEM optionsHead){
|
||||
}
|
||||
}
|
||||
|
||||
/* Serialize the message struct into a string containing the RTSP message */
|
||||
char *serializeRtspMessage(PRTSP_MESSAGE msg, int *serializedLength){
|
||||
// Serialize the message struct into a string containing the RTSP message
|
||||
char* serializeRtspMessage(PRTSP_MESSAGE msg, int *serializedLength) {
|
||||
int size = getMessageLength(msg);
|
||||
char *serializedMessage;
|
||||
char* serializedMessage;
|
||||
POPTION_ITEM current = msg->options;
|
||||
char statusCodeStr[16];
|
||||
|
||||
@ -311,41 +311,41 @@ char *serializeRtspMessage(PRTSP_MESSAGE msg, int *serializedLength){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (msg->type == TYPE_REQUEST){
|
||||
/* command [space] */
|
||||
if (msg->type == TYPE_REQUEST) {
|
||||
// command [space]
|
||||
strcpy(serializedMessage, msg->message.request.command);
|
||||
strcat(serializedMessage, " ");
|
||||
/* target [space] */
|
||||
// target [space]
|
||||
strcat(serializedMessage, msg->message.request.target);
|
||||
strcat(serializedMessage, " ");
|
||||
/* protocol \r\n */
|
||||
// protocol \r\n
|
||||
strcat(serializedMessage, msg->protocol);
|
||||
strcat(serializedMessage, "\r\n");
|
||||
}
|
||||
else {
|
||||
/* protocol [space] */
|
||||
// protocol [space]
|
||||
strcpy(serializedMessage, msg->protocol);
|
||||
strcat(serializedMessage, " ");
|
||||
/* status code [space] */
|
||||
// status code [space]
|
||||
sprintf(statusCodeStr, "%d", msg->message.response.statusCode);
|
||||
strcat(serializedMessage, statusCodeStr);
|
||||
strcat(serializedMessage, " ");
|
||||
/* status str\r\n */
|
||||
// status str\r\n
|
||||
strcat(serializedMessage, msg->message.response.statusString);
|
||||
strcat(serializedMessage, "\r\n");
|
||||
}
|
||||
/* option content\r\n */
|
||||
while (current != NULL){
|
||||
// option content\r\n
|
||||
while (current != NULL) {
|
||||
strcat(serializedMessage, current->option);
|
||||
strcat(serializedMessage, ": ");
|
||||
strcat(serializedMessage, current->content);
|
||||
strcat(serializedMessage, "\r\n");
|
||||
current = current->next;
|
||||
}
|
||||
/* Final \r\n */
|
||||
// Final \r\n
|
||||
strcat(serializedMessage, "\r\n");
|
||||
|
||||
/* payload */
|
||||
// payload
|
||||
if (msg->payload != NULL) {
|
||||
int offset;
|
||||
|
||||
@ -364,19 +364,19 @@ char *serializeRtspMessage(PRTSP_MESSAGE msg, int *serializedLength){
|
||||
return serializedMessage;
|
||||
}
|
||||
|
||||
/* Free everything in a msg struct */
|
||||
void freeMessage(PRTSP_MESSAGE msg){
|
||||
/* If we've allocated the message buffer */
|
||||
if (msg->flags & FLAG_ALLOCATED_MESSAGE_BUFFER){
|
||||
// Free everything in a msg struct
|
||||
void freeMessage(PRTSP_MESSAGE msg) {
|
||||
// If we've allocated the message buffer
|
||||
if (msg->flags & FLAG_ALLOCATED_MESSAGE_BUFFER) {
|
||||
free(msg->messageBuffer);
|
||||
}
|
||||
|
||||
/* If we've allocated any option items */
|
||||
if (msg->flags & FLAG_ALLOCATED_OPTION_ITEMS){
|
||||
// If we've allocated any option items
|
||||
if (msg->flags & FLAG_ALLOCATED_OPTION_ITEMS) {
|
||||
freeOptionList(msg->options);
|
||||
}
|
||||
|
||||
/* If we've allocated the payload */
|
||||
// If we've allocated the payload
|
||||
if (msg->flags & FLAG_ALLOCATED_PAYLOAD) {
|
||||
free(msg->payload);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user