| 217 | } |
| 218 | |
| 219 | void KernelCallback::UnregisterWithKernel(int eventID) |
| 220 | { |
| 221 | if (m_Registered[eventID] != true) |
| 222 | { |
| 223 | return ; |
| 224 | } |
| 225 | |
| 226 | m_Registered[eventID] = false ; |
| 227 | |
| 228 | std::ostringstream buffer; |
| 229 | buffer << "id_0x" << this << "_evt_" << eventID; |
| 230 | std::string callbackID = buffer.str() ; |
| 231 | |
| 232 | agent* pAgent = m_pCallbackAgentSML->GetSoarAgent() ; |
| 233 | |
| 234 | if (eventID != smlEVENT_BEFORE_PHASE_EXECUTED && eventID != smlEVENT_AFTER_PHASE_EXECUTED) |
| 235 | { |
| 236 | SOAR_CALLBACK_TYPE callbackType = SOAR_CALLBACK_TYPE(GetCallbackFromEventID(eventID)); |
| 237 | soar_remove_callback(pAgent, callbackType, callbackID.c_str()) ; |
| 238 | } |
| 239 | else |
| 240 | { |
| 241 | // BEFORE_PHASE and AFTER_PHASE are implemented by listening for all lower level phase events |
| 242 | int beforePhaseEvents[] = { smlEVENT_BEFORE_INPUT_PHASE, smlEVENT_BEFORE_PROPOSE_PHASE, smlEVENT_BEFORE_DECISION_PHASE, smlEVENT_BEFORE_APPLY_PHASE, smlEVENT_BEFORE_OUTPUT_PHASE, smlEVENT_BEFORE_PREFERENCE_PHASE, smlEVENT_BEFORE_WM_PHASE } ; |
| 243 | int afterPhaseEvents[] = { smlEVENT_AFTER_INPUT_PHASE, smlEVENT_AFTER_PROPOSE_PHASE, smlEVENT_AFTER_DECISION_PHASE, smlEVENT_AFTER_APPLY_PHASE, smlEVENT_AFTER_OUTPUT_PHASE, smlEVENT_AFTER_PREFERENCE_PHASE, smlEVENT_AFTER_WM_PHASE } ; |
| 244 | |
| 245 | int* events = (eventID == smlEVENT_BEFORE_PHASE_EXECUTED) ? beforePhaseEvents : afterPhaseEvents ; |
| 246 | |
| 247 | for (int i = 0 ; i < 7 ; i++) |
| 248 | { |
| 249 | int phaseEvent = events[i] ; |
| 250 | SOAR_CALLBACK_TYPE callbackType = SOAR_CALLBACK_TYPE(GetCallbackFromEventID(phaseEvent)) ; |
| 251 | soar_remove_callback(pAgent, callbackType, callbackID.c_str()) ; |
| 252 | } |
| 253 | } |
| 254 | } |
| 255 |
no test coverage detected