bool UNavServicesDialogs::LCustomFileDesignator::AskDesignateFile(ConstStringPtr inDefaultName, ESaveFormat& ioSaveFormat) { StNavEventUPP eventUPP(NavCustomEventProc); CNavCustomPutFileCallbackData callbackData(kCustomSaveFilePanelSize, kCustomSaveFilePanelDITLResID, ioSaveFormat); LString::CopyPStr(inDefaultName, mNavOptions.savedFileName); mNavReply.SetDefaultValues(); AEDesc* defaultLocationDesc = nil; if (not mDefaultLocation.IsNull()) { defaultLocationDesc = mDefaultLocation; if (mSelectDefault) { mNavOptions.dialogOptionFlags |= kNavSelectDefaultLocation; } else { mNavOptions.dialogOptionFlags &= ~kNavSelectDefaultLocation; } } UDesktop::Deactivate(); OSErr err = ::NavPutFile( defaultLocationDesc, mNavReply, &mNavOptions, eventUPP, mFileType, mFileCreator, &callbackData); UDesktop::Activate(); if ( (err != noErr) && (err != userCanceledErr) ) { Throw_(err); } ioSaveFormat = callbackData.GetSaveFormat(); return mNavReply.IsValid(); }
bool Beacon::Run(const list<SockAddr> &controlPorts, const list<IpAddr> &listenAddrs) { if (m_scheduler != NULL) { gLog.LogError("Can not call Beacon::Run twice. Aborting."); return false; } if (controlPorts.empty()) { gLog.LogError("At least one control port is required. Aborting."); return false; } RaiiNullBase<CommandProcessorList, closeCommandProcessorList> commandProcessors(new CommandProcessorList); for (list<SockAddr>::const_iterator it = controlPorts.begin(); it != controlPorts.end(); ++it) { CommandProcessor *processor = MakeCommandProcessor(*this); commandProcessors->push_back(processor); if (!processor->BeginListening(*it)) { gLog.LogError("Failed to start command processing thread on %s. Aborting.", it->ToString()); return false; } } #ifdef USE_KEVENT_SCHEDULER m_scheduler = new KeventScheduler(); #else m_scheduler = new SelectScheduler(); #endif m_packet.AllocBuffers(bfd::MaxPacketSize, Socket::GetMaxControlSizeReceiveDestinationAddress() + Socket::GetMaxControlSizeRecieveTTLOrHops() + +8 /*just in case*/); // We use this "signal channel" to communicate back to ourself in the Scheduler // thread. if (!m_scheduler->CreateSignalChannel(&m_selfSignalId, handleSelfMessageCallback, this)) { gLog.LogError("Failed to create self signal handling. Aborting."); return false; } RaiiNullBase<ListenCallbackDataList, closeListenCallbackDataList> callbackData(new ListenCallbackDataList); for (list<IpAddr>::const_iterator it = listenAddrs.begin(); it != listenAddrs.end(); ++it) { ListenCallbackData *data = new ListenCallbackData; data->beacon = this; callbackData->push_back(data); makeListenSocket(*it, data->socket); if (data->socket.empty()) { gLog.LogError("Failed to create listen socket for %s on BFD port %hd.", it->ToString(), bfd::ListenPort); return false; } if (!m_scheduler->SetSocketCallback(data->socket, handleListenSocketCallback, data)) { gLog.LogError("Failed to set m_scheduler socket processing for %s. Aborting.", it->ToString()); return false; } } bool returnVal = false; if (!m_scheduler->Run()) gLog.LogError("Failed to start m_scheduler. Aborting."); else returnVal = true; commandProcessors.Dispose(); // In theory we should not be using m_scheduler except on the scheduler // callbacks, which end when Scheduler::Run() ends Scheduler *oldScheduler = m_scheduler; m_scheduler = NULL; delete oldScheduler; return returnVal; }