#include "CMessaging.h"
#include "PrivateTypes.h"
#include "DSMutexSemaphore.h"
#include "DSEncryptedEndpoint.h"
#include "DirServicesTypes.h"
#include "DirServicesPriv.h"
#include "DirServicesConst.h"
#include "DirServicesUtils.h"
#ifdef SERVERINTERNAL
#include "DSCThread.h"
#include "CHandlers.h"
#include "CInternalDispatchThread.h"
#endif
#include <servers/bootstrap_defs.h> // for BOOTSTRAP_UNKNOWN_SERVICE
#include <mach/mach.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h> // for offsetof()
#include <unistd.h> // for sleep()
#include <syslog.h> // for syslog()
#include <ctype.h> // for isalpha()
extern dsBool gResetSession;
extern sInt32 gProcessPID;
CMessaging::CMessaging ( void )
{
bMachEndpoint = true;
fLock = new DSMutexSemaphore();
fMsgData = (sComData *)::calloc( 1, sizeof( sComData ) + kMsgBlockSize );
if ( fMsgData != nil )
{
fMsgData->fDataSize = kMsgBlockSize;
fMsgData->fDataLength = 0;
}
fServerVersion = 1;
#ifndef SERVERINTERNAL
fCommPort = nil;
fTCPEndpoint = nil;
#endif
}
CMessaging::CMessaging ( Boolean inMachEndpoint )
{
bMachEndpoint = inMachEndpoint;
fLock = new DSMutexSemaphore();
fMsgData = (sComData *)::calloc( 1, sizeof( sComData ) + kMsgBlockSize );
if ( fMsgData != nil )
{
fMsgData->fDataSize = kMsgBlockSize;
fMsgData->fDataLength = 0;
}
fServerVersion = 1;
#ifndef SERVERINTERNAL
fCommPort = nil;
fTCPEndpoint = nil;
#endif
}
CMessaging::~CMessaging ( void )
{
if ( fLock != nil )
{
delete( fLock );
fLock = nil;
}
if (fMsgData != nil)
{
free(fMsgData);
fMsgData = nil;
}
}
sInt32 CMessaging::ConfigTCP ( const char *inRemoteIPAddress,
uInt32 inRemotePort )
{
sInt32 result = eDSNoErr;
#ifndef SERVERINTERNAL
sInt32 siResult = eDSNoErr;
if (inRemoteIPAddress != nil)
{
if (!DSNetworkUtilities::IsValidAddressString(inRemoteIPAddress,&fRemoteIPAddress))
{
siResult = DSNetworkUtilities::ResolveToIPAddress(inRemoteIPAddress, &fRemoteIPAddress);
if (siResult != eDSNoErr)
{
result = eDSUnknownHost;
}
}
fRemotePort = inRemotePort;
}
fServerVersion = 0; #endif
return( result );
}
sInt32 CMessaging::OpenCommPort ( void )
{
sInt32 siStatus = eDSNoErr;
#ifndef SERVERINTERNAL
siStatus = eMemoryAllocError;
fCommPort = new CClientEndPoint( kDSServiceName );
if ( fCommPort != nil )
{
siStatus = fCommPort->Initialize();
if (siStatus == eDSNoErr)
{
siStatus = fCommPort->CheckForServer();
if (siStatus == BOOTSTRAP_UNKNOWN_SERVICE)
{
syslog( LOG_ALERT, "Could not open connection to local DirectoryService daemon!\n" );
siStatus = eServerNotRunning;
}
else if ( siStatus != eDSNoErr )
{
siStatus = eMemoryAllocError;
}
} }
#endif
return( siStatus );
}
sInt32 CMessaging::CloseCommPort ( void )
{
sInt32 result = eDSNoErr;
#ifndef SERVERINTERNAL
if ( fCommPort != nil )
{
delete(fCommPort);
fCommPort = nil;
}
#endif
return( result );
}
sInt32 CMessaging::OpenTCPEndpoint ( void )
{
sInt32 result = eDSNoErr;
#ifndef SERVERINTERNAL
if ( fTCPEndpoint == nil )
{
fTCPEndpoint = new DSEncryptedEndpoint((uInt32)::time(NULL), kTCPOpenTimeout, kTCPRWTimeout);
if ( fTCPEndpoint != nil )
{
result = fTCPEndpoint->ConnectTo( fRemoteIPAddress, fRemotePort );
if (result == eDSNoErr)
{
result = ((DSEncryptedEndpoint*)fTCPEndpoint)->ClientNegotiateKey();
if (result != eDSNoErr)
{
fTCPEndpoint->CloseConnection();
}
}
}
else
{
result = eMemoryError;
}
}
#endif
return( result );
}
sInt32 CMessaging::CloseTCPEndpoint ( void )
{
sInt32 result = eDSNoErr;
#ifndef SERVERINTERNAL
if ( fTCPEndpoint != nil )
{
delete(fTCPEndpoint);
fTCPEndpoint = nil;
}
#endif
return( result );
}
#ifndef SERVERINTERNAL
sInt32 CMessaging::SendRemoteMessage ( void )
{
sInt32 result = eDSDirSrvcNotOpened;
if ( fTCPEndpoint == nil )
{
result = OpenTCPEndpoint();
}
if ( (fTCPEndpoint != nil) && (fMsgData != nil) )
{
LOG3( kStdErr, "CMessaging::SendRemoteMessage: before ep send - Correlate the message type: %d with the actual CMessaging class ptr %d and the endpoint class %d.", fMsgData->type.msgt_name, (uInt32)this, (uInt32)fTCPEndpoint );
result = fTCPEndpoint->SendServerMessage( fMsgData );
}
return( result );
}
sInt32 CMessaging::SendServerMessage ( void )
{
sInt32 result = eDSDirSrvcNotOpened;
if ( fCommPort == nil )
{
result = OpenCommPort();
}
if ( (fCommPort != nil) && (fMsgData != nil) )
{
result = fCommPort->SendServerMessage( fMsgData );
}
return( result );
} #endif
sInt32 CMessaging::GetReplyMessage ( void )
{
#ifdef SERVERINTERNAL
return eDSNoErr; #else
sInt32 result = eDSDirSrvcNotOpened;
if (bMachEndpoint)
{
if ( fCommPort == nil )
{
result = OpenCommPort();
}
if ( (fCommPort != nil) && (fMsgData != nil) )
{
result = fCommPort->GetServerReply( &fMsgData );
}
if (result == eServerSendError)
{
syslog(LOG_INFO,"DirectoryService Framework::CMessaging::Mach msg receiver error - out of order mach msgs.");
}
if (result == eDSCannotAccessSession)
{
syslog(LOG_INFO,"DirectoryService Framework::CMessaging::Mach msg receiver interrupt error = %d", result);
gResetSession = true;
}
}
else
{
if (fTCPEndpoint != nil)
{
if (fMsgData != nil)
{
free(fMsgData);
fMsgData = nil;
}
result = fTCPEndpoint->GetServerReply( &fMsgData );
LOG3( kStdErr, "CMessaging::GetReplyMessage: after ep reply - Correlate the message type: %d with the actual CMessaging class ptr %d and the endpoint class %d.", fMsgData->type.msgt_name, (uInt32)this, (uInt32)fTCPEndpoint );
}
}
return( result );
#endif
}
sInt32 CMessaging::SendInlineMessage ( uInt32 inMsgType )
{
#ifdef SERVERINTERNAL
sComData *aMsgData = nil;
sComData *checkMsgData = nil;
CInternalDispatchThread *thisThread = (CInternalDispatchThread *)DSLThread::GetCurrentThread();
if (thisThread != nil)
{
if ( IsThreadUsingInternalDispatchBuffering(thisThread->GetSignature()) )
{
aMsgData = thisThread->GetHandlerInternalMsgData();
}
else {
aMsgData = fMsgData;
}
}
else {
aMsgData = fMsgData;
}
if (aMsgData == nil) {
return(eDSInvalidContext);
}
checkMsgData = aMsgData;
CRequestHandler handler;
aMsgData->type.msgt_name = inMsgType;
aMsgData->type.msgt_size = 32;
aMsgData->type.msgt_number = 0;
aMsgData->type.msgt_inline = true;
aMsgData->type.msgt_longform = false;
aMsgData->type.msgt_deallocate = false;
aMsgData->type.msgt_unused = 0;
handler.HandleRequest(&aMsgData);
if (checkMsgData != aMsgData)
{
if (thisThread != nil)
{
if ( IsThreadUsingInternalDispatchBuffering(thisThread->GetSignature()) )
{
thisThread->UpdateHandlerInternalMsgData(checkMsgData, aMsgData);
}
else {
fMsgData = aMsgData;
}
}
else {
fMsgData = aMsgData;
}
}
return eDSNoErr;
#else
sInt32 result = eDSNoErr;
if (bMachEndpoint)
{
fMsgData->type.msgt_name = inMsgType;
fMsgData->type.msgt_size = 32;
fMsgData->type.msgt_number = 0;
fMsgData->type.msgt_inline = true;
fMsgData->type.msgt_longform = false;
fMsgData->type.msgt_deallocate = false;
fMsgData->type.msgt_unused = 0;
result = this->SendServerMessage();
if (result == eDSCannotAccessSession)
{
syslog(LOG_INFO,"DirectoryService Framework::CMessaging::Mach msg send interrupt error = %d.",result);
gResetSession = true;
}
}
else
{
fMsgData->type.msgt_name= inMsgType;
fMsgData->fPID = gProcessPID;
fMsgData->fMsgID = ::time( nil );
result = this->SendRemoteMessage();
}
return( result );
#endif
}
sInt32 CMessaging::Add_tDataBuff_ToMsg ( tDataBuffer *inBuff, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
uInt32 length = 0;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetEmptyObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
pObj->type = inType; pObj->count = 1;
if ( inBuff != nil )
{
pObj->used = inBuff->fBufferLength;
pObj->length = inBuff->fBufferSize;
offset = pObj->offset;
length = pObj->length;
if (Grow( offset, length ))
{
aMsgData = GetMsgData();
}
::memcpy( (char *)aMsgData + offset, inBuff->fBufferData, inBuff->fBufferSize );
aMsgData->fDataLength += inBuff->fBufferSize;
}
else
{
pObj->length = 0;
}
}
return( result );
}
sInt32 CMessaging::Add_tDataList_ToMsg ( tDataList *inList, eValueType inType )
{
sInt32 result = eDSNoErr;
bool done = false;
uInt32 len = 0;
uInt32 offset = 0;
uInt32 length = 0;
tDataNodePtr pCurrNode = nil;
tDataBufferPriv *pPrivData = nil;
sObject *pObj = nil;
if ( inList != nil )
{
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetEmptyObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
pObj->type = inType; pObj->count = inList->fDataNodeCount;
pObj->length = ::dsGetDataLength( inList ) + (inList->fDataNodeCount * sizeof( uInt32 ));
offset = pObj->offset;
length = pObj->length;
if (Grow( offset, length ))
{
aMsgData = GetMsgData();
}
pCurrNode = inList->fDataListHead;
while ( !done )
{
pPrivData = (tDataBufferPriv *)pCurrNode;
len = pPrivData->fBufferLength; ::memcpy( (char *)aMsgData + offset, &len, 4 );
aMsgData->fDataLength += 4;
offset += 4;
::memcpy( (char *)aMsgData + offset, pPrivData->fBufferData, len );
aMsgData->fDataLength += len;
offset += len;
if ( pPrivData->fNextPtr == nil )
{
done = true;
}
else
{
pCurrNode = pPrivData->fNextPtr;
}
}
}
}
return( result );
}
sInt32 CMessaging::Add_Value_ToMsg ( uInt32 inValue, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetEmptyObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
pObj->type = inType;
pObj->count = inValue;
pObj->length = 0;
}
return( result );
}
sInt32 CMessaging::Add_tAttrEntry_ToMsg ( tAttributeEntry *inData )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
uInt32 length = 0;
sComData *aMsgData= nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetEmptyObj( aMsgData, ktAttrValueEntry, &pObj );
if ( result == eDSNoErr )
{
pObj->type = ktAttrEntry;
pObj->count = 1;
if ( inData != nil )
{
pObj->length = sizeof( tAttributeEntry ) + inData->fAttributeSignature.fBufferSize;
offset = pObj->offset;
length = pObj->length;
if (Grow( offset, length ))
{
aMsgData = GetMsgData();
}
::memcpy( (char *)aMsgData + offset, inData, length );
aMsgData->fDataLength += length;
}
else
{
pObj->length = 0;
}
}
return( result );
}
sInt32 CMessaging::Add_tAttrValueEntry_ToMsg ( tAttributeValueEntry *inData )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
uInt32 length = 0;
sComData *aMsgData= nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetEmptyObj( aMsgData, ktAttrValueEntry, &pObj );
if ( result == eDSNoErr )
{
pObj->type = ktAttrValueEntry;
pObj->count = 1;
if ( inData != nil )
{
pObj->length = sizeof( tAttributeValueEntry ) + inData->fAttributeValueData.fBufferSize;
offset = pObj->offset;
length = pObj->length;
if (Grow( offset, length ))
{
aMsgData = GetMsgData();
}
::memcpy( (char *)aMsgData + offset, inData, length );
aMsgData->fDataLength += length;
}
else
{
pObj->count = 0;
pObj->length = 0;
}
}
return( result );
}
sInt32 CMessaging::Add_tRecordEntry_ToMsg ( tRecordEntry *inData )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
uInt32 length = 0;
sComData *aMsgData= nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetEmptyObj( aMsgData, ktRecordEntry, &pObj );
if ( result == eDSNoErr )
{
pObj->type = ktRecordEntry;
pObj->count = 1;
if ( inData != nil )
{
pObj->length = sizeof( tRecordEntry ) + inData->fRecordNameAndType.fBufferSize;
offset = pObj->offset;
length = pObj->length;
if (Grow( offset, length ))
{
aMsgData = GetMsgData();
}
::memcpy( (char *)aMsgData + offset, inData, length );
aMsgData->fDataLength += length;
}
else
{
pObj->length = 0;
}
}
return( result );
}
sInt32 CMessaging::Get_tDataBuff_FromMsg ( tDataBuffer **outBuff, eValueType inType )
{
sInt32 result = eDSNoErr;
uInt32 offset = 0;
uInt32 length = 0;
sObject *pObj = nil;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetThisObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
offset = pObj->offset;
length = pObj->length;
if ( length >= 0 )
{
if ( *outBuff == nil )
{
*outBuff = ::dsDataBufferAllocate( 0x00F0F0F0, length );
}
if ( *outBuff != nil )
{
::memset( (*outBuff)->fBufferData, 0, (*outBuff)->fBufferSize );
if ( (*outBuff)->fBufferSize >= pObj->length )
{
::memcpy( (*outBuff)->fBufferData, (char *)aMsgData + offset, length );
(*outBuff)->fBufferLength = pObj->used;
}
else
{ ::memcpy( (*outBuff)->fBufferData, (char *)aMsgData + offset, (*outBuff)->fBufferSize );
(*outBuff)->fBufferLength = pObj->used;
result = eDSBufferTooSmall;
}
}
else
{
result = eDSNullDataBuff;
}
}
}
return( result );
}
sInt32 CMessaging::Get_tDataList_FromMsg ( tDataList **outList, eValueType inType )
{
sInt32 siResult = eDSNoErr;
uInt32 offset = 0;
uInt32 length = 0;
uInt32 count = 0;
uInt32 cntr = 0;
sObject *pObj = nil;
tDataList *pOutList = nil;
char *tmpStr = nil;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
try
{
siResult = GetThisObj( aMsgData, inType, &pObj );
if ( siResult == eDSNoErr )
{
if ( outList != nil )
{
pOutList = ::dsDataListAllocate( 0x00F0F0F0 );
if ( pOutList != nil )
{
offset = pObj->offset;
count = pObj->count;
while ( cntr < count )
{
::memcpy( &length, (char *)aMsgData + offset, 4 );
offset += 4;
tmpStr = (char *)calloc(1, length+1);
if (tmpStr == nil) throw((sInt32)eMemoryAllocError);
strncpy(tmpStr, (char *)aMsgData + offset, length);
::dsAppendStringToListAlloc( 0x00F0F0F0, pOutList, tmpStr );
free(tmpStr);
offset += length;
cntr++;
}
*outList = pOutList;
}
else
{
siResult = eMemoryError;
}
}
else
{
siResult = eDSNullDataList;
}
}
}
catch( sInt32 err )
{
if ( pOutList != nil )
{
::dsDataListDeAllocate( 0x00F0F0F0, pOutList, true );
free(pOutList);
*outList = nil;
}
siResult = err;
}
return( siResult );
}
sInt32 CMessaging::Get_Value_FromMsg ( uInt32 *outValue, eValueType inType )
{
uInt32 result = eDSNoErr;
sObject *pObj = nil;
sComData *aMsgData= nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetThisObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
*outValue = pObj->count;
}
return( result );
}
sInt32 CMessaging::Get_tAttrEntry_FromMsg ( tAttributeEntry **outAttrEntry, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
tAttributeEntry *pAttrEntry = nil;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetThisObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
pAttrEntry = (tAttributeEntry *)::calloc( 1, pObj->length );
if ( pAttrEntry != nil )
{
::memcpy( pAttrEntry, (char *)aMsgData + pObj->offset, pObj->length );
*outAttrEntry = pAttrEntry;
}
else
{
result = eDSNullAttribute;
}
}
return( result );
}
sInt32 CMessaging::Get_tAttrValueEntry_FromMsg ( tAttributeValueEntry **outAttrValue,
eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
tAttributeValueEntry *pAttrValueEntry = nil;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetThisObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
pAttrValueEntry = (tAttributeValueEntry *)::calloc( 1, pObj->length );
if ( pAttrValueEntry != nil )
{
::memcpy( pAttrValueEntry, (char *)aMsgData + pObj->offset, pObj->length );
*outAttrValue = pAttrValueEntry;
}
else
{
result = eDSNullAttributeValue;
}
}
return( result );
}
sInt32 CMessaging::Get_tRecordEntry_FromMsg ( tRecordEntry **outRecEntry, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
tRecordEntry *pRecordEntry = nil;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if (aMsgData == nil) {
return(eDSInvalidContext);
}
result = GetThisObj( aMsgData, inType, &pObj );
if ( result == eDSNoErr )
{
pRecordEntry = (tRecordEntry *)::calloc( 1, pObj->length );
if ( pRecordEntry != nil )
{
::memcpy( pRecordEntry, (char *)aMsgData + pObj->offset, pObj->length );
*outRecEntry = pRecordEntry;
}
else
{
result = eDSNullRecEntryPtr;
}
}
return( result );
}
sInt32 CMessaging::GetEmptyObj ( sComData *inMsg, eValueType inType, sObject **outObj )
{
sInt32 siResult = eDSIndexNotFound;
uInt32 i;
for ( i = 0; i < 10; i++ )
{
if ( inMsg->obj[ i ].type == 0 )
{
*outObj = &inMsg->obj[ i ];
if ( i == 0 )
{
(*outObj)->offset = offsetof(struct sComData, data);
}
else
{
(*outObj)->offset = inMsg->obj[ i - 1 ].offset + inMsg->obj[ i - 1 ].length;
}
siResult = eDSNoErr;
break;
}
else if ( inMsg->obj[ i ].type == (uInt32)inType )
{
break;
}
}
return( siResult );
}
sInt32 CMessaging::GetThisObj ( sComData *inMsg, eValueType inType, sObject **outObj )
{
sInt32 siResult = eDSIndexNotFound;
uInt32 i;
for ( i = 0; i < 10; i++ )
{
if ( inMsg->obj[ i ].type == (uInt32)inType )
{
*outObj = &inMsg->obj[ i ];
siResult = eDSNoErr;
break;
}
}
return( siResult );
}
bool CMessaging::Grow ( uInt32 inOffset, uInt32 inSize )
{
uInt32 newSize = 0;
char *pNewPtr = nil;
uInt32 length = 0;
sComData *aMsgData = nil;
bool bGrown = false;
if ( inSize == 0 )
{
return(bGrown);
}
aMsgData = GetMsgData();
if (aMsgData != nil)
{
if ( (aMsgData->fDataLength + inSize) > aMsgData->fDataSize )
{
newSize = aMsgData->fDataSize;
while( newSize < (aMsgData->fDataLength + inSize) )
{
newSize += kMsgBlockSize;
}
length = aMsgData->fDataLength;
pNewPtr = (char *)::calloc( 1, sizeof( sComData ) + newSize );
if ( pNewPtr == nil )
{
throw( (sInt32)eMemoryAllocError );
}
::memcpy( pNewPtr, aMsgData, sizeof(sComData) + aMsgData->fDataLength );
#ifdef SERVERINTERNAL
CInternalDispatchThread *ourThread = (CInternalDispatchThread *)DSLThread::GetCurrentThread();
if (ourThread != nil)
{
if ( IsThreadUsingInternalDispatchBuffering(ourThread->GetSignature()) )
{
ourThread->UpdateHandlerInternalMsgData(aMsgData, (sComData *)pNewPtr);
}
else {
fMsgData = (sComData *)pNewPtr;
}
}
else {
fMsgData = (sComData *)pNewPtr;
}
#else
fMsgData = (sComData *)pNewPtr;
#endif
::free( aMsgData );
aMsgData = nil;
aMsgData = (sComData *)pNewPtr;
pNewPtr = nil;
aMsgData->fDataSize = newSize;
aMsgData->fDataLength = length;
bGrown = true;
}
}
return(bGrown);
}
void CMessaging::Lock ( void )
{
#ifdef SERVERINTERNAL
CInternalDispatchThread *thisThread = (CInternalDispatchThread *)DSLThread::GetCurrentThread();
if (thisThread != nil)
{
if ( IsThreadUsingInternalDispatchBuffering(thisThread->GetSignature()) )
{
thisThread->SetHandlerInternalMsgData();
}
else {
if ( fLock != nil )
{
fLock->Wait();
}
}
}
else {
if ( fLock != nil )
{
fLock->Wait();
}
}
#else
if ( fLock != nil )
{
fLock->Wait();
}
#endif
}
void CMessaging::Unlock ( void )
{
#ifdef SERVERINTERNAL
CInternalDispatchThread *thisThread = (CInternalDispatchThread *)DSLThread::GetCurrentThread();
if (thisThread != nil)
{
if ( IsThreadUsingInternalDispatchBuffering(thisThread->GetSignature()) )
{
thisThread->ResetHandlerInternalMsgData();
}
else {
if ( fLock != nil )
{
fLock->Signal();
}
}
}
else {
if ( fLock != nil )
{
fLock->Signal();
}
}
#else
if ( fLock != nil )
{
fLock->Signal();
}
#endif
}
void CMessaging::ClearMessageBlock ( void )
{
uInt32 size = 0;
sComData *aMsgData = nil;
aMsgData = GetMsgData();
if ( aMsgData != nil )
{
size = aMsgData->fDataSize;
::memset( aMsgData, 0, sizeof( sComData ) );
aMsgData->fDataSize = size;
aMsgData->fDataLength = 0;
}
}
uInt32 CMessaging::GetServerVersion ( void )
{
return( fServerVersion );
}
void CMessaging::SetServerVersion ( uInt32 inServerVersion )
{
fServerVersion = inServerVersion;
}
const char* CMessaging::GetProxyIPAddress ( void )
{
const char *outIPAddress = nil;
#ifndef SERVERINTERNAL
if ( (!bMachEndpoint) && (fTCPEndpoint != nil) )
{
outIPAddress = fTCPEndpoint->GetReverseAddressString();
}
#endif
return(outIPAddress);
}
sComData* CMessaging::GetMsgData ( void )
{
sComData *aMsgData = nil;
#ifdef SERVERINTERNAL
CInternalDispatchThread *thisThread = (CInternalDispatchThread *)DSLThread::GetCurrentThread();
if (thisThread != nil)
{
if ( IsThreadUsingInternalDispatchBuffering(thisThread->GetSignature()) )
{
aMsgData = thisThread->GetHandlerInternalMsgData();
}
else {
aMsgData = fMsgData;
}
}
else {
aMsgData = fMsgData;
}
#else
aMsgData = fMsgData;
#endif
return(aMsgData);
}
#ifdef SERVERINTERNAL
bool CMessaging::IsThreadUsingInternalDispatchBuffering( OSType inThreadSig )
{
bool isInternalDispatchThread = false;
if ( (inThreadSig == DSCThread::kTSHandlerThread) ||
(inThreadSig == DSCThread::kTSInternalHandlerThread) ||
(inThreadSig == DSCThread::kTSCheckpwHandlerThread) ||
(inThreadSig == DSCThread::kTSTCPConnectionThread) ||
(inThreadSig == DSCThread::kTSLauncherThread) ||
(inThreadSig == DSCThread::kTSPlugInHndlrThread) )
{
isInternalDispatchThread = true;
}
return(isInternalDispatchThread);
} #endif