[thirdparty-commits] rmudgett: mISDNuser/trunk r28 - /mISDNuser/trunk/suppserv/

SVN commits to the Digium third-party software repository thirdparty-commits at lists.digium.com
Tue Nov 11 11:57:07 CST 2008


Author: rmudgett
Date: Tue Nov 11 11:57:06 2008
New Revision: 28

URL: http://svn.digium.com/view/thirdparty?view=rev&rev=28
Log:
Added ECT facility message support

Added:
    mISDNuser/trunk/suppserv/asn1_ect.c   (with props)
    mISDNuser/trunk/suppserv/asn1_ect.h   (with props)
Modified:
    mISDNuser/trunk/suppserv/Makefile
    mISDNuser/trunk/suppserv/asn1.h
    mISDNuser/trunk/suppserv/asn1_ccbs.c
    mISDNuser/trunk/suppserv/asn1_comp.c
    mISDNuser/trunk/suppserv/fac.c
    mISDNuser/trunk/suppserv/suppserv.h

Modified: mISDNuser/trunk/suppserv/Makefile
URL: http://svn.digium.com/view/thirdparty/mISDNuser/trunk/suppserv/Makefile?view=diff&rev=28&r1=27&r2=28
==============================================================================
--- mISDNuser/trunk/suppserv/Makefile (original)
+++ mISDNuser/trunk/suppserv/Makefile Tue Nov 11 11:57:06 2008
@@ -4,7 +4,19 @@
 
 #CFLAGS += -DASN1_DEBUG
 
-SUPPSERV_OBJ = asn1.o asn1_enc.o asn1_generic.o asn1_aoc.o asn1_basic_service.o asn1_comp.o asn1_ccbs.o asn1_diversion.o asn1_address.o fac.o
+SUPPSERV_OBJ = \
+	asn1.o \
+	asn1_address.o \
+	asn1_aoc.o \
+	asn1_basic_service.o \
+	asn1_ccbs.o \
+	asn1_comp.o \
+	asn1_diversion.o \
+	asn1_ect.o \
+	asn1_enc.o \
+	asn1_generic.o \
+	fac.o
+
 SUPPSERV_PICOBJ = $(SUPPSERV_OBJ:%.o=%.lo)
 
 all: libsuppserv.a libsuppserv_pic.a libsuppserv.so

Modified: mISDNuser/trunk/suppserv/asn1.h
URL: http://svn.digium.com/view/thirdparty/mISDNuser/trunk/suppserv/asn1.h?view=diff&rev=28&r1=27&r2=28
==============================================================================
--- mISDNuser/trunk/suppserv/asn1.h (original)
+++ mISDNuser/trunk/suppserv/asn1.h Tue Nov 11 11:57:06 2008
@@ -106,6 +106,12 @@
 		/* CCNR support */
 		struct FacCCBSRequest_ARG CCNRRequest;
 		struct FacCCBSInterrogate_ARG CCNRInterrogate;
+
+		/* ECT support */
+		struct FacExplicitEctExecute ExplicitEctExecute;
+		struct FacSubaddressTransfer SubaddressTransfer;
+		struct FacEctInform EctInform;
+		struct FacEctLoopTest_ARG EctLoopTest;
 	} o;
 };
 
@@ -129,6 +135,10 @@
 		/* CCNR support */
 		struct FacCCBSRequest_RES CCNRRequest;
 		struct FacCCBSInterrogate_RES CCNRInterrogate;
+
+		/* ECT support */
+		struct FacEctLinkIdRequest_RES EctLinkIdRequest;
+		struct FacEctLoopTest_RES EctLoopTest;
 	} o;
 };
 
@@ -254,6 +264,7 @@
 					} \
 				} \
 			} else if ((the_tag) & ASN1_TAG_EXPLICIT) { \
+				/* EXPLICIT tags are always constructed */ \
 				if ((u_char) (((the_tag) & 0xff) | (((act_tag) & ASN1_TAG_TYPE_MASK) | ASN1_TAG_CONSTRUCTED)) == *p) { \
 					int xtag, xlen; \
 					CallASN1(ret, p, end, ParseTag(p, end, &xtag)); \
@@ -297,6 +308,11 @@
 			if ((act_tag) == tag) { \
 				return todo(pc, beg, end, arg1); \
 			} \
+		} else if ((act_tag) & ASN1_TAG_EXPLICIT) { \
+			/* EXPLICIT tags are always constructed */ \
+			if (((the_tag) | (((act_tag) & ASN1_TAG_TYPE_MASK) | ASN1_TAG_CONSTRUCTED)) == tag) { \
+				return todo(pc, p, end, arg1); \
+			} \
 		} else { \
 			if (((the_tag) | ((act_tag) & (ASN1_TAG_TYPE_MASK | ASN1_TAG_CONSTRUCTED))) == tag) { \
 				return todo(pc, beg, end, arg1); \
@@ -336,6 +352,8 @@
 __u8 *encodeComponent_Head_Long_u8(__u8 *p, enum asn1ComponentTag componentTag);
 int encodeComponent_Length(__u8 *msg, __u8 *end);
 int encodeComponent_Length_Long_u8(__u8 *msg, __u8 *p);
+
+__u8 *encodeComponentInvoke_Head(__u8 *Dest, int InvokeID, enum FacFunction OperationValue);
 
 int encodeOperationValue(__u8 *dest, int operationValue);
 int encodeErrorValue(__u8 *dest, int errorValue);
@@ -359,6 +377,12 @@
 int encodeIA5String(__u8 *dest, __u8 tagType, const __s8 *str, __u8 len);
 int encodeOid(__u8 *dest, __u8 tagType, const struct asn1Oid *oid);
 
+int encodePartyNumber_Full(__u8 *Dest, const struct FacPartyNumber *PartyNumber);
+int encodePartySubaddress_Full(__u8 *Dest, const struct FacPartySubaddress *PartySubaddress);
+int encodeAddress_Full(__u8 *Dest, const struct FacAddress *Address);
+int encodePresentedNumberUnscreened_Full(__u8 *Dest, const struct FacPresentedNumberUnscreened *Presented);
+
+
 int encodePublicPartyNumber(__u8 *dest, __s8 *facilityPartyNumber);
 int encodePartyNumber(__u8 *dest, __s8 *facilityPartyNumber);
 int encodeServedUserNumber(__u8 *dest, __s8 *servedUserNumber);
@@ -381,6 +405,12 @@
 int ParseNumericString(struct asn1_parm *pc, u_char *p, u_char *end, struct asn1ParseString *str);
 int ParseOctetString(struct asn1_parm *pc, u_char *p, u_char *end, struct asn1ParseString *str);
 int ParseOid(struct asn1_parm *pc, u_char *p, u_char *end, struct asn1Oid *oid);
+
+int ParsePartyNumber_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPartyNumber *PartyNumber);
+int ParsePartySubaddress_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPartySubaddress *PartySubaddress);
+int ParseAddress_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacAddress *Address);
+int ParsePresentedNumberUnscreened_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPresentedNumberUnscreened *Presented);
+
 
 int ParseARGReqCallDeflection(struct asn1_parm *pc, u_char *p, u_char *end, struct ReqCallDeflection *reqCD);
 int ParseARGActivationStatusNotificationDiv(struct asn1_parm *pc, u_char *p, u_char *end, struct ActDivNotification *actNot);

