blob: 0ccbd72647bfbf51a1c29a89d54d0d7255c73b33 [file] [log] [blame]
Harald Weltef188fca2012-02-02 23:52:08 +01001% GSM MAP codec wrapper functions
2
3% (C) 2011-2012 by Harald Welte <laforge@gnumonks.org>
4%
5% All Rights Reserved
6%
7% This program is free software; you can redistribute it and/or modify
8% it under the terms of the GNU Affero General Public License as
9% published by the Free Software Foundation; either version 3 of the
10% License, or (at your option) any later version.
11%
12% This program is distributed in the hope that it will be useful,
13% but WITHOUT ANY WARRANTY; without even the implied warranty of
14% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15% GNU General Public License for more details.
16%
17% You should have received a copy of the GNU Affero General Public License
18% along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welteef30ca82012-04-16 13:14:53 +020019%
20% Additional Permission under GNU AGPL version 3 section 7:
21%
22% If you modify this Program, or any covered work, by linking or
23% combining it with runtime libraries of Erlang/OTP as released by
24% Ericsson on http://www.erlang.org (or a modified version of these
25% libraries), containing parts covered by the terms of the Erlang Public
26% License (http://www.erlang.org/EPLICENSE), the licensors of this
27% Program grant you additional permission to convey the resulting work
28% without the need to license the runtime libraries of Erlang/OTP under
29% the GNU Affero General Public License. Corresponding Source for a
30% non-source form of such a combination shall include the source code
31% for the parts of the runtime libraries of Erlang/OTP used as well as
32% that of the covered work.
Harald Weltef188fca2012-02-02 23:52:08 +010033
34-module(map_helper).
35-author('Harald Welte <laforge@gnumonks.org>').
36
37-include_lib("osmo_ss7/include/isup.hrl").
38-include_lib("osmo_map/include/map.hrl").
39
40-export([postproc/2, postproc_gt/2, postproc_imsi/2, postproc_msisdn/2]).
41
42postproc(M=#'UpdateLocationArg'{imsi = Imsi, 'msc-Number' = Msc, 'vlr-Number' = Vlr,
43 'v-gmlc-Address' = Gmlc}, Mode) ->
44 M#'UpdateLocationArg'{imsi = postproc_imsi(Imsi, Mode),
45 'msc-Number' = postproc_gt(Msc, Mode),
46 'vlr-Number' = postproc_gt(Vlr, Mode),
47 'v-gmlc-Address' = postproc_gt(Gmlc, Mode)};
48postproc(M=#'UpdateLocationRes'{'hlr-Number' = Hlr}, Mode) ->
49 M#'UpdateLocationRes'{'hlr-Number' = postproc_gt(Hlr, Mode)};
50postproc(M=#'UpdateGprsLocationArg'{imsi = Imsi, 'sgsn-Address' = Sgsn}, Mode) ->
51 M#'UpdateGprsLocationArg'{imsi = postproc_imsi(Imsi, Mode),
52 'sgsn-Address' = postproc_gt(Sgsn, Mode)};
53postproc(M=#'UpdateGprsLocationRes'{'hlr-Number' = Hlr}, Mode) ->
54 M#'UpdateGprsLocationRes'{'hlr-Number' = postproc_gt(Hlr, Mode)};
55postproc(M=#'SendAuthenticationInfoArg'{imsi = Imsi}, Mode) ->
56 M#'SendAuthenticationInfoArg'{imsi = postproc_imsi(Imsi, Mode)};
57postproc(M=#'ReadyForSM-Arg'{imsi = Imsi}, Mode) ->
58 M#'ReadyForSM-Arg'{imsi = postproc_imsi(Imsi, Mode)};
59postproc(M=#'MO-ForwardSM-Arg'{imsi = Imsi}, Mode) ->
60 M#'MO-ForwardSM-Arg'{imsi = postproc_imsi(Imsi, Mode)};
61postproc(M=#'RoutingInfoForSM-Res'{imsi = Imsi}, Mode) ->
62 M#'RoutingInfoForSM-Res'{imsi = postproc_imsi(Imsi, Mode)};
63postproc(M=#'DeactivateTraceModeArg'{imsi = Imsi}, Mode) ->
64 M#'DeactivateTraceModeArg'{imsi = postproc_imsi(Imsi, Mode)};
65postproc(M=#'ActivateTraceModeArg'{imsi = Imsi}, Mode) ->
66 M#'ActivateTraceModeArg'{imsi = postproc_imsi(Imsi, Mode)};
67postproc(M=#'InsertSubscriberDataArg'{imsi = Imsi, msisdn = Msisdn}, Mode) ->
68 M#'InsertSubscriberDataArg'{imsi = postproc_imsi(Imsi, Mode),
69 msisdn = postproc_msisdn(Msisdn, Mode)};
70postproc(M=#'AuthenticationFailureReportArg'{imsi = Imsi}, Mode) ->
71 M#'AuthenticationFailureReportArg'{imsi = postproc_imsi(Imsi, Mode)};
72postproc(M=#'AlertServiceCentreArg'{msisdn = Msisdn, serviceCentreAddress = Smsc}, Mode) ->
73 M#'AlertServiceCentreArg'{msisdn = postproc_msisdn(Msisdn, Mode),
74 serviceCentreAddress = postproc_gt(Smsc, Mode)};
75postproc(M=#'RoutingInfoForSM-Arg'{msisdn = Msisdn, serviceCentreAddress = Smsc}, Mode) ->
76 M#'RoutingInfoForSM-Arg'{msisdn = postproc_msisdn(Msisdn, Mode),
77 serviceCentreAddress = postproc_gt(Smsc, Mode)};
78postproc(M=#'ProvideRoamingNumberArg'{imsi = Imsi, msisdn = Msisdn,
79 'gmsc-Address' = Gmsc}, Mode) ->
80 M#'ProvideRoamingNumberArg'{imsi = postproc_imsi(Imsi, Mode),
81 msisdn = postproc_msisdn(Msisdn, Mode),
82 'gmsc-Address' = postproc_gt(Gmsc, Mode)};
83postproc(M=#'SendRoutingInfoRes'{msisdn = Msisdn}, Mode) ->
84 M#'SendRoutingInfoRes'{msisdn = postproc_msisdn(Msisdn, Mode)};
85postproc(M=#'SendRoutingInfoArg'{msisdn = Msisdn, 'gmsc-OrGsmSCF-Address' = Gmsc}, Mode) ->
86 M#'SendRoutingInfoArg'{msisdn = postproc_msisdn(Msisdn, Mode),
87 'gmsc-OrGsmSCF-Address' = postproc_gt(Gmsc, Mode)};
88postproc(M=#'USSD-Arg'{msisdn = Msisdn}, Mode) ->
89 M#'USSD-Arg'{msisdn = postproc_msisdn(Msisdn, Mode)};
90postproc(M=#'ReportSM-DeliveryStatusArg'{msisdn = Msisdn,
91 serviceCentreAddress = Smsc}, Mode) ->
92 M#'ReportSM-DeliveryStatusArg'{msisdn = postproc_msisdn(Msisdn, Mode),
93 serviceCentreAddress = postproc_gt(Smsc, Mode)};
94postproc(M=#'AnyTimeInterrogationArg'{'gsmSCF-Address' = Scf}, Mode) ->
95 M#'AnyTimeInterrogationArg'{'gsmSCF-Address' = postproc_gt(Scf, Mode)};
96postproc(M, _Mode) ->
97 M.
98
99
100postproc_gt(In, post) when is_binary(In) ->
101 postproc_gt(binary_to_list(In), post);
102postproc_gt(asn1_NOVALUE, post) ->
103 undefined;
104postproc_gt(In, post) ->
105 map_codec:parse_addr_string(In);
106postproc_gt(undefined, pre) ->
107 asn1_NOVALUE;
108postproc_gt(In, pre) when is_record(In, party_number) ->
109 map_codec:encode_addr_string(In);
110postproc_gt(In, pre) ->
111 In.
112
113postproc_imsi(asn1_NOVALUE, post) ->
114 undefined;
115postproc_imsi(In, post) ->
116 map_codec:parse_map_addr(In);
117postproc_imsi(undefined, pre) ->
118 asn1_NOVALUE;
119postproc_imsi([], pre) ->
120 asn1_NOVALUE;
121postproc_imsi(In, pre) ->
122 map_codec:encode_map_tbcd(In).
123
124postproc_msisdn(asn1_NOVALUE, post) ->
125 undefined;
126postproc_msisdn(In, post) ->
127 map_codec:parse_map_addr(In);
128postproc_msisdn(undefined, pre) ->
129 asn1_NOVALUE;
130postproc_msisdn([], pre) ->
131 asn1_NOVALUE;
132postproc_msisdn(In, pre) ->
133 map_codec:encode_map_tbcd(In).
134