/*
 *
 * @APPLE_LICENSE_HEADER_START@
 *
 * Copyright (c) 1999-2001 Apple Computer, Inc.  All Rights Reserved. The
 * contents of this file constitute Original Code as defined in and are
 * subject to the Apple Public Source License Version 1.2 (the 'License').
 * You may not use this file except in compliance with the License.  Please
 * obtain a copy of the License at http://www.apple.com/publicsource and
 * read it before using this file.
 *
 * This 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:		QTSSCallbacks.h

	Contains:	All the QTSS callback functions
					
	
*/


#ifndef __QTSSCALLBACKS_H__
#define __QTSSCALLBACKS_H__

#include "QTSS.h"

class QTSSCallbacks
{
	public:
	
		// MEMORY ROUTINES
		
		static void* 	QTSS_New(FourCharCode inMemoryIdentifier, UInt32 inSize);
		static void		QTSS_Delete(void* inMemory);
		
		
		// TIME ROUTINES
		static void	QTSS_Milliseconds(SInt64* outMilliseconds);
		static void	QTSS_ConvertToUnixTime(SInt64* inQTSS_MilliSecondsPtr, time_t* outSecondsPtr);

		// STARTUP ROUTINES
		
		static QTSS_Error 	QTSS_AddRole(QTSS_Role inRole);

		// DICTIONARY ROUTINES
		
		// DICTIONARY LOCKING
		static QTSS_Error	QTSS_LockObject(QTSS_Object inDictionary);
		static QTSS_Error	QTSS_UnlockObject(QTSS_Object inDictionary);
		
		// CREATE NEW OBJECT TYPE
		static QTSS_Error	QTSS_CreateObjectType(QTSS_ObjectType* outType);

		// ADD ATTRIBUTE
		
		static QTSS_Error	QTSS_AddAttribute(QTSS_ObjectType inType, const char* inTag, void* inUnused);
		static QTSS_Error	QTSS_AddStaticAttribute(QTSS_ObjectType inObjectType, const char* inAttrName, void* inUnused, QTSS_AttrDataType inAttrDataType);
		static QTSS_Error	QTSS_AddInstanceAttribute(QTSS_Object inObject, const char* inAttrName, void* inUnused, QTSS_AttrDataType inAttrDataType);

		// REMOVE ATTRIBUTE
		
		static QTSS_Error	QTSS_RemoveInstanceAttribute(QTSS_Object inObject, QTSS_AttributeID inID);

		// ATTRIBUTE INFO
		static QTSS_Error	QTSS_IDForAttr(QTSS_ObjectType inType, const char* inTag, QTSS_AttributeID* outID);

		static QTSS_Error	QTSS_GetAttrInfoByName(QTSS_Object inObject, const char* inAttrName, QTSS_Object* outAttrInfoObject);
		static QTSS_Error	QTSS_GetAttrInfoByID(QTSS_Object inObject, QTSS_AttributeID inAttrID, QTSS_Object* outAttrInfoObject);
		static QTSS_Error	QTSS_GetAttrInfoByIndex(QTSS_Object inObject, UInt32 inIndex, QTSS_Object* outAttrInfoObject);

		static QTSS_Error 	QTSS_GetNumAttributes(QTSS_Object inObject, UInt32* outNumValues);

		// TYPE INFO & TYPE CONVERSIONS
		
		static QTSS_Error	QTSS_TypeToTypeString(const QTSS_AttrDataType inType, char** outTypeString);
		static QTSS_Error	QTSS_TypeStringToType(const char* inTypeString, QTSS_AttrDataType* outType);
		static QTSS_Error	QTSS_StringToValue(const char* inValueAsString, const QTSS_AttrDataType inType, void* ioBuffer, UInt32* ioBufSize);
		static QTSS_Error	QTSS_ValueToString(const void* inValue, const UInt32 inValueLen, const QTSS_AttrDataType inType, char** outString);

		// ATTRIBUTE VALUES
		
		static QTSS_Error 	QTSS_GetValuePtr (QTSS_Object inDictionary, QTSS_AttributeID inID, UInt32 inIndex, void** outBuffer, UInt32* outLen);
		static QTSS_Error 	QTSS_GetValue (QTSS_Object inDictionary, QTSS_AttributeID inID, UInt32 inIndex, void* ioBuffer, UInt32* ioLen);
		static QTSS_Error 	QTSS_GetValueAsString (QTSS_Object inDictionary, QTSS_AttributeID inID, UInt32 inIndex, char** outString);
		
		static QTSS_Error 	QTSS_SetValue (QTSS_Object inDictionary, QTSS_AttributeID inID, UInt32 inIndex, const void* inBuffer,  UInt32 inLen);
		static QTSS_Error 	QTSS_SetValuePtr (QTSS_Object inDictionary, QTSS_AttributeID inID, const void* inBuffer,  UInt32 inLen);
		static QTSS_Error 	QTSS_CreateObject (QTSS_Object inDictionary, QTSS_AttributeID inID, QTSS_ObjectType inType, UInt32* outIndex, QTSS_Object* outCreatedObject);
		static QTSS_Error 	QTSS_GetNumValues (QTSS_Object inObject, QTSS_AttributeID inID, UInt32* outNumValues);
		static QTSS_Error 	QTSS_RemoveValue (QTSS_Object inObject, QTSS_AttributeID inID, UInt32 inIndex);

