📄 rvmegacoencode.c
字号:
{
RvMegacoEncodeOptions *opt = (RvMegacoEncodeOptions *)rvStrStreamGetUserData(os);
const RvMegacoTopologyDescriptor *top = rvMegacoContextPropertiesGetTopology(x);
const char *sep = opt->format->indent2;
if(rvMegacoTopologyDescriptorGetNumTriples(top))
{
rvStrStreamWriteStr(os, sep);
rvMegacoTopologyDescriptorEncode(top, os);
sep = opt->format->comma2;
}
if(rvMegacoContextPropertiesGetPriority(x) != rvMegacoContextPropertiesNoPriority)
{
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->compact ? "PR=" : "Priority=");
rvStrStreamWriteUInt(os, rvMegacoContextPropertiesGetPriority(x));
sep = opt->format->comma2;
}
if(rvMegacoContextPropertiesIsEmergency(x))
{
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->compact ? "EG" : "Emergency");
}
}
static void rvMegacoActionEncode(const RvMegacoAction *x, RvStrStream *os)
{
RvMegacoEncodeOptions *opt = (RvMegacoEncodeOptions *)rvStrStreamGetUserData(os);
const char *sep = opt->format->indent2;
const RvMegacoContextProperties *props = rvMegacoActionGetContextProperties(x);
RvMegacoContextAudit audit = rvMegacoActionGetAudit(x);
size_t i;
rvStrStreamWriteStr(os, opt->format->indent1);
rvStrStreamWriteStr(os, opt->compact ? "C=" : "Context=");
rvMegacoContextIdEncode(rvMegacoActionGetContextId(x), os);
rvStrStreamPut(os, '{');
if(!rvMegacoContextPropertiesIsEmpty(props))
rvMegacoContextPropertiesEncode(props, os), sep = opt->format->comma2;
if(audit)
{
const char *sep2 = nullStr;
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->compact ? "CA" : "ContextAudit");
rvStrStreamPut(os, '{');
if(audit & RV_MEGACOCONTEXTAUDIT_TOPOLOGY)
rvStrStreamWriteStr(os, opt->compact ? "TP" : "Topology"), sep2 = opt->format->comma;
if(audit & RV_MEGACOCONTEXTAUDIT_EMERGENCY)
{
rvStrStreamWriteStr(os, sep2);
rvStrStreamWriteStr(os, opt->compact ? "EG" : "Emergency"), sep2 = opt->format->comma;
}
if(audit & RV_MEGACOCONTEXTAUDIT_PRIORITY)
{
rvStrStreamWriteStr(os, sep2);
rvStrStreamWriteStr(os, opt->compact ? "PR" : "Priority"), sep2 = opt->format->comma;
}
rvStrStreamPut(os, '}');
sep = opt->format->comma2;
}
for(i=0; i<rvMegacoActionGetNumCommands(x); ++i)
{
rvStrStreamWriteStr(os, sep);
rvMegacoCommandEncode(rvMegacoActionGetCommand(x, i), os);
sep = opt->format->comma2;
}
rvStrStreamWriteStr(os, opt->format->indent1);
rvStrStreamPut(os, '}');
}
static void rvMegacoCommandReplyEncodeNotifyReply(const RvMegacoCommandReply *x, RvStrStream *os)
{
const RvMegacoErrorDescriptor *error = rvMegacoCommandReplyGetError(x);
rvMegacoTerminationIdEncode(rvMegacoCommandReplyGetTerminationId(x), os);
if(rvMegacoErrorDescriptorIsSet(error))
{
rvStrStreamPut(os, '{');
rvMegacoErrorDescriptorEncode(error, os);
rvStrStreamPut(os, '}');
}
}
static void rvMegacoCommandReplyEncodeServiceChangeReply(const RvMegacoCommandReply *x, RvStrStream *os)
{
RvMegacoEncodeOptions *opt = (RvMegacoEncodeOptions *)rvStrStreamGetUserData(os);
const RvMegacoErrorDescriptor *error = rvMegacoCommandReplyGetError(x);
rvMegacoTerminationIdEncode(rvMegacoCommandReplyGetTerminationId(x), os);
if(rvMegacoErrorDescriptorIsSet(error))
{
rvStrStreamPut(os, '{');
rvMegacoErrorDescriptorEncode(error, os);
rvStrStreamPut(os, '}');
}
else
{
const RvMegacoServiceChangeDescriptor *sc = rvMegacoCommandReplyGetServiceChange(x);
const char *address = rvMegacoServiceChangeDescriptorGetAddress(sc);
const RvMegacoEntityAddress *mgc = rvMegacoServiceChangeDescriptorGetMgc(sc);
const char *prof = rvMegacoServiceChangeDescriptorGetProfile(sc);
unsigned int version = rvMegacoServiceChangeDescriptorGetVersion(sc);
const char *sep = opt->compact ? "{SV{" : "{Services{";
if(*address)
{
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->compact ? "AD=" : "ServiceChangeAddress=");
rvStrStreamWriteStr(os, address);
sep = opt->format->comma;
}
if(rvMegacoEntityAddressIsSet(mgc))
{
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->compact ? "MG=" : "MgcIdToTry=");
rvMegacoEntityAddressEncode(mgc, os);
sep = opt->format->comma;
}
if(*prof)
{
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->compact ? "PF=" : "Profile=");
rvStrStreamWriteStr(os, prof);
rvStrStreamPut(os, '/');
rvStrStreamWriteUInt(os, rvMegacoServiceChangeDescriptorGetProfileVersion(sc));
sep = opt->format->comma;
}
if(version != rvMegacoServiceChangeDescriptorNoVersion)
{
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->compact ? "V=" : "Version=");
rvStrStreamWriteUInt(os, version);
sep = opt->format->comma;
}
if(sep == opt->format->comma)
{
rvStrStreamWriteStr(os, "}}");
}
}
}
static void rvMegacoCommandReplyEncodeTermAuditReply(const RvMegacoCommandReply *x, RvStrStream *os)
{
RvMegacoEncodeOptions *opt = (RvMegacoEncodeOptions *)rvStrStreamGetUserData(os);
const RvMegacoErrorDescriptor *error = rvMegacoCommandReplyGetError(x);
RvMegacoAuditItems info = rvMegacoAuditDescriptorGetRequestedInfo(rvMegacoCommandReplyGetAuditDescriptor(x));
const char *sep = opt->format->brace3;
rvMegacoTerminationIdEncode(rvMegacoCommandReplyGetTerminationId(x), os);
if(rvMegacoMediaDescriptorIsSet(rvMegacoCommandReplyGetMedia(x)) ||
info & RV_MEGACOAUDITITEMS_MEDIA)
{
rvStrStreamWriteStr(os, sep);
rvMegacoMediaDescriptorEncode(rvMegacoCommandReplyGetMedia(x), os);
sep = opt->format->comma3;
}
if(rvMegacoModemDescriptorIsSet(rvMegacoCommandReplyGetModem(x)) ||
info & RV_MEGACOAUDITITEMS_MODEM)
{
rvStrStreamWriteStr(os, sep);
rvMegacoModemDescriptorEncode(rvMegacoCommandReplyGetModem(x), os);
sep = opt->format->comma3;
}
if(rvMegacoMuxDescriptorIsSet(rvMegacoCommandReplyGetMux(x)) ||
info & RV_MEGACOAUDITITEMS_MUX)
{
rvStrStreamWriteStr(os, sep);
rvMegacoMuxDescriptorEncode(rvMegacoCommandReplyGetMux(x), os);
sep = opt->format->comma3;
}
if(rvMegacoEventsDescriptorIsSet(rvMegacoCommandReplyGetEvents(x))
|| info & RV_MEGACOAUDITITEMS_EVENTS)
{
rvStrStreamWriteStr(os, sep);
rvMegacoEventsDescriptorEncode(rvMegacoCommandReplyGetEvents(x), os);
sep = opt->format->comma3;
}
if(rvMegacoSignalsDescriptorIsSet(rvMegacoCommandReplyGetSignals(x)) ||
info & RV_MEGACOAUDITITEMS_SIGNALS)
{
rvStrStreamWriteStr(os, sep);
rvMegacoSignalsDescriptorEncode(rvMegacoCommandReplyGetSignals(x), os);
sep = opt->format->comma3;
}
if(rvMegacoDigitMapDescriptorIsSet(rvMegacoCommandReplyGetDigitMap(x)) ||
info & RV_MEGACOAUDITITEMS_DIGITMAP)
{
rvStrStreamWriteStr(os, sep);
rvMegacoDigitMapDescriptorEncode(rvMegacoCommandReplyGetDigitMap(x), os);
sep = opt->format->comma3;
}
if(rvMegacoObservedEventsDescriptorIsSet(rvMegacoCommandReplyGetObservedEvents(x)) ||
info & RV_MEGACOAUDITITEMS_OBSERVEDEVENTS)
{
rvStrStreamWriteStr(os, sep);
rvMegacoObservedEventsDescriptorEncode(rvMegacoCommandReplyGetObservedEvents(x), os);
sep = opt->format->comma3;
}
if(rvMegacoEventBufferDescriptorIsSet(rvMegacoCommandReplyGetEventBuffer(x)) ||
info & RV_MEGACOAUDITITEMS_EVENTBUFFER)
{
rvStrStreamWriteStr(os, sep);
rvMegacoEventBufferDescriptorEncode(rvMegacoCommandReplyGetEventBuffer(x), os);
sep = opt->format->comma3;
}
if(rvMegacoStatisticsDescriptorIsSet(rvMegacoCommandReplyGetStatistics(x)) ||
info & RV_MEGACOAUDITITEMS_STATS)
{
rvStrStreamWriteStr(os, sep);
rvMegacoStatisticsDescriptorEncode(rvMegacoCommandReplyGetStatistics(x), os);
sep = opt->format->comma3;
}
if(rvMegacoPackagesDescriptorIsSet(rvMegacoCommandReplyGetPackages(x)) ||
info & RV_MEGACOAUDITITEMS_PACKAGES)
{
rvStrStreamWriteStr(os, sep);
rvMegacoPackagesDescriptorEncode(rvMegacoCommandReplyGetPackages(x), os);
sep = opt->format->comma3;
}
if(rvMegacoErrorDescriptorIsSet(error))
{
rvStrStreamWriteStr(os, sep);
rvMegacoErrorDescriptorEncode(error, os);
sep = opt->format->comma3;
}
if(sep == opt->format->comma3)
{
rvStrStreamWriteStr(os, opt->format->indent2);
rvStrStreamPut(os, '}');
}
}
static void rvMegacoCommandReplyEncodeTermList(const RvMegacoCommandReply *x, RvStrStream *os)
{
RvMegacoEncodeOptions *opt = (RvMegacoEncodeOptions *)rvStrStreamGetUserData(os);
const RvMegacoErrorDescriptor *error = rvMegacoCommandReplyGetError(x);
rvStrStreamWriteStr(os, opt->compact ? "C" : "Context");
rvStrStreamPut(os, '{');
if(rvMegacoErrorDescriptorIsSet(error))
{
rvMegacoErrorDescriptorEncode(error, os);
}
else
{
size_t i;
for(i=0; i<rvMegacoCommandReplyGetTerminationListSize(x); ++i)
{
if(i) rvStrStreamWriteStr(os, opt->format->comma);
rvMegacoTerminationIdEncode(rvMegacoCommandReplyGetTerminationListElem(x, i), os);
}
}
rvStrStreamPut(os, '}');
}
static void rvMegacoCommandReplyEncode(const RvMegacoCommandReply *x, RvStrStream *os)
{
RvMegacoEncodeOptions *opt = (RvMegacoEncodeOptions *)rvStrStreamGetUserData(os);
switch(rvMegacoCommandReplyGetType(x))
{
case RV_MEGACOCOMMANDTYPE_ADD:
rvStrStreamWriteStr(os, opt->compact ? "A=" : "Add=");
rvMegacoCommandReplyEncodeTermAuditReply(x, os);
break;
case RV_MEGACOCOMMANDTYPE_MODIFY:
rvStrStreamWriteStr(os, opt->compact ? "MF=" : "Modify=");
rvMegacoCommandReplyEncodeTermAuditReply(x, os);
break;
case RV_MEGACOCOMMANDTYPE_SUBTRACT:
rvStrStreamWriteStr(os, opt->compact ? "S=" : "Subtract=");
rvMegacoCommandReplyEncodeTermAuditReply(x, os);
break;
case RV_MEGACOCOMMANDTYPE_MOVE:
rvStrStreamWriteStr(os, opt->compact ? "MV=" : "Move=");
rvMegacoCommandReplyEncodeTermAuditReply(x, os);
break;
case RV_MEGACOCOMMANDTYPE_AUDITVAL:
rvStrStreamWriteStr(os, opt->compact ? "AV=" : "AuditValue=");
if(rvMegacoCommandReplyIsTerminationList(x))
rvMegacoCommandReplyEncodeTermList(x, os);
else
rvMegacoCommandReplyEncodeTermAuditReply(x, os);
break;
case RV_MEGACOCOMMANDTYPE_AUDITCAP:
rvStrStreamWriteStr(os, opt->compact ? "AC=" : "AuditCapability=");
if(rvMegacoCommandReplyIsTerminationList(x))
rvMegacoCommandReplyEncodeTermList(x, os);
else
rvMegacoCommandReplyEncodeTermAuditReply(x, os);
break;
case RV_MEGACOCOMMANDTYPE_NOTIFY:
rvStrStreamWriteStr(os, opt->compact ? "N=" : "Notify=");
rvMegacoCommandReplyEncodeNotifyReply(x, os);
break;
case RV_MEGACOCOMMANDTYPE_SVCCHANGE:
rvStrStreamWriteStr(os, opt->compact ? "SC=" : "ServiceChange=");
rvMegacoCommandReplyEncodeServiceChangeReply(x, os);
break;
default:
rvStrStreamSetErrorStatus(os, RV_MEGACOENCODEERROR_CORRUPTOBJECT);
break;
}
}
static void rvMegacoActionReplyEncode(const RvMegacoActionReply *x, RvStrStream *os)
{
RvMegacoEncodeOptions *opt = (RvMegacoEncodeOptions *)rvStrStreamGetUserData(os);
const RvMegacoErrorDescriptor *error = rvMegacoActionReplyGetError(x);
rvStrStreamWriteStr(os, opt->format->indent1);
rvStrStreamWriteStr(os, opt->compact ? "C=" : "Context=");
rvMegacoContextIdEncode(rvMegacoActionReplyGetContextId(x), os);
rvStrStreamPut(os, '{');
if(rvMegacoErrorDescriptorIsSet(error))
{
rvStrStreamWriteStr(os, opt->format->indent2);
rvMegacoErrorDescriptorEncode(error, os);
}
else
{
const char *sep = nullStr;
const RvMegacoContextProperties *props = rvMegacoActionReplyGetContextProperties(x);
size_t i;
if(!rvMegacoContextPropertiesIsEmpty(props))
rvMegacoContextPropertiesEncode(props, os), sep = opt->format->comma;
for(i=0; i<rvMegacoActionReplyGetNumReplies(x); ++i)
{
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteStr(os, opt->format->indent2);
rvMegacoCommandReplyEncode(rvMegacoActionReplyGetReply(x, i), os);
sep = opt->format->comma;
}
}
rvStrStreamWriteStr(os, opt->format->indent1);
rvStrStreamPut(os, '}');
}
void rvMegacoMessageHeaderEncode(const RvMegacoEntityAddress *sender, unsigned int version, RvStrStream *os, RvBool encodeCompact)
{
rvStrStreamWriteStr(os, encodeCompact ? "!/" : "MEGACO/");
rvStrStreamWriteUInt(os, version);
rvStrStreamPut(os, ' ');
rvMegacoEntityAddressEncode(sender, os);
rvStrStreamPut(os, '\n');
}
void rvMegacoTransactionEncode(const RvMegacoTransaction *x, RvStrStream *os, RvBool encodeCompact)
{
RvMegacoEncodeOptions opt;
size_t i;
opt.compact = encodeCompact;
opt.format = encodeCompact ? &rvFormatSmall : &rvFormatPretty;
rvStrStreamSetUserData(os, &opt);
rvStrStreamWriteStr(os, encodeCompact ? "T=" : "Transaction=");
rvStrStreamWriteUInt(os, rvMegacoTransactionGetId(x));
rvStrStreamPut(os, '{');
for(i=0; i<rvMegacoTransactionGetNumActions(x); ++i)
{
if(i) rvStrStreamWriteStr(os, opt.format->comma);
rvMegacoActionEncode(rvMegacoTransactionGetAction(x, i), os);
}
rvStrStreamWriteStr(os, opt.format->indent0);
rvStrStreamWriteStr(os, "}\n");
}
void rvMegacoTransactionReplyEncode(const RvMegacoTransactionReply *x, RvStrStream *os, RvBool encodeCompact)
{
RvMegacoEncodeOptions opt;
opt.compact = encodeCompact;
opt.format = encodeCompact ? &rvFormatSmall : &rvFormatPretty;
rvStrStreamSetUserData(os, &opt);
rvStrStreamWriteStr(os, encodeCompact ? "P=" : "Reply=");
rvStrStreamWriteUInt(os, rvMegacoTransactionReplyGetId(x));
rvStrStreamPut(os, '{');
if(rvMegacoTransactionReplyIsImmediateAckRequired(x))
{
rvStrStreamWriteStr(os, encodeCompact ? "IA" : "ImmAckRequired");
rvStrStreamWriteStr(os, opt.format->comma);
}
if(rvMegacoErrorDescriptorIsSet(rvMegacoTransactionReplyGetError(x)))
{
rvMegacoErrorDescriptorEncode(rvMegacoTransactionReplyGetError(x), os);
}
else
{
size_t i;
for(i=0; i<rvMegacoTransactionReplyGetNumReplies(x); ++i)
{
if(i) rvStrStreamWriteStr(os, opt.format->comma);
rvMegacoActionReplyEncode(rvMegacoTransactionReplyGetReply(x, i), os);
}
}
rvStrStreamWriteStr(os, opt.format->indent0);
rvStrStreamWriteStr(os, "}\n");
}
void rvMegacoTransactionPendingEncode(RvMegacoTransactionId id, RvStrStream *os, RvBool encodeCompact)
{
rvStrStreamWriteStr(os, encodeCompact ? "PN=" : "Pending=");
rvStrStreamWriteUInt(os, id);
rvStrStreamWriteStr(os, "{}\n");
}
void rvMegacoResponseAckEncode(const RvMegacoResponseAck *x, RvStrStream *os, RvBool encodeCompact)
{
if(!rvMegacoResponseAckIsEmpty(x))
{
RvListIter(RvMegacoTransactionIdPair) i;
const RvFormatTable *format = encodeCompact ? &rvFormatSmall : &rvFormatPretty;
const char *sep = nullStr;
rvStrStreamWriteStr(os, encodeCompact ? "K{" : "TransactionResponseAck{");
for(i=rvListBegin(&x->acks); i!=rvListEnd(&x->acks); i=rvListIterNext(i))
{
const RvMegacoTransactionIdPair *pair = rvListIterData(i);
rvStrStreamWriteStr(os, sep);
rvStrStreamWriteUInt(os, pair->first);
if(pair->first < pair->second)
{
rvStrStreamPut(os, '-');
rvStrStreamWriteUInt(os, pair->second);
}
sep = format->comma;
}
rvStrStreamWriteStr(os, "}\n");
}
}
void rvMegacoErrorEncode(const RvMegacoErrorDescriptor *x, RvStrStream *os, RvBool encodeCompact)
{
RvMegacoEncodeOptions opt;
opt.compact = encodeCompact;
opt.format = encodeCompact ? &rvFormatSmall : &rvFormatPretty;
rvStrStreamSetUserData(os, &opt);
rvMegacoErrorDescriptorEncode(x, os);
rvStrStreamPut(os, '\n');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -