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