plug and play messages are supposed to make it to any visible standard orbiter after a timeout:
from PnpQueue.cpp
801 LoggerWrapper::GetInstance()->Write(LV_STATUS,"PnpQueue::Process_Detect_Stage_Prompting_User_For_DT queue %d multiple choices",
802 pPnpQueueEntry->m_pRow_PnpQueue->PK_PnpQueue_get());
803 #endif
804 DCE::SCREEN_NewPnpDevice_DL SCREEN_NewPnpDevice_DL(m_pPlug_And_Play_Plugin->m_dwPK_Device, pPnpQueueEntry->m_sPK_Orbiter_List_For_Prompts, GetDescription(pPnpQueueEntry), pPnpQueueEntry->m_pRow_PnpQueue->PK_PnpQueue_get(),interuptOnlyAudio,false,true);
805 m_pPlug_And_Play_Plugin->SendCommand(SCREEN_NewPnpDevice_DL);
806 return false; // Now we wait
807 }
from PnpQueue.h:
class OH_Orbiter *m_pOH_Orbiter_Active; // The Orbiter to use for displaying messages
This is a struct that is borrowed from Orbiter_Plugin, a little bit of a scan, reveals in Plug_and_Play.cpp:
//<-dceag-c700-b->
245
246 /** @brief COMMAND: #700 - Choose Pnp Device Template */
247 /** We have chosen a new pnp device template */
248 /** @param #57 PK_Room */
249 /** The room this is in. 0 if not known */
250 /** @param #150 PK_DHCPDevice */
251 /** The template for the device */
252 /** @param #224 PK_PnpQueue */
253 /** The queue entry we're selecting for */
254
255 void Plug_And_Play_Plugin::CMD_Choose_Pnp_Device_Template(int iPK_Room,int iPK_DHCPDevice,int iPK_PnpQueue,string &sCMD_Result,Message *pMessage)
256 //<-dceag-c700-e->
257 {
258 PLUTO_SAFETY_LOCK(pnp,m_PnpMutex);
259 PnpQueueEntry *pPnpQueueEntry = m_pPnpQueue->m_mapPnpQueueEntry_Find(iPK_PnpQueue);
260 if( !pPnpQueueEntry )
261 {
262 LoggerWrapper::GetInstance()->Write(LV_CRITICAL, "PnpQueue::PickDeviceTemplate queue %d is invalid", iPK_PnpQueue);
263 return;
264 }
265
266 pPnpQueueEntry->m_pOH_Orbiter_Active_set(pMessage->m_dwPK_Device_From);
267 LoggerWrapper::GetInstance()->Write(LV_STATUS,"Plug_And_Play_Plugin::CMD_Choose_Pnp_Device_Template queue %d set to orbiter %p/%d",
268 pPnpQueueEntry->m_pRow_PnpQueue->PK_PnpQueue_get(), pPnpQueueEntry->m_pOH_Orbiter_Active_get(), pMessage->m_dwPK_Device_From);
269 pPnpQueueEntry->m_EBlockedState=PnpQueueEntry::pnpqe_blocked_none;
270 if( iPK_DHCPDevice )
271 {
272 pPnpQueueEntry->m_iPK_DHCPDevice = iPK_DHCPDevice;
273 DCE::CMD_Remove_Screen_From_History_DL CMD_Remove_Screen_From_History_DL(
274 m_dwPK_Device, m_pOrbiter_Plugin->m_sPK_Device_AllOrbiters, StringUtils::itos(pPnpQueueEntry->m_pRow_PnpQueue->PK_PnpQueue_get()), SCREEN_NewPnpDevice_CONST);
275 DCE::CMD_Remove_Screen_From_History_DL CMD_Remove_Screen_From_History_DL2(
276 m_dwPK_Device, m_pOrbiter_Plugin->m_sPK_Device_AllOrbiters, StringUtils::itos(pPnpQueueEntry->m_pRow_PnpQueue->PK_PnpQueue_get()), SCREEN_New_Pnp_Device_One_Possibility_CONST);
277 CMD_Remove_Screen_From_History_DL.m_pMessage->m_vectExtraMessages.push_back(CMD_Remove_Screen_From_History_DL2.m_pMessage);
278 SendCommand(CMD_Remove_Screen_From_History_DL);
279 }
280 if( iPK_Room )
281 pPnpQueueEntry->m_iPK_Room = iPK_Room;
282 pthread_cond_broadcast( &m_PnpCond );
283 }
If you keep looking, you'll find code that m_bUseAllOrbiters gets set periodically, if the initial device_from being sent to doesn't respond quickly enough. This is done with each scanning of the pnpqueue entry. I leave this as an exercise for the reader to figure out where this is.
if( pPnpQueueEntry->m_EBlockedState==PnpQueueEntry::pnpqe_blocked_prompting_options )
pPnpQueueEntry->UseAllOrbitersForPrompt(); // The user isn't responding. Ask on all orbiters
Which is parsed by PnpQueueEntry, to become:
void PnpQueueEntry::UseAllOrbitersForPrompt()
{
m_bUseAllOrbitersForPrompt=true;
m_sPK_Orbiter_List_For_Prompts=m_pPlug_And_Play_Plugin->m_pOrbiter_Plugin_get()->m_sPK_Device_AllOrbiters_get();
#ifdef DEBUG
LoggerWrapper::GetInstance()->Write(LV_STATUS, "PnpQueueEntry::UseAllOrbitersForPrompt queue %d",
m_pRow_PnpQueue->PK_PnpQueue_get());
#endif
}
Seriously guys,
STOP JUST BLIND ASS GUESSING, AND ACTUALLY LOOK AT OUR CODE!
-Thom