diff --git a/limelight-common/Rtsp.h b/limelight-common/Rtsp.h index 6016792..1b7364d 100644 --- a/limelight-common/Rtsp.h +++ b/limelight-common/Rtsp.h @@ -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); \ No newline at end of file +char* serializeRtspMessage(PRTSP_MESSAGE msg, int *serializedLength); \ No newline at end of file diff --git a/limelight-common/RtspConnection.c b/limelight-common/RtspConnection.c index 8017308..12732f5 100644 --- a/limelight-common/RtspConnection.c +++ b/limelight-common/RtspConnection.c @@ -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,16 +284,16 @@ 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]; - + // Initialize global state addrToUrlSafeString(&RemoteAddr, urlAddr); sprintf(rtspTargetUrl, "rtsp://%s", urlAddr); currentSeqNumber = 1; hasSessionId = 0; - + if (ServerMajorVersion == 3) { rtspClientVersion = 10; } diff --git a/limelight-common/RtspParser.c b/limelight-common/RtspParser.c index 2e8e8ec..7b4efc1 100644 --- a/limelight-common/RtspParser.c +++ b/limelight-common/RtspParser.c @@ -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); }