ZNC  trunk
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Template.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2004-2014 ZNC, see the NOTICE file for details.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _TEMPLATE_H
18 #define _TEMPLATE_H
19 
20 #include <znc/zncconfig.h>
21 #include <znc/Utils.h>
22 #include <iostream>
23 #include <list>
24 
25 class CTemplate;
26 
28 public:
30  virtual ~CTemplateTagHandler() {}
31 
32  virtual bool HandleVar(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) {
33  return false;
34  }
35 
36  virtual bool HandleTag(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) {
37  return false;
38  }
39 
40  virtual bool HandleIf(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) {
41  return HandleVar(Tmpl, sName, sArgs, sOutput);
42  }
43 
44  virtual bool HandleValue(CTemplate& Tmpl, CString& sValue, const MCString& msOptions) {
45  return false;
46  }
47 private:
48 };
49 class CTemplate;
50 
52 public:
54  m_eEscapeFrom = CString::EASCII;
55  m_eEscapeTo = CString::EASCII;
56  }
57 
58  virtual ~CTemplateOptions() {}
59 
60  void Parse(const CString& sLine);
61 
62  // Getters
63  CString::EEscape GetEscapeFrom() const { return m_eEscapeFrom; }
64  CString::EEscape GetEscapeTo() const { return m_eEscapeTo; }
65  // !Getters
66 private:
67  CString::EEscape m_eEscapeFrom;
68  CString::EEscape m_eEscapeTo;
69 };
70 
71 
73 public:
74  CTemplateLoopContext(unsigned long uFilePos, const CString& sLoopName, bool bReverse, std::vector<CTemplate*>* pRows) {
75  m_uFilePosition = uFilePos;
76  m_sName = sLoopName;
77  m_uRowIndex = 0;
78  m_bReverse = bReverse;
79  m_pvRows = pRows;
80  m_bHasData = false;
81  }
82 
83  virtual ~CTemplateLoopContext() {}
84 
85  // Setters
86  void SetHasData(bool b = true) { m_bHasData = b; }
87  void SetName(const CString& s) { m_sName = s; }
88  void SetRowIndex(unsigned int u) { m_uRowIndex = u; }
89  unsigned int IncRowIndex() { return ++m_uRowIndex; }
90  unsigned int DecRowIndex() { if (m_uRowIndex == 0) { return 0; } return --m_uRowIndex; }
91  void SetFilePosition(unsigned int u) { m_uFilePosition = u; }
92  // !Setters
93 
94  // Getters
95  bool HasData() const { return m_bHasData; }
96  const CString& GetName() const { return m_sName; }
97  unsigned long GetFilePosition() const { return m_uFilePosition; }
98  unsigned int GetRowIndex() const { return m_uRowIndex; }
99  size_t GetRowCount() { return m_pvRows->size(); }
100  std::vector<CTemplate*>* GetRows() { return m_pvRows; }
102  CTemplate* GetCurRow() { return GetRow(m_uRowIndex); }
103 
104  CTemplate* GetRow(unsigned int uIndex);
105  CString GetValue(const CString& sName, bool bFromIf = false);
106  // !Getters
107 private:
108  bool m_bReverse;
109  bool m_bHasData;
110  CString m_sName;
111  unsigned int m_uRowIndex;
112  unsigned long m_uFilePosition;
113  std::vector<CTemplate*>* m_pvRows;
114 };
115 
116 
117 class CTemplate : public MCString {
118 public:
119  CTemplate() : MCString(), m_spOptions(new CTemplateOptions) {
120  Init();
121  }
122 
123  CTemplate(const CString& sFileName) : MCString(), m_sFileName(sFileName), m_spOptions(new CTemplateOptions) {
124  Init();
125  }
126 
127  CTemplate(const CSmartPtr<CTemplateOptions>& Options, CTemplate* pParent = NULL) : MCString(), m_spOptions(Options) {
128  Init();
129  m_pParent = pParent;
130  }
131 
132  virtual ~CTemplate();
133 
136  m_vspTagHandlers.push_back(spTagHandler);
137  }
138 
139  std::vector<CSmartPtr<CTemplateTagHandler> >& GetTagHandlers() {
140  if (m_pParent) {
141  return m_pParent->GetTagHandlers();
142  }
143 
144  return m_vspTagHandlers;
145  }
146 
147  CString ResolveLiteral(const CString& sString);
148 
149  void Init();
150 
151  CTemplate* GetParent(bool bRoot);
152  CString ExpandFile(const CString& sFilename, bool bFromInc = false);
153  bool SetFile(const CString& sFileName);
154 
155  void SetPath(const CString& sPath); // Sets the dir:dir:dir type path to look at for templates, as of right now no ../../.. protection
156  CString MakePath(const CString& sPath) const;
157  void PrependPath(const CString& sPath, bool bIncludesOnly = false);
158  void AppendPath(const CString& sPath, bool bIncludesOnly = false);
159  void RemovePath(const CString& sPath);
160  void ClearPaths();
161  bool PrintString(CString& sRet);
162  bool Print(std::ostream& oOut);
163  bool Print(const CString& sFileName, std::ostream& oOut);
164  bool ValidIf(const CString& sArgs);
165  bool ValidExpr(const CString& sExpr);
166  bool IsTrue(const CString& sName);
167  bool HasLoop(const CString& sName);
168  CString GetValue(const CString& sName, bool bFromIf = false);
169  CTemplate& AddRow(const CString& sName);
170  CTemplate* GetRow(const CString& sName, unsigned int uIndex);
171  std::vector<CTemplate*>* GetLoop(const CString& sName);
172  void DelCurLoopContext();
175 
176  // Getters
177  const CString& GetFileName() const { return m_sFileName; }
178  // !Getters
179 private:
180  CTemplate* m_pParent;
181  CString m_sFileName;
182  std::list<std::pair<CString, bool> > m_lsbPaths;
183  std::map<CString, std::vector<CTemplate*> > m_mvLoops;
184  std::vector<CTemplateLoopContext*> m_vLoopContexts;
185  CSmartPtr<CTemplateOptions> m_spOptions;
186  std::vector<CSmartPtr<CTemplateTagHandler> > m_vspTagHandlers;
187 };
188 
189 #endif // !_TEMPLATE_H
void DelCurLoopContext()
void PrependPath(const CString &sPath, bool bIncludesOnly=false)
const CString & GetName() const
Definition: Template.h:96
bool ValidExpr(const CString &sExpr)
CString GetValue(const CString &sName, bool bFromIf=false)
CString::EEscape GetEscapeTo() const
Definition: Template.h:64
virtual bool HandleTag(CTemplate &Tmpl, const CString &sName, const CString &sArgs, CString &sOutput)
Definition: Template.h:36
void Init()
void AppendPath(const CString &sPath, bool bIncludesOnly=false)
void RemovePath(const CString &sPath)
void ClearPaths()
std::vector< CTemplate * > * GetRows()
Definition: Template.h:100
CTemplate * GetNextRow()
Definition: Template.h:101
Definition: Template.h:51
virtual ~CTemplateTagHandler()
Definition: Template.h:30
void AddTagHandler(CSmartPtr< CTemplateTagHandler > spTagHandler)
Class for implementing custom tags in subclasses.
Definition: Template.h:135
bool Print(std::ostream &oOut)
Definition: Template.h:72
void SetFilePosition(unsigned int u)
Definition: Template.h:91
CTemplateTagHandler()
Definition: Template.h:29
Definition: ZNCString.h:70
CTemplate()
Definition: Template.h:119
CTemplateLoopContext(unsigned long uFilePos, const CString &sLoopName, bool bReverse, std::vector< CTemplate * > *pRows)
Definition: Template.h:74
CTemplate * GetRow(const CString &sName, unsigned int uIndex)
bool SetFile(const CString &sFileName)
bool HasLoop(const CString &sName)
EEscape
Definition: ZNCString.h:69
CTemplate(const CString &sFileName)
Definition: Template.h:123
Definition: Template.h:27
CString MakePath(const CString &sPath) const
void SetHasData(bool b=true)
Definition: Template.h:86
void Parse(const CString &sLine)
virtual bool HandleValue(CTemplate &Tmpl, CString &sValue, const MCString &msOptions)
Definition: Template.h:44
Definition: Template.h:117
std::vector< CTemplate * > * GetLoop(const CString &sName)
unsigned int IncRowIndex()
Definition: Template.h:89
String class that is used inside ZNC.
Definition: ZNCString.h:67
void SetPath(const CString &sPath)
unsigned int DecRowIndex()
Definition: Template.h:90
unsigned long GetFilePosition() const
Definition: Template.h:97
const CString & GetFileName() const
Definition: Template.h:177
size_t GetRowCount()
Definition: Template.h:99
CTemplate * GetCurRow()
Definition: Template.h:102
CTemplate & AddRow(const CString &sName)
std::vector< CSmartPtr< CTemplateTagHandler > > & GetTagHandlers()
Definition: Template.h:139
bool ValidIf(const CString &sArgs)
CTemplate * GetCurTemplate()
CTemplateOptions()
Definition: Template.h:53
CTemplate(const CSmartPtr< CTemplateOptions > &Options, CTemplate *pParent=NULL)
Definition: Template.h:127
CString::EEscape GetEscapeFrom() const
Definition: Template.h:63
A dictionary for strings.
Definition: ZNCString.h:538
void SetRowIndex(unsigned int u)
Definition: Template.h:88
bool IsTrue(const CString &sName)
virtual ~CTemplateOptions()
Definition: Template.h:58
CString ResolveLiteral(const CString &sString)
virtual bool HandleVar(CTemplate &Tmpl, const CString &sName, const CString &sArgs, CString &sOutput)
Definition: Template.h:32
CString GetValue(const CString &sName, bool bFromIf=false)
virtual bool HandleIf(CTemplate &Tmpl, const CString &sName, const CString &sArgs, CString &sOutput)
Definition: Template.h:40
bool HasData() const
Definition: Template.h:95
void SetName(const CString &s)
Definition: Template.h:87
CTemplate * GetRow(unsigned int uIndex)
bool PrintString(CString &sRet)
CString ExpandFile(const CString &sFilename, bool bFromInc=false)
CTemplate * GetParent(bool bRoot)
CTemplateLoopContext * GetCurLoopContext()
virtual ~CTemplateLoopContext()
Definition: Template.h:83
unsigned int GetRowIndex() const
Definition: Template.h:98
virtual ~CTemplate()