void unregister_intercept_flag(const String& name, char *flag) { Lock lock(s_mutex); RegisteredFlagsMap::iterator iter = s_registered_flags.find(name); if (iter != s_registered_flags.end()) { std::vector<char*> &flags = iter->second.second; for (int i = flags.size(); i--; ) { if (flag == flags[i]) { flags.erase(flags.begin() + i); break; } } } }
bool register_intercept(CStrRef name, CVarRef callback, CVarRef data) { StringIMap<Variant> &handlers = s_intercept_data->m_intercept_handlers; if (!callback.toBoolean()) { if (name.empty()) { s_intercept_data->m_global_handler.reset(); handlers.clear(); } else { handlers.erase(name); } return true; } EventHook::EnableIntercept(); Array handler = CREATE_VECTOR2(callback, data); if (name.empty()) { s_intercept_data->m_global_handler = handler; handlers.clear(); } else { handlers[name] = handler; } Lock lock(s_mutex); if (name.empty()) { for (RegisteredFlagsMap::iterator iter = s_registered_flags.begin(); iter != s_registered_flags.end(); ++iter) { flag_maybe_interrupted(iter->second); } } else { RegisteredFlagsMap::iterator iter = s_registered_flags.find(name); if (iter != s_registered_flags.end()) { flag_maybe_interrupted(iter->second); } } return true; }