Darwin-Streaming-Server/APICommonCode/QTSSModuleUtils.h

291 lines
13 KiB
C++

/*
*
* @APPLE_LICENSE_HEADER_START@
*
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,QTSSCharArrayDeleter theDigitStrDeleter(theDigitStr);
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_LICENSE_HEADER_END@
*
*/
/*
File: QTSSModuleUtils.h
Contains: Utility routines for modules to use.
*/
#ifndef _QTSS_MODULE_UTILS_H_
#define _QTSS_MODULE_UTILS_H_
#include <stdlib.h>
#include "SafeStdLib.h"
#include "QTSS.h"
#include "StrPtrLen.h"
#include "RTPMetaInfoPacket.h"
class QTSSModuleUtils
{
public:
// compatibiltiy features for certain players
enum {
kRequiresRTPInfoSeqAndTime = 0,
kAdjustBandwidth = 1,
kDisablePauseAdjustedRTPTime= 2,
kDelayRTPStreamsUntilAfterRTSPResponse = 3,
kDisable3gppRateAdaptation =4,
kAdjust3gppTargetTime = 5,
kDisableThinning =6,
};
static void Initialize( QTSS_TextMessagesObject inMessages,
QTSS_ServerObject inServer,
QTSS_StreamRef inErrorLog);
// Read the complete contents of the file at inPath into the StrPtrLen.
// This function allocates memory for the file data.
static QTSS_Error ReadEntireFile(char* inPath, StrPtrLen* outData, QTSS_TimeVal inModDate = -1, QTSS_TimeVal* outModDate = NULL);
// If your module supports RTSP methods, call this function from your QTSS_Initialize
// role to tell the server what those methods are.
static void SetupSupportedMethods( QTSS_Object inServer,
QTSS_RTSPMethod* inMethodArray,
UInt32 inNumMethods);
// Using a message out of the text messages dictionary is a common
// way to log errors to the error log. Here is a function to
// make that process very easy.
static void LogError( QTSS_ErrorVerbosity inVerbosity,
QTSS_AttributeID inTextMessage,
UInt32 inErrNumber,
char* inArgument = NULL,
char* inArg2 = NULL);
static void LogErrorStr( QTSS_ErrorVerbosity inVerbosity, char* inMessage);
static void LogPrefErrorStr( QTSS_ErrorVerbosity inVerbosity, char* preference, char* inMessage);
// This function constructs a C-string of the full path to the file being requested.
// You may opt to append an optional suffix, or pass in NULL. You are responsible
// for disposing this memory
static char* GetFullPath( QTSS_RTSPRequestObject inRequest,
QTSS_AttributeID whichFileType,
UInt32* outLen,
StrPtrLen* suffix = NULL);
//
// This function does 2 things:
// 1. Compares the enabled fields in the field ID array with the fields in the
// x-RTP-Meta-Info header. Turns off the fields in the array that aren't in the request.
//
// 2. Appends the x-RTP-Meta-Info header to the response, using the proper
// fields from the array, as well as the IDs provided in the array
static QTSS_Error AppendRTPMetaInfoHeader( QTSS_RTSPRequestObject inRequest,
StrPtrLen* inRTPMetaInfoHeader,
RTPMetaInfoPacket::FieldID* inFieldIDArray);
// This function sends an error to the RTSP client. You must provide a
// status code for the error, and a text message ID to describe the error.
//
// It always returns QTSS_RequestFailed.
static QTSS_Error SendErrorResponse( QTSS_RTSPRequestObject inRequest,
QTSS_RTSPStatusCode inStatusCode,
QTSS_AttributeID inTextMessage,
StrPtrLen* inStringArg = NULL);
// This function sends an error to the RTSP client. You don't have to provide
// a text message ID, but instead you need to provide the error message in a
// string
//
// It always returns QTSS_RequestFailed
static QTSS_Error SendErrorResponseWithMessage( QTSS_RTSPRequestObject inRequest,
QTSS_RTSPStatusCode inStatusCode,
StrPtrLen* inErrorMessageStr);
// Sends and HTTP 1.1 error message with an error message in HTML if errorMessage != NULL.
// The session must be flagged by KillSession set to true to kill.
// Use the QTSS_RTSPStatusCodes for the inStatusCode, for now they are the same as HTTP.
//
// It always returns QTSS_RequestFailed
static QTSS_Error SendHTTPErrorResponse( QTSS_RTSPRequestObject inRequest,
QTSS_SessionStatusCode inStatusCode,
Bool16 inKillSession,
char *errorMessage);
//Modules most certainly don't NEED to use this function, but it is awfully handy
//if they want to take advantage of it. Using the SDP data provided in the iovec,
//this function sends a standard describe response.
//NOTE: THE FIRST ENTRY OF THE IOVEC MUST BE EMPTY!!!!
static void SendDescribeResponse(QTSS_RTSPRequestObject inRequest,
QTSS_ClientSessionObject inSession,
iovec* describeData,
UInt32 inNumVectors,
UInt32 inTotalLength);
// Called by SendDescribeResponse to coalesce iovec to a buffer
// Allocates memory - remember to delete it!
static char* CoalesceVectors(iovec* inVec, UInt32 inNumVectors, UInt32 inTotalLength);
//
// SEARCH FOR A SPECIFIC MODULE OBJECT
static QTSS_ModulePrefsObject GetModuleObjectByName(const StrPtrLen& inModuleName);
//
// GET MODULE PREFS OBJECT
static QTSS_ModulePrefsObject GetModulePrefsObject(QTSS_ModuleObject inModObject);
// GET MODULE ATTRIBUTES OBJECT
static QTSS_Object GetModuleAttributesObject(QTSS_ModuleObject inModObject);
//
// GET ATTRIBUTE
//
// This function retrieves an attribute
// (from any QTSS_Object, including the QTSS_ModulePrefsObject)
// with the specified name and type
// out of the specified object.
//
// Caller should pass in a buffer for ioBuffer that is large enough
// to hold the attribute value. inBufferLen should be set to the length
// of this buffer.
//
// Pass in a buffer containing a default value to use for the attribute
// in the inDefaultValue parameter. If the attribute isn't found, or is
// of the wrong type, the default value will be copied into ioBuffer.
// Also, this function adds the default value to object if it is not
// found or is of the wrong type. If no default value is provided, the
// attribute is still added but no value is assigned to it.
//
// Pass in NULL for the default value or 0 for the default value length if it is not known.
//
// This function logs an error if there was a default value provided.
static void GetAttribute(QTSS_Object inObject, char* inAttributeName, QTSS_AttrDataType inType,
void* ioBuffer, void* inDefaultValue, UInt32 inBufferLen);
static void GetIOAttribute(QTSS_Object inObject, char* inAttributeName, QTSS_AttrDataType inType,
void* ioDefaultResultBuffer, UInt32 inBufferLen);
//
// GET STRING ATTRIBUTE
//
// Does the same thing as GetAttribute, but does it for string attribute. Returns a newly
// allocated buffer with the attribute value inside it.
//
// Pass in NULL for the default value or an empty string if the default is not known.
static char* GetStringAttribute(QTSS_Object inObject, char* inAttributeName, char* inDefaultValue);
//
// GET ATTR ID
//
// Given an attribute in an object, returns its attribute ID
// or qtssIllegalAttrID if it isn't found.
static QTSS_AttributeID GetAttrID(QTSS_Object inObject, char* inAttributeName);
//
//
//
/// Get the type of request. Returns qtssActionFlagsNoFlags on failure.
// Result is a bitmap of flags
//
static QTSS_ActionFlags GetRequestActions(QTSS_RTSPRequestObject theRTSPRequest);
static char* GetLocalPath_Copy(QTSS_RTSPRequestObject theRTSPRequest);
static char* GetMoviesRootDir_Copy(QTSS_RTSPRequestObject theRTSPRequest);
static QTSS_UserProfileObject GetUserProfileObject(QTSS_RTSPRequestObject theRTSPRequest);
static QTSS_AttrRights GetRights(QTSS_UserProfileObject theUserProfileObject);
static char* GetExtendedRights(QTSS_UserProfileObject theUserProfileObject, UInt32 index);
static char* GetUserName_Copy(QTSS_UserProfileObject inUserProfile);
static char** GetGroupsArray_Copy(QTSS_UserProfileObject inUserProfile, UInt32 *outNumGroupsPtr);
static Bool16 UserInGroup(QTSS_UserProfileObject inUserProfile, char* inGroupName, UInt32 inGroupNameLen);
static void SetEnableRTSPErrorMsg(Bool16 enable) {QTSSModuleUtils::sEnableRTSPErrorMsg = enable; }
static QTSS_AttributeID CreateAttribute(QTSS_Object inObject, char* inAttributeName, QTSS_AttrDataType inType, void* inDefaultValue, UInt32 inBufferLen);
static Bool16 AddressInList(QTSS_Object inObject, QTSS_AttributeID listID, StrPtrLen *theAddressPtr);
static void SetMisingPrefLogVerbosity(QTSS_ErrorVerbosity verbosityLevel) { QTSSModuleUtils::sMissingPrefVerbosity = verbosityLevel;}
static QTSS_ErrorVerbosity GetMisingPrefLogVerbosity() { return QTSSModuleUtils::sMissingPrefVerbosity;}
static Bool16 FindStringInAttributeList(QTSS_Object inObject, QTSS_AttributeID listID, StrPtrLen *inStrPtr);
static Bool16 HavePlayerProfile(QTSS_PrefsObject inPrefObjectToCheck, QTSS_StandardRTSP_Params* inParams, UInt32 feature);
static QTSS_Error AuthorizeRequest(QTSS_RTSPRequestObject theRTSPRequest, Bool16* allowed, Bool16*haveUser,Bool16 *authContinue);
private:
//
// Used in the implementation of the above functions
static QTSS_AttributeID CheckAttributeDataType(QTSS_Object inObject, char* inAttributeName, QTSS_AttrDataType inType, void* inDefaultValue, UInt32 inBufferLen);
static QTSS_TextMessagesObject sMessages;
static QTSS_ServerObject sServer;
static QTSS_StreamRef sErrorLog;
static Bool16 sEnableRTSPErrorMsg;
static QTSS_ErrorVerbosity sMissingPrefVerbosity;
};
class IPComponentStr
{
public:
enum { kNumComponents = 4 };
StrPtrLen fAddressComponent[kNumComponents];
Bool16 fIsValid;
static IPComponentStr sLocalIPCompStr;
IPComponentStr() : fIsValid(false) {}
IPComponentStr(char *theAddress);
IPComponentStr(StrPtrLen *sourceStrPtr);
inline StrPtrLen* GetComponent(UInt16 which);
Bool16 Equal(IPComponentStr *testAddressPtr);
Bool16 Set(StrPtrLen *theAddressStrPtr);
Bool16 Valid() { return fIsValid; }
inline Bool16 IsLocal();
};
Bool16 IPComponentStr::IsLocal()
{
if (this->Equal(&sLocalIPCompStr))
return true;
return false;
}
StrPtrLen* IPComponentStr::GetComponent(UInt16 which)
{
if (which < IPComponentStr::kNumComponents)
return &fAddressComponent[which];
Assert(0);
return NULL;
}
#endif //_QTSS_MODULE_UTILS_H_