diff --git a/winixd/core/app.cpp b/winixd/core/app.cpp index 420872c..0c1fe9e 100644 --- a/winixd/core/app.cpp +++ b/winixd/core/app.cpp @@ -88,6 +88,7 @@ App::App() winix_request.set_cur(&cur); winix_request.set_session_manager(&session_manager); winix_request.set_locale(&TemplatesFunctions::locale); + winix_request.set_model_connector(&model_connector); // ////////////////////////////////// diff --git a/winixd/core/request.cpp b/winixd/core/request.cpp index f795952..dcaf44e 100644 --- a/winixd/core/request.cpp +++ b/winixd/core/request.cpp @@ -53,6 +53,13 @@ Request::Request() } +void Request::fields() +{ + field(L"", L"dirs", dir_tab); +} + + + void Request::SetConfig(Config * pconfig) { config = pconfig; diff --git a/winixd/core/request.h b/winixd/core/request.h index 7106180..add2749 100644 --- a/winixd/core/request.h +++ b/winixd/core/request.h @@ -50,6 +50,8 @@ #include "outstreams.h" #include "models.h" +#include "models/winixmodel.h" + namespace Winix { @@ -62,7 +64,7 @@ class FunctionBase; -struct Request +struct Request : public WinixModel { // how many input headers can be put to in_headers struct static const size_t MAX_INPUT_HEADERS = 32; @@ -360,6 +362,10 @@ struct Request Request(); void SetConfig(Config * pconfig); + + void fields(); + + void RequestStarts(); void Clear(); diff --git a/winixd/functions/ls.cpp b/winixd/functions/ls.cpp index 9a7921e..1fb6fab 100644 --- a/winixd/functions/ls.cpp +++ b/winixd/functions/ls.cpp @@ -50,6 +50,41 @@ Ls::Ls() } +void Ls::prepare_files() +{ + morm::Finder finder(model_connector); + + finder. + select(). + where(). + eq(L"parent_id", cur->request->dir_tab.back()->id). + neq(L"type", static_cast(Item::dir)); + + if( cur->request->IsParam(L"ckeditor_browse") ) + { + finder.eq(L"content", L"file_type", WINIX_ITEM_FILETYPE_IMAGE); + } + + finder.get_vector(item_tab); +} + + +void Ls::prepare_dirs() +{ + dir_tab.clear(); + + // with parent directory (if exists) + // if dir_tab.size() is equal to 1 then we at the root directory + if( cur->request->dir_tab.size() >= 2 ) + { + Item * dir_up = cur->request->dir_tab[cur->request->dir_tab.size()-2]; + dir_tab.push_back(dir_up); + } + + system->dirs.GetDirChilds(cur->request->dir_tab.back()->id, dir_tab); +} + + void Ls::MakeGet() { // !! IMPROVE ME @@ -61,33 +96,15 @@ void Ls::MakeGet() if( !cur->request->is_item ) { -// DbItemQuery iq; -// -// iq.sel_content = false; -// -// iq.WhereParentId(cur->request->dir_tab.back()->id); -// iq.WhereType(Item::dir, false); + prepare_files(); + prepare_dirs(); - morm::Finder finder(model_connector); + cur->request->models.Add(L"items", item_tab); + cur->request->models.Add(L"child_dirs", dir_tab); - finder. - select(). - where(). - eq(L"parent_id", cur->request->dir_tab.back()->id). - neq(L"type", static_cast(Item::dir)); - - if( cur->request->IsParam(L"ckeditor_browse") ) - { - //iq.WhereFileType(WINIX_ITEM_FILETYPE_IMAGE); - //db->GetItems(cur->request->item_tab, iq); - finder.eq(L"content", L"file_type", WINIX_ITEM_FILETYPE_IMAGE); - } -// else -// { -// //db->GetItems(cur->request->item_tab, iq); -// } - - finder.get_vector(cur->request->item_tab); + // IMPROVEME this will be put by a generic method from winix + // if output is html + cur->request->models.Add(L"request", cur->request); } } diff --git a/winixd/functions/ls.h b/winixd/functions/ls.h index 6ef8bb8..e7e4ef2 100644 --- a/winixd/functions/ls.h +++ b/winixd/functions/ls.h @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2010-2014, Tomasz Sowa + * Copyright (c) 2010-2021, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -55,7 +55,11 @@ public: private: + std::vector item_tab; + std::vector dir_tab; + void prepare_files(); + void prepare_dirs(); }; diff --git a/winixd/html/fun_ls.html b/winixd/html/fun_ls.html index 0545996..dd362e4 100644 --- a/winixd/html/fun_ls.html +++ b/winixd/html/fun_ls.html @@ -7,14 +7,14 @@
    - [for dir_tab] + [for request.dirs]
  • - - [if cmp dir_tab_url ""] + + [if cmp request.dirs.url ""] [# !! IMPROVE ME it would be better to have a flag of some kind to indicate that this is a root dir] {ls_root_dir_name} [else] - [dir_tab_url] + [request.dirs.url] [end]
  • @@ -25,16 +25,16 @@
    - [if dir_childs_tab "with_parent"] + [if child_dirs]
      - [for dir_childs_tab "with_parent"] + [for child_dirs]
    • - [if dir_childs_is_parent] + [if child_dirs.is_parent_for_current_dir] [# make sure the name of the textarea in fun_ckeditor.html is called: itemcontent] [# is it needed?] ../ [else] - [dir_childs_tab_url]/ + [child_dirs.url]/ [end]
    • [end] @@ -45,12 +45,12 @@
      - [if item_tab] + [if items]
        - [for item_tab] -
      • [item_tab_subject]
      • + [for items] +
      • [items.subject]
      • [end]
      @@ -69,11 +69,7 @@ [if winix_function_param_is "l"] - [# loading dir childs table with a parent directory] - [# now the parameter can be passed directly to if-one] - [dir_childs_tab "with_parent"] - - [if one dir_childs_tab item_tab] + [if one child_dirs items] @@ -84,29 +80,29 @@ - [for dir_childs_tab] + [for child_dirs] - - - + + + [end] - [for item_tab] + [for items] - - - - - + + + + + [end]
      {ls_name}
      d[dir_childs_tab_privileges][dir_childs_tab_user][dir_childs_tab_group][child_dirs_privileges][child_dirs_user][child_dirs_group] - [if dir_childs_is_parent] + [if child_dirs.is_parent_for_current_dir] ../ [else] - [dir_childs_tab_url]/ + [child_dirs.url]/ [end]
      [if item_tab_type_is_symlink]l[else][if item_tab_has_static_file]s[else]-[end][end][item_tab_privileges][item_tab_user][item_tab_group][item_tab_url][if item_tab_type_is_symlink] -> [item_tab_link_to][end][if items_type_is_symlink]l[else][if items_has_static_file]s[else]-[end][end][items_privileges][items_user][items_group][items.url][if items_type_is_symlink] -> [items_link_to][end]
      @@ -115,27 +111,24 @@ [else] - [# loading dir childs table with a parent directory] - [dir_childs_tab "with_parent"] - - [if dir_childs_tab] + [if child_dirs] [end] [# !! IMPROVE ME those two lists (above and below) can be combined together] - [if item_tab] + [if items] [end] diff --git a/winixd/models/item.cpp b/winixd/models/item.cpp index 490307d..c2f9926 100644 --- a/winixd/models/item.cpp +++ b/winixd/models/item.cpp @@ -70,6 +70,9 @@ void Item::fields() field(L"is", &Item::is); field(L"dir_link", &Item::dir_link); field(L"link", &Item::link); + field(L"is_parent_for_current_dir", &Item::is_parent_for_current_dir); + field(L"is_current_dir", &Item::is_current_dir); + field(L"is_root", &Item::is_root); // may we should add a method setTypeFromInt(int t)? @@ -325,6 +328,41 @@ void Item::link(Ezc::FunInfo & env) } +void Item::is_parent_for_current_dir(Ezc::FunInfo & env) +{ + Request * req = get_request(); + + if( req ) + { + if( req->dir_tab.size() > 1 ) + { + env.res = (id == req->dir_tab[req->dir_tab.size() - 2]->id); + } + } +} + + +void Item::is_current_dir(Ezc::FunInfo & env) +{ + Request * req = get_request(); + + if( req ) + { + env.res = (id == req->dir_tab.back()->id); + } +} + +// rename to is_root_dir +void Item::is_root(Ezc::FunInfo & env) +{ + Request * req = get_request(); + + if( req ) + { + // add a test whether this is a directory (not a file or a symlink) + env.res = (parent_id == -1); + } +} diff --git a/winixd/models/item.h b/winixd/models/item.h index ce86466..9c19cb1 100644 --- a/winixd/models/item.h +++ b/winixd/models/item.h @@ -190,6 +190,9 @@ public: void is(Ezc::FunInfo & env); void dir_link(Ezc::FunInfo & env); void link(Ezc::FunInfo & env); + void is_parent_for_current_dir(Ezc::FunInfo & env); + void is_current_dir(Ezc::FunInfo & env); + void is_root(Ezc::FunInfo & env); protected: diff --git a/winixd/templates/dir.cpp b/winixd/templates/dir.cpp index 2f467ba..0ed6dcd 100644 --- a/winixd/templates/dir.cpp +++ b/winixd/templates/dir.cpp @@ -204,7 +204,7 @@ void dir_level_is(Info & i) - +/* static std::vector dir_childs_table; static size_t dir_childs_index; // cur->request->id is never 0 and we can start dir_childs_reqid from 0 @@ -298,12 +298,12 @@ void dir_childs_tab_group(Info & i) i.out << group_id; } } +*/ - - +/* static size_t dir_index; @@ -333,7 +333,6 @@ void dir_tab_link(Info & i) } } - void dir_tab_is_root(Info & i) { i.res = (dir_index == 0); @@ -345,6 +344,7 @@ void dir_tab_subject(Info & i) if( dir_index < cur->request->dir_tab.size() ) i.out << cur->request->dir_tab[dir_index]->subject; } +*/ void dir_last_link_to(Info & i) diff --git a/winixd/templates/templates.cpp b/winixd/templates/templates.cpp index cde76d6..7546193 100644 --- a/winixd/templates/templates.cpp +++ b/winixd/templates/templates.cpp @@ -274,18 +274,22 @@ void Templates::CreateFunctions() ezc_functions.Insert("dir_has_parents", dir_has_parents); ezc_functions.Insert("dir_level_is", dir_level_is); + /* ezc_functions.Insert("dir_childs_tab", dir_childs_tab); ezc_functions.Insert("dir_childs_is_parent", dir_childs_is_parent); ezc_functions.Insert("dir_childs_tab_url", dir_childs_tab_url); ezc_functions.Insert("dir_childs_tab_privileges", dir_childs_tab_privileges); ezc_functions.Insert("dir_childs_tab_user", dir_childs_tab_user); ezc_functions.Insert("dir_childs_tab_group", dir_childs_tab_group); + */ + /* ezc_functions.Insert("dir_tab", dir_tab); ezc_functions.Insert("dir_tab_url", dir_tab_url); ezc_functions.Insert("dir_tab_link", dir_tab_link); ezc_functions.Insert("dir_tab_subject", dir_tab_subject); ezc_functions.Insert("dir_tab_is_root", dir_tab_is_root); + */ ezc_functions.Insert("dir_last_link_to", dir_last_link_to); ezc_functions.Insert("dir_last_is_link_redirect", dir_last_is_link_redirect); diff --git a/winixd/templates/templates.h b/winixd/templates/templates.h index e84480e..c7790c4 100644 --- a/winixd/templates/templates.h +++ b/winixd/templates/templates.h @@ -164,18 +164,22 @@ namespace TemplatesFunctions void dir_has_parents(Info & i); void dir_level_is(Info & i); + /* void dir_childs_tab(Info & i); void dir_childs_is_parent(Info & i); void dir_childs_tab_url(Info & i); void dir_childs_tab_privileges(Info & i); void dir_childs_tab_user(Info & i); void dir_childs_tab_group(Info & i); + */ + /* void dir_tab(Info & i); void dir_tab_url(Info & i); void dir_tab_link(Info & i); void dir_tab_subject(Info & i); void dir_tab_is_root(Info & i); + */ void dir_last_link_to(Info &); void dir_last_is_link_redirect(Info & i);