How to distinguish incoming trunks in asterisk-java

Suppose you have asterisk 1.6 with freepbx and you are developing with the latest asterisk-java library. Somehow you wanna perform different tasks based on calls coming through different SIP trunks.

When there’s a new incoming call, asterisk-java will trigger a newChannelEvent, but there’s no information in this event that can be used for distinguish from which trunk this call is coming in.

By default the accountcode in this NewChannelEvent is null, which makes sense because the accountcode is used for billing, and no one, at least not many people, wants to record the charge of SIP trunk because that’s usually done by the SIP provider to which the trunk is registered to. But since the accountcode is null and useless here, maybe we can use it as an identifier to distinguish the incoming trunk, it may be not the smartest solution, but at least it’s a working one icon biggrin How to distinguish incoming trunks in asterisk java Continue reading

quicksorting with stacks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public void quicksort(int[] d, int lo, int hi){
	if(lo<hi){
		int pivotIndex=partition(d, lo, hi);
		quicksort(d,lo,pivotIndex-1);
		quicksort(d,pivotIndex+1,hi);
		}
	public int partition(int[] d,int lo, int hi){
		intStack smaller = new intStack();
		intStack larger = new intStack();
		int pivot = d[hi];
		for(int i=lo;i<hi;i++){
			if(d[i]<pivot)
				smaller.push(d[i]);
			else
				larger.push(d[i]);
		}
		int i=lo;
		while(!smaller.isEmpty()){
			d[i]=smaller.pop();
			i++;
		}
		d[i] = pivot;
		int pivotIndex = i;
		i++;
		while(!larger.isEmpty()){
			d[i] = larger.pop();
			i++;
		}
	return pivotIndex;
	}
}

One-way QuickSort implemented in Java

The codes might be not optimized, and the first elements of all arrays are chosen as the pivots, which will cause a tremendous slow-down when the array is sorted already.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void swap(int[] ar, int a, int b){
	int tmp = ar[a];
	ar[a] = ar[b];
	ar[b] = tmp;
}
public static int partition(int[] a, int left, int right) {
	int pivot=a[left];
	int m=left;
	for(int i=left+1;i<=right;i++){
		if (a[i]<pivot){
			m++;
			swap(a, i, m);
		}	
	}
	swap(a, left, m);
	return m;
}
public static void quicksort(int[] a, int left, int right){
	if (left>=right)
	return;
	int pivotIndex = partition(a, left, right);
	quicksort(a, left, pivotIndex-1);
	quicksort(a, pivotIndex+1, right);
}