Added Q.SIG Advice-Of-Charge encode/decode routines.

git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.4@772 2fbb986a-6c06-0410-b554-c9c1f0a7f128
remotes/origin/1.4
Richard Mudgett 16 years ago
parent ba45095c5a
commit b19c0b0a04

@ -54,6 +54,7 @@ STATIC_OBJS= \
rose_etsi_aoc.o \ rose_etsi_aoc.o \
rose_other.o \ rose_other.o \
rose_q931.o \ rose_q931.o \
rose_qsig_aoc.o \
rose_qsig_ct.o \ rose_qsig_ct.o \
rose_qsig_diversion.o \ rose_qsig_diversion.o \
rose_qsig_mwi.o \ rose_qsig_mwi.o \
@ -72,6 +73,7 @@ DYNAMIC_OBJS= \
rose_etsi_aoc.lo \ rose_etsi_aoc.lo \
rose_other.lo \ rose_other.lo \
rose_q931.lo \ rose_q931.lo \
rose_qsig_aoc.lo \
rose_qsig_ct.lo \ rose_qsig_ct.lo \
rose_qsig_diversion.lo \ rose_qsig_diversion.lo \
rose_qsig_mwi.lo \ rose_qsig_mwi.lo \

@ -1559,6 +1559,12 @@ void rose_handle_result(struct pri *ctrl, q931_call *call, q931_ie *ie,
case ROSE_ETSI_ChargingRequest: case ROSE_ETSI_ChargingRequest:
break; break;
#endif /* Not handled yet */ #endif /* Not handled yet */
#if 0 /* Not handled yet */
case ROSE_QSIG_ChargeRequest:
break;
case ROSE_QSIG_AocComplete:
break;
#endif /* Not handled yet */
#if 0 /* Not handled yet */ #if 0 /* Not handled yet */
case ROSE_QSIG_CallTransferIdentify: case ROSE_QSIG_CallTransferIdentify:
break; break;
@ -1673,6 +1679,22 @@ void rose_handle_invoke(struct pri *ctrl, q931_call *call, q931_ie *ie,
case ROSE_QSIG_BusyName: case ROSE_QSIG_BusyName:
break; break;
#endif /* Not handled yet */ #endif /* Not handled yet */
#if 0 /* Not handled yet */
case ROSE_QSIG_ChargeRequest:
break;
case ROSE_QSIG_GetFinalCharge:
break;
case ROSE_QSIG_AocFinal:
break;
case ROSE_QSIG_AocInterim:
break;
case ROSE_QSIG_AocRate:
break;
case ROSE_QSIG_AocComplete:
break;
case ROSE_QSIG_AocDivChargeReq:
break;
#endif /* Not handled yet */
#if 0 /* Not handled yet */ #if 0 /* Not handled yet */
case ROSE_QSIG_CallTransferIdentify: case ROSE_QSIG_CallTransferIdentify:
break; break;

@ -343,6 +343,46 @@ static const struct rose_convert_msg rose_qsig_msgs[] = {
rose_dec_qsig_BusyName_ARG, NULL rose_dec_qsig_BusyName_ARG, NULL
}, },
/*
* localValue's from Q.SIG SS-AOC-Operations
* { iso(1) standard(0) pss1-advice-of-charge(15050) advice-of-charge-operations(0) }
*/
{
ROSE_QSIG_ChargeRequest, NULL, 59,
rose_enc_qsig_ChargeRequest_ARG, rose_enc_qsig_ChargeRequest_RES,
rose_dec_qsig_ChargeRequest_ARG, rose_dec_qsig_ChargeRequest_RES
},
{
ROSE_QSIG_GetFinalCharge, NULL, 60,
rose_enc_qsig_DummyArg_ARG, NULL,
rose_dec_qsig_DummyArg_ARG, NULL
},
{
ROSE_QSIG_AocFinal, NULL, 61,
rose_enc_qsig_AocFinal_ARG, NULL,
rose_dec_qsig_AocFinal_ARG, NULL
},
{
ROSE_QSIG_AocInterim, NULL, 62,
rose_enc_qsig_AocInterim_ARG, NULL,
rose_dec_qsig_AocInterim_ARG, NULL
},
{
ROSE_QSIG_AocRate, NULL, 63,
rose_enc_qsig_AocRate_ARG, NULL,
rose_dec_qsig_AocRate_ARG, NULL
},
{
ROSE_QSIG_AocComplete, NULL, 64,
rose_enc_qsig_AocComplete_ARG, rose_enc_qsig_AocComplete_RES,
rose_dec_qsig_AocComplete_ARG, rose_dec_qsig_AocComplete_RES
},
{
ROSE_QSIG_AocDivChargeReq, NULL, 65,
rose_enc_qsig_AocDivChargeReq_ARG, NULL,
rose_dec_qsig_AocDivChargeReq_ARG, NULL
},
/* /*
* localValue's from Q.SIG Call-Transfer-Operations * localValue's from Q.SIG Call-Transfer-Operations
* { iso(1) standard(0) pss1-call-transfer(13869) call-transfer-operations(0) } * { iso(1) standard(0) pss1-call-transfer(13869) call-transfer-operations(0) }
@ -545,6 +585,15 @@ static const struct rose_convert_error rose_qsig_errors[] = {
NULL, NULL NULL, NULL
}, },
/*
* localValue Errors from Q.SIG SS-AOC-Operations
* { iso(1) standard(0) pss1-advice-of-charge(15050) advice-of-charge-operations(0) }
*/
{
ROSE_ERROR_QSIG_AOC_FreeOfCharge, NULL, 1016,
NULL, NULL
},
/* /*
* localValue's from Q.SIG Call-Transfer-Operations * localValue's from Q.SIG Call-Transfer-Operations
* { iso(1) standard(0) pss1-call-transfer(13869) call-transfer-operations(0) } * { iso(1) standard(0) pss1-call-transfer(13869) call-transfer-operations(0) }
@ -844,6 +893,14 @@ const char *rose_operation2str(enum rose_operation operation)
{ ROSE_QSIG_ConnectedName, "ROSE_QSIG_ConnectedName" }, { ROSE_QSIG_ConnectedName, "ROSE_QSIG_ConnectedName" },
{ ROSE_QSIG_BusyName, "ROSE_QSIG_BusyName" }, { ROSE_QSIG_BusyName, "ROSE_QSIG_BusyName" },
{ ROSE_QSIG_ChargeRequest, "ROSE_QSIG_ChargeRequest" },
{ ROSE_QSIG_GetFinalCharge, "ROSE_QSIG_GetFinalCharge" },
{ ROSE_QSIG_AocFinal, "ROSE_QSIG_AocFinal" },
{ ROSE_QSIG_AocInterim, "ROSE_QSIG_AocInterim" },
{ ROSE_QSIG_AocRate, "ROSE_QSIG_AocRate" },
{ ROSE_QSIG_AocComplete, "ROSE_QSIG_AocComplete" },
{ ROSE_QSIG_AocDivChargeReq, "ROSE_QSIG_AocDivChargeReq" },
{ ROSE_QSIG_CallTransferIdentify, "ROSE_QSIG_CallTransferIdentify" }, { ROSE_QSIG_CallTransferIdentify, "ROSE_QSIG_CallTransferIdentify" },
{ ROSE_QSIG_CallTransferAbandon, "ROSE_QSIG_CallTransferAbandon" }, { ROSE_QSIG_CallTransferAbandon, "ROSE_QSIG_CallTransferAbandon" },
{ ROSE_QSIG_CallTransferInitiate, "ROSE_QSIG_CallTransferInitiate" }, { ROSE_QSIG_CallTransferInitiate, "ROSE_QSIG_CallTransferInitiate" },
@ -921,6 +978,8 @@ const char *rose_error2str(enum rose_error_code code)
/* Q.SIG specific errors */ /* Q.SIG specific errors */
{ ROSE_ERROR_QSIG_Unspecified, "Unspecified" }, { ROSE_ERROR_QSIG_Unspecified, "Unspecified" },
{ ROSE_ERROR_QSIG_AOC_FreeOfCharge, "AOC: FreeOfCharge" },
{ ROSE_ERROR_QSIG_CT_InvalidReroutingNumber, "CT: Invalid Rerouting Number" }, { ROSE_ERROR_QSIG_CT_InvalidReroutingNumber, "CT: Invalid Rerouting Number" },
{ ROSE_ERROR_QSIG_CT_UnrecognizedCallIdentity,"CT: Unrecognized Call Identity" }, { ROSE_ERROR_QSIG_CT_UnrecognizedCallIdentity,"CT: Unrecognized Call Identity" },
{ ROSE_ERROR_QSIG_CT_EstablishmentFailure, "CT: Establishment Failure" }, { ROSE_ERROR_QSIG_CT_EstablishmentFailure, "CT: Establishment Failure" },

473
rose.h

@ -86,6 +86,15 @@ enum rose_operation {
ROSE_QSIG_ConnectedName, /*!< Invoke only */ ROSE_QSIG_ConnectedName, /*!< Invoke only */
ROSE_QSIG_BusyName, /*!< Invoke only */ ROSE_QSIG_BusyName, /*!< Invoke only */
/* Q.SIG SS-AOC-Operations */
ROSE_QSIG_ChargeRequest, /*!< Invoke/Result */
ROSE_QSIG_GetFinalCharge, /*!< Invoke only */
ROSE_QSIG_AocFinal, /*!< Invoke only */
ROSE_QSIG_AocInterim, /*!< Invoke only */
ROSE_QSIG_AocRate, /*!< Invoke only */
ROSE_QSIG_AocComplete, /*!< Invoke/Result */
ROSE_QSIG_AocDivChargeReq, /*!< Invoke only */
/* Q.SIG Call-Transfer-Operations (CT) */ /* Q.SIG Call-Transfer-Operations (CT) */
ROSE_QSIG_CallTransferIdentify, /*!< Invoke/Result */ ROSE_QSIG_CallTransferIdentify, /*!< Invoke/Result */
ROSE_QSIG_CallTransferAbandon, /*!< Invoke only */ ROSE_QSIG_CallTransferAbandon, /*!< Invoke only */
@ -163,6 +172,9 @@ enum rose_error_code {
/* Q.SIG from various specifications */ /* Q.SIG from various specifications */
ROSE_ERROR_QSIG_Unspecified, ROSE_ERROR_QSIG_Unspecified,
/* Q.SIG SS-AOC-Operations */
ROSE_ERROR_QSIG_AOC_FreeOfCharge,
/* Q.SIG Call-Transfer-Operations (CT) */ /* Q.SIG Call-Transfer-Operations (CT) */
ROSE_ERROR_QSIG_CT_InvalidReroutingNumber, ROSE_ERROR_QSIG_CT_InvalidReroutingNumber,
ROSE_ERROR_QSIG_CT_UnrecognizedCallIdentity, ROSE_ERROR_QSIG_CT_UnrecognizedCallIdentity,
@ -1122,6 +1134,455 @@ struct roseQsigPartyName_ARG {
/* ------------------------------------------------------------------- */ /* ------------------------------------------------------------------- */
/*
* Time ::= SEQUENCE {
* lengthOfTimeUnit [1] IMPLICIT LengthOfTimeUnit,
* scale [2] IMPLICIT Scale
* }
*/
struct roseQsigAOCTime {
/*! LengthOfTimeUnit ::= INTEGER (0..16777215) -- 24 bit number */
u_int32_t length;
/*!
* \details
* oneHundredthSecond(0),
* oneTenthSecond(1),
* oneSecond(2),
* tenSeconds(3),
* oneMinute(4),
* oneHour(5),
* twentyFourHours(6)
*/
u_int8_t scale;
};
/*
* Amount ::= SEQUENCE {
* currencyAmount [1] IMPLICIT CurrencyAmount,
* multiplier [2] IMPLICIT Multiplier
* }
*/
struct roseQsigAOCAmount {
/*! CurrencyAmount ::= INTEGER (0..16777215) -- 24 bit number */
u_int32_t currency;
/*!
* \details
* oneThousandth(0),
* oneHundredth(1),
* oneTenth(2),
* one(3),
* ten(4),
* hundred(5),
* thousand(6)
*/
u_int8_t multiplier;
};
/*
* DurationCurrency ::= SEQUENCE {
* dCurrency [1] IMPLICIT Currency,
* dAmount [2] IMPLICIT Amount,
* dChargingType [3] IMPLICIT ChargingType,
* dTime [4] IMPLICIT Time,
* dGranularity [5] IMPLICIT Time OPTIONAL
* }
*/
struct roseQsigAOCDurationCurrency {
struct roseQsigAOCAmount amount;
struct roseQsigAOCTime time;
/*! \brief dGranularity (optional) */
struct roseQsigAOCTime granularity;
/*!
* \brief Name of currency
* \details
* Currency ::= IA5String (SIZE (0..10))
* \note The empty string is the default currency for the network.
*/
unsigned char currency[10 + 1];
/*!
* \details
* continuousCharging(0),
* stepFunction(1)
*/
u_int8_t charging_type;
/*! TRUE if granularity time is present */
u_int8_t granularity_present;
};
/*
* FlatRateCurrency ::= SEQUENCE {
* fRCurrency [1] IMPLICIT Currency,
* fRAmount [2] IMPLICIT Amount
* }
*/
struct roseQsigAOCFlatRateCurrency {
struct roseQsigAOCAmount amount;
/*!
* \brief Name of currency
* \details
* Currency ::= IA5String (SIZE (0..10))
* \note The empty string is the default currency for the network.
*/
unsigned char currency[10 + 1];
};
/*
* VolumeRateCurrency ::= SEQUENCE {
* vRCurrency [1] IMPLICIT Currency,
* vRAmount [2] IMPLICIT Amount,
* vRVolumeUnit [3] IMPLICIT VolumeUnit
* }
*/
struct roseQsigAOCVolumeRateCurrency {
struct roseQsigAOCAmount amount;
/*!
* \brief Name of currency
* \details
* Currency ::= IA5String (SIZE (0..10))
* \note The empty string is the default currency for the network.
*/
unsigned char currency[10 + 1];
/*!
* \brief Volume rate volume unit
* \details
* octet(0),
* segment(1),
* message(2)
*/
u_int8_t unit;
};
/*
* AOCSCurrencyInfo ::= SEQUENCE {
* chargedItem ChargedItem,
* rateType CHOICE {
* durationCurrency [1] IMPLICIT DurationCurrency,
* flatRateCurrency [2] IMPLICIT FlatRateCurrency,
* volumeRateCurrency [3] IMPLICIT VolumeRateCurrency,
* specialChargingCode SpecialChargingCode,
* freeOfCharge [4] IMPLICIT NULL,
* currencyInfoNotAvailable [5] IMPLICIT NULL,
* freeOfChargefromBeginning [6] IMPLICIT NULL
* }
* }
*/
struct roseQsigAOCSCurrencyInfo {
union {
struct roseQsigAOCDurationCurrency duration;
struct roseQsigAOCFlatRateCurrency flat_rate;
struct roseQsigAOCVolumeRateCurrency volume_rate;
/*! SpecialChargingCode ::= INTEGER (1..10) */
u_int8_t special_charging_code;
} u;
/*!
* \brief Determine what is stored in the union.
* \details
* specialChargingCode(0),
* durationCurrency(1),
* flatRateCurrency(2),
* volumeRateCurrency(3),
* freeOfCharge(4),
* currencyInfoNotAvailable(5),
* freeOfChargeFromBeginning(6)
*/
u_int8_t currency_type;
/*!
* \brief What service is being billed.
* \details
* basicCommunication(0),
* callAttempt(1),
* callSetup(2),
* userToUserInfo(3),
* operationOfSupplementaryServ(4)
*/
u_int8_t charged_item;
};
/*
* AOCSCurrencyInfoList ::= SEQUENCE SIZE (1..10) OF AOCSCurrencyInfo
*/
struct roseQsigAOCSCurrencyInfoList {
/*! \brief SEQUENCE SIZE (1..10) OF AOCSCurrencyInfo */
struct roseQsigAOCSCurrencyInfo list[10];
/*! \brief Number of AOCSCurrencyInfo records present */
u_int8_t num_records;
};
/*
* RecordedCurrency ::= SEQUENCE {
* rCurrency [1] IMPLICIT Currency,
* rAmount [2] IMPLICIT Amount
* }
*/
struct roseQsigAOCRecordedCurrency {
/*! Amount of currency involved. */
struct roseQsigAOCAmount amount;
/*!
* \brief Name of currency
* \details
* Currency ::= IA5String (SIZE (0..10))
* \note The empty string is the default currency for the network.
*/
unsigned char currency[10 + 1];
};
/*
* ChargingAssociation ::= CHOICE {
* chargedNumber [0] EXPLICIT PartyNumber,
* chargeIdentifier ChargeIdentifier
* }
*/
struct roseQsigAOCChargingAssociation {
/*! chargeIdentifier: INTEGER (-32768..32767) -- 16 bit number */
int16_t id;
/*! chargedNumber */
struct rosePartyNumber number;
/*!
* \details
* charge_identifier(0)
* charged_number(1),
*/
u_int8_t type;
};
/*
* AocRateArg ::= SEQUENCE {
* aocRate CHOICE
* {
* chargeNotAvailable NULL,
* aocSCurrencyInfoList AOCSCurrencyInfoList
* },
* rateArgExtension CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigAocRateArg_ARG {
struct roseQsigAOCSCurrencyInfoList currency_info;
/*!
* \details
* charge_not_available(0),
* currency_info_list(1)
*/
u_int8_t type;
};
/*
* AocInterimArg ::= SEQUENCE {
* interimCharge CHOICE {
* chargeNotAvailable [0] IMPLICIT NULL,
* freeOfCharge [1] IMPLICIT NULL,
* specificCurrency SEQUENCE {
* recordedCurrency [1] IMPLICIT RecordedCurrency,
* interimBillingId [2] IMPLICIT InterimBillingId OPTIONAL
* }
* },
* interimArgExtension CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigAocInterimArg_ARG {
struct {
/*! \brief recorded currency */
struct roseQsigAOCRecordedCurrency recorded;
/*!
* \brief InterimBillingId (optional)
* \details
* normalCharging(0),
* creditCardCharging(2)
*/
u_int8_t billing_id;
/*! \brief TRUE if billing id is present */
u_int8_t billing_id_present;
} specific;
/*!
* \details
* charge_not_available(0),
* free_of_charge(1),
* specific_currency(2)
*/
u_int8_t type;
};
/*
* AocFinalArg ::= SEQUENCE {
* finalCharge CHOICE {
* chargeNotAvailable [0] IMPLICIT NULL,
* freeOfCharge [1] IMPLICIT NULL,
* specificCurrency SEQUENCE {
* recordedCurrency [1] IMPLICIT RecordedCurrency,
* finalBillingId [2] IMPLICIT FinalBillingId OPTIONAL
* }
* },
* chargingAssociation ChargingAssociation OPTIONAL,
* finalArgExtension CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigAocFinalArg_ARG {
struct {
/*! \brief recorded currency */
struct roseQsigAOCRecordedCurrency recorded;
/*!
* \brief FinalBillingId (optional)
* \details
* normalCharging(0),
* creditCardCharging(2),
* callForwardingUnconditional(3),
* callForwardingBusy(4),
* callForwardingNoReply(5),
* callDeflection(6),
* callTransfer(7)
*/
u_int8_t billing_id;
/*! \brief TRUE if billing id is present */
u_int8_t billing_id_present;
} specific;
/*! \brief chargingAssociation (optional) */
struct roseQsigAOCChargingAssociation charging_association;
/*! \brief TRUE if charging_association is present */
u_int8_t charging_association_present;
/*!
* \details
* charge_not_available(0),
* free_of_charge(1),
* specific_currency(2)
*/
u_int8_t type;
};
/*
* ChargeRequestArg ::= SEQUENCE {
* adviceModeCombinations SEQUENCE SIZE(0..7) OF AdviceModeCombination,
* chargeReqArgExtension CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigChargeRequestArg_ARG {
/*!
* \brief SEQUENCE SIZE(0..7) OF AdviceModeCombination
* \details
* rate(0) <charge rate provision>,
* rateInterim(1) <charge rate and interim charge provision>,
* rateFinal(2) <charge rate and final charge provision>,
* interim(3) <interim charge provision>,
* final(4) <final charge provision>,
* interimFinal(5) <interim charge and final charge provision>,
* rateInterimFinal(6) <charge rate, interim charge and final charge provision>
*/
u_int8_t advice_mode_combinations[7];
/*! \brief Number of AdviceModeCombination values present */
u_int8_t num_records;
};
/*
* ChargeRequestRes ::= SEQUENCE {
* adviceModeCombination AdviceModeCombination,
* chargeReqResExtension CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigChargeRequestRes_RES {
/*!
* \details
* rate(0) <charge rate provision>,
* rateInterim(1) <charge rate and interim charge provision>,
* rateFinal(2) <charge rate and final charge provision>,
* interim(3) <interim charge provision>,
* final(4) <final charge provision>,
* interimFinal(5) <interim charge and final charge provision>,
* rateInterimFinal(6) <charge rate, interim charge and final charge provision>
*/
u_int8_t advice_mode_combination;
};
/*
* AocCompleteArg ::= SEQUENCE {
* chargedUser PartyNumber,
* chargingAssociation ChargingAssociation OPTIONAL,
* completeArgExtension CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigAocCompleteArg_ARG {
/*! \brief chargingAssociation (optional) */
struct roseQsigAOCChargingAssociation charging_association;
struct rosePartyNumber charged_user_number;
/*! \brief TRUE if charging_association is present */
u_int8_t charging_association_present;
};
/*
* AocCompleteRes ::= SEQUENCE {
* chargingOption ChargingOption,
* completeResExtension CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigAocCompleteRes_RES {
/*!
* \details
* aocFreeOfCharge(0),
* aocContinueCharging(1),
* aocStopCharging(2)
*/
u_int8_t charging_option;
};
/*
* AocDivChargeReqArg ::= SEQUENCE {
* divertingUser PartyNumber,
* chargingAssociation ChargingAssociation OPTIONAL,
* diversionType DiversionType,
* aocDivChargeReqArgExt CHOICE {
* extension [1] IMPLICIT Extension,
* multipleExtension [2] IMPLICIT SEQUENCE OF Extension
* } OPTIONAL
* }
*/
struct roseQsigAocDivChargeReqArg_ARG {
/*! \brief chargingAssociation (optional) */
struct roseQsigAOCChargingAssociation charging_association;
struct rosePartyNumber diverting_user_number;
/*! \brief TRUE if charging_association is present */
u_int8_t charging_association_present;
/*!
* \details
* callForwardingUnconditional(0),
* callForwardingBusy(1),
* callForwardingNoReply(2),
* callDeflection(3)
*/
u_int8_t diversion_type;
};
/* ------------------------------------------------------------------- */
/* /*
* CTIdentifyRes ::= SEQUENCE { * CTIdentifyRes ::= SEQUENCE {
* callIdentity CallIdentity, * callIdentity CallIdentity,
@ -2193,6 +2654,14 @@ union rose_msg_invoke_qsig_args {
struct roseQsigPartyName_ARG ConnectedName; struct roseQsigPartyName_ARG ConnectedName;
struct roseQsigPartyName_ARG BusyName; struct roseQsigPartyName_ARG BusyName;
/* Q.SIG SS-AOC-Operations */
struct roseQsigChargeRequestArg_ARG ChargeRequest;
struct roseQsigAocFinalArg_ARG AocFinal;
struct roseQsigAocInterimArg_ARG AocInterim;
struct roseQsigAocRateArg_ARG AocRate;
struct roseQsigAocCompleteArg_ARG AocComplete;
struct roseQsigAocDivChargeReqArg_ARG AocDivChargeReq;
/* Q.SIG Call-Transfer-Operations */ /* Q.SIG Call-Transfer-Operations */
struct roseQsigCTInitiateArg_ARG CallTransferInitiate; struct roseQsigCTInitiateArg_ARG CallTransferInitiate;
struct roseQsigCTSetupArg_ARG CallTransferSetup; struct roseQsigCTSetupArg_ARG CallTransferSetup;
@ -2219,6 +2688,10 @@ union rose_msg_invoke_qsig_args {
/*! \brief Facility ie result qsig messages with arguments. */ /*! \brief Facility ie result qsig messages with arguments. */
union rose_msg_result_qsig_args { union rose_msg_result_qsig_args {
/* Q.SIG SS-AOC-Operations */
struct roseQsigChargeRequestRes_RES ChargeRequest;
struct roseQsigAocCompleteRes_RES AocComplete;
/* Q.SIG Call-Transfer-Operations */ /* Q.SIG Call-Transfer-Operations */
struct roseQsigCTIdentifyRes_RES CallTransferIdentify; struct roseQsigCTIdentifyRes_RES CallTransferIdentify;

@ -169,9 +169,10 @@ const unsigned char *rose_dec_qsig_BusyName_ARG(struct pri *ctrl, unsigned tag,
/* /*
* Q.SIG Dummy invoke/result argument used by: * Q.SIG Dummy invoke/result argument used by:
* SS-AOC-Operations,
* Call-Transfer-Operations, * Call-Transfer-Operations,
* Call-Diversion-Operations, * Call-Diversion-Operations,
* and SS-MWI-Operations * and SS-MWI-Operations.
*/ */
unsigned char *rose_enc_qsig_DummyArg_ARG(struct pri *ctrl, unsigned char *pos, unsigned char *rose_enc_qsig_DummyArg_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args); unsigned char *end, const union rose_msg_invoke_args *args);
@ -185,6 +186,49 @@ const unsigned char *rose_dec_qsig_DummyRes_RES(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end, const unsigned char *pos, const unsigned char *end,
union rose_msg_result_args *args); union rose_msg_result_args *args);
/* Q.SIG SS-AOC-Operations */
unsigned char *rose_enc_qsig_ChargeRequest_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args);
unsigned char *rose_enc_qsig_ChargeRequest_RES(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_result_args *args);
unsigned char *rose_enc_qsig_AocFinal_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args);
unsigned char *rose_enc_qsig_AocInterim_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args);
unsigned char *rose_enc_qsig_AocRate_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args);
unsigned char *rose_enc_qsig_AocComplete_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args);
unsigned char *rose_enc_qsig_AocComplete_RES(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_result_args *args);
unsigned char *rose_enc_qsig_AocDivChargeReq_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args);
const unsigned char *rose_dec_qsig_ChargeRequest_ARG(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_invoke_args *args);
const unsigned char *rose_dec_qsig_ChargeRequest_RES(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_result_args *args);
const unsigned char *rose_dec_qsig_AocFinal_ARG(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_invoke_args *args);
const unsigned char *rose_dec_qsig_AocInterim_ARG(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_invoke_args *args);
const unsigned char *rose_dec_qsig_AocRate_ARG(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_invoke_args *args);
const unsigned char *rose_dec_qsig_AocComplete_ARG(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_invoke_args *args);
const unsigned char *rose_dec_qsig_AocComplete_RES(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_result_args *args);
const unsigned char *rose_dec_qsig_AocDivChargeReq_ARG(struct pri *ctrl, unsigned tag,
const unsigned char *pos, const unsigned char *end,
union rose_msg_invoke_args *args);
/* Q.SIG Call-Diversion-Operations */ /* Q.SIG Call-Diversion-Operations */
unsigned char *rose_enc_qsig_ActivateDiversionQ_ARG(struct pri *ctrl, unsigned char *pos, unsigned char *rose_enc_qsig_ActivateDiversionQ_ARG(struct pri *ctrl, unsigned char *pos,
unsigned char *end, const union rose_msg_invoke_args *args); unsigned char *end, const union rose_msg_invoke_args *args);