Modified: mISDNuser/trunk/suppserv/asn1_ccbs.c
URL: http://svn.digium.com/view/thirdparty/mISDNuser/trunk/suppserv/asn1_ccbs.c?view=diff&rev=28&r1=27&r2=28
==============================================================================
--- mISDNuser/trunk/suppserv/asn1_ccbs.c (original)
+++ mISDNuser/trunk/suppserv/asn1_ccbs.c Tue Nov 11 11:57:06 2008
@@ -246,7 +246,6 @@
 
 /* ******************************************************************* */
 /*!
- * \internal
  * \brief Encode the PartyNumber type.
  *
  * \param Dest Where to put the encoding
@@ -254,7 +253,7 @@
  *
  * \retval length
  */
-static int encodePartyNumber_Full(__u8 *Dest, const struct FacPartyNumber *PartyNumber)
+int encodePartyNumber_Full(__u8 *Dest, const struct FacPartyNumber *PartyNumber)
 {
 	int Length;
 
@@ -297,7 +296,6 @@
 
 /* ******************************************************************* */
 /*!
- * \internal
  * \brief Parse the PartyNumber argument parameters.
  *
  * \param pc Complete component message storage data.
@@ -308,7 +306,7 @@
  * \retval length of buffer consumed
  * \retval -1 on error.
  */
-static int ParsePartyNumber_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPartyNumber *PartyNumber)
+int ParsePartyNumber_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPartyNumber *PartyNumber)
 {
 	INIT;
 
@@ -430,7 +428,6 @@
 
 /* ******************************************************************* */
 /*!
- * \internal
  * \brief Encode the PartySubaddress type.
  *
  * \param Dest Where to put the encoding
@@ -438,7 +435,7 @@
  *
  * \retval length
  */
-static int encodePartySubaddress_Full(__u8 *Dest, const struct FacPartySubaddress *PartySubaddress)
+int encodePartySubaddress_Full(__u8 *Dest, const struct FacPartySubaddress *PartySubaddress)
 {
 	__u8 *p;
 	int Length;
@@ -473,7 +470,6 @@
 
 /* ******************************************************************* */
 /*!
- * \internal
  * \brief Parse the PartySubaddress argument parameters.
  *
  * \param pc Complete component message storage data.
@@ -484,7 +480,7 @@
  * \retval length of buffer consumed
  * \retval -1 on error.
  */
-static int ParsePartySubaddress_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPartySubaddress *PartySubaddress)
+int ParsePartySubaddress_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPartySubaddress *PartySubaddress)
 {
 	INIT;
 
@@ -499,7 +495,6 @@
 
 /* ******************************************************************* */
 /*!
- * \internal
  * \brief Encode the Address type.
  *
  * \param Dest Where to put the encoding
@@ -507,7 +502,7 @@
  *
  * \retval length
  */
-static int encodeAddress_Full(__u8 *Dest, const struct FacAddress *Address)
+int encodeAddress_Full(__u8 *Dest, const struct FacAddress *Address)
 {
 	__u8 *p;
 
@@ -529,7 +524,6 @@
 
 /* ******************************************************************* */
 /*!
- * \internal
  * \brief Parse the Address argument parameters.
  *
  * \param pc Complete component message storage data.
@@ -540,7 +534,7 @@
  * \retval length of buffer consumed
  * \retval -1 on error.
  */
-static int ParseAddress_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacAddress *Address)
+int ParseAddress_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacAddress *Address)
 {
 	INIT;
 
@@ -692,7 +686,6 @@
 
 /* ******************************************************************* */
 /*!
- * \internal
  * \brief Encode the common invoke component beginning
  *
  * \param Dest Where to put the encoding
@@ -701,7 +694,7 @@
  *
  * \return Position for the next octet in the message
  */
-static __u8 *encodeComponentInvoke_Head(__u8 *Dest, int InvokeID, enum FacFunction OperationValue)
+__u8 *encodeComponentInvoke_Head(__u8 *Dest, int InvokeID, enum FacFunction OperationValue)
 {
 	__u8 *p;
 

Modified: mISDNuser/trunk/suppserv/asn1_comp.c
URL: http://svn.digium.com/view/thirdparty/mISDNuser/trunk/suppserv/asn1_comp.c?view=diff&rev=28&r1=27&r2=28
==============================================================================
--- mISDNuser/trunk/suppserv/asn1_comp.c (original)
+++ mISDNuser/trunk/suppserv/asn1_comp.c Tue Nov 11 11:57:06 2008
@@ -4,6 +4,7 @@
 
 #include "asn1.h"
 #include "asn1_ccbs.h"
+#include "asn1_ect.h"
 #include <stdio.h>
 #include <string.h>
 
@@ -27,6 +28,9 @@
 
 	/* {itu-t(0) identified-organization(4) etsi(0) 196 status-request-procedure(9)} */
 	{ FacOIDBase_StatusRequest,	{ 4, { 4, 0, 196, 9 } } },
+
+	/* {ccitt(0) identified-organization(4) etsi(0) 369 operations-and-errors(1)} */
+	{ FacOIDBase_ECT,			{ 4, { 4, 0, 369, 1 } } },
 /* *INDENT-ON* */
 };
 
@@ -131,6 +135,7 @@
 	pc->u.inv.operationValue = operationValue;
 
 	switch (operationValue) {
+	/* Diversion support */
 #if 0
 	case Fac_ActivationDiversion:
 		XSEQUENCE(ParseARGActivationDiversion, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED);
@@ -160,6 +165,30 @@
 	case Fac_InterrogateServedUserNumbers:
 		XSEQUENCE(ParseARGInterrogateServedUserNumbers, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED);
 		break;
+#endif
+
+	/* ECT support */
+	case Fac_EctExecute:
+		break;
+	case Fac_ExplicitEctExecute:
+		XSEQUENCE_1(ParseExplicitEctExecute_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.ExplicitEctExecute);
+		break;
+	case Fac_RequestSubaddress:
+		break;
+	case Fac_SubaddressTransfer:
+		XSEQUENCE_1(ParseSubaddressTransfer_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.SubaddressTransfer);
+		break;
+	case Fac_EctLinkIdRequest:
+		break;
+	case Fac_EctInform:
+		XSEQUENCE_1(ParseEctInform_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.EctInform);
+		break;
+	case Fac_EctLoopTest:
+		XSEQUENCE_1(ParseEctLoopTest_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.EctLoopTest);
+		break;
+
+	/* AOC support */
+#if 0
 	//case Fac_ChargingRequest:
 	//	XSEQUENCE(ParseChargingRequest, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED);
 	//	break;
@@ -184,9 +213,12 @@
 		XSEQUENCE(ParseAOCEChargingUnit, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED);
 		break;
 #endif
+
 	case Fac_StatusRequest:
-		XSEQUENCE_1(ParseStatusRequest_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.StatusRequest);
-		break;
+		XSEQUENCE_1(ParseStatusRequest_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.StatusRequest);
+		break;
+
+	/* CCBS/CCNR support */
 	case Fac_CallInfoRetain:
 		XSEQUENCE_1(ParseCallInfoRetain_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CallInfoRetain);
 		break;
@@ -197,22 +229,22 @@
 		XSEQUENCE_1(ParseCCBSDeactivate_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSDeactivate);
 		break;
 	case Fac_CCBSInterrogate:
-		XSEQUENCE_1(ParseCCBSInterrogate_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSInterrogate);
+		XSEQUENCE_1(ParseCCBSInterrogate_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSInterrogate);
 		break;
 	case Fac_CCBSErase:
-		XSEQUENCE_1(ParseCCBSErase_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSErase);
+		XSEQUENCE_1(ParseCCBSErase_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSErase);
 		break;
 	case Fac_CCBSRemoteUserFree:
-		XSEQUENCE_1(ParseCCBSRemoteUserFree_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSRemoteUserFree);
+		XSEQUENCE_1(ParseCCBSRemoteUserFree_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSRemoteUserFree);
 		break;
 	case Fac_CCBSCall:
 		XSEQUENCE_1(ParseCCBSCall_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSCall);
 		break;
 	case Fac_CCBSStatusRequest:
-		XSEQUENCE_1(ParseCCBSStatusRequest_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSStatusRequest);
+		XSEQUENCE_1(ParseCCBSStatusRequest_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSStatusRequest);
 		break;
 	case Fac_CCBSBFree:
-		XSEQUENCE_1(ParseCCBSBFree_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSBFree);
+		XSEQUENCE_1(ParseCCBSBFree_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.CCBSBFree);
 		break;
 	case Fac_EraseCallLinkageID:
 		XSEQUENCE_1(ParseEraseCallLinkageID_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.EraseCallLinkageID);
@@ -224,8 +256,9 @@
 		XSEQUENCE_1(ParseCCNRRequest_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCNRRequest);
 		break;
 	case Fac_CCNRInterrogate:
-		XSEQUENCE_1(ParseCCNRInterrogate_ARG, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.inv.o.CCNRInterrogate);
-		break;
+		XSEQUENCE_1(ParseCCNRInterrogate_ARG, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.inv.o.CCNRInterrogate);
+		break;
+
 	default:
 		return -1;
 	}
@@ -242,6 +275,7 @@
 	pc->u.retResult.operationValuePresent = 1;
 
 	switch (pc->u.retResult.operationValue) {
+	/* Diversion support */
 #if 0
 	case Fac_InterrogationDiversion:
 		XSEQUENCE(ParseRESInterrogationDiversion, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED);
@@ -250,9 +284,20 @@
 		XSEQUENCE(ParseRESInterrogateServedUserNumbers, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED);
 		break;
 #endif
+
+	/* ECT support */
+	case Fac_EctLinkIdRequest:
+		XSEQUENCE_1(ParseEctLinkIdRequest_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.EctLinkIdRequest);
+		break;
+	case Fac_EctLoopTest:
+		XSEQUENCE_1(ParseEctLoopTest_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.EctLoopTest);
+		break;
+
 	case Fac_StatusRequest:
 		XSEQUENCE_1(ParseStatusRequest_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.StatusRequest);
 		break;
+
+	/* CCBS/CCNR support */
 	case Fac_CCBSDeactivate:
 		/* No additional result parameters */
 		break;
@@ -260,17 +305,18 @@
 		XSEQUENCE_1(ParseCCBSStatusRequest_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCBSStatusRequest);
 		break;
 	case Fac_CCBSRequest:
-		XSEQUENCE_1(ParseCCBSRequest_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCBSRequest);
+		XSEQUENCE_1(ParseCCBSRequest_RES, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCBSRequest);
 		break;
 	case Fac_CCBSInterrogate:
-		XSEQUENCE_1(ParseCCBSInterrogate_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCBSInterrogate);
+		XSEQUENCE_1(ParseCCBSInterrogate_RES, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCBSInterrogate);
 		break;
 	case Fac_CCNRRequest:
-		XSEQUENCE_1(ParseCCNRRequest_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCNRRequest);
+		XSEQUENCE_1(ParseCCNRRequest_RES, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCNRRequest);
 		break;
 	case Fac_CCNRInterrogate:
-		XSEQUENCE_1(ParseCCNRInterrogate_RES, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCNRInterrogate);
-		break;
+		XSEQUENCE_1(ParseCCNRInterrogate_RES, ASN1_TAG_SEQUENCE, ASN1_NOT_TAGGED, &pc->u.retResult.o.CCNRInterrogate);
+		break;
+
 	default:
 		return -1;
 	}

Added: mISDNuser/trunk/suppserv/asn1_ect.c
URL: http://svn.digium.com/view/thirdparty/mISDNuser/trunk/suppserv/asn1_ect.c?view=auto&rev=28
==============================================================================
--- mISDNuser/trunk/suppserv/asn1_ect.c (added)
+++ mISDNuser/trunk/suppserv/asn1_ect.c Tue Nov 11 11:57:06 2008
@@ -1,0 +1,519 @@
+/*
+ * $Id$
+ *
+ * Explicit Call Transfer (ECT) Supplementary Services ETS 300 369-1
+ *
+ * ECT Facility ie encode/decode
+ */
+
+#include "asn1.h"
+#include "asn1_ect.h"
+
+/* ------------------------------------------------------------------- */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the PresentedNumberUnscreened type.
+ *
+ * \param Dest Where to put the encoding
+ * \param Presented Number information to encode.
+ *
+ * \retval length
+ */
+int encodePresentedNumberUnscreened_Full(__u8 *Dest, const struct FacPresentedNumberUnscreened *Presented)
+{
+	__u8 *p;
+	__u8 *TagStart;
+
+	p = Dest;
+	switch (Presented->Type) {
+	case 0: /* presentationAllowedNumber */
+		TagStart = p;
+		TagStart[0] = ASN1_TAG_CONTEXT_SPECIFIC | ASN1_TAG_CONSTRUCTED | 0;
+		p = &TagStart[2];
+
+		p += encodePartyNumber_Full(p, &Presented->Unscreened);
+
+		/* tag Length */
+		TagStart[1] = p - &TagStart[2];
+		break;
+	case 1: /* presentationRestricted */
+		p += encodeNull(p, ASN1_TAG_CONTEXT_SPECIFIC | 1);
+		break;
+	case 2: /* numberNotAvailableDueToInterworking */
+		p += encodeNull(p, ASN1_TAG_CONTEXT_SPECIFIC | 2);
+		break;
+	case 3: /* presentationRestrictedNumber */
+		TagStart = p;
+		TagStart[0] = ASN1_TAG_CONTEXT_SPECIFIC | ASN1_TAG_CONSTRUCTED | 3;
+		p = &TagStart[2];
+
+		p += encodePartyNumber_Full(p, &Presented->Unscreened);
+
+		/* tag Length */
+		TagStart[1] = p - &TagStart[2];
+		break;
+	default:
+		break;
+	}	/* end switch */
+
+	return p - Dest;
+}	/* end encodePresentedNumberUnscreened_Full() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Parse the PresentedNumberUnscreened argument parameters.
+ *
+ * \param pc Complete component message storage data.
+ * \param p Starting buffer position to parse arguments
+ * \param end End buffer position that must not go past.
+ * \param Presented Parameter storage to fill.
+ *
+ * \retval length of buffer consumed
+ * \retval -1 on error.
+ */
+int ParsePresentedNumberUnscreened_Full(struct asn1_parm *pc, u_char *p, u_char *end, struct FacPresentedNumberUnscreened *Presented)
+{
+	INIT;
+
+	Presented->Type = 0;
+	XCHOICE_1(ParsePartyNumber_Full, ASN1_TAG_EXPLICIT | ASN1_TAG_CONTEXT_SPECIFIC, 0, &Presented->Unscreened);
+	Presented->Type = 1;
+	XCHOICE(ParseNull, ASN1_TAG_CONTEXT_SPECIFIC, 1);
+	Presented->Type = 2;
+	XCHOICE(ParseNull, ASN1_TAG_CONTEXT_SPECIFIC, 2);
+	Presented->Type = 3;
+	XCHOICE_1(ParsePartyNumber_Full, ASN1_TAG_EXPLICIT | ASN1_TAG_CONTEXT_SPECIFIC, 3, &Presented->Unscreened);
+
+	XCHOICE_DEFAULT;
+}	/* end ParsePresentedNumberUnscreened_Full() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the EctExecute facility ie.
+ *
+ * \param Dest Where to put the encoding
+ * \param EctExecute Information needed to encode in ie.
+ *
+ * \retval length on success.
+ * \retval -1 on error.
+ */
+int encodeFacEctExecute(__u8 *Dest, const struct FacEctExecute *EctExecute)
+{
+	int Length;
+	__u8 *p;
+
+	p = encodeComponentInvoke_Head(Dest, EctExecute->InvokeID, Fac_EctExecute);
+
+	Length = encodeComponent_Length(Dest, p);
+
+	return Length;
+}	/* end encodeFacEctExecute() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the ExplicitEctExecute facility ie.
+ *
+ * \param Dest Where to put the encoding
+ * \param ExplicitEctExecute Information needed to encode in ie.
+ *
+ * \retval length on success.
+ * \retval -1 on error.
+ */
+int encodeFacExplicitEctExecute(__u8 *Dest, const struct FacExplicitEctExecute *ExplicitEctExecute)
+{
+	int Length;
+	__u8 *p;
+
+	p = encodeComponentInvoke_Head(Dest, ExplicitEctExecute->InvokeID, Fac_ExplicitEctExecute);
+
+	p += encodeInt(p, ASN1_TAG_INTEGER, ExplicitEctExecute->LinkID);
+
+	Length = encodeComponent_Length(Dest, p);
+
+	return Length;
+}	/* end encodeFacExplicitEctExecute() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Parse the ExplicitEctExecute invoke argument parameters.
+ *
+ * \param pc Complete component message storage data.
+ * \param p Starting buffer position to parse arguments
+ * \param end End buffer position that must not go past.
+ * \param ExplicitEctExecute Parameter storage to fill.
+ *
+ * \retval length of buffer consumed
+ * \retval -1 on error.
+ */
+int ParseExplicitEctExecute_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacExplicitEctExecute *ExplicitEctExecute)
+{
+	int LinkID;
+	int ret;
+	u_char *beg;
+
+	print_asn1msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", __FUNCTION__);
+	beg = p;
+	XSEQUENCE_1(ParseInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &LinkID);
+	ExplicitEctExecute->LinkID = LinkID;
+	ExplicitEctExecute->InvokeID = pc->u.inv.invokeId;
+
+	return p - beg;
+}	/* end ParseExplicitEctExecute_ARG() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the RequestSubaddress facility ie.
+ *
+ * \param Dest Where to put the encoding
+ * \param RequestSubaddress Information needed to encode in ie.
+ *
+ * \retval length on success.
+ * \retval -1 on error.
+ */
+int encodeFacRequestSubaddress(__u8 *Dest, const struct FacRequestSubaddress *RequestSubaddress)
+{
+	int Length;
+	__u8 *p;
+
+	p = encodeComponentInvoke_Head(Dest, RequestSubaddress->InvokeID, Fac_RequestSubaddress);
+
+	Length = encodeComponent_Length(Dest, p);
+
+	return Length;
+}	/* end encodeFacRequestSubaddress() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the SubaddressTransfer facility ie.
+ *
+ * \param Dest Where to put the encoding
+ * \param SubaddressTransfer Information needed to encode in ie.
+ *
+ * \retval length on success.
+ * \retval -1 on error.
+ */
+int encodeFacSubaddressTransfer(__u8 *Dest, const struct FacSubaddressTransfer *SubaddressTransfer)
+{
+	int Length;
+	__u8 *p;
+
+	p = encodeComponentInvoke_Head(Dest, SubaddressTransfer->InvokeID, Fac_SubaddressTransfer);
+
+	p += encodePartySubaddress_Full(p, &SubaddressTransfer->Subaddress);
+
+	Length = encodeComponent_Length(Dest, p);
+
+	return Length;
+}	/* end encodeFacSubaddressTransfer() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Parse the SubaddressTransfer invoke argument parameters.
+ *
+ * \param pc Complete component message storage data.
+ * \param p Starting buffer position to parse arguments
+ * \param end End buffer position that must not go past.
+ * \param SubaddressTransfer Parameter storage to fill.
+ *
+ * \retval length of buffer consumed
+ * \retval -1 on error.
+ */
+int ParseSubaddressTransfer_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacSubaddressTransfer *SubaddressTransfer)
+{
+	int ret;
+	u_char *beg;
+
+	print_asn1msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", __FUNCTION__);
+	beg = p;
+	XSEQUENCE_1(ParsePartySubaddress_Full, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &SubaddressTransfer->Subaddress);
+	SubaddressTransfer->InvokeID = pc->u.inv.invokeId;
+
+	return p - beg;
+}	/* end ParseSubaddressTransfer_ARG() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the EctLinkIdRequest facility ie.
+ *
+ * \param Dest Where to put the encoding
+ * \param EctLinkIdRequest Information needed to encode in ie.
+ *
+ * \retval length on success.
+ * \retval -1 on error.
+ */
+int encodeFacEctLinkIdRequest(__u8 *Dest, const struct FacEctLinkIdRequest *EctLinkIdRequest)
+{
+	int Length;
+	__u8 *p;
+	__u8 *SeqStart;
+
+	switch (EctLinkIdRequest->ComponentType) {
+	case FacComponent_Invoke:
+		p = encodeComponentInvoke_Head(Dest, EctLinkIdRequest->InvokeID, Fac_EctLinkIdRequest);
+
+		/* No arguments */
+
+		Length = encodeComponent_Length(Dest, p);
+		break;
+	case FacComponent_Result:
+		p = encodeComponent_Head(Dest, asn1ComponentTag_Result);
+		p += encodeInt(p, ASN1_TAG_INTEGER, EctLinkIdRequest->InvokeID);
+
+		SeqStart = p;
+		SeqStart[0] = ASN1_TAG_SEQUENCE;
+		p = &SeqStart[2];
+		p += encodeOperationValue(p, Fac_EctLinkIdRequest);
+		p += encodeInt(p, ASN1_TAG_INTEGER, EctLinkIdRequest->Component.Result.LinkID);
+		/* sequence Length */
+		SeqStart[1] = p - &SeqStart[2];
+
+		Length = encodeComponent_Length(Dest, p);
+		break;
+	default:
+		Length = -1;
+		break;
+	}	/* end switch */
+
+	return Length;
+}	/* end encodeFacEctLinkIdRequest() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Parse the EctLinkIdRequest result parameters.
+ *
+ * \param pc Complete component message storage data.
+ * \param p Starting buffer position to parse parameters
+ * \param end End buffer position that must not go past.
+ * \param EctLinkIdRequest Parameter storage to fill.
+ *
+ * \retval length of buffer consumed
+ * \retval -1 on error.
+ */
+int ParseEctLinkIdRequest_RES(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctLinkIdRequest_RES *EctLinkIdRequest)
+{
+	int LinkID;
+	int ret;
+	u_char *beg;
+
+	print_asn1msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", __FUNCTION__);
+	beg = p;
+	XSEQUENCE_1(ParseInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &LinkID);
+	EctLinkIdRequest->LinkID = LinkID;
+
+	return p - beg;
+}	/* end ParseEctLinkIdRequest_RES() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the EctInform facility ie.
+ *
+ * \param Dest Where to put the encoding
+ * \param EctInform Information needed to encode in ie.
+ *
+ * \retval length on success.
+ * \retval -1 on error.
+ */
+int encodeFacEctInform(__u8 *Dest, const struct FacEctInform *EctInform)
+{
+	int Length;
+	__u8 *p;
+	__u8 *SeqStart;
+
+	p = encodeComponentInvoke_Head(Dest, EctInform->InvokeID, Fac_EctInform);
+
+	SeqStart = p;
+	SeqStart[0] = ASN1_TAG_SEQUENCE;
+	p = &SeqStart[2];
+	p += encodeEnum(p, ASN1_TAG_ENUM, EctInform->Status);
+	if (EctInform->RedirectionPresent)
+	{
+		p += encodePresentedNumberUnscreened_Full(p, &EctInform->Redirection);
+	}
+	/* sequence Length */
+	SeqStart[1] = p - &SeqStart[2];
+
+	Length = encodeComponent_Length(Dest, p);
+
+	return Length;
+}	/* end encodeFacEctInform() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Parse the EctInform invoke argument parameters.
+ *
+ * \param pc Complete component message storage data.
+ * \param p Starting buffer position to parse arguments
+ * \param end End buffer position that must not go past.
+ * \param EctInform Parameter storage to fill.
+ *
+ * \retval length of buffer consumed
+ * \retval -1 on error.
+ */
+int ParseEctInform_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctInform *EctInform)
+{
+	int Status;
+	INIT;
+
+	XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &Status);
+	EctInform->Status = Status;
+	if (p < end) {
+		XSEQUENCE_1(ParsePresentedNumberUnscreened_Full, ASN1_NOT_TAGGED, ASN1_NOT_TAGGED, &EctInform->Redirection);
+		EctInform->RedirectionPresent = 1;
+	} else {
+		EctInform->RedirectionPresent = 0;
+	}
+	EctInform->InvokeID = pc->u.inv.invokeId;
+
+	return p - beg;
+}	/* end ParseEctInform_ARG() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Encode the EctLoopTest facility ie.
+ *
+ * \param Dest Where to put the encoding
+ * \param EctLoopTest Information needed to encode in ie.
+ *
+ * \retval length on success.
+ * \retval -1 on error.
+ */
+int encodeFacEctLoopTest(__u8 *Dest, const struct FacEctLoopTest *EctLoopTest)
+{
+	int Length;
+	__u8 *p;
+	__u8 *SeqStart;
+
+	switch (EctLoopTest->ComponentType) {
+	case FacComponent_Invoke:
+		p = encodeComponentInvoke_Head(Dest, EctLoopTest->InvokeID, Fac_EctLoopTest);
+
+		p += encodeInt(p, ASN1_TAG_INTEGER, EctLoopTest->Component.Invoke.CallTransferID);
+
+		Length = encodeComponent_Length(Dest, p);
+		break;
+	case FacComponent_Result:
+		p = encodeComponent_Head(Dest, asn1ComponentTag_Result);
+		p += encodeInt(p, ASN1_TAG_INTEGER, EctLoopTest->InvokeID);
+
+		SeqStart = p;
+		SeqStart[0] = ASN1_TAG_SEQUENCE;
+		p = &SeqStart[2];
+		p += encodeOperationValue(p, Fac_EctLoopTest);
+		p += encodeEnum(p, ASN1_TAG_ENUM, EctLoopTest->Component.Result.LoopResult);
+		/* sequence Length */
+		SeqStart[1] = p - &SeqStart[2];
+
+		Length = encodeComponent_Length(Dest, p);
+		break;
+	default:
+		Length = -1;
+		break;
+	}	/* end switch */
+
+	return Length;
+}	/* end encodeFacEctLoopTest() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Parse the EctLoopTest invoke argument parameters.
+ *
+ * \param pc Complete component message storage data.
+ * \param p Starting buffer position to parse arguments
+ * \param end End buffer position that must not go past.
+ * \param EctLoopTest Parameter storage to fill.
+ *
+ * \retval length of buffer consumed
+ * \retval -1 on error.
+ */
+int ParseEctLoopTest_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctLoopTest_ARG *EctLoopTest)
+{
+	int CallTransferID;
+	int ret;
+	u_char *beg;
+
+	print_asn1msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", __FUNCTION__);
+	beg = p;
+	XSEQUENCE_1(ParseInteger, ASN1_TAG_INTEGER, ASN1_NOT_TAGGED, &CallTransferID);
+	EctLoopTest->CallTransferID = CallTransferID;
+
+	return p - beg;
+}	/* end ParseEctLoopTest_ARG() */
+
+
+
+
+/* ******************************************************************* */
+/*!
+ * \brief Parse the EctLoopTest result parameters.
+ *
+ * \param pc Complete component message storage data.
+ * \param p Starting buffer position to parse parameters
+ * \param end End buffer position that must not go past.
+ * \param EctLoopTest Parameter storage to fill.
+ *
+ * \retval length of buffer consumed
+ * \retval -1 on error.
+ */
+int ParseEctLoopTest_RES(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctLoopTest_RES *EctLoopTest)
+{
+	int LoopResult;
+	int ret;
+	u_char *beg;
+
+	print_asn1msg(PRT_DEBUG_DECODE, " DEBUG> %s\n", __FUNCTION__);
+	beg = p;
+	XSEQUENCE_1(ParseEnum, ASN1_TAG_ENUM, ASN1_NOT_TAGGED, &LoopResult);
+	EctLoopTest->LoopResult = LoopResult;
+
+	return p - beg;
+}	/* end ParseEctLoopTest_RES() */
+
+
+
+
+/* ------------------------------------------------------------------- */
+/* end asn1_ect.c */
+

