www.pudn.com > TAPI会议系统.rar > tapidescribe.cpp


// ---------------------------------------------------------------------------- 
// IP Office SDK (c) Avaya 2001. All rights reserved. 
// 
// PROJECT:  TapiSample 
// FILE:     tapidescribe.cpp 
// CREATED:  Geoff Froud, based on previous work by Carl Muller 
// 
// See tapisample.h for an explanation of this program. 
// 
// This is the implementation file for the tapi message description functions. 
// See tapidescribe.h for the definition of these functions 
// 
// ---------------------------------------------------------------------------- 
 
#include "stdafx.h" 
#include "tapisample.h" 
#include "tapisampleDlg.h" 
#include "tapidescribe.h" 
 
 
// ---------------------------------------------------------------------------- 
// Describe a call privilege level (in English) 
LPCTSTR DescribeError(DWORD dwError) 
{ 
	switch (dwError) { 
	case LINEERR_ALLOCATED				: return "Allocated"; 
	case LINEERR_BADDEVICEID			: return "BadDeviceId"; 
	case LINEERR_BEARERMODEUNAVAIL		: return "BearerModeUnavail"; 
	case LINEERR_CALLUNAVAIL			: return "CallUnavail"; 
	case LINEERR_COMPLETIONOVERRUN		: return "CompletionOverrun"; 
	case LINEERR_CONFERENCEFULL			: return "ConferenceFull"; 
	case LINEERR_DIALBILLING			: return "DialBilling"; 
	case LINEERR_DIALDIALTONE			: return "DialDialtone"; 
	case LINEERR_DIALPROMPT				: return "DialPrompt"; 
	case LINEERR_DIALQUIET				: return "DialQuiet"; 
	case LINEERR_INCOMPATIBLEAPIVERSION	: return "IncompatibleAPIVersion"; 
	case LINEERR_INCOMPATIBLEEXTVERSION	: return "IncompatibleExtVersion"; 
	case LINEERR_INIFILECORRUPT			: return "IniFileCorrupt"; 
	case LINEERR_INUSE					: return "InUse"; 
	case LINEERR_INVALADDRESS			: return "InvalAddress"; 
	case LINEERR_INVALADDRESSID			: return "InvalAddressID"; 
	case LINEERR_INVALADDRESSMODE		: return "InvalAddressMode"; 
	case LINEERR_INVALADDRESSSTATE		: return "InvalAddressState"; 
	case LINEERR_INVALAPPHANDLE			: return "InvalAppHandle"; 
	case LINEERR_INVALAPPNAME			: return "InvalAppName"; 
	case LINEERR_INVALBEARERMODE		: return "InvalBearerMode"; 
	case LINEERR_INVALCALLCOMPLMODE		: return "InvalCallCompMode"; 
	case LINEERR_INVALCALLHANDLE		: return "InvalCallHandle"; 
	case LINEERR_INVALCALLPARAMS		: return "InvalCallParams"; 
	case LINEERR_INVALCALLPRIVILEGE		: return "InvalCallPrivilege"; 
	case LINEERR_INVALCALLSELECT		: return "InvalCallSelect"; 
	case LINEERR_INVALCALLSTATE			: return "InvalCallState"; 
	case LINEERR_INVALCALLSTATELIST		: return "InvalCallStateList"; 
	case LINEERR_INVALCARD				: return "InvalCard"; 
	case LINEERR_INVALCOMPLETIONID		: return "InvalCompletionID"; 
	case LINEERR_INVALCONFCALLHANDLE	: return "InvalConfCallHandle"; 
	case LINEERR_INVALCONSULTCALLHANDLE	: return "InvalConsultCallHandle"; 
	case LINEERR_INVALCOUNTRYCODE		: return "InvalCountryCode"; 
	case LINEERR_INVALDEVICECLASS		: return "InvalDeviceClass"; 
	case LINEERR_INVALDEVICEHANDLE		: return "InvalDeviceHandle"; 
	case LINEERR_INVALDIALPARAMS		: return "InvalDialParams"; 
	case LINEERR_INVALDIGITLIST			: return "InvalDigitList"; 
	case LINEERR_INVALDIGITMODE			: return "InvalDigitMode"; 
	case LINEERR_INVALDIGITS			: return "InvalDigits"; 
	case LINEERR_INVALEXTVERSION		: return "InvalExtVersion"; 
	case LINEERR_INVALGROUPID			: return "InvalGroupID"; 
	case LINEERR_INVALLINEHANDLE		: return "InvalLineHandle"; 
	case LINEERR_INVALLINESTATE			: return "InvalLineState"; 
	case LINEERR_INVALLOCATION			: return "InvalLocation"; 
	case LINEERR_INVALMEDIALIST			: return "InvalMediaList"; 
	case LINEERR_INVALMEDIAMODE			: return "InvalMediaMode"; 
	case LINEERR_INVALMESSAGEID			: return "InvalMessageID"; 
	case LINEERR_INVALPARAM				: return "InvalParam"; 
	case LINEERR_INVALPARKID			: return "InvalParkID"; 
	case LINEERR_INVALPARKMODE			: return "InvalParkMode"; 
	case LINEERR_INVALPOINTER			: return "InvalPointer"; 
	case LINEERR_INVALPRIVSELECT		: return "InvalPrivSelect"; 
	case LINEERR_INVALRATE				: return "InvalRate"; 
	case LINEERR_INVALREQUESTMODE		: return "InvalRequestMode"; 
	case LINEERR_INVALTERMINALID		: return "InvalTerminalID"; 
	case LINEERR_INVALTERMINALMODE		: return "InvalTerminalMode"; 
	case LINEERR_INVALTIMEOUT			: return "InvalTimeout"; 
	case LINEERR_INVALTONE				: return "InvalTone"; 
	case LINEERR_INVALTONELIST			: return "InvalToneList"; 
	case LINEERR_INVALTONEMODE			: return "InvalToneMode"; 
	case LINEERR_INVALTRANSFERMODE		: return "InvalTransferMode"; 
	case LINEERR_LINEMAPPERFAILED		: return "LineMapperFailed"; 
	case LINEERR_NOCONFERENCE			: return "NoConference"; 
	case LINEERR_NODEVICE				: return "NoDevice"; 
	case LINEERR_NODRIVER				: return "NoDriver"; 
	case LINEERR_NOMEM					: return "NoMem"; 
	case LINEERR_NOREQUEST				: return "NoRequest"; 
	case LINEERR_NOTOWNER				: return "NotOwner"; 
	case LINEERR_NOTREGISTERED			: return "NotRegistered"; 
	case LINEERR_OPERATIONFAILED		: return "OperationFailed"; 
	case LINEERR_OPERATIONUNAVAIL		: return "OperationUnavail"; 
	case LINEERR_RATEUNAVAIL			: return "RateUnavail"; 
	case LINEERR_RESOURCEUNAVAIL		: return "ResourceUnavail"; 
	case LINEERR_REQUESTOVERRUN			: return "RequestOverrun"; 
	case LINEERR_STRUCTURETOOSMALL		: return "StructureTooSmall"; 
	case LINEERR_TARGETNOTFOUND			: return "TargetNotFound"; 
	case LINEERR_TARGETSELF				: return "TargetSelf"; 
	case LINEERR_UNINITIALIZED			: return "Uninitialized"; 
	case LINEERR_USERUSERINFOTOOBIG		: return "UserUserInfoTooBig"; 
	case LINEERR_REINIT					: return "ReInit"; 
	case LINEERR_ADDRESSBLOCKED			: return "AddressBlocked"; 
	case LINEERR_BILLINGREJECTED		: return "BillingRejected"; 
	case LINEERR_INVALFEATURE			: return "InvalFeature"; 
	case LINEERR_NOMULTIPLEINSTANCE		: return "NoMultipleInstance"; 
	case LINEERR_INVALAGENTID			: return "InvalAgentID"; 
	case LINEERR_INVALAGENTGROUP		: return "InvalAgentGroup"; 
	case LINEERR_INVALPASSWORD			: return "InvalPassword"; 
	case LINEERR_INVALAGENTSTATE		: return "InvalAgentState"; 
	case LINEERR_INVALAGENTACTIVITY		: return "InvalAgentActivity"; 
	case LINEERR_DIALVOICEDETECT		: return "DialVoiceDetect"; 
	default: return "???"; 
	}; 
} 
 
 
// ---------------------------------------------------------------------------- 
// Describe details about a call state (in English) 
LPCTSTR DescribeCallStateDetail(DWORD nCallState, DWORD nCallStateDetail) 
{ 
	switch(nCallState) { 
	case LINECALLSTATE_BUSY: 
		switch (nCallStateDetail) { 
		case 0: return "0"; 
		case LINEBUSYMODE_STATION: return "Station"; 
		case LINEBUSYMODE_TRUNK:   return "Trunk"; 
		case LINEBUSYMODE_UNKNOWN: return "Unknown"; 
		case LINEBUSYMODE_UNAVAIL: return "Unavailable"; 
		default: return "???"; 
		}; 
 
	case LINECALLSTATE_CONNECTED: 
		switch (nCallStateDetail) { 
		case 0: return "0"; 
		case LINECONNECTEDMODE_ACTIVE: return "Active"; 
		case LINECONNECTEDMODE_INACTIVE: return "Inactive"; 
		case LINECONNECTEDMODE_ACTIVEHELD: return "ActiveHeld"; 
		case LINECONNECTEDMODE_INACTIVEHELD: return "InactiveHeld"; 
		case LINECONNECTEDMODE_CONFIRMED: return "Confirmed"; 
		default: return "???"; 
		}; 
 
	case LINECALLSTATE_DIALTONE: 
		switch (nCallStateDetail) { 
		case 0: return "0"; 
		case LINEDIALTONEMODE_NORMAL: return "Normal"; 
		case LINEDIALTONEMODE_SPECIAL: return "Special"; 
		case LINEDIALTONEMODE_INTERNAL: return "Internal"; 
		case LINEDIALTONEMODE_EXTERNAL: return "External"; 
		case LINEDIALTONEMODE_UNKNOWN: return "Unknown"; 
		case LINEDIALTONEMODE_UNAVAIL: return "Unavailable"; 
		default: return "???"; 
		}; 
 
	case LINECALLSTATE_OFFERING: 
		switch (nCallStateDetail) { 
		case 0: return "0"; 
		case LINEOFFERINGMODE_ACTIVE: return "Active"; 
		case LINEOFFERINGMODE_INACTIVE: return "Inactive"; 
		default: return "???"; 
		}; 
 
	case LINECALLSTATE_SPECIALINFO: 
		switch (nCallStateDetail) { 
		case 0: return "0"; 
		case LINESPECIALINFO_NOCIRCUIT: return "NoCircuit"; 
		case LINESPECIALINFO_CUSTIRREG: return "CustIrreg"; 
		case LINESPECIALINFO_REORDER: return "ReOrder"; 
		case LINESPECIALINFO_UNKNOWN: return "Unknown"; 
		case LINESPECIALINFO_UNAVAIL: return "Unavailable"; 
		default: return "???"; 
		}; 
 
	case LINECALLSTATE_DISCONNECTED: 
		switch (nCallStateDetail) { 
		case 0: return "0"; 
		case LINEDISCONNECTMODE_NORMAL: return "Normal"; 
		case LINEDISCONNECTMODE_UNKNOWN: return "Unknown"; 
		case LINEDISCONNECTMODE_REJECT: return "Reject"; 
		case LINEDISCONNECTMODE_PICKUP: return "Pickup"; 
		case LINEDISCONNECTMODE_FORWARDED: return "Forwarded"; 
		case LINEDISCONNECTMODE_BUSY: return "Busy"; 
		case LINEDISCONNECTMODE_NOANSWER: return "NoAnswer"; 
		case LINEDISCONNECTMODE_BADADDRESS: return "BadAddress"; 
		case LINEDISCONNECTMODE_UNREACHABLE: return "Unreachable"; 
		case LINEDISCONNECTMODE_CONGESTION: return "Congestion"; 
		case LINEDISCONNECTMODE_INCOMPATIBLE: return "Incompatible"; 
		case LINEDISCONNECTMODE_UNAVAIL: return "Unavailable"; 
		case LINEDISCONNECTMODE_NODIALTONE: return "NoDialTone"; 
		case LINEDISCONNECTMODE_NUMBERCHANGED: return "NumberChanged"; 
		case LINEDISCONNECTMODE_OUTOFORDER: return "OutOfOrder"; 
		case LINEDISCONNECTMODE_TEMPFAILURE: return "TempFailure"; 
		case LINEDISCONNECTMODE_QOSUNAVAIL: return "QOSUnavail"; 
		case LINEDISCONNECTMODE_BLOCKED: return "Blocked"; 
		case LINEDISCONNECTMODE_DONOTDISTURB: return "DoNotDisturb"; 
		case LINEDISCONNECTMODE_CANCELLED: return "Cancelled"; 
		default: return "???"; 
		}; 
 
	default: 
		return ""; 
	}; 
} 
 
