Exemplo n.º 1
0
    public static void BindData(Chart chart, string prvName, object context, string[] seriesExpr, string labelExpr, string labelLookupName)
    {
        var prv         = WebManager.GetService <IProvider <object, object> >(prvName);
        var ognlContext = new Dictionary <string, object>();

        ognlContext["data"] = prv.Provide(context);

        var ognlExpr  = new NReco.OGNL.EvalOgnl();
        int seriesIdx = 0;

        foreach (var expr in seriesExpr)
        {
            var dataset = (IEnumerable)ognlExpr.Eval(expr, ognlContext);
            var series  = chart.Series[seriesIdx];
            foreach (var val in dataset)
            {
                var decVal = Convert.ToDecimal(val);
                series.Points.AddY(decVal);
            }
            seriesIdx++;
        }

        /*if (!String.IsNullOrEmpty(labelExpr)) {
         *      var labels = (IEnumerable)ognlExpr.Eval( labelExpr, ognlContext );
         *      var labelsList = new List<string>();
         *      var labelPrv = String.IsNullOrEmpty(labelLookupName) ? null : WebManager.GetService<IProvider<object,string>>(labelLookupName);
         *      foreach (var lbl in labels) {
         *              labelsList.Add( labelPrv!=null ? labelPrv.Provide(lbl) : Convert.ToString(lbl) );
         *      }
         *      res += "&"+labelParam+String.Join("|", labelsList.ToArray() );
         * }*/
    }
Exemplo n.º 2
0
    public static object GetProviderObject(string prvName, object context, bool useCache)
    {
        var prv = WebManager.GetService <IProvider <object, object> >(prvName);

        return(GetProviderResult(prvName, context, useCache,
                                 x => prv.Provide(x)));
    }
Exemplo n.º 3
0
    public static IDictionary[] GetProviderDictionaries(string prvName, object context, bool useCache)
    {
        var prv = WebManager.GetService <IProvider <object, IDictionary[]> >(prvName);

        return(GetProviderResult(prvName, context, useCache,
                                 x => prv.Provide(x)) as IDictionary[]);
    }
Exemplo n.º 4
0
        public override SiteMapNode BuildSiteMap()
        {
            lock (this) {
                Clear();

                var dalc = WebManager.GetService <IDalc>(DalcName);
                var ds   = new DataSet();
                dalc.Load(ds, new Query(SourceName));
                rootNode = new SiteMapNode(this, "root", RootUrl, RootTitle);
                var idToNode = new Dictionary <string, SiteMapNode>();

                // build nodes
                foreach (DataRow r in ds.Tables[SourceName].Rows)
                {
                    var node = CreateNode(r);
                    idToNode[node.Key] = node;
                }
                // set hierarchy relations
                foreach (DataRow r in ds.Tables[SourceName].Rows)
                {
                    var node      = idToNode[Convert.ToString(r[IdField])];
                    var parentKey = Convert.ToString(r[FkField]);
                    if (r[FkField] != DBNull.Value && idToNode.ContainsKey(parentKey))
                    {
                        AddNode(node, idToNode[parentKey]);
                    }
                    else
                    {
                        AddNode(node, rootNode);
                    }
                }
            }
            return(rootNode);
        }
Exemplo n.º 5
0
    protected string GetValueText()
    {
        var dalc         = WebManager.GetService <IDalc>(DalcServiceName);
        var relexParser  = new RelExQueryParser(false);
        var exprResolver = WebManager.GetService <NI.Common.Expressions.IExpressionResolver>("defaultExprResolver");

        var qContext = new Hashtable();

        if (DataContext is IDictionary)
        {
            qContext = new Hashtable((IDictionary)DataContext);
        }
        qContext["q"] = String.Empty;
        Query q = (Query)relexParser.Parse(Convert.ToString(exprResolver.Evaluate(qContext, GetRelex())));

        q.Root = new QueryConditionNode((QField)ValueFieldName, Conditions.Equal, (QConst)Value);           //& q.Root;
        var data = new Hashtable();

        if (dalc.LoadRecord(data, q))
        {
            var text = Convert.ToString(data[TextFieldName]);
            return(LocalizationEnabled?WebManager.GetLabel(text, this):text);
        }
        else
        {
            Value = null;
            return("");
        }
    }
