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 #include "Locale.hh"
00023 #include <string.h>
00024 #include <stdio.h>
00025
00026 Boolean parseRTSPRequestString(char const* reqStr,
00027 unsigned reqStrSize,
00028 char* resultCmdName,
00029 unsigned resultCmdNameMaxSize,
00030 char* resultURLPreSuffix,
00031 unsigned resultURLPreSuffixMaxSize,
00032 char* resultURLSuffix,
00033 unsigned resultURLSuffixMaxSize,
00034 char* resultCSeq,
00035 unsigned resultCSeqMaxSize) {
00036
00037
00038
00039 Boolean parseSucceeded = False;
00040 unsigned i;
00041 for (i = 0; i < resultCmdNameMaxSize-1 && i < reqStrSize; ++i) {
00042 char c = reqStr[i];
00043 if (c == ' ' || c == '\t') {
00044 parseSucceeded = True;
00045 break;
00046 }
00047
00048 resultCmdName[i] = c;
00049 }
00050 resultCmdName[i] = '\0';
00051 if (!parseSucceeded) return False;
00052
00053
00054 unsigned j = i+1;
00055 while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j;
00056 for (; (int)j < (int)(reqStrSize-8); ++j) {
00057 if ((reqStr[j] == 'r' || reqStr[j] == 'R')
00058 && (reqStr[j+1] == 't' || reqStr[j+1] == 'T')
00059 && (reqStr[j+2] == 's' || reqStr[j+2] == 'S')
00060 && (reqStr[j+3] == 'p' || reqStr[j+3] == 'P')
00061 && reqStr[j+4] == ':' && reqStr[j+5] == '/') {
00062 j += 6;
00063 if (reqStr[j] == '/') {
00064
00065 ++j;
00066 while (j < reqStrSize && reqStr[j] != '/' && reqStr[j] != ' ') ++j;
00067 } else {
00068
00069 --j;
00070 }
00071 i = j;
00072 break;
00073 }
00074 }
00075
00076
00077 parseSucceeded = False;
00078 for (unsigned k = i+1; (int)k < (int)(reqStrSize-5); ++k) {
00079 if (reqStr[k] == 'R' && reqStr[k+1] == 'T' &&
00080 reqStr[k+2] == 'S' && reqStr[k+3] == 'P' && reqStr[k+4] == '/') {
00081 while (--k >= i && reqStr[k] == ' ') {}
00082 unsigned k1 = k;
00083 while (k1 > i && reqStr[k1] != '/') --k1;
00084
00085
00086
00087 if (k - k1 + 1 > resultURLSuffixMaxSize) return False;
00088 unsigned n = 0, k2 = k1+1;
00089 while (k2 <= k) resultURLSuffix[n++] = reqStr[k2++];
00090 resultURLSuffix[n] = '\0';
00091
00092
00093 unsigned k3 = (k1 == 0) ? 0 : --k1;
00094 while (k3 > i && reqStr[k3] != '/') --k3;
00095
00096
00097
00098 if (k1 - k3 + 1 > resultURLPreSuffixMaxSize) return False;
00099 n = 0; k2 = k3+1;
00100 while (k2 <= k1) resultURLPreSuffix[n++] = reqStr[k2++];
00101 resultURLPreSuffix[n] = '\0';
00102
00103 i = k + 7;
00104 parseSucceeded = True;
00105 break;
00106 }
00107 }
00108 if (!parseSucceeded) return False;
00109
00110
00111
00112 parseSucceeded = False;
00113 for (j = i; (int)j < (int)(reqStrSize-5); ++j) {
00114 if (reqStr[j] == 'C' && reqStr[j+1] == 'S' && reqStr[j+2] == 'e' &&
00115 reqStr[j+3] == 'q' && reqStr[j+4] == ':') {
00116 j += 5;
00117 unsigned n;
00118 while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j;
00119 for (n = 0; n < resultCSeqMaxSize-1 && j < reqStrSize; ++n,++j) {
00120 char c = reqStr[j];
00121 if (c == '\r' || c == '\n') {
00122 parseSucceeded = True;
00123 break;
00124 }
00125
00126 resultCSeq[n] = c;
00127 }
00128 resultCSeq[n] = '\0';
00129 break;
00130 }
00131 }
00132 if (!parseSucceeded) return False;
00133
00134 return True;
00135 }
00136
00137 Boolean parseRangeHeader(char const* buf, double& rangeStart, double& rangeEnd) {
00138
00139 while (1) {
00140 if (*buf == '\0') return False;
00141 if (_strncasecmp(buf, "Range: ", 7) == 0) break;
00142 ++buf;
00143 }
00144
00145
00146 char const* fields = buf + 7;
00147 while (*fields == ' ') ++fields;
00148 double start, end;
00149 Locale("C", LC_NUMERIC);
00150 if (sscanf(fields, "npt = %lf - %lf", &start, &end) == 2) {
00151 rangeStart = start;
00152 rangeEnd = end;
00153 } else if (sscanf(fields, "npt = %lf -", &start) == 1) {
00154 rangeStart = start;
00155 rangeEnd = 0.0;
00156 } else {
00157 return False;
00158 }
00159
00160 return True;
00161 }