⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rvmegacoencode.c

📁 h.248协议源码
💻 C
📖 第 1 页 / 共 4 页
字号:
{
	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 + -