Telefonnummer an Cisco IP Telefon senden (2. Teil)

sendNumberToCisco.js

In der Javascript-Datei „sendNumberToCisco.js“ werden alle Funktionen erstellt, die den zusätzlichen Eintrag im Kontextmenü erzeugen, die XML-Datei mit der Telefonnummer erstellen und die Verbindung zum Telefon herstellen. Als Erstes erstellen wir den Button im Kontextmenü.

chrome.runtime.onInstalled.addListener(function() {
	// Create an item for a selected text in the menu
	var id = chrome.contextMenus.create({"title": "Send to Cisco phone", "contexts":["selection"], "id": "numberToCiscoPhoneSelection"});
});

Anmerkungen:

Ich erstelle einen Listener, der dem Kontextmenü einen Eintrag mit dem Namen „Send to Cisco phone“ hinzufügt. Die Option „contexts“: [„section“] ermöglicht es mir, dass der Eintrag im Kontextmenü nur angezeigt wird, wenn auch tatsächlich etwas markiert ist. Natürlich bekommt der Button auch eine „id“: „numberToCiscoPhoneSelection“.

 

Jetzt erstellen ich einen weiteren Listener, der auf den Klick im Kontextmenü reagiert und die entsprechenden Funktionen ausführt, die es ermöglichen die Daten an das Telefon zu senden. Vorher validiere ich noch notdürftig die Telefonnummer. Dies lässt sich bestimmt noch weiter ausbauen, genügt aber für meine Zwecke.

// The onClicked callback function.
function onClickHandler(info, tab) {

	// Check if the correct button is clicked
	if(info.menuItemId == "numberToCiscoPhoneSelection"){

		var ip = "000.000.000.000";
		var uid = "XXXX";
		var pwd = "XXXX";
	
		if(info.selectionText == undefined){
			alert("nothing marked!");
			exit;
		} 

		// Replace '+' to '00'
		var number = info.selectionText.replace('+', '00')
		// Only numbers
		number = number.replace(/\D+/g,"");

		// Check if there is a number to call
		if(number == ""){
			alert("nothing marked!");
			exit;
		}

		// Build XML
		var xml = '<?xml version="1.0"? encoding="UTF-8">\r\n' +
		'<CiscoIPPhoneExecute>' +
		'<ExecuteItem Priority="0" URL="Dial:' + number + ':1:Cisco/Dialer"/>\r\n'+
		'</CiscoIPPhoneExecute>\r\n';

		// XML request
		var xhttp = new XMLHttpRequest();
		xhttp.open("POST", "http://"+ip+"/CGI/Execute", true);
		xhttp.setRequestHeader ("Authorization", "Basic " + btoa(uid + ":" + pwd));
		xhttp.setRequestHeader ("Content-type", "application/x-www-form-urlencoded");
		xhttp.onreadystatechange = function(){

			// Log response from phone for connection debug
			console.log( this.responseText );
		}
		xhttp.send("XML="+xml);		
	}
};

chrome.contextMenus.onClicked.addListener(onClickHandler);

Anmerkungen:

Ich erstelle einen „chrome.contextMenus.onClicked.addListener“ der den „onClickHandler“ aufruft. Ich prüfe ab, ob das geklickte Objekt die selbe ID hat wie der Eintrag, den ich dem Kontextmenü hinzugefügt habe („numberToCiscoPhoneSelection“).

Die Variablen „ip“, „uid“ und „pwd“ sollten hier nicht hart codiert eingetragen werden. Es gibt eine schönere Möglichkeit diese Daten z. B. im Speicher von Google Chrome abzulegen.

In den nächsten Schritten prüfe ich, ob auch Daten an die Funktion übergeben wurde. Ich ändere das „+“ in „00“ um, da oft „+49“ in den Telefonnummern angegeben ist. Danach entferne ich alles was, keine Zahl ist aus der Telefonnummer, z. B. – / oder Leerzeichen.

Jetzt das Wichtigste. Ich erstelle die XML-Datei, die ich übertragen möchte. Ich habe den genauen Aufbau der XML-Datei der Cisco Dokumentation entnommen.
Ich erstelle nun ein Objekt um XML Daten zu senden „new XMLHttpRequest();“, füge die Zieladresse ein „http://“+ip+“/CGI/Execute“ und melde mich am Telefon an „Authorization“, „Basic “ + btoa(uid + „:“ + pwd)“.

Zum Schluss kann ich die Daten senden „xhttp.send(„XML=“+xml);“. Als Hilfe lasse ich mir die Antwort des Telefons in der Konsole von Chrome anzeigen.

Um nun die Erweiterung (Add-on) in Chrome zu laden, muss ich zuerst in den Einstellungen die Erweiterungen aufrufen. Hier den Haken für den „Entwicklermodus“ setzten und über den Dialog hinter „Entpackte Erweiterung laden …“ den Ordner mit den zwei Dateien auswählen.

CB-IT-Services_Chrome-Add-On