Asterisk AEL: Return Value beim Macro funktioniert nicht?

donfaustino

Neuer User
Mitglied seit
28 Nov 2004
Beiträge
143
Punkte für Reaktionen
0
Punkte
0
Hi,
ich habe meinen Dialplan komplett in AEL. Jetzt bin ich dabei mehrfach verwendeten Code in Macros zu modularisieren. Klappt auch soweit, nur wenn ich im Macro einen Rückgabewert ausgeben will gibt es einen Fehler.
Ich habe aber gelesen dass dieses Feature Anfang letzten Jahres mit in den AEL-Code geflossen sein soll.

Code:
macro repair_callnumber ( mycallnumber ) {
   callnumber=${mycallnumber};

   if ("${callnumber:0:1}" = "+") {
     callnumber=00${callnumber:1};
   }

   if ("${callnumber:0:2}" != "00" & "${callnumber:0:1}" = "0" ) {
     callnumber=0049${callnumber:1};
   }
   return(${callnumber});
}
Code:
[Mar 24 13:35:32] ERROR[1161]: ael.y:840 ael_yyerror: ==== File: /etc/asterisk/extensions.ael, Line 105, Cols: 10-10: Error: syntax error, unexpected '(', expecting ';'

Ich habe diese Asterisk Version:
Code:
Iconnect*CLI> core show version
Asterisk 1.6.2.9-2+squeeze4 built by buildd @ alwyn on a armv5tel running Linux on 2011-12-18 21:54:01 UTC
Iconnect*CLI>

Mache ich was falsch? Oder ist meine Version zu alt? System ist aber up-to-date....
 
Zuletzt bearbeitet:
Verwende statt Macro besser gleich Gosub, da funktioniert return(value) seit 1.6.
 
danke für die Info. Funktioniert GoSub auch in AEL?
 
Äh ja natürlich. Es ist sogar anders rum, in AEL gibt es eigentlich gar kein Macro.
 
hmm, sorry, ich find kein Beispiel wie ich GoSub in der extension.ael einbauen kann...
So gehts zb. nicht:
Code:
sub_test {
   NoOp(Test);
}
.....
.....
context test {
  _X. => {
      gosub(sub_test);
   }
}
 
Aus dem Kopf geschrieben:

Code:
[COLOR="#FF0000"]context[/COLOR] sub_test {
  [COLOR="#FF0000"]s =>[/COLOR] {
    NoOp(Test);
    Return(noch mehr Test);
  }
}

context test {
  _X. => {
    gosub(sub_test[COLOR="#FF0000"],s,1[/COLOR]);
    NoOp(${GOSUB_RESULT});
  }
}
 
Es ist besser macros zu benutzen, da mann parameter übergeben kann.

Aufruf:
Code:
&getGateway(${CalledNum}, gw);

macro getGateway(Number, *gw){
	gw="";
	switch (${Number}){
		pattern 00201X.: gw=thisAccount; break;
		pattern 0020NX.: gw=ThatAccount; break;
		pattern 001X.  :
		pattern 0086X. :
		pattern 00971X.: gw=orThisAccount; break;
		        default: gw=thisAccount;
	}

	return;
}

Gruß
Noway
 
Zuletzt bearbeitet:
Dann schau mal, was der AEL Parser aus dem Macro macht ;-)
 
was der Parser daraus macht ist völlig egal. Es geht so und funktioniert sehr zuverlässig seit Jahren bei mir.
 
Nur dass die Annahme, an Gosub könnten keine Parameter übergeben werden, falsch ist ...

Code:
Gosub(<context>,<exten>,<prio>[(ARG1,ARG2,...,ARGn)])

Und: Macro ist ab 1.8 deprecated - wird zwar nicht zurückgebaut -, soll aber ausdrücklich nur im Zusammenhang mit der features.conf verwendet werden, wenn eine komplexere Funktion benötigt wird!

Und: AEL und Macro sind inkompatibel, der Parser übersetzt das in einen "normalen" Kontext (interessanterweise eben ein Gosub). "Echte" Macros können in AEL nicht formuliert werden, sie lassen sich nur über die "klassische" extensions.conf abbilden (und sind und bleiben dann auch "echte" Macros).
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.