aboutsummaryrefslogtreecommitdiff
path: root/src/ContentManager.cpp
blob: a110e05d5d97ec0d59bd0432c56f008210bc34c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "ContentManager.hpp"

void ContentManager::SetTemplateSystem(std::shared_ptr<TemplateManager> const & tmgr)
{
    m_TemplateManager = tmgr;
}

bool ContentManager::RegisterModule(std::shared_ptr<Content> ctnt)
{
    std::string const & basePath = ctnt->GetUriBasePath();

    if (basePath.empty() == true)
    {
        return false;
    }
    m_ContentModules[basePath] = ctnt;

    return true;
}

bool ContentManager::InitAll(void)
{
    bool ret = true;

    for (auto & content : m_ContentModules)
    {
        if (content.second->Init() == false)
        {
            ret = false;
        }

        Redirections const & rs = content.second->GetRedirections();
        for (auto & redirect : rs)
        {
            m_ContentModulesRoutes[redirect] = content.second;
        }
    }

    return ret;
}

void ContentManager::ShutdownAll(void)
{
    std::unordered_map<std::shared_ptr<Content>, bool> shutdownModules;

    for (auto & content : m_ContentModules)
    {
        auto const & search = shutdownModules.find(content.second);
        if (search != shutdownModules.end())
        {
            continue;
        }
        else
        {
            content.second->Shutdown();
            shutdownModules[content.second] = true;
        }
    }

    m_ContentModulesRoutes.clear();
    m_ContentModules.clear();
}

bool ContentManager::Render(char const * basePath, RequestResponse & rr, std::string & out)
{
    std::shared_ptr<Content> cntm;

    if (m_ContentModules.find(basePath) == m_ContentModules.end())
    {
        if (m_ContentModulesRoutes.find(basePath) == m_ContentModulesRoutes.end())
        {
            return false;
        }
        else
        {
            cntm = m_ContentModulesRoutes[basePath];
        }
    }
    else
    {
        cntm = m_ContentModules[basePath];
    }

    auto & main = cntm->GetMainTemplate();

    out.clear();
    RenderData rd;
    if (cntm->Render(rr, rd, out) == false)
    {
        return false;
    }

    if (main.empty() == false && out.empty() == true && m_TemplateManager->RenderTemplate(main, rd, out) == false)
    {
        return false;
    }

    return true;
}

ContentModules const & ContentManager::GetAllModules() const
{
    return m_ContentModules;
}

ContentModules const & ContentManager::GetAllModulesRoutes() const
{
    return m_ContentModulesRoutes;
}