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();
}
Example #2
0
  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;
  }