Example #1
0
void RTSPServer::RTSPClientSession
::handleCmd_DESCRIBE(char const* cseq, char const* urlSuffix,
				 char const* fullRequestStr) {
  char* sdpDescription = NULL;
  char* rtspURL = NULL;
  do {
		  if (!authenticationOK("DESCRIBE", cseq, urlSuffix, fullRequestStr))
				  break;

		// We should really check that the request contains an "Accept:" #####
		// for "application/sdp", because that's what we're sending back #####

		// Begin by looking up the "ServerMediaSession" object for the
		// specified "urlSuffix":
	  ServerMediaSession* session = fOurServer.lookupServerMediaSession(urlSuffix);
	  if (session == NULL) {
		  handleCmd_notFound(cseq);
		  break;
		}

		// Then, assemble a SDP description for this session:
	  sdpDescription = session->generateSDPDescription();
	  if (sdpDescription == NULL) {
			// This usually means that a file name that was specified for a
			// "ServerMediaSubsession" does not exist.
		  snprintf((char*)fResponseBuffer, sizeof fResponseBuffer,
				 "RTSP/1.0 404 File Not Found, Or In Incorrect Format\r\n"
				 "CSeq: %s\r\n"
				 "%s\r\n",
				 cseq,
				 dateHeader());
		 break;
		}
	  unsigned sdpDescriptionSize = strlen(sdpDescription);

		// Also, generate our RTSP URL, for the "Content-Base:" header
		// (which is necessary to ensure that the correct URL gets used in
		// subsequent "SETUP" requests).
	  rtspURL = fOurServer.rtspURL(session, fClientSocket);

	  snprintf((char*)fResponseBuffer, sizeof fResponseBuffer,
			 "RTSP/1.0 200 OK\r\nCSeq: %s\r\n"
			 "%s"
			 "Content-Base: %s/\r\n"
			 "Content-Type: application/sdp\r\n"
			 "Content-Length: %d\r\n\r\n"
			 "%s",
			 cseq,
			 dateHeader(),
			 rtspURL,
			 sdpDescriptionSize,
			 sdpDescription);
	} while (0);

  delete[] sdpDescription;
  delete[] rtspURL;
}