#ifndef __CHandlers_h__
#define __CHandlers_h__ 1
#include "DSCThread.h"
#include "CSrvrEndPoint.h"
#include "DSTCPEndpoint.h"
#include "PrivateTypes.h"
#include "CPlugInList.h"
#include "DirServicesTypes.h"
#include "DSUtils.h"
class CServerPlugin;
extern DSMutexSemaphore *gTCPHandlerLock;
extern DSMutexSemaphore *gHandlerLock;
extern DSMutexSemaphore *gInternalHandlerLock;
extern DSMutexSemaphore *gCheckpwHandlerLock;
struct sRefEntry;
class CHandlerThread : public DSCThread
{
public:
CHandlerThread ( void );
CHandlerThread ( const FourCharCode inThreadSignature, uInt32 iThread );
virtual ~CHandlerThread ( void );
virtual long ThreadMain ( void ); virtual void StartThread ( void );
virtual void StopThread ( void );
uInt32 GetOurThreadRunState( void );
static sInt32 RefDeallocProc ( uInt32 inRefNum, sRefEntry *entry );
protected:
virtual void LastChance ( void );
CSrvrEndPoint *fEndPt;
DSTCPEndpoint *fTCPEndPt;
private:
sInt32 CreateEndpoint ( void );
void HandleMessage ( void );
uInt32 fThreadIndex;
};
class CRequestHandler
{
public:
CRequestHandler ( void );
bool HandleRequest ( sComData **inRequest );
static char* GetCallName ( sInt32 inType );
protected:
sInt32 HandleServerCall ( sComData **inRequest );
sInt32 HandlePluginCall ( sComData **inRequest );
sInt32 HandleUnknownCall ( sComData *inRequest );
bool IsServerRequest ( sComData *inRequest );
bool IsPluginRequest ( sComData *inRequest );
void* GetRequestData ( sComData *inRequest, sInt32 *outResult, bool *outShouldProcess );
sInt32 PackageReply ( void *inData, sComData **inRequest );
uInt32 GetMsgType ( sComData *inRequest );
sInt32 FailedCallRefCleanUp( void *inData, sInt32 inClientPID, uInt32 inMsgType, uInt32 inIPAddress );
void DoFreeMemory ( void *inData );
private:
sInt32 SetRequestResult ( sComData *inMsg, sInt32 inResult );
void* DoOpenDirNode ( sComData *inRequest, sInt32 *outStatus );
void* DoFlushRecord ( sComData *inRequest, sInt32 *outStatus );
void* DoReleaseContinueData ( sComData *inRequest, sInt32 *outStatus );
void* DoPlugInCustomCall ( sComData *inRequest, sInt32 *outStatus );
void* DoAttributeValueSearch ( sComData *inRequest, sInt32 *outStatus );
void* DoAttributeValueSearchWithData ( sComData *inRequest, sInt32 *outStatus );
void* DoFindDirNodes ( sComData *inRequest, sInt32 *outStatus );
void* DoCloseDirNode ( sComData *inRequest, sInt32 *outStatus );
void* DoGetDirNodeInfo ( sComData *inRequest, sInt32 *outStatus );
void* DoGetRecordList ( sComData *inRequest, sInt32 *outStatus );
void* DoGetRecordEntry ( sComData *inRequest, sInt32 *outStatus );
void* DoGetAttributeEntry ( sComData *inRequest, sInt32 *outStatus );
void* DoGetAttributeValue ( sComData *inRequest, sInt32 *outStatus );
void* DoCloseAttributeList ( sComData *inRequest, sInt32 *outStatus );
void* DoCloseAttributeValueList ( sComData *inRequest, sInt32 *outStatus );
void* DoOpenRecord ( sComData *inRequest, sInt32 *outStatus );
void* DoGetRecRefInfo ( sComData *inRequest, sInt32 *outStatus );
void* DoGetRecAttribInfo ( sComData *inRequest, sInt32 *outStatus );
void* DoGetRecordAttributeValueByIndex( sComData *inRequest, sInt32 *outStatus );
void* DoGetRecordAttributeValueByID ( sComData *inRequest, sInt32 *outStatus );
void* DoCloseRecord ( sComData *inRequest, sInt32 *outStatus );
void* DoSetRecordName ( sComData *inRequest, sInt32 *outStatus );
void* DoSetRecordType ( sComData *inRequest, sInt32 *outStatus );
void* DoDeleteRecord ( sComData *inRequest, sInt32 *outStatus );
void* DoCreateRecord ( sComData *inRequest, sInt32 *outStatus );
void* DoAddAttribute ( sComData *inRequest, sInt32 *outStatus );
void* DoRemoveAttribute ( sComData *inRequest, sInt32 *outStatus );
void* DoAddAttributeValue ( sComData *inRequest, sInt32 *outStatus );
void* DoRemoveAttributeValue ( sComData *inRequest, sInt32 *outStatus );
void* DoSetAttributeValue ( sComData *inRequest, sInt32 *outStatus );
void* DoAuthentication ( sComData *inRequest, sInt32 *outStatus );
void* GetNodeList ( sComData *inRequest, sInt32 *outStatus );
void* FindDirNodes ( sComData *inRequest, sInt32 *outStatus );
sInt32 DoCheckUserNameAndPassword ( const char *userName, const char *password,
tDirPatternMatch inPatternMatch,
uid_t *outUID, char **outShortName );
bool UserIsAdmin ( const char* shortName );
bool UserIsMemberOfGroup ( tDirReference inDirRef, tDirNodeReference inDirNodeRef,
const char* shortName, const char* groupName );
void GetUIDsForProcessID ( pid_t inPID, uid_t *outUID, uid_t *outEUID );
CServerPlugin *fPluginPtr;
bool bClosePort;
};
#endif