/*
 * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * 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@
 */

/*!
 * @header CMessaging
 * Communications class for the DirectoryService Framework providing
 * connection with a DirectoryService daemon via either a mach or TCP endpoint
 * and handling all the message data packing and unpacking.
 */

#ifndef __CMessaging_h__
#define __CMessaging_h__		1

#include "PrivateTypes.h"
#include "SharedConsts.h"
#include "DirServicesTypes.h"

#ifndef SERVERINTERNAL
#include "CClientEndPoint.h"
#include "DSTCPEndpoint.h"
#endif

class		DSMutexSemaphore;

class CMessaging {
public:

	   			CMessaging					( void );
	   			CMessaging					( Boolean inMachEndpoint );
virtual		   ~CMessaging					( void );

		sInt32	ConfigTCP					(	const char *inRemoteIPAddress,
												uInt32 inRemotePort );
#ifndef SERVERINTERNAL
		sInt32	SendServerMessage			( void );
		sInt32	SendRemoteMessage			( void );
#endif
		sInt32	GetReplyMessage				( void );

		sInt32	OpenCommPort				( void );
		sInt32	CloseCommPort				( void );
		sInt32	OpenTCPEndpoint				( void );
		sInt32	CloseTCPEndpoint			( void );

		sInt32	Add_tDataBuff_ToMsg			( tDataBuffer *inBuff, eValueType inType );
		sInt32	Add_tDataList_ToMsg			( tDataList *inList, eValueType inType );
		sInt32	Add_Value_ToMsg				( uInt32 inValue, eValueType inType );
		sInt32	Add_tAttrEntry_ToMsg		( tAttributeEntry *inData );
		sInt32	Add_tAttrValueEntry_ToMsg	( tAttributeValueEntry *inData );
		sInt32	Add_tRecordEntry_ToMsg		( tRecordEntry *inData );

		sInt32	Get_tDataBuff_FromMsg		( tDataBuffer **outBuff, eValueType inType );
		sInt32	Get_tDataList_FromMsg		( tDataList **outList, eValueType inType );
		sInt32	Get_Value_FromMsg			( uInt32 *outValue, eValueType inType );
		sInt32	Get_tAttrEntry_FromMsg		( tAttributeEntry **outAttrEntry, eValueType inType );
		sInt32	Get_tAttrValueEntry_FromMsg	( tAttributeValueEntry **outAttrValue, eValueType inType );
		sInt32	Get_tRecordEntry_FromMsg	( tRecordEntry **outRecEntry, eValueType inType );

		sInt32	SendInlineMessage			( uInt32 inMsgType );

		void	Lock						( void );
		void	Unlock						( void );
		void	ClearMessageBlock			( void );
		
		uInt32	GetServerVersion			( void );
		void	SetServerVersion			( uInt32 inServerVersion );
		const char	*GetProxyIPAddress		( void );
		void	ResetMessageBlock			( void );
#ifdef SERVERINTERNAL
		static bool	IsThreadUsingInternalDispatchBuffering
											( OSType inThreadSig );
#endif
		
private:
		sInt32	GetEmptyObj					( sComData *inMsg, eValueType inType, sObject **outObj );
		sInt32	GetThisObj					( sComData *inMsg, eValueType inType, sObject **outObj );
		sComData*   GetMsgData				( void );

		bool	Grow						( uInt32 inOffset, uInt32 inSize );

#ifndef SERVERINTERNAL
		CClientEndPoint	   *fCommPort;
		
		DSTCPEndpoint	   *fTCPEndpoint;
		uInt32				fRemoteIPAddress;
		uInt32				fRemotePort;
#endif
		
		DSMutexSemaphore   *fLock;

		sComData		   *fMsgData;
		Boolean				bMachEndpoint;	//mach = true and TCP = false
		uInt32				fServerVersion; //1 for making sure data buffer not sent in dsGetRecordList call
};

#endif
