xref: /haiku/src/kits/app/TokenSpace.cpp (revision fef6144999c2fa611f59ee6ffe6dd7999501385c)
1 /*
2  * Copyright 2001-2005, 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 one and only token space object per team
23 
24 
25 BTokenSpace::BTokenSpace()
26 {
27 }
28 
29 
30 BTokenSpace::~BTokenSpace()
31 {
32 }
33 
34 
35 int32
36 BTokenSpace::NewToken(int16 type, void* object,
37 	new_token_callback callback)
38 {
39 	BAutolock locker(this);
40 
41 	TTokenInfo tokenInfo = { type, object };
42 	int32 token;
43 
44 	if (fTokenBin.empty()) {
45 		token = fTokenCount;
46 		++fTokenCount;
47 	} else {
48 		token = fTokenBin.top();
49 		fTokenBin.pop();
50 	}
51 
52 	fTokenMap[token] = tokenInfo;
53 
54 	if (callback)
55 		callback(type, object);
56 
57 	return token;
58 }
59 
60 
61 bool
62 BTokenSpace::RemoveToken(int32 token, remove_token_callback callback)
63 {
64 	BAutolock locker(this);
65 
66 	TTokenMap::iterator iter = fTokenMap.find(token);
67 	if (iter == fTokenMap.end())
68 		return false;
69 
70 	if (callback)
71 		callback(iter->second.type, iter->second.object);
72 
73 	fTokenMap.erase(iter);
74 	fTokenBin.push(token);
75 
76 	return true;
77 }
78 
79 
80 /**	Checks wether or not the \a token exists with the specified
81  *	\a type in the token space or not.
82  */
83 
84 bool
85 BTokenSpace::CheckToken(int32 token, int16 type) const
86 {
87 	BAutolock locker(const_cast<BTokenSpace&>(*this));
88 
89 	TTokenMap::const_iterator iter = fTokenMap.find(token);
90 	if (iter != fTokenMap.end() && iter->second.type == type)
91 		return true;
92 
93 	return false;
94 }
95 
96 
97 status_t
98 BTokenSpace::GetToken(int32 token, int16 type, void** object,
99 	get_token_callback callback) const
100 {
101 	BAutolock locker(const_cast<BTokenSpace&>(*this));
102 
103 	TTokenMap::const_iterator iter = fTokenMap.find(token);
104 	if (iter == fTokenMap.end() || iter->second.type != type) {
105 		*object = NULL;
106 		return B_ERROR;
107 	}
108 
109 	if (callback && !callback(iter->second.type, iter->second.object)) {
110 		*object = NULL;
111 		return B_ERROR;
112 	}
113 
114 	*object = iter->second.object;
115 
116 	return B_OK;
117 }
118 
119 
120 status_t
121 BTokenSpace::GetList(int32*& tokens, int32& count) const
122 {
123 	BAutolock locker(const_cast<BTokenSpace&>(*this));
124 
125 	count = fTokenMap.size();
126 	tokens = (int32*)malloc(count * sizeof(int32));
127 	if (tokens == NULL)
128 		return B_NO_MEMORY;
129 
130 	TTokenMap::const_iterator iterator = fTokenMap.begin();
131 	for (int32 i = 0; iterator != fTokenMap.end(); i++) {
132 		tokens[i] = iterator->first;
133 		iterator++;
134 	}
135 
136 	return B_OK;
137 }
138 
139 }	// namespace BPrivate
140