Propchange: mISDNuser/trunk/suppserv/asn1_ect.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: mISDNuser/trunk/suppserv/asn1_ect.c
------------------------------------------------------------------------------
    svn:keywords = Author ID Date Revision

Propchange: mISDNuser/trunk/suppserv/asn1_ect.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: mISDNuser/trunk/suppserv/asn1_ect.h
URL: http://svn.digium.com/view/thirdparty/mISDNuser/trunk/suppserv/asn1_ect.h?view=auto&rev=28
==============================================================================
--- mISDNuser/trunk/suppserv/asn1_ect.h (added)
+++ mISDNuser/trunk/suppserv/asn1_ect.h Tue Nov 11 11:57:06 2008
@@ -1,0 +1,48 @@
+/*
+ * $Id$
+ *
+ * Explicit Call Transfer (ECT) Supplementary Services ETS 300 369-1
+ *
+ * ECT Facility ie encode/decode header
+ */
+
+#ifndef __ASN1_ECT_H
+#define __ASN1_ECT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ------------------------------------------------------------------- */
+
+
+int encodeFacEctExecute(__u8 *Dest, const struct FacEctExecute *EctExecute);
+
+int encodeFacExplicitEctExecute(__u8 *Dest, const struct FacExplicitEctExecute *ExplicitEctExecute);
+int ParseExplicitEctExecute_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacExplicitEctExecute *ExplicitEctExecute);
+
+int encodeFacRequestSubaddress(__u8 *Dest, const struct FacRequestSubaddress *RequestSubaddress);
+
+int encodeFacSubaddressTransfer(__u8 *Dest, const struct FacSubaddressTransfer *SubaddressTransfer);
+int ParseSubaddressTransfer_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacSubaddressTransfer *SubaddressTransfer);
+
+int encodeFacEctLinkIdRequest(__u8 *Dest, const struct FacEctLinkIdRequest *EctLinkIdRequest);
+int ParseEctLinkIdRequest_RES(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctLinkIdRequest_RES *EctLinkIdRequest);
+
+int encodeFacEctInform(__u8 *Dest, const struct FacEctInform *EctInform);
+int ParseEctInform_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctInform *EctInform);
+
+int encodeFacEctLoopTest(__u8 *Dest, const struct FacEctLoopTest *EctLoopTest);
+int ParseEctLoopTest_ARG(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctLoopTest_ARG *EctLoopTest);
+int ParseEctLoopTest_RES(struct asn1_parm *pc, u_char *p, u_char *end, struct FacEctLoopTest_RES *EctLoopTest);
+
+
+/* ------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* __ASN1_ECT_H */
+/* ------------------------------------------------------------------- */
+/* end asn1_ect.h */

