Add minimalistic protected-headers support
[gpgol.git] / src / dispcache.cpp
1 /* Copyright (C) 2018 Intevation GmbH
2  *
3  * This file is part of GpgOL.
4  *
5  * GpgOL is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * GpgOL is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this program; if not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "dispcache.h"
20 #include "gpg-error.h"
21
22 #include "common.h"
23 #include "gpgoladdin.h"
24
25 #include <unordered_map>
26
27 GPGRT_LOCK_DEFINE (cache_lock);
28
29 class DispCache::Private
30 {
31 public:
32   Private()
33     {
34
35     }
36
37   void addDisp (int id, LPDISPATCH obj)
38    {
39      if (!id || !obj)
40        {
41          TRACEPOINT;
42          return;
43        }
44      gpgol_lock (&cache_lock);
45      auto it = m_cache.find (id);
46      if (it != m_cache.end ())
47        {
48          log_debug ("%s:%s Item \"%i\" already cached. Replacing it.",
49                     SRCNAME, __func__, id);
50          gpgol_release (it->second);
51          it->second = obj;
52          gpgol_unlock (&cache_lock);
53          return;
54        }
55      m_cache.insert (std::make_pair (id, obj));
56      gpgol_unlock (&cache_lock);
57      return;
58    }
59
60   LPDISPATCH getDisp (int id)
61     {
62       if (!id)
63         {
64           TRACEPOINT;
65           return nullptr;
66         }
67       gpgol_lock (&cache_lock);
68
69       const auto it = m_cache.find (id);
70       if (it != m_cache.end())
71         {
72           LPDISPATCH ret = it->second;
73           gpgol_unlock (&cache_lock);
74           return ret;
75         }
76       gpgol_unlock (&cache_lock);
77       return nullptr;
78     }
79
80   ~Private ()
81     {
82       gpgol_lock (&cache_lock);
83       for (const auto it: m_cache)
84         {
85           gpgol_release (it.second);
86         }
87       gpgol_unlock (&cache_lock);
88     }
89
90 private:
91   std::unordered_map<int, LPDISPATCH> m_cache;
92 };
93
94 DispCache::DispCache (): d (new Private)
95 {
96 }
97
98 void
99 DispCache::addDisp (int id, LPDISPATCH obj)
100 {
101   d->addDisp (id, obj);
102 }
103
104 LPDISPATCH
105 DispCache::getDisp (int id)
106 {
107   return d->getDisp (id);
108 }
109
110 DispCache *
111 DispCache::instance ()
112 {
113   return GpgolAddin::get_instance ()->get_dispcache ().get ();
114 }