1 /*
2  * This file is part of the Code::Blocks IDE and licensed under the GNU Lesser General Public License, version 3
3  * http://www.gnu.org/licenses/lgpl-3.0.html
4  *
5  * $Revision: 9426 $
6  * $Id: projectloader_hooks.cpp 9426 2013-11-02 19:42:20Z alpha0010 $
7  * $HeadURL: svn://svn.code.sf.net/p/codeblocks/code/branches/release-20.xx/src/sdk/projectloader_hooks.cpp $
8  */
9 
10 #include "sdk_precomp.h"
11 
12 #ifndef CB_PRECOMP
13     #include "cbproject.h"
14 #endif
15 
16 #include "projectloader_hooks.h"
17 #include "tinyxml.h"
18 
19 #include <map>
20 
21 namespace ProjectLoaderHooks
22 {
23     typedef std::map<int, HookFunctorBase*> HookFunctorsMap;
24     static HookFunctorsMap s_HookFunctorsMap;
25     static int             s_UniqueID = 0;
26 }
27 
RegisterHook(ProjectLoaderHooks::HookFunctorBase * functor)28 int ProjectLoaderHooks::RegisterHook(ProjectLoaderHooks::HookFunctorBase* functor)
29 {
30     for (HookFunctorsMap::iterator it = s_HookFunctorsMap.begin(); it != s_HookFunctorsMap.end(); ++it)
31     {
32         if (it->second == functor)
33             return it->first;
34     }
35     s_HookFunctorsMap[s_UniqueID] = functor;
36     return s_UniqueID++;
37 }
38 
UnregisterHook(int id,bool deleteHook)39 ProjectLoaderHooks::HookFunctorBase* ProjectLoaderHooks::UnregisterHook(int id, bool deleteHook)
40 {
41     HookFunctorsMap::iterator it = s_HookFunctorsMap.find(id);
42     if (it != s_HookFunctorsMap.end())
43     {
44         ProjectLoaderHooks::HookFunctorBase* functor = it->second;
45         s_HookFunctorsMap.erase(it);
46         if (deleteHook)
47         {
48             delete functor;
49             return nullptr;
50         }
51         return functor;
52     }
53     return nullptr;
54 }
55 
HasRegisteredHooks()56 bool ProjectLoaderHooks::HasRegisteredHooks()
57 {
58     return s_HookFunctorsMap.size() != 0;
59 }
60 
CallHooks(cbProject * project,TiXmlElement * elem,bool isLoading)61 void ProjectLoaderHooks::CallHooks(cbProject* project, TiXmlElement* elem, bool isLoading)
62 {
63     for (HookFunctorsMap::iterator it = s_HookFunctorsMap.begin(); it != s_HookFunctorsMap.end(); ++it)
64     {
65         ProjectLoaderHooks::HookFunctorBase* functor = it->second;
66         if (functor)
67             functor->Call(project, elem, isLoading);
68     }
69 }
70