Exemplo n.º 6
0
    public static bool GetProviderBoolean(string prvName, object context, bool useCache)
    {
        var prv = WebManager.GetService <IProvider <object, object> >(prvName);
        var res = GetProviderResult(prvName, context, useCache,
                                    x => prv.Provide(x));

        return(AssertHelper.IsFuzzyTrue(res));
    }
Exemplo n.º 7
0
    public static string PrepareDataUrl(string prvName, object context, string[] seriesExpr, string labelParam, string labelExpr, string labelLookupName)
    {
        var prv         = WebManager.GetService <IProvider <object, object> >(prvName);
        var ognlContext = new Dictionary <string, object>();

        ognlContext["data"] = prv.Provide(context);

        var     series   = new List <string>();
        decimal allMin   = 0;
        decimal allMax   = 0;
        var     ognlExpr = new NReco.OGNL.EvalOgnl();

        foreach (var expr in seriesExpr)
        {
            var     dataset     = (IEnumerable)ognlExpr.Eval(expr, ognlContext);
            var     datasetList = new List <string>();
            decimal min         = 0;
            decimal max         = 0;
            foreach (var val in dataset)
            {
                var decVal = Convert.ToDecimal(val);
                datasetList.Add(String.Format(CultureInfo.InvariantCulture, "{0:0.#}", decVal));
                if (decVal < min)
                {
                    min = decVal;
                }
                if (decVal > max)
                {
                    max = decVal;
                }
            }
            series.Add(String.Join(",", datasetList.ToArray()));

            if (allMin > min)
            {
                allMin = min;
            }
            if (allMax < max)
            {
                allMax = max;
            }
        }
        var res = String.Format(CultureInfo.InvariantCulture, "chd=t:{0}&chds={1:0.##},{2:0.##}&chxr=1,{1:0.##},{2:0.##},{3}", String.Join("|", series.ToArray()), allMin, allMax, (allMax - allMin) / 5);

        if (!String.IsNullOrEmpty(labelExpr))
        {
            var labels     = (IEnumerable)ognlExpr.Eval(labelExpr, ognlContext);
            var labelsList = new List <string>();
            var labelPrv   = String.IsNullOrEmpty(labelLookupName) ? null : WebManager.GetService <IProvider <object, string> >(labelLookupName);
            foreach (var lbl in labels)
            {
                labelsList.Add(labelPrv != null ? labelPrv.Provide(lbl) : Convert.ToString(lbl));
            }
            res += "&" + labelParam + String.Join("|", labelsList.ToArray());
        }
        return(res);
    }
Exemplo n.º 8
0
    protected string GetRelex()
    {
        var relexByServiceName = WebManager.GetService <object>(Relex);

        if (relexByServiceName != null)
        {
            return(Convert.ToString(relexByServiceName));
        }
        return(Relex);
    }
Exemplo n.º 9
0
    public string[] GetSelectedIds()
    {
        //non-relational mode
        if (RelationEditor == null)
        {
            var values = Eval(ID) as IEnumerable;
            if (values != null)
            {
                return(values.Cast <object>().Select(v => Convert.ToString(v)).ToArray());
            }
            else
            {
                return(new string[0]);
            }
        }

        bool isEmptyId = AssertHelper.IsFuzzyEmpty(EntityId);

        // special hack for autoincrement "new row" ids... TBD: refactor
        if (EntityId is int || EntityId is long)
        {
            if (Convert.ToInt64(EntityId) == 0)
            {
                isEmptyId = true;
            }
        }
        if (isEmptyId)
        {
            if (DefaultValueServiceName != null)
            {
                var defaultValuePrv = WebManager.GetService <IProvider <object, object> >(DefaultValueServiceName);
                var defaultValues   = defaultValuePrv.Provide(DefaultDataContext ?? this.GetContext());
                if (defaultValues != null)
                {
                    var list = new List <string>();
                    if (defaultValues is IList)
                    {
                        foreach (object defaultVal in (IList)defaultValues)
                        {
                            list.Add(Convert.ToString(defaultVal));
                        }
                    }
                    else
                    {
                        list.Add(Convert.ToString(defaultValues));
                    }
                    return(list.ToArray());
                }
            }
            return(new string[0]);
        }
        // select visible ids
        return(RelationEditor.GetToKeys(EntityId).Select(o => Convert.ToString(o)).ToArray());
    }
