(function(){ 'use strict'; if(!global.cloudcmd) return console.log( '# commander.js' + '\n' + '# -----------' + '\n' + '# Module is part of Cloud Commander,' + '\n' + '# used for getting dir content.' + '\n' + '# and forming html content' + '\n' + '# http://coderaiser.github.com/cloudcmd' + '\n'); var main = global.cloudcmd.main, fs = main.fs, zlib = main.zlib, url = main.url, CloudFunc = main.cloudfunc, DIR = main.DIR, LIBDIR = main.LIBDIR, HTMLDIR = main.HTMLDIR, Util = main.util, NOT_FOUND = 404, OK = 200, NO_JS = CloudFunc.NoJS, FS = CloudFunc.Fs, INDEX = HTMLDIR + 'index.html', REQUEST = 'request', RESPONSE = 'response', IndexProcessingFunc = null; exports.sendContent = function(pParams){ var lRet = Util.checkObj(pParams, ['processing'], [REQUEST, RESPONSE]); if(lRet){ var lReq = pParams.request, lRes = pParams.response, lPath = getCleanPath(lReq); IndexProcessingFunc = pParams.processing; fs.stat(lPath, function(pError, pStat){ if(!pError) if(pStat.isDirectory()) fs.readdir(lPath, call(readDir, pParams) ); else main.sendFile({ name : lPath, request : lReq, response : lRes }); else sendResponse({ status : NOT_FOUND, data : pError.toString(), request : lReq, response: lRes }); }); lRet = true; } return lRet; }; /** * Функция читает ссылку или выводит информацию об ошибке * @param pError * @param pFiles */ function readDir(pParams){ var lRet, lError, lFiles, lHTTP, lReq, lRes; if(pParams){ lError = pParams.error; lFiles = pParams.data; lHTTP = pParams.params; if(lHTTP){ lReq = lHTTP.request, lRes = lHTTP.response; lRet = true; } } if(lRet && !lError && lFiles){ lFiles = lFiles.sort(); /* Получаем информацию о файлах */ var n = lFiles.length, lStats = {}, lFilesData = { files : lFiles, stats : lStats, request : lReq, response : lRes }, lFill = function(){ fillJSON(lFilesData); }; if(n){ var i, lDirPath = getDirPath(lReq); for(i = 0; i < n; i++){ var lName = lDirPath + lFiles[i], lParams = { callback : lFill, count : n, name : lFiles[i], stats : lStats, }; fs.stat( lName, call(getFilesStat, lParams) ); } } else fillJSON(lFilesData); } else sendResponse({ status : NOT_FOUND, data : lError.toString(), request : lReq, response: lRes }); } /** async getting file states * and putting it to lStats object */ function getFilesStat(pParams){ var lRet = Util.checkObj(pParams, ['error', 'data', 'params']) && Util.checkObj(pParams.params, ['callback'], ['stats', 'name', 'count']); if(lRet){ var p = pParams, c = p.params; if(c.stats) c.stats[c.name] = !p.error ? p.data : { 'mode' : 0, 'size' : 0, 'isDirectory' : Util.retFalse }; if(c.count === Object.keys(c.stats).length) Util.exec(c.callback); } } /** * Function fill JSON by file stats * * @param pStats - object, contain file stats. * example {'1.txt': stat} * * @param pFiles - array of files of current directory */ function fillJSON(pParams){ var lFiles, lAllStats, i, n, lReq, lRes; if(pParams){ lFiles = pParams.files; lFiles &&(n = lFiles.length || 0); lAllStats = pParams.stats; lReq = pParams.request, lRes = pParams.response; } /* данные о файлах в формате JSON*/ var lJSON = [], lJSONFile = {}, lList, lDirPath = getDirPath(lReq); lJSON[0] = { path : lDirPath, size : 'dir' }; var lName, lStats, lMode, lIsDir; for( i = 0; i < n; i++ ){ /* Переводим права доступа в 8-ричную систему */ lName = lFiles[i], lStats = lAllStats[lName]; if(lStats){ lMode = (lStats.mode - 0).toString(8), lIsDir = lStats.isDirectory(); } /* Если папка - выводим пиктограмму папки * * В противоположном случае - файла */ lJSONFile = { 'name' : lFiles[i], 'size' : lIsDir ? 'dir' : lStats.size, 'uid' : lStats.uid, 'mode' : lMode }; lJSON[i+1] = lJSONFile; } /* если js недоступен * или отключен выcылаем html-код * и прописываем соответствующие заголовки */ if( noJS(lReq) ){ var lPanel = CloudFunc.buildFromJSON(lJSON); lList = '