/* context here is of type USERDATA */
PRIVATE void rdf_new_triple_handler (HTRDF *rdfp, HTTriple *t, void *context)
{
  USERDATA *userdata = (USERDATA *)context;

#ifdef LIBWWW_DEBUG
  xsb_dbgmsg((LOG_DEBUG,"***In rdf_new_triple_handler(%s)", RequestID(userdata->request)));
#endif
  /* create a new triple */
  if (rdfp && t) {
    prolog_term ptriple = extern_p2p_car(userdata->parsed_term_tail);

    extern_c2p_functor("rdftriple",3,ptriple);
    if (HTTriple_predicate(t))
      extern_c2p_string(HTTriple_predicate(t), extern_p2p_arg(ptriple,1));
    else
      extern_c2p_string("rdfunknown", extern_p2p_arg(ptriple,1));
    if (HTTriple_subject(t))
      extern_c2p_string(HTTriple_subject(t), extern_p2p_arg(ptriple,2));
    else
      extern_c2p_string("rdfunknown", extern_p2p_arg(ptriple,2));
    if (HTTriple_object(t))
      extern_c2p_string(HTTriple_object(t), extern_p2p_arg(ptriple,3));
    else
      extern_c2p_string("rdfunknown", extern_p2p_arg(ptriple,3));

#ifdef LIBWWW_DEBUG_VERBOSE
    print_prolog_term(userdata->parsed_term_tail, "Current result tail");
#endif

    userdata->parsed_term_tail = extern_p2p_cdr(userdata->parsed_term_tail);
    extern_c2p_list(userdata->parsed_term_tail);
  }
}
void LevelDirector::Reset()
{
	m_maxObjects = 5;
	m_initialSinkPixels = 0;
	m_currentSinkPixels = 0;
	m_spawnTimeout = 0;
	m_objectsCounts.clear();
	m_protos.clear();
	m_spawns.clear();
	m_chances.clear();
	m_requests.clear();
	m_targetObjectProto = "";
	m_targetObjectX = 0;
	m_targetObjectY = 0;
	m_sinkLineY = 0;
	m_sinkPercent = 0;
	m_initialSinkPixels = 0;
	m_currentSinkPixels = 0;
	m_targetObjectID = GameObjectID();
	m_createTargetRequestID = RequestID();
	m_playByPlay.clear();
	m_briefing.clear();
	m_reflectionParams = SReflectionControllerParams();
	m_groundParams = SGroundControllerParams();
	m_skyParams = SSkyControllerParams();
}
AsynchronousStatus
NokiaMaemoLocationInterfaceImpl::startLbs()
{
   if (m_registeredAndTracking) {
      // We are already started and tracking are on.
      nav2log << "[Debug] NokiaMaemoLocationInterfaceImpl::startLbs : "
              << "We are already started and are tracking are on."
              << endl;
      return AsynchronousStatus(RequestID(RequestID::INVALID_REQUEST_ID),
                                OK, "", "");
   }

   // Send CellID request
   if (!checkAndSendCellIDRequest(true)) {
      nav2log << "[Debug] NokiaMaemoLocationInterfaceImpl::startLbs : "
              << "Send CellID request failed" << endl;
      return AsynchronousStatus(RequestID(RequestID::INVALID_REQUEST_ID),
                                LBS_STARTUP_FAILED, "", "");
   }

   bool started = registerLbsClient();
   if (!started) {
      // Not good, could not start the gps.
      nav2log << "[Debug] NokiaMaemoLocationInterfaceImpl::startLbs : " 
              << "registerLbsClient() failed." << endl;
      return AsynchronousStatus(RequestID(RequestID::INVALID_REQUEST_ID),
                                LBS_STARTUP_FAILED, "", "");
   } else {
      if (!startTracking()) {
         // Failed to start the tracking, fatal error. Deregister
         // client
         nav2log << "[Debug] NokiaMaemoLocationInterfaceImpl::startLbs : "
                 << "startTracking() failed." << endl;
         deregisterLbsClient();
         return AsynchronousStatus(RequestID(RequestID::INVALID_REQUEST_ID),
                                   LBS_START_TRACKING_FAILED, "", "");
      }
      m_registeredAndTracking = true;
      m_needSendStartedCallback = true;
      isab::GenericGuiMess message(isab::GuiProtEnums::CONNECT_GPS);
      sendAsynchronousRequestToNav2(&message);
      return AsynchronousStatus(RequestID(RequestID::INVALID_REQUEST_ID),
                                OK, "", "");
   }   
}
AsynchronousStatus
LinuxNav2API::start(Nav2StatusListener* statusListener, 
                    StartupData* startupData)
{
   ReadyToRunListener* listener = new GtkReadyToRunListener;
   listener->setReceiver(getImpl());

   ReadyToRunListener* notifyListener = new GtkReadyToRunListener;
   Nav2StatusNotifier* notifier = new Nav2StatusNotifier(statusListener,
                                                         notifyListener);
   notifyListener->setReceiver(notifier);
   
   // if (g_thread_supported()) {
      // listener = 
   // } else {
   //    /// Uh-oh..
   // }
   
   WFString httpUserAgent; // Empty not used
   // WFString httpRequestString; // Empty not used
   WFString httpFixedHost; // Empty not used
   // Allocate tracking object, not turn it on
   bool useTracking = true; 
   // No service window at startup, and no WFID
   bool wayfinderIDStartUp = false; 

   HardwareIDArray hwids;
   // A better approach could be reading a "imei.txt" file here.
   WFString imeiStr("LinuxNav2APITestIMEI001");
   hwids.push_back(HardwareID(imeiStr, "imei"));

   if (startupData->getConnectionManager() == NULL){
      startupData->setConnectionManager(new LinuxConnectionManager);
   }

   getImpl()->start(startupData,
                    m_sharedImpl->m_audioTypeDirName,
                    m_sharedImpl->m_programVersion, 
                    m_sharedImpl->m_clientType, 
                    m_sharedImpl->m_clientTypeOptions,
                    m_sharedImpl->m_httpProto,
                    httpUserAgent,
                    m_sharedImpl->m_httpRequestString,
                    httpFixedHost,
                    useTracking,
                    wayfinderIDStartUp,
                    hwids,
                    listener,
                    notifier);

   return AsynchronousStatus(
      RequestID(RequestID::INVALID_REQUEST_ID),
      OK,
      "",
      "");
}
PRIVATE void rdf_delete_userData(void *userdata)
{
  prolog_term parsed_result, status_term;
  USERDATA *me = (USERDATA *)userdata;
  HTRequest *request = me->request;

  if (request) {
    parsed_result =
      ((REQUEST_CONTEXT *)HTRequest_context(request))->request_result;
    status_term =
      ((REQUEST_CONTEXT *)HTRequest_context(request))->status_term;
  }
  else return;

#ifdef LIBWWW_DEBUG
  xsb_dbgmsg((LOG_DEBUG,"***In rdf_delete_userData(%s)", RequestID(request)));
#endif

#ifdef LIBWWW_DEBUG_VERBOSE
  print_prolog_term(me->parsed_term, "Current parse value");
#endif

  /* terminate the parsed prolog terms list */
  extern_c2p_nil(me->parsed_term_tail);

  /* pass the result to the outside world */
  if (is_var(me->parsed_term))
    extern_p2p_unify(parsed_result, me->parsed_term);
  else
    xsb_abort("[LIBWWW_REQUEST] Request %s: Arg 4 (Result) must be unbound variable",
	      RequestID(request));

  HT_FREE(me);

#ifdef LIBWWW_DEBUG
  xsb_dbgmsg((LOG_DEBUG,"***Request %s: freed the USERDATA object", RequestID(request)));
#endif

  return;
}
PRIVATE USERDATA *rdf_create_userData(HTRDF     *parser,
				      HTRequest *request,
				      HTStream  *target_stream)
{
  USERDATA *me = NULL;
#ifdef LIBWWW_DEBUG
  xsb_dbgmsg((LOG_DEBUG,"***Start rdf_create_userData: Request %s", RequestID(request)));
#endif
  if (parser) {
    /* make sure that MIME type is appropriate for RDF */
    if (!verifyMIMEformat(request, RDFPARSE)) {
      /*
	HTStream * input = HTRequest_inputStream(request);
	(*input->isa->abort)(input, NULL);
	HTRequest_setInputStream(request,NULL);
	HTRequest_kill(request);
	return NULL;
      */
      xsb_abort("[LIBWWW_REQUEST] Bug: Request type/MIME type mismatch");
    }
    if ((me = (USERDATA *) HT_CALLOC(1, sizeof(USERDATA))) == NULL)
      HT_OUTOFMEM("libwww_parse_rdf");
    me->delete_method = rdf_delete_userData;
    me->parser = parser;
    me->request = request;
    me->target = target_stream;
    me->parsed_term = extern_p2p_new();
    extern_c2p_list(me->parsed_term);
    me->parsed_term_tail = me->parsed_term;
  }
  
#ifdef LIBWWW_DEBUG
  xsb_dbgmsg((LOG_DEBUG,"***End rdf_create_userData: Request %s", RequestID(request)));
#endif

  /* Hook up userdata to the request context */
  ((REQUEST_CONTEXT *)HTRequest_context(request))->userdata = (void *)me;

  return me;
}
AsynchronousStatus
MaemoNav2API::start(Nav2StatusListener* statusListener, 
                  StartupData* startupData)
{

   ReadyToRunListener* listener = new GtkReadyToRunListener;
   listener->setReceiver(getImpl());

   ReadyToRunListener* notifyListener = new GtkReadyToRunListener;
   Nav2StatusNotifier* notifier = new Nav2StatusNotifier(statusListener,
                                                         notifyListener);

   notifyListener->setReceiver(notifier);

   WFString httpUserAgent; // Empty not used
   WFString httpFixedHost; // Empty not used
   // Allocate tracking object, not turn it on
   bool useTracking = true; 
   // No service window at startup, and no WFID
   bool wayfinderIDStartUp = false; 

   // Hardware keys
   HardwareIDArray hwids;
   SynchronousStatus status = makeHardwareIDs(hwids);

   if (status.getStatusCode() == OK) {
      getImpl()->start(startupData,
                       m_sharedImpl->m_audioTypeDirName,
                       m_sharedImpl->m_programVersion,
                       m_sharedImpl->m_clientType,
                       m_sharedImpl->m_clientTypeOptions,
                       m_sharedImpl->m_httpProto,
                       httpUserAgent,
                       m_sharedImpl->m_httpRequestString,
                       httpFixedHost,
                       useTracking,
                       wayfinderIDStartUp,
                       hwids,
                       listener,
                       notifier);
   }

   return AsynchronousStatus(
      RequestID(RequestID::INVALID_REQUEST_ID),
      status.getStatusCode(),
      status.getStatusMessage(),
      status.getStatusURL());
}
AsynchronousStatus
S60Nav2APIImpl::start(Nav2StatusListener* statusListener, 
                      StartupData* startupData,
                      const WFString& clientType,
                      const WFString& clientTypeOptions,
                      bool httpProto,
                      const WFString& httpRequestString,
                      const ProgramVersion& programVersion)
{
   m_statusListener = statusListener;
   ///Tidieus copy of the startupData so it won't go out of scope.
   m_startupData = new StartupData(*startupData);
   m_clientType = clientType;
   m_clientTypeOptions = clientTypeOptions;
   m_httpProto = httpProto;
   m_httpRequestString = httpRequestString;
   m_programVersion = programVersion;

   fetchImei();
   return AsynchronousStatus(RequestID(RequestID::INVALID_REQUEST_ID),
                             OK,
                             "",
                             "");
}
bool QueueThread::doStartup()
{
   coreprintln("Initializing startup");
   
   // In startup
   // Send a msg for a parameter and wait for reply then Nav2 is 
   // considered started
   // Test to wait for msg before sending
   {
      WFAPISync sync(&m_guiMonitor);
      isab::Buffer buf;
      bool readRes = false;
      do {
         readRes = m_guiChannel->readData(&buf, &m_guiMonitor);
      } while (!readRes && !m_shutDown);
               
      if (buf.getLength() > 8) {
         buf.setReadPos(4); // Start after version and length
         std::auto_ptr<isab::GuiProtMess> guiProtMess(
            isab::GuiProtMess::createMsgFromBuf(&buf));
         nav2log << "QueueThread run got first msg from Nav2, id " 
                 << guiProtMess->getMessageID() << endl;
      } else {
         nav2log << "QueueThread run got first msg from Nav2, empty"
                 << endl;
      }
   }
   for (size_t i = 0; i < m_initialMsgs.size(); ++i) {
      m_nav2API->sendGuiMessage(m_initialMsgs[i]);
      m_initialMsgs[i]->deleteMembers();
      delete m_initialMsgs[i];
      m_initialMsgs[i] = NULL;
   }
   // Timeout. If there is a problem this might happen.
   // Send parameter get for wayfinder username.
   isab::GeneralParameterMess gpm(
      (uint16)isab::GuiProtEnums::paramUserAndPassword);
   wf_uint16 reqID = m_nav2API->sendGuiMessage(&gpm);
   // Wait for reply, then Nav2 is up and running!
   StatusCode startupCode = OK;
   while (m_inStartup && !m_shutDown) {
      WFAPISync sync(&m_guiMonitor);
      isab::Buffer buf;
      m_guiChannel->readData(&buf, &m_guiMonitor);
      if (buf.getLength() != 0) {
         // Check if it is the reply we want!
         while (buf.remaining() > 4) {
            // Start after version and length
            buf.setReadPos(buf.getReadPos() + 4); 
            std::auto_ptr<isab::GuiProtMess> guiProtMess(
               isab::GuiProtMess::createMsgFromBuf(&buf));
            if (guiProtMess.get() != NULL && 
                guiProtMess->getMessageID() == reqID) {
               m_inStartup = false;
               // Set startup result
               startupCode = OK;
            } else if (guiProtMess.get() != NULL && 
                       guiProtMess->getMessageType() == 
                       isab::GuiProtEnums::SET_GENERAL_PARAMETER) {
               // Check if to store it for later use in MapLib below
               isab::GeneralParameterMess* mess = 
                  static_cast<isab::GeneralParameterMess*> (
                     guiProtMess.get());
               m_nav2API->handleSetParameter(*mess);
               if (mess->getParamId() == 
                   isab::GuiProtEnums::paramMapCacheSize ||
                   mess->getParamId() == 
                   isab::GuiProtEnums::paramPoiCategories ||
                   mess->getParamId() == 
                   isab::GuiProtEnums::userTrafficUpdatePeriod ||
                   mess->getParamId() ==
                   isab::GuiProtEnums::paramDistanceMode)
               {
                  m_mapLibParams.push_back(mess);
                  guiProtMess.release();
               }
            } else if (guiProtMess.get() != NULL && 
                       guiProtMess->getMessageType() == 
                       isab::GuiProtEnums::SOUND_FILE_LIST) {
               nav2log << "QueueThread run got SOUND_FILE_LIST!"
                       << endl;
               // Send it to NavigationInterfaceImpl
               m_nav2API->getNavigationInterface().getImpl()->
                  receiveAsynchronousReply(
                     *guiProtMess, RequestID( 
                        RequestID::INVALID_REQUEST_ID));
            }
            if (guiProtMess.get() != NULL) {
               guiProtMess->deleteMembers();
            }
         }
      } else {
         // Wait for data
         m_guiMonitor.wait();
      }
   }

   coreprintln("Startup is now complete.");
   
   // Call startupComplete
   m_nav2API->startupComplete(startupCode);

   return true;
}
	Ogre::String SceneManager::RequestIDStr()
	{
		return Ogre::StringConverter::toString(RequestID());
	}