MManager.h
1 /*****************************************************************************
2 **
3 ** Header file for Virtual Vertex Template manager class
4 **
5 ** Name : MManager.h
6 ** Author : Leonardo Bernardini
7 ** Version : Alpha 9.0 Wed May 17th 2017
8 **
9 ** Copyright 2000-2017, Virtual Vertex
10 ** All Rights Reserved.
11 **
12 ** This file contains UNPUBLISHED PROPRIETARY SOURCE CODE.
13 ** The contents of this file may not be disclosed to third parties, copied
14 ** or duplicated in any form, in whole or in part, without the prior written
15 ** permission of the author.
16 **
17 *****************************************************************************/
18 #ifndef MMANAGER_H
19 #define MMANAGER_H
20 
21 #ifdef WIN32
22 // Windows definitions
23 #ifdef MTEMPLATE_EXPORTS
24 #define MTEMPLATE_API __declspec(dllexport)
25 #else
26 #define MTEMPLATE_API __declspec(dllimport)
27 #endif
28 #else
29 
30 #ifndef MTEMPLATE_EXPORTS
31 #ifdef LINUX
32 #define MTEMPLATE_API
33 #else
34 #define MTEMPLATE_API
35 #endif
36 #else
37 #define MTEMPLATE_API
38 #endif
39 
40 #endif
41 
42 #ifdef WIN32
43 #define MThread uintptr_t
44 #else
45 #define MThread pthread_t
46 #endif
47 
48 #include "MClientLib/MProcess.h"
49 #include "MClientLib/MStringRef.h"
50 #include "MClientLib/MJob.h"
51 
52 #include <list>
53 
54 // Disable STL Export warning
55 #if defined(_WIN32)
56 #pragma warning(disable: 4251)
57 #endif // _WIN32
58 
59 namespace MTemplateEngine {
60 
79  } ;
80 
87  } ;
88 
92  {
96  };
97 
103  } ;
104 
107  class MTemplate;
108 
126  class MTEMPLATE_API MTemplateHash
127  {
128  private:
129  int uid;
130  std::string md5hash;
131  std::string filename;
132  public:
133  MTemplateHash(void);
134  ~MTemplateHash(void);
135  int getUid();
136  std::string getMd5Hash();
137  std::string getFilename();
139  void setUid(int _uid);
140  void setMd5Hash(std::string _hash);
141  void setFilename(std::string _filename);
142 
143  };
144 
153  class MTEMPLATE_API MIconHash
154  {
155  private:
156  std::string md5hash;
157  std::string filename;
158  public:
159  MIconHash(void);
160  ~MIconHash(void);
161  std::string getMd5Hash();
162  std::string getFilename();
164  void setMd5Hash(std::string _hash);
165  void setFilename(std::string _filename);
166 
167  };
168 
169  typedef std::map<std::string, MIconHash*> iconsHashesMap;
170  typedef std::map<int,MTemplateHash*> templatesHashesMap;
171  typedef std::map<int,MTemplate*> templatesMap;
172  typedef std::set<std::string> iconsSet;
173  typedef void (*redirectionFuncPtr)(const char*,const char*);
185  class MTEMPLATE_API MManager
186  {
187 
188  public:
189  MManager();
190  ~MManager();
191  public:
192  static MManager* getUniqueClass(bool allocNewClass = true);
193  static void destroyUniqueClass(void);
194  static MManager* allocateClass(void);
195  static void destroyClass(MManager*);
196  static void setIsMacBundle(bool isMacBundle);
197  static void setPythonPath(const std::string& _pythonPath);
198  static std::string getPythonPath();
199  static std::string getInterpreterModuleName();
200  static void initializePythonPath(bool showPath=false, std::string moduleName=std::string());
202  bool normalizeTemplatesDirectories(const std::string& basePath, std::string& versionsFilePath, std::string& macroFilePath, std::string& environmentsFilePath, std::string& logParserFilePath);
203  bool loadTemplateFromFile(const std::string& filePath, const std::string& basePath, const std::string& baseName, const std::string& versionsFilePath, const std::string& macroFilePath, const std::string& environmentsFilePath, const std::string& logParserFilePath, bool moveToInvalidFolders, bool& moved, std::string& err);
204  bool saveTemplateToFile(const std::string& filePath, const std::string& baseName, const std::string& basePath, const std::string& versionsFilePath, const std::string& macroFilePath, const std::string& environmentsFilePath, const std::string& logParserFilePath, MTemplate* templateClass);
205  bool loadVersionsFromFile(MTemplate* t,const std::string& filePath);
206  bool loadMacrosFromFile(MTemplate* t,const std::string& filePath);
207  bool loadEnvironmentsFromFile(MTemplate* t, const std::string& filePath);
208  bool loadParserFromFile(MTemplate* t,const std::string& filePath);
209  bool loadVersionsFromBuffer(MTemplate* t, const std::string& buffer);
210  bool loadMacrosFromBuffer(MTemplate* t, const std::string& buffer);
211  bool loadEnvironmentsFromBuffer(MTemplate* t, const std::string& buffer);
212  bool loadParserFromBuffer(MTemplate* t, const std::string& buffer);
213  bool saveVersionsToFile(MTemplate* t, const std::string& filePath);
214  bool saveMacrosToFile(MTemplate* t, const std::string& filePath);
215  bool saveEnvironmentsToFile(MTemplate* t, const std::string& filePath);
216  bool saveParserToFile(MTemplate* t, const std::string& filePath);
217  bool saveVersionsToBuffer(MTemplate* t, std::string& buffer);
218  bool saveEnvironmentsToBuffer(MTemplate* t, std::string& buffer);
219  bool saveMacrosToBuffer(MTemplate* t, std::string& buffer);
220  bool saveParserToBuffer(MTemplate* t, std::string& buffer);
221  std::string encodeTemplate(MTemplate *t);
222  bool decodeTemplate(const std::string& content, int& id, std::string& md5Hash, std::string& filename, std::string& templateBuffer,
223  std::string& versionsBuffer, std::string& macrosBuffer, std::string& environmentsBuffer, std::string& parserBuffer);
225  bool installTemplate(MTemplate* templateClass);
226  MTemplate* getFirstTemplate();
227  MTemplate* getNextTemplate(int previous_uid);
228  std::string resolveMappingToJob(int template_id, const char* key) ;
229  std::string resolveMappingToTemplate(int template_id, const char* key) ;
231  void Lock(void);
232  void Unlock(void);
233  void acquirePython(void);
234  void releasePython(void);
235  std::string getPyExceptionStr();
236  bool runPythonFile(const char* path,MClientLib::MStringRef& _err);
237  bool runPythonString(const char* buffer,const char* sourceFile,MClientLib::MStringRef& _err);
239  void registerPythonOutputCallbacks(redirectionFuncPtr, redirectionFuncPtr);
240  void onPythonStdout(const char* out);
241  void onPythonStderr(const char* out);
242  void onPythonStderrFlush();
243  void onPythonStdoutFlush();
245  bool _installPyTemplate(void* templateClass);
246  MClientLib::MJob* getExpressionJob();
247  MClientLib::MChunk* getExpressionChunk();
248  void setExpressionJob(MClientLib::MJob*);
249  void setExpressionChunk(MClientLib::MChunk*);
250  void setExpressionOut(std::string);
251  std::string getExpressionOut();
252  std::string EvaluatePython(const std::string& in, MClientLib::MJob*, MClientLib::MChunk* c);
253  std::string ResolveInlinePython(const std::string& in, MClientLib::MJob*j, MClientLib::MChunk* c);
254  std::string NormalizeToken(const std::string& in);
255  void AddStringToEnvironment(const std::string& in, MClientLib::MEnvironment* env, MClientLib::MJob* j, MClientLib::MChunk* c);
258  void clear(void);
259  void flushGC(void);
260  void addTemplateToGC(MTemplate* t);
262  void copyFrom(MManager*);
263  MTemplate* parsePython(const char* template_buf,const char* template_filename,bool _recache,MClientLib::MStringRef& err, bool store=true);
264  MTemplate* getTemplate(const char* name);
265  MTemplate* getTemplateByFilename(const char* filename);
266  MTemplate* getTemplate(int id);
267  MTemplate* getTemplateAt(int num);
268  void unloadTemplate(int id);
269  int getTemplatesCount();
270  int getNextFreeUID();
271  void deallocateTemplate(MTemplate* t);
272  void calculateMD5(MTemplate* t);
273  templatesHashesMap* getInternalHashesMap();
274  void fillInternalHashesMap();
275  std::string marshallHashesMap(templatesHashesMap*);
276  void unmarshallHashesMap(templatesHashesMap*, const char*);
277  void makeHashesMap(templatesHashesMap*);
278  void calculateHashesDiffs(templatesHashesMap* remote, templatesHashesMap* out_of_date, templatesHashesMap* invalid);
279  void deleteHashesMap(templatesHashesMap*);
281  std::string calculateIconMD5(const std::string& iconPath);
282  iconsHashesMap* getIconsHashesMap();
283  void fillIconsHashesMap(const std::string& iconPath);
284  std::string marshallIconsHashesMap(iconsHashesMap*);
285  void unmarshallIconsHashesMap(iconsHashesMap*, const char*);
286  void makeIconsHashesMap(iconsHashesMap*, const std::string& iconPath);
287  void calculateIconsHashesDiffs(iconsHashesMap* remote, iconsHashesMap* out_of_date, iconsHashesMap* invalid);
288  void deleteIconsHashesMap(iconsHashesMap*);
290  void addIcon(const std::string& iconFile);
291  void removeIcon(const std::string& iconFile);
292  void clearIcons();
293 
294  void sortListByField(const std::string& field, std::list<MTemplate*>* list);
295  bool validateJobSubmission(MClientLib::MJob& job, MClientLib::MStringRef& err);
296  std::set<int> getTemplatesID();
297  MClientLib::MTextFileMarker checkForLineParsingOverrides(MClientLib::MJob* job, MClientLib::MChunk* chunk, const char* line, int lineNum);
299  private:
300  void updateTemplateHash(MTemplate* t);
301  void* _mutex;
302  templatesMap list;
303  iconsSet icons_set;
304  iconsHashesMap icons_hash_map;
305  templatesHashesMap hash_map;
306  static MManager* _unique_class;
307  static bool _isMacBundle;
308  static bool pythonFromHere;
309  static std::map<MThread,void*> threadStates;
310  static void* mainThreadState;
311  static MThread mainThread;
312  static void* m_PyFormatException;
313  static void* m_pMainModule;
314  static void* m_pMainDict;
315  static std::string pythonPath;
316  static std::string interpreterModuleName;
317  static std::list<MTemplate*> gc;
318  std::string expressionOut;
319  MClientLib::MJob* expressionJob;
320  MClientLib::MChunk* expressionChunk;
321  redirectionFuncPtr stdoutCallback;
322  redirectionFuncPtr stderrCallback;
323  std::string callbackContext;
324 
325  MTemplate* lastInstalledTemplate;
326 
328  struct sortFunctor {
329  const std::string field;
330  sortFunctor(const std::string& field) : field(field) {}
331  bool operator()(MTemplate* a,MTemplate* b);
332  };
334  };
335 
337 };
338 
339 #endif
Class holding data to an unique template file.
Definition: MManager.h:126
kTemplateScanSearchSystem
Definition: MManager.h:91
kTemplatesPythonOutputRedirection
Definition: MManager.h:99
kTemplatesProcessDetection
Definition: MManager.h:83
std::map< int, MTemplate * > templatesMap
Definition: MManager.h:171
Class holding the unique templates manager class singleton.
Definition: MManager.h:185
std::map< int, MTemplateHash * > templatesHashesMap
Definition: MManager.h:170
std::set< std::string > iconsSet
Definition: MManager.h:172
std::map< std::string, MIconHash * > iconsHashesMap
Definition: MManager.h:169
Class holding a string used across the API.
Definition: MStringRef.h:60
Class holding a chunk data.
Definition: MChunk.h:64
Class holding a job data structure.
Definition: MJob.h:130
Class holding MD5 hasing of a template icon file.
Definition: MManager.h:153
void(* redirectionFuncPtr)(const char *, const char *)
Definition: MManager.h:173
Class holding a chunk data.