// C32COMM.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//
#if !defined(__C32COMM_H__)
#define __C32COMM_H__

#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#if !defined(__D32COMM_H__)
#include <d32comm.h>
#endif

IMPORT_C TInt StartC32();

const TUint KEC32MajorVersionNumber=1;
const TUint KEC32MinorVersionNumber=0;
const TUint KEC32BuildVersionNumber=507;

#define COMM_SERVER_NAME _L("CommServer")

//
enum TCommAccess {ECommExclusive,ECommShared};

const TUint KCommBufferFull=0x0000;
const TUint KCommBufferPartial=0x0001;

//
enum TC32Trace 
	{
	ETraceC32Startup=0x00000001,
	ETraceC32Panic=0x00000002,
	ETraceC32Request=0x00000004,
	ETraceC32IPC=0x00000008,
	ETraceC32All=0xFFFFFFFF,
	};

struct TCommServerConfigV01
    {
	TUint   iBufFlags;
	TUint   iBufSize;
	};

typedef TPckgBuf<TCommServerConfigV01> TCommServerConfig;

const TInt KMaxPortDescription=0x30;
const TInt KMaxPortName=0x10;

const TUint KCommResetRx = 0x00000001;
const TUint KCommResetTx = 0x00000002;

typedef TBuf<KMaxPortName> TPortName;
typedef TBuf<KMaxPortDescription> TPortDescription;

class TSerialInfo
	{
public:
	TPortDescription iDescription;
	TPortName iName;
	TUint iLowUnit;
	TUint iHighUnit;
	};
//
class RComm;
class RCommServ : public RSessionBase
	{
public:
	IMPORT_C RCommServ();
	IMPORT_C TInt Connect();
	IMPORT_C TVersion Version() const;

	IMPORT_C TInt LoadCommModule(const TDesC &aFileName);
	IMPORT_C TInt UnloadCommModule(const TDesC &aName);

	IMPORT_C TInt NumPorts(TInt& aNum);
	IMPORT_C TInt GetPortInfo(const TDesC &aName,TSerialInfo &aInfo);
	IMPORT_C TInt GetPortInfo(TInt aIndex, TDes &aModuleName, TSerialInfo &aInfo);
	IMPORT_C TInt __DbgMarkHeap();
	IMPORT_C TInt __DbgCheckHeap(TInt aCount);
	IMPORT_C TInt __DbgMarkEnd(TInt aCount);
	IMPORT_C TInt __DbgFailNext(TInt aCount);
	IMPORT_C TInt __DbgSetTraceMask(TC32Trace aMask);
	};
//
class RComm : public RSubSessionBase
	{

public:
	IMPORT_C TInt Open(RCommServ &aServer, const TDesC &aName,TCommAccess aMode);
	IMPORT_C void Read(TRequestStatus &aStatus, TDes8 &aDes);
	IMPORT_C void Read(TRequestStatus &aStatus, TDes8 &aDes, TInt aLength);
	IMPORT_C void Read(TRequestStatus &aStatus, TTimeIntervalMicroSeconds32 aTimeOut,TDes8 &aDes);
	IMPORT_C void Read(TRequestStatus &aStatus, TTimeIntervalMicroSeconds32 aTimeOut,TDes8 &aDes, TInt aLength);
	IMPORT_C void ReadOneOrMore(TRequestStatus &aStatus,TDes8 &aDes);
	IMPORT_C void ReadCancel();
	IMPORT_C TInt QueryReceiveBuffer() const;
	IMPORT_C void ResetBuffers(TUint aFlags=(KCommResetRx|KCommResetTx));
	IMPORT_C void Write(TRequestStatus &aStatus,const TDesC8 &aDes);
	IMPORT_C void Write(TRequestStatus &aStatus,const TDesC8 &aDes, TInt aLength);
	IMPORT_C void Write(TRequestStatus &aStatus, TTimeIntervalMicroSeconds32 aTimeOut,const TDesC8 &aDes);
	IMPORT_C void Write(TRequestStatus &aStatus, TTimeIntervalMicroSeconds32 aTimeOut,const TDesC8 &aDes, TInt aLength);
	IMPORT_C void WriteCancel();
	IMPORT_C void Break(TRequestStatus &aStatus, TTimeIntervalMicroSeconds32 aTime);
	IMPORT_C void BreakCancel();
	IMPORT_C void Cancel();
	IMPORT_C void Config(TDes8 &aConfig) const;
	IMPORT_C TInt SetConfig(const TDesC8 &aConfig);
	IMPORT_C void Caps(TDes8 &aCaps) const;
	IMPORT_C TInt SetMode(const TCommServerConfig &aConfig);
	IMPORT_C void Mode(TCommServerConfig &aConfig)const;
	IMPORT_C TUint Signals(TUint aSignalMask=0x3F) const;
	IMPORT_C void SetSignalsToMark(TUint aSignalMask);
	IMPORT_C void SetSignalsToSpace(TUint aSignalMask);
	IMPORT_C TInt ReceiveBufferLength() const;
	IMPORT_C void SetReceiveBufferLength(TInt aLength);
	IMPORT_C void Close();
	inline void SetSignals(TUint aSetMask,TUint aClearMask);
#ifdef _DEBUG_DEVCOMM
	IMPORT_C void RComm::DebugInfo(TDes8& aDes);
#endif
	};

#include <C32COMM.INL>

#endif