		// STREAM ROUTINES
		
		static QTSS_Error	QTSS_Write(QTSS_StreamRef inStream, void* inBuffer, UInt32 inLen, UInt32* outLenWritten, QTSS_WriteFlags inFlags);
		static QTSS_Error	QTSS_WriteV(QTSS_StreamRef inStream, iovec* inVec, UInt32 inNumVectors, UInt32 inTotalLength, UInt32* outLenWritten);
		static QTSS_Error	QTSS_Flush(QTSS_StreamRef inStream);
		static QTSS_Error	QTSS_Read(QTSS_StreamRef inRef, void* ioBuffer, UInt32 inBufLen, UInt32* outLengthRead);
		static QTSS_Error	QTSS_Seek(QTSS_StreamRef inRef, UInt64 inNewPosition);
		static QTSS_Error	QTSS_Advise(QTSS_StreamRef inRef, UInt64 inPosition, UInt32 inAdviseSize);

		// FILE SYSTEM ROUTINES
		
		static QTSS_Error	QTSS_OpenFileObject(char* inPath, QTSS_OpenFileFlags inFlags, QTSS_Object* outFileObject);
		static QTSS_Error	QTSS_CloseFileObject(QTSS_Object inFileObject);

		// SOCKET ROUTINES
		
		static QTSS_Error	QTSS_CreateStreamFromSocket(int inFileDesc, QTSS_StreamRef* outStream);
		static QTSS_Error	QTSS_DestroySocketStream(QTSS_StreamRef inStream);

		// SERVICE ROUTINES
		
		static QTSS_Error	QTSS_AddService(const char* inServiceName, QTSS_ServiceFunctionPtr inFunctionPtr);
		static QTSS_Error	QTSS_IDForService(const char* inTag, QTSS_ServiceID* outID);
		static QTSS_Error	QTSS_DoService(QTSS_ServiceID inID, QTSS_ServiceFunctionArgsPtr inArgs);

		// RTSP ROUTINES
		
		static QTSS_Error 	QTSS_SendRTSPHeaders(QTSS_RTSPRequestObject inRef);
		static QTSS_Error 	QTSS_AppendRTSPHeader(QTSS_RTSPRequestObject inRef, QTSS_RTSPHeader inHeader, char* inValue, UInt32 inValueLen);
		static QTSS_Error 	QTSS_SendStandardRTSPResponse(QTSS_RTSPRequestObject inRTSPRequest, QTSS_Object inRTPInfo, UInt32 inFlags);

		// RTP ROUTINES
		
		static QTSS_Error	QTSS_AddRTPStream(QTSS_ClientSessionObject inClientSession, QTSS_RTSPRequestObject inRTSPRequest, QTSS_RTPStreamObject* outStream, QTSS_AddStreamFlags inFlags);
		static QTSS_Error	QTSS_Play(QTSS_ClientSessionObject inClientSession, QTSS_RTSPRequestObject inRTSPRequest, QTSS_PlayFlags inPlayFlags);
		static QTSS_Error	QTSS_Pause(QTSS_ClientSessionObject inClientSession);
		static QTSS_Error	QTSS_Teardown(QTSS_ClientSessionObject inClientSession);
		static QTSS_Error	QTSS_RefreshTimeOut(QTSS_ClientSessionObject inClientSession);
		
		// ASYNC I/O ROUTINES
		static QTSS_Error  	QTSS_RequestEvent(QTSS_StreamRef inStream, QTSS_EventType inEventMask);
		static QTSS_Error	QTSS_SignalStream(QTSS_StreamRef inStream);
		static QTSS_Error	QTSS_SetIdleTimer(SInt64 inMsecToWait);

		static QTSS_Error	QTSS_RequestLockedCallback();
		static Bool16		QTSS_IsGlobalLocked();
		static QTSS_Error	QTSS_UnlockGlobalLock();
		
		// AUTHENTICATION AND AUTHORIZATION ROUTINE
		static QTSS_Error	QTSS_Authenticate(const char* inAuthUserName, const char* inAuthResourceLocalPath, const char* inAuthMoviesDir, QTSS_ActionFlags inAuthRequestAction, QTSS_AuthScheme inAuthScheme, QTSS_RTSPRequestObject ioAuthRequestObject);
		static QTSS_Error	QTSS_Authorize(QTSS_RTSPRequestObject inAuthRequestObject, char** outAuthRealm, Bool16* outAuthUserAllowed);
			
	private:
	
};

#endif //__QTSSCALLBACKS_H__
