void MinionRadioHandler::handle() {
    MinionRadioMessage* msg = radio->receive();
    if (msg == NULL) return;
    if (msg->minionId == minionId || msg->minionId == MinionRadioMessageType.BROADCAST_ID) {
        switch (msg->messageType) {
            case MinionRadioMessageType.NEW_MINION_REQ: {
                newMinionRequest(*msg);
                break;
			}
            case MinionRadioMessageType.UPD_MINION_ID_REQ: {
                updateMinionIdRequest(*msg);
                break;
			}
            case MinionRadioMessageType.PING_REQ: {
                pingRequest(*msg);
                break;
			}
            case MinionRadioMessageType.INFO_REQ: {
                infoRequest(*msg);
                break;
			}
            case MinionRadioMessageType.TURN_OFF_REQ: {
                turnOffRequest(*msg);
                break;
			}
            case MinionRadioMessageType.TURN_ON_REQ: {
                turnOnRequest(*msg);
                break;
			}
            case MinionRadioMessageType.STATUS_REQ: {
                statusRequest(*msg);
                break;
			}
            case MinionRadioMessageType.SET_OFF_TIME_REQ: {
                scheduleOffTimeRequest(*msg);
                break;
			}
            case MinionRadioMessageType.SET_ON_TIME_REQ: {
                scheduleOnTimeRequest(*msg);
                break;
			}
            case MinionRadioMessageType.CLR_SCHED_TIME_REQ: {
                clearScheduledTimesRequest(*msg);
                break;
			}
            default: {
				if (msg->messageType > MinionRadioMessageType.MAX_UNIVERSAL_TYPE) {
					otherMessage(*msg);
				}
                break;
			}
        }
    }
    delete msg;
}
OsStatus SipRedirectorPresenceRouting::pingOpenfire( void )
{
    OsStatus rc = OS_FAILED;
    UtlString presenceMonitorUrlAsString = mLocalPresenceMonitorServerUrl.toString();
    XmlRpcRequest pingRequest( mOpenFirePresenceServerUrl, PING_METHOD );
    pingRequest.addParam( &mLogName );
    XmlRpcResponse pingResponse;
    if( pingRequest.execute( pingResponse ) == true )
    {
       UtlContainable* pValue = NULL;
       if ( !pingResponse.getResponse( pValue ) || !pValue )
       {
          OsSysLog::add(FAC_NAT, PRI_CRIT, "SipRedirectorPresenceRouting::pingOpenfire response had no result.");
       }
       else
       {
          UtlString keyName;
          UtlHashMap* pMap = dynamic_cast<UtlHashMap*>( pValue );
          if ( !pMap )
          {
             OsSysLog::add(FAC_NAT, PRI_ERR,
                           "SipRedirectorPresenceRouting::pingOpenfire response result had unexpected type: %s",
                           pValue->getContainableType() );
          }
          else
          {
             // extract status code and check it.
             keyName = STATUS_CODE;
             UtlString* pStatusCode = dynamic_cast<UtlString*>( pMap->findValue( &keyName ) );
             if( pStatusCode->compareTo( STATUS_CODE_VALUE_OK, UtlString::ignoreCase ) == 0 )
             {
                keyName = INSTANCE_HANDLE;
                UtlString* pInstanceHandle = dynamic_cast<UtlString*>( pMap->findValue( &keyName ) );
                if( pInstanceHandle )
                {
                   if( mOpenfireInstanceHandle.compareTo( NIL_INSTANCE_HANDLE_VALUE ) == 0 )
                   {
                      // This is the first instance handle we get from openfire, save it
                      mOpenfireInstanceHandle = *pInstanceHandle;
                      rc = OS_SUCCESS;
                   }
                   else
                   {
                      // check if the openfire handle we received matches the one we have on record
                      if( mOpenfireInstanceHandle.compareTo( *pInstanceHandle ) == 0 )
                      {
                         // there is a match; everything is fine.
                         rc = OS_SUCCESS;
                      }
                      else
                      {
                         // mistmatch - likely caused by openfire resetting behind our back.
                         // fail the ping to cause a re-register with openfire
                         mOpenfireInstanceHandle = *pInstanceHandle;
                         rc = OS_FAILED; // rc already set to OS_FAILED; added for readability
                      }
                   }
                }
             }
          }
       }
    }
    return rc;
}