Exemplo n.º 10
0
    public void ProcessRequest(HttpContext context)
    {
        try {
            var Request  = context.Request;
            var Response = context.Response;
            log.Write(LogEvent.Info, "Processing request: {0}", Request.Url.ToString());

            string providerName  = Request["provider"];
            string operationName = Request["operation"];
            string contextJson   = Request["context"];
            string langCode      = Request["language"];
            try {
                if (!String.IsNullOrEmpty(langCode))
                {
                    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(langCode);
                }
            } catch {
                log.Write(LogEvent.Warn, "Cannot apply language settings (language: {0}, request: {1})", langCode, Request.Url.ToString());
            }

            var json       = new JavaScriptSerializer();
            var prvContext = contextJson != null?json.DeserializeObject(contextJson) : null;

            if (providerName != null)
            {
                var provider = WebManager.GetService <IProvider <object, object> >(providerName);
                if (provider != null)
                {
                    var result = provider.Provide(prvContext);
                    if (result != null)
                    {
                        Response.Write(json.Serialize(result));
                    }
                }
            }
            else if (operationName != null)
            {
                // maybe operation?
                var op = WebManager.GetService <IOperation <object> >(operationName);
                if (op != null)
                {
                    op.Execute(prvContext);
                }
            }
        } catch (Exception ex) {
            log.Write(LogEvent.Warn, String.Format("exception={0}, url={1}", ex, context.Request.Url));

            context.Response.Write(ex.Message);
            context.Response.StatusCode = 510;             /*custom code:ajax error*/
        }
    }
Exemplo n.º 11
0
    protected string GetSelectedItemsJson()
    {
        var dalc         = WebManager.GetService <IDalc>(DalcServiceName);
        var relexParser  = new RelExQueryParser(false);
        var exprResolver = WebManager.GetService <NI.Common.Expressions.IExpressionResolver>("defaultExprResolver");

        var selectedIds = GetSelectedIds();

        if (selectedIds.Length == 0)
        {
            return("[]");
        }

        var qContext = new Hashtable();

        qContext["q"] = String.Empty;
        Query q = (Query)relexParser.Parse(Convert.ToString(exprResolver.Evaluate(qContext, GetRelex())));

        q.Root = new QueryConditionNode((QField)ValueFieldName, Conditions.In, new QConst(selectedIds));           //& q.Root;
        var ds = new DataSet();

        dalc.Load(ds, q);

        var results = new IDictionary <string, object> [ds.Tables[q.SourceName].Rows.Count];

        for (int i = 0; i < results.Length; i++)
        {
            results[i] = new Dictionary <string, object>(new DataRowDictionaryWrapper(ds.Tables[q.SourceName].Rows[i]));
        }

        if (PositionFieldName != null)
        {
            var initialPositions = results.Select(r => Array.IndexOf(selectedIds, Convert.ToString(r[ValueFieldName])))
                                   .ToArray();
            Array.Sort(initialPositions, results);
        }

        var json = new JavaScriptSerializer();

        return(json.Serialize(results));
    }
Exemplo n.º 12
0
    public static ICollection GetProviderDataSource(string prvName, object context)
    {
        var datasource = WebManager.GetService <IProvider <object, IEnumerable> >(prvName).Provide(context);      // tbd - contexts
        var list       = new List <object>();

        if (datasource != null)
        {
            foreach (var elem in datasource)
            {
                if (elem is IDictionary)
                {
                    list.Add(new DictionaryView((IDictionary)elem));
                }
                else
                {
                    list.Add(elem);
                }
            }
        }
        return(list);
    }
Exemplo n.º 13
0
    protected string GetSelectedItemsJson()
    {
        var selectedIds = GetSelectedIds();

        if (selectedIds.Length == 0)
        {
            return("[]");
        }

        var res = new List <KeyValuePair <object, string> >();

        foreach (var selectedId in res)
        {
            var text = WebManager.GetService <IProvider <object, string> >(TextByIdProvider).Provide(selectedId);
            if (text != null)
            {
                res.Add(new KeyValuePair <object, string>(selectedId, text));
            }
        }

        return(JsHelper.ToJsonString(res));
    }