// ---------------------------------------------------------------------------- 
// Describe a call state (in English) 
LPCTSTR DescribeCallState(CString& result, DWORD CallState) 
{ 
	result.Empty(); 
	if (CallState == 0) result += "None"; 
	if (CallState & LINECALLSTATE_IDLE) result += "Idle "; 
	if (CallState & LINECALLSTATE_OFFERING) result += "Offering "; 
	if (CallState & LINECALLSTATE_ACCEPTED) result += "Accepted "; 
	if (CallState & LINECALLSTATE_DIALTONE) result += "DialTone "; 
	if (CallState & LINECALLSTATE_DIALING) result += "Dialing "; 
	if (CallState & LINECALLSTATE_RINGBACK) result += "RingBack "; 
	if (CallState & LINECALLSTATE_BUSY) result += "Busy "; 
	if (CallState & LINECALLSTATE_SPECIALINFO) result += "SpecialInfo "; 
	if (CallState & LINECALLSTATE_CONNECTED) result += "Connected "; 
	if (CallState & LINECALLSTATE_PROCEEDING) result += "Proceeding "; 
	if (CallState & LINECALLSTATE_ONHOLD) result += "Held "; 
	if (CallState & LINECALLSTATE_CONFERENCED) result += "Conferenced "; 
	if (CallState & LINECALLSTATE_ONHOLDPENDCONF) result += "HoldPendingConference "; 
	if (CallState & LINECALLSTATE_ONHOLDPENDTRANSFER) result += "HoldPendingTransfer "; 
	if (CallState & LINECALLSTATE_DISCONNECTED) result += "Disconnected "; 
	if (CallState & LINECALLSTATE_UNKNOWN) result += "Unknown "; 
	if (result.IsEmpty()) result += "??? "; 
	return LPCTSTR(result); 
} 
 