File diff suppressed because it is too large Load Diff

@ -757,6 +757,316 @@ static const struct rose_message rose_qsig_msgs[] = {
.component.invoke.args.qsig.CallingName.name.char_set = 1, .component.invoke.args.qsig.CallingName.name.char_set = 1,
}, },
/* Q.SIG SS-AOC-Operations */
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_ChargeRequest,
.component.invoke.invoke_id = 11,
.component.invoke.args.qsig.ChargeRequest.num_records = 0,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_ChargeRequest,
.component.invoke.invoke_id = 12,
.component.invoke.args.qsig.ChargeRequest.num_records = 1,
.component.invoke.args.qsig.ChargeRequest.advice_mode_combinations[0] = 3,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_ChargeRequest,
.component.invoke.invoke_id = 13,
.component.invoke.args.qsig.ChargeRequest.num_records = 2,
.component.invoke.args.qsig.ChargeRequest.advice_mode_combinations[0] = 4,
.component.invoke.args.qsig.ChargeRequest.advice_mode_combinations[1] = 3,
},
{
.type = ROSE_COMP_TYPE_RESULT,
.component.result.operation = ROSE_QSIG_ChargeRequest,
.component.result.invoke_id = 14,
.component.result.args.qsig.ChargeRequest.advice_mode_combination = 3,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_GetFinalCharge,
.component.invoke.invoke_id = 15,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocFinal,
.component.invoke.invoke_id = 16,
.component.invoke.args.qsig.AocFinal.type = 0,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocFinal,
.component.invoke.invoke_id = 17,
.component.invoke.args.qsig.AocFinal.type = 1,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocFinal,
.component.invoke.invoke_id = 18,
.component.invoke.args.qsig.AocFinal.type = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.currency = 800,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.multiplier = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.currency = "Rupies",
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocFinal,
.component.invoke.invoke_id = 19,
.component.invoke.args.qsig.AocFinal.type = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.currency = 800,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.multiplier = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.currency = "Rupies",
.component.invoke.args.qsig.AocFinal.specific.billing_id_present = 1,
.component.invoke.args.qsig.AocFinal.specific.billing_id = 2,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocFinal,
.component.invoke.invoke_id = 20,
.component.invoke.args.qsig.AocFinal.type = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.currency = 800,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.multiplier = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.currency = "Rupies",
.component.invoke.args.qsig.AocFinal.charging_association_present = 1,
.component.invoke.args.qsig.AocFinal.charging_association.type = 0,
.component.invoke.args.qsig.AocFinal.charging_association.id = 200,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocFinal,
.component.invoke.invoke_id = 21,
.component.invoke.args.qsig.AocFinal.type = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.currency = 800,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.multiplier = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.currency = "Rupies",
.component.invoke.args.qsig.AocFinal.specific.billing_id_present = 1,
.component.invoke.args.qsig.AocFinal.specific.billing_id = 2,
.component.invoke.args.qsig.AocFinal.charging_association_present = 1,
.component.invoke.args.qsig.AocFinal.charging_association.type = 0,
.component.invoke.args.qsig.AocFinal.charging_association.id = 200,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocFinal,
.component.invoke.invoke_id = 22,
.component.invoke.args.qsig.AocFinal.type = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.currency = 800,
.component.invoke.args.qsig.AocFinal.specific.recorded.amount.multiplier = 2,
.component.invoke.args.qsig.AocFinal.specific.recorded.currency = "Rupies",
.component.invoke.args.qsig.AocFinal.charging_association_present = 1,
.component.invoke.args.qsig.AocFinal.charging_association.type = 1,
.component.invoke.args.qsig.AocFinal.charging_association.number.plan = 4,
.component.invoke.args.qsig.AocFinal.charging_association.number.length = 4,
.component.invoke.args.qsig.AocFinal.charging_association.number.str = "1802",
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocInterim,
.component.invoke.invoke_id = 23,
.component.invoke.args.qsig.AocInterim.type = 0,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocInterim,
.component.invoke.invoke_id = 24,
.component.invoke.args.qsig.AocInterim.type = 1,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocInterim,
.component.invoke.invoke_id = 25,
.component.invoke.args.qsig.AocInterim.type = 2,
.component.invoke.args.qsig.AocInterim.specific.recorded.amount.currency = 800,
.component.invoke.args.qsig.AocInterim.specific.recorded.amount.multiplier = 2,
.component.invoke.args.qsig.AocInterim.specific.recorded.currency = "Rupies",
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocInterim,
.component.invoke.invoke_id = 26,
.component.invoke.args.qsig.AocInterim.type = 2,
.component.invoke.args.qsig.AocInterim.specific.recorded.amount.currency = 800,
.component.invoke.args.qsig.AocInterim.specific.recorded.amount.multiplier = 2,
.component.invoke.args.qsig.AocInterim.specific.recorded.currency = "Rupies",
.component.invoke.args.qsig.AocInterim.specific.billing_id_present = 1,
.component.invoke.args.qsig.AocInterim.specific.billing_id = 2,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 27,
.component.invoke.args.qsig.AocRate.type = 0,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 28,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 0,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.special_charging_code = 3,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 29,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.currency = "Dollars",
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.amount.currency = 7,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.amount.multiplier = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.charging_type = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.time.length = 8,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.time.scale = 4,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 30,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.currency = "Dollars",
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.amount.currency = 7,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.amount.multiplier = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.charging_type = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.time.length = 8,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.time.scale = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.granularity_present = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.granularity.length = 20,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.duration.granularity.scale = 3,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 31,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 2,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.flat_rate.currency = "Euros",
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.flat_rate.amount.currency = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.flat_rate.amount.multiplier = 1,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 32,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 3,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.volume_rate.currency = "Yen",
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.volume_rate.amount.currency = 300,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.volume_rate.amount.multiplier = 5,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.volume_rate.unit = 2,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 33,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 2,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 2,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.flat_rate.currency = "Euros",
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.flat_rate.amount.currency = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].u.flat_rate.amount.multiplier = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[1].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[1].currency_type = 3,
.component.invoke.args.qsig.AocRate.currency_info.list[1].u.volume_rate.currency = "Yen",
.component.invoke.args.qsig.AocRate.currency_info.list[1].u.volume_rate.amount.currency = 300,
.component.invoke.args.qsig.AocRate.currency_info.list[1].u.volume_rate.amount.multiplier = 5,
.component.invoke.args.qsig.AocRate.currency_info.list[1].u.volume_rate.unit = 2,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 34,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 4,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 35,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 5,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocRate,
.component.invoke.invoke_id = 36,
.component.invoke.args.qsig.AocRate.type = 1,
.component.invoke.args.qsig.AocRate.currency_info.num_records = 1,
.component.invoke.args.qsig.AocRate.currency_info.list[0].charged_item = 4,
.component.invoke.args.qsig.AocRate.currency_info.list[0].currency_type = 6,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocComplete,
.component.invoke.invoke_id = 37,
.component.invoke.args.qsig.AocComplete.charged_user_number.plan = 4,
.component.invoke.args.qsig.AocComplete.charged_user_number.length = 4,
.component.invoke.args.qsig.AocComplete.charged_user_number.str = "8340",
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocComplete,
.component.invoke.invoke_id = 38,
.component.invoke.args.qsig.AocComplete.charged_user_number.plan = 4,
.component.invoke.args.qsig.AocComplete.charged_user_number.length = 4,
.component.invoke.args.qsig.AocComplete.charged_user_number.str = "8340",
.component.invoke.args.qsig.AocComplete.charging_association_present = 1,
.component.invoke.args.qsig.AocComplete.charging_association.type = 0,
.component.invoke.args.qsig.AocComplete.charging_association.id = 8298,
},
{
.type = ROSE_COMP_TYPE_RESULT,
.component.result.operation = ROSE_QSIG_AocComplete,
.component.result.invoke_id = 39,
.component.result.args.qsig.AocComplete.charging_option = 2,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocDivChargeReq,
.component.invoke.invoke_id = 40,
.component.invoke.args.qsig.AocDivChargeReq.diverting_user_number.plan = 4,
.component.invoke.args.qsig.AocDivChargeReq.diverting_user_number.length = 4,
.component.invoke.args.qsig.AocDivChargeReq.diverting_user_number.str = "8340",
.component.invoke.args.qsig.AocDivChargeReq.diversion_type = 3,
},
{
.type = ROSE_COMP_TYPE_INVOKE,
.component.invoke.operation = ROSE_QSIG_AocDivChargeReq,
.component.invoke.invoke_id = 41,
.component.invoke.args.qsig.AocDivChargeReq.diverting_user_number.plan = 4,
.component.invoke.args.qsig.AocDivChargeReq.diverting_user_number.length = 4,
.component.invoke.args.qsig.AocDivChargeReq.diverting_user_number.str = "8340",
.component.invoke.args.qsig.AocDivChargeReq.charging_association_present = 1,
.component.invoke.args.qsig.AocDivChargeReq.charging_association.type = 0,
.component.invoke.args.qsig.AocDivChargeReq.charging_association.id = 8298,
.component.invoke.args.qsig.AocDivChargeReq.diversion_type = 3,
},
/* Q.SIG Call-Transfer-Operations (CT) */ /* Q.SIG Call-Transfer-Operations (CT) */
{ {
.type = ROSE_COMP_TYPE_INVOKE, .type = ROSE_COMP_TYPE_INVOKE,
@ -1697,6 +2007,8 @@ int main(int argc, char *argv[])
pri_message(&dummy_ctrl, "\n"); pri_message(&dummy_ctrl, "\n");
pri_message(&dummy_ctrl, "sizeof(struct roseQsigCallRerouting_ARG) = %u\n", pri_message(&dummy_ctrl, "sizeof(struct roseQsigCallRerouting_ARG) = %u\n",
(unsigned) sizeof(struct roseQsigCallRerouting_ARG)); (unsigned) sizeof(struct roseQsigCallRerouting_ARG));
pri_message(&dummy_ctrl, "sizeof(struct roseQsigAocRateArg_ARG) = %u\n",
(unsigned) sizeof(struct roseQsigAocRateArg_ARG));
pri_message(&dummy_ctrl, "sizeof(struct roseQsigMWIInterrogateRes) = %u\n", pri_message(&dummy_ctrl, "sizeof(struct roseQsigMWIInterrogateRes) = %u\n",
(unsigned) sizeof(struct roseQsigMWIInterrogateRes)); (unsigned) sizeof(struct roseQsigMWIInterrogateRes));

Loading…
Cancel
Save