Exemplo n.º 14
0
    public void ProcessRequest(HttpContext context)
    {
        var Request  = context.Request;
        var Response = context.Response;

        log.Write(LogEvent.Info, "Processing FlexBox ajax request: {0}", Request.Url.ToString());

        var dalcName       = Request["dalc"];
        var relex          = Request["relex"];
        var validationCode = Request["validate"];

        if (!ValidateRequest(validationCode, dalcName, relex))
        {
            log.Write(LogEvent.Error, "Validation failed for FlexBox ajax request: {0}", Request.Url.ToString());
            throw new Exception("Invalid FlexBox ajax request");
        }

        var relexByServiceName = WebManager.GetService <object>(relex);

        if (relexByServiceName != null)
        {
            relex = Convert.ToString(relexByServiceName);
        }

        var dalc          = WebManager.GetService <IDalc>(dalcName);
        var labelField    = Request["label"];
        var filterPrvName = Request["filter"];

        var relexParser  = new RelExQueryParser(false);
        var exprResolver = WebManager.GetService <NI.Common.Expressions.IExpressionResolver>("defaultExprResolver");
        var filterPrv    = filterPrvName != null?WebManager.GetService <IProvider <IDictionary <string, object>, IDictionary <string, object> > >(filterPrvName) : null;

        var qContext = new Hashtable();

        // directly passed query parameters
        foreach (string key in Request.Params.Keys)
        {
            if (key != null)
            {
                qContext[key] = Request.Params[key];
            }
        }
        // legacy context format (left for compatibility)
        if (Request["context"] != null)
        {
            var deserializedCtx = JsHelper.FromJsonString <IDictionary <string, object> >(Request["context"]);
            foreach (var item in deserializedCtx)
            {
                qContext[item.Key] = JsHelper.FromJsonString(Convert.ToString(item.Value));
            }
        }
        // actually used context
        if (Request["context_json"] != null)
        {
            var deserializedCtx = JsHelper.FromJsonString <IDictionary <string, object> >(Request["context_json"]);
            foreach (var item in deserializedCtx)
            {
                qContext[item.Key] = item.Value;
            }
        }

        Query q = (Query)relexParser.Parse(Convert.ToString(exprResolver.Evaluate(qContext, relex)));

        if (Request["action"] == "add" && Request["textfield"] != null && Request["valuefield"] != null)
        {
            var dbMgr       = new DalcManager(dalc, WebManager.GetService <IDataSetProvider>("dsFactory"));
            var newEntryRow = dbMgr.Create(q.SourceName);
            newEntryRow[Request["textfield"]] = Request["value"];
            dbMgr.Update(newEntryRow);

            Response.Write(JsHelper.ToJsonString(new Dictionary <string, object>(ConvertManager.ChangeType <IDictionary <string, object> >(newEntryRow))));
        }
        else
        {
            if (Request["p"] != null && Request["s"] != null)
            {
                var pageSize = Convert.ToInt32(Request["s"]);
                q.StartRecord = (Convert.ToInt32(Request["p"]) - 1) * pageSize;
                q.RecordCount = pageSize;
            }
            var ds = new DataSet();
            dalc.Load(ds, q);

            var res     = new Dictionary <string, object>();
            var results = new List <IDictionary <string, object> >();
            foreach (DataRow r in ds.Tables[q.SourceName].Rows)
            {
                IDictionary <string, object> data = new Dictionary <string, object>(new DataRowDictionaryWrapper(r));
                // process label field (if specified)
                if (!String.IsNullOrEmpty(labelField) && data.ContainsKey(labelField))
                {
                    data[labelField] = WebManager.GetLabel(Convert.ToString(data[labelField]), typeof(FlexBoxAjaxHandler).FullName);
                }

                // prevent security hole
                if (data.ContainsKey("password"))
                {
                    data["password"] = null;
                }

                // filter
                if (filterPrv != null)
                {
                    data = filterPrv.Provide(data);
                }
                if (data != null)
                {
                    results.Add(data);
                }
            }

            res["total"]   = dalc.RecordsCount(q.SourceName, q.Root);
            res["results"] = results;

            var json = new JavaScriptSerializer();
            Response.Write(json.Serialize(res));
        }
    }