// ---------------------------------------------------------------------------- 
// Describe a call privilege level (in English) 
LPCTSTR DescribePrivilege(CString &result, DWORD nPrivilege) 
{ 
	result.Empty(); 
	if (nPrivilege == 0) result += "SamePrivilege"; 
	if (nPrivilege & LINECALLPRIVILEGE_NONE) result += "NoPrivilege "; 
	if (nPrivilege & LINECALLPRIVILEGE_MONITOR) result += "Monitor "; 
	if (nPrivilege & LINECALLPRIVILEGE_OWNER) result += "Owner "; 
	if (result.IsEmpty()) result += "??? "; 
	return LPCTSTR(result); 
} 
 
 
// ---------------------------------------------------------------------------- 
// Describe details about a device state (in English) 
LPCTSTR DescribeDeviceStatus(CString &result, DWORD DeviceState) 
{ 
	result.Empty(); 
	if (DeviceState == 0) result += "None"; 
	if (DeviceState & LINEDEVSTATE_OTHER) result += "Other "; 
	if (DeviceState & LINEDEVSTATE_RINGING) result += "Ringing "; 
	if (DeviceState & LINEDEVSTATE_CONNECTED) result += "Connected "; 
	if (DeviceState & LINEDEVSTATE_DISCONNECTED) result += "Disconnected "; 
	if (DeviceState & LINEDEVSTATE_MSGWAITON) result += "MsgWaitOn "; 
	if (DeviceState & LINEDEVSTATE_MSGWAITOFF) result += "MsgWaitOff "; 
	if (DeviceState & LINEDEVSTATE_NUMCOMPLETIONS) result += "NumCompletions "; 
	if (DeviceState & LINEDEVSTATE_INSERVICE) result += "InService "; 
	if (DeviceState & LINEDEVSTATE_OUTOFSERVICE) result += "OutOfService "; 
	if (DeviceState & LINEDEVSTATE_MAINTENANCE) result += "Maintenance "; 
	if (DeviceState & LINEDEVSTATE_OPEN) result += "Open "; 
	if (DeviceState & LINEDEVSTATE_CLOSE) result += "Close "; 
	if (DeviceState & LINEDEVSTATE_NUMCALLS) result += "NumCalls "; 
	if (DeviceState & LINEDEVSTATE_TERMINALS) result += "Terminals "; 
	if (DeviceState & LINEDEVSTATE_ROAMMODE) result += "RoamMode "; 
	if (DeviceState & LINEDEVSTATE_BATTERY) result += "Battery "; 
	if (DeviceState & LINEDEVSTATE_SIGNAL) result += "Signal "; 
	if (DeviceState & LINEDEVSTATE_DEVSPECIFIC) result += "DevSpecific "; 
	if (DeviceState & LINEDEVSTATE_REINIT) result += "ReInit "; 
	if (DeviceState & LINEDEVSTATE_LOCK) result += "Lock "; 
	if (DeviceState & LINEDEVSTATE_CAPSCHANGE) result += "CapsChange "; 
	if (DeviceState & LINEDEVSTATE_CONFIGCHANGE) result += "ConfigChange "; 
	if (DeviceState & LINEDEVSTATE_TRANSLATECHANGE) result += "TranslateChange "; 
	if (DeviceState & LINEDEVSTATE_COMPLCANCEL) result += "ComplCancel "; 
	if (DeviceState & LINEDEVSTATE_REMOVED) result += "Removed "; 
	if (result.IsEmpty()) result += "??? "; 
	return LPCTSTR(result); 
} 
 
 
// ---------------------------------------------------------------------------- 
// Describe details about an address state (in English) 
LPCTSTR DescribeAddressStatus(CString &result, DWORD AddressState) 
{ 
	result.Empty(); 
	if (AddressState == 0) result += "None"; 
	if (AddressState & LINEADDRESSSTATE_OTHER) result += "Other "; 
	if (AddressState & LINEADDRESSSTATE_DEVSPECIFIC) result += "DeviceSpecific "; 
	if (AddressState & LINEADDRESSSTATE_INUSEZERO) result += "InUseZero "; // Address is idle 
	if (AddressState & LINEADDRESSSTATE_INUSEONE) result += "InUseOne "; 
	if (AddressState & LINEADDRESSSTATE_INUSEMANY) result += "InUseMany "; 
	if (AddressState & LINEADDRESSSTATE_NUMCALLS) result += "NumCalls "; 
	if (AddressState & LINEADDRESSSTATE_FORWARD) result += "Forward "; 
	if (AddressState & LINEADDRESSSTATE_TERMINALS) result += "Terminals "; 
	if (AddressState & LINEADDRESSSTATE_CAPSCHANGE) result += "CapsChange "; 
	if (result.IsEmpty()) result += "??? "; 
	return LPCTSTR(result); 
} 
 
