MAP codec: Add functions to encode/decode MAP Address-String
diff --git a/src/map_codec.erl b/src/map_codec.erl
index a1aaacd..7d39f76 100644
--- a/src/map_codec.erl
+++ b/src/map_codec.erl
@@ -19,10 +19,56 @@
-module(map_codec).
-author('Harald Welte <laforge@gnumonks.org>').
--include("map.hrl").
+%-include("map.hrl").
+-include_lib("osmo_ss7/include/isup.hrl").
-export([parse_tcap_msg/1, encode_tcap_msgt/2]).
+-export([parse_addr_string/1, encode_addr_string/1]).
+-define(MAP_ADDR_NAT_UNKNOWN, 0).
+-define(MAP_ADDR_NAT_INTERNATIONAL, 1).
+-define(MAP_ADDR_NAT_NATIONAL, 2).
+-define(MAP_ADDR_NAT_NETWORK_SPEC, 3).
+-define(MAP_ADDR_NAT_SUBSCRIBER, 4).
+-define(MAP_ADDR_NAT_RES, 5).
+-define(MAP_ADDR_NAT_ABBREVIATED, 6).
+-define(MAP_ADDR_NAT_RES_FOR_EXT, 7).
+
+% convert from MAP -> ISUP 'nature of address'
+nature_map2isup(NatureMap) ->
+ case NatureMap of
+ ?MAP_ADDR_NAT_INTERNATIONAL -> ?ISUP_ADDR_NAT_INTERNATIONAL;
+ ?MAP_ADDR_NAT_NATIONAL -> ?ISUP_ADDR_NAT_NATIONAL;
+ ?MAP_ADDR_NAT_SUBSCRIBER -> ?ISUP_ADDR_NAT_SUBSCRIBER;
+ _ -> NatureMap
+ end.
+
+% convert from ISUP -> MAP 'nature of address'
+nature_isup2map(NatureIsup) ->
+ case NatureIsup of
+ ?ISUP_ADDR_NAT_INTERNATIONAL -> ?MAP_ADDR_NAT_INTERNATIONAL;
+ ?ISUP_ADDR_NAT_NATIONAL -> ?MAP_ADDR_NAT_NATIONAL;
+ ?ISUP_ADDR_NAT_SUBSCRIBER -> ?MAP_ADDR_NAT_SUBSCRIBER;
+ _ -> NatureIsup
+ end.
+
+
+parse_addr_string(AddrList) when is_list(AddrList) ->
+ parse_addr_string(list_to_binary(AddrList));
+parse_addr_string(AddrBin) when is_binary(AddrBin) ->
+ <<1:1, NatureMap:3, Numplan:4, Remain/binary>> = AddrBin,
+ PhoneNum = isup_codec:parse_isup_party(Remain, 0),
+ NatureIsup = nature_map2isup(NatureMap),
+ #party_number{nature_of_addr_ind = NatureIsup,
+ numbering_plan = Numplan,
+ phone_number = PhoneNum}.
+
+encode_addr_string(#party_number{nature_of_addr_ind = NatureIsup,
+ numbering_plan = Numplan,
+ phone_number = PhoneNum}) ->
+ NatureMap = nature_isup2map(NatureIsup),
+ {PhoneBin, _OddEven} = isup_codec:encode_isup_party(PhoneNum),
+ <<1:1, NatureMap:3, Numplan:4, PhoneBin/binary>>.
parse_tcap_msg(MsgBin) when is_binary(MsgBin) ->
case asn1rt:decode('map', 'MapSpecificPDUs', MsgBin) of