TemplateStream.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * TemplateStream.h
8  *
9  ****/
10 
11 #pragma once
12 
13 #include "DataSourceStream.h"
14 #include "WHashMap.h"
15 #include "WString.h"
16 
17 #ifndef TEMPLATE_MAX_VAR_NAME_LEN
22 #define TEMPLATE_MAX_VAR_NAME_LEN 32
23 #endif
24 
42 {
43 public:
48 
52  using GetValueDelegate = Delegate<String(const char* name)>;
53 
58  TemplateStream(IDataSourceStream* stream, bool owned = true)
59  : stream(stream), streamOwned(owned), doubleBraces(false)
60 
61  {
62  reset();
63  }
64 
66  {
67  if(streamOwned) {
68  delete stream;
69  }
70  }
71 
72  StreamType getStreamType() const override
73  {
74  return stream ? eSST_Template : eSST_Invalid;
75  }
76 
77  uint16_t readMemoryBlock(char* data, int bufSize) override;
78 
79  int seekFrom(int offset, SeekOrigin origin) override;
80 
81  bool isFinished() override
82  {
83  return stream ? stream->isFinished() : true;
84  }
85 
91  void setVar(const String& name, const String& value)
92  {
93  templateData[name] = value;
94  }
95 
99  void setVars(const Variables& vars)
100  {
101  templateData.setMultiple(vars);
102  }
103 
108  {
109  return templateData;
110  }
111 
112  String getName() const override
113  {
114  return stream ? stream->getName() : nullptr;
115  }
116 
122  {
123  getValueCallback = callback;
124  }
125 
130  void enableOutput(bool enable)
131  {
132  enableNextState = enable;
133  }
134 
140  bool isOutputEnabled() const
141  {
142  return outputEnabled;
143  }
144 
150  {
151  doubleBraces = enable;
152  }
153 
166  virtual String evaluate(char*& expr);
167 
174  {
175  char* p = expr.begin();
176  return evaluate(p);
177  }
178 
184  virtual String getValue(const char* name);
185 
186 private:
187  void reset()
188  {
189  value = nullptr;
190  streamPos = 0;
191  valuePos = 0;
192  valueWaitSize = 0;
193  tagLength = 0;
194  sendingValue = false;
195  outputEnabled = true;
196  enableNextState = true;
197  }
198 
199  IDataSourceStream* stream;
200  Variables templateData;
201  GetValueDelegate getValueCallback;
202  String value;
203  uint32_t streamPos;
204  uint16_t valuePos;
205  uint16_t valueWaitSize;
206  uint8_t tagLength;
207  bool streamOwned : 1;
208  bool sendingValue : 1;
209  bool outputEnabled : 1;
210  bool enableNextState : 1;
211  bool doubleBraces : 1;
212 };
SeekOrigin
Stream/file seek origins.
Definition: SeekOrigin.h:18
void setMultiple(const HashMap< K, V > &map)
Definition: WHashMap.h:389
Base class for read-only stream.
Definition: DataSourceStream.h:46
virtual bool isFinished()=0
Check if all data has been read.
virtual String getName() const
Returns name of the resource.
Definition: DataSourceStream.h:156
The String class.
Definition: WString.h:137
char * begin()
Get a modifiable pointer to String content.
Definition: WString.h:625
Stream which performs variable-value substitution on-the-fly.
Definition: TemplateStream.h:42
HashMap< String, String > Variables
Maps variable names to values.
Definition: TemplateStream.h:47
void setVars(const Variables &vars)
Set multiple variables in the template file.
Definition: TemplateStream.h:99
Variables & variables()
Get the template variables.
Definition: TemplateStream.h:107
void setVar(const String &name, const String &value)
Set value of a variable in the template file.
Definition: TemplateStream.h:91
int seekFrom(int offset, SeekOrigin origin) override
Change position in stream.
void enableOutput(bool enable)
During processing applications may suppress output of certain sections by calling this method from wi...
Definition: TemplateStream.h:130
StreamType getStreamType() const override
Get the stream type.
Definition: TemplateStream.h:72
Delegate< String(const char *name)> GetValueDelegate
Callback type to return calculated or externally stored values.
Definition: TemplateStream.h:52
TemplateStream(IDataSourceStream *stream, bool owned=true)
Create a template stream.
Definition: TemplateStream.h:58
uint16_t readMemoryBlock(char *data, int bufSize) override
Read a block of memory.
String getName() const override
Returns name of the resource.
Definition: TemplateStream.h:112
~TemplateStream()
Definition: TemplateStream.h:65
String eval(String expr)
Evaluate an expression in-situ.
Definition: TemplateStream.h:173
void setDoubleBraces(bool enable)
Use two braces {{X}} to mark tags.
Definition: TemplateStream.h:149
virtual String getValue(const char *name)
Fetch a templated value.
bool isFinished() override
Check if all data has been read.
Definition: TemplateStream.h:81
bool isOutputEnabled() const
Determine if stream output is active.
Definition: TemplateStream.h:140
virtual String evaluate(char *&expr)
Evaluate a template expression.
void onGetValue(GetValueDelegate callback)
Set a callback to obtain variable values.
Definition: TemplateStream.h:121
StreamType
Data stream type.
Definition: DataSourceStream.h:25
@ eSST_Template
Template data stream.
Definition: DataSourceStream.h:31
@ eSST_Invalid
Stream content not valid.
Definition: DataSourceStream.h:26
void enable(Handler &commandHandler, HardwareSerial &serial)