Propchange: mISDNuser/trunk/suppserv/asn1_ect.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: mISDNuser/trunk/suppserv/asn1_ect.h
------------------------------------------------------------------------------
    svn:keywords = Author ID Date Revision

Propchange: mISDNuser/trunk/suppserv/asn1_ect.h
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: mISDNuser/trunk/suppserv/fac.c
URL: http://svn.digium.com/view/thirdparty/mISDNuser/trunk/suppserv/fac.c?view=diff&rev=28&r1=27&r2=28
==============================================================================
--- mISDNuser/trunk/suppserv/fac.c (original)
+++ mISDNuser/trunk/suppserv/fac.c Tue Nov 11 11:57:06 2008
@@ -26,6 +26,7 @@
 #include "asn1.h"
 #include "asn1_diversion.h"
 #include "asn1_ccbs.h"
+#include "asn1_ect.h"
 #include "l3dss1.h"
 #include <string.h>
 
@@ -293,6 +294,8 @@
 	switch (fac->Function) {
 	case Fac_None:
 		break;
+
+	/* Diversion support */
 	case Fac_ActivationDiversion:
 		len = encodeFacActivationDiversion(dest, &fac->u.CFActivate);
 		break;
@@ -303,6 +306,7 @@
 	case Fac_DeactivationStatusNotificationDiv:
 	case Fac_InterrogationDiversion:
 	case Fac_DiversionInformation:
+		break;
 	case Fac_CallDeflection:
 		len = encodeFacCDeflection(dest, &fac->u.CDeflection);
 		break;
@@ -312,6 +316,31 @@
 	case Fac_DivertingLegInformation1:
 	case Fac_DivertingLegInformation3:
 		break;
+
+	/* ECT support */
+	case Fac_EctExecute:
+		len = encodeFacEctExecute(dest, &fac->u.EctExecute);
+		break;
+	case Fac_ExplicitEctExecute:
+		len = encodeFacExplicitEctExecute(dest, &fac->u.ExplicitEctExecute);
+		break;
+	case Fac_RequestSubaddress:
+		len = encodeFacRequestSubaddress(dest, &fac->u.RequestSubaddress);
+		break;
+	case Fac_SubaddressTransfer:
+		len = encodeFacSubaddressTransfer(dest, &fac->u.SubaddressTransfer);
+		break;
+	case Fac_EctLinkIdRequest:
+		len = encodeFacEctLinkIdRequest(dest, &fac->u.EctLinkIdRequest);
+		break;
+	case Fac_EctInform:
+		len = encodeFacEctInform(dest, &fac->u.EctInform);
+		break;
+	case Fac_EctLoopTest:
+		len = encodeFacEctLoopTest(dest, &fac->u.EctLoopTest);
+		break;
+
+	/* AOC support */
 	case Fac_ChargingRequest:
 	case Fac_AOCSCurrency:
 	case Fac_AOCSSpecialArr:
@@ -320,6 +349,7 @@
 	case Fac_AOCECurrency:
 	case Fac_AOCEChargingUnit:
 		break;
+
 	case Fac_RESULT:
 		len = encodeFacRESULT(dest, &fac->u.RESULT);
 		break;
@@ -329,9 +359,12 @@
 	case Fac_REJECT:
 		len = encodeFacREJECT(dest, &fac->u.REJECT);
 		break;
+
 	case Fac_StatusRequest:
 		len = encodeFacStatusRequest(dest, &fac->u.StatusRequest);
 		break;
+
+	/* CCBS/CCNR support */
 	case Fac_CallInfoRetain:
 		len = encodeFacCallInfoRetain(dest, &fac->u.CallInfoRetain);
 		break;
@@ -371,6 +404,7 @@
 	case Fac_CCNRInterrogate:
 		len = encodeFacCCNRInterrogate(dest, &fac->u.CCNRInterrogate);
 		break;
+
 	default:
 		break;
 	}