Exemplo n.º 15
0
    protected void ProcessRequestInternal(HttpContext context)
    {
        Context = context;

        var Request  = context.Request;
        var Response = context.Response;

        log.Write(LogEvent.Debug, "Processing request: {0}", Request.Url.ToString());

        string filesystem = GetParam("filesystem") as string;

        if (String.IsNullOrEmpty(filesystem))
        {
            throw new Exception("Parameter missed: filesystem");
        }
        var fs = WebManager.GetService <IFileSystem>(filesystem);

        string action = GetParam("action") as string;

        if (action != null && action != "" && action != "upload" && action != "download" && !Request.IsAuthenticated)
        {
            throw new System.Security.SecurityException("Action '" + action + "' is available only for authenticated users");
        }

        if (action == "upload")
        {
            HandleUpload(Request, Response, filesystem);
            return;
        }

        string showDir = HttpUtility.UrlDecode(Request["dir"] ?? String.Empty).Replace("\\", "/");

        if (showDir.EndsWith("/"))
        {
            showDir = showDir.Substring(0, showDir.Length - 1);
        }
        if (showDir.StartsWith("/"))
        {
            showDir = showDir.Substring(1);
        }

        var fileVfsPath = GetParam("file") as string;

        if (!AssertHelper.IsFuzzyEmpty(fileVfsPath))
        {
            var fileObj = fs.ResolveFile(fileVfsPath);
            if (!AssertHelper.IsFuzzyEmpty(Request["thumbnail"]))
            {
                var requestThumbnailParts = Request["thumbnail"].Split(new char[] { ',' });
                fileObj = GetThumbnail(fileObj, fs, requestThumbnailParts[0], requestThumbnailParts[1]);
            }
            if (action == "delete")
            {
                fileObj.Delete();
                return;
            }
            else if (action == "rename")
            {
                var newFile = fs.ResolveFile(Path.Combine(Path.GetDirectoryName(fileObj.Name), Request["newname"]));
                fileObj.MoveTo(newFile);
                var renSb = new StringBuilder();
                RenderFile(renSb, fs.ResolveFile(newFile.Name), false, true, Request["extraInfo"] == "1", filesystem);
                Response.Write(renSb.ToString());
                return;
            }
            else if (action == "move")
            {
                var destFolder = Request["dest"];
                var newFile    = fs.ResolveFile(destFolder == "/" || destFolder == "" ? Path.GetFileName(fileObj.Name) : Path.Combine(destFolder, Path.GetFileName(fileObj.Name)));
                fileObj.MoveTo(newFile);
                return;
            }

            if (fileObj.Exists())
            {
                // lets handle 'If-Modified-Since' header to avoid excessive http traffic
                if (IsFileCachedByClient(Request, fileObj.GetContent().LastModifiedTime))
                {
                    Response.StatusCode      = 304;
                    Response.SuppressContent = true;
                    log.Write(LogEvent.Debug, "Not modified, returned HTTP/304");
                }
                else
                {
                    var fileSize = fileObj.GetContent().Size;
                    Response.BufferOutput = false;
                    Response.AddHeader("Content-Length", fileSize.ToString());

                    var fileContentType = ResolveContentType(Path.GetExtension(fileObj.Name));
                    if (fileContentType != null)
                    {
                        Response.ContentType = fileContentType;
                    }
                    Response.Cache.SetLastModified(fileObj.GetContent().LastModifiedTime);
                    Response.AddHeader("Content-Disposition", String.Format("{0}; filename=\"{1}\"", action == "download" ? "attachment" : "inline", Path.GetFileName(fileObj.Name)));

                    Stream inputStream;
                    Stream outputStream = Response.OutputStream;
                    using (inputStream = fileObj.GetContent().InputStream) {
                        int    bytesRead;
                        byte[] buf = new byte[fileSize > MaxBufSize * 5 ? MaxBufSize : MinBufSize];
                        while ((bytesRead = inputStream.Read(buf, 0, buf.Length)) != 0)
                        {
                            outputStream.Write(buf, 0, bytesRead);
                        }
                    }
                }
            }
            fileObj.Close();

            return;
        }

        var dirObj = fs.ResolveFile(showDir);

        if (action == "createdir")
        {
            var newDirName = fs.ResolveFile(Path.Combine(dirObj.Name, Request["dirname"]));
            newDirName.CreateFolder();
            return;
        }

        if (dirObj.Type == FileType.Folder && !Request.IsAuthenticated)
        {
            throw new System.Security.SecurityException("Folder contents is available only for authenticated users");
        }

        var sb = new StringBuilder();

        RenderFile(sb, dirObj, true, false, Request["extraInfo"] == "1", filesystem);
        Response.Write(sb.ToString());
    }
