00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "RTSPCommon.hh"
00022
00023 Boolean parseRTSPRequestString(char const* reqStr,
00024 unsigned reqStrSize,
00025 char* resultCmdName,
00026 unsigned resultCmdNameMaxSize,
00027 char* resultURLPreSuffix,
00028 unsigned resultURLPreSuffixMaxSize,
00029 char* resultURLSuffix,
00030 unsigned resultURLSuffixMaxSize,
00031 char* resultCSeq,
00032 unsigned resultCSeqMaxSize) {
00033
00034
00035
00036 Boolean parseSucceeded = False;
00037 unsigned i;
00038 for (i = 0; i < resultCmdNameMaxSize-1 && i < reqStrSize; ++i) {
00039 char c = reqStr[i];
00040 if (c == ' ' || c == '\t') {
00041 parseSucceeded = True;
00042 break;
00043 }
00044
00045 resultCmdName[i] = c;
00046 }
00047 resultCmdName[i] = '\0';
00048 if (!parseSucceeded) return False;
00049
00050
00051 unsigned j = i+1;
00052 while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j;
00053 for (j = i+1; (int)j < (int)(reqStrSize-8); ++j) {
00054 if ((reqStr[j] == 'r' || reqStr[j] == 'R')
00055 && (reqStr[j+1] == 't' || reqStr[j+1] == 'T')
00056 && (reqStr[j+2] == 's' || reqStr[j+2] == 'S')
00057 && (reqStr[j+3] == 'p' || reqStr[j+3] == 'P')
00058 && reqStr[j+4] == ':' && reqStr[j+5] == '/') {
00059 j += 6;
00060 if (reqStr[j] == '/') {
00061
00062 ++j;
00063 while (j < reqStrSize && reqStr[j] != '/' && reqStr[j] != ' ') ++j;
00064 } else {
00065
00066 --j;
00067 }
00068 i = j;
00069 break;
00070 }
00071 }
00072
00073
00074 parseSucceeded = False;
00075 for (unsigned k = i+1; (int)k < (int)(reqStrSize-5); ++k) {
00076 if (reqStr[k] == 'R' && reqStr[k+1] == 'T' &&
00077 reqStr[k+2] == 'S' && reqStr[k+3] == 'P' && reqStr[k+4] == '/') {
00078 while (--k >= i && reqStr[k] == ' ') {}
00079 unsigned k1 = k;
00080 while (k1 > i && reqStr[k1] != '/' && reqStr[k1] != ' ') --k1;
00081
00082
00083
00084 if (k - k1 + 1 > resultURLSuffixMaxSize) return False;
00085 unsigned n = 0, k2 = k1+1;
00086 while (k2 <= k) resultURLSuffix[n++] = reqStr[k2++];
00087 resultURLSuffix[n] = '\0';
00088
00089
00090 unsigned k3 = --k1;
00091 while (k3 > i && reqStr[k3] != '/' && reqStr[k3] != ' ') --k3;
00092
00093
00094
00095 if (k1 - k3 + 1 > resultURLPreSuffixMaxSize) return False;
00096 n = 0; k2 = k3+1;
00097 while (k2 <= k1) resultURLPreSuffix[n++] = reqStr[k2++];
00098 resultURLPreSuffix[n] = '\0';
00099
00100 i = k + 7;
00101 parseSucceeded = True;
00102 break;
00103 }
00104 }
00105 if (!parseSucceeded) return False;
00106
00107
00108
00109 parseSucceeded = False;
00110 for (j = i; (int)j < (int)(reqStrSize-5); ++j) {
00111 if (reqStr[j] == 'C' && reqStr[j+1] == 'S' && reqStr[j+2] == 'e' &&
00112 reqStr[j+3] == 'q' && reqStr[j+4] == ':') {
00113 j += 5;
00114 unsigned n;
00115 while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j;
00116 for (n = 0; n < resultCSeqMaxSize-1 && j < reqStrSize; ++n,++j) {
00117 char c = reqStr[j];
00118 if (c == '\r' || c == '\n') {
00119 parseSucceeded = True;
00120 break;
00121 }
00122
00123 resultCSeq[n] = c;
00124 }
00125 resultCSeq[n] = '\0';
00126 break;
00127 }
00128 }
00129 if (!parseSucceeded) return False;
00130
00131 return True;
00132 }