@@ -413,6 +447,7 @@
 	case invoke:
 		fac->Function = pc.u.inv.operationValue;
 		switch (pc.u.inv.operationValue) {
+		/* Diversion support */
 		case Fac_ActivationDiversion:
 		case Fac_DeactivationDiversion:
 		case Fac_ActivationStatusNotificationDiv:
@@ -439,6 +474,34 @@
 		case Fac_DivertingLegInformation1:
 		case Fac_DivertingLegInformation3:
 			break;
+
+		/* ECT support */
+		case Fac_EctExecute:
+			fac->u.EctExecute.InvokeID = pc.u.inv.invokeId;
+			return 0;
+		case Fac_ExplicitEctExecute:
+			fac->u.ExplicitEctExecute = pc.u.inv.o.ExplicitEctExecute;
+			return 0;
+		case Fac_RequestSubaddress:
+			fac->u.RequestSubaddress.InvokeID = pc.u.inv.invokeId;
+			return 0;
+		case Fac_SubaddressTransfer:
+			fac->u.SubaddressTransfer = pc.u.inv.o.SubaddressTransfer;
+			return 0;
+		case Fac_EctLinkIdRequest:
+			fac->u.EctLinkIdRequest.InvokeID = pc.u.inv.invokeId;
+			fac->u.EctLinkIdRequest.ComponentType = FacComponent_Invoke;
+			return 0;
+		case Fac_EctInform:
+			fac->u.EctInform = pc.u.inv.o.EctInform;
+			return 0;
+		case Fac_EctLoopTest:
+			fac->u.EctLoopTest.InvokeID = pc.u.inv.invokeId;
+			fac->u.EctLoopTest.ComponentType = FacComponent_Invoke;
+			fac->u.EctLoopTest.Component.Invoke = pc.u.inv.o.EctLoopTest;
+			return 0;
+
+		/* AOC support */
 		case Fac_ChargingRequest:
 		case Fac_AOCSCurrency:
 		case Fac_AOCSSpecialArr:
@@ -452,11 +515,14 @@
 		case Fac_AOCECurrency:
 		case Fac_AOCEChargingUnit:
 			break;
+
 		case Fac_StatusRequest:
 			fac->u.StatusRequest.InvokeID = pc.u.inv.invokeId;
 			fac->u.StatusRequest.ComponentType = FacComponent_Invoke;
 			fac->u.StatusRequest.Component.Invoke = pc.u.inv.o.StatusRequest;
 			return 0;
+
+		/* CCBS/CCNR support */
 		case Fac_CallInfoRetain:
 			fac->u.CallInfoRetain = pc.u.inv.o.CallInfoRetain;
 			return 0;
@@ -508,6 +574,7 @@
 			fac->u.CCNRInterrogate.ComponentType = FacComponent_Invoke;
 			fac->u.CCNRInterrogate.Component.Invoke = pc.u.inv.o.CCNRInterrogate;
 			return 0;
+
 		default:
 			break;
 		}	/* end switch */
