remotes/origin/stable
parent
e658a00258
commit
7657926a60
@ -0,0 +1,63 @@ |
||||
<?php |
||||
/** |
||||
* ownCloud - ajax frontend |
||||
* |
||||
* @author Robin Appelman |
||||
* @copyright 2010 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 Lesser General Public |
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
//not this file is for getting files themselves, get_files.php is for getting a list of files. |
||||
|
||||
require_once('../inc/lib_base.php'); |
||||
|
||||
function get_mime_type($filename, $mimePath = '../etc') { |
||||
$fileext = substr(strrchr($filename, '.'), 1); |
||||
if (empty($fileext)) return (false); |
||||
$regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext\s)/i"; |
||||
$lines = file("$mimePath/mime.types"); |
||||
foreach($lines as $line) { |
||||
if (substr($line, 0, 1) == '#') continue; // skip comments |
||||
$line = rtrim($line) . " "; |
||||
if (!preg_match($regex, $line, $matches)) continue; // no match to the extension |
||||
return ($matches[1]); |
||||
} |
||||
return (false); // no match at all |
||||
} |
||||
|
||||
$file=$_GET['file']; |
||||
$dir=(isset($_GET['dir']))?$_GET['dir']:''; |
||||
if(strstr($file,'..') or strstr($dir,'..')){ |
||||
die(); |
||||
} |
||||
$filename=$CONFIG_DATADIRECTORY.'/'.$dir.'/'.$file; |
||||
// $ftype='application/octet-stream'; |
||||
// $finfo=new finfo(FILEINFO_MIME); |
||||
// $fres=@$finfo->file($filename); |
||||
// if (is_string($fres) && !empty($fres)) { |
||||
// $ftype = $fres; |
||||
// } |
||||
$ftype=get_mime_type($filename); |
||||
ob_end_clean(); |
||||
// echo $ftype; |
||||
// die(); |
||||
header('Content-Type: '.$ftype); |
||||
header('Expires: 0'); |
||||
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); |
||||
header('Pragma: public'); |
||||
header('Content-Length: ' . filesize($filename)); |
||||
readfile($filename); |
||||
?> |
||||
@ -0,0 +1,330 @@ |
||||
/** |
||||
* ownCloud - ajax frontend |
||||
* |
||||
* @author Robin Appelman |
||||
* @copyright 2010 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 Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/ |
||||
|
||||
OC_FILES.browser=new Object(); |
||||
|
||||
OC_FILES.browser.show=function(dir){ |
||||
dir=(dir)?dir:''; |
||||
OC_FILES.dir=dir; |
||||
OC_FILES.getdirectorycontent(dir,OC_FILES.browser.show_callback); |
||||
} |
||||
|
||||
OC_FILES.browser.show_callback=function(content){ |
||||
var dir=OC_FILES.dir |
||||
var dirs=dir.split('/'); |
||||
var tr=null; |
||||
var td=null; |
||||
var img=null; |
||||
|
||||
body=document.getElementsByTagName('body').item(0); |
||||
body.addEvent('onclick',OC_FILES.browser.hideallactions); |
||||
|
||||
//remove current content;
|
||||
var contentNode=document.getElementById('content'); |
||||
if(contentNode.hasChildNodes()){ |
||||
while(contentNode.childNodes.length >=1){ |
||||
contentNode.removeChild(contentNode.firstChild); |
||||
} |
||||
} |
||||
|
||||
var browser=document.createElement('div'); |
||||
browser.className='center'; |
||||
var table=document.createElement('table'); |
||||
browser.appendChild(table); |
||||
|
||||
// breadcrumb
|
||||
if(dirs.length>0) { |
||||
table.setAttribute('cellpadding',2); |
||||
table.setAttribute('cellspacing',0); |
||||
var tbody=document.createElement('tbody');//some IE versions need this
|
||||
table.appendChild(tbody); |
||||
tr=document.createElement('tr'); |
||||
tbody.appendChild(tr); |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
td.setAttribute('colspan','2'); |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
td.setAttribute('colspan','4'); |
||||
td.className='breadcrumb'; |
||||
var a=document.createElement('a'); |
||||
td.appendChild(a); |
||||
a.setAttribute('href','#'); |
||||
a.addEvent('onclick',OC_FILES.browser.show); |
||||
a.appendChild(document.createTextNode('Home')); |
||||
var currentdir=''; |
||||
for(index in dirs) { |
||||
d=dirs[index]; |
||||
currentdir=currentdir+'/'+d; |
||||
if(d!=''){ |
||||
a=document.createElement('a'); |
||||
td.appendChild(a); |
||||
a.setAttribute('href','#'+currentdir); |
||||
a.setAttribute('onclick','OC_FILES.browser.show("'+currentdir+'")'); |
||||
img=document.createElement('img'); |
||||
a.appendChild(img); |
||||
img.src=WEBROOT+'/img/arrow.png'; |
||||
a.appendChild(document.createTextNode(' ' +d)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// files and directories
|
||||
table.setAttribute('cellpadding',6); |
||||
table.setAttribute('cellspacing',0); |
||||
table.className='browser'; |
||||
var tbody=document.createElement('tbody');//some IE versions need this
|
||||
table.appendChild(tbody); |
||||
var filesfound=false; |
||||
var sizeTd=null; |
||||
if(content){ |
||||
tr=document.createElement('tr'); |
||||
tbody.appendChild(tr); |
||||
tr.className='browserline'; |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
td.setAttribute('colspan','2'); |
||||
input=document.createElement('input'); |
||||
input.setAttribute('type','checkbox'); |
||||
input.setAttribute('name','fileSelector'); |
||||
input.setAttribute('value','select_all'); |
||||
input.setAttribute('id','select_all'); |
||||
input.addEvent('onclick',OC_FILES.selectAll); |
||||
td.appendChild(input); |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
td.setAttribute('colspan','4'); |
||||
dropdown=document.createElement('select'); |
||||
td.appendChild(dropdown); |
||||
dropdown.setAttribute('id','selected_action'); |
||||
for(index in this.actions_selected){ |
||||
if(this.actions_selected[index].call){ |
||||
option=document.createElement('option'); |
||||
dropdown.appendChild(option); |
||||
option.setAttribute('value',index); |
||||
option.appendChild(document.createTextNode(index)); |
||||
} |
||||
} |
||||
td.appendChild(document.createTextNode(' selected. ')); |
||||
button=document.createElement('button'); |
||||
td.appendChild(button); |
||||
button.appendChild(document.createTextNode('Go')); |
||||
button.addEvent('onclick',OC_FILES.action_selected); |
||||
for(index in content){ |
||||
var file=content[index]; |
||||
if(file.name){ |
||||
file.name=file.name.replace('\'',''); |
||||
OC_FILES.files[file['name']]=new OC_FILES.file(dir,file['name'],file['type']); |
||||
tr=document.createElement('tr'); |
||||
tbody.appendChild(tr); |
||||
tr.className='browserline'; |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
input=document.createElement('input'); |
||||
input.setAttribute('type','checkbox'); |
||||
input.setAttribute('name','fileSelector'); |
||||
input.setAttribute('value',file['name']); |
||||
td.appendChild(input); |
||||
tr.appendChild(OC_FILES.browser.showicon(file['type'])); |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
td.className='nametext'; |
||||
td.setAttribute('name',file['name']); |
||||
td.setAttribute('id',file['name']); |
||||
a=document.createElement('a'); |
||||
td.appendChild(a); |
||||
a.appendChild(document.createTextNode(file['name'])) |
||||
if(file['type']=='dir'){ |
||||
a.addEvent('onclick',OC_FILES.browser.show,[dir+'/'+file['name']]); |
||||
td.setAttribute('colspan',2); |
||||
a.setAttribute('href','#'+dir+'/'+file['name']); |
||||
}else{ |
||||
a.setAttribute('href',WEBROOT+'/?dir=/'+dir+'&file='+file['name']); |
||||
sizeTd=document.createElement('td'); |
||||
tr.appendChild(sizeTd); |
||||
sizeTd.className='sizetext'; |
||||
sizeTd.appendChild(document.createTextNode(sizeFormat(file['size']))); |
||||
} |
||||
a=document.createElement('a'); |
||||
img=document.createElement('img'); |
||||
td.appendChild(img); |
||||
img.className='file_actions'; |
||||
img.alt='' |
||||
img.title='actions'; |
||||
img.src=WEBROOT+'/img/arrow_down.png'; |
||||
img.setAttribute('onclick','OC_FILES.browser.showactions(\''+file['name']+'\')') |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
td.className='sizetext'; |
||||
td.appendChild(document.createTextNode(file['date'])); |
||||
} |
||||
} |
||||
} |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
tr=document.createElement('tr'); |
||||
tbody.appendChild(tr); |
||||
tr.className='utilrow'; |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
td.className='upload'; |
||||
td.setAttribute('colspan','6'); |
||||
OC_FILES.browser.showuploader(dir,td,content['max_upload']); |
||||
contentNode.appendChild(browser); |
||||
} |
||||
|
||||
OC_FILES.browser.showicon=function(filetype){ |
||||
var td=document.createElement('td'); |
||||
var img=document.createElement('img'); |
||||
td.appendChild(img); |
||||
img.setAttribute('width',16); |
||||
img.setAttribute('height',16); |
||||
if(filetype=='dir'){ |
||||
img.src=WEBROOT+'/img/icons/folder.png'; |
||||
}else{ |
||||
img.src=WEBROOT+'/img/icons/other.png'; |
||||
} |
||||
return td; |
||||
} |
||||
|
||||
OC_FILES.browser.showuploader=function(dir,parent,max_upload){ |
||||
OC_FILES.uploadForm=document.createElement('form'); |
||||
OC_FILES.uploadForm.setAttribute('target','uploadIFrame'); |
||||
OC_FILES.uploadForm.setAttribute('action','files/upload.php?dir='+dir); |
||||
OC_FILES.uploadForm.method='post'; |
||||
OC_FILES.uploadForm.setAttribute('enctype','multipart/form-data'); |
||||
OC_FILES.uploadIFrame=document.createElement('iframe'); |
||||
OC_FILES.uploadIFrame.className='hidden'; |
||||
OC_FILES.uploadIFrame.name='uploadIFrame'; |
||||
parent.appendChild(OC_FILES.uploadIFrame); |
||||
var input=document.createElement('input'); |
||||
input.setAttribute('type','hidden'); |
||||
input.setAttribute('name','MAX_FILE_SIZE'); |
||||
input.setAttribute('value',max_upload); |
||||
input.setAttribute('id','max_upload'); |
||||
OC_FILES.uploadForm.appendChild(input); |
||||
var file=document.createElement('input'); |
||||
file.name='file'; |
||||
file.setAttribute('id','fileSelector'); |
||||
file.setAttribute('type','file'); |
||||
file.addEvent('onchange',OC_FILES.upload,[dir]); |
||||
OC_FILES.uploadForm.appendChild(document.createTextNode('Upload file: ')); |
||||
OC_FILES.uploadForm.appendChild(file); |
||||
parent.appendChild(OC_FILES.uploadForm); |
||||
} |
||||
|
||||
OC_FILES.browser.show_rename=function(dir,file){ |
||||
var item=document.getElementById(file); |
||||
item.oldContent=Array(); |
||||
if(item.hasChildNodes()){ |
||||
while(item.childNodes.length >=1){ |
||||
item.oldContent[item.oldContent.length]=item.firstChild; |
||||
item.removeChild(item.firstChild); |
||||
} |
||||
} |
||||
var form=document.createElement('form'); |
||||
form.addEvent('onsubmit',OC_FILES.rename,[dir,file]); |
||||
var input=document.createElement('input'); |
||||
input.setAttribute('type','text'); |
||||
input.setAttribute('name','newname'); |
||||
input.setAttribute('value',file); |
||||
input.setAttribute('id',file+'_newname') |
||||
input.addEvent('onblur',OC_FILES.browser.rename_cancel,[file]); |
||||
form.appendChild(input); |
||||
item.appendChild(form); |
||||
input.focus(); |
||||
} |
||||
|
||||
OC_FILES.browser.rename_cancel=function(file){ |
||||
var item=document.getElementsByName(file).item(0); |
||||
if(item.hasChildNodes()){ |
||||
while(item.childNodes.length >=1){ |
||||
item.removeChild(item.firstChild); |
||||
} |
||||
} |
||||
for(index in item.oldContent){ |
||||
if(item.oldContent[index].nodeType){ |
||||
item.appendChild(item.oldContent[index]); |
||||
} |
||||
} |
||||
} |
||||
|
||||
OC_FILES.browser.showactions=function(file,hide){ |
||||
node=document.getElementById(file); |
||||
if(node &&(node.actionsshown || hide)){ |
||||
if(node.actionsdiv){ |
||||
node.removeChild(node.actionsdiv); |
||||
} |
||||
node.actionsdiv=null; |
||||
node.actionsshown=false |
||||
}else if(node){ |
||||
node.actionsshown=true |
||||
div=document.createElement('div'); |
||||
node.actionsdiv=div; |
||||
div.className='fileactionlist'; |
||||
table=document.createElement('table'); |
||||
div.appendChild(table); |
||||
tbody=document.createElement('tbody'); |
||||
table.appendChild(tbody); |
||||
actions=OC_FILES.files[file].actions; |
||||
for(name in actions){ |
||||
if(actions[name].call){ |
||||
tr=document.createElement('tr'); |
||||
tbody.appendChild(tr); |
||||
td=document.createElement('td'); |
||||
tr.appendChild(td); |
||||
a=document.createElement('a'); |
||||
td.appendChild(a); |
||||
a.appendChild(document.createTextNode(name)); |
||||
td.addEvent('onclick',new callBack(OC_FILES.files[file].actions[name],OC_FILES.files[file])); |
||||
} |
||||
} |
||||
node.appendChild(div); |
||||
OC_FILES.hideallenabled=false; |
||||
setTimeout('OC_FILES.hideallenabled=true',50); |
||||
} |
||||
} |
||||
|
||||
OC_FILES.browser.hideallactions=function(){ |
||||
if(OC_FILES.hideallenabled){ |
||||
for(name in OC_FILES.files){ |
||||
if(OC_FILES.files[name].hideactions){ |
||||
OC_FILES.files[name].hideactions.call(OC_FILES.files[name]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
OC_FILES.hideallenabled=true; //used to prevent browsers from hiding actionslists right after they are displayed;
|
||||
|
||||
sizeFormat=function(size){ |
||||
var orig=size; |
||||
var steps=Array('B','KiB','MiB','GiB','TiB'); |
||||
var step=0; |
||||
while(size>(1024*2)){ |
||||
step++; |
||||
size=size/1024; |
||||
} |
||||
if(size.toFixed){ |
||||
size=size.toFixed(2); |
||||
} |
||||
return ''+size+' '+steps[step]; |
||||
} |
||||
@ -0,0 +1,101 @@ |
||||
/** |
||||
* eventHandler |
||||
* |
||||
* @author Icewind <icewind (at) derideal (dot) com> |
||||
* @copyright 2009 |
||||
* @license http://www.gnu.org/licenses/gpl.html GNU Public License
|
||||
* @version 0.1 |
||||
*/ |
||||
|
||||
/*event handling |
||||
usage: document.events.add(node,type,function,arguments); |
||||
or: node.addEvent(type,function,arguments); |
||||
*/ |
||||
|
||||
eventHandler=function(){ |
||||
this.holders=Array(); |
||||
} |
||||
|
||||
eventHandler.prototype={ |
||||
add:function(element,type,func,arguments){ |
||||
var holder=this.getHolderByElement(element); |
||||
holder.addListner(type,func,arguments); |
||||
}, |
||||
getHolderByElement:function(element){ |
||||
var holder=false; |
||||
for (var i=0;i<this.holders.length;i++){ |
||||
if (this.holders[i].getElement()==element){ |
||||
var holder=this.holders[i]; |
||||
} |
||||
} |
||||
if (!holder){ |
||||
var holder=new eventHolder(element); |
||||
this.holders[this.holders.length]=holder; |
||||
} |
||||
return holder; |
||||
}, |
||||
trigger:function(element,type,event){ |
||||
var holder=eventHandler.getHolderByElement(element); |
||||
return holder.trigerEvent.call(holder,type,event); |
||||
} |
||||
} |
||||
|
||||
eventHolder=function(element){ |
||||
this.element=element; |
||||
this.listners=Array(); |
||||
} |
||||
|
||||
eventHolder.prototype={ |
||||
addListner:function(type,func,arguments){ |
||||
if (type && this.element){ |
||||
if (!this.listners[type]){ |
||||
this.listners[type]=Array(); |
||||
eval("callback=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}"); |
||||
if (this.element.tagName){//do we have a element (not an named event)
|
||||
var holder=this; |
||||
//IE doesn't let you set the onload event the regulair way
|
||||
if (type=="onload" && this.element.addEventListener && window.ActiveXObject){ |
||||
this.element.addEventListener(type, callback, false); |
||||
}else if (type=="onload" && this.element.attachEvent && window.ActiveXObject){ |
||||
this.element.attachEvent(type, callback); |
||||
}else{ |
||||
eval("this.element."+type+"=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}"); |
||||
} |
||||
}else{ |
||||
eval("this.element."+type+"=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}"); |
||||
} |
||||
} |
||||
var i=this.listners[type].length |
||||
this.listners[type][i]=func; |
||||
this.listners[type][i].applyArguments=arguments; |
||||
}else{ |
||||
var i=this.listners.length |
||||
this.listners[i]=func; |
||||
this.listners[type][i].applyArguments=arguments; |
||||
} |
||||
}, |
||||
trigerEvent:function(type,event){ |
||||
if (type && this.element && this.listners[type]){ |
||||
for (var i=0;i<this.listners[type].length;i++){ |
||||
if(this.listners[type][i].applyArguments){ |
||||
return this.listners[type][i].apply(this,this.listners[type][i].applyArguments) |
||||
}else{ |
||||
return this.listners[type][i].call(); |
||||
} |
||||
} |
||||
}else{ |
||||
for (var i=0;i<this.listners.length;i++){ |
||||
return this.listners[i](event); |
||||
} |
||||
} |
||||
}, |
||||
getElement:function(){ |
||||
return this.element; |
||||
} |
||||
} |
||||
|
||||
document.events=new eventHandler(); |
||||
|
||||
Node.prototype.addEvent=function(type,func,arguments){ |
||||
document.events.add(this,type,func,arguments); |
||||
} |
||||
@ -0,0 +1,48 @@ |
||||
/** |
||||
* StarLight - A client side webpage framework |
||||
* |
||||
* @package StarLight |
||||
* @author Icewind <icewind (at) derideal (dot) com> |
||||
* @copyright 2009 |
||||
* @license http://www.gnu.org/licenses/gpl.html GNU Public License
|
||||
* @url http://blacklight.metalwarp.com/starlight
|
||||
* @version 0.1 |
||||
*/ |
||||
|
||||
OCNotification=function(text,time){ |
||||
this.text=text; |
||||
this.time=(time)?time:0; |
||||
this.notify(); |
||||
} |
||||
|
||||
OCNotification.prototype={ |
||||
notify:function(){ |
||||
this.holder=document.getElementById('OCNotificationHolder'); |
||||
if (!this.holder){ |
||||
this.holder=document.createElement('div'); |
||||
this.holder.className='OCNotificationHolder'; |
||||
this.holder.setAttribute('class','OCNotificationHolder'); |
||||
this.holder.setAttribute('id','OCNotificationHolder'); |
||||
document.getElementsByTagName('body').item(0).appendChild(this.holder); |
||||
} |
||||
this.notification=document.createElement('div'); |
||||
this.notification.className='OCNotification'; |
||||
this.notification.setAttribute('class','OCNotification'); |
||||
if (document.documentElement.innerHTML){ |
||||
this.notification.innerHTML=this.text; |
||||
}else{ |
||||
var text=document.createTextNode(this.text); |
||||
this.notification.appendChild(text); |
||||
} |
||||
this.holder.insertBefore(this.notification,this.holder.firstChild); |
||||
this.notification.addEvent('onclick',new callBack(this.removeNotification,this)); |
||||
if (this.time>0){ |
||||
this.timer = new OCTimer(this.removeNotification, this.time,false,this); |
||||
} |
||||
}, |
||||
removeNotification:function(){ |
||||
if(this.notification){ |
||||
this.holder.removeChild(this.notification); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,52 @@ |
||||
/** |
||||
* StarLight - A client side webpage framework |
||||
* |
||||
* @package StarLight |
||||
* @author Icewind <icewind (at) derideal (dot) com> |
||||
* @copyright 2009 |
||||
* @license http://www.gnu.org/licenses/gpl.html GNU Public License
|
||||
* @url http://blacklight.metalwarp.com/starlight
|
||||
* @version 0.1 |
||||
*/ |
||||
OCTimer=function(callback,time,repeat,object){ |
||||
this.object=(object)?object:false; |
||||
this.repeat=(!(repeat===undefined))?repeat:true; |
||||
this.callback=callback; |
||||
this.time=time; |
||||
this.timer=0; |
||||
this.number=OCTimer.count; |
||||
OCTimer.count++; |
||||
OCTimer.timers[this.number]=this; |
||||
if(this.time){ |
||||
this.start(); |
||||
} |
||||
} |
||||
|
||||
OCTimer.count=0; |
||||
OCTimer.timers=Array(); |
||||
|
||||
OCTimer.prototype={ |
||||
start:function(){ |
||||
this.running=true; |
||||
eval('var func=function(){OCTimer.timers['+this.number+'].run();};'); |
||||
if(this.repeat){ |
||||
this.timer = setInterval(func, this.time); |
||||
}else{ |
||||
this.timer = setTimeout(func, this.time); |
||||
} |
||||
}, |
||||
run:function(){ |
||||
if (!this.repeat){ |
||||
this.stop(); |
||||
} |
||||
if (this.object){ |
||||
this.callback.call(this.object); |
||||
}else{ |
||||
this.callback.call(); |
||||
} |
||||
}, |
||||
stop:function(){ |
||||
clearInterval(this.timer); |
||||
this.running=false; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue