Darwin-Streaming-Server/Server.tproj/QTSSModule.h

190 lines
6.8 KiB
C
Raw Permalink Normal View History

/*
*
* @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@
*
*/
/*
Contains: This object represents a single QTSS API compliant module.
A module may either be compiled directly into the server,
or loaded from a code fragment residing on the disk.
Object does the loading and initialization of a module, and
stores all per-module data.
*/
#ifndef __QTSSMODULE_H__
#define __QTSSMODULE_H__
#include "QTSS.h"
#include "QTSS_Private.h"
#include "QTSSDictionary.h"
#include "Task.h"
#include "QTSSPrefs.h"
#include "OSCodeFragment.h"
#include "OSQueue.h"
#include "StrPtrLen.h"
#define MODULE_DEBUG 0
class QTSSModule : public QTSSDictionary, public Task
{
public:
//
// INITIALIZE
static void Initialize();
// CONSTRUCTOR / SETUP / DESTRUCTOR
// Specify the path to the code fragment if this module
// is to be loaded from disk. If it is loaded from disk, the
// name of the module will be its file name. Otherwise, the
// inName parameter will set it.
QTSSModule(char* inName, char* inPath = NULL);
// This function does all the module setup. If the module is being
// loaded from disk, you need not pass in a main entrypoint (as
// it will be grabbed from the fragment). Otherwise, you must pass
// in a main entrypoint.
//
// Note that this function does not invoke any public module roles.
QTSS_Error SetupModule(QTSS_CallbacksPtr inCallbacks, QTSS_MainEntryPointPtr inEntrypoint = NULL);
// Doesn't free up internally allocated stuff
virtual ~QTSSModule(){}
//
// MODIFIERS
void SetPrefsDict(QTSSPrefs* inPrefs) { fPrefs = inPrefs; }
void SetAttributesDict(QTSSDictionary* inAttributes) { fAttributes = inAttributes; }
//
// ACCESSORS
OSQueueElem* GetQueueElem() { return &fQueueElem; }
Bool16 IsInitialized() { return fDispatchFunc != NULL; }
QTSSPrefs* GetPrefsDict() { return fPrefs; }
QTSSDictionary* GetAttributesDict() { return fAttributes; }
OSMutex* GetAttributesMutex() { return &fAttributesMutex; }
//convert QTSS.h 4 char id roles to private role index
SInt32 GetPrivateRoleIndex(QTSS_Role apiRole);
// This calls into the module.
QTSS_Error CallDispatch(QTSS_Role inRole, QTSS_RoleParamPtr inParams)
{
SInt32 theRoleIndex = -1;
if (MODULE_DEBUG)
{ this->GetValue(qtssModName)->PrintStr("QTSSModule::CallDispatch ENTER module=", " role=");
theRoleIndex = GetPrivateRoleIndex(inRole);
if (theRoleIndex != -1)
qtss_printf(" %s ENTR\n", sRoleNames[theRoleIndex]);
}
QTSS_Error theError = (fDispatchFunc)(inRole, inParams);
if (MODULE_DEBUG)
{ this->GetValue(qtssModName)->PrintStr("QTSSModule::CallDispatch EXIT module=", " role=");
if (theRoleIndex != -1)
qtss_printf(" %s EXIT\n", sRoleNames[theRoleIndex]);
}
return theError;
}
// These enums allow roles to be stored in a more optimized way
// add new RoleNames to sRoleNames in QTSSModule.cpp for debugging
enum
{
kInitializeRole = 0,
kShutdownRole = 1,
kRTSPFilterRole = 2,
kRTSPRouteRole = 3,
kRTSPAthnRole = 4,
kRTSPAuthRole = 5,
kRTSPPreProcessorRole = 6,
kRTSPRequestRole = 7,
kRTSPPostProcessorRole = 8,
kRTSPSessionClosingRole = 9,
kRTPSendPacketsRole = 10,
kClientSessionClosingRole = 11,
kRTCPProcessRole = 12,
kErrorLogRole = 13,
kRereadPrefsRole = 14,
kOpenFileRole = 15,
kOpenFilePreProcessRole = 16,
kAdviseFileRole = 17,
kReadFileRole = 18,
kCloseFileRole = 19,
kRequestEventFileRole = 20,
kRTSPIncomingDataRole = 21,
kStateChangeRole = 22,
kTimedIntervalRole = 23,
kNumRoles = 24
};
typedef UInt32 RoleIndex;
// Call this to activate this module in the specified role.
QTSS_Error AddRole(QTSS_Role inRole);
// This returns true if this module is supposed to run in the specified role.
Bool16 RunsInRole(RoleIndex inIndex) { Assert(inIndex < kNumRoles); return fRoleArray[inIndex]; }
SInt64 Run();
QTSS_ModuleState* GetModuleState() { return &fModuleState;}
private:
QTSS_Error LoadFromDisk(QTSS_MainEntryPointPtr* outEntrypoint);
OSQueueElem fQueueElem;
char* fPath;
OSCodeFragment* fFragment;
QTSS_DispatchFuncPtr fDispatchFunc;
Bool16 fRoleArray[kNumRoles];
QTSSPrefs* fPrefs;
QTSSDictionary* fAttributes;
OSMutex fAttributesMutex;
static Bool16 sHasRTSPRequestModule;
static Bool16 sHasOpenFileModule;
static Bool16 sHasRTSPAuthenticateModule;
static QTSSAttrInfoDict::AttrInfo sAttributes[];
static char* sRoleNames[];
QTSS_ModuleState fModuleState;
};
#endif //__QTSSMODULE_H__