mirror of
				https://github.com/telekom-security/tpotce.git
				synced 2025-10-31 12:32:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			164 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| /**
 | |
|  * ownCloud
 | |
|  *
 | |
|  * @author Robin Appelman
 | |
|  * @copyright Copyright (c) 2012 Robin Appelman icewind1991@gmail.com
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 3 of the License, or any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Affero General Public
 | |
|  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Wrapper for server side events
 | |
|  * (http://en.wikipedia.org/wiki/Server-sent_events)
 | |
|  * includes a fallback for older browsers and IE
 | |
|  *
 | |
|  * use server side events with caution, too many open requests can hang the
 | |
|  * server
 | |
|  */
 | |
| 
 | |
| /* global EventSource */
 | |
| 
 | |
| /**
 | |
|  * Create a new event source
 | |
|  * @param {string} src
 | |
|  * @param {object} [data] to be send as GET
 | |
|  *
 | |
|  * @constructs OC.EventSource
 | |
|  */
 | |
| OC.EventSource=function(src,data){
 | |
| 	var dataStr='';
 | |
| 	var name;
 | |
| 	var joinChar;
 | |
| 	this.typelessListeners=[];
 | |
| 	this.closed = false;
 | |
| 	this.listeners={};
 | |
| 	if(data){
 | |
| 		for(name in data){
 | |
| 			dataStr+=name+'='+encodeURIComponent(data[name])+'&';
 | |
| 		}
 | |
| 	}
 | |
| 	dataStr+='requesttoken='+encodeURIComponent(oc_requesttoken);
 | |
| 	if(!this.useFallBack && typeof EventSource !== 'undefined'){
 | |
| 		joinChar = '&';
 | |
| 		if(src.indexOf('?') === -1) {
 | |
| 			joinChar = '?';
 | |
| 		}
 | |
| 		this.source= new EventSource(src+joinChar+dataStr);
 | |
| 		this.source.onmessage=function(e){
 | |
| 			for(var i=0;i<this.typelessListeners.length;i++){
 | |
| 				this.typelessListeners[i](JSON.parse(e.data));
 | |
| 			}
 | |
| 		}.bind(this);
 | |
| 	}else{
 | |
| 		var iframeId='oc_eventsource_iframe_'+OC.EventSource.iframeCount;
 | |
| 		OC.EventSource.fallBackSources[OC.EventSource.iframeCount]=this;
 | |
| 		this.iframe=$('<iframe/>');
 | |
| 		this.iframe.attr('id',iframeId);
 | |
| 		this.iframe.hide();
 | |
| 
 | |
| 		joinChar = '&';
 | |
| 		if(src.indexOf('?') === -1) {
 | |
| 			joinChar = '?';
 | |
| 		}
 | |
| 		this.iframe.attr('src',src+joinChar+'fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr);
 | |
| 		$('body').append(this.iframe);
 | |
| 		this.useFallBack=true;
 | |
| 		OC.EventSource.iframeCount++;
 | |
| 	}
 | |
| 	//add close listener
 | |
| 	this.listen('__internal__',function(data){
 | |
| 		if(data === 'close'){
 | |
| 			this.close();
 | |
| 		}
 | |
| 	}.bind(this));
 | |
| };
 | |
| OC.EventSource.fallBackSources=[];
 | |
| OC.EventSource.iframeCount=0;//number of fallback iframes
 | |
| OC.EventSource.fallBackCallBack=function(id,type,data){
 | |
| 	OC.EventSource.fallBackSources[id].fallBackCallBack(type,data);
 | |
| };
 | |
| OC.EventSource.prototype={
 | |
| 	typelessListeners:[],
 | |
| 	iframe:null,
 | |
| 	listeners:{},//only for fallback
 | |
| 	useFallBack:false,
 | |
| 	/**
 | |
| 	 * Fallback callback for browsers that don't have the
 | |
| 	 * native EventSource object.
 | |
| 	 *
 | |
| 	 * Calls the registered listeners.
 | |
| 	 *
 | |
| 	 * @private
 | |
| 	 * @param {String} type event type
 | |
| 	 * @param {Object} data received data
 | |
| 	 */
 | |
| 	fallBackCallBack:function(type,data){
 | |
| 		var i;
 | |
| 		// ignore messages that might appear after closing
 | |
| 		if (this.closed) {
 | |
| 			return;
 | |
| 		}
 | |
| 		if(type){
 | |
| 			if (typeof this.listeners.done !== 'undefined') {
 | |
| 				for(i=0;i<this.listeners[type].length;i++){
 | |
| 					this.listeners[type][i](data);
 | |
| 				}
 | |
| 			}
 | |
| 		}else{
 | |
| 			for(i=0;i<this.typelessListeners.length;i++){
 | |
| 				this.typelessListeners[i](data);
 | |
| 			}
 | |
| 		}
 | |
| 	},
 | |
| 	lastLength:0,//for fallback
 | |
| 	/**
 | |
| 	 * Listen to a given type of events.
 | |
| 	 *
 | |
| 	 * @param {String} type event type
 | |
| 	 * @param {Function} callback event callback
 | |
| 	 */
 | |
| 	listen:function(type,callback){
 | |
| 		if(callback && callback.call){
 | |
| 
 | |
| 			if(type){
 | |
| 				if(this.useFallBack){
 | |
| 					if(!this.listeners[type]){
 | |
| 						this.listeners[type]=[];
 | |
| 					}
 | |
| 					this.listeners[type].push(callback);
 | |
| 				}else{
 | |
| 					this.source.addEventListener(type,function(e){
 | |
| 						if (typeof e.data !== 'undefined') {
 | |
| 							callback(JSON.parse(e.data));
 | |
| 						} else {
 | |
| 							callback('');
 | |
| 						}
 | |
| 					},false);
 | |
| 				}
 | |
| 			}else{
 | |
| 				this.typelessListeners.push(callback);
 | |
| 			}
 | |
| 		}
 | |
| 	},
 | |
| 	/**
 | |
| 	 * Closes this event source.
 | |
| 	 */
 | |
| 	close:function(){
 | |
| 		this.closed = true;
 | |
| 		if (typeof this.source !== 'undefined') {
 | |
| 			this.source.close();
 | |
| 		}
 | |
| 	}
 | |
| };
 | 
