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