// ---------------------------------------------------------------------------- 
// Describe details about call information (in English) 
LPCTSTR DescribeCallInfo(CString &result, DWORD CallInfoState) 
{ 
	result.Empty(); 
	if (CallInfoState == 0) result += "None"; 
	if (CallInfoState & LINECALLINFOSTATE_OTHER) result += "Other "; 
	if (CallInfoState & LINECALLINFOSTATE_DEVSPECIFIC) result += "DevSpecific "; 
	if (CallInfoState & LINECALLINFOSTATE_BEARERMODE) result += "BearerMode "; 
	if (CallInfoState & LINECALLINFOSTATE_RATE) result += "Rate "; 
	if (CallInfoState & LINECALLINFOSTATE_MEDIAMODE) result += "MediaMode "; 
	if (CallInfoState & LINECALLINFOSTATE_APPSPECIFIC) result += "AppSpecific "; 
	if (CallInfoState & LINECALLINFOSTATE_CALLID) result += "CallID "; 
	if (CallInfoState & LINECALLINFOSTATE_RELATEDCALLID) result += "RelatedCallID "; 
	if (CallInfoState & LINECALLINFOSTATE_ORIGIN) result += "Origin "; 
	if (CallInfoState & LINECALLINFOSTATE_REASON) result += "Reason "; 
	if (CallInfoState & LINECALLINFOSTATE_COMPLETIONID) result += "CompletionID "; 
	if (CallInfoState & LINECALLINFOSTATE_NUMOWNERINCR) result += "NumOwnerIncr "; 
	if (CallInfoState & LINECALLINFOSTATE_NUMOWNERDECR) result += "NumOwnerDecr "; 
	if (CallInfoState & LINECALLINFOSTATE_NUMMONITORS) result += "NumMonitors "; 
	if (CallInfoState & LINECALLINFOSTATE_TRUNK) result += "Trunk "; 
	if (CallInfoState & LINECALLINFOSTATE_CALLERID) result += "CallerID "; 
	if (CallInfoState & LINECALLINFOSTATE_CALLEDID) result += "CalledID "; 
	if (CallInfoState & LINECALLINFOSTATE_CONNECTEDID) result += "ConnectedID "; 
	if (CallInfoState & LINECALLINFOSTATE_REDIRECTIONID) result += "RedirectionID "; 
	if (CallInfoState & LINECALLINFOSTATE_REDIRECTINGID) result += "RedirectingID "; 
	if (CallInfoState & LINECALLINFOSTATE_DISPLAY) result += "Display "; 
	if (CallInfoState & LINECALLINFOSTATE_USERUSERINFO) result += "UserUserInfo "; 
	if (CallInfoState & LINECALLINFOSTATE_HIGHLEVELCOMP) result += "HighLevelComp "; 
	if (CallInfoState & LINECALLINFOSTATE_LOWLEVELCOMP) result += "LowLevelComp "; 
	if (CallInfoState & LINECALLINFOSTATE_CHARGINGINFO) result += "ChargingInfo "; 
	if (CallInfoState & LINECALLINFOSTATE_TERMINAL) result += "Terminal "; 
	if (CallInfoState & LINECALLINFOSTATE_DIALPARAMS) result += "DialParams "; 
	if (CallInfoState & LINECALLINFOSTATE_MONITORMODES) result += "MonitorModes "; 
	if (CallInfoState & LINECALLINFOSTATE_TREATMENT) result += "Treatment "; 
	if (CallInfoState & LINECALLINFOSTATE_QOS) result += "QOS "; 
	if (CallInfoState & LINECALLINFOSTATE_CALLDATA) result += "CallData "; 
	if (result.IsEmpty()) result += "??? "; 
	return LPCTSTR(result); 
} 
 
 
// ---------------------------------------------------------------------------- 
// Why was the call made? 
LPCTSTR DescribeCallReason(CString& result, DWORD CallReason) 
{ 
	result.Empty(); 
	if (CallReason == 0) result += "None"; 
	if (CallReason & LINECALLREASON_DIRECT) result += "Direct "; 
	if (CallReason & LINECALLREASON_FWDBUSY) result += "FwdBusy "; 
	if (CallReason & LINECALLREASON_FWDNOANSWER) result += "FwdNoAnswer "; 
	if (CallReason & LINECALLREASON_FWDUNCOND) result += "FwdUncond "; 
	if (CallReason & LINECALLREASON_PICKUP) result += "PickUp "; 
	if (CallReason & LINECALLREASON_UNPARK) result += "UnPark "; 
	if (CallReason & LINECALLREASON_REDIRECT) result += "Redirect "; 
	if (CallReason & LINECALLREASON_CALLCOMPLETION) result += "CallCompletion "; 
	if (CallReason & LINECALLREASON_TRANSFER) result += "Transfer "; 
	if (CallReason & LINECALLREASON_REMINDER) result += "Reminder "; 
	if (CallReason & LINECALLREASON_UNKNOWN) result += "Unknown "; 
	if (CallReason & LINECALLREASON_UNAVAIL) result += "Unavail "; 
	if (CallReason & LINECALLREASON_INTRUDE) result += "Intrude "; 
	if (CallReason & LINECALLREASON_PARKED) result += "Parked "; 
	if (CallReason & LINECALLREASON_CAMPEDON) result += "CampedOn "; 
	if (CallReason & LINECALLREASON_ROUTEREQUEST) result += "RouteRequest "; 
	if (result.IsEmpty()) result += "??? "; 
	return LPCTSTR(result); 
} 
 
