405 lines
13 KiB
C++
405 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,
|
||
|
* 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: QTSS_Private.c
|
||
|
|
||
|
Contains: Code for stub library and stub callback functions.
|
||
|
|
||
|
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include "SafeStdLib.h"
|
||
|
#ifndef __Win32__
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/uio.h>
|
||
|
#endif
|
||
|
|
||
|
#include "QTSS.h"
|
||
|
#include "QTSS_Private.h"
|
||
|
|
||
|
static QTSS_CallbacksPtr sCallbacks = NULL;
|
||
|
static QTSS_StreamRef sErrorLogStream = NULL;
|
||
|
|
||
|
QTSS_Error _stublibrary_main(void* inPrivateArgs, QTSS_DispatchFuncPtr inDispatchFunc)
|
||
|
{
|
||
|
QTSS_PrivateArgsPtr theArgs = (QTSS_PrivateArgsPtr)inPrivateArgs;
|
||
|
|
||
|
// Setup
|
||
|
|
||
|
sCallbacks = theArgs->inCallbacks;
|
||
|
sErrorLogStream = theArgs->inErrorLogStream;
|
||
|
|
||
|
// Send requested information back to the server
|
||
|
|
||
|
theArgs->outStubLibraryVersion = QTSS_API_VERSION;
|
||
|
theArgs->outDispatchFunction = inDispatchFunc;
|
||
|
|
||
|
return QTSS_NoErr;
|
||
|
}
|
||
|
|
||
|
// STUB FUNCTION DEFINITIONS
|
||
|
|
||
|
void* QTSS_New(FourCharCode inMemoryIdentifier, UInt32 inSize)
|
||
|
{
|
||
|
return (void *) ((QTSS_CallbackPtrProcPtr) sCallbacks->addr [kNewCallback]) (inMemoryIdentifier, inSize);
|
||
|
}
|
||
|
|
||
|
void QTSS_Delete(void* inMemory)
|
||
|
{
|
||
|
(sCallbacks->addr [kDeleteCallback]) (inMemory);
|
||
|
}
|
||
|
|
||
|
SInt64 QTSS_Milliseconds(void)
|
||
|
{
|
||
|
SInt64 outMilliseconds = 0;
|
||
|
(sCallbacks->addr [kMillisecondsCallback]) (&outMilliseconds);
|
||
|
return outMilliseconds;
|
||
|
}
|
||
|
|
||
|
time_t QTSS_MilliSecsTo1970Secs(SInt64 inQTSS_MilliSeconds)
|
||
|
{
|
||
|
time_t outSeconds = 0;
|
||
|
(sCallbacks->addr [kConvertToUnixTimeCallback]) (&inQTSS_MilliSeconds, &outSeconds);
|
||
|
return outSeconds;
|
||
|
}
|
||
|
|
||
|
// STARTUP ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_AddRole(QTSS_Role inRole)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAddRoleCallback]) (inRole);
|
||
|
}
|
||
|
|
||
|
// DICTIONARY ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_CreateObjectType(QTSS_ObjectType* outType)
|
||
|
{
|
||
|
return (sCallbacks->addr [kCreateObjectTypeCallback]) (outType);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_AddAttribute(QTSS_ObjectType inType, const char* inTag, void* inUnused)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAddAttributeCallback]) (inType, inTag, inUnused);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_AddStaticAttribute(QTSS_ObjectType inObjectType, char* inAttrName, void* inUnused, QTSS_AttrDataType inAttrDataType)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAddStaticAttributeCallback]) (inObjectType, inAttrName, inUnused, inAttrDataType);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_AddInstanceAttribute(QTSS_Object inObject, char* inAttrName, void* inUnused, QTSS_AttrDataType inAttrDataType)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAddInstanceAttributeCallback]) (inObject, inAttrName, inUnused, inAttrDataType);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_RemoveInstanceAttribute(QTSS_Object inObject, QTSS_AttributeID inID)
|
||
|
{
|
||
|
return (sCallbacks->addr [kRemoveInstanceAttributeCallback]) (inObject, inID);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_IDForAttr(QTSS_ObjectType inType, const char* inTag, QTSS_AttributeID* outID)
|
||
|
{
|
||
|
return (sCallbacks->addr [kIDForTagCallback]) (inType, inTag, outID);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetAttrInfoByIndex(QTSS_Object inObject, UInt32 inIndex, QTSS_Object* outAttrInfoObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetAttrInfoByIndexCallback]) (inObject, inIndex, outAttrInfoObject);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetAttrInfoByID(QTSS_Object inObject, QTSS_AttributeID inAttrID, QTSS_Object* outAttrInfoObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetAttrInfoByIDCallback]) (inObject, inAttrID, outAttrInfoObject);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetAttrInfoByName(QTSS_Object inObject, char* inAttrName, QTSS_Object* outAttrInfoObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetAttrInfoByNameCallback]) (inObject, inAttrName, outAttrInfoObject);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetValuePtr (QTSS_Object inDictionary, QTSS_AttributeID inID, UInt32 inIndex, void** outBuffer, UInt32* outLen)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetAttributePtrByIDCallback]) (inDictionary, inID, inIndex, outBuffer, outLen);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetValue (QTSS_Object inDictionary, QTSS_AttributeID inID, UInt32 inIndex, void* ioBuffer, UInt32* ioLen)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetAttributeByIDCallback]) (inDictionary, inID, inIndex, ioBuffer, ioLen);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetValueAsString (QTSS_Object inObject, QTSS_AttributeID inID, UInt32 inIndex, char** outString)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetValueAsStringCallback]) (inObject, inID, inIndex, outString);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_TypeStringToType(const char* inTypeString, QTSS_AttrDataType* outType)
|
||
|
{
|
||
|
return (sCallbacks->addr [kTypeStringToTypeCallback]) (inTypeString, outType);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_TypeToTypeString(const QTSS_AttrDataType inType, char** outTypeString)
|
||
|
{
|
||
|
return (sCallbacks->addr [kTypeToTypeStringCallback]) (inType, outTypeString);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_StringToValue(const char* inValueAsString, const QTSS_AttrDataType inType, void* ioBuffer, UInt32* ioBufSize)
|
||
|
{
|
||
|
return (sCallbacks->addr [kStringToValueCallback]) (inValueAsString, inType, ioBuffer, ioBufSize);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_ValueToString(const void* inValue, const UInt32 inValueLen, const QTSS_AttrDataType inType, char** outString)
|
||
|
{
|
||
|
return (sCallbacks->addr [kValueToStringCallback]) (inValue, inValueLen, inType, outString);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_SetValue (QTSS_Object inDictionary, QTSS_AttributeID inID,UInt32 inIndex, const void* inBuffer, UInt32 inLen)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSetAttributeByIDCallback]) (inDictionary, inID, inIndex, inBuffer, inLen);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_SetValuePtr (QTSS_Object inDictionary, QTSS_AttributeID inID, const void* inBuffer, UInt32 inLen)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSetAttributePtrCallback]) (inDictionary, inID, inBuffer, inLen);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_CreateObjectValue (QTSS_Object inDictionary, QTSS_AttributeID inID, QTSS_ObjectType inType, UInt32* outIndex, QTSS_Object* outCreatedObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kCreateObjectValueCallback]) (inDictionary, inID, inType, outIndex, outCreatedObject);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetNumValues (QTSS_Object inObject, QTSS_AttributeID inID, UInt32* outNumValues)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetNumValuesCallback]) (inObject, inID, outNumValues);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GetNumAttributes (QTSS_Object inObject, UInt32* outNumValues)
|
||
|
{
|
||
|
return (sCallbacks->addr [kGetNumAttributesCallback]) (inObject, outNumValues);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_RemoveValue (QTSS_Object inObject, QTSS_AttributeID inID, UInt32 inIndex)
|
||
|
{
|
||
|
return (sCallbacks->addr [kRemoveValueCallback]) (inObject, inID, inIndex);
|
||
|
}
|
||
|
|
||
|
// STREAM ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_Write(QTSS_StreamRef inStream, const void* inBuffer, UInt32 inLen, UInt32* outLenWritten, UInt32 inFlags)
|
||
|
{
|
||
|
return (sCallbacks->addr [kWriteCallback]) (inStream, inBuffer, inLen, outLenWritten, inFlags);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_WriteV(QTSS_StreamRef inStream, iovec* inVec, UInt32 inNumVectors, UInt32 inTotalLength, UInt32* outLenWritten)
|
||
|
{
|
||
|
return (sCallbacks->addr [kWriteVCallback]) (inStream, inVec, inNumVectors, inTotalLength, outLenWritten);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Flush(QTSS_StreamRef inStream)
|
||
|
{
|
||
|
return (sCallbacks->addr [kFlushCallback]) (inStream);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Read(QTSS_StreamRef inRef, void* ioBuffer, UInt32 inBufLen, UInt32* outLengthRead)
|
||
|
{
|
||
|
return (sCallbacks->addr [kReadCallback]) (inRef, ioBuffer, inBufLen, outLengthRead);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Seek(QTSS_StreamRef inRef, UInt64 inNewPosition)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSeekCallback]) (inRef, inNewPosition);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Advise(QTSS_StreamRef inRef, UInt64 inPosition, UInt32 inAdviseSize)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAdviseCallback]) (inRef, inPosition, inAdviseSize);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// SERVICE ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_AddService(const char* inServiceName, QTSS_ServiceFunctionPtr inFunctionPtr)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAddServiceCallback]) (inServiceName, inFunctionPtr);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_IDForService(const char* inTag, QTSS_ServiceID* outID)
|
||
|
{
|
||
|
return (sCallbacks->addr [kIDForServiceCallback]) (inTag, outID);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_DoService(QTSS_ServiceID inID, QTSS_ServiceFunctionArgsPtr inArgs)
|
||
|
{
|
||
|
return (sCallbacks->addr [kDoServiceCallback]) (inID, inArgs);
|
||
|
}
|
||
|
|
||
|
// RTSP ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_SendRTSPHeaders(QTSS_RTSPRequestObject inRef)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSendRTSPHeadersCallback]) (inRef);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_AppendRTSPHeader(QTSS_RTSPRequestObject inRef, QTSS_RTSPHeader inHeader, const char* inValue, UInt32 inValueLen)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAppendRTSPHeadersCallback]) (inRef, inHeader, inValue, inValueLen);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_SendStandardRTSPResponse(QTSS_RTSPRequestObject inRTSPRequest, QTSS_Object inRTPInfo, UInt32 inFlags)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSendStandardRTSPCallback]) (inRTSPRequest, inRTPInfo, inFlags);
|
||
|
}
|
||
|
|
||
|
// RTP ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_AddRTPStream(QTSS_ClientSessionObject inClientSession, QTSS_RTSPRequestObject inRTSPRequest, QTSS_RTPStreamObject* outStream, QTSS_AddStreamFlags inFlags)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAddRTPStreamCallback]) (inClientSession, inRTSPRequest, outStream, inFlags);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Play(QTSS_ClientSessionObject inClientSession, QTSS_RTSPRequestObject inRTSPRequest, QTSS_PlayFlags inPlayFlags)
|
||
|
{
|
||
|
return (sCallbacks->addr [kPlayCallback]) (inClientSession, inRTSPRequest, inPlayFlags);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Pause(QTSS_ClientSessionObject inClientSession)
|
||
|
{
|
||
|
return (sCallbacks->addr [kPauseCallback]) (inClientSession);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Teardown(QTSS_ClientSessionObject inClientSession)
|
||
|
{
|
||
|
return (sCallbacks->addr [kTeardownCallback]) (inClientSession);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_RefreshTimeOut(QTSS_ClientSessionObject inClientSession)
|
||
|
{
|
||
|
return (sCallbacks->addr [kRefreshTimeOutCallback]) (inClientSession);
|
||
|
}
|
||
|
|
||
|
|
||
|
// FILE SYSTEM ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_OpenFileObject(char* inPath, QTSS_OpenFileFlags inFlags, QTSS_Object* outFileObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kOpenFileObjectCallback]) (inPath, inFlags, outFileObject);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_CloseFileObject(QTSS_Object inFileObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kCloseFileObjectCallback]) (inFileObject);
|
||
|
}
|
||
|
|
||
|
// SOCKET ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_CreateStreamFromSocket(int inFileDesc, QTSS_StreamRef* outStream)
|
||
|
{
|
||
|
return (sCallbacks->addr [kCreateSocketStreamCallback]) (inFileDesc, outStream);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_DestroySocketStream(QTSS_StreamRef inStream)
|
||
|
{
|
||
|
return (sCallbacks->addr [kDestroySocketStreamCallback]) (inStream);
|
||
|
|
||
|
}
|
||
|
|
||
|
// ASYNC I/O STREAM ROUTINES
|
||
|
|
||
|
QTSS_Error QTSS_RequestEvent(QTSS_StreamRef inStream, QTSS_EventType inEventMask)
|
||
|
{
|
||
|
return (sCallbacks->addr [kRequestEventCallback]) (inStream, inEventMask);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_SignalStream(QTSS_StreamRef inStream)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSignalStreamCallback]) (inStream);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_SetIdleTimer(SInt64 inIdleMsec)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSetIdleTimerCallback]) (inIdleMsec);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_SetIntervalRoleTimer(SInt64 inIdleMsec)
|
||
|
{
|
||
|
return (sCallbacks->addr [kSetIntervalRoleTimerCallback]) (inIdleMsec);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_RequestGlobalLock()
|
||
|
{
|
||
|
return (sCallbacks->addr [kRequestGlobalLockCallback]) ();
|
||
|
}
|
||
|
|
||
|
// SYNCH GLOBAL MULTIPLE READERS/SINGLE WRITER ROUTINES
|
||
|
|
||
|
Bool16 QTSS_IsGlobalLocked()
|
||
|
{
|
||
|
return (Bool16) (sCallbacks->addr [kIsGlobalLockedCallback]) ();
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_GlobalUnLock()
|
||
|
{
|
||
|
return (sCallbacks->addr [kUnlockGlobalLock]) ();
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_LockObject(QTSS_Object inObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kLockObjectCallback]) (inObject);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_UnlockObject(QTSS_Object inObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kUnlockObjectCallback]) (inObject);
|
||
|
}
|
||
|
|
||
|
// AUTHENTICATION AND AUTHORIZATION ROUTINE
|
||
|
QTSS_Error QTSS_Authenticate( const char* inAuthUserName,
|
||
|
const char* inAuthResourceLocalPath,
|
||
|
const char* inAuthMoviesDir,
|
||
|
QTSS_ActionFlags inAuthRequestAction,
|
||
|
QTSS_AuthScheme inAuthScheme,
|
||
|
QTSS_RTSPRequestObject ioAuthRequestObject)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAuthenticateCallback]) (inAuthUserName, inAuthResourceLocalPath, inAuthMoviesDir, inAuthRequestAction, inAuthScheme, ioAuthRequestObject);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSS_Authorize(QTSS_RTSPRequestObject inAuthRequestObject, char** outAuthRealm, Bool16* outAuthUserAllowed)
|
||
|
{
|
||
|
return (sCallbacks->addr [kAuthorizeCallback]) (inAuthRequestObject, outAuthRealm, outAuthUserAllowed);
|
||
|
}
|
||
|
|
||
|
void QTSS_LockStdLib()
|
||
|
{
|
||
|
(sCallbacks->addr [kLockStdLibCallback]) ();
|
||
|
}
|
||
|
|
||
|
void QTSS_UnlockStdLib()
|
||
|
{
|
||
|
(sCallbacks->addr [kUnlockStdLibCallback]) ();
|
||
|
}
|
||
|
|