winix/templates/dir.cpp

418 lines
7.8 KiB
C++
Executable File

/*
* This file is a part of Winix
* and is not publicly distributed
*
* Copyright (c) 2008-2010, Tomasz Sowa
* All rights reserved.
*
*/
#include "templates.h"
#include "core/misc.h"
#include "functions/functions.h"
namespace TemplatesFunctions
{
void dir(Info & i)
{
for(size_t a=0 ; a<cur->request->dir_tab.size() ; ++a)
i.out << cur->request->dir_tab[a]->url << '/';
}
void dir_without_slash(Info & i)
{
for(size_t a=0 ; a<cur->request->dir_tab.size() ; ++a)
{
i.out << cur->request->dir_tab[a]->url;
if( a < cur->request->dir_tab.size()-1 )
i.out << '/';
}
}
void dir_is_root(Info & i)
{
i.res = cur->request->dir_tab.size() == 1;
}
void dir_parent(Info & i)
{
if( cur->request->dir_tab.empty() )
return;
for(size_t a=0 ; a<cur->request->dir_tab.size()-1 ; ++a)
{
i.out << cur->request->dir_tab[a]->url << '/';
}
}
void dir_parent_without_slash(Info & i)
{
if( cur->request->dir_tab.empty() )
return;
for(size_t a=0 ; a<cur->request->dir_tab.size()-1 ; ++a)
{
i.out << cur->request->dir_tab[a]->url;
if( cur->request->dir_tab.size()>=2 && a<cur->request->dir_tab.size()-2 )
i.out << '/';
}
}
//!! moze wystarczy sprawdzac tylko ostatni katalog?
// bo inaczej i tak bylo by 'access denied'
void dir_can_read_exec(Info & i)
{
i.res = system->HasReadExecAccessToPath(cur->request->dir_tab);
}
// !! zamienic na dir_last_can_write ?
void dir_can_write(Info & i)
{
i.res = system->HasWriteAccess(*cur->request->dir_tab.back());
}
void dir_can_remove(Info & i)
{
bool result = true;
if( cur->request->dir_tab.size() == 1 )
{
// rm for the root dir
// only the superuser can do it
if( !cur->session->puser || !cur->session->puser->super_user )
result = false;
}
else
{
Item * last_but_one_dir = *(--(--cur->request->dir_tab.end()));
if( !system->HasWriteAccess(*last_but_one_dir) )
result = false;
}
i.res = result;
}
void dir_can_use_emacs(Info & i)
{
i.res = functions->fun_emacs.HasAccess();
}
void dir_can_use_mkdir(Info & i)
{
i.res = functions->fun_mkdir.HasAccess();
}
static std::wstring dir_parents_str;
void dir_is(Info & i)
{
dir_parents_str.clear();
for(size_t a=0 ; a<cur->request->dir_tab.size() ; ++a)
{
dir_parents_str += cur->request->dir_tab[a]->url;
dir_parents_str += '/';
}
if( !i.par.empty() && i.par[i.par.size()-1] != '/' )
if( !dir_parents_str.empty() )
dir_parents_str.erase(dir_parents_str.size()-1);
i.res = (i.par == dir_parents_str);
}
void dir_has_parents(Info & i)
{
dir_parents_str.clear();
for(size_t a=0 ; a<cur->request->dir_tab.size() ; ++a)
{
dir_parents_str += cur->request->dir_tab[a]->url;
dir_parents_str += '/';
}
i.res = IsSubString(i.par, dir_parents_str);
}
static std::vector<Item*> dir_childs_table;
static size_t dir_childs_index;
// cur->request->id is never 0 and we can start dir_childs_reqid from 0
static size_t dir_childs_reqid = 0;
// is the first directory the parent ('..')
static bool dir_childs_has_parent;
void dir_childs_tab(Info & i)
{
if( dir_childs_reqid != cur->request->id )
{
dir_childs_reqid = cur->request->id;
dir_childs_table.clear();
dir_childs_has_parent = false;
if( !cur->request->dir_tab.empty() )
{
if( cur->request->dir_tab.size() >= 2 && i.par == L"with_parent")
{
Item * dir_up = cur->request->dir_tab[cur->request->dir_tab.size()-2];
dir_childs_table.push_back(dir_up);
dir_childs_has_parent = true;
}
system->dirs.GetDirChilds(cur->request->dir_tab.back()->id, dir_childs_table);
}
}
dir_childs_index = i.iter;
i.res = dir_childs_index < dir_childs_table.size();
}
// is this child a parent ('..')
void dir_childs_is_parent(Info & i)
{
i.res = (dir_childs_has_parent && dir_childs_index == 0);
}
void dir_childs_tab_url(Info & i)
{
if( dir_childs_index < dir_childs_table.size() )
i.out << dir_childs_table[dir_childs_index]->url;
}
void dir_childs_tab_privileges(Info & i)
{
if( dir_childs_index < dir_childs_table.size() )
i.out << "0" << Toa(dir_childs_table[dir_childs_index]->privileges, 8);
}
void dir_childs_tab_user(Info & i)
{
if( dir_childs_index < dir_childs_table.size() )
{
long user_id = dir_childs_table[dir_childs_index]->user_id;
User * puser = system->users.GetUser(user_id);
if( puser )
i.out << puser->name;
else
{
i.out << "~";
if( !dir_childs_table[dir_childs_index]->guest_name.empty() )
i.out << dir_childs_table[dir_childs_index]->guest_name;
else
i.out << "guest"; // !! dodac do konfiga
}
}
}
void dir_childs_tab_group(Info & i)
{
if( dir_childs_index < dir_childs_table.size() )
{
long group_id = dir_childs_table[dir_childs_index]->group_id;
Group * pgroup = system->groups.GetGroup(group_id);
if( pgroup )
i.out << pgroup->name;
else
i.out << group_id;
}
}
static size_t dir_index;
void dir_tab(Info & i)
{
dir_index = i.iter;
i.res = dir_index < cur->request->dir_tab.size();
}
void dir_tab_url(Info & i)
{
if( dir_index < cur->request->dir_tab.size() )
i.out << cur->request->dir_tab[dir_index]->url;
}
void dir_tab_link(Info & i)
{
doc_proto(i);
if( !cur->request->subdomain.empty() )
i.out << cur->request->subdomain << '.';
i.out << config->base_url;
for(size_t a = 0 ; a <= dir_index && a < cur->request->dir_tab.size() ; ++a)
{
i.out << cur->request->dir_tab[a]->url;
i.out << '/';
}
}
void dir_last_link_to(Info & i)
{
i.out << cur->request->dir_tab.back()->link_to;
}
void dir_last_is_link_redirect(Info & i)
{
i.res = cur->request->dir_tab.back()->link_redirect == 1;
}
void dir_last_subject(Info & i)
{
i.out << cur->request->dir_tab.back()->subject;
}
void dir_last_user(Info & i)
{
User * puser = system->users.GetUser(cur->request->dir_tab.back()->user_id);
if( puser )
i.out << puser->name;
else
{
i.out << "~";
if( !cur->request->dir_tab.back()->guest_name.empty() )
i.out << cur->request->dir_tab.back()->guest_name;
else
i.out << "guest"; // !! dodac do konfiga
}
}
void dir_last_url(Info & i)
{
i.out << cur->request->dir_tab.back()->url;
}
void dir_last_url_is(Info & i)
{
i.res = cur->request->dir_tab.back()->url == i.par;
}
void dir_last_date_creation(Info & i)
{
tm rtm = system->LocalTime(cur->request->dir_tab.back()->date_creation);
i.out << DateToStr(rtm.tm_year + 1900, rtm.tm_mon + 1, rtm.tm_mday, rtm.tm_hour, rtm.tm_min, rtm.tm_sec);
}
void dir_last_date_modification(Info & i)
{
tm rtm = system->LocalTime(cur->request->dir_tab.back()->date_modification);
i.out << DateToStr(rtm.tm_year + 1900, rtm.tm_mon + 1, rtm.tm_mday, rtm.tm_hour, rtm.tm_min, rtm.tm_sec);
}
void dir_last_date_creation_nice(Info & i)
{
print_date_nice(i, cur->request->dir_tab.back()->date_creation);
}
void dir_last_date_modification_nice(Info & i)
{
print_date_nice(i, cur->request->dir_tab.back()->date_modification);
}
void dir_last_dates_equal(Info & i)
{
tm * ptm1 = &cur->request->dir_tab.back()->date_creation;
tm * ptm2 = &cur->request->dir_tab.back()->date_modification;
i.res = ptm1->tm_year == ptm2->tm_year &&
ptm1->tm_mon == ptm2->tm_mon &&
ptm1->tm_mday == ptm2->tm_mday &&
ptm1->tm_hour == ptm2->tm_hour &&
ptm1->tm_min == ptm2->tm_min &&
ptm1->tm_sec == ptm2->tm_sec;
}
void dir_last_users_different(Info & i)
{
i.res = (cur->request->dir_tab.back()->user_id != cur->request->dir_tab.back()->modification_user_id);
}
void dir_last_modification_user(Info & i)
{
User * puser = system->users.GetUser(cur->request->dir_tab.back()->modification_user_id);
print_user_name(i, puser, cur->request->dir_tab.back()->guest_name);
}
void dir_last_html_template(Info & i)
{
i.out << cur->request->dir_tab.back()->html_template;
}
void dir_last_has_html_template(Info & i)
{
i.res = !cur->request->dir_tab.back()->html_template.empty();
}
void dir_last_meta_str(Info & i)
{
cur->request->dir_tab.back()->meta.Serialize(i.out, true, false);
}
} // namespace TemplatesFunctions