// ---------------------------------------------------------------------------- 
// Where was the call from? 
LPCTSTR DescribeCallOrigin(CString& result, DWORD CallOrigin) 
{ 
	result.Empty(); 
	if (CallOrigin == 0) result += "None"; 
	if (CallOrigin & LINECALLORIGIN_INBOUND) result += "Inbound "; 
	if (CallOrigin & LINECALLORIGIN_OUTBOUND) result += "Outbound "; 
	if (CallOrigin & LINECALLORIGIN_INTERNAL) result += "Internal "; 
	if (CallOrigin & LINECALLORIGIN_EXTERNAL) result += "External "; 
	if (CallOrigin & LINECALLORIGIN_UNKNOWN) result += "Unknown "; 
	if (CallOrigin & LINECALLORIGIN_UNAVAIL) result += "Unavail "; 
	if (CallOrigin & LINECALLORIGIN_CONFERENCE) result += "Conference "; 
	if (result.IsEmpty()) result += "???"; 
	return LPCTSTR(result); 
} 
 
// ---------------------------------------------------------------------------- 
// Describe details about a device state (in English) 
LPCTSTR DescribeCallCompletion(CString &result, DWORD CallCompletion) 
{ 
	result.Empty(); 
	if (CallCompletion == 0) result += "None"; 
	if (CallCompletion & LINECALLCOMPLMODE_CAMPON) result += "CampOn "; 
	if (CallCompletion & LINECALLCOMPLMODE_CALLBACK) result += "CallBack "; 
	if (CallCompletion & LINECALLCOMPLMODE_INTRUDE) result += "Intrude "; 
	if (CallCompletion & LINECALLCOMPLMODE_MESSAGE) result += "Message "; 
	if (result.IsEmpty()) result += "???"; 
	return LPCTSTR(result); 
} 
 
