module ECBE_Types {

/* Type definitions for the ECBE (External Cell Broadcast Entity) protocol of OsmoCBC */
/* (C) 2021 by Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 */

/***********************************************************************
 * smscb.schema.json
 ***********************************************************************/

type charstring EcbeLanguageCode length(2);

type integer EcbeMessageId (0..65535);

type enumerated EcbeGeographicScope {
	cell_wide_immediate,
	plmn_wide,
	lac_sac_tac_wide,
	cell_wide
};

type integer EcbeMessageCode (0..1023);

type integer EcbeUpdateNumber (0..15);

type integer EcbeSerialNrEncoded (0..65535);

type record EcbeSerialNrDecoded {
	EcbeGeographicScope	geo_scope,
	EcbeMessageCode		msg_code,
	EcbeUpdateNumber	update_nr
};

type union EcbeSerialNr {
	EcbeSerialNrEncoded	serial_nr_encoded,
	EcbeSerialNrDecoded	serial_nr_decoded
};

type integer EcbeDcsEncoded (0..255);

type enumerated EcbeCharacterSet {
	gsm,
	eight_bit,
	ucs2
};

type integer EcbeDcsClass (0..3);

type record EcbePayloadDecoded {
	EcbeCharacterSet	character_set optional,
	EcbeLanguageCode	Language optional,
	EcbeDcsClass		dcs_class optional,
	charstring		data_utf8
};

type charstring EcbePage;
type record of EcbePage EcbePages;

type record EcbePayloadEncoded {
	EcbeDcsEncoded		dcs,
	EcbePages		pages
};

type integer EcbeWarningTypeEncoded (0..127);

type enumerated EcbeWarningTypeDecoded {
	earthquake,
	tsunami,
	earthquake_and_tsunami,
	test,
	other,
	rfu
};

type union EcbeWarningType {
	EcbeWarningTypeEncoded	warning_type_encoded,
	EcbeWarningTypeDecoded	warning_type_decoded
};

type record EcbePayloadEtws {
	EcbeWarningType		warning_type,
	boolean			emergency_user_alert optional,
	boolean			popup_on_display optional,
	charstring		warning_sec_info optional
};

type union EcbePayload {
	EcbePayloadEncoded	payload_encoded,
	EcbePayloadDecoded	payload_decoded,
	EcbePayloadEtws		payload_etws
};

type record EcbeSmscbMessage {
	EcbeSerialNr	serial_nr,
	EcbeMessageId	message_id,
	EcbePayload	payload
};

external function enc_EcbeSmscbMessage(in EcbeSmscbMessage inp) return octetstring
	with { extension "prototype(convert) encode(JSON)" }
external function dec_EcbeSmscbMessage(in octetstring inp) return EcbeSmscbMessage
	with { extension "prototype(convert) decode(JSON)" }

/***********************************************************************
 * cbc.schema.json
 ***********************************************************************/

type enumerated EcbeCategory {
	normal,
	high_priority,
	background
};

type integer EcbeRepetitionPeriod (1..4095);

type enumerated EcbeChannelIndicator {
	basic,
	extended
};

type integer EcbeWarningPeriodSec (0..3600);

type integer EcbeNumberOfBroadcasts (0..65535);

type record EcbeScopePlmn {
};

type union EcbeScope {
	EcbeScopePlmn	scope_plmn
};

type record EcbeCbcMessage {
	charstring		cbe_name optional,
	EcbeCategory		category optional,
	EcbeRepetitionPeriod	repetition_period optional,
	EcbeNumberOfBroadcasts	num_of_bcast optional,
	EcbeScope		scope,
	EcbeSmscbMessage	smscb_message
};

external function enc_EcbeCbcMessage(in EcbeCbcMessage inp) return octetstring
	with { extension "prototype(convert) encode(JSON)" }
external function dec_EcbeCbcMessage(in octetstring inp) return EcbeCbcMessage
	with { extension "prototype(convert) decode(JSON)" }

} with { encode "JSON" }
