xref: /haiku/src/kits/app/TokenSpace.cpp (revision 90200dfec13f22e03b6a5572c51b8ba63c0c5bb0)
1 /*
2  * Copyright 2001-2006, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Erik Jaesler (erik@cgsoftware.com)
7  *		Axel Dörfler, axeld@pinc-software.de
8  */
9 
10 
11 #include <map>
12 #include <stack>
13 
14 #include <Autolock.h>
15 
16 #include "TokenSpace.h"
17 
18 
19 namespace BPrivate {
20 
21 BTokenSpace gDefaultTokens;
22 	// the default token space - all handlers will go into that one
23 
24 
25 BTokenSpace::BTokenSpace()
26 	:
27 	fTokenCount(1)
28 {
29 }
30 
31 
32 BTokenSpace::~BTokenSpace()
33 {
34 }
35 
36 
37 int32
38 BTokenSpace::NewToken(int16 type, void* object,
39 	new_token_callback callback)
40 {
41 	BAutolock locker(this);
42 
43 	token_info tokenInfo = { type, object };
44 	int32 token = fTokenCount++;
45 
46 	fTokenMap[token] = tokenInfo;
47 
48 	if (callback)
49 		callback(type, object);
50 
51 	return token;
52 }
53 
54 
55 /*!
56 	Inserts the specified token into the token space. If that token
57 	already exists, it will be overwritten.
58 	Don't mix NewToken() and this method unless you know what you're
59 	doing.
60 */
61 void
62 BTokenSpace::SetToken(int32 token, int16 type, void* object)
63 {
64 	BAutolock locker(this);
65 	token_info tokenInfo = { type, object };
66 
67 	fTokenMap[token] = tokenInfo;
68 
69 	// this makes sure SetToken() plays more or less nice with NewToken()
70 	if (token >= fTokenCount)
71 		fTokenCount = token + 1;
72 }
73 
74 
75 bool
76 BTokenSpace::RemoveToken(int32 token, remove_token_callback callback)
77 {
78 	BAutolock locker(this);
79 
80 	TokenMap::iterator iterator = fTokenMap.find(token);
81 	if (iterator == fTokenMap.end())
82 		return false;
83 
84 	if (callback)
85 		callback(iterator->second.type, iterator->second.object);
86 
87 	fTokenMap.erase(iterator);
88 	return true;
89 }
90 
91 
92 /*!	Checks wether or not the \a token exists with the specified
93 	\a type in the token space or not.
94 */
95 bool
96 BTokenSpace::CheckToken(int32 token, int16 type) const
97 {
98 	BAutolock locker(const_cast<BTokenSpace&>(*this));
99 
100 	TokenMap::const_iterator iterator = fTokenMap.find(token);
101 	if (iterator != fTokenMap.end() && iterator->second.type == type)
102 		return true;
103 
104 	return false;
105 }
106 
107 
108 status_t
109 BTokenSpace::GetToken(int32 token, int16 type, void** _object,
110 	get_token_callback callback) const
111 {
112 	BAutolock locker(const_cast<BTokenSpace&>(*this));
113 
114 	if (token < 1)
115 		return B_ENTRY_NOT_FOUND;
116 
117 	TokenMap::const_iterator iterator = fTokenMap.find(token);
118 
119 	if (iterator == fTokenMap.end() || iterator->second.type != type)
120 		return B_ENTRY_NOT_FOUND;
121 
122 	if (callback && !callback(iterator->second.type, iterator->second.object))
123 		return B_ENTRY_NOT_FOUND;
124 
125 	*_object = iterator->second.object;
126 	return B_OK;
127 }
128 
129 }	// namespace BPrivate
130