// ---------------------------------------------------------------------------- 
// Describe capabilities of an address on a line 
LPCTSTR DescribeAddressCapabilities(CString &result, DWORD AddressCaps) 
{ 
	result.Empty(); 
	if (AddressCaps == 0) result += "None"; 
	if (AddressCaps & LINEADDRCAPFLAGS_FWDNUMRINGS) result += "FwdNumRings "; 
	if (AddressCaps & LINEADDRCAPFLAGS_PICKUPGROUPID) result += "PickupGroupID "; 
	if (AddressCaps & LINEADDRCAPFLAGS_SECURE) result += "Secure "; 
	if (AddressCaps & LINEADDRCAPFLAGS_BLOCKIDDEFAULT) result += "BlockIDDefault "; 
	if (AddressCaps & LINEADDRCAPFLAGS_BLOCKIDOVERRIDE) result += "BlockIDOverride "; 
	if (AddressCaps & LINEADDRCAPFLAGS_DIALED) result += "Dialed "; 
	if (AddressCaps & LINEADDRCAPFLAGS_ORIGOFFHOOK) result += "OrigOffHook "; 
	if (AddressCaps & LINEADDRCAPFLAGS_DESTOFFHOOK) result += "DeskOffHook "; 
	if (AddressCaps & LINEADDRCAPFLAGS_FWDCONSULT) result += "FwdConsult "; 
	if (AddressCaps & LINEADDRCAPFLAGS_SETUPCONFNULL) result += "SetupConfNull "; 
	if (AddressCaps & LINEADDRCAPFLAGS_AUTORECONNECT) result += "AutoReconnect "; 
	if (AddressCaps & LINEADDRCAPFLAGS_COMPLETIONID) result += "CompletionID "; 
	if (AddressCaps & LINEADDRCAPFLAGS_TRANSFERHELD) result += "TransferHeld "; 
	if (AddressCaps & LINEADDRCAPFLAGS_TRANSFERMAKE) result += "TransferMake "; 
	if (AddressCaps & LINEADDRCAPFLAGS_CONFERENCEHELD) result += "ConferenceHeld "; 
	if (AddressCaps & LINEADDRCAPFLAGS_CONFERENCEMAKE) result += "ConferenceMake "; 
	if (AddressCaps & LINEADDRCAPFLAGS_PARTIALDIAL) result += "PartialDial "; 
	if (AddressCaps & LINEADDRCAPFLAGS_FWDSTATUSVALID) result += "FwdStatusValid "; 
	if (AddressCaps & LINEADDRCAPFLAGS_FWDINTEXTADDR) result += "FwdIntExtAddr "; 
	if (AddressCaps & LINEADDRCAPFLAGS_FWDBUSYNAADDR) result += "FwdBusyNAAddr "; 
	if (AddressCaps & LINEADDRCAPFLAGS_ACCEPTTOALERT) result += "AcceptToAlert "; 
	if (AddressCaps & LINEADDRCAPFLAGS_CONFDROP) result += "ConfDrop "; 
	if (AddressCaps & LINEADDRCAPFLAGS_PICKUPCALLWAIT) result += "PickupCallWait "; 
	if (AddressCaps & LINEADDRCAPFLAGS_PREDICTIVEDIALER) result += "PredictiveDialer "; 
	if (AddressCaps & LINEADDRCAPFLAGS_QUEUE) result += "Queue "; 
	if (AddressCaps & LINEADDRCAPFLAGS_ROUTEPOINT) result += "RoutePoint "; 
	if (AddressCaps & LINEADDRCAPFLAGS_HOLDMAKESNEW) result += "HoldMakesNew "; 
	if (AddressCaps & LINEADDRCAPFLAGS_NOINTERNALCALLS) result += "NoInternalCalls "; 
	if (AddressCaps & LINEADDRCAPFLAGS_NOEXTERNALCALLS) result += "NoExternalCalls "; 
	if (AddressCaps & LINEADDRCAPFLAGS_SETCALLINGID) result += "SetCallingID "; 
	if (result.IsEmpty()) result += "???"; 
	return LPCTSTR(result); 
} 
 