@@ -523,6 +590,7 @@
 		}
 		fac->Function = pc.u.retResult.operationValue;
 		switch (pc.u.retResult.operationValue) {
+		/* Diversion support */
 		case Fac_ActivationDiversion:
 		case Fac_DeactivationDiversion:
 		case Fac_ActivationStatusNotificationDiv:
@@ -536,6 +604,27 @@
 		case Fac_DivertingLegInformation1:
 		case Fac_DivertingLegInformation3:
 			break;
+
+		/* ECT support */
+		case Fac_EctExecute:
+		case Fac_ExplicitEctExecute:
+		case Fac_RequestSubaddress:
+		case Fac_SubaddressTransfer:
+			break;
+		case Fac_EctLinkIdRequest:
+			fac->u.EctLinkIdRequest.InvokeID = pc.u.retResult.invokeId;
+			fac->u.EctLinkIdRequest.ComponentType = FacComponent_Result;
+			fac->u.EctLinkIdRequest.Component.Result = pc.u.retResult.o.EctLinkIdRequest;
+			return 0;
+		case Fac_EctInform:
+			break;
+		case Fac_EctLoopTest:
+			fac->u.EctLoopTest.InvokeID = pc.u.retResult.invokeId;
+			fac->u.EctLoopTest.ComponentType = FacComponent_Result;
+			fac->u.EctLoopTest.Component.Result = pc.u.retResult.o.EctLoopTest;
+			return 0;
+
+		/* AOC support */
 		case Fac_ChargingRequest:
 		case Fac_AOCSCurrency:
 		case Fac_AOCSSpecialArr:
@@ -544,11 +633,14 @@
 		case Fac_AOCECurrency:
 		case Fac_AOCEChargingUnit:
 			break;
+
 		case Fac_StatusRequest:
 			fac->u.StatusRequest.InvokeID = pc.u.retResult.invokeId;
 			fac->u.StatusRequest.ComponentType = FacComponent_Result;
 			fac->u.StatusRequest.Component.Result = pc.u.retResult.o.StatusRequest;
 			return 0;
+
+		/* CCBS/CCNR support */
 		case Fac_CallInfoRetain:

[... 217 lines stripped ...]



More information about the thirdparty-commits mailing list