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