// ---------------------------------------------------------------------------- 
// Describe capabilities of an address on a line 
LPCTSTR DescribeCallFeatures(CString &result, DWORD CallFeatures) 
{ 
	result.Empty(); 
	if (CallFeatures == 0) result += "None"; 
	if (CallFeatures & LINECALLFEATURE_ACCEPT) result += "Accept "; 
	if (CallFeatures & LINECALLFEATURE_ADDTOCONF) result += "AddToConf "; 
	if (CallFeatures & LINECALLFEATURE_ANSWER) result += "Answer "; 
	if (CallFeatures & LINECALLFEATURE_BLINDTRANSFER) result += "BlindTransfer "; 
	if (CallFeatures & LINECALLFEATURE_COMPLETECALL) result += "CompleteCall "; 
	if (CallFeatures & LINECALLFEATURE_COMPLETETRANSF) result += "CompleteTransf "; 
	if (CallFeatures & LINECALLFEATURE_DIAL) result += "Dial "; 
	if (CallFeatures & LINECALLFEATURE_DROP) result += "Drop "; 
	if (CallFeatures & LINECALLFEATURE_GATHERDIGITS) result += "GatherDigits "; 
	if (CallFeatures & LINECALLFEATURE_GENERATEDIGITS) result += "GenerateDigits "; 
	if (CallFeatures & LINECALLFEATURE_GENERATETONE) result += "GenerateTone "; 
	if (CallFeatures & LINECALLFEATURE_HOLD) result += "Hold "; 
	if (CallFeatures & LINECALLFEATURE_MONITORDIGITS) result += "MonitorDigits "; 
	if (CallFeatures & LINECALLFEATURE_MONITORMEDIA) result += "MonitorMedia "; 
	if (CallFeatures & LINECALLFEATURE_MONITORTONES) result += "MonitorTones "; 
	if (CallFeatures & LINECALLFEATURE_PARK) result += "Park "; 
	if (CallFeatures & LINECALLFEATURE_PREPAREADDCONF) result += "PrepareAddConf "; 
	if (CallFeatures & LINECALLFEATURE_REDIRECT) result += "Redirect "; 
	if (CallFeatures & LINECALLFEATURE_REMOVEFROMCONF) result += "RemoveFromConf "; 
	if (CallFeatures & LINECALLFEATURE_SECURECALL) result += "SecureCall "; 
	if (CallFeatures & LINECALLFEATURE_SENDUSERUSER) result += "SendUserUser "; 
	if (CallFeatures & LINECALLFEATURE_SETCALLPARAMS) result += "SetCallParams "; 
	if (CallFeatures & LINECALLFEATURE_SETMEDIACONTROL) result += "SetMediaControl "; 
	if (CallFeatures & LINECALLFEATURE_SETTERMINAL) result += "SetTerminal "; 
	if (CallFeatures & LINECALLFEATURE_SETUPCONF) result += "SetupConf "; 
	if (CallFeatures & LINECALLFEATURE_SETUPTRANSFER) result += "SetupTransfer "; 
	if (CallFeatures & LINECALLFEATURE_SWAPHOLD) result += "SwapHold "; 
	if (CallFeatures & LINECALLFEATURE_UNHOLD) result += "Unhold "; 
	if (CallFeatures & LINECALLFEATURE_RELEASEUSERUSERINFO) result += "ReleaseUserUserInfo "; 
	if (CallFeatures & LINECALLFEATURE_SETTREATMENT) result += "SetTreatment "; 
	if (CallFeatures & LINECALLFEATURE_SETQOS) result += "SetQOS "; 
	if (CallFeatures & LINECALLFEATURE_SETCALLDATA) result += "SetCallData "; 
	if (result.IsEmpty()) result += "???"; 
	return LPCTSTR(result); 
} 
 