Exemplo n.º 16
0
    protected void HandleUpload(HttpRequest Request, HttpResponse Response, string filesystem)
    {
        var fs           = WebManager.GetService <IFileSystem>(filesystem);
        var result       = new List <IFileObject>();
        var resultFormat = Request["resultFormat"] ?? "text";

        for (int i = 0; i < Request.Files.Count; i++)
        {
            var file = Request.Files[i];

            // skip files with empty name; such a things happends sometimes =\
            if (String.IsNullOrEmpty(file.FileName.Trim()))
            {
                continue;
            }

            var allowedExtensions = AssertHelper.IsFuzzyEmpty(Request["allowedextensions"]) ? null : JsHelper.FromJsonString <IList <string> >(HttpUtility.UrlDecode(Request["allowedextensions"]));
            var originalFileName  = Path.GetFileName(file.FileName);
            var fileName          = Request["dir"] != null && Request["dir"] != "" && Request["dir"] != "/" ? Path.Combine(Request["dir"], originalFileName) : originalFileName;
            log.Write(LogEvent.Debug, "Uploading - file name: {0}", fileName);
            if ((allowedExtensions != null && allowedExtensions.IndexOf(Path.GetExtension(fileName).ToLower()) < 0) || Array.IndexOf(blockedExtensions, Path.GetExtension(fileName).ToLower()) >= 0)
            {
                throw new Exception(WebManager.GetLabel(FileTreeAjaxHandler.InvalidFileTypeMessage));
            }

            var uploadFile    = fs.ResolveFile(fileName);
            var uploadPNGFile = fs.ResolveFile(fileName + ".png");             // additional checking of resized images if file names are similar
            if ((uploadFile.Exists() || uploadPNGFile.Exists()) && Request["overwrite"] != null && !Convert.ToBoolean(Request["overwrite"]))
            {
                int fileNum = 0;
                do
                {
                    fileNum++;
                    var extIdx      = fileName.LastIndexOf('.');
                    var newFileName = extIdx >= 0 ? String.Format("{0}{1}{2}", fileName.Substring(0, extIdx), fileNum, fileName.Substring(extIdx)) : fileName + fileNum.ToString();
                    uploadFile = fs.ResolveFile(newFileName);
                } while (uploadFile.Exists() && fileNum < 100);
                if (uploadFile.Exists())
                {
                    var extIdx       = fileName.LastIndexOf('.');
                    var uniqueSuffix = Guid.NewGuid().ToString();
                    uploadFile = fs.ResolveFile(
                        extIdx >= 0 ?  fileName.Substring(0, extIdx) + uniqueSuffix + fileName.Substring(extIdx) : fileName + uniqueSuffix);                 // 99.(9)% new file!
                }
                fileName = uploadFile.Name;
            }
            // special handling for images
            if (Request["image"] == "compressed" || Request["imageformat"] != null || Request["image_max_width"] != null || Request["image_max_height"] != null)
            {
                uploadFile = ImageHelper.SaveAndResizeImage(
                    file.InputStream, fs, uploadFile,
                    Convert.ToInt32(Request["image_max_width"] ?? "0"),
                    Convert.ToInt32(Request["image_max_height"] ?? "0"),
                    Request["imageformat"] != null ? ImageHelper.ResolveImageFormat(Request["imageformat"]) : null
                    );
            }
            else
            {
                uploadFile.CopyFrom(file.InputStream);
            }

            result.Add(uploadFile);
        }

        switch (resultFormat)
        {
        case "text":
            Response.Write(String.Join("\n", result.Select(f => f.Name).ToArray()));
            break;

        case "json":
            Response.Write(JsHelper.ToJsonString(
                               result.Select(f =>
                                             new Dictionary <string, object> {
                { "name", Path.GetFileName(f.Name) },
                { "filepath", f.Name },
                { "size", f.GetContent().Size },
                { "url", VfsHelper.GetFileUrl(filesystem, f.Name) },
                { "full_url", VfsHelper.GetFileFullUrl(filesystem, f.Name) }
            }
                                             ).ToArray()));
            break;
        }
    }