summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2010-05-12 16:51:03 +0000
committerRichard Mudgett <rmudgett@digium.com>2010-05-12 16:51:03 +0000
commite2336b73ef5f72dfd462054baa99366113d59af6 (patch)
treed1683652eaa92197df29f1d69b867e017a09869d
parent1d7a548ae6437b6b12686b98ed704bf583c0c08f (diff)
Merged revisions 262657,262660 from
https://origsvn.digium.com/svn/asterisk/be/branches/C.3-bier .......... r262660 | rmudgett | 2010-05-12 11:46:47 -0500 (Wed, 12 May 2010) | 4 lines Forgot some conditionals around the callrerouting facility help text. JIRA ABE-2223 .......... r262657 | rmudgett | 2010-05-12 11:26:49 -0500 (Wed, 12 May 2010) | 22 lines Add mISDN Call rerouting facility for point-to-point ISDN lines (exchange line) In the case of ISDN point-to-multipoint (multidevice) you can use the mISDN "facility calldeflect" application for call diversions from external (PSTN) to external (PSTN). In that case this is the only way to get rid of the two call legs to the PBX and let the calling number at the C party become the number of the A party. In the case of ISDN point-to-point (exchange line) the call deflection facility may not be used. Instead a call rerouting facility has to be used. This patch for chan_misdn.c is an extension to realize this service (facility rerouting application). It can accept either spelling: "callrerouting" or "callrerouteing". The patch is tested towards Deutsche Telekom and requires a modified version of mISDN from Digium, Inc. Patches: misdn_rerouteing_corrected.patch (Slightly modified.) JIRA ABE-2223 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@262661 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_misdn.c108
1 files changed, 105 insertions, 3 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index d37d66a31..f363c7c13 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -5128,6 +5128,9 @@ static char *handle_cli_misdn_send_facility(struct ast_cli_entry *e, int cmd, st
e->usage = "Usage: misdn send facility <type> <channel|port> \"<args>\" \n"
"\t type is one of:\n"
"\t - calldeflect\n"
+#if defined(AST_MISDN_ENHANCEMENTS)
+ "\t - callrerouting\n"
+#endif /* defined(AST_MISDN_ENHANCEMENTS) */
"\t - CFActivate\n"
"\t - CFDeactivate\n";
@@ -5189,9 +5192,61 @@ static char *handle_cli_misdn_send_facility(struct ast_cli_entry *e, int cmd, st
/* Send message */
print_facility(&tmp->bc->fac_out, tmp->bc);
misdn_lib_send_event(tmp->bc, EVENT_FACILITY);
- } else if (strstr(a->argv[3], "CFActivate")) {
- if (a->argc < 7) {
- ast_verbose("CFActivate requires 2 args: 1.FromNumber, 2.ToNumber\n\n");
+#if defined(AST_MISDN_ENHANCEMENTS)
+ } else if (strstr(a->argv[3], "callrerouteing") || strstr(a->argv[3], "callrerouting")) {
+ if (a->argc < 6) {
+ ast_verbose("callrerouting requires 1 arg: ToNumber\n\n");
+ return 0;
+ }
+ channame = a->argv[4];
+ nr = a->argv[5];
+
+ ast_verbose("Sending Callrerouting (%s) to %s\n", nr, channame);
+ tmp = get_chan_by_ast_name(channame);
+ if (!tmp) {
+ ast_verbose("Sending Call Rerouting with nr %s to %s failed: Channel does not exist.\n", nr, channame);
+ return 0;
+ }
+
+ max_len = sizeof(tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.Number) - 1;
+ if (max_len < strlen(nr)) {
+ ast_verbose("Sending Call Rerouting with nr %s to %s failed: Number too long (up to %u digits are allowed).\n",
+ nr, channame, max_len);
+ return 0;
+ }
+ tmp->bc->fac_out.Function = Fac_CallRerouteing;
+ tmp->bc->fac_out.u.CallRerouteing.InvokeID = ++misdn_invoke_id;
+ tmp->bc->fac_out.u.CallRerouteing.ComponentType = FacComponent_Invoke;
+
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.ReroutingReason = 0;/* unknown */
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.ReroutingCounter = 1;
+
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.Type = 0;/* unknown */
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.LengthOfNumber = strlen(nr);
+ strcpy((char *) tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.Number, nr);
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Subaddress.Length = 0;
+
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.CallingPartySubaddress.Length = 0;
+
+ /* 0x90 0x90 0xa3 3.1 kHz audio, circuit mode, 64kbit/sec, level1/a-Law */
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Length = 3;
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Contents[0] = 0x90;
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Contents[1] = 0x90;
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Contents[2] = 0xa3;
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Hlc.Length = 0;
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Llc.Length = 0;
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.UserInfo.Length = 0;
+
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.LastRerouting.Type = 1;/* presentationRestricted */
+ tmp->bc->fac_out.u.CallRerouteing.Component.Invoke.SubscriptionOption = 0;/* no notification to caller */
+
+ /* Send message */
+ print_facility(&tmp->bc->fac_out, tmp->bc);
+ misdn_lib_send_event(tmp->bc, EVENT_FACILITY);
+#endif /* defined(AST_MISDN_ENHANCEMENTS) */
+ } else if (strstr(a->argv[3], "CFActivate")) {
+ if (a->argc < 7) {
+ ast_verbose("CFActivate requires 2 args: 1.FromNumber, 2.ToNumber\n\n");
return 0;
}
port = atoi(a->argv[4]);
@@ -10844,6 +10899,9 @@ static int load_module(void)
"Supported Facilities are:\n"
"\n"
"type=calldeflect args=Nr where to deflect\n"
+#if defined(AST_MISDN_ENHANCEMENTS)
+ "type=callrerouting args=Nr where to deflect\n"
+#endif /* defined(AST_MISDN_ENHANCEMENTS) */
);
@@ -11613,6 +11671,50 @@ static int misdn_facility_exec(struct ast_channel *chan, const char *data)
/* Send message */
print_facility(&ch->bc->fac_out, ch->bc);
misdn_lib_send_event(ch->bc, EVENT_FACILITY);
+#if defined(AST_MISDN_ENHANCEMENTS)
+ } else if (!strcasecmp(args.facility_type, "callrerouteing")
+ || !strcasecmp(args.facility_type, "callrerouting")) {
+ if (ast_strlen_zero(args.arg[0])) {
+ ast_log(LOG_WARNING, "Facility: Call rerouting requires an argument: Number\n");
+ }
+
+ max_len = sizeof(ch->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.Number) - 1;
+ if (max_len < strlen(args.arg[0])) {
+ ast_log(LOG_WARNING,
+ "Facility: Number argument too long (up to %u digits are allowed). Ignoring.\n",
+ max_len);
+ return 0;
+ }
+ ch->bc->fac_out.Function = Fac_CallRerouteing;
+ ch->bc->fac_out.u.CallRerouteing.InvokeID = ++misdn_invoke_id;
+ ch->bc->fac_out.u.CallRerouteing.ComponentType = FacComponent_Invoke;
+
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.ReroutingReason = 0;/* unknown */
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.ReroutingCounter = 1;
+
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.Type = 0;/* unknown */
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.LengthOfNumber = strlen(args.arg[0]);
+ strcpy((char *) ch->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Party.Number, args.arg[0]);
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.CalledAddress.Subaddress.Length = 0;
+
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.CallingPartySubaddress.Length = 0;
+
+ /* 0x90 0x90 0xa3 3.1 kHz audio, circuit mode, 64kbit/sec, level1/a-Law */
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Length = 3;
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Contents[0] = 0x90;
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Contents[1] = 0x90;
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Bc.Contents[2] = 0xa3;
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Hlc.Length = 0;
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.Llc.Length = 0;
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.Q931ie.UserInfo.Length = 0;
+
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.LastRerouting.Type = 1;/* presentationRestricted */
+ ch->bc->fac_out.u.CallRerouteing.Component.Invoke.SubscriptionOption = 0;/* no notification to caller */
+
+ /* Send message */
+ print_facility(&ch->bc->fac_out, ch->bc);
+ misdn_lib_send_event(ch->bc, EVENT_FACILITY);
+#endif /* defined(AST_MISDN_ENHANCEMENTS) */
} else {
chan_misdn_log(1, ch->bc->port, "Unknown Facility: %s\n", args.facility_type);
}