// ---------------------------------------------------------------------------- 
// Describe capabilities of an address on a line 
LPCTSTR DescribeCallFeatures2(CString &result, DWORD CallFeatures2) 
{ 
	result.Empty(); 
	if (CallFeatures2 == 0) result += " "; // Don't mess up the string 
	if (CallFeatures2 & LINECALLFEATURE2_NOHOLDCONFERENCE) result += "NoHoldConference "; 
	if (CallFeatures2 & LINECALLFEATURE2_ONESTEPTRANSFER) result += "OneStepTransfer "; 
	if (CallFeatures2 & LINECALLFEATURE2_COMPLCAMPON) result += "ComplCampOn "; 
	if (CallFeatures2 & LINECALLFEATURE2_COMPLCALLBACK) result += "ComplCallBack "; 
	if (CallFeatures2 & LINECALLFEATURE2_COMPLINTRUDE) result += "ComplIntrude "; 
	if (CallFeatures2 & LINECALLFEATURE2_COMPLMESSAGE) result += "ComplMessage "; 
	if (CallFeatures2 & LINECALLFEATURE2_TRANSFERNORM) result += "TransferNorm "; 
	if (CallFeatures2 & LINECALLFEATURE2_TRANSFERCONF) result += "TransferConf "; 
	if (CallFeatures2 & LINECALLFEATURE2_PARKDIRECT) result += "ParkDirect "; 
	if (CallFeatures2 & LINECALLFEATURE2_PARKNONDIRECT) result += "ParkNonDirect "; 
	if (result.IsEmpty()) result += "???"; 
	return LPCTSTR(result); 
}